[Bf-blender-cvs] [367ada71a0d] blender2.8: Cleanup: move most outliner drag & drop code into one file.

Brecht Van Lommel noreply at git.blender.org
Fri Aug 10 17:57:33 CEST 2018


Commit: 367ada71a0d1fab75701c30895726e3f7f315f3a
Author: Brecht Van Lommel
Date:   Tue Aug 7 10:23:07 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB367ada71a0d1fab75701c30895726e3f7f315f3a

Cleanup: move most outliner drag & drop code into one file.

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

M	source/blender/editors/space_outliner/CMakeLists.txt
A	source/blender/editors/space_outliner/outliner_dragdrop.c
M	source/blender/editors/space_outliner/outliner_edit.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/space_outliner.c

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

diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index 96d27c6fd89..796e8732fca 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -39,6 +39,7 @@ set(INC_SYS
 
 set(SRC
 	outliner_collections.c
+	outliner_dragdrop.c
 	outliner_draw.c
 	outliner_edit.c
 	outliner_ops.c
diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c
new file mode 100644
index 00000000000..f37cd7fa5e4
--- /dev/null
+++ b/source/blender/editors/space_outliner/outliner_dragdrop.c
@@ -0,0 +1,1115 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2004 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/space_outliner/outliner_dragdrop.c
+ *  \ingroup spoutliner
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_group_types.h"
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+
+#include "BLI_listbase.h"
+
+#include "BLT_translation.h"
+
+#include "BKE_collection.h"
+#include "BKE_context.h"
+#include "BKE_layer.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+
+#include "ED_object.h"
+#include "ED_outliner.h"
+#include "ED_screen.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "GPU_state.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "outliner_intern.h"
+
+/* ******************** Drop Target Find *********************** */
+
+static TreeElement *outliner_dropzone_element(TreeElement *te, const float fmval[2], const bool children)
+{
+	if ((fmval[1] > te->ys) && (fmval[1] < (te->ys + UI_UNIT_Y))) {
+		/* name and first icon */
+		if ((fmval[0] > te->xs + UI_UNIT_X) && (fmval[0] < te->xend))
+			return te;
+	}
+	/* Not it.  Let's look at its children. */
+	if (children && (TREESTORE(te)->flag & TSE_CLOSED) == 0 && (te->subtree.first)) {
+		for (te = te->subtree.first; te; te = te->next) {
+			TreeElement *te_valid = outliner_dropzone_element(te, fmval, children);
+			if (te_valid)
+				return te_valid;
+		}
+	}
+	return NULL;
+}
+
+/* Find tree element to drop into. */
+static TreeElement *outliner_dropzone_find(const SpaceOops *soops, const float fmval[2], const bool children)
+{
+	TreeElement *te;
+
+	for (te = soops->tree.first; te; te = te->next) {
+		TreeElement *te_valid = outliner_dropzone_element(te, fmval, children);
+		if (te_valid)
+			return te_valid;
+	}
+	return NULL;
+}
+
+/* ******************** Parent Drop Operator *********************** */
+
+static bool parent_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
+{
+	ARegion *ar = CTX_wm_region(C);
+	SpaceOops *soops = CTX_wm_space_outliner(C);
+	float fmval[2];
+	UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fmval[0], &fmval[1]);
+
+	if (drag->type == WM_DRAG_ID) {
+		ID *id = drag->poin;
+		if (GS(id->name) == ID_OB) {
+			/* Ensure item under cursor is valid drop target */
+			TreeElement *te = outliner_dropzone_find(soops, fmval, true);
+			TreeStoreElem *tselem = te ? TREESTORE(te) : NULL;
+
+			if (!te) {
+				/* pass */
+			}
+			else if (te->idcode == ID_OB && tselem->type == 0) {
+				Scene *scene;
+				ID *te_id = tselem->id;
+
+				/* check if dropping self or parent */
+				if (te_id == id || (Object *)te_id == ((Object *)id)->parent)
+					return 0;
+
+				/* check that parent/child are both in the same scene */
+				scene = (Scene *)outliner_search_back(soops, te, ID_SCE);
+
+				/* currently outliner organized in a way that if there's no parent scene
+				 * element for object it means that all displayed objects belong to
+				 * active scene and parenting them is allowed (sergey)
+				 */
+				if (!scene) {
+					return 1;
+				}
+				else {
+					for (ViewLayer *view_layer = scene->view_layers.first;
+					     view_layer;
+					     view_layer = view_layer->next)
+					{
+						if (BKE_view_layer_base_find(view_layer, (Object *)id)) {
+							return 1;
+						}
+					}
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+static void parent_drop_copy(wmDrag *drag, wmDropBox *drop)
+{
+	ID *id = drag->poin;
+
+	RNA_string_set(drop->ptr, "child", id->name + 2);
+}
+
+static int parent_drop_exec(bContext *C, wmOperator *op)
+{
+	Object *par = NULL, *ob = NULL;
+	Main *bmain = CTX_data_main(C);
+	Scene *scene = CTX_data_scene(C);
+	int partype = -1;
+	char parname[MAX_ID_NAME], childname[MAX_ID_NAME];
+
+	partype = RNA_enum_get(op->ptr, "type");
+	RNA_string_get(op->ptr, "parent", parname);
+	par = (Object *)BKE_libblock_find_name(bmain, ID_OB, parname);
+	RNA_string_get(op->ptr, "child", childname);
+	ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, childname);
+
+	if (ID_IS_LINKED(ob)) {
+		BKE_report(op->reports, RPT_INFO, "Can't edit library linked object");
+		return OPERATOR_CANCELLED;
+	}
+
+	ED_object_parent_set(op->reports, C, scene, ob, par, partype, false, false, NULL);
+
+	DEG_relations_tag_update(bmain);
+	WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
+	WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
+static int parent_drop_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+{
+	Object *par = NULL;
+	Object *ob = NULL;
+	SpaceOops *soops = CTX_wm_space_outliner(C);
+	ARegion *ar = CTX_wm_region(C);
+	Main *bmain = CTX_data_main(C);
+	Scene *scene = NULL;
+	TreeElement *te = NULL;
+	char childname[MAX_ID_NAME];
+	char parname[MAX_ID_NAME];
+	int partype = 0;
+	float fmval[2];
+
+	UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fmval[0], &fmval[1]);
+
+	/* Find object hovered over */
+	te = outliner_dropzone_find(soops, fmval, true);
+
+	if (te) {
+		RNA_string_set(op->ptr, "parent", te->name);
+		/* Identify parent and child */
+		RNA_string_get(op->ptr, "child", childname);
+		ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, childname);
+		RNA_string_get(op->ptr, "parent", parname);
+		par = (Object *)BKE_libblock_find_name(bmain, ID_OB, parname);
+
+		if (ELEM(NULL, ob, par)) {
+			if (par == NULL) printf("par==NULL\n");
+			return OPERATOR_CANCELLED;
+		}
+		if (ob == par) {
+			return OPERATOR_CANCELLED;
+		}
+		if (ID_IS_LINKED(ob)) {
+			BKE_report(op->reports, RPT_INFO, "Can't edit library linked object");
+			return OPERATOR_CANCELLED;
+		}
+
+		scene = (Scene *)outliner_search_back(soops, te, ID_SCE);
+
+		if (scene == NULL) {
+			/* currently outlier organized in a way, that if there's no parent scene
+			 * element for object it means that all displayed objects belong to
+			 * active scene and parenting them is allowed (sergey)
+			 */
+
+			scene = CTX_data_scene(C);
+		}
+
+		if ((par->type != OB_ARMATURE) && (par->type != OB_CURVE) && (par->type != OB_LATTICE)) {
+			if (ED_object_parent_set(op->reports, C, scene, ob, par, partype, false, false, NULL)) {
+				DEG_relations_tag_update(bmain);
+				WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
+				WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
+			}
+		}
+		else {
+			/* Menu creation */
+			wmOperatorType *ot = WM_operatortype_find("OUTLINER_OT_parent_drop", false);
+			uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("Set Parent To"), ICON_NONE);
+			uiLayout *layout = UI_popup_menu_layout(pup);
+			PointerRNA ptr;
+
+			/* Cannot use uiItemEnumO()... have multiple properties to set. */
+			uiItemFullO_ptr(layout, ot, IFACE_("Object"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);
+			RNA_string_set(&ptr, "parent", parname);
+			RNA_string_set(&ptr, "child", childname);
+			RNA_enum_set(&ptr, "type", PAR_OBJECT);
+
+			/* par becomes parent, make the associated menus */
+			if (par->type == OB_ARMATURE) {
+				uiItemFullO_ptr(layout, ot, IFACE_("Armature Deform"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);
+				RNA_string_set(&ptr, "parent", parname);
+				RNA_string_set(&ptr, "child", childname);
+				RNA_enum_set(&ptr, "type", PAR_ARMATURE);
+
+				uiItemFullO_ptr(layout, ot, IFACE_("   With Empty Groups"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);
+				RNA_string_set(&ptr, "parent", parname);
+				RNA_string_set(&ptr, "child", childname);
+				RNA_enum_set(&ptr, "type", PAR_ARMATURE_NAME);
+
+				uiItemFullO_ptr(layout, ot, IFACE_("   With Envelope Weights"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);
+				RNA_string_set(&ptr, "parent", parname);
+				RNA_string_set(&ptr, "child", childname);
+				RNA_enum_set(&ptr, "type", PAR_ARMATURE_ENVELOPE);
+
+				uiItemFullO_ptr(layout, ot, IFACE_("   With Automatic Weights"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);
+				RNA_string_set(&ptr, "parent", parname);
+				RNA_string_set(&ptr, "child", childname);
+				RNA_enum_set(&ptr, "type", PAR_ARMATURE_AUTO);
+
+				uiItemFullO_ptr(layout, ot, IFACE_("Bone"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);
+				RNA_string_set(&ptr, "parent", parname);
+				RNA_string_set(&ptr, "child", childname);
+				RNA_enum_set(&ptr, "type", PAR_BONE);
+			}
+			else if (par->type == OB_CURVE) {
+				uiItemFullO_ptr(layout, ot, IFACE_("Curve Deform"), 0, NULL, WM_OP_EXEC_DEFAULT, 0, &ptr);


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list