Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-07-13 19:39:46 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-07-13 20:15:13 +0300
commitaf0fc660499a63b367dcc63222d0baee93aa665c (patch)
tree823952ab0763af43b962d4f249b8c37c3ab8ef93 /source
parent6845306c68a874cb1a9171d6a08a1578eea41a8a (diff)
WM: register global list of panel types
Allows simple lookups for popovers.
Diffstat (limited to 'source')
-rw-r--r--source/blender/makesrna/intern/rna_ui.c4
-rw-r--r--source/blender/windowmanager/CMakeLists.txt1
-rw-r--r--source/blender/windowmanager/WM_api.h7
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c2
-rw-r--r--source/blender/windowmanager/intern/wm_panel_type.c86
5 files changed, 100 insertions, 0 deletions
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);
+}