[Bf-blender-cvs] [0322700d87] blender2.8: Get UI ready for using drag & drop to nest a collection into another one
Julian Eisel
noreply at git.blender.org
Thu Mar 2 17:15:39 CET 2017
Commit: 0322700d875a1d518a730512531a881f1278124b
Author: Julian Eisel
Date: Thu Mar 2 17:11:09 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB0322700d875a1d518a730512531a881f1278124b
Get UI ready for using drag & drop to nest a collection into another one
Nothing happen yet when it's supposed to insert the collection into
another one, that part will be handled by @dfelinto.
See gif for demo of how it works UI wise: {F500337}
Also fixed off-by-one error in utility function.
===================================================================
M source/blender/blenkernel/BKE_layer.h
M source/blender/blenkernel/intern/layer.c
M source/blender/editors/space_outliner/outliner_draw.c
M source/blender/editors/space_outliner/outliner_intern.h
M source/blender/editors/space_outliner/outliner_ops.c
M source/blender/editors/space_outliner/outliner_tree.c
M source/blender/editors/space_outliner/outliner_utils.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 863f33dea8..aa1d537a28 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -86,6 +86,7 @@ int BKE_layer_collection_count(struct SceneLayer *sl);
int BKE_layer_collection_findindex(struct SceneLayer *sl, struct LayerCollection *lc);
void BKE_layer_collection_reinsert_after(const struct Scene *scene, struct SceneLayer *sl,
struct LayerCollection *lc_reinsert, struct LayerCollection *lc_after);
+void BKE_layer_collection_reinsert_into(struct LayerCollection *lc_reinsert, struct LayerCollection *lc_into);
struct LayerCollection *BKE_collection_link(struct SceneLayer *sl, struct SceneCollection *sc);
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 605705c483..77501c4acc 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -536,6 +536,10 @@ static ListBase *scene_collection_listbase_find(ListBase *lb, SceneCollection *s
void BKE_layer_collection_reinsert_after(
const Scene *scene, SceneLayer *sl, LayerCollection *lc_reinsert, LayerCollection *lc_after)
{
+ /* TODO this function probably needs to be rewritten completely to support all cases
+ * (reinserting master collection, reinsert into different hierarchy levels, etc) */
+ TODO_LAYER_OPERATORS;
+
SceneCollection *sc_master = BKE_collection_master(scene);
SceneCollection *sc_reinsert = lc_reinsert->scene_collection;
ListBase *lc_reinsert_lb = layer_collection_listbase_find(&sl->layer_collections, lc_reinsert);
@@ -564,6 +568,13 @@ void BKE_layer_collection_reinsert_after(
BKE_scene_layer_engine_settings_collection_recalculate(sl, lc_reinsert);
}
+void BKE_layer_collection_reinsert_into(LayerCollection *lc_reinsert, LayerCollection *lc_into)
+{
+ /* TODO this is missing */
+ TODO_LAYER_OPERATORS;
+ UNUSED_VARS(lc_reinsert, lc_into);
+}
+
/**
* Link a collection to a renderlayer
* The collection needs to be created separately
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 990ad296bb..816740b876 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -1540,7 +1540,7 @@ static int outliner_count_visible_childs(const SpaceOops *soops, const TreeEleme
static void outliner_draw_tree_element_floating(const SpaceOops *soops, const ARegion *ar,
const TreeElement *te_floating)
{
- const TreeElement *te_insert = te_floating->drag_data->insert_te;
+ const TreeElement *te_insert = te_floating->drag_data->insert_handle;
const ListBase *lb_parent = te_floating->parent ? &te_floating->parent->subtree : &soops->tree;
const TreeElement *te_insert_fallback = te_insert ? te_insert : lb_parent->first;
const int line_width = 2;
@@ -1560,14 +1560,30 @@ static void outliner_draw_tree_element_floating(const SpaceOops *soops, const AR
UI_GetThemeColorShade4ubv(TH_BACK, -40, col);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
- immUniformColor4ubv(col);
- glLineWidth(line_width);
+ glEnable(GL_BLEND);
+
+ if (!te_insert || (te_floating->drag_data->insert_type == TE_INSERT_AFTER)) {
+ immUniformColor4ubv(col);
+ glLineWidth(line_width);
- immBegin(PRIM_LINE_STRIP, 2);
- immVertex2f(pos, 0, coord_y);
- immVertex2f(pos, ar->v2d.cur.xmax, coord_y);
- immEnd();
+ immBegin(PRIM_LINE_STRIP, 2);
+ immVertex2f(pos, 0, coord_y);
+ immVertex2f(pos, ar->v2d.cur.xmax, coord_y);
+ immEnd();
+ }
+ else {
+ BLI_assert(te_floating->drag_data->insert_type == TE_INSERT_INTO);
+ immUniformColor4ub(UNPACK3(col), col[3] * 0.5f);
+
+ immBegin(PRIM_QUADS, 4);
+ immVertex2f(pos, 0, coord_y);
+ immVertex2f(pos, 0, coord_y + UI_UNIT_Y);
+ immVertex2f(pos, ar->v2d.cur.xmax, coord_y + UI_UNIT_Y);
+ immVertex2f(pos, ar->v2d.cur.xmax, coord_y);
+ immEnd();
+ }
+ glDisable(GL_BLEND);
immUnbindProgram();
}
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 731b5041bd..4cee0e44fc 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -49,6 +49,12 @@ struct EditBone;
struct wmKeyConfig;
+typedef enum TreeElementInsertType {
+ /* no INSERT_BEFORE needed for now */
+ TE_INSERT_AFTER,
+ TE_INSERT_INTO,
+} TreeElementInsertType;
+
typedef enum TreeTraversalAction {
/* Continue traversal regularly, don't skip children. */
TRAVERSE_CONTINUE = 0,
@@ -63,7 +69,7 @@ typedef enum TreeTraversalAction {
* Passing scene right now, may be better to allow some custom data.
*/
typedef void (*TreeElementReinsertFunc)(const struct Scene *scene, struct TreeElement *insert_element,
- struct TreeElement *insert_after);
+ struct TreeElement *insert_handle, TreeElementInsertType action);
typedef TreeTraversalAction (*TreeTraversalFunc)(struct TreeElement *te, void *customdata);
@@ -84,8 +90,9 @@ typedef struct TreeElement {
TreeElementReinsertFunc reinsert;
struct {
+ TreeElementInsertType insert_type;
/* the element after which we may insert the dragged one (NULL to insert at top) */
- struct TreeElement *insert_te;
+ struct TreeElement *insert_handle;
} *drag_data;
} TreeElement;
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index 5187cc66f5..3db0b6ffa0 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -87,24 +87,40 @@ static void outliner_item_drag_end(OutlinerItemDrag *op_drag_data)
MEM_freeN(op_drag_data);
}
-static void outliner_item_drag_handle(OutlinerItemDrag *op_drag_data, ARegion *ar, const wmEvent *event)
+static void outliner_item_drag_handle(ARegion *ar, const wmEvent *event, OutlinerItemDrag *op_drag_data)
{
TreeElement *dragged_te = op_drag_data->dragged_te;
const int delta_mouse_y = event->y - op_drag_data->init_mouse_xy[1];
const int cmp_coord = (int)UI_view2d_region_to_view_y(&ar->v2d, event->mval[1]);
+ const float margin = UI_UNIT_Y * (1.0f / 3);
/* by default we don't change the item position */
- dragged_te->drag_data->insert_te = dragged_te;
+ dragged_te->drag_data->insert_handle = dragged_te;
if (delta_mouse_y > 0) {
- for (TreeElement *te = dragged_te->prev; te && (cmp_coord >= (te->ys + (UI_UNIT_Y * 0.5f))); te = te->prev) {
- /* will be NULL if we want to insert as first element */
- dragged_te->drag_data->insert_te = te->prev;
+ for (TreeElement *te = dragged_te->prev; te && (cmp_coord >= (te->ys + margin)); te = te->prev) {
+ if (cmp_coord > (te->ys + (2 * margin))) {
+ dragged_te->drag_data->insert_type = TE_INSERT_AFTER;
+ /* will be NULL if we want to insert as first element */
+ dragged_te->drag_data->insert_handle = te->prev;
+ }
+ else {
+ dragged_te->drag_data->insert_type = TE_INSERT_INTO;
+ dragged_te->drag_data->insert_handle = te;
+ }
}
}
else {
- for (TreeElement *te = dragged_te->next; te && (cmp_coord <= (te->ys + (UI_UNIT_Y * 0.5f))); te = te->next) {
- dragged_te->drag_data->insert_te = te;
+ for (TreeElement *te = dragged_te->next; te && (cmp_coord <= (te->ys + UI_UNIT_Y - margin)); te = te->next) {
+ if (cmp_coord < (te->ys + margin)) {
+ dragged_te->drag_data->insert_type = TE_INSERT_AFTER;
+ dragged_te->drag_data->insert_handle = te;
+ BLI_assert(te->prev != NULL);
+ }
+ else {
+ dragged_te->drag_data->insert_type = TE_INSERT_INTO;
+ dragged_te->drag_data->insert_handle = te;
+ }
}
}
}
@@ -112,7 +128,7 @@ static void outliner_item_drag_handle(OutlinerItemDrag *op_drag_data, ARegion *a
static bool outliner_item_drag_drop_apply(const Scene *scene, OutlinerItemDrag *op_drag_data)
{
TreeElement *dragged_te = op_drag_data->dragged_te;
- TreeElement *insert_after = dragged_te->drag_data->insert_te;
+ TreeElement *insert_after = dragged_te->drag_data->insert_handle;
if (insert_after == dragged_te) {
/* No need to do anything */
@@ -123,7 +139,7 @@ static bool outliner_item_drag_drop_apply(const Scene *scene, OutlinerItemDrag *
/* Not sure yet what the best way to handle reordering elements of different types
* (and stored in different lists). For collection display mode this is enough. */
if (!insert_after || (insert_after->reinsert == dragged_te->reinsert)) {
- dragged_te->reinsert(scene, dragged_te, insert_after);
+ dragged_te->reinsert(scene, dragged_te, insert_after, dragged_te->drag_data->insert_type);
}
}
@@ -157,7 +173,7 @@ static int outliner_item_drag_drop_modal(bContext *C, wmOperator *op, const wmEv
redraw = true;
break;
case MOUSEMOVE:
- outliner_item_drag_handle(op_drag_data, ar, event);
+ outliner_item_drag_handle(ar, event, op_drag_data);
redraw = true;
break;
}
@@ -186,7 +202,7 @@ static int outliner_item_drag_drop_invoke(bContext *C, wmOperator *op, const wmE
op->customdata = outliner_item_drag_data_create(te, &event->x);
te->drag_data = MEM_callocN(sizeof(*te->drag_data), __func__);
/* by default we don't change the item position */
- te->drag_data->insert_te = te;
+ te->drag_data->insert_handle = te;
/* unset highlighted tree element, dragged one will be highlighted instead */
outliner_set_flag(&soops->tree, TSE_HIGHLIGHTED, false);
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index 8a024e0cc8..0cf76a671a 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -1287,13 +1287,19 @@ static void outliner_add_orphaned_datablocks(Main *mainvar, SpaceOops *soops)
}
}
-static void outliner_collections_reorder(const Scene *scene, TreeElement *insert_element, TreeElement *insert_after)
+static void outliner_collections_reorder(const Scene
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list