Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_outliner/outliner_sync.cc
| Show First 20 Lines • Show All 280 Lines • ▼ Show 20 Lines | static void outliner_select_sync_to_pose_bone(TreeElement *te, | ||||
| /* Tag if selection changed */ | /* Tag if selection changed */ | ||||
| if (bone_flag != pchan->bone->flag) { | if (bone_flag != pchan->bone->flag) { | ||||
| DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); | DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); | ||||
| WM_main_add_notifier(NC_OBJECT | ND_BONE_SELECT, ob); | WM_main_add_notifier(NC_OBJECT | ND_BONE_SELECT, ob); | ||||
| } | } | ||||
| } | } | ||||
| static void outliner_select_sync_to_sequence(Scene *scene, TreeStoreElem *tselem) | static void outliner_select_sync_to_sequence(VideoEdit *video_edit, TreeStoreElem *tselem) | ||||
| { | { | ||||
| Sequence *seq = (Sequence *)tselem->id; | Sequence *seq = (Sequence *)tselem->id; | ||||
| if (tselem->flag & TSE_ACTIVE) { | if (tselem->flag & TSE_ACTIVE) { | ||||
| SEQ_select_active_set(scene, seq); | SEQ_select_active_set(video_edit, seq); | ||||
| } | } | ||||
| if (tselem->flag & TSE_SELECTED) { | if (tselem->flag & TSE_SELECTED) { | ||||
| seq->flag |= SELECT; | seq->flag |= SELECT; | ||||
| } | } | ||||
| else { | else { | ||||
| seq->flag &= ~SELECT; | seq->flag &= ~SELECT; | ||||
| } | } | ||||
| } | } | ||||
| /** Sync select and active flags from outliner to active view layer, bones, and sequencer. */ | /** Sync select and active flags from outliner to active view layer, bones, and sequencer. */ | ||||
| static void outliner_sync_selection_from_outliner(Scene *scene, | static void outliner_sync_selection_from_outliner(Scene *scene, | ||||
| ViewLayer *view_layer, | ViewLayer *view_layer, | ||||
| VideoEdit *video_edit, | |||||
| ListBase *tree, | ListBase *tree, | ||||
| const SyncSelectTypes *sync_types, | const SyncSelectTypes *sync_types, | ||||
| SelectedItems *selected_items) | SelectedItems *selected_items) | ||||
| { | { | ||||
| LISTBASE_FOREACH (TreeElement *, te, tree) { | LISTBASE_FOREACH (TreeElement *, te, tree) { | ||||
| TreeStoreElem *tselem = TREESTORE(te); | TreeStoreElem *tselem = TREESTORE(te); | ||||
| Show All 10 Lines | LISTBASE_FOREACH (TreeElement *, te, tree) { | ||||
| } | } | ||||
| else if (tselem->type == TSE_POSE_CHANNEL) { | else if (tselem->type == TSE_POSE_CHANNEL) { | ||||
| if (sync_types->pose_bone) { | if (sync_types->pose_bone) { | ||||
| outliner_select_sync_to_pose_bone(te, tselem, selected_items->pose_bones); | outliner_select_sync_to_pose_bone(te, tselem, selected_items->pose_bones); | ||||
| } | } | ||||
| } | } | ||||
| else if (tselem->type == TSE_SEQUENCE) { | else if (tselem->type == TSE_SEQUENCE) { | ||||
| if (sync_types->sequence) { | if (sync_types->sequence) { | ||||
| outliner_select_sync_to_sequence(scene, tselem); | outliner_select_sync_to_sequence(video_edit, tselem); | ||||
| } | } | ||||
| } | } | ||||
| outliner_sync_selection_from_outliner( | outliner_sync_selection_from_outliner( | ||||
| scene, view_layer, &te->subtree, sync_types, selected_items); | scene, view_layer, video_edit, &te->subtree, sync_types, selected_items); | ||||
| } | } | ||||
| } | } | ||||
| } // namespace blender::ed::outliner | } // namespace blender::ed::outliner | ||||
| void ED_outliner_select_sync_from_outliner(bContext *C, SpaceOutliner *space_outliner) | void ED_outliner_select_sync_from_outliner(bContext *C, SpaceOutliner *space_outliner) | ||||
| { | { | ||||
| using namespace blender::ed::outliner; | using namespace blender::ed::outliner; | ||||
| /* Don't sync if not checked or in certain outliner display modes */ | /* Don't sync if not checked or in certain outliner display modes */ | ||||
| if (!(space_outliner->flag & SO_SYNC_SELECT) || ELEM(space_outliner->outlinevis, | if (!(space_outliner->flag & SO_SYNC_SELECT) || ELEM(space_outliner->outlinevis, | ||||
| SO_LIBRARIES, | SO_LIBRARIES, | ||||
| SO_OVERRIDES_LIBRARY, | SO_OVERRIDES_LIBRARY, | ||||
| SO_DATA_API, | SO_DATA_API, | ||||
| SO_ID_ORPHANS)) { | SO_ID_ORPHANS)) { | ||||
| return; | return; | ||||
| } | } | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| ViewLayer *view_layer = CTX_data_view_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| VideoEdit *video_edit = CTX_data_video_edit(C); | |||||
| SyncSelectTypes sync_types; | SyncSelectTypes sync_types; | ||||
| outliner_sync_select_from_outliner_set_types(C, space_outliner, &sync_types); | outliner_sync_select_from_outliner_set_types(C, space_outliner, &sync_types); | ||||
| /* To store elements that have been selected to prevent linked object sync errors */ | /* To store elements that have been selected to prevent linked object sync errors */ | ||||
| SelectedItems selected_items; | SelectedItems selected_items; | ||||
| selected_items_init(&selected_items); | selected_items_init(&selected_items); | ||||
| outliner_sync_selection_from_outliner( | outliner_sync_selection_from_outliner( | ||||
| scene, view_layer, &space_outliner->tree, &sync_types, &selected_items); | scene, view_layer, video_edit, &space_outliner->tree, &sync_types, &selected_items); | ||||
| selected_items_free(&selected_items); | selected_items_free(&selected_items); | ||||
| /* Tag for updates and clear dirty flag to prevent a sync to the outliner on draw. */ | /* Tag for updates and clear dirty flag to prevent a sync to the outliner on draw. */ | ||||
| if (sync_types.object) { | if (sync_types.object) { | ||||
| space_outliner->sync_select_dirty &= ~WM_OUTLINER_SYNC_SELECT_FROM_OBJECT; | space_outliner->sync_select_dirty &= ~WM_OUTLINER_SYNC_SELECT_FROM_OBJECT; | ||||
| DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); | DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); | WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); | ||||
| ▲ Show 20 Lines • Show All 153 Lines • ▼ Show 20 Lines | static void outliner_sync_selection_to_outliner(const Scene *scene, | ||||
| } | } | ||||
| } | } | ||||
| /* Get active data from context */ | /* Get active data from context */ | ||||
| static void get_sync_select_active_data(const bContext *C, SyncSelectActiveData *active_data) | static void get_sync_select_active_data(const bContext *C, SyncSelectActiveData *active_data) | ||||
| { | { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| ViewLayer *view_layer = CTX_data_view_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| VideoEdit *video_edit = CTX_data_video_edit(C); | |||||
| BKE_view_layer_synced_ensure(scene, view_layer); | BKE_view_layer_synced_ensure(scene, view_layer); | ||||
| active_data->object = BKE_view_layer_active_object_get(view_layer); | active_data->object = BKE_view_layer_active_object_get(view_layer); | ||||
| active_data->edit_bone = CTX_data_active_bone(C); | active_data->edit_bone = CTX_data_active_bone(C); | ||||
| active_data->pose_channel = CTX_data_active_pose_bone(C); | active_data->pose_channel = CTX_data_active_pose_bone(C); | ||||
| active_data->sequence = SEQ_select_active_get(scene); | active_data->sequence = SEQ_select_active_get(video_edit); | ||||
| } | } | ||||
| void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner) | void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner) | ||||
| { | { | ||||
| /* Set which types of data to sync from sync dirty flag and outliner display mode */ | /* Set which types of data to sync from sync dirty flag and outliner display mode */ | ||||
| SyncSelectTypes sync_types; | SyncSelectTypes sync_types; | ||||
| const bool sync_required = outliner_sync_select_to_outliner_set_types( | const bool sync_required = outliner_sync_select_to_outliner_set_types( | ||||
| C, space_outliner, &sync_types); | C, space_outliner, &sync_types); | ||||
| Show All 29 Lines | |||||