diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-07-02 15:47:30 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-07-02 15:52:22 +0300 |
commit | 34678388f3a5a79ba693a21d8c374df15cafb6a9 (patch) | |
tree | 012ae871e7eec1a57ecdecb26af4ba4a08eee73a /source/blender/editors/space_outliner | |
parent | b3098c30a6948282dd4317e63cf0dab95fc4730a (diff) |
Outliner: add outliner wide RMB context menu.
All right click menus in the outliner now include OUTLINER_MT_context.
Diffstat (limited to 'source/blender/editors/space_outliner')
-rw-r--r-- | source/blender/editors/space_outliner/outliner_tools.c | 72 |
1 files changed, 52 insertions, 20 deletions
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index b2ac4afc112..16abed60414 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -63,6 +63,7 @@ #include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" +#include "BKE_screen.h" #include "BKE_sequencer.h" #include "DEG_depsgraph.h" @@ -1783,6 +1784,26 @@ void OUTLINER_OT_data_operation(wmOperatorType *ot) /* ******************** */ +static int outliner_operator_menu(bContext *C, const char *opname) +{ + wmOperatorType *ot = WM_operatortype_find(opname, false); + uiPopupMenu *pup = UI_popup_menu_begin(C, RNA_struct_ui_name(ot->srna), ICON_NONE); + uiLayout *layout = UI_popup_menu_layout(pup); + + /* set this so the default execution context is the same as submenus */ + uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN); + uiItemsEnumO(layout, ot->idname, RNA_property_identifier(ot->prop)); + + MenuType *mt = WM_menutype_find("OUTLINER_MT_context", false); + if (mt) { + uiItemS(layout); + UI_menutype_draw(C, mt, layout); + } + + UI_popup_menu_end(C, pup); + + return OPERATOR_INTERFACE; +} static int do_outliner_operation_event(bContext *C, ARegion *ar, SpaceOops *soops, TreeElement *te, const float mval[2]) @@ -1811,28 +1832,32 @@ static int do_outliner_operation_event(bContext *C, ARegion *ar, SpaceOops *soop if (scenelevel) { if (objectlevel || datalevel || idlevel) { BKE_report(reports, RPT_WARNING, "Mixed selection"); + return OPERATOR_CANCELLED; } else { - WM_operator_name_call(C, "OUTLINER_OT_scene_operation", WM_OP_INVOKE_REGION_WIN, NULL); + return outliner_operator_menu(C, "OUTLINER_OT_scene_operation"); } } else if (objectlevel) { WM_menu_name_call(C, "OUTLINER_MT_object", WM_OP_INVOKE_REGION_WIN); + return OPERATOR_FINISHED; } else if (idlevel) { if (idlevel == -1 || datalevel) { BKE_report(reports, RPT_WARNING, "Mixed selection"); + return OPERATOR_CANCELLED; } else { switch (idlevel) { case ID_GR: WM_menu_name_call(C, "OUTLINER_MT_collection", WM_OP_INVOKE_REGION_WIN); + return OPERATOR_FINISHED; break; case ID_LI: - WM_operator_name_call(C, "OUTLINER_OT_lib_operation", WM_OP_INVOKE_REGION_WIN, NULL); + return outliner_operator_menu(C, "OUTLINER_OT_lib_operation"); break; default: - WM_operator_name_call(C, "OUTLINER_OT_id_operation", WM_OP_INVOKE_REGION_WIN, NULL); + return outliner_operator_menu(C, "OUTLINER_OT_id_operation"); break; } } @@ -1840,41 +1865,49 @@ static int do_outliner_operation_event(bContext *C, ARegion *ar, SpaceOops *soop else if (datalevel) { if (datalevel == -1) { BKE_report(reports, RPT_WARNING, "Mixed selection"); + return OPERATOR_CANCELLED; } else { - if (datalevel == TSE_ANIM_DATA) - WM_operator_name_call(C, "OUTLINER_OT_animdata_operation", WM_OP_INVOKE_REGION_WIN, NULL); + if (datalevel == TSE_ANIM_DATA) { + return outliner_operator_menu(C, "OUTLINER_OT_animdata_operation"); + } else if (datalevel == TSE_DRIVER_BASE) { /* do nothing... no special ops needed yet */ + return OPERATOR_CANCELLED; } else if (datalevel == TSE_LAYER_COLLECTION) { WM_menu_name_call(C, "OUTLINER_MT_collection", WM_OP_INVOKE_REGION_WIN); + return OPERATOR_FINISHED; } else if (ELEM(datalevel, TSE_SCENE_COLLECTION_BASE, TSE_VIEW_COLLECTION_BASE)) { WM_menu_name_call(C, "OUTLINER_MT_collection_new", WM_OP_INVOKE_REGION_WIN); + return OPERATOR_FINISHED; } else if (datalevel == TSE_ID_BASE) { /* do nothing... there are no ops needed here yet */ } else if (datalevel == TSE_CONSTRAINT) { - WM_operator_name_call(C, "OUTLINER_OT_constraint_operation", WM_OP_INVOKE_REGION_WIN, NULL); + return outliner_operator_menu(C, "OUTLINER_OT_constraint_operation"); } else if (datalevel == TSE_MODIFIER) { - WM_operator_name_call(C, "OUTLINER_OT_modifier_operation", WM_OP_INVOKE_REGION_WIN, NULL); + return outliner_operator_menu(C, "OUTLINER_OT_modifier_operation"); } else { - WM_operator_name_call(C, "OUTLINER_OT_data_operation", WM_OP_INVOKE_REGION_WIN, NULL); + return outliner_operator_menu(C, "OUTLINER_OT_data_operation"); } } } - return 1; + return OPERATOR_CANCELLED; } for (te = te->subtree.first; te; te = te->next) { - if (do_outliner_operation_event(C, ar, soops, te, mval)) - return 1; + int retval = do_outliner_operation_event(C, ar, soops, te, mval); + if (retval) { + return retval; + } } + return 0; } @@ -1886,7 +1919,6 @@ static int outliner_operation(bContext *C, wmOperator *UNUSED(op), const wmEvent uiBut *but = UI_context_active_but_get(C); TreeElement *te; float fmval[2]; - bool found = false; if (but) { UI_but_tooltip_timer_remove(C, but); @@ -1895,19 +1927,19 @@ static int outliner_operation(bContext *C, wmOperator *UNUSED(op), const wmEvent UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fmval[0], &fmval[1]); for (te = soops->tree.first; te; te = te->next) { - if (do_outliner_operation_event(C, ar, soops, te, fmval)) { - found = true; - break; + int retval = do_outliner_operation_event(C, ar, soops, te, fmval); + if (retval) { + return retval; } } - if (!found) { - /* Menus for clicking in empty space. */ - if (soops->outlinevis == SO_VIEW_LAYER) { - WM_menu_name_call(C, "OUTLINER_MT_collection_new", WM_OP_INVOKE_REGION_WIN); - } + /* Menus for clicking in empty space. */ + if (soops->outlinevis == SO_VIEW_LAYER) { + WM_menu_name_call(C, "OUTLINER_MT_collection_new", WM_OP_INVOKE_REGION_WIN); + return OPERATOR_FINISHED; } + WM_menu_name_call(C, "OUTLINER_MT_context", WM_OP_INVOKE_REGION_WIN); return OPERATOR_FINISHED; } |