Commit: a4514f2282b89f3f0da99b4ffdcf3d8682889ea0
Author: Julian Eisel
Date:   Tue May 24 20:15:44 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rBa4514f2282b89f3f0da99b4ffdcf3d8682889ea0

Support for basic layer selection

Adds basic selection using LMB. Doesn't include selection with ctrl, shift, etc.

===================================================================

M       source/blender/editors/interface/resources.c
M       source/blender/editors/space_layers/layers_draw.c
M       source/blender/editors/space_layers/layers_intern.h
M       source/blender/editors/space_layers/layers_ops.c
M       source/blender/editors/space_layers/layers_util.c
M       source/blender/editors/space_layers/space_layers.c
M       source/blender/makesrna/intern/rna_userdef.c

===================================================================

diff --git a/source/blender/editors/interface/resources.c 
b/source/blender/editors/interface/resources.c
index d5e0e91..8670793 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1204,6 +1204,7 @@ void ui_theme_init_default(void)
        /* space layer manager */
        btheme->tlayers = btheme->tv3d;
        rgba_char_args_set_fl(btheme->tlayers.back,    0.42, 0.42, 0.42, 1.0);
+       rgba_char_args_set(btheme->tlayers.hilite, 255, 140, 25, 255);  /* 
selected files */
 #endif
 }
 
@@ -2714,6 +2715,7 @@ void init_userdef_do_versions(void)
                for (bTheme *btheme = U.themes.first; btheme; btheme = 
btheme->next) {
                        btheme->tlayers = btheme->tv3d;
                        rgba_char_args_set_fl(btheme->tlayers.back,    0.42, 
0.42, 0.42, 1.0);
+                       rgba_char_args_set(btheme->tlayers.hilite, 255, 140, 
25, 255);  /* selected files */
                }
        }
 #endif
diff --git a/source/blender/editors/space_layers/layers_draw.c 
b/source/blender/editors/space_layers/layers_draw.c
index 359c9ed..e6d02b8 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -34,6 +34,7 @@
 
 #include "UI_interface.h"
 #include "UI_view2d.h"
+#include "UI_resources.h"
 
 #include "layers_intern.h" /* own include */
 
@@ -49,11 +50,22 @@ void layers_draw_tiles(const bContext *C, ARegion *ar)
        /* draw items */
        for (LayerTile *tile = slayer->layer_tiles.first; tile; tile = 
tile->next) {
                LayerTreeItem *litem = tile->litem;
+
+               /* draw selection */
+               if (tile->flag & LAYERTILE_SELECTED) {
+                       const float padx = 4.0f * UI_DPI_FAC;
+                       rctf rect = {padx, ar->winx - padx, -v2d->cur.ymin - 
size_y - litem->height};
+                       rect.ymax = rect.ymin + litem->height;
+
+                       UI_draw_roundbox_corner_set(UI_CNR_ALL);
+                       UI_ThemeColor(TH_HILITE);
+                       UI_draw_roundbox(rect.xmin, rect.ymin, rect.xmax, 
rect.ymax, 5.0f);
+               }
+               /* draw item itself */
                if (litem->draw) {
                        uiLayout *layout = UI_block_layout(
                                               block, UI_LAYOUT_HORIZONTAL, 
UI_LAYOUT_HEADER,
-                                              -v2d->cur.xmin, -v2d->cur.ymin - 
size_y,
-                                              litem->height, 0, 0, style);
+                                              -v2d->cur.xmin, -v2d->cur.ymin - 
size_y, litem->height, 0, 0, style);
                        litem->draw(litem, layout);
                        UI_block_layout_resolve(block, NULL, NULL);
                }
diff --git a/source/blender/editors/space_layers/layers_intern.h 
b/source/blender/editors/space_layers/layers_intern.h
index a14d678..de84958 100644
--- a/source/blender/editors/space_layers/layers_intern.h
+++ b/source/blender/editors/space_layers/layers_intern.h
@@ -28,6 +28,10 @@
 struct ARegion;
 struct wmKeyConfig;
 
+typedef enum eLayerTileFlag {
+       LAYERTILE_SELECTED = (1 << 0),
+} eLayerTileFlag;
+
 /**
  * Wrapper around LayerTreeItem with extra info for drawing in layer manager 
editor.
  */
@@ -35,6 +39,8 @@ typedef struct LayerTile {
        struct LayerTile *next, *prev;
 
        LayerTreeItem *litem;
+
+       eLayerTileFlag flag;
 } LayerTile;
 
 /* layers_draw.c */
@@ -42,6 +48,7 @@ void layers_draw_tiles(const struct bContext *C, struct 
ARegion *ar);
 
 /* layers_util.c */
 LayerTile *layers_tile_add(struct SpaceLayers *slayer, struct LayerTreeItem 
*litem);
+LayerTile *layers_tile_find_at_coordinate(const SpaceLayers *slayer, const 
ARegion *ar, const int co[2]);
 
 /* layers_ops.c */
 void layers_operatortypes(void);
