UI Experiment: Status Bar Keymap Display While Idle #120386

Closed
Harley Acheson wants to merge 5 commits from Harley/blender:StatusBarIdle into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
6 changed files with 118 additions and 0 deletions

View File

@ -95,6 +95,10 @@ struct SpaceType {
/** Refresh context, called after file-reads, #ED_area_tag_refresh(). */
void (*refresh)(const bContext *C, ScrArea *area);
/* Default status bar display when idle. */
void (*status_bar)(
const bContext *C, wmWindow *win, ScrArea *area, ARegion *region, uiLayout *layout);
/* after a spacedata copy, an init should result in exact same situation */
SpaceLink *(*duplicate)(SpaceLink *sl);

View File

@ -3289,6 +3289,11 @@ std::optional<std::string> UI_key_event_operator_string(const bContext *C,
IDProperty *properties,
bool is_strict);
void WM_keymap_operator_statusbar_item(wmKeyMap *keymap,
const char *opname,
const char *name,
uiLayout *layout);
/* ui_interface_region_tooltip.c */
/**

View File

@ -985,6 +985,40 @@ static bool ui_key_event_property_match(const char *opname,
return match;
}
void WM_keymap_operator_statusbar_item(wmKeyMap *keymap,
const char *opname,
const char *name,
uiLayout *layout)
{
if (!keymap) {
return;
}
int icon_mod[4];
int icon = 0;
LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
if (kmi->flag & KMI_INACTIVE) {
continue;
}
if (STREQ(opname, kmi->idname)) {
icon = UI_icon_from_keymap_item(kmi, icon_mod);
if (icon) {
break;
}
}
}
if (icon) {
for (int j = 0; j < ARRAY_SIZE(icon_mod) && icon_mod[j]; j++) {
uiItemL(layout, "", icon_mod[j]);
}
uiItemL(layout, "", icon);
uiItemL(layout, name, ICON_NONE);
uiItemS_ex(layout, 0.7f);
}
}
std::optional<std::string> UI_key_event_operator_string(const bContext *C,
const char *opname,
IDProperty *properties,

View File

@ -6322,6 +6322,27 @@ void uiTemplateInputStatus(uiLayout *layout, bContext *C)
return;
}
bScreen *screen = CTX_wm_screen(C);
ARegion *region = screen->active_region;
ScrArea *area = nullptr;
if (region) {
ED_screen_areas_iter (win, screen, area_iter) {
LISTBASE_FOREACH (ARegion *, region_iter, &area_iter->regionbase) {
if (region == region_iter) {
area = area_iter;
break;
}
}
}
if (area && area->type->status_bar) {
uiLayout *row = uiLayoutRow(layout, true);
area->type->status_bar(C, win, area, region, row);
return;
}
}
/* Otherwise should cursor keymap status. */
for (int i = 0; i < 3; i++) {
uiLayout *box = uiLayoutRow(layout, false);

View File

@ -2104,6 +2104,55 @@ static void view3d_space_blend_write(BlendWriter *writer, SpaceLink *sl)
BKE_viewer_path_blend_write(writer, &v3d->viewer_path);
}
static void view3d_status_bar(
const bContext *C, wmWindow *win, ScrArea *area, ARegion *region, uiLayout *layout)
{
RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
Scene *scene = WM_window_get_active_scene(win);
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
View3D *v3d = static_cast<View3D *>(area->spacedata.first);
BKE_view_layer_synced_ensure(scene, view_layer);
Object *ob = BKE_view_layer_active_object_get(view_layer);
Object *obedit = OBEDIT_FROM_OBACT(ob);
eObjectMode object_mode = ob ? (eObjectMode)ob->mode : eObjectMode::OB_MODE_OBJECT;
wmKeyMap *view3d_km = WM_keymap_find_all(
CTX_wm_manager(C), "3D View", SPACE_VIEW3D, RGN_TYPE_WINDOW);
wmKeyMap *obnm_km = WM_keymap_find_all(
CTX_wm_manager(C), "Object Non-modal", SPACE_EMPTY, RGN_TYPE_WINDOW);
WM_keymap_operator_statusbar_item(view3d_km, "VIEW3D_OT_rotate", IFACE_("Rotate View"), layout);
WM_keymap_operator_statusbar_item(view3d_km, "VIEW3D_OT_move", IFACE_("Pan"), layout);
WM_keymap_operator_statusbar_item(view3d_km, "VIEW3D_OT_zoom", IFACE_("Zoom"), layout);
WM_keymap_operator_statusbar_item(view3d_km, "VIEW3D_OT_select", IFACE_("Select"), layout);
if (obedit) {
wmKeyMap *edmode_km = WM_keymap_find_all(
CTX_wm_manager(C), "Mesh", SPACE_EMPTY, RGN_TYPE_WINDOW);
WM_keymap_operator_statusbar_item(edmode_km, "MESH_OT_select_all", IFACE_("All"), layout);
WM_keymap_operator_statusbar_item(edmode_km, "TRANSFORM_OT_translate", IFACE_("Move"), layout);
WM_keymap_operator_statusbar_item(edmode_km, "TRANSFORM_OT_rotate", IFACE_("Rotate"), layout);
WM_keymap_operator_statusbar_item(edmode_km, "TRANSFORM_OT_resize", IFACE_("Scale"), layout);
WM_keymap_operator_statusbar_item(
edmode_km, "MESH_OT_duplicate_move", IFACE_("Duplicate"), layout);
WM_keymap_operator_statusbar_item(
obnm_km, "OBJECT_OT_mode_set", IFACE_("Object Mode"), layout);
}
else {
wmKeyMap *obmode_km = WM_keymap_find_all(
CTX_wm_manager(C), "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
WM_keymap_operator_statusbar_item(obmode_km, "OBJECT_OT_select_all", IFACE_("All"), layout);
WM_keymap_operator_statusbar_item(obmode_km, "TRANSFORM_OT_translate", IFACE_("Move"), layout);
WM_keymap_operator_statusbar_item(obmode_km, "TRANSFORM_OT_rotate", IFACE_("Rotate"), layout);
WM_keymap_operator_statusbar_item(obmode_km, "TRANSFORM_OT_resize", IFACE_("Scale"), layout);
WM_keymap_operator_statusbar_item(
obmode_km, "OBJECT_OT_duplicate_move", IFACE_("Duplicate"), layout);
WM_keymap_operator_statusbar_item(obmode_km, "OBJECT_OT_join", IFACE_("Join"), layout);
WM_keymap_operator_statusbar_item(obmode_km, "OBJECT_OT_delete", IFACE_("Delete"), layout);
WM_keymap_operator_statusbar_item(obnm_km, "OBJECT_OT_mode_set", IFACE_("Edit Mode"), layout);
}
}
void ED_spacetype_view3d()
{
using namespace blender::ed;
@ -2130,6 +2179,7 @@ void ED_spacetype_view3d()
st->blend_read_data = view3d_space_blend_read_data;
st->blend_read_after_liblink = nullptr;
st->blend_write = view3d_space_blend_write;
st->status_bar = view3d_status_bar;
/* regions: main window */
art = MEM_cnew<ARegionType>("spacetype view3d main region");

View File

@ -91,6 +91,7 @@ void WM_keymap_remove(wmKeyConfig *keyconfig, wmKeyMap *keymap);
bool WM_keymap_poll(bContext *C, wmKeyMap *keymap);
wmKeyMapItem *WM_keymap_item_find_id(wmKeyMap *keymap, int id);
wmKeyMapItem *WM_keymap_item_find_name(wmKeyMap *keymap, const char *name);
bool WM_keymap_item_compare(const wmKeyMapItem *k1, const wmKeyMapItem *k2);
/* `wm_keymap_utils.cc`. */
@ -193,6 +194,9 @@ std::optional<std::string> WM_key_event_operator_string(const bContext *C,
IDProperty *properties,
bool is_strict);
wmKeyMapItem *WM_key_event_operator_keymap(
const bContext *C, const char *opname, wmWindow *win, ScrArea *area, ARegion *region);
wmKeyMapItem *WM_key_event_operator_from_keymap(wmKeyMap *keymap,
const char *opname,
IDProperty *properties,