[Bf-blender-cvs] [47da01a4db1] blender-v2.81-release: Fix T70211: Brush keybindings failed with non-brush tool active

Campbell Barton noreply at git.blender.org
Thu Nov 14 07:34:25 CET 2019


Commit: 47da01a4db1dcedcaaae1ba22626f340cb90a530
Author: Campbell Barton
Date:   Thu Nov 14 17:29:42 2019 +1100
Branches: blender-v2.81-release
https://developer.blender.org/rB47da01a4db1dcedcaaae1ba22626f340cb90a530

Fix T70211: Brush keybindings failed with non-brush tool active

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

M	source/blender/editors/sculpt_paint/paint_ops.c
M	source/blender/windowmanager/WM_toolsystem.h
M	source/blender/windowmanager/intern/wm_toolsystem.c

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

diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index 97455d479dc..396f4c6976b 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -24,6 +24,7 @@
 #include "BLI_listbase.h"
 #include "BLI_utildefines.h"
 #include "BLI_math_vector.h"
+#include "BLI_string.h"
 
 #include "DNA_customdata_types.h"
 #include "DNA_object_types.h"
@@ -42,6 +43,7 @@
 
 #include "WM_api.h"
 #include "WM_types.h"
+#include "WM_toolsystem.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -405,12 +407,13 @@ static Brush *brush_tool_toggle(Main *bmain, Paint *paint, Brush *brush_orig, co
   }
 }
 
-static int brush_generic_tool_set(Main *bmain,
-                                  Paint *paint,
-                                  const int tool,
-                                  const char *tool_name,
-                                  const bool create_missing,
-                                  const bool toggle)
+static bool brush_generic_tool_set(bContext *C,
+                                   Main *bmain,
+                                   Paint *paint,
+                                   const int tool,
+                                   const char *tool_name,
+                                   const bool create_missing,
+                                   const bool toggle)
 {
   Brush *brush, *brush_orig = BKE_paint_brush(paint);
 
@@ -433,10 +436,17 @@ static int brush_generic_tool_set(Main *bmain,
     BKE_paint_invalidate_overlay_all();
 
     WM_main_add_notifier(NC_BRUSH | NA_EDITED, brush);
-    return OPERATOR_FINISHED;
+
+    /* Tool System
+     * This is needed for when there is a non-sculpt tool active (transform for e.g.) */
+    char tool_id[MAX_NAME];
+    SNPRINTF(tool_id, "builtin_brush.%s", tool_name);
+    WM_toolsystem_ref_set_by_id(C, tool_id);
+
+    return true;
   }
   else {
-    return OPERATOR_CANCELLED;
+    return false;
   }
 }
 
@@ -475,7 +485,11 @@ static int brush_select_exec(bContext *C, wmOperator *op)
   Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
   const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
   RNA_enum_name_from_value(items, tool, &tool_name);
-  return brush_generic_tool_set(bmain, paint, tool, tool_name, create_missing, toggle);
+
+  if (brush_generic_tool_set(C, bmain, paint, tool, tool_name, create_missing, toggle)) {
+    return OPERATOR_FINISHED;
+  }
+  return OPERATOR_CANCELLED;
 }
 
 static void PAINT_OT_brush_select(wmOperatorType *ot)
diff --git a/source/blender/windowmanager/WM_toolsystem.h b/source/blender/windowmanager/WM_toolsystem.h
index 5afa0a88560..620150ba14f 100644
--- a/source/blender/windowmanager/WM_toolsystem.h
+++ b/source/blender/windowmanager/WM_toolsystem.h
@@ -54,11 +54,13 @@ struct bToolRef *WM_toolsystem_ref_find(struct WorkSpace *workspace, const bTool
 bool WM_toolsystem_ref_ensure(struct WorkSpace *workspace,
                               const bToolKey *tkey,
                               struct bToolRef **r_tref);
-struct bToolRef *WM_toolsystem_ref_set_by_id(struct bContext *C,
-                                             struct WorkSpace *workspace,
-                                             const bToolKey *tkey,
-                                             const char *name,
-                                             bool cycle);
+
+struct bToolRef *WM_toolsystem_ref_set_by_id_ex(struct bContext *C,
+                                                struct WorkSpace *workspace,
+                                                const bToolKey *tkey,
+                                                const char *name,
+                                                bool cycle);
+struct bToolRef *WM_toolsystem_ref_set_by_id(struct bContext *C, const char *name);
 
 struct bToolRef_Runtime *WM_toolsystem_runtime_from_context(struct bContext *C);
 struct bToolRef_Runtime *WM_toolsystem_runtime_find(struct WorkSpace *workspace,
diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c
index 11286a822a7..f64acf20581 100644
--- a/source/blender/windowmanager/intern/wm_toolsystem.c
+++ b/source/blender/windowmanager/intern/wm_toolsystem.c
@@ -633,7 +633,7 @@ static void toolsystem_refresh_screen_from_active_tool(Main *bmain,
   }
 }
 
-bToolRef *WM_toolsystem_ref_set_by_id(
+bToolRef *WM_toolsystem_ref_set_by_id_ex(
     bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *name, bool cycle)
 {
   wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
@@ -663,13 +663,25 @@ bToolRef *WM_toolsystem_ref_set_by_id(
   return (tref && STREQ(tref->idname, name)) ? tref : NULL;
 }
 
+bToolRef *WM_toolsystem_ref_set_by_id(bContext *C, const char *name)
+{
+  ViewLayer *view_layer = CTX_data_view_layer(C);
+  ScrArea *sa = CTX_wm_area(C);
+  bToolKey tkey;
+  if (WM_toolsystem_key_from_context(view_layer, sa, &tkey)) {
+    WorkSpace *workspace = CTX_wm_workspace(C);
+    return WM_toolsystem_ref_set_by_id_ex(C, workspace, &tkey, name, false);
+  }
+  return NULL;
+}
+
 static void toolsystem_reinit_with_toolref(bContext *C, WorkSpace *workspace, bToolRef *tref)
 {
   bToolKey tkey = {
       .space_type = tref->space_type,
       .mode = tref->mode,
   };
-  WM_toolsystem_ref_set_by_id(C, workspace, &tkey, tref->idname, false);
+  WM_toolsystem_ref_set_by_id_ex(C, workspace, &tkey, tref->idname, false);
 }
 
 static const char *toolsystem_default_tool(const bToolKey *tkey)



More information about the Bf-blender-cvs mailing list