[Bf-blender-cvs] [7c414bf0613] temp-workspace_mode: Initial implementation of the workspace mode for TAB toggling
Julian Eisel
noreply at git.blender.org
Sat Dec 23 16:36:36 CET 2017
Commit: 7c414bf06139e20681071a52bbd65ec12ffdffc7
Author: Julian Eisel
Date: Fri Dec 15 04:26:29 2017 +0100
Branches: temp-workspace_mode
https://developer.blender.org/rB7c414bf06139e20681071a52bbd65ec12ffdffc7
Initial implementation of the workspace mode for TAB toggling
===================================================================
M source/blender/alembic/intern/alembic_capi.cc
M source/blender/blenkernel/BKE_layer.h
M source/blender/blenkernel/BKE_particle.h
M source/blender/blenkernel/BKE_workspace.h
M source/blender/blenkernel/intern/layer.c
M source/blender/blenkernel/intern/object.c
M source/blender/blenkernel/intern/particle.c
M source/blender/blenkernel/intern/workspace.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/versioning_280.c
M source/blender/collada/collada_utils.cpp
M source/blender/editors/armature/pose_edit.c
M source/blender/editors/mesh/mesh_navmesh.c
M source/blender/editors/object/object_edit.c
M source/blender/editors/object/object_modifier.c
M source/blender/editors/object/object_ops.c
M source/blender/editors/object/object_select.c
M source/blender/editors/physics/particle_edit.c
M source/blender/editors/physics/particle_object.c
M source/blender/editors/screen/workspace_edit.c
M source/blender/editors/sculpt_paint/paint_image.c
M source/blender/editors/sculpt_paint/paint_vertex.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/makesdna/DNA_object_types.h
M source/blender/makesdna/DNA_workspace_types.h
M source/blender/makesrna/intern/rna_object_api.c
M source/blender/makesrna/intern/rna_wm.c
===================================================================
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index 5e93779b5f6..8d0ecf07f4f 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -856,7 +856,7 @@ static void import_endjob(void *user_data)
BKE_collection_object_add(&data->scene->id, lc->scene_collection, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ BKE_view_layer_base_select(view_layer, base, NULL);
DEG_id_tag_update_ex(data->bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
}
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index e4f8b8790f6..98d4b0a29b7 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -74,7 +74,7 @@ struct ViewLayer *BKE_view_layer_first_from_id(const struct ID *owner_id);
struct ViewLayer *BKE_view_layer_find_from_collection(const struct ID *owner_id, struct LayerCollection *lc);
struct Base *BKE_view_layer_base_find(struct ViewLayer *view_layer, struct Object *ob);
void BKE_view_layer_base_deselect_all(struct ViewLayer *view_layer);
-void BKE_view_layer_base_select(struct ViewLayer *view_layer, struct Base *selbase);
+void BKE_view_layer_base_select(struct ViewLayer *view_layer, struct Base *selbase, struct WorkSpace *workspace);
void BKE_view_layer_copy_data(
struct ViewLayer *view_layer_dst, struct ViewLayer *view_layer_src,
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 1776872f455..942424c191d 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -64,6 +64,7 @@ struct BVHTreeRayHit;
struct EdgeHash;
struct EvaluationContext;
struct ViewLayer;
+struct WorkSpace;
#define PARTICLE_COLLISION_MAX_COLLISIONS 10
@@ -325,7 +326,7 @@ void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int distr
struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
struct ModifierData *object_add_particle_system(struct Scene *scene, struct Object *ob, const char *name);
-void object_remove_particle_system(struct Scene *scene, struct Object *ob);
+void object_remove_particle_system(struct Scene *scene, struct Object *ob, struct WorkSpace *workspace);
struct ParticleSettings *psys_new_settings(const char *name, struct Main *main);
void BKE_particlesettings_copy_data(
struct Main *bmain, struct ParticleSettings *part_dst, const struct ParticleSettings *part_src,
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index 9f989f7ae8f..73f0ef15029 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -30,20 +30,11 @@
struct bScreen;
struct EvaluationContext;
struct Main;
+struct Object;
struct Scene;
struct TransformOrientation;
struct ViewLayer;
-/**
- * Plan is to store the object-mode per workspace, not per object anymore.
- * However, there's quite some work to be done for that, so for now, there is just a basic
- * implementation of an object <-> workspace object-mode syncing for testing, with some known
- * problems. Main problem being that the modes can get out of sync when changing object selection.
- * Would require a pile of temporary changes to always sync modes when changing selection. So just
- * leaving this here for some testing until object-mode is really a workspace level setting.
- */
-#define USE_WORKSPACE_MODE
-
/* -------------------------------------------------------------------- */
/* Create, delete, init */
@@ -106,15 +97,27 @@ void BKE_workspace_active_layout_set(struct WorkSpaceInstanceHook *h
struct bScreen *BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS;
void BKE_workspace_active_screen_set(
struct WorkSpaceInstanceHook *hook, struct WorkSpace *workspace, struct bScreen *screen) SETTER_ATTRS;
-#ifdef USE_WORKSPACE_MODE
+
enum eObjectMode BKE_workspace_object_mode_get(
const struct WorkSpace *workspace,
const struct Scene *scene) GETTER_ATTRS;
+void BKE_workspace_object_mode_ensure_updated(
+ struct WorkSpace *workspace,
+ struct Object *object, enum eObjectMode new_mode,
+ const bool is_active) SETTER_ATTRS;
void BKE_workspace_object_mode_set(
struct WorkSpace *workspace,
struct Scene *scene,
const enum eObjectMode mode) SETTER_ATTRS;
-#endif
+enum eObjectMode BKE_workspace_object_mode_for_toggle_get(
+ const struct WorkSpace *workspace,
+ const struct Object *active_object) GETTER_ATTRS;
+void BKE_workspace_object_mode_for_object_set(
+ struct WorkSpace *workspace,
+ struct Scene *scene,
+ struct Object *object,
+ enum eObjectMode new_mode) SETTER_ATTRS;
+
struct Base *BKE_workspace_active_base_get(const struct WorkSpace *workspace, const struct Scene *scene);
struct ListBase *BKE_workspace_transform_orientations_get(struct WorkSpace *workspace) GETTER_ATTRS;
struct ViewLayer *BKE_workspace_view_layer_get(
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 84eb4ee2e33..2dec48ef958 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -315,12 +315,20 @@ void BKE_view_layer_base_deselect_all(ViewLayer *view_layer)
}
}
-void BKE_view_layer_base_select(struct ViewLayer *view_layer, Base *selbase)
+void BKE_view_layer_base_select(ViewLayer *view_layer, Base *selbase, WorkSpace *workspace)
{
view_layer->basact = selbase;
if ((selbase->flag & BASE_SELECTABLED) != 0) {
selbase->flag |= BASE_SELECTED;
}
+
+ if (workspace) {
+ BKE_workspace_object_mode_ensure_updated(workspace, selbase->object, selbase->object->mode, true);
+ }
+ else {
+ /* workspace must only be NULL if object is in object-mode */
+ BLI_assert(selbase->object->mode == OB_MODE_OBJECT);
+ }
}
/****************************************************************************/
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 717d395fc68..44f5708a4b0 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -120,6 +120,7 @@
#include "BKE_material.h"
#include "BKE_camera.h"
#include "BKE_image.h"
+#include "BKE_workspace.h"
#include "DEG_depsgraph.h"
@@ -749,7 +750,7 @@ Object *BKE_object_add(
BKE_collection_object_add(&scene->id, layer_collection->scene_collection, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ BKE_view_layer_base_select(view_layer, base, NULL);
return ob;
}
@@ -770,7 +771,7 @@ Object *BKE_object_add_from(
BKE_collection_object_add_from(scene, ob_src, ob);
base = BKE_view_layer_base_find(view_layer, ob);
- BKE_view_layer_base_select(view_layer, base);
+ BKE_view_layer_base_select(view_layer, base, NULL);
return ob;
}
@@ -1223,6 +1224,7 @@ void BKE_object_copy_data(Main *UNUSED(bmain), Object *ob_dst, const Object *ob_
BKE_constraints_copy_ex(&ob_dst->constraints, &ob_src->constraints, flag_subdata, true);
ob_dst->mode = OB_MODE_OBJECT;
+// BKE_workspace_object_mode_ensure_updated(NULL, ob_dst, OB_MODE_OBJECT, true);
ob_dst->sculpt = NULL;
if (ob_src->pd) {
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index a161dd4fac3..37adbf18977 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -84,6 +84,7 @@
#include "BKE_pointcache.h"
#include "BKE_scene.h"
#include "BKE_deform.h"
+#include "BKE_workspace.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
@@ -3174,7 +3175,7 @@ ModifierData *object_add_particle_system(Scene *scene, Object *ob, const char *n
return md;
}
-void object_remove_particle_system(Scene *UNUSED(scene), Object *ob)
+void object_remove_particle_system(Scene *scene, Object *ob, struct WorkSpace *workspace)
{
ParticleSystem *psys = psys_get_current(ob);
ParticleSystemModifierData *psmd;
@@ -3212,8 +3213,9 @@ void object_remove_particle_system(Scene *UNUSED(scene), Object *ob)
if (ob->particlesystem.first)
((ParticleSystem *) ob->particlesystem.first)->flag |= PSYS_CURRENT;
- else
- ob->mode &= ~OB_MODE_PARTICLE_EDIT;
+ else {
+ BKE_workspace_object_mode_for_object_set(workspace, scene, ob, ob->mode & ~OB_MODE_PARTICLE_EDIT);
+ }
DEG_relations_tag_update(G.main);
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 8554cf0fb28..6786d3474ef 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -152,6 +152,10 @@ static bool UNUSED_FUNCTION(workspaces_is_screen_used)
WorkSpace *BKE_workspace_add(Main *bmain, const char *name)
{
WorkSpace *new_workspace = BKE_libblock_alloc(bmain, ID_WS, name, 0);
+
+ /* TABKEY toggles to edit mode by default (no WORKSPACE_USE_PREFERED_MODE flag) */
+ new_workspace->preferred_mode = OB_MODE_EDIT;
+
return new_workspace;
}
@@ -413,20 +417,68 @@ void BKE_workspace_active_screen_set(WorkSpaceInstanceHook *hook, WorkSpace *wor
BKE_workspace_hook_layout_for_workspace_set(hook, workspace, layout);
}
-#ifdef USE_WORKSPACE_MODE
eObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace, const Scene *scene)
{
Base *active_base = BKE_workspace_active_base_get(workspace, scene);
+
+ /* preferred_mode should never be OB_MODE_OBJECT! Doing this
+ * here is a bit arbitrary, but this is called regularly. */
+ BLI_assert(workspace->preferred_mode != OB_MODE_OBJECT);
+
return active_base ? active_base->object->mode : OB_MODE_OBJECT;
}
+
+void BKE_workspace_object_mode_ensure_updated(
+ WorkSpace *workspace,
+ Object *object, eObjectMode new_mode,
+ const bool is_active)
+{
+ if (is_active) {
+ if
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list