Fix: Nav_bar context menu in preferences

Also merge the keymaps for header/footer/navbar.

D4736 by @Gvgeo with edits
This commit is contained in:
Campbell Barton 2019-05-09 18:40:42 +10:00
parent f09aead64a
commit dea8fb2bea
Notes: blender-bot 2023-02-14 11:24:03 +01:00
Referenced by issue #63860, Right-clicking navbar of User Preferences inconsistent
9 changed files with 89 additions and 142 deletions

View File

@ -54,8 +54,7 @@ _km_hierarchy = [
('Window', 'EMPTY', 'WINDOW', []), # file save, window change, exit
('Screen', 'EMPTY', 'WINDOW', [ # full screen, undo, screenshot
('Screen Editing', 'EMPTY', 'WINDOW', []), # re-sizing, action corners
('Header', 'EMPTY', 'WINDOW', []), # header stuff (per region)
('Footer', 'EMPTY', 'WINDOW', []), # footer stuff (per region)
('Region Context Menu', 'EMPTY', 'WINDOW', []), # header/footer/navigation_bar stuff (per region)
]),
('View2D', 'EMPTY', 'WINDOW', []), # view 2d navigation (per region)

View File

@ -525,31 +525,16 @@ def km_screen_editing(params):
return keymap
def km_header(_params):
def km_screen_region_context_menu(_params):
items = []
keymap = (
"Header",
"Region Context Menu",
{"space_type": 'EMPTY', "region_type": 'WINDOW'},
{"items": items},
)
items.extend([
("screen.header_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
])
return keymap
def km_footer(_params):
items = []
keymap = (
"Footer",
{"space_type": 'EMPTY', "region_type": 'WINDOW'},
{"items": items},
)
items.extend([
("screen.footer_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
("screen.region_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
])
return keymap
@ -6038,8 +6023,7 @@ def generate_keymaps(params=None):
km_window(params),
km_screen(params),
km_screen_editing(params),
km_header(params),
km_footer(params),
km_screen_region_context_menu(params),
km_view2d(params),
km_view2d_buttons_list(params),
km_user_interface(params),

View File

@ -284,16 +284,16 @@ def km_screen_editing(params):
return keymap
def km_header(_params):
def km_screen_region_context_menu(_params):
items = []
keymap = (
"Header",
"Region Context Menu",
{"space_type": 'EMPTY', "region_type": 'WINDOW'},
{"items": items},
)
items.extend([
("screen.header_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
("screen.region_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None),
])
return keymap
@ -3634,7 +3634,7 @@ def generate_keymaps(params=None):
km_window(params),
km_screen(params),
km_screen_editing(params),
km_header(params),
km_screen_region_context_menu(params),
km_view2d(params),
km_view2d_buttons_list(params),
km_user_interface(params),

View File

@ -436,11 +436,13 @@ enum {
ED_KEYMAP_GIZMO = (1 << 2),
ED_KEYMAP_TOOL = (1 << 3),
ED_KEYMAP_VIEW2D = (1 << 4),
ED_KEYMAP_ANIMATION = (1 << 5),
ED_KEYMAP_FRAMES = (1 << 6),
ED_KEYMAP_HEADER = (1 << 7),
ED_KEYMAP_GPENCIL = (1 << 8),
ED_KEYMAP_MARKERS = (1 << 5),
ED_KEYMAP_ANIMATION = (1 << 6),
ED_KEYMAP_FRAMES = (1 << 7),
ED_KEYMAP_HEADER = (1 << 8),
ED_KEYMAP_FOOTER = (1 << 9),
ED_KEYMAP_GPENCIL = (1 << 10),
ED_KEYMAP_NAVBAR = (1 << 11),
};
/* SCREEN_OT_space_context_cycle direction */

View File

@ -1627,14 +1627,19 @@ static void ed_default_handlers(
}
if (flag & ED_KEYMAP_HEADER) {
/* standard keymap for headers regions */
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Header", 0, 0);
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Region Context Menu", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
}
if (flag & ED_KEYMAP_FOOTER) {
/* standard keymap for footer regions */
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Footer", 0, 0);
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Region Context Menu", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
}
if (flag & ED_KEYMAP_NAVBAR) {
/* standard keymap for Navigation bar regions */
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Region Context Menu", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
/* Keep last because of LMB/RMB handling, see: T57527. */
if (flag & ED_KEYMAP_GPENCIL) {

View File

@ -3955,10 +3955,10 @@ static void SCREEN_OT_header_toggle_menus(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
/** \name Header Tools Operator
/** \name Region Context Menu Operator (Header/Footer/Navbar)
* \{ */
static bool header_context_menu_poll(bContext *C)
static bool screen_region_context_menu_poll(bContext *C)
{
ScrArea *sa = CTX_wm_area(C);
return (sa && sa->spacetype != SPACE_STATUSBAR);
@ -4008,33 +4008,82 @@ void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *UN
}
}
static int header_context_menu_invoke(bContext *C,
void ED_screens_footer_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{
ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
const char *but_flip_str = (ar->alignment == RGN_ALIGN_TOP) ? IFACE_("Flip to Bottom") :
IFACE_("Flip to Top");
uiItemO(layout, IFACE_("Toggle Footer"), ICON_NONE, "SCREEN_OT_footer");
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip");
/* file browser should be fullscreen all the time, topbar should
* never be. But other regions can be maximized/restored... */
if (!ELEM(sa->spacetype, SPACE_FILE, SPACE_TOPBAR)) {
uiItemS(layout);
const char *but_str = sa->full ? IFACE_("Tile Area") : IFACE_("Maximize Area");
uiItemO(layout, but_str, ICON_NONE, "SCREEN_OT_screen_full_area");
}
}
void ED_screens_navigation_bar_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{
const ARegion *ar = CTX_wm_region(C);
const char *but_flip_str = (ar->alignment == RGN_ALIGN_LEFT) ? IFACE_("Flip to Right") :
IFACE_("Flip to Left");
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip");
}
static int screen_context_menu_invoke(bContext *C,
wmOperator *UNUSED(op),
const wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
const ARegion *ar = CTX_wm_region(C);
pup = UI_popup_menu_begin(C, IFACE_("Header"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
ED_screens_header_tools_menu_create(C, layout, NULL);
UI_popup_menu_end(C, pup);
if (ELEM(ar->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) {
pup = UI_popup_menu_begin(C, IFACE_("Header"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
ED_screens_header_tools_menu_create(C, layout, NULL);
UI_popup_menu_end(C, pup);
}
else if (ar->regiontype == RGN_TYPE_FOOTER) {
pup = UI_popup_menu_begin(C, IFACE_("Footer"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
ED_screens_footer_tools_menu_create(C, layout, NULL);
UI_popup_menu_end(C, pup);
}
else if (ar->regiontype == RGN_TYPE_NAV_BAR) {
pup = UI_popup_menu_begin(C, IFACE_("Navigation Bar"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
ED_screens_navigation_bar_tools_menu_create(C, layout, NULL);
UI_popup_menu_end(C, pup);
}
return OPERATOR_INTERFACE;
}
static void SCREEN_OT_header_context_menu(wmOperatorType *ot)
static void SCREEN_OT_region_context_menu(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Header Context Menu";
ot->description = "Display header region context menu";
ot->idname = "SCREEN_OT_header_context_menu";
ot->name = "Region Context Menu";
ot->description = "Display region context menu";
ot->idname = "SCREEN_OT_region_context_menu";
/* api callbacks */
ot->poll = header_context_menu_poll;
ot->invoke = header_context_menu_invoke;
ot->poll = screen_region_context_menu_poll;
ot->invoke = screen_context_menu_invoke;
}
/** \} */
@ -4073,89 +4122,6 @@ static void SCREEN_OT_footer(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
/** \name Footer Tools Operator
* \{ */
static bool footer_context_menu_poll(bContext *C)
{
ScrArea *sa = CTX_wm_area(C);
return sa;
}
void ED_screens_footer_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{
ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
const char *but_flip_str = (ar->alignment == RGN_ALIGN_TOP) ? IFACE_("Flip to Bottom") :
IFACE_("Flip to Top");
uiItemO(layout, IFACE_("Toggle Footer"), ICON_NONE, "SCREEN_OT_footer");
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip");
/* file browser should be fullscreen all the time, topbar should
* never be. But other regions can be maximized/restored... */
if (!ELEM(sa->spacetype, SPACE_FILE, SPACE_TOPBAR)) {
uiItemS(layout);
const char *but_str = sa->full ? IFACE_("Tile Area") : IFACE_("Maximize Area");
uiItemO(layout, but_str, ICON_NONE, "SCREEN_OT_screen_full_area");
}
}
static int footer_context_menu_invoke(bContext *C,
wmOperator *UNUSED(op),
const wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
pup = UI_popup_menu_begin(C, IFACE_("Footer"), ICON_NONE);
layout = UI_popup_menu_layout(pup);
ED_screens_footer_tools_menu_create(C, layout, NULL);
UI_popup_menu_end(C, pup);
return OPERATOR_INTERFACE;
}
static void SCREEN_OT_footer_context_menu(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Footer Context Menu";
ot->description = "Display footer region context menu";
ot->idname = "SCREEN_OT_footer_context_menu";
/* api callbacks */
ot->poll = footer_context_menu_poll;
ot->invoke = footer_context_menu_invoke;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Navigation Bar Tools Menu
* \{ */
void ED_screens_navigation_bar_tools_menu_create(bContext *C, uiLayout *layout, void *UNUSED(arg))
{
const ARegion *ar = CTX_wm_region(C);
const char *but_flip_str = (ar->alignment == RGN_ALIGN_LEFT) ? IFACE_("Flip to Right") :
IFACE_("Flip to Left");
/* default is WM_OP_INVOKE_REGION_WIN, which we don't want here. */
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
uiItemO(layout, but_flip_str, ICON_NONE, "SCREEN_OT_region_flip");
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Animation Step Operator
*
@ -5299,9 +5265,8 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_region_scale);
WM_operatortype_append(SCREEN_OT_region_flip);
WM_operatortype_append(SCREEN_OT_header_toggle_menus);
WM_operatortype_append(SCREEN_OT_header_context_menu);
WM_operatortype_append(SCREEN_OT_region_context_menu);
WM_operatortype_append(SCREEN_OT_footer);
WM_operatortype_append(SCREEN_OT_footer_context_menu);
WM_operatortype_append(SCREEN_OT_screen_set);
WM_operatortype_append(SCREEN_OT_screen_full_area);
WM_operatortype_append(SCREEN_OT_back_to_previous);

View File

@ -56,15 +56,10 @@
static int context_menu_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
{
const ARegion *ar = CTX_wm_region(C);
uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("Context Menu"), ICON_NONE);
uiLayout *layout = UI_popup_menu_layout(pup);
uiItemM(layout, "INFO_MT_area", NULL, ICON_NONE);
if (ar->regiontype == RGN_TYPE_NAV_BAR) {
ED_screens_navigation_bar_tools_menu_create(C, layout, NULL);
}
UI_popup_menu_end(C, pup);
return OPERATOR_INTERFACE;

View File

@ -400,9 +400,6 @@ static void buttons_header_region_message_subscribe(const bContext *UNUSED(C),
static void buttons_navigation_bar_region_init(wmWindowManager *wm, ARegion *ar)
{
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Property Editor", SPACE_PROPERTIES, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
ar->flag |= RGN_FLAG_PREFSIZE_OR_HIDDEN;
ED_region_panels_init(wm, ar);
@ -749,7 +746,7 @@ void ED_spacetype_buttons(void)
art->regionid = RGN_TYPE_NAV_BAR;
art->prefsizex = AREAMINX - 3; /* XXX Works and looks best,
* should we update AREAMINX accordingly? */
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES | ED_KEYMAP_NAVBAR;
art->init = buttons_navigation_bar_region_init;
art->draw = buttons_navigation_bar_region_draw;
art->message_subscribe = buttons_navigation_bar_region_message_subscribe;

View File

@ -249,7 +249,7 @@ void ED_spacetype_userpref(void)
art->init = userpref_navigation_region_init;
art->draw = userpref_navigation_region_draw;
art->listener = userpref_navigation_region_listener;
art->keymapflag = ED_KEYMAP_UI;
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_NAVBAR;
BLI_addhead(&st->regiontypes, art);