[Bf-blender-cvs] [397d088611b] blender2.8: UI: show modal operator keymaps in the status bar

Campbell Barton noreply at git.blender.org
Thu Jul 5 12:27:24 CEST 2018


Commit: 397d088611b857e536bea08003eeba1b50678ec2
Author: Campbell Barton
Date:   Thu Jul 5 12:09:17 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB397d088611b857e536bea08003eeba1b50678ec2

UI: show modal operator keymaps in the status bar

This is work in progress, transform keymap especially
needs some filtering on it's keymap.

===================================================================

M	source/blender/editors/interface/interface_templates.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_event_system.c

===================================================================

diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index a14d12492ec..1c3ed3e3c75 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -4330,6 +4330,10 @@ void uiTemplateInputStatus(uiLayout *layout, struct bContext *C)
 		return;
 	}
 
+	if (WM_window_modal_keymap_status_draw(C, win, layout)) {
+		return;
+	}
+
 	/* Otherwise should cursor keymap status. */
 	for (int i = 0; i < 3; i++) {
 		uiLayout *box = uiLayoutRow(layout, false);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index e203a872d24..1f5e3aa2461 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -608,6 +608,11 @@ bool        WM_event_is_ime_switch(const struct wmEvent *event);
 const char *WM_window_cursor_keymap_status_get(const struct wmWindow *win, int button_index, int type_index);
 void WM_window_cursor_keymap_status_refresh(struct bContext *C, struct wmWindow *win);
 
+struct ScrArea *WM_window_find_area_status(struct wmWindow *win, struct bScreen *sc);
+bool WM_window_modal_keymap_status_draw(
+        struct bContext *C, struct wmWindow *win,
+        struct uiLayout *layout);
+
 /* wm_tooltip.c */
 typedef struct ARegion *(*wmTooltipInitFn)(struct bContext *, struct ARegion *, bool *);
 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 91b924c1565..204bd62cfbe 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1960,6 +1960,15 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
 
 				if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) {
 					wm_operator_reports(C, op, retval, false);
+
+					if (op->type->modalkeymap) {
+						wmWindow *win = CTX_wm_window(C);
+						bScreen *sc = WM_window_get_active_screen(win);
+						ScrArea *sa = WM_window_find_area_status(win, sc);
+						if (sa != NULL) {
+							ED_area_tag_redraw(sa);
+						}
+					}
 				}
 				else {
 					/* not very common, but modal operators may report before finishing */
@@ -3191,6 +3200,14 @@ wmEventHandler *WM_event_add_modal_handler(bContext *C, wmOperator *op)
 
 	BLI_addhead(&win->modalhandlers, handler);
 
+	if (op->type->modalkeymap) {
+		bScreen *sc = WM_window_get_active_screen(win);
+		ScrArea *sa = WM_window_find_area_status(win, sc);
+		if (sa != NULL) {
+			ED_area_tag_redraw(sa);
+		}
+	}
+
 	return handler;
 }
 
@@ -4321,11 +4338,14 @@ const char *WM_window_cursor_keymap_status_get(const wmWindow *win, int button_i
 	return NULL;
 }
 
-void WM_window_cursor_keymap_status_refresh(bContext *C, struct wmWindow *win)
+/**
+ * Similar to #BKE_screen_area_map_find_area_xy and related functions,
+ * use here since the ara is stored in the window manager.
+ */
+ScrArea *WM_window_find_area_status(wmWindow *win, bScreen *screen)
 {
-	bScreen *screen = WM_window_get_active_screen(win);
 	if (screen->state == SCREENFULL) {
-		return;
+		return NULL;
 	}
 	ScrArea *sa_statusbar = NULL;
 	for (ScrArea *sa = win->global_areas.areabase.first; sa; sa = sa->next) {
@@ -4334,6 +4354,13 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, struct wmWindow *win)
 			break;
 		}
 	}
+	return sa_statusbar;
+}
+
+void WM_window_cursor_keymap_status_refresh(bContext *C, wmWindow *win)
+{
+	bScreen *screen = WM_window_get_active_screen(win);
+	ScrArea *sa_statusbar = WM_window_find_area_status(win, screen);
 	if (sa_statusbar == NULL) {
 		return;
 	}
@@ -4476,3 +4503,50 @@ void WM_window_cursor_keymap_status_refresh(bContext *C, struct wmWindow *win)
 }
 
 /** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Modal Keymap Status
+ *
+ * \{ */
+
+bool WM_window_modal_keymap_status_draw(
+        bContext *UNUSED(C), wmWindow *win,
+        uiLayout *layout)
+{
+	wmKeyMap *keymap = NULL;
+	wmOperatorType *ot = NULL;
+	for (wmEventHandler *handler = win->modalhandlers.first; handler; handler = handler->next) {
+		if (handler->op) {
+			/* 'handler->keymap' could be checked too, seems not to be used. */
+			wmKeyMap *keymap_test = handler->op->type->modalkeymap;
+			if (keymap_test && keymap_test->modal_items) {
+				keymap = keymap_test;
+				ot = handler->op->type;
+				break;
+			}
+		}
+	}
+	if (keymap == NULL) {
+		return false;
+	}
+	const EnumPropertyItem *items = keymap->modal_items;
+
+	uiLayout *row = uiLayoutRow(layout, true);
+	for (int i = 0; items[i].identifier; i++) {
+		if (!items[i].identifier[0]) {
+			continue;
+		}
+		char buf[UI_MAX_DRAW_STR];
+		int available_len = sizeof(buf);
+		char *p = buf;
+		WM_modalkeymap_operator_items_to_string_buf(ot, items[i].value, true, UI_MAX_SHORTCUT_STR, &available_len, &p);
+		p -= 1;
+		if (p > buf) {
+			BLI_snprintf(p, available_len, ": %s", items[i].name);
+			uiItemL(row, buf, 0);
+		}
+	}
+	return true;
+}
+
+/** \} */



More information about the Bf-blender-cvs mailing list