project/timeline: save timeline tracklist state in project file
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -39,6 +39,10 @@ public:
|
||||
|
||||
void SplitAtPlayhead();
|
||||
|
||||
QByteArray SaveSplitterState() const;
|
||||
|
||||
void RestoreSplitterState(const QByteArray& state);
|
||||
|
||||
virtual void SelectAll() override;
|
||||
|
||||
virtual void DeselectAll() override;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 +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)
|
||||
|
||||
@@ -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_;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user