[Bf-blender-cvs] [79dabc537e3] blender2.8: Merge branch 'master' into blender2.8

Campbell Barton noreply at git.blender.org
Fri Jul 6 14:42:23 CEST 2018


Commit: 79dabc537e3e345c3e536a6369b1d130942155c3
Author: Campbell Barton
Date:   Fri Jul 6 14:41:14 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB79dabc537e3e345c3e536a6369b1d130942155c3

Merge branch 'master' into blender2.8

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



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

diff --cc source/blender/editors/space_outliner/outliner_edit.c
index 1c78931b449,3708b653ec4..d8a5ba533c4
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@@ -150,45 -147,8 +150,45 @@@ TreeElement *outliner_dropzone_find(con
  	return NULL;
  }
  
 +
  /* ************************************************************** */
 -/* Click Activated */
 +
 +/* Highlight --------------------------------------------------- */
 +
 +static int outliner_highlight_update(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
 +{
 +	ARegion *ar = CTX_wm_region(C);
 +	SpaceOops *soops = CTX_wm_space_outliner(C);
 +	const float my = UI_view2d_region_to_view_y(&ar->v2d, event->mval[1]);
 +
 +	TreeElement *hovered_te = outliner_find_item_at_y(soops, &soops->tree, my);
 +	bool changed = false;
 +
 +	if (!hovered_te || !(hovered_te->store_elem->flag & TSE_HIGHLIGHTED)) {
- 		changed = outliner_set_flag(&soops->tree, TSE_HIGHLIGHTED, false);
++		changed = outliner_flag_set(&soops->tree, TSE_HIGHLIGHTED, false);
 +		if (hovered_te) {
 +			hovered_te->store_elem->flag |= TSE_HIGHLIGHTED;
 +			changed = true;
 +		}
 +	}
 +
 +	if (changed) {
 +		ED_region_tag_redraw_no_rebuild(ar);
 +	}
 +
 +	return (OPERATOR_FINISHED | OPERATOR_PASS_THROUGH);
 +}
 +
 +void OUTLINER_OT_highlight_update(wmOperatorType *ot)
 +{
 +	ot->name = "Update Highlight";
 +	ot->idname = "OUTLINER_OT_highlight_update";
 +	ot->description = "Update the item highlight based on the current mouse position";
 +
 +	ot->invoke = outliner_highlight_update;
 +
 +	ot->poll = ED_operator_outliner_active;
 +}
  
  /* Toggle Open/Closed ------------------------------------------- */
  
@@@ -850,11 -743,7 +850,11 @@@ int outliner_flag_is_any_test(ListBase 
  	return 0;
  }
  
 -void outliner_flag_set(ListBase *lb, short flag, short set)
 +/**
 + * Set or unset \a flag for all outliner elements in \a lb and sub-trees.
 + * \return if any flag was modified.
 + */
- bool outliner_set_flag(ListBase *lb, short flag, short set)
++bool outliner_flag_set(ListBase *lb, short flag, short set)
  {
  	TreeElement *te;
  	TreeStoreElem *tselem;
@@@ -863,21 -750,10 +863,21 @@@
  
  	for (te = lb->first; te; te = te->next) {
  		tselem = TREESTORE(te);
 -		if (set == 0) tselem->flag &= ~flag;
 -		else tselem->flag |= flag;
 -		outliner_flag_set(&te->subtree, flag, set);
 +		has_flag = (tselem->flag & flag);
 +		if (set == 0) {
 +			if (has_flag) {
 +				tselem->flag &= ~flag;
 +				changed = true;
 +			}
 +		}
 +		else if (!has_flag) {
 +			tselem->flag |= flag;
 +			changed = true;
 +		}
- 		changed |= outliner_set_flag(&te->subtree, flag, set);
++		changed |= outliner_flag_set(&te->subtree, flag, set);
  	}
 +
 +	return changed;
  }
  
  /* Restriction Columns ------------------------------- */
@@@ -946,14 -997,15 +946,14 @@@ static int outliner_toggle_selected_exe
  	ARegion *ar = CTX_wm_region(C);
  	Scene *scene = CTX_data_scene(C);
  
- 	if (outliner_has_one_flag(&soops->tree, TSE_SELECTED, 1))
- 		outliner_set_flag(&soops->tree, TSE_SELECTED, 0);
+ 	if (outliner_flag_is_any_test(&soops->tree, TSE_SELECTED, 1))
+ 		outliner_flag_set(&soops->tree, TSE_SELECTED, 0);
  	else
- 		outliner_set_flag(&soops->tree, TSE_SELECTED, 1);
+ 		outliner_flag_set(&soops->tree, TSE_SELECTED, 1);
  
 -	soops->storeflag |= SO_TREESTORE_REDRAW;
 -
 +	DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
  	WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
 -	ED_region_tag_redraw(ar);
 +	ED_region_tag_redraw_no_rebuild(ar);
  
  	return OPERATOR_FINISHED;
  }
