Commit: 9031d5cc8f7a5d24490cc76a2cee6a70a595901e
Author: Julian Eisel
Date:   Sun Jan 22 20:56:18 2017 +0100
Branches: workspaces
https://developer.blender.org/rB9031d5cc8f7a5d24490cc76a2cee6a70a595901e

Fix and compile time option for workspace object-mode

Now we also sync the workspace object-mode when selecting a different object. 
It's still quite easy to get the mode of the active object and the one stored 
in the workspace out of sync, but fixing this would require a bunch of changes 
that would only be temporary anyway. Remember, plan is to make object-mode a 
purely workspace level option, not storing it within the object anymore.
The current object-mode syncing isn't supposed to stay there for long, I added 
a #define USE_WORKSPACE_MODE so we can disable it easily (DNA still stores it 
in files though).

===================================================================

M       release/scripts/startup/bl_ui/space_info.py
M       source/blender/blenkernel/BKE_workspace.h
M       source/blender/blenkernel/intern/workspace.c
M       source/blender/editors/object/object_edit.c
M       source/blender/editors/object/object_select.c
M       source/blender/editors/workspace/workspace_edit.c
M       source/blender/makesrna/intern/rna_workspace.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_info.py 
b/release/scripts/startup/bl_ui/space_info.py
index afdcf988fe..028a584d75 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -47,8 +47,9 @@ class INFO_HT_header(Header):
             layout.template_ID(window, "workspace", 
new="workspace.workspace_new", unlink="workspace.workspace_delete")
             layout.template_ID_preview(workspace, "screen", workspace, 
"screens", new="screen.new", unlink="screen.delete", rows=2, cols=6)
 
-        act_mode_item = 
bpy.types.Object.bl_rna.properties['mode'].enum_items[workspace.object_mode]
-        layout.operator_menu_enum("object.mode_set", "mode", 
text=act_mode_item.name, icon=act_mode_item.icon)
+        if hasattr(workspace, 'object_mode'):
+            act_mode_item = 
bpy.types.Object.bl_rna.properties['mode'].enum_items[workspace.object_mode]
+            layout.operator_menu_enum("object.mode_set", "mode", 
text=act_mode_item.name, icon=act_mode_item.icon)
 
         layout.separator()
 
diff --git a/source/blender/blenkernel/BKE_workspace.h 
b/source/blender/blenkernel/BKE_workspace.h
index e95146bcd7..8cd884e193 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -26,24 +26,37 @@
 #define __BKE_WORKSPACE_H__
 
 #include "BLI_compiler_attrs.h"
+#include "BLI_utildefines.h"
 
 struct bScreen;
+struct ListBase;
+struct Main;
 struct TransformOrientation;
 struct WorkSpace;
 
 typedef struct WorkSpace WorkSpace;
 typedef struct WorkSpaceLayout WorkSpaceLayout;
 
+/**
+ * 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 */
 
-WorkSpace *BKE_workspace_add(Main *bmain, const char *name);
+WorkSpace *BKE_workspace_add(struct Main *bmain, const char *name);
 void BKE_workspace_free(WorkSpace *ws);
-void BKE_workspace_remove(WorkSpace *workspace, Main *bmain);
+void BKE_workspace_remove(WorkSpace *workspace, struct Main *bmain);
 
 struct WorkSpaceLayout *BKE_workspace_layout_add(WorkSpace *workspace, struct 
bScreen *screen) ATTR_NONNULL();
-void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout 
*layout, Main *bmain) ATTR_NONNULL();
+void BKE_workspace_layout_remove(WorkSpace *workspace, WorkSpaceLayout 
*layout, struct Main *bmain) ATTR_NONNULL();
 
 
 /* -------------------------------------------------------------------- */
