[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