diff --cc source/blender/editors/space_outliner/outliner_intern.h
index 0ab22208841,49647a0d838..0763933b102
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@@ -245,8 -172,8 +245,8 @@@ void outliner_do_object_operation
  
  int common_restrict_check(struct bContext *C, struct Object *ob);
  
- int outliner_has_one_flag(ListBase *lb, short flag, const int curlevel);
- bool outliner_set_flag(ListBase *lb, short flag, short set);
+ int outliner_flag_is_any_test(ListBase *lb, short flag, const int curlevel);
 -void outliner_flag_set(ListBase *lb, short flag, short set);
++bool outliner_flag_set(ListBase *lb, short flag, short set);
  
  void object_toggle_visibility_cb(
          struct bContext *C, struct ReportList *reports, struct Scene *scene,
diff --cc source/blender/editors/space_outliner/outliner_ops.c
index b061e8537c2,9574e82505f..760e2853038
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@@ -51,356 -36,8 +51,356 @@@
  #include "WM_api.h"
  #include "WM_types.h"
  
 +#include "ED_screen.h"
 +
  #include "outliner_intern.h"
  
 +typedef struct OutlinerDragDropTooltip {
 +	TreeElement *te;
 +	void *handle;
 +} OutlinerDragDropTooltip;
 +
 +enum {
 +	OUTLINER_ITEM_DRAG_CANCEL,
 +	OUTLINER_ITEM_DRAG_CONFIRM,
 +};
 +
 +static bool outliner_item_drag_drop_poll(bContext *C)
 +{
 +	SpaceOops *soops = CTX_wm_space_outliner(C);
 +	return ED_operator_outliner_active(C) &&
 +	       /* Only collection display modes supported for now. Others need more design work */
 +	       ELEM(soops->outlinevis, SO_VIEW_LAYER, SO_LIBRARIES);
 +}
 +
 +static TreeElement *outliner_item_drag_element_find(SpaceOops *soops, ARegion *ar, const wmEvent *event)
 +{
 +	/* note: using EVT_TWEAK_ events to trigger dragging is fine,
 +	 * it sends coordinates from where dragging was started */
 +	const float my = UI_view2d_region_to_view_y(&ar->v2d, event->mval[1]);
 +	return outliner_find_item_at_y(soops, &soops->tree, my);
 +}
 +
 +static void outliner_item_drag_end(wmWindow *win, OutlinerDragDropTooltip *data)
 +{
 +	MEM_SAFE_FREE(data->te->drag_data);
 +
 +	if (data->handle) {
 +		WM_draw_cb_exit(win, data->handle);
 +	}
 +
 +	MEM_SAFE_FREE(data);
 +}
 +
 +static void outliner_item_drag_get_insert_data(
 +        const SpaceOops *soops, ARegion *ar, const wmEvent *event, TreeElement *te_dragged,
 +        TreeElement **r_te_insert_handle, TreeElementInsertType *r_insert_type)
 +{
 +	TreeElement *te_hovered;
 +	float view_mval[2];
 +
 +	UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &view_mval[0], &view_mval[1]);
 +	te_hovered = outliner_find_item_at_y(soops, &soops->tree, view_mval[1]);
 +
 +	if (te_hovered) {
 +		/* mouse hovers an element (ignoring x-axis), now find out how to insert the dragged item exactly */
 +
 +		if (te_hovered == te_dragged) {
 +			*r_te_insert_handle = te_dragged;
 +		}
 +		else if (te_hovered != te_dragged) {
 +			const float margin = UI_UNIT_Y * (1.0f / 4);
 +
 +			*r_te_insert_handle = te_hovered;
 +			if (view_mval[1] < (te_hovered->ys + margin)) {
 +				if (TSELEM_OPEN(TREESTORE(te_hovered), soops)) {
 +					/* inserting after a open item means we insert into it, but as first child */
 +					if (BLI_listbase_is_empty(&te_hovered->subtree)) {
 +						*r_insert_type = TE_INSERT_INTO;
 +					}
 +					else {
 +						*r_insert_type = TE_INSERT_BEFORE;
 +						*r_te_insert_handle = te_hovered->subtree.first;
 +					}
 +				}
 +				else {
 +					*r_insert_type = TE_INSERT_AFTER;
 +				}
 +			}
 +			else if (view_mval[1] > (te_hovered->ys + (3 * margin))) {
 +				*r_insert_type = TE_INSERT_BEFORE;
 +			}
 +			else {
 +				*r_insert_type = TE_INSERT_INTO;
 +			}
 +		}
 +	}
 +	else {
 +		/* mouse doesn't hover any item (ignoring x-axis), so it's either above list bounds or below. */
 +
 +		TreeElement *first = soops->tree.first;
 +		TreeElement *last = soops->tree.last;
 +
 +		if (view_mval[1] < last->ys) {
 +			*r_te_insert_handle = last;
 +			*r_insert_type = TE_INSERT_AFTER;
 +		}
 +		else if (view_mval[1] > (first->ys + UI_UNIT_Y)) {
 +			*r_te_insert_handle = first;
 +			*r_insert_type = TE_INSERT_BEFORE;
 +		}
 +		else {
 +			BLI_assert(0);
 +		}
 +	}
 +}
 +
 +static void outliner_item_drag_handle(
 +        SpaceOops *soops, ARegion *ar, const wmEvent *event, TreeElement *te_dragged)
 +{
 +	TreeElement *te_insert_handle;
 +	TreeElementInsertType insert_type;
 +
 +	outliner_item_drag_get_insert_data(soops, ar, event, te_dragged, &te_insert_handle, &insert_type);
 +
 +	if (!te_dragged->reinsert_poll &&
 +	    /* there is no reinsert_poll, so we do some generic checks (same types and reinsert callback is available) */
 +	    (TREESTORE(te_dragged)->type == TREESTORE(te_insert_handle)->type) &&
 +	    te_dragged->reinsert)
 +	{
 +		/* pass */
 +	}
 +	else if (te_dragged == te_insert_handle) {
 +		/* nothing will happen anyway, no need to do poll check */
 +	}
 +	else if (!te_dragged->reinsert_poll ||
 +	         !te_dragged->reinsert_poll(te_dragged, &te_insert_handle, &insert_type))
 +	{
 +		te_insert_handle = NULL;
 +	}
 +	te_dragged->drag_data->insert_type = insert_type;
 +	te_dragged->drag_data->insert_handle = te_insert_handle;
 +}
 +
 +/**
 + * Returns true if it is a collection and empty.
 + */
 +static bool is_empty_collection(TreeElement *te)
 +{
 +	Collection *collection = outliner_collection_from_tree_element(te);
 +
 +	if (!collection) {
 +		return false;
 +	}
 +
 +	return BLI_listbase_is_empty(&collection->gobject) &&
 +	       BLI_listbase_is_empty(&collection->children);
 +}
 +
 +static bool outliner_item_drag_drop_apply(
 +        Main *bmain,
 +        Scene *scene,
 +        SpaceOops *soops,
 +        OutlinerDragDropTooltip *data,
 +        const wmEvent *event)
 +{
 +	TreeElement *dragged_te = data->te;
 +	TreeElement *insert_handle = dragged_te->drag_data->insert_handle;
 +	TreeElementInsertType insert_type = dragged_te->drag_data->insert_type;
 +
 +	if ((insert_handle == dragged_te) || !insert_handle) {
 +		/* No need to do anything */
 +	}
 +	else if (dragged_te->reinsert) {
 +		BLI_assert(!dragged_te->reinsert_poll || dragged_te->reinsert_poll(dragged_te, &insert_handle,
 +		                                                                   &insert_type));
 +		/* call of assert above should not have changed insert_handle and insert_type at this point */
 +		BLI_assert(dragged_te->drag_data->insert_handle == insert_handle &&
 +		           dragged_te->drag_data->insert_type == insert_type);
 +
 +		/* If the collection was

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list