project/timeline: save timeline tracklist state in project file

This commit is contained in:
itsmattkc
2020-07-08 19:19:32 +10:00
parent af69f157a3
commit 8e75432304
8 changed files with 71 additions and 24 deletions
+10
View File
@@ -46,6 +46,16 @@ void TimelinePanel::SplitAtPlayhead()
static_cast<TimelineWidget*>(GetTimeBasedWidget())->SplitAtPlayhead();
}
QByteArray TimelinePanel::SaveSplitterState() const
{
return static_cast<TimelineWidget*>(GetTimeBasedWidget())->SaveSplitterState();
}
void TimelinePanel::RestoreSplitterState(const QByteArray &state)
{
static_cast<TimelineWidget*>(GetTimeBasedWidget())->RestoreSplitterState(state);
}
void TimelinePanel::SelectAll()
{
static_cast<TimelineWidget*>(GetTimeBasedWidget())->SelectAll();
+4
View File
@@ -39,6 +39,10 @@ public:
void SplitAtPlayhead();
QByteArray SaveSplitterState() const;
void RestoreSplitterState(const QByteArray& state);
virtual void SelectAll() override;
virtual void DeselectAll() override;
+15 -5
View File
@@ -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();
@@ -98,6 +98,10 @@ public:
virtual void HideSnaps() override;
QByteArray SaveSplitterState() const;
void RestoreSplitterState(const QByteArray& state);
signals:
void SelectionChanged(const QList<Block*>& 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);
+10 -6
View File
@@ -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<Sequence*>(panel->GetConnectedViewer()->parent()));
info.add_sequence({static_cast<Sequence*>(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<HWND>(this->winId()), TBPF_NORMAL);
break;
case kProgressNone:
taskbar_interface_->SetProgressState(reinterpret_cast<HWND>(this->winId()), TBPF_NOPROGRESS);
taskbar_interface_->SetProgressState(reinterpret_ cast<HWND>(this->winId()), TBPF_NOPROGRESS);
break;
case kProgressError:
taskbar_interface_->SetProgressState(reinterpret_cast<HWND>(this->winId()), TBPF_ERROR);
+1 -1
View File
@@ -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);
+17 -9
View File
@@ -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<quintptr>(sequence)));
QString::number(reinterpret_cast<quintptr>(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<Sequence*>(xml_data.item_ptrs.value(item_id));
if (open_seq) {
info.open_sequences_.append(open_seq);
}
open_seq = dynamic_cast<Sequence*>(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)
+8 -3
View File
@@ -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<Sequence*>& open_sequences() const
const QList<OpenSequence>& open_sequences() const
{
return open_sequences_;
}
@@ -41,7 +46,7 @@ private:
QList<Folder*> open_folders_;
QList<Sequence*> open_sequences_;
QList<OpenSequence> open_sequences_;
};