Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/windowmanager/intern/wm_toolsystem.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/windowmanager/intern/wm_toolsystem.c')
-rw-r--r--source/blender/windowmanager/intern/wm_toolsystem.c1433
1 files changed, 709 insertions, 724 deletions
diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c
index 806bd028295..a867a17f529 100644
--- a/source/blender/windowmanager/intern/wm_toolsystem.c
+++ b/source/blender/windowmanager/intern/wm_toolsystem.c
@@ -51,14 +51,18 @@
#include "WM_api.h"
#include "WM_types.h"
#include "WM_message.h"
-#include "WM_toolsystem.h" /* own include */
-
-static void toolsystem_reinit_with_toolref(
- bContext *C, WorkSpace *UNUSED(workspace), bToolRef *tref);
-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);
+#include "WM_toolsystem.h" /* own include */
+
+static void toolsystem_reinit_with_toolref(bContext *C,
+ WorkSpace *UNUSED(workspace),
+ bToolRef *tref);
+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);
/* -------------------------------------------------------------------- */
/** \name Tool Reference API
@@ -66,116 +70,111 @@ static void toolsystem_refresh_screen_from_active_tool(
struct bToolRef *WM_toolsystem_ref_from_context(struct bContext *C)
{
- WorkSpace *workspace = CTX_wm_workspace(C);
- ViewLayer *view_layer = CTX_data_view_layer(C);
- ScrArea *sa = CTX_wm_area(C);
- if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
- return NULL;
- }
- const bToolKey tkey = {
- .space_type = sa->spacetype,
- .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
- };
- bToolRef *tref = WM_toolsystem_ref_find(workspace, &tkey);
- /* We could return 'sa->runtime.tool' in this case. */
- if (sa->runtime.is_tool_set) {
- BLI_assert(tref == sa->runtime.tool);
- }
- return tref;
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ ScrArea *sa = CTX_wm_area(C);
+ if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
+ return NULL;
+ }
+ const bToolKey tkey = {
+ .space_type = sa->spacetype,
+ .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
+ };
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, &tkey);
+ /* We could return 'sa->runtime.tool' in this case. */
+ if (sa->runtime.is_tool_set) {
+ BLI_assert(tref == sa->runtime.tool);
+ }
+ return tref;
}
struct bToolRef_Runtime *WM_toolsystem_runtime_from_context(struct bContext *C)
{
- bToolRef *tref = WM_toolsystem_ref_from_context(C);
- return tref ? tref->runtime : NULL;
+ bToolRef *tref = WM_toolsystem_ref_from_context(C);
+ return tref ? tref->runtime : NULL;
}
bToolRef *WM_toolsystem_ref_find(WorkSpace *workspace, const bToolKey *tkey)
{
- BLI_assert((1 << tkey->space_type) & WM_TOOLSYSTEM_SPACE_MASK);
- LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
- if ((tref->space_type == tkey->space_type) &&
- (tref->mode == tkey->mode))
- {
- return tref;
- }
- }
- return NULL;
+ BLI_assert((1 << tkey->space_type) & WM_TOOLSYSTEM_SPACE_MASK);
+ LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
+ if ((tref->space_type == tkey->space_type) && (tref->mode == tkey->mode)) {
+ return tref;
+ }
+ }
+ return NULL;
}
bToolRef_Runtime *WM_toolsystem_runtime_find(WorkSpace *workspace, const bToolKey *tkey)
{
- bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
- return tref ? tref->runtime : NULL;
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
+ return tref ? tref->runtime : NULL;
}
-bool WM_toolsystem_ref_ensure(
- struct WorkSpace *workspace, const bToolKey *tkey,
- bToolRef **r_tref)
+bool WM_toolsystem_ref_ensure(struct WorkSpace *workspace, const bToolKey *tkey, bToolRef **r_tref)
{
- bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
- if (tref) {
- *r_tref = tref;
- return false;
- }
- tref = MEM_callocN(sizeof(*tref), __func__);
- BLI_addhead(&workspace->tools, tref);
- tref->space_type = tkey->space_type;
- tref->mode = tkey->mode;
- *r_tref = tref;
- return true;
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
+ if (tref) {
+ *r_tref = tref;
+ return false;
+ }
+ tref = MEM_callocN(sizeof(*tref), __func__);
+ BLI_addhead(&workspace->tools, tref);
+ tref->space_type = tkey->space_type;
+ tref->mode = tkey->mode;
+ *r_tref = tref;
+ return true;
}
/** \} */
-
static void toolsystem_unlink_ref(bContext *C, WorkSpace *workspace, bToolRef *tref)
{
- bToolRef_Runtime *tref_rt = tref->runtime;
+ bToolRef_Runtime *tref_rt = tref->runtime;
- if (tref_rt->gizmo_group[0]) {
- wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(tref_rt->gizmo_group, false);
- if (gzgt != NULL) {
- bool found = false;
+ if (tref_rt->gizmo_group[0]) {
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(tref_rt->gizmo_group, false);
+ if (gzgt != NULL) {
+ bool found = false;
- /* TODO(campbell) */
- Main *bmain = CTX_data_main(C);
+ /* TODO(campbell) */
+ Main *bmain = CTX_data_main(C);
#if 0
- wmWindowManager *wm = bmain->wm.first;
- /* Check another workspace isn't using this tool. */
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- const WorkSpace *workspace_iter = WM_window_get_active_workspace(win);
- if (workspace != workspace_iter) {
- if (STREQ(workspace->tool.gizmo_group, workspace_iter->tool.gizmo_group)) {
- found = true;
- break;
- }
- }
- }
+ wmWindowManager *wm = bmain->wm.first;
+ /* Check another workspace isn't using this tool. */
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ const WorkSpace *workspace_iter = WM_window_get_active_workspace(win);
+ if (workspace != workspace_iter) {
+ if (STREQ(workspace->tool.gizmo_group, workspace_iter->tool.gizmo_group)) {
+ found = true;
+ break;
+ }
+ }
+ }
#else
- UNUSED_VARS(workspace);
+ UNUSED_VARS(workspace);
#endif
- if (!found) {
- wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
- WM_gizmomaptype_group_unlink(C, bmain, gzmap_type, gzgt);
- }
- }
- }
+ if (!found) {
+ wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(&gzgt->gzmap_params);
+ WM_gizmomaptype_group_unlink(C, bmain, gzmap_type, gzgt);
+ }
+ }
+ }
}
void WM_toolsystem_unlink(bContext *C, WorkSpace *workspace, const bToolKey *tkey)
{
- bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
- if (tref && tref->runtime) {
- toolsystem_unlink_ref(C, workspace, tref);
- }
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
+ if (tref && tref->runtime) {
+ toolsystem_unlink_ref(C, workspace, tref);
+ }
}
static void toolsystem_ref_link__refresh_image_uv_sculpt(bContext *C, Scene *scene)
{
- PointerRNA ptr;
- RNA_pointer_create(&scene->id, &RNA_ToolSettings, scene->toolsettings, &ptr);
- PropertyRNA *prop = RNA_struct_find_property(&ptr, "use_uv_sculpt");
- RNA_property_update(C, &ptr, prop);
+ PointerRNA ptr;
+ RNA_pointer_create(&scene->id, &RNA_ToolSettings, scene->toolsettings, &ptr);
+ PropertyRNA *prop = RNA_struct_find_property(&ptr, "use_uv_sculpt");
+ RNA_property_update(C, &ptr, prop);
}
/**
@@ -183,261 +182,252 @@ static void toolsystem_ref_link__refresh_image_uv_sculpt(bContext *C, Scene *sce
*/
static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tref)
{
- bToolRef_Runtime *tref_rt = tref->runtime;
- if (tref_rt->gizmo_group[0]) {
- const char *idname = tref_rt->gizmo_group;
- wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
- if (gzgt != NULL) {
- if ((gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_INIT) == 0) {
- WM_gizmo_group_type_ensure_ptr(gzgt);
- }
- }
- else {
- CLOG_WARN(WM_LOG_TOOLS, "'%s' widget not found", idname);
- }
- }
-
- if (tref_rt->data_block[0]) {
- Main *bmain = CTX_data_main(C);
-
- if ((tref->space_type == SPACE_VIEW3D) &&
- (tref->mode == CTX_MODE_SCULPT_GPENCIL))
- {
- const EnumPropertyItem *items = rna_enum_gpencil_sculpt_brush_items;
- const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
- if (i != -1) {
- const int value = items[i].value;
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- ts->gp_sculpt.brushtype = value;
- }
- }
- }
- }
- else if ((tref->space_type == SPACE_VIEW3D) &&
- (tref->mode == CTX_MODE_WEIGHT_GPENCIL))
- {
- const EnumPropertyItem *items = rna_enum_gpencil_weight_brush_items;
- const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
- if (i != -1) {
- const int value = items[i].value;
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- ts->gp_sculpt.weighttype = value;
- }
- }
- }
- }
- else if ((tref->space_type == SPACE_VIEW3D) &&
- (tref->mode == CTX_MODE_PARTICLE))
- {
- const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items;
- const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
- if (i != -1) {
- const int value = items[i].value;
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- ts->particle.brushtype = value;
- }
- }
- }
- }
- else if ((tref->space_type == SPACE_IMAGE) &&
- (tref->mode == SI_MODE_UV))
- {
- /* Note that switching uv-sculpt boolean is a hack at the moment.
- * It would be best to make this either an operator or a higher level mode (like mesh-object sculpt mode). */
- const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items;
- const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
- if (i != -1) {
- const int value = items[i].value;
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- ts->uv_sculpt_tool = value;
-
- if (ts->use_uv_sculpt == false) {
- ts->use_uv_sculpt = true;
- toolsystem_ref_link__refresh_image_uv_sculpt(C, scene);
- }
- }
- }
- }
- }
- else {
- const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
- BLI_assert(paint_mode != PAINT_MODE_INVALID);
- const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
- BLI_assert(items != NULL);
-
- const int i = items ? RNA_enum_from_identifier(items, tref_rt->data_block) : -1;
- if (i != -1) {
- const int slot_index = items[i].value;
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- Scene *scene = WM_window_get_active_scene(win);
- Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
- struct Brush *brush = BKE_paint_toolslots_brush_get(paint, slot_index);
- if (brush == NULL) {
- /* Could make into a function. */
- brush = (struct Brush *)BKE_libblock_find_name(bmain, ID_BR, items[i].name);
- if (brush && slot_index == BKE_brush_tool_get(brush, paint)) {
- /* pass */
- }
- else {
- brush = BKE_brush_add(bmain, items[i].name, paint->runtime.ob_mode);
- BKE_brush_tool_set(brush, paint, slot_index);
- }
- BKE_paint_brush_set(paint, brush);
- }
- BKE_paint_brush_set(paint, brush);
- }
- }
- }
- }
- }
- else {
- /* XXX, this part is weak, disables uv_sculpt when non uv-tool set. */
- if ((tref->space_type == SPACE_IMAGE) &&
- (tref->mode == SI_MODE_UV))
- {
- Main *bmain = CTX_data_main(C);
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- if (ts->use_uv_sculpt == true) {
- ts->use_uv_sculpt = false;
- toolsystem_ref_link__refresh_image_uv_sculpt(C, scene);
- }
- }
- }
- }
- }
+ bToolRef_Runtime *tref_rt = tref->runtime;
+ if (tref_rt->gizmo_group[0]) {
+ const char *idname = tref_rt->gizmo_group;
+ wmGizmoGroupType *gzgt = WM_gizmogrouptype_find(idname, false);
+ if (gzgt != NULL) {
+ if ((gzgt->flag & WM_GIZMOGROUPTYPE_TOOL_INIT) == 0) {
+ WM_gizmo_group_type_ensure_ptr(gzgt);
+ }
+ }
+ else {
+ CLOG_WARN(WM_LOG_TOOLS, "'%s' widget not found", idname);
+ }
+ }
+
+ if (tref_rt->data_block[0]) {
+ Main *bmain = CTX_data_main(C);
+
+ if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_SCULPT_GPENCIL)) {
+ const EnumPropertyItem *items = rna_enum_gpencil_sculpt_brush_items;
+ const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
+ if (i != -1) {
+ const int value = items[i].value;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ ts->gp_sculpt.brushtype = value;
+ }
+ }
+ }
+ }
+ else if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_WEIGHT_GPENCIL)) {
+ const EnumPropertyItem *items = rna_enum_gpencil_weight_brush_items;
+ const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
+ if (i != -1) {
+ const int value = items[i].value;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ ts->gp_sculpt.weighttype = value;
+ }
+ }
+ }
+ }
+ else if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_PARTICLE)) {
+ const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items;
+ const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
+ if (i != -1) {
+ const int value = items[i].value;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ ts->particle.brushtype = value;
+ }
+ }
+ }
+ }
+ else if ((tref->space_type == SPACE_IMAGE) && (tref->mode == SI_MODE_UV)) {
+ /* Note that switching uv-sculpt boolean is a hack at the moment.
+ * It would be best to make this either an operator or a higher level mode (like mesh-object sculpt mode). */
+ const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items;
+ const int i = RNA_enum_from_identifier(items, tref_rt->data_block);
+ if (i != -1) {
+ const int value = items[i].value;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ ts->uv_sculpt_tool = value;
+
+ if (ts->use_uv_sculpt == false) {
+ ts->use_uv_sculpt = true;
+ toolsystem_ref_link__refresh_image_uv_sculpt(C, scene);
+ }
+ }
+ }
+ }
+ }
+ else {
+ const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
+ BLI_assert(paint_mode != PAINT_MODE_INVALID);
+ const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ BLI_assert(items != NULL);
+
+ const int i = items ? RNA_enum_from_identifier(items, tref_rt->data_block) : -1;
+ if (i != -1) {
+ const int slot_index = items[i].value;
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+ struct Brush *brush = BKE_paint_toolslots_brush_get(paint, slot_index);
+ if (brush == NULL) {
+ /* Could make into a function. */
+ brush = (struct Brush *)BKE_libblock_find_name(bmain, ID_BR, items[i].name);
+ if (brush && slot_index == BKE_brush_tool_get(brush, paint)) {
+ /* pass */
+ }
+ else {
+ brush = BKE_brush_add(bmain, items[i].name, paint->runtime.ob_mode);
+ BKE_brush_tool_set(brush, paint, slot_index);
+ }
+ BKE_paint_brush_set(paint, brush);
+ }
+ BKE_paint_brush_set(paint, brush);
+ }
+ }
+ }
+ }
+ }
+ else {
+ /* XXX, this part is weak, disables uv_sculpt when non uv-tool set. */
+ if ((tref->space_type == SPACE_IMAGE) && (tref->mode == SI_MODE_UV)) {
+ Main *bmain = CTX_data_main(C);
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ if (ts->use_uv_sculpt == true) {
+ ts->use_uv_sculpt = false;
+ toolsystem_ref_link__refresh_image_uv_sculpt(C, scene);
+ }
+ }
+ }
+ }
+ }
}
static void toolsystem_refresh_ref(bContext *C, WorkSpace *workspace, bToolRef *tref)
{
- if (tref->runtime == NULL) {
- return;
- }
- /* currently same operation. */
- toolsystem_ref_link(C, workspace, tref);
+ if (tref->runtime == NULL) {
+ return;
+ }
+ /* currently same operation. */
+ toolsystem_ref_link(C, workspace, tref);
}
void WM_toolsystem_refresh(bContext *C, WorkSpace *workspace, const bToolKey *tkey)
{
- bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
- if (tref) {
- toolsystem_refresh_ref(C, workspace, tref);
- }
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
+ if (tref) {
+ toolsystem_refresh_ref(C, workspace, tref);
+ }
}
static void toolsystem_reinit_ref(bContext *C, WorkSpace *workspace, bToolRef *tref)
{
- toolsystem_reinit_with_toolref(C, workspace, tref);
+ toolsystem_reinit_with_toolref(C, workspace, tref);
}
void WM_toolsystem_reinit(bContext *C, WorkSpace *workspace, const bToolKey *tkey)
{
- bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
- if (tref) {
- toolsystem_reinit_ref(C, workspace, tref);
- }
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
+ if (tref) {
+ toolsystem_reinit_ref(C, workspace, tref);
+ }
}
/* Operate on all active tools. */
void WM_toolsystem_unlink_all(struct bContext *C, struct WorkSpace *workspace)
{
- LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
- tref->tag = 0;
- }
+ LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
+ tref->tag = 0;
+ }
- LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
- if (tref->runtime) {
- if (tref->tag == 0) {
- toolsystem_unlink_ref(C, workspace, tref);
- tref->tag = 1;
- }
- }
- }
+ LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
+ if (tref->runtime) {
+ if (tref->tag == 0) {
+ toolsystem_unlink_ref(C, workspace, tref);
+ tref->tag = 1;
+ }
+ }
+ }
}
void WM_toolsystem_refresh_all(struct bContext *C, struct WorkSpace *workspace)
{
- BLI_assert(0);
- LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
- toolsystem_refresh_ref(C, workspace, tref);
- }
+ BLI_assert(0);
+ LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
+ toolsystem_refresh_ref(C, workspace, tref);
+ }
}
void WM_toolsystem_reinit_all(struct bContext *C, wmWindow *win)
{
- bScreen *screen = WM_window_get_active_screen(win);
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
- continue;
- }
+ bScreen *screen = WM_window_get_active_screen(win);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ if (((1 << sa->spacetype) & WM_TOOLSYSTEM_SPACE_MASK) == 0) {
+ continue;
+ }
- WorkSpace *workspace = WM_window_get_active_workspace(win);
- const bToolKey tkey = {
- .space_type = sa->spacetype,
- .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
- };
- bToolRef *tref = WM_toolsystem_ref_find(workspace, &tkey);
- if (tref) {
- if (tref->tag == 0) {
- toolsystem_reinit_ref(C, workspace, tref);
- tref->tag = 1;
- }
- }
- }
+ WorkSpace *workspace = WM_window_get_active_workspace(win);
+ const bToolKey tkey = {
+ .space_type = sa->spacetype,
+ .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
+ };
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, &tkey);
+ if (tref) {
+ if (tref->tag == 0) {
+ toolsystem_reinit_ref(C, workspace, tref);
+ tref->tag = 1;
+ }
+ }
+ }
}
-void WM_toolsystem_ref_set_from_runtime(
- struct bContext *C, struct WorkSpace *workspace, bToolRef *tref,
- const bToolRef_Runtime *tref_rt, const char *idname)
+void WM_toolsystem_ref_set_from_runtime(struct bContext *C,
+ struct WorkSpace *workspace,
+ bToolRef *tref,
+ const bToolRef_Runtime *tref_rt,
+ const char *idname)
{
- Main *bmain = CTX_data_main(C);
+ Main *bmain = CTX_data_main(C);
- if (tref->runtime) {
- toolsystem_unlink_ref(C, workspace, tref);
- }
+ if (tref->runtime) {
+ toolsystem_unlink_ref(C, workspace, tref);
+ }
- STRNCPY(tref->idname, idname);
+ STRNCPY(tref->idname, idname);
- /* BAD DESIGN WARNING: used for topbar. */
- workspace->tools_space_type = tref->space_type;
- workspace->tools_mode = tref->mode;
+ /* BAD DESIGN WARNING: used for topbar. */
+ workspace->tools_space_type = tref->space_type;
+ workspace->tools_mode = tref->mode;
- if (tref->runtime == NULL) {
- tref->runtime = MEM_callocN(sizeof(*tref->runtime), __func__);
- }
+ if (tref->runtime == NULL) {
+ tref->runtime = MEM_callocN(sizeof(*tref->runtime), __func__);
+ }
- if (tref_rt != tref->runtime) {
- *tref->runtime = *tref_rt;
- }
+ if (tref_rt != tref->runtime) {
+ *tref->runtime = *tref_rt;
+ }
- toolsystem_ref_link(C, workspace, tref);
+ toolsystem_ref_link(C, workspace, tref);
- toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref);
+ toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref);
- {
- struct wmMsgBus *mbus = CTX_wm_message_bus(C);
- WM_msg_publish_rna_prop(
- mbus, &workspace->id, workspace, WorkSpace, tools);
- }
+ {
+ struct wmMsgBus *mbus = CTX_wm_message_bus(C);
+ WM_msg_publish_rna_prop(mbus, &workspace->id, workspace, WorkSpace, tools);
+ }
}
/**
@@ -446,181 +436,167 @@ void WM_toolsystem_ref_set_from_runtime(
*
* \see #toolsystem_ref_link
*/
-void WM_toolsystem_ref_sync_from_context(
- Main *bmain, WorkSpace *workspace, bToolRef *tref)
-{
- bToolRef_Runtime *tref_rt = tref->runtime;
- if ((tref_rt == NULL) || (tref_rt->data_block[0] == '\0')) {
- return;
- }
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace != WM_window_get_active_workspace(win)) {
- continue;
- }
-
- Scene *scene = WM_window_get_active_scene(win);
- ToolSettings *ts = scene->toolsettings;
- const ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- const Object *ob = OBACT(view_layer);
- if (ob == NULL) {
- /* pass */
- }
- else if ((tref->space_type == SPACE_VIEW3D) &&
- (tref->mode == CTX_MODE_SCULPT_GPENCIL))
- {
- if (ob->mode & OB_MODE_SCULPT_GPENCIL) {
- const EnumPropertyItem *items = rna_enum_gpencil_sculpt_brush_items;
- const int i = RNA_enum_from_value(items, ts->gp_sculpt.brushtype);
- const EnumPropertyItem *item = &items[i];
- if (!STREQ(tref_rt->data_block, item->identifier)) {
- STRNCPY(tref_rt->data_block, item->identifier);
- SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
- }
- }
- }
- else if ((tref->space_type == SPACE_VIEW3D) &&
- (tref->mode == CTX_MODE_WEIGHT_GPENCIL))
- {
- if (ob->mode & OB_MODE_WEIGHT_GPENCIL) {
- const EnumPropertyItem *items = rna_enum_gpencil_weight_brush_items;
- const int i = RNA_enum_from_value(items, ts->gp_sculpt.weighttype);
- const EnumPropertyItem *item = &items[i];
- if (!STREQ(tref_rt->data_block, item->identifier)) {
- STRNCPY(tref_rt->data_block, item->identifier);
- SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
- }
- }
- }
- else if ((tref->space_type == SPACE_VIEW3D) &&
- (tref->mode == CTX_MODE_PARTICLE))
- {
- if (ob->mode & OB_MODE_PARTICLE_EDIT) {
- const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items;
- const int i = RNA_enum_from_value(items, ts->particle.brushtype);
- const EnumPropertyItem *item = &items[i];
- if (!STREQ(tref_rt->data_block, item->identifier)) {
- STRNCPY(tref_rt->data_block, item->identifier);
- SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
- }
- }
- }
- else if ((tref->space_type == SPACE_IMAGE) &&
- (tref->mode == SI_MODE_UV))
- {
- if (ob->mode & OB_MODE_EDIT) {
- const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items;
- const int i = RNA_enum_from_value(items, ts->uv_sculpt_tool);
- const EnumPropertyItem *item = &items[i];
- if (!STREQ(tref_rt->data_block, item->identifier)) {
- STRNCPY(tref_rt->data_block, item->identifier);
- SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
- }
- }
- }
- else {
- const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
- Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
- const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
- if (paint && paint->brush && items) {
- const ID *brush = (ID *)paint->brush;
- const char tool_type = BKE_brush_tool_get((struct Brush *)brush, paint);
- const int i = RNA_enum_from_value(items, tool_type);
- /* Possible when loading files from the future. */
- if (i != -1) {
- const char *name = items[i].name;
- const char *identifier = items[i].identifier;
- if (!STREQ(tref_rt->data_block, identifier)) {
- STRNCPY(tref_rt->data_block, identifier);
- SNPRINTF(tref->idname, "builtin_brush.%s", name);
- }
- }
- }
- }
- }
+void WM_toolsystem_ref_sync_from_context(Main *bmain, WorkSpace *workspace, bToolRef *tref)
+{
+ bToolRef_Runtime *tref_rt = tref->runtime;
+ if ((tref_rt == NULL) || (tref_rt->data_block[0] == '\0')) {
+ return;
+ }
+ wmWindowManager *wm = bmain->wm.first;
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace != WM_window_get_active_workspace(win)) {
+ continue;
+ }
+
+ Scene *scene = WM_window_get_active_scene(win);
+ ToolSettings *ts = scene->toolsettings;
+ const ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ const Object *ob = OBACT(view_layer);
+ if (ob == NULL) {
+ /* pass */
+ }
+ else if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_SCULPT_GPENCIL)) {
+ if (ob->mode & OB_MODE_SCULPT_GPENCIL) {
+ const EnumPropertyItem *items = rna_enum_gpencil_sculpt_brush_items;
+ const int i = RNA_enum_from_value(items, ts->gp_sculpt.brushtype);
+ const EnumPropertyItem *item = &items[i];
+ if (!STREQ(tref_rt->data_block, item->identifier)) {
+ STRNCPY(tref_rt->data_block, item->identifier);
+ SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
+ }
+ }
+ }
+ else if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_WEIGHT_GPENCIL)) {
+ if (ob->mode & OB_MODE_WEIGHT_GPENCIL) {
+ const EnumPropertyItem *items = rna_enum_gpencil_weight_brush_items;
+ const int i = RNA_enum_from_value(items, ts->gp_sculpt.weighttype);
+ const EnumPropertyItem *item = &items[i];
+ if (!STREQ(tref_rt->data_block, item->identifier)) {
+ STRNCPY(tref_rt->data_block, item->identifier);
+ SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
+ }
+ }
+ }
+ else if ((tref->space_type == SPACE_VIEW3D) && (tref->mode == CTX_MODE_PARTICLE)) {
+ if (ob->mode & OB_MODE_PARTICLE_EDIT) {
+ const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items;
+ const int i = RNA_enum_from_value(items, ts->particle.brushtype);
+ const EnumPropertyItem *item = &items[i];
+ if (!STREQ(tref_rt->data_block, item->identifier)) {
+ STRNCPY(tref_rt->data_block, item->identifier);
+ SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
+ }
+ }
+ }
+ else if ((tref->space_type == SPACE_IMAGE) && (tref->mode == SI_MODE_UV)) {
+ if (ob->mode & OB_MODE_EDIT) {
+ const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items;
+ const int i = RNA_enum_from_value(items, ts->uv_sculpt_tool);
+ const EnumPropertyItem *item = &items[i];
+ if (!STREQ(tref_rt->data_block, item->identifier)) {
+ STRNCPY(tref_rt->data_block, item->identifier);
+ SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
+ }
+ }
+ }
+ else {
+ const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
+ Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
+ const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
+ if (paint && paint->brush && items) {
+ const ID *brush = (ID *)paint->brush;
+ const char tool_type = BKE_brush_tool_get((struct Brush *)brush, paint);
+ const int i = RNA_enum_from_value(items, tool_type);
+ /* Possible when loading files from the future. */
+ if (i != -1) {
+ const char *name = items[i].name;
+ const char *identifier = items[i].identifier;
+ if (!STREQ(tref_rt->data_block, identifier)) {
+ STRNCPY(tref_rt->data_block, identifier);
+ SNPRINTF(tref->idname, "builtin_brush.%s", name);
+ }
+ }
+ }
+ }
+ }
}
void WM_toolsystem_init(bContext *C)
{
- Main *bmain = CTX_data_main(C);
+ Main *bmain = CTX_data_main(C);
- BLI_assert(CTX_wm_window(C) == NULL);
+ BLI_assert(CTX_wm_window(C) == NULL);
- LISTBASE_FOREACH (WorkSpace *, workspace, &bmain->workspaces) {
- LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
- MEM_SAFE_FREE(tref->runtime);
- }
- }
+ LISTBASE_FOREACH (WorkSpace *, workspace, &bmain->workspaces) {
+ LISTBASE_FOREACH (bToolRef *, tref, &workspace->tools) {
+ MEM_SAFE_FREE(tref->runtime);
+ }
+ }
- /* Rely on screen initialization for gizmos. */
+ /* Rely on screen initialization for gizmos. */
}
static bool toolsystem_key_ensure_check(const bToolKey *tkey)
{
- switch (tkey->space_type) {
- case SPACE_VIEW3D:
- return true;
- case SPACE_IMAGE:
- if (ELEM(tkey->mode, SI_MODE_PAINT, SI_MODE_UV)) {
- return true;
- }
- break;
- case SPACE_NODE:
- return true;
- }
- return false;
-}
-
-int WM_toolsystem_mode_from_spacetype(
- ViewLayer *view_layer, ScrArea *sa, int spacetype)
-{
- int mode = -1;
- switch (spacetype) {
- case SPACE_VIEW3D:
- {
- /* 'sa' may be NULL in this case. */
- Object *obact = OBACT(view_layer);
- if (obact != NULL) {
- Object *obedit = OBEDIT_FROM_OBACT(obact);
- mode = CTX_data_mode_enum_ex(obedit, obact, obact->mode);
- }
- else {
- mode = CTX_MODE_OBJECT;
- }
- break;
- }
- case SPACE_IMAGE:
- {
- SpaceImage *sima = sa->spacedata.first;
- mode = sima->mode;
- break;
- }
- case SPACE_NODE:
- {
- mode = 0;
- break;
- }
- }
- return mode;
-}
-
-bool WM_toolsystem_key_from_context(
- ViewLayer *view_layer, ScrArea *sa, bToolKey *tkey)
-{
- int space_type = SPACE_EMPTY;
- int mode = -1;
-
- if (sa != NULL) {
- space_type = sa->spacetype;
- mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, space_type);
- }
-
- if (mode != -1) {
- tkey->space_type = space_type;
- tkey->mode = mode;
- return true;
- }
- return false;
+ switch (tkey->space_type) {
+ case SPACE_VIEW3D:
+ return true;
+ case SPACE_IMAGE:
+ if (ELEM(tkey->mode, SI_MODE_PAINT, SI_MODE_UV)) {
+ return true;
+ }
+ break;
+ case SPACE_NODE:
+ return true;
+ }
+ return false;
+}
+
+int WM_toolsystem_mode_from_spacetype(ViewLayer *view_layer, ScrArea *sa, int spacetype)
+{
+ int mode = -1;
+ switch (spacetype) {
+ case SPACE_VIEW3D: {
+ /* 'sa' may be NULL in this case. */
+ Object *obact = OBACT(view_layer);
+ if (obact != NULL) {
+ Object *obedit = OBEDIT_FROM_OBACT(obact);
+ mode = CTX_data_mode_enum_ex(obedit, obact, obact->mode);
+ }
+ else {
+ mode = CTX_MODE_OBJECT;
+ }
+ break;
+ }
+ case SPACE_IMAGE: {
+ SpaceImage *sima = sa->spacedata.first;
+ mode = sima->mode;
+ break;
+ }
+ case SPACE_NODE: {
+ mode = 0;
+ break;
+ }
+ }
+ return mode;
+}
+
+bool WM_toolsystem_key_from_context(ViewLayer *view_layer, ScrArea *sa, bToolKey *tkey)
+{
+ int space_type = SPACE_EMPTY;
+ int mode = -1;
+
+ if (sa != NULL) {
+ space_type = sa->spacetype;
+ mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, space_type);
+ }
+
+ if (mode != -1) {
+ tkey->space_type = space_type;
+ tkey->mode = mode;
+ return true;
+ }
+ return false;
}
/**
@@ -632,315 +608,324 @@ bool WM_toolsystem_key_from_context(
*/
void WM_toolsystem_refresh_active(bContext *C)
{
- Main *bmain = CTX_data_main(C);
- for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- WorkSpace *workspace = WM_window_get_active_workspace(win);
- bScreen *screen = WM_window_get_active_screen(win);
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- int mode_other = 0;
- enum { UNSET = -1, CHANGE = 0, MATCH = 1 } mode_match = UNSET;
- /* Could skip loop for modes that don't depend on space type. */
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- /* Don't change the space type of the active tool, only update it's mode. */
- if (sa->spacetype == workspace->tools_space_type) {
- const int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
- if (workspace->tools_mode == mode) {
- mode_match = MATCH;
- break;
- }
- else if (mode_match == -1) {
- mode_match = CHANGE;
- mode_other = mode;
- }
- }
- }
-
- if (mode_match == CHANGE) {
- const bToolKey tkey = {
- .space_type = workspace->tools_space_type,
- .mode = mode_other,
- };
- toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
- }
- }
- }
+ Main *bmain = CTX_data_main(C);
+ for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ WorkSpace *workspace = WM_window_get_active_workspace(win);
+ bScreen *screen = WM_window_get_active_screen(win);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ int mode_other = 0;
+ enum { UNSET = -1, CHANGE = 0, MATCH = 1 } mode_match = UNSET;
+ /* Could skip loop for modes that don't depend on space type. */
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ /* Don't change the space type of the active tool, only update it's mode. */
+ if (sa->spacetype == workspace->tools_space_type) {
+ const int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
+ if (workspace->tools_mode == mode) {
+ mode_match = MATCH;
+ break;
+ }
+ else if (mode_match == -1) {
+ mode_match = CHANGE;
+ mode_other = mode;
+ }
+ }
+ }
+
+ if (mode_match == CHANGE) {
+ const bToolKey tkey = {
+ .space_type = workspace->tools_space_type,
+ .mode = mode_other,
+ };
+ toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
+ }
+ }
+ }
}
void WM_toolsystem_refresh_screen_area(WorkSpace *workspace, ViewLayer *view_layer, ScrArea *sa)
{
- sa->runtime.tool = NULL;
- sa->runtime.is_tool_set = true;
- const int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
- for (bToolRef *tref = workspace->tools.first; tref; tref = tref->next) {
- if (tref->space_type == sa->spacetype) {
- if (tref->mode == mode) {
- sa->runtime.tool = tref;
- break;
- }
- }
- }
+ sa->runtime.tool = NULL;
+ sa->runtime.is_tool_set = true;
+ const int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
+ for (bToolRef *tref = workspace->tools.first; tref; tref = tref->next) {
+ if (tref->space_type == sa->spacetype) {
+ if (tref->mode == mode) {
+ sa->runtime.tool = tref;
+ break;
+ }
+ }
+ }
}
void WM_toolsystem_refresh_screen_all(Main *bmain)
{
- /* Update all ScrArea's tools */
- for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- WorkSpace *workspace = WM_window_get_active_workspace(win);
- bool space_type_has_tools[SPACE_TYPE_LAST + 1] = {0};
- for (bToolRef *tref = workspace->tools.first; tref; tref = tref->next) {
- space_type_has_tools[tref->space_type] = true;
- }
- bScreen *screen = WM_window_get_active_screen(win);
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- sa->runtime.tool = NULL;
- sa->runtime.is_tool_set = true;
- if (space_type_has_tools[sa->spacetype]) {
- WM_toolsystem_refresh_screen_area(workspace, view_layer, sa);
- }
- }
- }
- }
-}
-
-static void toolsystem_refresh_screen_from_active_tool(
- Main *bmain, WorkSpace *workspace, bToolRef *tref)
-{
- /* Update all ScrArea's tools */
- for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- if (workspace == WM_window_get_active_workspace(win)) {
- bScreen *screen = WM_window_get_active_screen(win);
- ViewLayer *view_layer = WM_window_get_active_view_layer(win);
- for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
- if (sa->spacetype == tref->space_type) {
- int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
- if (mode == tref->mode) {
- sa->runtime.tool = tref;
- sa->runtime.is_tool_set = true;
- }
- }
- }
- }
- }
- }
+ /* Update all ScrArea's tools */
+ for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ WorkSpace *workspace = WM_window_get_active_workspace(win);
+ bool space_type_has_tools[SPACE_TYPE_LAST + 1] = {0};
+ for (bToolRef *tref = workspace->tools.first; tref; tref = tref->next) {
+ space_type_has_tools[tref->space_type] = true;
+ }
+ bScreen *screen = WM_window_get_active_screen(win);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ sa->runtime.tool = NULL;
+ sa->runtime.is_tool_set = true;
+ if (space_type_has_tools[sa->spacetype]) {
+ WM_toolsystem_refresh_screen_area(workspace, view_layer, sa);
+ }
+ }
+ }
+ }
+}
+
+static void toolsystem_refresh_screen_from_active_tool(Main *bmain,
+ WorkSpace *workspace,
+ bToolRef *tref)
+{
+ /* Update all ScrArea's tools */
+ for (wmWindowManager *wm = bmain->wm.first; wm; wm = wm->id.next) {
+ for (wmWindow *win = wm->windows.first; win; win = win->next) {
+ if (workspace == WM_window_get_active_workspace(win)) {
+ bScreen *screen = WM_window_get_active_screen(win);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+ if (sa->spacetype == tref->space_type) {
+ int mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype);
+ if (mode == tref->mode) {
+ sa->runtime.tool = tref;
+ sa->runtime.is_tool_set = true;
+ }
+ }
+ }
+ }
+ }
+ }
}
bToolRef *WM_toolsystem_ref_set_by_id(
- bContext *C, WorkSpace *workspace, const bToolKey *tkey,
- const char *name, bool cycle)
+ bContext *C, WorkSpace *workspace, const bToolKey *tkey, const char *name, bool cycle)
{
- wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
- /* On startup, Python operatores are not yet loaded. */
- if (ot == NULL) {
- return NULL;
- }
- PointerRNA op_props;
- WM_operator_properties_create_ptr(&op_props, ot);
- RNA_string_set(&op_props, "name", name);
+ wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
+ /* On startup, Python operatores are not yet loaded. */
+ if (ot == NULL) {
+ return NULL;
+ }
+ PointerRNA op_props;
+ WM_operator_properties_create_ptr(&op_props, ot);
+ RNA_string_set(&op_props, "name", name);
- /* Will get from context if not set. */
- bToolKey tkey_from_context;
- if (tkey == NULL) {
- ViewLayer *view_layer = CTX_data_view_layer(C);
- ScrArea *sa = CTX_wm_area(C);
- WM_toolsystem_key_from_context(view_layer, sa, &tkey_from_context);
- tkey = &tkey_from_context;
- }
+ /* Will get from context if not set. */
+ bToolKey tkey_from_context;
+ if (tkey == NULL) {
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ ScrArea *sa = CTX_wm_area(C);
+ WM_toolsystem_key_from_context(view_layer, sa, &tkey_from_context);
+ tkey = &tkey_from_context;
+ }
- BLI_assert((1 << tkey->space_type) & WM_TOOLSYSTEM_SPACE_MASK);
+ BLI_assert((1 << tkey->space_type) & WM_TOOLSYSTEM_SPACE_MASK);
- RNA_enum_set(&op_props, "space_type", tkey->space_type);
- RNA_boolean_set(&op_props, "cycle", cycle);
+ RNA_enum_set(&op_props, "space_type", tkey->space_type);
+ RNA_boolean_set(&op_props, "cycle", cycle);
- WM_operator_name_call_ptr(C, ot, WM_OP_EXEC_DEFAULT, &op_props);
- WM_operator_properties_free(&op_props);
+ WM_operator_name_call_ptr(C, ot, WM_OP_EXEC_DEFAULT, &op_props);
+ WM_operator_properties_free(&op_props);
- bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
+ bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
- if (tref) {
- Main *bmain = CTX_data_main(C);
- toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref);
- }
+ if (tref) {
+ Main *bmain = CTX_data_main(C);
+ toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref);
+ }
- return (tref && STREQ(tref->idname, name)) ? tref : NULL;
+ return (tref && STREQ(tref->idname, name)) ? tref : NULL;
}
-static void toolsystem_reinit_with_toolref(
- bContext *C, WorkSpace *workspace, bToolRef *tref)
+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);
+ bToolKey tkey = {
+ .space_type = tref->space_type,
+ .mode = tref->mode,
+ };
+ WM_toolsystem_ref_set_by_id(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) {
- /* Use the names of the enums for each brush tool. */
- case CTX_MODE_SCULPT:
- case CTX_MODE_PAINT_VERTEX:
- case CTX_MODE_PAINT_WEIGHT:
- case CTX_MODE_WEIGHT_GPENCIL:
- case CTX_MODE_PAINT_TEXTURE:
- case CTX_MODE_PAINT_GPENCIL:
- return "builtin_brush.Draw";
- case CTX_MODE_SCULPT_GPENCIL:
- return "builtin_brush.Push";
- /* end temporary hack. */
-
- case CTX_MODE_PARTICLE:
- return "builtin_brush.Comb";
- case CTX_MODE_EDIT_TEXT:
- return "builtin.cursor";
- }
- break;
- case SPACE_IMAGE:
- switch (tkey->mode) {
- case SI_MODE_PAINT:
- return "builtin_brush.draw";
- }
- break;
- case SPACE_NODE:
- {
- /* 'Select Box' interferes with cut-links which is handy. */
- return "builtin.select";
- }
- }
-
- return "builtin.select_box";
+ switch (tkey->space_type) {
+ case SPACE_VIEW3D:
+ switch (tkey->mode) {
+ /* Use the names of the enums for each brush tool. */
+ case CTX_MODE_SCULPT:
+ case CTX_MODE_PAINT_VERTEX:
+ case CTX_MODE_PAINT_WEIGHT:
+ case CTX_MODE_WEIGHT_GPENCIL:
+ case CTX_MODE_PAINT_TEXTURE:
+ case CTX_MODE_PAINT_GPENCIL:
+ return "builtin_brush.Draw";
+ case CTX_MODE_SCULPT_GPENCIL:
+ return "builtin_brush.Push";
+ /* end temporary hack. */
+
+ case CTX_MODE_PARTICLE:
+ return "builtin_brush.Comb";
+ case CTX_MODE_EDIT_TEXT:
+ return "builtin.cursor";
+ }
+ break;
+ case SPACE_IMAGE:
+ switch (tkey->mode) {
+ case SI_MODE_PAINT:
+ return "builtin_brush.draw";
+ }
+ break;
+ case SPACE_NODE: {
+ /* 'Select Box' interferes with cut-links which is handy. */
+ return "builtin.select";
+ }
+ }
+
+ return "builtin.select_box";
}
/**
* Run after changing modes.
*/
-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;
+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)
{
- WorkSpace *workspace = CTX_wm_workspace(C);
- ViewLayer *view_layer = CTX_data_view_layer(C);
- int space_type = SPACE_VIEW3D;
- const bToolKey tkey = {
- .space_type = space_type,
- .mode = WM_toolsystem_mode_from_spacetype(view_layer, NULL, space_type),
- };
- toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ int space_type = SPACE_VIEW3D;
+ const bToolKey tkey = {
+ .space_type = space_type,
+ .mode = WM_toolsystem_mode_from_spacetype(view_layer, NULL, space_type),
+ };
+ toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
}
-void WM_toolsystem_update_from_context(
- bContext *C, WorkSpace *workspace, ViewLayer *view_layer,
- ScrArea *sa)
+void WM_toolsystem_update_from_context(bContext *C,
+ WorkSpace *workspace,
+ ViewLayer *view_layer,
+ ScrArea *sa)
{
- const bToolKey tkey = {
- .space_type = sa->spacetype,
- .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
- };
- if (toolsystem_key_ensure_check(&tkey)) {
- toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
- }
+ const bToolKey tkey = {
+ .space_type = sa->spacetype,
+ .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
+ };
+ if (toolsystem_key_ensure_check(&tkey)) {
+ toolsystem_reinit_ensure_toolref(C, workspace, &tkey, NULL);
+ }
}
-
/**
* For paint modes to support non-brush tools.
*/
bool WM_toolsystem_active_tool_is_brush(const bContext *C)
{
- bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
- return tref_rt && (tref_rt->data_block[0] != '\0');
+ bToolRef_Runtime *tref_rt = WM_toolsystem_runtime_from_context((bContext *)C);
+ return tref_rt && (tref_rt->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);
- ViewLayer *view_layer = CTX_data_view_layer(C);
- ScrArea *sa = msg_val->user_data;
- int space_type = sa->spacetype;
- const bToolKey tkey = {
- .space_type = space_type,
- .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
- };
- WM_toolsystem_refresh(C, workspace, &tkey);
- WM_toolsystem_refresh_screen_area(workspace, view_layer, sa);
+void WM_toolsystem_do_msg_notify_tag_refresh(bContext *C,
+ wmMsgSubscribeKey *UNUSED(msg_key),
+ wmMsgSubscribeValue *msg_val)
+{
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ ScrArea *sa = msg_val->user_data;
+ int space_type = sa->spacetype;
+ const bToolKey tkey = {
+ .space_type = space_type,
+ .mode = WM_toolsystem_mode_from_spacetype(view_layer, sa, sa->spacetype),
+ };
+ WM_toolsystem_refresh(C, workspace, &tkey);
+ WM_toolsystem_refresh_screen_area(workspace, view_layer, sa);
}
IDProperty *WM_toolsystem_ref_properties_ensure_idprops(bToolRef *tref)
{
- if (tref->properties == NULL) {
- IDPropertyTemplate val = {0};
- tref->properties = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
- }
- return tref->properties;
-}
-
-bool WM_toolsystem_ref_properties_get_ex(bToolRef *tref, const char *idname, StructRNA *type, PointerRNA *r_ptr)
-{
- IDProperty *group = tref->properties;
- IDProperty *prop = group ? IDP_GetPropertyFromGroup(group, idname) : NULL;
- RNA_pointer_create(NULL, type, prop, r_ptr);
- return (prop != NULL);
-}
-
-void WM_toolsystem_ref_properties_ensure_ex(bToolRef *tref, const char *idname, StructRNA *type, PointerRNA *r_ptr)
-{
- IDProperty *group = WM_toolsystem_ref_properties_ensure_idprops(tref);
- IDProperty *prop = IDP_GetPropertyFromGroup(group, idname);
- if (prop == NULL) {
- IDPropertyTemplate val = {0};
- prop = IDP_New(IDP_GROUP, &val, "wmGenericProperties");
- STRNCPY(prop->name, idname);
- IDP_ReplaceInGroup_ex(group, prop, NULL);
- }
- else {
- BLI_assert(prop->type == IDP_GROUP);
- }
-
- RNA_pointer_create(NULL, type, prop, r_ptr);
-}
-
-void WM_toolsystem_ref_properties_init_for_keymap(
- bToolRef *tref, PointerRNA *dst_ptr, PointerRNA *src_ptr, wmOperatorType *ot)
-{
- *dst_ptr = *src_ptr;
- if (dst_ptr->data) {
- dst_ptr->data = IDP_CopyProperty(dst_ptr->data);
- }
- else {
- IDPropertyTemplate val = {0};
- dst_ptr->data = IDP_New(IDP_GROUP, &val, "wmOpItemProp");
- }
- if (tref->properties != NULL) {
- IDProperty *prop = IDP_GetPropertyFromGroup(tref->properties, ot->idname);
- if (prop) {
- /* Important key-map items properties don't get overwritten by the tools.
- * - When a key-map item doesn't set a property, the tool-systems is used.
- * - When it does, it overrides the tool-system.
- *
- * This way the default action can be to follow the top-bar tool-settings &
- * modifier keys can be used to perform different actions that aren't clobbered here.
- */
- IDP_MergeGroup(dst_ptr->data, prop, false);
- }
- }
+ if (tref->properties == NULL) {
+ IDPropertyTemplate val = {0};
+ tref->properties = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
+ }
+ return tref->properties;
+}
+
+bool WM_toolsystem_ref_properties_get_ex(bToolRef *tref,
+ const char *idname,
+ StructRNA *type,
+ PointerRNA *r_ptr)
+{
+ IDProperty *group = tref->properties;
+ IDProperty *prop = group ? IDP_GetPropertyFromGroup(group, idname) : NULL;
+ RNA_pointer_create(NULL, type, prop, r_ptr);
+ return (prop != NULL);
+}
+
+void WM_toolsystem_ref_properties_ensure_ex(bToolRef *tref,
+ const char *idname,
+ StructRNA *type,
+ PointerRNA *r_ptr)
+{
+ IDProperty *group = WM_toolsystem_ref_properties_ensure_idprops(tref);
+ IDProperty *prop = IDP_GetPropertyFromGroup(group, idname);
+ if (prop == NULL) {
+ IDPropertyTemplate val = {0};
+ prop = IDP_New(IDP_GROUP, &val, "wmGenericProperties");
+ STRNCPY(prop->name, idname);
+ IDP_ReplaceInGroup_ex(group, prop, NULL);
+ }
+ else {
+ BLI_assert(prop->type == IDP_GROUP);
+ }
+
+ RNA_pointer_create(NULL, type, prop, r_ptr);
+}
+
+void WM_toolsystem_ref_properties_init_for_keymap(bToolRef *tref,
+ PointerRNA *dst_ptr,
+ PointerRNA *src_ptr,
+ wmOperatorType *ot)
+{
+ *dst_ptr = *src_ptr;
+ if (dst_ptr->data) {
+ dst_ptr->data = IDP_CopyProperty(dst_ptr->data);
+ }
+ else {
+ IDPropertyTemplate val = {0};
+ dst_ptr->data = IDP_New(IDP_GROUP, &val, "wmOpItemProp");
+ }
+ if (tref->properties != NULL) {
+ IDProperty *prop = IDP_GetPropertyFromGroup(tref->properties, ot->idname);
+ if (prop) {
+ /* Important key-map items properties don't get overwritten by the tools.
+ * - When a key-map item doesn't set a property, the tool-systems is used.
+ * - When it does, it overrides the tool-system.
+ *
+ * This way the default action can be to follow the top-bar tool-settings &
+ * modifier keys can be used to perform different actions that aren't clobbered here.
+ */
+ IDP_MergeGroup(dst_ptr->data, prop, false);
+ }
+ }
}