[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