diff options
-rw-r--r-- | source/blender/blenkernel/BKE_workspace.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/workspace.c | 25 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_defaults.c | 10 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_toolsystem.c | 51 |
4 files changed, 75 insertions, 14 deletions
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h index 4f4ae9f375b..6902fb631e4 100644 --- a/source/blender/blenkernel/BKE_workspace.h +++ b/source/blender/blenkernel/BKE_workspace.h @@ -28,6 +28,7 @@ #include "BLI_compiler_attrs.h" struct bScreen; +struct bToolRef; struct Main; struct Scene; struct TransformOrientation; @@ -70,6 +71,8 @@ struct WorkSpaceLayout *BKE_workspace_layout_iter_circular( bool (*callback)(const struct WorkSpaceLayout *layout, void *arg), void *arg, const bool iter_backward); +void BKE_workspace_tool_remove( + struct WorkSpace *workspace, struct bToolRef *tref) ATTR_NONNULL(1, 2); /* -------------------------------------------------------------------- */ /* Getters/Setters */ diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c index 2829708391f..0b1f9d8bd24 100644 --- a/source/blender/blenkernel/intern/workspace.c +++ b/source/blender/blenkernel/intern/workspace.c @@ -161,17 +161,9 @@ void BKE_workspace_free(WorkSpace *workspace) BLI_freelistN(&workspace->owner_ids); BLI_freelistN(&workspace->layouts); - for (bToolRef *tref = workspace->tools.first, *tref_next; tref; tref = tref_next) { - tref_next = tref->next; - if (tref->runtime) { - MEM_freeN(tref->runtime); - } - if (tref->properties) { - IDP_FreeProperty(tref->properties); - MEM_freeN(tref->properties); - } + while (!BLI_listbase_is_empty(&workspace->tools)) { + BKE_workspace_tool_remove(workspace, workspace->tools.first); } - BLI_freelistN(&workspace->tools); if (workspace->status_text) { MEM_freeN(workspace->status_text); @@ -352,6 +344,19 @@ WorkSpaceLayout *BKE_workspace_layout_iter_circular( return NULL; } +void BKE_workspace_tool_remove( + struct WorkSpace *workspace, struct bToolRef *tref) +{ + if (tref->runtime) { + MEM_freeN(tref->runtime); + } + if (tref->properties) { + IDP_FreeProperty(tref->properties); + MEM_freeN(tref->properties); + } + BLI_remlink(&workspace->tools, tref); + MEM_freeN(tref); +} /* -------------------------------------------------------------------- */ /* Getters/Setters */ diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c index 8972e7ef56f..a741d0ecc1f 100644 --- a/source/blender/blenloader/intern/versioning_defaults.c +++ b/source/blender/blenloader/intern/versioning_defaults.c @@ -45,6 +45,7 @@ #include "BKE_main.h" #include "BKE_node.h" #include "BKE_screen.h" +#include "BKE_workspace.h" #include "BLO_readfile.h" @@ -94,6 +95,15 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template) } } + if (app_template == NULL) { + /* Clear all tools to use default options instead, ignore the tool saved in the file. */ + for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) { + while (!BLI_listbase_is_empty(&workspace->tools)) { + BKE_workspace_tool_remove(workspace, workspace->tools.first); + } + } + } + /* For 2D animation template. */ if (app_template && STREQ(app_template, "2D_Animation")) { for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) { diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c index 15b29902eb1..3b93c7aee5b 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.c +++ b/source/blender/windowmanager/intern/wm_toolsystem.c @@ -58,7 +58,7 @@ static void toolsystem_reinit_with_toolref( bContext *C, WorkSpace *UNUSED(workspace), bToolRef *tref); -static void toolsystem_reinit_ensure_toolref( +static bToolRef *toolsystem_reinit_ensure_toolref( bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *default_tool); static void toolsystem_refresh_screen_from_active_tool( Main *bmain, WorkSpace *workspace, bToolRef *tref); @@ -364,6 +364,11 @@ void WM_toolsystem_init(bContext *C) tref->tag = 1; } } + else { + /* Without this we may load a file without a default tool. */ + tref = toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL); + tref->tag = 1; + } } CTX_wm_window_set(C, NULL); } @@ -526,18 +531,56 @@ static void toolsystem_reinit_with_toolref( WM_toolsystem_ref_set_by_name(C, workspace, &tkey, tref->idname, false); } +static const char *toolsystem_default_tool(const bToolKey *tkey) +{ + switch (tkey->space_type) { + case SPACE_VIEW3D: + switch (tkey->mode) { + /* XXX(campbell): hard coded paint-brush names. + * Eventyally we plan to move away from using brush names as tools, + * in favor of having tool types in the toolbar, which can each select their own brush. + * so keep this as a temporary hack. + */ + case CTX_MODE_SCULPT: + return "SculptDraw"; + case CTX_MODE_PAINT_VERTEX: + case CTX_MODE_PAINT_WEIGHT: + case CTX_MODE_GPENCIL_WEIGHT: + return "Draw"; + case CTX_MODE_PAINT_TEXTURE: + return "TexDraw"; + case CTX_MODE_GPENCIL_PAINT: + return "Draw Pencil"; + case CTX_MODE_GPENCIL_SCULPT: + return "Push"; + /* end temporary hack. */ + + case CTX_MODE_PARTICLE: + return "Comb"; + default: + return "Select Border"; + } + break; + } + + return "Cursor"; +} + /** * Run after changing modes. */ -static void toolsystem_reinit_ensure_toolref( +static bToolRef *toolsystem_reinit_ensure_toolref( bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *default_tool) { bToolRef *tref; if (WM_toolsystem_ref_ensure(workspace, tkey, &tref)) { + if (default_tool == NULL) { + default_tool = toolsystem_default_tool(tkey); + } STRNCPY(tref->idname, default_tool); } - toolsystem_reinit_with_toolref(C, workspace, tref); + return tref; } void WM_toolsystem_update_from_context_view3d(bContext *C) @@ -549,7 +592,7 @@ void WM_toolsystem_update_from_context_view3d(bContext *C) .space_type = space_type, .mode = WM_toolsystem_mode_from_spacetype(view_layer, NULL, space_type), }; - toolsystem_reinit_ensure_toolref(C, workspace, &tkey, "Cursor"); + toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL); } /** |