Commit: 698736eaf234a500703c596b9b2b4eaa2368f9dc
Author: Julian Eisel
Date:   Wed May 25 01:36:48 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB698736eaf234a500703c596b9b2b4eaa2368f9dc

Support renaming layers

Invoked by ctrl+click or double click on list item.

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

M       source/blender/blenkernel/BKE_layer.h
M       source/blender/blenkernel/intern/layer.c
M       source/blender/editors/interface/interface_handlers.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/space_layers.c
M       source/blender/windowmanager/WM_types.h

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

diff --git a/source/blender/blenkernel/BKE_layer.h 
b/source/blender/blenkernel/BKE_layer.h
index d6de47c..1350b0e 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -88,7 +88,7 @@ typedef struct LayerTreeItem {
        struct LayerTreeItem *next, *prev;
 
        eLayerTreeItem_Type type;
-       const char *name;
+       char name[64]; /* MAX_NAME */
        int height; /* the height of this item */
 
        LayerTree *tree; /* pointer back to layer tree - TODO check if needed */
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index d87eb53..706832b 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -35,6 +35,7 @@
 #include "BKE_layer.h" /* own include */
 
 #include "BLI_listbase.h"
+#include "BLI_string.h"
 
 #include "DNA_defs.h"
 #include "DNA_userdef_types.h"
@@ -96,11 +97,11 @@ LayerTreeItem *BKE_layeritem_add(
        BLI_assert(!parent || ELEM(parent->type, LAYER_ITEMTYPE_GROUP));
        BLI_assert(!parent || parent->tree == tree);
 
-       litem->name = name;
        litem->type = type;
        litem->height = LAYERITEM_DEFAULT_HEIGHT;
        litem->parent = parent;
        litem->tree = tree;
+       BLI_strncpy(litem->name, name, sizeof(litem->name));
 
        /* callbacks */
        litem->poll = poll;
diff --git a/source/blender/editors/interface/interface_handlers.c 
b/source/blender/editors/interface/interface_handlers.c
index 10ab85a..eeaeca7 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -634,6 +634,12 @@ PointerRNA 
*ui_handle_afterfunc_add_operator(wmOperatorType *ot, int opcontext,
        return ptr;
 }
 
+BLI_INLINE bool ui_afterfunc_poll(const uiBlock *block, const uiBut *but)
+{
+       return (but->func || but->funcN || block->handle_func || 
but->rename_func ||
+               (but->type == UI_BTYPE_BUT_MENU && block->butm_func) || 
but->optype || but->rnaprop);
+}
+
 static void ui_apply_but_func(bContext *C, uiBut *but)
 {
        uiAfterFunc *after;
@@ -643,9 +649,7 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
         * handling is done, i.e. menus are closed, in order to avoid conflicts
         * with these functions removing the buttons we are working with */
 
-       if (but->func || but->funcN || block->handle_func || but->rename_func ||
-           (but->type == UI_BTYPE_BUT_MENU && block->butm_func) || but->optype 
|| but->rnaprop)
-       {
+       if (ui_afterfunc_poll(block, but)) {
                after = ui_afterfunc_new();
 
                if (but->func && ELEM(but, but->func_arg1, but->func_arg2)) {
@@ -899,7 +903,8 @@ static void ui_apply_but_TEX(bContext *C, uiBut *but, 
uiHandleButtonData *data)
                 * having typed something already. */
                but->rename_orig = BLI_strdup(data->origstr);
        }
-       else {
+       /* only if there are afterfuncs, because otherwise rename_orig is not 
freed */
+       else if (ui_afterfunc_poll(but->block, but)) {
                but->rename_orig = data->origstr;
                data->origstr = NULL;
        }
diff --git a/source/blender/editors/space_layers/layers_draw.c 
b/source/blender/editors/space_layers/layers_draw.c
index e6d02b8..fb3afa1 100644
--- a/source/blender/editors/space_layers/layers_draw.c
+++ b/source/blender/editors/space_layers/layers_draw.c
@@ -32,49 +32,78 @@
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
+#include "ED_screen.h"
+
 #include "UI_interface.h"
 #include "UI_view2d.h"
 #include "UI_resources.h"
 
+#include "WM_api.h"
+#include "WM_types.h"
+
 #include "layers_intern.h" /* own include */
 
-void layers_draw_tiles(const bContext *C, ARegion *ar)
+static void layer_tile_draw(
+        LayerTile *tile, const bContext *C, ARegion *ar,
+        uiBlock *block, uiStyle *style,
+        const float ofs_y)
 {
-       uiStyle *style = UI_style_get_dpi();
-       SpaceLayers *slayer = CTX_wm_space_layers(C);
        View2D *v2d = &ar->v2d;
-       float size_y = 0.0f;
+       LayerTreeItem *litem = tile->litem;
+       const float padx = 4.0f * UI_DPI_FAC;
+       rctf rect = {padx, ar->winx - padx, -v2d->cur.ymin - ofs_y - 
litem->height};
+       rect.ymax = rect.ymin + litem->height;
 
-       uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
-
-       /* 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;
+       /* draw selection */
+       if (tile->flag & LAYERTILE_SELECTED) {
+               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 - ofs_y, 
litem->height, 0, 0, style);
+               if (tile->flag & LAYERTILE_RENAME) {
+                       uiBut *but = uiDefBut(
+                               block, UI_BTYPE_TEXT, 1, "", rect.xmin, 
rect.ymin,
+                               UI_UNIT_X * 7.0f, BLI_rctf_size_y(&rect),
+                               litem->name, 1.0f, (float)sizeof(litem->name), 
0, 0, "");
+                       UI_but_flag_enable(but, UI_BUT_NO_UTF8); /* allow non 
utf8 names */
+                       UI_but_flag_disable(but, UI_BUT_UNDO);
 
-                       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);
+                       /* returns false if button got removed */
+                       if (UI_but_active_only(C, ar, block, but) == false) {
+                               tile->flag &= ~LAYERTILE_RENAME;
+                               /* Yuk! Sending notifier during draw. Need to
+                                * do that so item uses regular drawing again. 
*/
+                               WM_event_add_notifier(C, NC_SPACE | 
ND_SPACE_LAYERS, NULL);
+                       }
                }
-               /* 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);
+               else {
                        litem->draw(litem, layout);
-                       UI_block_layout_resolve(block, NULL, NULL);
                }
-               size_y += litem->height;
+               uiItemL(layout, "", 0); /* XXX without this editing last item 
causes crashes */
+               UI_block_layout_resolve(block, NULL, NULL);
        }
+}
+
+void layers_tiles_draw(const bContext *C, ARegion *ar)
+{
+       SpaceLayers *slayer = CTX_wm_space_layers(C);
+       uiStyle *style = UI_style_get_dpi();
+       float size_y = 0.0f;
 
+       uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
+       /* draw items */
+       for (LayerTile *tile = slayer->layer_tiles.first; tile; tile = 
tile->next) {
+               layer_tile_draw(tile, C, ar, block, style, size_y);
+               size_y += tile->litem->height;
+       }
        UI_block_end(C, block);
        UI_block_draw(C, block);
 
        /* update size of tot-rect (extents of data/viewable area) */
-       UI_view2d_totRect_set(v2d, ar->winx - BLI_rcti_size_x(&v2d->vert), 
size_y);
+       UI_view2d_totRect_set(&ar->v2d, ar->winx - 
BLI_rcti_size_x(&ar->v2d.vert), size_y);
 }
diff --git a/source/blender/editors/space_layers/layers_intern.h 
b/source/blender/editors/space_layers/layers_intern.h
index de84958..f3c505b 100644
--- a/source/blender/editors/space_layers/layers_intern.h
+++ b/source/blender/editors/space_layers/layers_intern.h
@@ -30,6 +30,7 @@ struct wmKeyConfig;
 
 typedef enum eLayerTileFlag {
        LAYERTILE_SELECTED = (1 << 0),
+       LAYERTILE_RENAME   = (1 << 1),
 } eLayerTileFlag;
 
 /**
@@ -44,7 +45,7 @@ typedef struct LayerTile {
 } LayerTile;
 
 /* layers_draw.c */
-void layers_draw_tiles(const struct bContext *C, struct ARegion *ar);
+void layers_tiles_draw(const struct bContext *C, struct ARegion *ar);
 
 /* layers_util.c */
 LayerTile *layers_tile_add(struct SpaceLayers *slayer, struct LayerTreeItem 
*litem);
diff --git a/source/blender/editors/space_layers/layers_ops.c 
b/source/blender/editors/space_layers/layers_ops.c
index e9b6877..01373d4 100644
--- a/source/blender/editors/space_layers/layers_ops.c
+++ b/source/blender/editors/space_layers/layers_ops.c
@@ -72,6 +72,35 @@ static void LAYERS_OT_layer_add(wmOperatorType *ot)
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
+static int layer_rename_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) {
+               tile->flag |= LAYERTILE_RENAME;
+
+               ED_region_tag_redraw(ar);
+               return OPERATOR_FINISHED;
+       }
+       return OPERATOR_CANCELLED;
+}
+
+static void LAYERS_OT_layer_rename(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Rename Layer";
+       ot->idname = "LAYERS_OT_layer_rename";
+       ot->description = "Rename the layer under the cursor";
+
+       /* api callbacks */
+       ot->invoke = layer_rename_invoke;
+       ot->poll = ED_operator_layers_active;
+
+       /* flags */
+       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) {
@@ -111,8 +140,11 @@ static void LAYERS_OT_layer_select(wmOperatorType *ot)
 
 void layers_operatortypes(void)
 {
+       /* organization */
        WM_operatortype_append(LAYERS_OT_layer_add);
+       WM_operatortype_append(LAYERS_OT_layer_rename);
 
+       /* states (activating selecting, highlighting) */
        WM_operatortype_append(LAYERS_OT_layer_select);
 }
 
@@ -120,4 +152,7 @@ void layers_keymap(wmKeyConfig *keyconf)
 {
        wmKeyMap *keymap = WM_keymap_find(keyconf, "Layer Manager", 
SPACE_LAYERS, 0);
        WM_keymap_add_item(keymap, "LAYERS_OT_layer_select", LEFTMOUSE, 
KM_CLICK, 0, 0);
+
+       WM_keymap_add_item(keymap, "LAYERS_OT_layer_rename", LEFTMOUSE, 
KM_DBL_CLICK, 0, 0);
+       WM_keymap_add_item(keymap, "LAYERS_OT_layer_rename", LEFTMOUSE, 
KM_PRESS, KM_CTRL, 0);
 }
diff --git a/source/blender/editors/space_layers/space_layers.c 
b/source/blender/editors/space_layers/space_layers.c
index f50c5b5..c54ec96 100644
--- a/source/blender/editors/space_layers/space_layers.c
+++ b/source/blender/editors/space_layers/space_layers.c
@@ -109,7 +109,7 @@ static void layers_main_region_draw(const bContext *C, 
ARegion *ar)
        UI_ThemeClearColor(TH_BACK);
        glClear(GL_COLOR_BUFFER_BIT);
 
-       layers_d

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to