[Bf-blender-cvs] [698736e] soc-2016-layer_manager: Support renaming layers

Julian Eisel noreply at git.blender.org
Wed May 25 02:21:35 CEST 2016


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. @@




More information about the Bf-blender-cvs mailing list