Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_edit.c
| Context not available. | |||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "ED_undo.h" | #include "ED_undo.h" | ||||
| #include "ED_image.h" | #include "ED_image.h" | ||||
| #include "ED_gpencil.h" | |||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "RNA_define.h" | #include "RNA_define.h" | ||||
| Context not available. | |||||
| const EnumPropertyItem *input = rna_enum_object_mode_items; | const EnumPropertyItem *input = rna_enum_object_mode_items; | ||||
| EnumPropertyItem *item = NULL; | EnumPropertyItem *item = NULL; | ||||
| Object *ob; | Object *ob; | ||||
| bGPdata *gpd; | |||||
| int totitem = 0; | int totitem = 0; | ||||
| if (!C) /* needed for docs */ | if (!C) /* needed for docs */ | ||||
| Context not available. | |||||
| (input->value == OB_MODE_POSE && (ob->type == OB_ARMATURE)) || | (input->value == OB_MODE_POSE && (ob->type == OB_ARMATURE)) || | ||||
| (input->value == OB_MODE_PARTICLE_EDIT && use_mode_particle_edit) || | (input->value == OB_MODE_PARTICLE_EDIT && use_mode_particle_edit) || | ||||
| (ELEM(input->value, OB_MODE_SCULPT, OB_MODE_VERTEX_PAINT, | (ELEM(input->value, OB_MODE_SCULPT, OB_MODE_VERTEX_PAINT, | ||||
| OB_MODE_WEIGHT_PAINT, OB_MODE_TEXTURE_PAINT) && (ob->type == OB_MESH)) || | OB_MODE_WEIGHT_PAINT, OB_MODE_TEXTURE_PAINT) && (ob->type == OB_MESH)) || | ||||
| (ELEM(input->value, OB_MODE_GPENCIL_EDIT, OB_MODE_GPENCIL_PAINT, | |||||
| OB_MODE_GPENCIL_SCULPT, OB_MODE_GPENCIL_WEIGHT) && (ob->type == OB_GPENCIL)) || | |||||
| (input->value == OB_MODE_OBJECT)) | (input->value == OB_MODE_OBJECT)) | ||||
| { | { | ||||
| RNA_enum_item_add(&item, &totitem, input); | RNA_enum_item_add(&item, &totitem, input); | ||||
| Context not available. | |||||
| RNA_enum_items_add_value(&item, &totitem, input, OB_MODE_OBJECT); | RNA_enum_items_add_value(&item, &totitem, input, OB_MODE_OBJECT); | ||||
| } | } | ||||
| /* On top of all the rest, GPencil Stroke Edit Mode | |||||
| * is available if there's a valid gp datablock... | |||||
| */ | |||||
| gpd = CTX_data_gpencil_data(C); | |||||
| if (gpd) { | |||||
| RNA_enum_items_add_value(&item, &totitem, rna_enum_object_mode_items, OB_MODE_GPENCIL); | |||||
| } | |||||
| RNA_enum_item_end(&item, &totitem); | RNA_enum_item_end(&item, &totitem); | ||||
| *r_free = true; | *r_free = true; | ||||
| Context not available. | |||||
| static int object_mode_set_exec(bContext *C, wmOperator *op) | static int object_mode_set_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Object *ob = CTX_data_active_object(C); | Object *ob = CTX_data_active_object(C); | ||||
| bGPdata *gpd = CTX_data_gpencil_data(C); | |||||
| eObjectMode mode = RNA_enum_get(op->ptr, "mode"); | eObjectMode mode = RNA_enum_get(op->ptr, "mode"); | ||||
| eObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT; | eObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT; | ||||
| const bool toggle = RNA_boolean_get(op->ptr, "toggle"); | const bool toggle = RNA_boolean_get(op->ptr, "toggle"); | ||||
| if (gpd) { | |||||
| /* GP Mode is not bound to a specific object. Therefore, | |||||
| * we don't want it to be actually saved on any objects, | |||||
| * as weirdness can happen if you select other objects, | |||||
| * or load old files. | |||||
| * | |||||
| * Instead, we use the following 2 rules to ensure that | |||||
| * the mode selector works as expected: | |||||
| * 1) If there's no object, we want to enter editmode. | |||||
| * (i.e. with no object, we're in object mode) | |||||
| * 2) Otherwise, exit stroke editmode, so that we can | |||||
| * enter another mode... | |||||
| */ | |||||
| if (!ob || (gpd->flag & GP_DATA_STROKE_EDITMODE)) { | |||||
| WM_operator_name_call(C, "GPENCIL_OT_editmode_toggle", WM_OP_EXEC_REGION_WIN, NULL); | |||||
| } | |||||
| } | |||||
| if (!ob || !ED_object_mode_compat_test(ob, mode)) | if (!ob || !ED_object_mode_compat_test(ob, mode)) | ||||
| return OPERATOR_PASS_THROUGH; | return OPERATOR_PASS_THROUGH; | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| /* if type is OB_GPENCIL, set cursor mode */ | |||||
| if ((ob) && (ob->type == OB_GPENCIL)) { | |||||
| if (ob->data) { | |||||
| bGPdata *gpd = (bGPdata *)ob->data; | |||||
| ED_gpencil_setup_modes(C, gpd, ob->mode); | |||||
| } | |||||
| } | |||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| Context not available. | |||||