[Bf-blender-cvs] [aed82dafff8] blender2.8: Icons: support for drawing event icons

Campbell Barton noreply at git.blender.org
Sun Jul 8 22:19:20 CEST 2018


Commit: aed82dafff8f7f0f30a7b7c1c7180d13ec52b052
Author: Campbell Barton
Date:   Sun Jul 8 11:57:59 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBaed82dafff8f7f0f30a7b7c1c7180d13ec52b052

Icons: support for drawing event icons

Use for drawing modal operator header keys.

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

M	source/blender/editors/include/UI_icons.h
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/CMakeLists.txt
M	source/blender/editors/interface/interface_icons.c
A	source/blender/editors/interface/interface_icons_event.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 68318835a00..a63855439f4 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -1032,3 +1032,55 @@ DEF_VICO(COLORSET_17_VEC)
 DEF_VICO(COLORSET_18_VEC)
 DEF_VICO(COLORSET_19_VEC)
 DEF_VICO(COLORSET_20_VEC)
+
+/* Events  */
+DEF_ICON(EVENT_A)
+DEF_ICON(EVENT_B)
+DEF_ICON(EVENT_C)
+DEF_ICON(EVENT_D)
+DEF_ICON(EVENT_E)
+DEF_ICON(EVENT_F)
+DEF_ICON(EVENT_G)
+DEF_ICON(EVENT_H)
+DEF_ICON(EVENT_I)
+DEF_ICON(EVENT_J)
+DEF_ICON(EVENT_K)
+DEF_ICON(EVENT_L)
+DEF_ICON(EVENT_M)
+DEF_ICON(EVENT_N)
+DEF_ICON(EVENT_O)
+DEF_ICON(EVENT_P)
+DEF_ICON(EVENT_Q)
+DEF_ICON(EVENT_R)
+DEF_ICON(EVENT_S)
+DEF_ICON(EVENT_T)
+DEF_ICON(EVENT_U)
+DEF_ICON(EVENT_V)
+DEF_ICON(EVENT_W)
+DEF_ICON(EVENT_X)
+DEF_ICON(EVENT_Y)
+DEF_ICON(EVENT_Z)
+DEF_ICON(EVENT_SHIFT)
+DEF_ICON(EVENT_CTRL)
+DEF_ICON(EVENT_ALT)
+DEF_ICON(EVENT_OS)
+DEF_ICON(EVENT_F1)
+DEF_ICON(EVENT_F2)
+DEF_ICON(EVENT_F3)
+DEF_ICON(EVENT_F4)
+DEF_ICON(EVENT_F5)
+DEF_ICON(EVENT_F6)
+DEF_ICON(EVENT_F7)
+DEF_ICON(EVENT_F8)
+DEF_ICON(EVENT_F9)
+DEF_ICON(EVENT_F10)
+DEF_ICON(EVENT_F11)
+DEF_ICON(EVENT_F12)
+DEF_ICON(EVENT_ESC)
+DEF_ICON(EVENT_TAB)
+DEF_ICON(EVENT_PAGEUP)
+DEF_ICON(EVENT_PAGEDOWN)
+DEF_ICON(EVENT_HOME)
+DEF_ICON(EVENT_END)
+DEF_ICON(EVENT_RETURN)
+/* add as needed. */
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 8a758d01809..4114c209894 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -76,6 +76,7 @@ struct wmEvent;
 struct wmManipulator;
 struct wmMsgBus;
 struct wmKeyMap;
+struct wmKeyMapItem;
 
 typedef struct uiBut uiBut;
 typedef struct uiBlock uiBlock;
@@ -723,6 +724,9 @@ enum {
 int UI_icon_from_id(struct ID *id);
 int UI_icon_from_report_type(int type);
 
+int UI_icon_from_event_type(short event_type, short event_value);
+int UI_icon_from_keymap_item(const struct wmKeyMapItem *kmi, int r_icon_mod[4]);
+
 uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);
 uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);
 uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, const char *str, int x, int y, short width, short height, const char *tip);
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index ee18f956cac..cf172441be1 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -54,6 +54,7 @@ set(SRC
 	interface_eyedropper_driver.c
 	interface_handlers.c
 	interface_icons.c
+	interface_icons_event.c
 	interface_layout.c
 	interface_ops.c
 	interface_panel.c
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 92178e58a58..9c5a4392f78 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -108,6 +108,7 @@ typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha);
 #define ICON_TYPE_BUFFER         3
 #define ICON_TYPE_VECTOR         4
 #define ICON_TYPE_GEOM           5
+#define ICON_TYPE_EVENT          6  /* draw keymap entries using custom renderer. */
 
 typedef struct DrawInfo {
 	int type;
@@ -126,6 +127,14 @@ typedef struct DrawInfo {
 		struct {
 			int x, y, w, h;
 		} texture;
+		struct {
+			/* Can be packed into a single int. */
+			short event_type;
+			short event_value;
+			int icon;
+			/* Allow lookups. */
+			struct DrawInfo *next;
+		} input;
 	} data;
 } DrawInfo;
 
@@ -437,6 +446,143 @@ static void init_brush_icons(void)
 #undef INIT_BRUSH_ICON
 }
 
