diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 4b42ea3f7..7d6cd4c8d 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -46,6 +46,16 @@ void TimelinePanel::SplitAtPlayhead() static_cast(GetTimeBasedWidget())->SplitAtPlayhead(); } +QByteArray TimelinePanel::SaveSplitterState() const +{ + return static_cast(GetTimeBasedWidget())->SaveSplitterState(); +} + +void TimelinePanel::RestoreSplitterState(const QByteArray &state) +{ + static_cast(GetTimeBasedWidget())->RestoreSplitterState(state); +} + void TimelinePanel::SelectAll() { static_cast(GetTimeBasedWidget())->SelectAll(); diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index bafc9b0d1..cf09322cb 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -39,6 +39,10 @@ public: void SplitAtPlayhead(); + QByteArray SaveSplitterState() const; + + void RestoreSplitterState(const QByteArray& state); + virtual void SelectAll() override; virtual void DeselectAll() override; diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 504293a75..e8ac028bd 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -63,9 +63,9 @@ TimelineWidget::TimelineWidget(QWidget *parent) : // Create list of TimelineViews - these MUST correspond to the ViewType enum - QSplitter* view_splitter = new QSplitter(Qt::Vertical); - view_splitter->setChildrenCollapsible(false); - vert_layout->addWidget(view_splitter); + view_splitter_ = new QSplitter(Qt::Vertical); + view_splitter_->setChildrenCollapsible(false); + vert_layout->addWidget(view_splitter_); // Video view views_.append(new TimelineAndTrackView(Qt::AlignBottom)); @@ -109,7 +109,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) : view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); view->SetSnapService(this); - view_splitter->addWidget(tview); + view_splitter_->addWidget(tview); ConnectTimelineView(view); @@ -144,7 +144,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) : } // Split viewer 50/50 - view_splitter->setSizes({INT_MAX, INT_MAX}); + view_splitter_->setSizes({INT_MAX, INT_MAX}); // FIXME: Magic number SetScale(90.0); @@ -1415,6 +1415,16 @@ void TimelineWidget::HideSnaps() } } +QByteArray TimelineWidget::SaveSplitterState() const +{ + return view_splitter_->saveState(); +} + +void TimelineWidget::RestoreSplitterState(const QByteArray &state) +{ + view_splitter_->restoreState(state); +} + void TimelineWidget::StartRubberBandSelect(bool enable_selecting, bool select_links) { drag_origin_ = QCursor::pos(); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 64bbbddb0..fbd76a47f 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -98,6 +98,10 @@ public: virtual void HideSnaps() override; + QByteArray SaveSplitterState() const; + + void RestoreSplitterState(const QByteArray& state); + signals: void SelectionChanged(const QList& selected_blocks); @@ -501,6 +505,8 @@ private: bool use_audio_time_units_; + QSplitter* view_splitter_; + int GetTrackY(const TrackReference& ref); int GetTrackHeight(const TrackReference& ref); diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 1c5f2b111..c34ee5764 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -117,8 +117,9 @@ void MainWindow::LoadLayout(const MainWindowLayoutInfo &info) FolderOpen(folder->project(), folder, true); } - foreach (Sequence* sequence, info.open_sequences()) { - OpenSequence(sequence, info.open_sequences().size() == 1); + foreach (const MainWindowLayoutInfo::OpenSequence& sequence, info.open_sequences()) { + TimelinePanel* panel = OpenSequence(sequence.sequence, info.open_sequences().size() == 1); + panel->RestoreSplitterState(sequence.panel_state); } restoreState(info.state()); @@ -136,7 +137,8 @@ MainWindowLayoutInfo MainWindow::SaveLayout() const foreach (TimelinePanel* panel, timeline_panels_) { if (panel->GetConnectedViewer()) { - info.add_sequence(static_cast(panel->GetConnectedViewer()->parent())); + info.add_sequence({static_cast(panel->GetConnectedViewer()->parent()), + panel->SaveSplitterState()}); } } @@ -145,13 +147,13 @@ MainWindowLayoutInfo MainWindow::SaveLayout() const return info; } -void MainWindow::OpenSequence(Sequence *sequence, bool enable_focus) +TimelinePanel* MainWindow::OpenSequence(Sequence *sequence, bool enable_focus) { // See if this sequence is already open, and switch to it if so foreach (TimelinePanel* tl, timeline_panels_) { if (tl->GetConnectedViewer() == sequence->viewer_output()) { tl->raise(); - return; + return tl; } } @@ -170,6 +172,8 @@ void MainWindow::OpenSequence(Sequence *sequence, bool enable_focus) if (enable_focus) { TimelineFocused(sequence->viewer_output()); } + + return panel; } void MainWindow::CloseSequence(Sequence *sequence) @@ -354,7 +358,7 @@ void MainWindow::SetApplicationProgressStatus(ProgressStatus status) taskbar_interface_->SetProgressState(reinterpret_cast(this->winId()), TBPF_NORMAL); break; case kProgressNone: - taskbar_interface_->SetProgressState(reinterpret_cast(this->winId()), TBPF_NOPROGRESS); + taskbar_interface_->SetProgressState(reinterpret_ cast(this->winId()), TBPF_NOPROGRESS); break; case kProgressError: taskbar_interface_->SetProgressState(reinterpret_cast(this->winId()), TBPF_ERROR); diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index f06b8c0fe..923a8f1b6 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -60,7 +60,7 @@ public: MainWindowLayoutInfo SaveLayout() const; - void OpenSequence(Sequence* sequence, bool enable_focus = true); + TimelinePanel *OpenSequence(Sequence* sequence, bool enable_focus = true); void CloseSequence(Sequence* sequence); diff --git a/app/window/mainwindow/mainwindowlayoutinfo.cpp b/app/window/mainwindow/mainwindowlayoutinfo.cpp index 168978f79..0b75a957f 100644 --- a/app/window/mainwindow/mainwindowlayoutinfo.cpp +++ b/app/window/mainwindow/mainwindowlayoutinfo.cpp @@ -17,9 +17,12 @@ void MainWindowLayoutInfo::toXml(QXmlStreamWriter *writer) const writer->writeStartElement(QStringLiteral("timeline")); - foreach (Sequence* sequence, open_sequences_) { + foreach (const OpenSequence& sequence, open_sequences_) { writer->writeTextElement(QStringLiteral("sequence"), - QString::number(reinterpret_cast(sequence))); + QString::number(reinterpret_cast(sequence.sequence))); + + writer->writeTextElement(QStringLiteral("state"), + QString(sequence.panel_state.toBase64())); } writer->writeEndElement(); // timeline @@ -52,20 +55,25 @@ MainWindowLayoutInfo MainWindowLayoutInfo::fromXml(QXmlStreamReader *reader, XML } else if (reader->name() == QStringLiteral("timeline")) { + Sequence* open_seq = nullptr; + QByteArray tl_state; + while (XMLReadNextStartElement(reader)) { if (reader->name() == QStringLiteral("sequence")) { quintptr item_id = reader->readElementText().toULongLong(); - Sequence* open_seq = dynamic_cast(xml_data.item_ptrs.value(item_id)); - - if (open_seq) { - info.open_sequences_.append(open_seq); - } + open_seq = dynamic_cast(xml_data.item_ptrs.value(item_id)); + } else if (reader->name() == QStringLiteral("state")) { + tl_state = QByteArray::fromBase64(reader->readElementText().toUtf8()); } else { reader->skipCurrentElement(); } } + if (open_seq) { + info.open_sequences_.append({open_seq, tl_state}); + } + } else if (reader->name() == QStringLiteral("state")) { info.state_ = QByteArray::fromBase64(reader->readElementText().toLatin1()); @@ -83,9 +91,9 @@ void MainWindowLayoutInfo::add_folder(olive::Folder *f) open_folders_.append(f); } -void MainWindowLayoutInfo::add_sequence(Sequence *s) +void MainWindowLayoutInfo::add_sequence(const OpenSequence &seq) { - open_sequences_.append(s); + open_sequences_.append(seq); } void MainWindowLayoutInfo::set_state(const QByteArray &layout) diff --git a/app/window/mainwindow/mainwindowlayoutinfo.h b/app/window/mainwindow/mainwindowlayoutinfo.h index 5f76cbc2b..59f357935 100644 --- a/app/window/mainwindow/mainwindowlayoutinfo.h +++ b/app/window/mainwindow/mainwindowlayoutinfo.h @@ -17,7 +17,12 @@ public: void add_folder(Folder* f); - void add_sequence(Sequence* s); + struct OpenSequence { + Sequence* sequence; + QByteArray panel_state; + }; + + void add_sequence(const OpenSequence& seq); void set_state(const QByteArray& layout); @@ -26,7 +31,7 @@ public: return open_folders_; } - const QList& open_sequences() const + const QList& open_sequences() const { return open_sequences_; } @@ -41,7 +46,7 @@ private: QList open_folders_; - QList open_sequences_; + QList open_sequences_; };