diff --git a/source/blender/editors/space_layers/layers_ops.c 
b/source/blender/editors/space_layers/layers_ops.c
index ee0bb5a..e9b6877 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -72,16 +72,52 @@ static void LAYERS_OT_layer_add(wmOperatorType *ot)
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
+static void layers_deselect_all(const SpaceLayers *slayer)
+{
+       for (LayerTile *tile = slayer->layer_tiles.first; tile; tile = 
tile->next) {
+               tile->flag &= ~LAYERTILE_SELECTED;
+       }
+}
+
+static int layer_select_invoke(bContext *C, wmOperator *UNUSED(op), const 
wmEvent *event)
+{
+       SpaceLayers *slayer = CTX_wm_space_layers(C);
+       ARegion *ar = CTX_wm_region(C);
+       LayerTile *tile = layers_tile_find_at_coordinate(slayer, ar, 
event->mval);
+       if (tile) {
+               layers_deselect_all(slayer);
+               tile->flag |= LAYERTILE_SELECTED;
+
+               ED_region_tag_redraw(ar);
+               return OPERATOR_FINISHED;
+       }
+       return OPERATOR_CANCELLED;
+}
+
+static void LAYERS_OT_layer_select(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Select Layer";
+       ot->idname = "LAYERS_OT_layer_select";
+       ot->description = "Select/activate the layer under the cursor";
+
+       /* api callbacks */
+       ot->invoke = layer_select_invoke;
+       ot->poll = ED_operator_layers_active;
+}
+
 
 /* ************************** registration - operator types 
**********************************/
 
 void layers_operatortypes(void)
 {
        WM_operatortype_append(LAYERS_OT_layer_add);
+
+       WM_operatortype_append(LAYERS_OT_layer_select);
 }
 
 void layers_keymap(wmKeyConfig *keyconf)
 {
        wmKeyMap *keymap = WM_keymap_find(keyconf, "Layer Manager", 
SPACE_LAYERS, 0);
-       (void)keymap;
+       WM_keymap_add_item(keymap, "LAYERS_OT_layer_select", LEFTMOUSE, 
KM_CLICK, 0, 0);
 }
diff --git a/source/blender/editors/space_layers/layers_util.c 
b/source/blender/editors/space_layers/layers_util.c
index d35df82..dd32623 100644
--- a/source/blender/editors/space_layers/layers_util.c
+++ b/source/blender/editors/space_layers/layers_util.c
@@ -28,6 +28,7 @@
 
 #include "BKE_layer.h"
 
+#include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
 #include "MEM_guardedalloc.h"
@@ -47,3 +48,19 @@ LayerTile *layers_tile_add(SpaceLayers *slayer, 
LayerTreeItem *litem)
 
        return tile;
 }
+
+/**
+ * Find the tile at coordinate \a co (regionspace).
+ */
+LayerTile *layers_tile_find_at_coordinate(const SpaceLayers *slayer, const 
ARegion *ar, const int co[2])
+{
+       int ofsx = 0;
+
+       for (LayerTile *tile = slayer->layer_tiles.first; tile; tile = 
tile->next) {
+               ofsx += tile->litem->height;
+               if (co[1] >= -ar->v2d.cur.ymin - ofsx) {
+                       return tile;
+               }
+       }
+       return NULL;
+}
diff --git a/source/blender/editors/space_layers/space_layers.c 
b/source/blender/editors/space_layers/space_layers.c
index 1cbadc0..f50c5b5 100644
--- a/source/blender/editors/space_layers/space_layers.c
+++ b/source/blender/editors/space_layers/space_layers.c
@@ -88,19 +88,15 @@ static SpaceLink *layers_duplicate(SpaceLink *sl)
        return (SpaceLink *)slayer;
 }
 
-/* add handlers, stuff you only do once or on area changes */
-static void layer_init(wmWindowManager *wm, ScrArea *sa)
-{
-       /* own keymap */
-       wmKeyMap *keymap = WM_keymap_find(wm->defaultconf, "Layer Manager", 
SPACE_LAYERS, 0);
-       WM_event_add_keymap_handler(&sa->handlers, keymap);
-}
-
 /* add handlers, stuff you only do once or on area/region changes */
-static void layer_main_region_init(wmWindowManager *UNUSED(wm), ARegion *ar)
+static void layer_main_region_init(wmWindowManager *wm, ARegion *ar)
 {
        UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, 
ar->winy);
        ar->v2d.scroll |= (V2D_SCROLL_VERTICAL_FULLR | 
V2D_SCROLL_HORIZONTAL_FULLR);
+
+       /* own keymap */
+       wmKeyMap *keymap = WM_keymap_find(wm->defaultconf, "Layer Manager", 
SPACE_LAYERS, 0);
+       WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, 
&ar->winrct);
 }
 
 static void layers_main_region_draw(const bContext *C, ARegion *ar)
@@ -159,7 +155,6 @@ void ED_spacetype_layers(void)
        st->new = layers_new;
        st->free = layers_free;
        st->duplicate = layers_duplicate;
-       st->init = layer_init;
        st->operatortypes = layers_operatortypes;
        st->keymap = layers_keymap;
 
diff --git a/source/blender/makesrna/intern/rna_userdef.c 
b/source/blender/makesrna/intern/rna_userdef.c
index 17c8970..4d5af48 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -3029,6 +3029,7 @@ static void rna_def_userdef_theme_space_clip(BlenderRNA 
*brna)
 static void rna_def_userdef_theme_space_layers(BlenderRNA *brna)
 {
        StructRNA *srna;
+       PropertyRNA *prop;
 
        srna = RNA_def_struct(brna, "ThemeLayerManager", NULL);
        RNA_def_struct_sdna(srna, "ThemeSpace");
@@ -3037,6 +3038,12 @@ static void 
rna_def_userdef_theme_space_layers(BlenderRNA *brna)
 
        rna_def_userdef_theme_spaces_main(srna);
        rna_def_userdef_theme_spaces_list_main(srna);
+
+       prop = RNA_def_property(srna, "selected_layer", PROP_FLOAT, 
PROP_COLOR_GAMMA);
+       RNA_def_property_float_sdna(prop, NULL, "hilite");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Selected Layer", "");
+       RNA_def_property_update(prop, 0, "rna_userdef_update");
 }
 
 static void rna_def_userdef_themes(BlenderRNA *brna)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to