diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index c14287d17..7b6912b77 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -309,9 +309,11 @@ void Track::Retranslate() void Track::SetIndex(const int &index) { + int old = index_; + index_ = index; - emit IndexChanged(index); + emit IndexChanged(old, index_); } Block *Track::BlockContainingTime(const rational &time) const diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index 1f0a47144..94b745963 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -388,7 +388,7 @@ signals: /** * @brief Signal emitted when the index has changed */ - void IndexChanged(int i); + void IndexChanged(int old, int now); /** * @brief Signal emitted when preview (waveform) has changed and UI should be updated diff --git a/app/widget/timebased/timebasedview.h b/app/widget/timebased/timebasedview.h index f39615ec3..ef02a12b2 100644 --- a/app/widget/timebased/timebasedview.h +++ b/app/widget/timebased/timebasedview.h @@ -98,6 +98,12 @@ protected: y_axis_enabled_ = e; } +protected slots: + /** + * @brief Slot called whenever the view resizes or the scene contents change to enforce minimum scene sizes + */ + void UpdateSceneRect(); + private: qreal GetPlayheadX(); @@ -121,12 +127,6 @@ private: double y_scale_; -private slots: - /** - * @brief Slot called whenever the view resizes or the scene contents change to enforce minimum scene sizes - */ - void UpdateSceneRect(); - }; } diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 065c731a7..5bcc0c15b 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -882,6 +882,7 @@ void TimelineWidget::AddTrack(Track *track) } connect(track, &Track::IndexChanged, this, &TimelineWidget::TrackUpdated); + connect(track, &Track::IndexChanged, this, &TimelineWidget::TrackIndexChanged); connect(track, &Track::PreviewChanged, this, &TimelineWidget::TrackUpdated); connect(track, &Track::BlocksRefreshed, this, &TimelineWidget::TrackUpdated); connect(track, &Track::TrackHeightChangedInPixels, this, &TimelineWidget::TrackUpdated); @@ -892,12 +893,15 @@ void TimelineWidget::AddTrack(Track *track) void TimelineWidget::RemoveTrack(Track *track) { disconnect(track, &Track::IndexChanged, this, &TimelineWidget::TrackUpdated); + disconnect(track, &Track::IndexChanged, this, &TimelineWidget::TrackIndexChanged); disconnect(track, &Track::PreviewChanged, this, &TimelineWidget::TrackUpdated); disconnect(track, &Track::BlocksRefreshed, this, &TimelineWidget::TrackUpdated); disconnect(track, &Track::TrackHeightChangedInPixels, this, &TimelineWidget::TrackUpdated); disconnect(track, &Track::BlockAdded, this, &TimelineWidget::AddBlock); disconnect(track, &Track::BlockRemoved, this, &TimelineWidget::RemoveBlock); + RemoveSelection(TimeRange(0, RATIONAL_MAX), track->ToReference()); + foreach (Block* b, track->Blocks()) { RemoveBlock(b); } @@ -1060,6 +1064,19 @@ void TimelineWidget::SampleRateChanged() UpdateViewTimebases(); } +void TimelineWidget::TrackIndexChanged(int old, int now) +{ + Track* track = static_cast(sender()); + + Track::Reference old_ref(track->type(), old); + Track::Reference new_ref(track->type(), now); + + auto track_selections = selections_.take(old_ref); + if (!track_selections.isEmpty()) { + selections_.insert(new_ref, track_selections); + } +} + void TimelineWidget::AddGhost(TimelineViewGhostItem *ghost) { ghost_items_.append(ghost); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index c45eb24e5..322a77213 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -351,6 +351,8 @@ private slots: void SampleRateChanged(); + void TrackIndexChanged(int old, int now); + }; } diff --git a/app/widget/timelinewidget/trackview/trackviewitem.cpp b/app/widget/timelinewidget/trackview/trackviewitem.cpp index 7186fcda0..ee721cb38 100644 --- a/app/widget/timelinewidget/trackview/trackviewitem.cpp +++ b/app/widget/timelinewidget/trackview/trackviewitem.cpp @@ -42,6 +42,7 @@ TrackViewItem::TrackViewItem(Track* track, QWidget *parent) : label_ = new ClickableLabel(); connect(label_, &ClickableLabel::MouseDoubleClicked, this, &TrackViewItem::LabelClicked); connect(track_, &Track::LabelChanged, this, &TrackViewItem::UpdateLabel); + connect(track_, &Track::IndexChanged, this, &TrackViewItem::UpdateLabel); UpdateLabel(); stack_->addWidget(label_); diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 71a5030cd..2b2a24dbc 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -533,7 +533,15 @@ void TimelineView::SetScrollCoordinates(const QPoint &pt) void TimelineView::ConnectTrackList(TrackList *list) { + if (connected_track_list_) { + disconnect(connected_track_list_, &TrackList::TrackListChanged, this, &TimelineView::TrackListChanged); + } + connected_track_list_ = list; + + if (connected_track_list_) { + connect(connected_track_list_, &TrackList::TrackListChanged, this, &TimelineView::TrackListChanged); + } } void TimelineView::SetBeamCursor(const TimelineCoordinate &coord) @@ -589,4 +597,10 @@ void TimelineView::UserSetTime(const int64_t &time) emit TimeChanged(time); } +void TimelineView::TrackListChanged() +{ + UpdateSceneRect(); + viewport()->update(); +} + } diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index fce5a9ed9..ae0794290 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -141,6 +141,9 @@ private: bool show_waveforms_; +private slots: + void TrackListChanged(); + }; }