@@ -54,7 +67,7 @@ void BKE_workspace_layout_remove(WorkSpace *workspace, 
WorkSpaceLayout *layout,
                _workspace##_next = BKE_workspace_next_get(_workspace); /* 
support removing workspace from list */
 #define BKE_workspace_iter_end } (void)0
 
-void BKE_workspaces_transform_orientation_remove(const ListBase *workspaces,
+void BKE_workspaces_transform_orientation_remove(const struct ListBase 
*workspaces,
                                                  const struct 
TransformOrientation *orientation) ATTR_NONNULL();
 
 WorkSpaceLayout *BKE_workspace_layout_find(const WorkSpace *ws, const struct 
bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
@@ -83,8 +96,10 @@ void             BKE_workspace_active_layout_set(WorkSpace 
*ws, WorkSpaceLayout
 struct bScreen *BKE_workspace_active_screen_get(const WorkSpace *ws) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 void            BKE_workspace_active_screen_set(WorkSpace *ws, struct bScreen 
*screen) ATTR_NONNULL(1);
 enum ObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
+#ifdef USE_WORKSPACE_MODE
 void            BKE_workspace_object_mode_set(WorkSpace *workspace, const enum 
ObjectMode mode) ATTR_NONNULL();
-ListBase *BKE_workspace_layouts_get(WorkSpace *workspace) ATTR_NONNULL() 
ATTR_WARN_UNUSED_RESULT;
+#endif
+struct ListBase *BKE_workspace_layouts_get(WorkSpace *workspace) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 WorkSpaceLayout *BKE_workspace_new_layout_get(const WorkSpace *workspace) 
ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT;
 void             BKE_workspace_new_layout_set(WorkSpace *workspace, 
WorkSpaceLayout *layout) ATTR_NONNULL(1);
 
diff --git a/source/blender/blenkernel/intern/workspace.c 
b/source/blender/blenkernel/intern/workspace.c
index 6a4d36d41e..cfdb22dc98 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -228,6 +228,7 @@ void BKE_workspace_active_screen_set(WorkSpace *ws, bScreen 
*screen)
        ws->act_layout = BKE_workspace_layout_find(ws, screen);
 }
 
+#ifdef USE_WORKSPACE_MODE
 ObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace)
 {
        return workspace->object_mode;
@@ -236,6 +237,7 @@ void BKE_workspace_object_mode_set(WorkSpace *workspace, 
const ObjectMode mode)
 {
        workspace->object_mode = mode;
 }
+#endif
 
 ListBase *BKE_workspace_layouts_get(WorkSpace *workspace)
 {
diff --git a/source/blender/editors/object/object_edit.c 
b/source/blender/editors/object/object_edit.c
index 30d179552d..bc9ce29bf9 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1694,7 +1694,11 @@ bool ED_object_mode_compat_set(bContext *C, Object *ob, 
int mode, ReportList *re
                const char *opstring = object_mode_op_string(ob->mode);
 
                WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL);
+#ifdef USE_WORKSPACE_MODE
                BKE_workspace_object_mode_set(workspace, ob->mode);
+#else
+               UNUSED_VARS(workspace);
+#endif
                ok = ELEM(ob->mode, mode, OB_MODE_OBJECT);
                if (!ok) {
                        wmOperatorType *ot = WM_operatortype_find(opstring, 
false);
@@ -1807,12 +1811,15 @@ void OBJECT_OT_mode_set(wmOperatorType *ot)
 void ED_object_toggle_modes(bContext *C, int mode)
 {
        if (mode != OB_MODE_OBJECT) {
-               WorkSpace *workspace = CTX_wm_workspace(C);
                const char *opstring = object_mode_op_string(mode);
 
                if (opstring) {
-                       WM_operator_name_call(C, opstring, 
WM_OP_EXEC_REGION_WIN, NULL);
+#ifdef USE_WORKSPACE_MODE
+                       WorkSpace *workspace = CTX_wm_workspace(C);
+
                        BKE_workspace_object_mode_set(workspace, mode);
+#endif
+                       WM_operator_name_call(C, opstring, 
WM_OP_EXEC_REGION_WIN, NULL);
                }
        }
 }
diff --git a/source/blender/editors/object/object_select.c 
b/source/blender/editors/object/object_select.c
index f1b7186f8a..743b965a91 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -57,6 +57,7 @@
 #include "BKE_property.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
+#include "BKE_workspace.h"
 #include "BKE_library.h"
 #include "BKE_deform.h"
 
@@ -108,7 +109,12 @@ void ED_base_object_activate(bContext *C, Base *base)
        BASACT = base;
        
        if (base) {
-               
+#ifdef USE_WORKSPACE_MODE
+               WorkSpace *workspace = CTX_wm_workspace(C);
+
+               BKE_workspace_object_mode_set(workspace, base->object->mode);
+#endif
+
                /* XXX old signals, remember to handle notifiers now! */
                //              
select_actionchannel_by_name(base->object->action, "Object", 1);
                
diff --git a/source/blender/editors/workspace/workspace_edit.c 
b/source/blender/editors/workspace/workspace_edit.c
index 2118a20bde..64af6d7289 100644
--- a/source/blender/editors/workspace/workspace_edit.c
+++ b/source/blender/editors/workspace/workspace_edit.c
@@ -48,6 +48,8 @@
  * \brief API for managing workspaces and their data.
  * \{ */
 
+#ifdef USE_WORKSPACE_MODE
+
 /**
  * Changes the object mode (if needed) to the one set in \a workspace_new.
  * Object mode is still stored on object level. In future it should all be 
workspace level instead.
@@ -64,6 +66,8 @@ static void workspace_change_update_mode(const WorkSpace 
*workspace_old, const W
        }
 }
 
+#endif
+
 /**
  * \brief Change the active workspace.
  *
@@ -88,7 +92,11 @@ bool ED_workspace_change(bContext *C, wmWindowManager *wm, 
wmWindow *win, WorkSp
                /* update screen *after* changing workspace - which also causes 
the actual screen change */
                screen_changed_update(C, win, screen_new);
 
+#ifdef USE_WORKSPACE_MODE
                workspace_change_update_mode(workspace_old, workspace_new, C, 
CTX_data_active_object(C), &wm->reports);
+#else
+               UNUSED_VARS(wm);
+#endif
 
                BLI_assert(CTX_wm_workspace(C) == workspace_new);
 
diff --git a/source/blender/makesrna/intern/rna_workspace.c 
b/source/blender/makesrna/intern/rna_workspace.c
index 96fcd1a4cc..287edf1d2b 100644
--- a/source/blender/makesrna/intern/rna_workspace.c
+++ b/source/blender/makesrna/intern/rna_workspace.c
@@ -22,6 +22,8 @@
  *  \ingroup RNA
  */
 
+#include "BKE_workspace.h"
+
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 #include "RNA_types.h"
@@ -31,8 +33,6 @@
 
 #ifdef RNA_RUNTIME
 
-#include "BKE_workspace.h"
-
 #include "DNA_object_types.h"
 #include "DNA_screen_types.h"
 
@@ -100,6 +100,8 @@ static PointerRNA 
rna_workspace_screens_item_get(CollectionPropertyIterator *ite
        return rna_pointer_inherit_refine(&iter->parent, &RNA_Screen, screen);
 }
 
+#ifdef USE_WORKSPACE_MODE
+
 static int rna_workspace_object_mode_get(PointerRNA *ptr)
 {
        WorkSpace *workspace = ptr->data;
@@ -112,6 +114,8 @@ static void rna_workspace_object_mode_set(PointerRNA *ptr, 
int value)
        BKE_workspace_object_mode_set(workspace, value);
 }
 
+#endif /* USE_WORKSPACE_MODE */
+
 #else /* RNA_RUNTIME */
 
 static void rna_def_workspace(BlenderRNA *brna)
@@ -140,10 +144,12 @@ static void rna_def_workspace(BlenderRNA *brna)
                                          "rna_workspace_screens_item_get", 
NULL, NULL, NULL, NULL);
        RNA_def_property_ui_text(prop, "Screens", "Screen layouts of a 
workspace");
 
+#ifdef USE_WORKSPACE_MODE
        prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, rna_enum_object_mode

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to