[Bf-blender-cvs] [af0fc660499] blender2.8: WM: register global list of panel types

Campbell Barton noreply at git.blender.org
Fri Jul 13 19:17:24 CEST 2018


Commit: af0fc660499a63b367dcc63222d0baee93aa665c
Author: Campbell Barton
Date:   Fri Jul 13 18:39:46 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBaf0fc660499a63b367dcc63222d0baee93aa665c

WM: register global list of panel types

Allows simple lookups for popovers.

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

M	source/blender/makesrna/intern/rna_ui.c
M	source/blender/windowmanager/CMakeLists.txt
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_init_exit.c
A	source/blender/windowmanager/intern/wm_panel_type.c

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

diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index 7bec598351e..a271df464b7 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -205,6 +205,8 @@ static void rna_Panel_unregister(Main *UNUSED(bmain), StructRNA *type)
 	BLI_freelistN(&pt->children);
 	BLI_freelinkN(&art->paneltypes, pt);
 
+	WM_paneltype_remove(pt);
+
 	/* update while blender is running */
 	WM_main_add_notifier(NC_WINDOW, NULL);
 }
@@ -313,6 +315,8 @@ static StructRNA *rna_Panel_register(
 		}
 	}
 
+	WM_paneltype_add(pt);
+
 	/* update while blender is running */
 	WM_main_add_notifier(NC_WINDOW, NULL);
 
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index eb01332fc26..67674dae4f3 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -71,6 +71,7 @@ set(SRC
 	intern/wm_operator_props.c
 	intern/wm_operator_type.c
 	intern/wm_operators.c
+	intern/wm_panel_type.c
 	intern/wm_playanim.c
 	intern/wm_stereo.c
 	intern/wm_subwindow.c
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 68cbc3828fc..32900b75514 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -441,6 +441,13 @@ void                WM_menutype_freelink(struct MenuType *mt);
 void                WM_menutype_free(void);
 bool                WM_menutype_poll(struct bContext *C, struct MenuType *mt);
 
+/* wm_panel_type.c */
+void                WM_paneltype_init(void);
+void                WM_paneltype_clear(void);
+struct PanelType   *WM_paneltype_find(const char *idname, bool quiet);
+bool                WM_paneltype_add(struct PanelType *mt);
+void                WM_paneltype_remove(struct PanelType *mt);
+
 /* wm_gesture_ops.c */
 int			WM_gesture_border_invoke	(struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
 int			WM_gesture_border_modal	(struct bContext *C, struct wmOperator *op, const struct wmEvent *event);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 6c374f3d8d4..463508674d5 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -209,6 +209,7 @@ void WM_init(bContext *C, int argc, const char **argv)
 	wm_operatortype_init();
 	wm_operatortypes_register();
 
+	WM_paneltype_init();  /* Lookup table only. */
 	WM_menutype_init();
 	WM_uilisttype_init();
 	wm_manipulatortype_init();
@@ -453,6 +454,7 @@ void WM_exit_ext(bContext *C, const bool do_python)
 		}
 	}
 
+	WM_paneltype_clear();
 	BKE_addon_pref_type_free();
 	wm_operatortype_free();
 	wm_dropbox_free();
diff --git a/source/blender/windowmanager/intern/wm_panel_type.c b/source/blender/windowmanager/intern/wm_panel_type.c
new file mode 100644
index 00000000000..ef1a55281c9
--- /dev/null
+++ b/source/blender/windowmanager/intern/wm_panel_type.c
@@ -0,0 +1,86 @@
+/*
+ * ***** 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 FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/windowmanager/intern/wm_panel_type.c
+ *  \ingroup wm
+ *
+ * Panel Registry.
+ *
+ * \note Unlike menu, and other registries, this doesn't *own* the PanelType.
+ *
+ * For popups/popovers only, regions handle panel types by including them in local lists.
+ */
+
+#include "BLI_sys_types.h"
+
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
+#include "BKE_screen.h"
+
+#include "WM_api.h"
+
+static GHash *g_paneltypes_hash = NULL;
+
+PanelType *WM_paneltype_find(const char *idname, bool quiet)
+{
+	PanelType *pt;
+
+	if (idname[0]) {
+		pt = BLI_ghash_lookup(g_paneltypes_hash, idname);
+		if (pt)
+			return pt;
+	}
+
+	if (!quiet)
+		printf("search for unknown paneltype %s\n", idname);
+
+	return NULL;
+}
+
+bool WM_paneltype_add(PanelType *pt)
+{
+	BLI_ghash_insert(g_paneltypes_hash, pt->idname, pt);
+	return true;
+}
+
+void WM_paneltype_remove(PanelType *pt)
+{
+	bool ok;
+
+	ok = BLI_ghash_remove(g_paneltypes_hash, pt->idname, NULL, NULL);
+
+	BLI_assert(ok);
+	(void)ok;
+}
+
+/* called on initialize WM_init() */
+void WM_paneltype_init(void)
+{
+	/* reserve size is set based on blender default setup */
+	g_paneltypes_hash = BLI_ghash_str_new_ex("g_paneltypes_hash gh", 512);
+}
+
+void WM_paneltype_clear(void)
+{
+	BLI_ghash_free(g_paneltypes_hash, NULL, NULL);
+}



More information about the Bf-blender-cvs mailing list