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>2018-02-22 10:15:34 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-02-22 10:18:44 +0300
commit4ab002bca36ace4d2b4b21efce622a682b99b844 (patch)
tree8127eca822cc9a80bb6951127bfa06eab5791655 /source/blender/editors/object
parent5b857102fa6d3e1f92530343448b142c9666e8d8 (diff)
WorkSpace: object-mode switching support
When changing workspaces, existing object-mode data is freed the new workspaces mode is entered (if possible).
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r--source/blender/editors/object/object_edit.c50
-rw-r--r--source/blender/editors/object/object_select.c39
2 files changed, 53 insertions, 36 deletions
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index c6f9ced51a3..0da4bd1e045 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -77,6 +77,7 @@
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_pointcache.h"
#include "BKE_property.h"
#include "BKE_sca.h"
@@ -2068,6 +2069,55 @@ void OBJECT_OT_game_physics_copy(struct wmOperatorType *ot)
/* generic utility function */
+bool ED_object_mode_generic_enter(
+ struct bContext *C, eObjectMode object_mode)
+{
+ WorkSpace *workspace = CTX_wm_workspace(C);
+ if (workspace->object_mode == object_mode) {
+ return true;
+ }
+ wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_mode_set", false);
+ PointerRNA ptr;
+ WM_operator_properties_create_ptr(&ptr, ot);
+ RNA_enum_set(&ptr, "mode", object_mode);
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr);
+ WM_operator_properties_free(&ptr);
+ return (workspace->object_mode == object_mode);
+}
+
+/**
+ * Use for changing works-paces or changing active object.
+ * Caller can check #OB_MODE_ALL_MODE_DATA to test if this needs to be run.
+ */
+void ED_object_mode_generic_exit(
+ const struct EvaluationContext *eval_ctx,
+ struct WorkSpace *workspace, struct Scene *scene, struct Object *ob)
+{
+ if (eval_ctx->object_mode & OB_MODE_EDIT) {
+ if (BKE_object_is_in_editmode(ob)) {
+ ED_object_editmode_exit_ex(NULL, workspace, scene, ob, EM_FREEDATA);
+ }
+ }
+ else if (eval_ctx->object_mode & OB_MODE_VERTEX_PAINT) {
+ if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_VERTEX_PAINT)) {
+ ED_object_vpaintmode_exit_ex(workspace, ob);
+ }
+ }
+ else if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
+ if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_WEIGHT_PAINT)) {
+ ED_object_wpaintmode_exit_ex(workspace, ob);
+ }
+ }
+ else if (eval_ctx->object_mode & OB_MODE_SCULPT) {
+ if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_SCULPT)) {
+ ED_object_sculptmode_exit_ex(eval_ctx, workspace, scene, ob);
+ }
+ }
+ else {
+ BLI_assert((eval_ctx->object_mode & OB_MODE_ALL_MODE_DATA) == 0);
+ }
+}
+
bool ED_object_editmode_calc_active_center(Object *obedit, const bool select_only, float r_center[3])
{
switch (obedit->type) {
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 851a5d86d1b..620ee015724 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -146,40 +146,12 @@ void ED_object_base_activate(bContext *C, Base *base)
*
* Not correct because it's possible other work-spaces use these.
* although that's a corner case. */
- if (workspace->object_mode & OB_MODE_EDIT) {
- FOREACH_OBJECT(view_layer, ob) {
- if (ob != obact) {
- if (BKE_object_is_in_editmode(ob)) {
- ED_object_editmode_exit_ex(NULL, workspace, scene, ob, EM_FREEDATA);
- }
- }
- }
- FOREACH_OBJECT_END;
- }
- else if (workspace->object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_SCULPT)) {
+ if (workspace->object_mode & OB_MODE_ALL_MODE_DATA) {
EvaluationContext eval_ctx;
CTX_data_eval_ctx(C, &eval_ctx);
FOREACH_OBJECT(view_layer, ob) {
if (ob != obact) {
- if (ob->sculpt) {
- switch (ob->sculpt->mode_type) {
- case OB_MODE_VERTEX_PAINT:
- {
- ED_object_vpaintmode_exit_ex(workspace, ob);
- break;
- }
- case OB_MODE_WEIGHT_PAINT:
- {
- ED_object_wpaintmode_exit_ex(workspace, ob);
- break;
- }
- case OB_MODE_SCULPT:
- {
- ED_object_sculptmode_exit_ex(&eval_ctx, workspace, scene, ob);
- break;
- }
- }
- }
+ ED_object_mode_generic_exit(&eval_ctx, workspace, scene, ob);
}
}
FOREACH_OBJECT_END;
@@ -191,12 +163,7 @@ void ED_object_base_activate(bContext *C, Base *base)
view_layer->basact = base;
if (reset == false) {
- wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_mode_set", false);
- PointerRNA ptr;
- WM_operator_properties_create_ptr(&ptr, ot);
- RNA_enum_set(&ptr, "mode", object_mode);
- WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr);
- WM_operator_properties_free(&ptr);
+ ED_object_mode_generic_enter(C, object_mode);
}
if (base) {