UI Experiment: Status Bar Keymap Display While Idle #120386
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
||||
/**
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue