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);
+}

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to