Fix T58683: Reload Scripts breaks toolbar button formatting
authorCampbell Barton <ideasman42@gmail.com>
Mon, 30 Sep 2019 15:59:31 +0000 (01:59 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 30 Sep 2019 15:59:31 +0000 (01:59 +1000)
Add a function which clears internal cached operator pointers,
run before reloading scripts.

source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/interface_query.c
source/blender/editors/space_script/script_edit.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_init_exit.c

index 5326888036e33e2ffb5c3019ec5ea65d98e2e5fe..f5721c008b2ce5c87c93652c858889980fb32e7e 100644 (file)
@@ -2454,6 +2454,8 @@ void UI_widgetbase_draw_cache_end(void);
 void UI_theme_init_default(void);
 void UI_style_init_default(void);
 
+void UI_interface_tag_script_reload(void);
+
 /* Special drawing for toolbar, mainly workarounds for inflexible icon sizing. */
 #define USE_UI_TOOLBAR_HACK
 
index 27a33a38b15ffd460e9a5cfb1f634229da985755..f05100e90655c1b182a824951a489c9956738ae5 100644 (file)
@@ -6689,3 +6689,8 @@ void UI_exit(void)
   ui_resources_free();
   ui_but_clipboard_free();
 }
+
+void UI_interface_tag_script_reload(void)
+{
+  ui_interface_tag_script_reload_queries();
+}
index 5c73b41b778edf4b6894cf3b4900171ce354d709..4351b75eb86185a8ef91e1fed9af397a6bb3d189 100644 (file)
@@ -993,4 +993,7 @@ void ui_rna_collection_search_cb(const struct bContext *C,
 /* interface_ops.c */
 bool ui_jump_to_target_button_poll(struct bContext *C);
 
+/* interface_queries.c */
+void ui_interface_tag_script_reload_queries(void);
+
 #endif /* __INTERFACE_INTERN_H__ */
index 457d01c5dc86cc6fd974a03ee1ab802cfe548d34..34b1070f8b465e1cd3ad5e15912606907588f85e 100644 (file)
@@ -137,15 +137,15 @@ bool ui_but_has_array_value(const uiBut *but)
                PROP_COORDS));
 }
 
+static wmOperatorType *g_ot_tool_set_by_id = NULL;
 bool UI_but_is_tool(const uiBut *but)
 {
   /* very evil! */
   if (but->optype != NULL) {
-    static wmOperatorType *ot = NULL;
-    if (ot == NULL) {
-      ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
+    if (g_ot_tool_set_by_id == NULL) {
+      g_ot_tool_set_by_id = WM_operatortype_find("WM_OT_tool_set_by_id", false);
     }
-    if (but->optype == ot) {
+    if (but->optype == g_ot_tool_set_by_id) {
       return true;
     }
   }
@@ -615,3 +615,14 @@ ARegion *ui_screen_region_find_mouse_over(bScreen *screen, const wmEvent *event)
 }
 
 /** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Manage Internal State
+ * \{ */
+
+void ui_interface_tag_script_reload_queries(void)
+{
+  g_ot_tool_set_by_id = NULL;
+}
+
+/** \} */
index 48248fe1dd2a6262c18a5c20fe70eb35089200c7..2be05785d2b9a9d838873ae3069666556900c7f2 100644 (file)
@@ -106,6 +106,7 @@ static bool script_test_modal_operators(bContext *C)
 
 static int script_reload_exec(bContext *C, wmOperator *op)
 {
+
 #ifdef WITH_PYTHON
 
   /* clear running operators */
@@ -114,6 +115,8 @@ static int script_reload_exec(bContext *C, wmOperator *op)
     return OPERATOR_CANCELLED;
   }
 
+  WM_script_tag_reload();
+
   /* TODO, this crashes on netrender and keying sets, need to look into why
    * disable for now unless running in debug mode */
   WM_cursor_wait(1);
index 568b904dcb7e4e256911cfe40db9d738e69d8383..2d9fa9e5ab66207d9afd8c5848eff97c7dd6a9aa 100644 (file)
@@ -102,6 +102,8 @@ void WM_init_opengl(struct Main *bmain);
 void WM_check(struct bContext *C);
 void WM_reinit_gizmomap_all(struct Main *bmain);
 
+void WM_script_tag_reload(void);
+
 uint *WM_window_pixels_read(struct wmWindowManager *wm, struct wmWindow *win, int r_size[2]);
 
 int WM_window_pixels_x(const struct wmWindow *win);
index 6a6861ae69707a3e3af4eff4c2e6144acb6e49e6..70d8315384011e13c762d2663df6a68d2646777d 100644 (file)
@@ -681,3 +681,12 @@ void WM_exit(bContext *C)
 
   exit(G.is_break == true);
 }
+
+/**
+ * Needed for cases when operators are re-registered
+ * (when operator type pointers are stored).
+ */
+void WM_script_tag_reload(void)
+{
+  UI_interface_tag_script_reload();
+}