WM: refresh tool on object mode switch
authorCampbell Barton <ideasman42@gmail.com>
Tue, 8 May 2018 05:25:36 +0000 (07:25 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 8 May 2018 05:27:53 +0000 (07:27 +0200)
The tool manipulator could become disabled when set in the wrong mode.

source/blender/editors/mesh/editmesh_extrude.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_toolsystem.c

index 0e1f2f882bdd560cf27c699e9f1856e2ed7b130f..c8b2850cbad8eb69eaec6d180049c362af761822 100644 (file)
@@ -448,7 +448,8 @@ static void manipulator_mesh_extrude_refresh(const bContext *C, wmManipulatorGro
        if (!ED_transform_calc_manipulator_stats(
                    C, &(struct TransformCalcParams){
                        .orientation_type = orientation_type + 1,
-                   }, &tbounds)) {
+                   }, &tbounds))
+       {
                return;
        }
 
index ff5eb46a38ef42372ee544c7957a6f63c9996ac4..cd51474accf5f13072147d057011b869be291b09 100644 (file)
@@ -1018,7 +1018,7 @@ static void view3d_main_region_listener(
 
 static void view3d_main_region_message_subscribe(
         const struct bContext *UNUSED(C),
-        struct WorkSpace *UNUSED(workspace), struct Scene *scene,
+        struct WorkSpace *workspace, struct Scene *scene,
         struct bScreen *UNUSED(screen), struct ScrArea *UNUSED(sa), struct ARegion *ar,
         struct wmMsgBus *mbus)
 {
@@ -1092,6 +1092,17 @@ static void view3d_main_region_message_subscribe(
                WM_msg_subscribe_rna_anon_type(mbus, ViewLayerEngineSettingsClay, &msg_sub_value_region_tag_redraw);
        }
 #endif
+
+       if (workspace->tool.spacetype == SPACE_VIEW3D) {
+               wmMsgSubscribeValue msg_sub_value_region_tag_refresh = {
+                       .owner = ar,
+                       .user_data = ar,
+                       .notify = WM_toolsystem_do_msg_notify_tag_refresh,
+               };
+               WM_msg_subscribe_rna_anon_prop(
+                       mbus, Object, mode,
+                       &msg_sub_value_region_tag_refresh);
+       }
 }
 
 /* concept is to retrieve cursor type context-less */
index 31c30388560aa8cb76b7073697c5e492c62d2286..9176385c40d1e6e2408123f9c123bcfafef71b52 100644 (file)
@@ -53,6 +53,8 @@ struct wmEvent;
 struct wmEventHandler;
 struct wmGesture;
 struct wmJob;
+struct wmMsgSubscribeKey;
+struct wmMsgSubscribeValue;
 struct wmOperatorType;
 struct wmOperator;
 struct rcti;
@@ -595,12 +597,16 @@ bool        WM_event_is_ime_switch(const struct wmEvent *event);
 /* wm_toolsystem.c  */
 void WM_toolsystem_unlink(struct bContext *C, struct WorkSpace *workspace);
 void WM_toolsystem_link(struct bContext *C, struct WorkSpace *workspace);
+void WM_toolsystem_refresh(struct bContext *C, struct WorkSpace *workspace);
 
 void WM_toolsystem_set(struct bContext *C, const struct bToolDef *tool);
 void WM_toolsystem_init(struct bContext *C);
 
 bool WM_toolsystem_active_tool_is_brush(const struct bContext *C);
 
+void WM_toolsystem_do_msg_notify_tag_refresh(
+        struct bContext *C, struct wmMsgSubscribeKey *msg_key, struct wmMsgSubscribeValue *msg_val);
+
 /* wm_tooltip.c */
 typedef struct ARegion *(*wmTooltipInitFn)(struct bContext *, struct ARegion *, bool *);
 
index e449695e3cf8dd72f4d2e37b394da866a6795628..04542717b246c2951b22c22776d9b3578065d434 100644 (file)
@@ -114,6 +114,11 @@ void WM_toolsystem_link(bContext *C, WorkSpace *workspace)
        }
 }
 
+void WM_toolsystem_refresh(bContext *C, WorkSpace *workspace)
+{
+       WM_toolsystem_link(C, workspace);
+}
+
 void WM_toolsystem_set(bContext *C, const bToolDef *tool)
 {
        WorkSpace *workspace = CTX_wm_workspace(C);
@@ -159,3 +164,11 @@ bool WM_toolsystem_active_tool_is_brush(const bContext *C)
        /* Will need to become more comprehensive, for now check tool data-block. */
        return workspace->tool.data_block[0] != '\0';
 }
+
+/* Follow wmMsgNotifyFn spec */
+void WM_toolsystem_do_msg_notify_tag_refresh(
+        bContext *C, wmMsgSubscribeKey *UNUSED(msg_key), wmMsgSubscribeValue *msg_val)
+{
+       WorkSpace *workspace = CTX_wm_workspace(C);
+       WM_toolsystem_refresh(C, workspace);
+}