Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/object/object_select.c
| Show First 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | void ED_object_base_select(Base *base, eObjectSelect_Mode mode) | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Change active base, it includes the notifier | * Change active base, it includes the notifier | ||||
| */ | */ | ||||
| void ED_object_base_activate(bContext *C, Base *base) | void ED_object_base_activate(bContext *C, Base *base) | ||||
| { | { | ||||
| SceneLayer *scene_layer = CTX_data_scene_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| scene_layer->basact = base; | view_layer->basact = base; | ||||
| if (base) { | if (base) { | ||||
| #ifdef USE_WORKSPACE_MODE | #ifdef USE_WORKSPACE_MODE | ||||
| WorkSpace *workspace = CTX_wm_workspace(C); | WorkSpace *workspace = CTX_wm_workspace(C); | ||||
| BKE_workspace_object_mode_set(workspace, base->object->mode); | BKE_workspace_object_mode_set(workspace, base->object->mode); | ||||
| #endif | #endif | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene_layer); | WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, view_layer); | ||||
| } | } | ||||
| else { | else { | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, NULL); | WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, NULL); | ||||
| } | } | ||||
| } | } | ||||
| /********************** Selection Operators **********************/ | /********************** Selection Operators **********************/ | ||||
| ▲ Show 20 Lines • Show All 246 Lines • ▼ Show 20 Lines | void ED_object_select_linked_by_id(bContext *C, ID *id) | ||||
| if (changed) { | if (changed) { | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, CTX_data_scene(C)); | WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, CTX_data_scene(C)); | ||||
| } | } | ||||
| } | } | ||||
| static int object_select_linked_exec(bContext *C, wmOperator *op) | static int object_select_linked_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| Object *ob; | Object *ob; | ||||
| int nr = RNA_enum_get(op->ptr, "type"); | int nr = RNA_enum_get(op->ptr, "type"); | ||||
| bool changed = false, extend; | bool changed = false, extend; | ||||
| extend = RNA_boolean_get(op->ptr, "extend"); | extend = RNA_boolean_get(op->ptr, "extend"); | ||||
| if (extend == 0) { | if (extend == 0) { | ||||
| CTX_DATA_BEGIN (C, Base *, base, visible_bases) | CTX_DATA_BEGIN (C, Base *, base, visible_bases) | ||||
| { | { | ||||
| ED_object_base_select(base, BA_DESELECT); | ED_object_base_select(base, BA_DESELECT); | ||||
| } | } | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| } | } | ||||
| ob = OBACT(sl); | ob = OBACT(view_layer); | ||||
| if (ob == NULL) { | if (ob == NULL) { | ||||
| BKE_report(op->reports, RPT_ERROR, "No active object"); | BKE_report(op->reports, RPT_ERROR, "No active object"); | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| if (nr == OBJECT_SELECT_LINKED_IPO) { | if (nr == OBJECT_SELECT_LINKED_IPO) { | ||||
| // XXX old animation system | // XXX old animation system | ||||
| //if (ob->ipo == 0) return OPERATOR_CANCELLED; | //if (ob->ipo == 0) return OPERATOR_CANCELLED; | ||||
| ▲ Show 20 Lines • Show All 127 Lines • ▼ Show 20 Lines | CTX_DATA_BEGIN (C, Base *, base, selectable_bases) | ||||
| } | } | ||||
| } | } | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| return changed; | return changed; | ||||
| } | } | ||||
| static bool select_grouped_parent(bContext *C) /* Makes parent active and de-selected OBACT */ | static bool select_grouped_parent(bContext *C) /* Makes parent active and de-selected OBACT */ | ||||
| { | { | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | ViewLayer *sl = CTX_data_view_layer(C); | ||||
| Base *baspar, *basact = CTX_data_active_base(C); | Base *baspar, *basact = CTX_data_active_base(C); | ||||
| bool changed = false; | bool changed = false; | ||||
| if (!basact || !(basact->object->parent)) { | if (!basact || !(basact->object->parent)) { | ||||
| return 0; /* we know OBACT is valid */ | return 0; /* we know OBACT is valid */ | ||||
| } | } | ||||
| baspar = BKE_scene_layer_base_find(sl, basact->object->parent); | baspar = BKE_view_layer_base_find(sl, basact->object->parent); | ||||
| /* can be NULL if parent in other scene */ | /* can be NULL if parent in other scene */ | ||||
| if (baspar && BASE_SELECTABLE(baspar)) { | if (baspar && BASE_SELECTABLE(baspar)) { | ||||
| ED_object_base_select(baspar, BA_SELECT); | ED_object_base_select(baspar, BA_SELECT); | ||||
| ED_object_base_activate(C, baspar); | ED_object_base_activate(C, baspar); | ||||
| changed = true; | changed = true; | ||||
| } | } | ||||
| return changed; | return changed; | ||||
| ▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | static bool select_grouped_group(bContext *C, Object *ob) /* Select objects in the same group as the active */ | ||||
| } | } | ||||
| UI_popup_menu_end(C, pup); | UI_popup_menu_end(C, pup); | ||||
| return changed; /* The operator already handle this! */ | return changed; /* The operator already handle this! */ | ||||
| } | } | ||||
| static bool select_grouped_object_hooks(bContext *C, Object *ob) | static bool select_grouped_object_hooks(bContext *C, Object *ob) | ||||
| { | { | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | ViewLayer *sl = CTX_data_view_layer(C); | ||||
| bool changed = false; | bool changed = false; | ||||
| Base *base; | Base *base; | ||||
| ModifierData *md; | ModifierData *md; | ||||
| HookModifierData *hmd; | HookModifierData *hmd; | ||||
| for (md = ob->modifiers.first; md; md = md->next) { | for (md = ob->modifiers.first; md; md = md->next) { | ||||
| if (md->type == eModifierType_Hook) { | if (md->type == eModifierType_Hook) { | ||||
| hmd = (HookModifierData *) md; | hmd = (HookModifierData *) md; | ||||
| if (hmd->object && !(hmd->object->flag & SELECT)) { | if (hmd->object && !(hmd->object->flag & SELECT)) { | ||||
| base = BKE_scene_layer_base_find(sl, hmd->object); | base = BKE_view_layer_base_find(sl, hmd->object); | ||||
| if (base && (BASE_SELECTABLE(base))) { | if (base && (BASE_SELECTABLE(base))) { | ||||
| ED_object_base_select(base, BA_SELECT); | ED_object_base_select(base, BA_SELECT); | ||||
| changed = true; | changed = true; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return changed; | return changed; | ||||
| ▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | static bool select_grouped_keyingset(bContext *C, Object *UNUSED(ob), ReportList *reports) | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| return changed; | return changed; | ||||
| } | } | ||||
| static int object_select_grouped_exec(bContext *C, wmOperator *op) | static int object_select_grouped_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| Object *ob; | Object *ob; | ||||
| const int type = RNA_enum_get(op->ptr, "type"); | const int type = RNA_enum_get(op->ptr, "type"); | ||||
| bool changed = false, extend; | bool changed = false, extend; | ||||
| extend = RNA_boolean_get(op->ptr, "extend"); | extend = RNA_boolean_get(op->ptr, "extend"); | ||||
| if (extend == 0) { | if (extend == 0) { | ||||
| CTX_DATA_BEGIN (C, Base *, base, visible_bases) | CTX_DATA_BEGIN (C, Base *, base, visible_bases) | ||||
| { | { | ||||
| ED_object_base_select(base, BA_DESELECT); | ED_object_base_select(base, BA_DESELECT); | ||||
| changed = true; | changed = true; | ||||
| } | } | ||||
| CTX_DATA_END; | CTX_DATA_END; | ||||
| } | } | ||||
| ob = OBACT(sl); | ob = OBACT(view_layer); | ||||
| if (ob == NULL) { | if (ob == NULL) { | ||||
| BKE_report(op->reports, RPT_ERROR, "No active object"); | BKE_report(op->reports, RPT_ERROR, "No active object"); | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| switch (type) { | switch (type) { | ||||
| case OBJECT_GRPSEL_CHILDREN_RECURSIVE: | case OBJECT_GRPSEL_CHILDREN_RECURSIVE: | ||||
| changed |= select_grouped_children(C, ob, true); | changed |= select_grouped_children(C, ob, true); | ||||
| ▲ Show 20 Lines • Show All 182 Lines • ▼ Show 20 Lines | void OBJECT_OT_select_same_group(wmOperatorType *ot) | ||||
| RNA_def_string(ot->srna, "group", NULL, MAX_ID_NAME, "Group", "Name of the group to select"); | RNA_def_string(ot->srna, "group", NULL, MAX_ID_NAME, "Group", "Name of the group to select"); | ||||
| } | } | ||||
| /**************************** Select Mirror ****************************/ | /**************************** Select Mirror ****************************/ | ||||
| static int object_select_mirror_exec(bContext *C, wmOperator *op) | static int object_select_mirror_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| SceneLayer *sl = CTX_data_scene_layer(C); | ViewLayer *sl = CTX_data_view_layer(C); | ||||
| bool extend; | bool extend; | ||||
| extend = RNA_boolean_get(op->ptr, "extend"); | extend = RNA_boolean_get(op->ptr, "extend"); | ||||
| CTX_DATA_BEGIN (C, Base *, primbase, selected_bases) | CTX_DATA_BEGIN (C, Base *, primbase, selected_bases) | ||||
| { | { | ||||
| char name_flip[MAXBONENAME]; | char name_flip[MAXBONENAME]; | ||||
| BLI_string_flip_side_name(name_flip, primbase->object->id.name + 2, true, sizeof(name_flip)); | BLI_string_flip_side_name(name_flip, primbase->object->id.name + 2, true, sizeof(name_flip)); | ||||
| if (!STREQ(name_flip, primbase->object->id.name + 2)) { | if (!STREQ(name_flip, primbase->object->id.name + 2)) { | ||||
| Object *ob = (Object *)BKE_libblock_find_name(ID_OB, name_flip); | Object *ob = (Object *)BKE_libblock_find_name(ID_OB, name_flip); | ||||
| if (ob) { | if (ob) { | ||||
| Base *secbase = BKE_scene_layer_base_find(sl, ob); | Base *secbase = BKE_view_layer_base_find(sl, ob); | ||||
| if (secbase) { | if (secbase) { | ||||
| ED_object_base_select(secbase, BA_SELECT); | ED_object_base_select(secbase, BA_SELECT); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (extend == false) ED_object_base_select(primbase, BA_DESELECT); | if (extend == false) ED_object_base_select(primbase, BA_DESELECT); | ||||
| Show All 26 Lines | |||||
| } | } | ||||
| /** \name Select More/Less | /** \name Select More/Less | ||||
| * \{ */ | * \{ */ | ||||
| static bool object_select_more_less(bContext *C, const bool select) | static bool object_select_more_less(bContext *C, const bool select) | ||||
| { | { | ||||
| SceneLayer *scene_layer = CTX_data_scene_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| for (Base *base = scene_layer->object_bases.first; base; base = base->next) { | for (Base *base = view_layer->object_bases.first; base; base = base->next) { | ||||
| Object *ob = base->object; | Object *ob = base->object; | ||||
| ob->flag &= ~OB_DONE; | ob->flag &= ~OB_DONE; | ||||
| ob->id.tag &= ~LIB_TAG_DOIT; | ob->id.tag &= ~LIB_TAG_DOIT; | ||||
| /* parent may be in another scene */ | /* parent may be in another scene */ | ||||
| if (ob->parent) { | if (ob->parent) { | ||||
| ob->parent->flag &= ~OB_DONE; | ob->parent->flag &= ~OB_DONE; | ||||
| ob->parent->id.tag &= ~LIB_TAG_DOIT; | ob->parent->id.tag &= ~LIB_TAG_DOIT; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 144 Lines • Show Last 20 Lines | |||||