// Copyright Epic Games, Inc. All Rights Reserved. #include "MVVM/Views/SSequencerOutlinerView.h" #include "MVVM/Views/SOutlinerViewRow.h" #include "MVVM/Extensions/IOutlinerExtension.h" #include "MVVM/ViewModels/OutlinerSpacer.h" #include "MVVM/ViewModels/OutlinerViewModel.h" #include "MVVM/Views/SOutlinerItemViewBase.h" #include "SequencerCoreFwd.h" #include "Styling/StyleColors.h" namespace UE::Sequencer { class SSequencerOutlinerViewRow : public SOutlinerViewRow { public: void Construct(const FArguments& InArgs, const TSharedRef& OwnerTableView, TWeakViewModelPtr InWeakModel, TWeakPtr InWeakOutliner) { WeakOutliner = InWeakOutliner; SOutlinerViewRow::Construct(InArgs, OwnerTableView, InWeakModel); } virtual const FSlateBrush* GetBorder() const override { const bool bEvenEntryIndex = (IndexInList % 2 == 0); TSharedPtr Outliner = WeakOutliner.Pin(); TViewModelPtr OutlinerItem = WeakModel.Pin(); if (!Outliner || !OutlinerItem) { return SOutlinerViewRow::GetBorder(); } // If selected or highlighted, early out and return the default selected or highlighted border if (IsSelected() || IsHighlighted()) { return SOutlinerViewRow::GetBorder(); } EOutlinerSelectionState SelectionState = OutlinerItem->GetSelectionState(); if (EnumHasAnyFlags(SelectionState, EOutlinerSelectionState::SelectedDirectly)) { return &Style->ActiveBrush; } // If keys or the track area are selected, highlight this track row if (EnumHasAnyFlags(SelectionState, EOutlinerSelectionState::HasSelectedKeys | EOutlinerSelectionState::HasSelectedTrackAreaItems | EOutlinerSelectionState::DescendentHasSelectedTrackAreaItems | EOutlinerSelectionState::DescendentHasSelectedKeys)) { return IsHovered() ? (bEvenEntryIndex ? &Style->EvenRowBackgroundHoveredBrush : &Style->OddRowBackgroundHoveredBrush) : &Style->ActiveHighlightedBrush; } // If this is at the root level, return it as a parent row if (GetIndentLevel() == 0 && !OutlinerItem.AsModel()->IsA()) { return IsHovered() ? &Style->ParentRowBackgroundHoveredBrush : &Style->ParentRowBackgroundBrush; } return SOutlinerViewRow::GetBorder(); } private: TWeakPtr WeakOutliner; }; TSharedRef SSequencerOutlinerView::OnGenerateRow(TWeakViewModelPtr InWeakModel, const TSharedRef& OwnerTable) { TSharedRef Row = SNew(SSequencerOutlinerViewRow, OwnerTable, InWeakModel, WeakOutliner) .OnDetectDrag(this, &SSequencerOutlinerView::OnDragRow) .OnGetColumnVisibility(this, &SSequencerOutlinerView::IsColumnVisible) .OnGenerateWidgetForColumn(this, &SSequencerOutlinerView::GenerateWidgetForColumn); if (TViewModelPtr ViewModel = InWeakModel.Pin()) { CreateTrackLanesForRow(Row, ViewModel); } return Row; } } // namespace UE::Sequencer