From 92182495da881d54310bc6dd53afb91daf00116f Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Fri, 1 Mar 2019 13:14:16 -0300 Subject: Fix T62016: Outliner visibility icons drag behaviour broken We are mixing bool and fancy 3-in-1 func-set buttons in the outliner. So they would return different pushed state in ui_drag_toggle_but_pushed_state(). We now have a callback function that allows the button to set its own pushed_button_state callback function. Note: This is a bit of overkill since we are planning to change the 3-in-1 outliner buttons. That said, it may be nice to have, since in the future we can mix those buttons for other things. Reviewers: brecht Differential Revision: https://developer.blender.org/D4434 --- .../blender/editors/space_outliner/outliner_draw.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'source/blender/editors/space_outliner') diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index ba6a2d9f318..2e64ce2bae0 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -268,6 +268,16 @@ static void restrictbutton_id_user_toggle(bContext *UNUSED(C), void *poin, void } } +static int base_pushed_state_cb(bContext *UNUSED(C), void *poin, void *UNUSED(poin2)) +{ + Base *base = poin; + Object *ob = base->object; + + const bool is_visible = ((base->flag & BASE_HIDDEN) == 0) && + ((ob->restrictflag & OB_RESTRICT_VIEW) == 0); + return !is_visible; +} + static void hidebutton_base_flag_cb(bContext *C, void *poin, void *poin2) { wmWindow *win = CTX_wm_window(C); @@ -333,6 +343,16 @@ static void hidebutton_base_flag_cb(bContext *C, void *poin, void *poin2) } } +static int layer_collection_pushed_state_cb(bContext *UNUSED(C), void *poin, void *UNUSED(poin2)) +{ + LayerCollection *lc = poin; + Collection *collection = lc->collection; + + const bool is_visible = ((lc->flag & LAYER_COLLECTION_RESTRICT_VIEW) == 0) && + ((collection->flag & COLLECTION_RESTRICT_VIEW) == 0); + return !is_visible; +} + static void hidebutton_layer_collection_flag_cb(bContext *C, void *poin, void *poin2) { wmWindow *win = CTX_wm_window(C); @@ -602,6 +622,7 @@ static void outliner_draw_restrictbuts( "* Alt to disable for all viewports\n" "* Ctrl to isolate visibility")); UI_but_func_set(bt, hidebutton_base_flag_cb, view_layer, base); + UI_but_func_pushed_state_set(bt, base_pushed_state_cb, base); UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK); } else { @@ -731,6 +752,7 @@ static void outliner_draw_restrictbuts( "* Ctrl to isolate visibility\n" "* Shift to hide inside objects and collections")); UI_but_func_set(bt, hidebutton_layer_collection_flag_cb, view_layer, lc); + UI_but_func_pushed_state_set(bt, layer_collection_pushed_state_cb, lc); UI_but_flag_enable(bt, UI_BUT_DRAG_LOCK); } else { -- cgit v1.2.3