+static DrawInfo *g_di_event_list = NULL;
+
+int UI_icon_from_event_type(short event_type, short event_value)
+{
+	if (event_type == RIGHTSHIFTKEY) {
+		event_type = LEFTSHIFTKEY;
+	}
+	else if (event_type == RIGHTCTRLKEY) {
+		event_type = LEFTCTRLKEY;
+	}
+	else if (event_type == RIGHTALTKEY) {
+		event_type = LEFTALTKEY;
+	}
+	else if (event_type == EVT_TWEAK_L) {
+		event_type = LEFTMOUSE;
+		event_value = KM_CLICK_DRAG;
+	}
+	else if (event_type == EVT_TWEAK_M) {
+		event_type = MIDDLEMOUSE;
+		event_value = KM_CLICK_DRAG;
+	}
+	else if (event_type == EVT_TWEAK_R) {
+		event_type = RIGHTMOUSE;
+		event_value = KM_CLICK_DRAG;
+	}
+
+	DrawInfo *di = g_di_event_list;
+	do {
+		if (di->data.input.event_type == event_type) {
+			return di->data.input.icon;
+		}
+	} while ((di = di->data.input.next));
+
+	if (event_type == LEFTMOUSE) {
+		return ELEM(event_value, KM_CLICK, KM_PRESS) ? ICON_MOUSE_LMB : ICON_MOUSE_LMB_DRAG;
+	}
+	else if (event_type == MIDDLEMOUSE) {
+		return ELEM(event_value, KM_CLICK, KM_PRESS) ? ICON_MOUSE_MMB : ICON_MOUSE_MMB_DRAG;
+	}
+	else if (event_type == RIGHTMOUSE) {
+		return ELEM(event_value, KM_CLICK, KM_PRESS) ? ICON_MOUSE_RMB : ICON_MOUSE_RMB_DRAG;
+	}
+
+	return ICON_NONE;
+}
+
+int UI_icon_from_keymap_item(const wmKeyMapItem *kmi, int r_icon_mod[4])
+{
+	if (r_icon_mod) {
+		memset(r_icon_mod, 0x0, sizeof(int[4]));
+		int i = 0;
+		if (!ELEM(kmi->ctrl, KM_NOTHING, KM_ANY)) {
+			r_icon_mod[i++] = ICON_EVENT_CTRL;
+		}
+		if (!ELEM(kmi->alt, KM_NOTHING, KM_ANY)) {
+			r_icon_mod[i++] = ICON_EVENT_ALT;
+		}
+		if (!ELEM(kmi->shift, KM_NOTHING, KM_ANY)) {
+			r_icon_mod[i++] = ICON_EVENT_SHIFT;
+		}
+		if (!ELEM(kmi->oskey, KM_NOTHING, KM_ANY)) {
+			r_icon_mod[i++] = ICON_EVENT_OS;
+		}
+	}
+	return UI_icon_from_event_type(kmi->type, kmi->val);
+}
+
+static void init_event_icons(void)
+{
+	DrawInfo *di_next = NULL;
+
+#define INIT_EVENT_ICON(icon_id, type, value) \
+	{ \
+		DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT); \
+		di->data.input.event_type = type; \
+		di->data.input.event_value = value; \
+		di->data.input.icon = icon_id; \
+		di->data.input.next = di_next; \
+		di_next = di; \
+	}
+	/* end INIT_EVENT_ICON */
+
+	const int w = 16; /* DUMMY */
+
+	INIT_EVENT_ICON(ICON_EVENT_A, AKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_B, BKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_C, CKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_D, DKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_E, EKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F, FKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_G, GKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_H, HKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_I, IKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_J, JKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_K, KKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_L, LKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_M, MKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_N, NKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_O, OKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_P, PKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_Q, QKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_R, RKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_S, SKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_T, TKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_U, UKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_V, VKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_W, WKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_X, XKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_Y, YKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_Z, ZKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_SHIFT, LEFTSHIFTKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_CTRL, LEFTCTRLKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_ALT, LEFTALTKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_OS, OSKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F1,  F1KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F2,  F2KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F3,  F3KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F4,  F4KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F5,  F5KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F6,  F6KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F7,  F7KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F8,  F8KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F9,  F9KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F10, F10KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F11, F11KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_F12, F12KEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_ESC, ESCKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_TAB, TABKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_PAGEUP, PAGEUPKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_PAGEDOWN, PAGEDOWNKEY, KM_ANY);
+	INIT_EVENT_ICON(ICON_EVENT_RETURN, RETKEY, KM_ANY);
+
+	g_di_event_list = di_next;
+
+#undef INIT_EVENT_ICON
+}
+
 static void icon_verify_datatoc(IconImage *iimg)
 {
 	/* if it has own rect, things are all OK */
@@ -795,6 +941,7 @@ void UI_icons_init(int first_dyn_id)
 	init_iconfile_list(&iconfilelist);
 	init_internal_icons();
 	init_brush_icons();
+	init_event_icons();
 #endif
 }
 
@@ -1285,6 +1432,11 @@ static void icon_draw_size(
 		icon_draw_rect(x, y, w, h, aspect, w, h, ibuf->rect, alpha, rgb, desaturate);
 		GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
 	}
+	else if (di->type == ICON_TYPE_EVENT) {
+		const short event_type = di->data.input.event_type;
+		const short event_value = di->data.input.event_value;
+		icon_draw_rect_input(x, y, w, h, alpha, event_type, event_value);
+	}
 	else if (di->type == ICON_TYPE_TEXTURE) {
 		/* texture image use premul alpha for correct scaling */
 		GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
diff --git a/source/blender/editors/interface/interface_icons_event.c b/source/blender/editors/interface/interface_icons_event.c
new file mode 100644
index 00000000000..dc444b98b2c
--- /dev/null
+++ b/source/blender/editors/interface/interface_icons_event.c
@@ -0,0 +1,295 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FI

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list