mainwindow/project: implemented saving/restoring panel state to project file
This commit is contained in:
@@ -33,6 +33,7 @@ class Node;
|
||||
class NodeParam;
|
||||
class NodeInput;
|
||||
class NodeOutput;
|
||||
class Item;
|
||||
|
||||
#define XMLAttributeLoop(reader, item) \
|
||||
QXmlStreamAttributes __attributes = reader->attributes(); \
|
||||
@@ -61,6 +62,7 @@ struct XMLNodeData {
|
||||
QHash<quintptr, StreamPtr> footage_ptrs;
|
||||
QList<FootageConnection> footage_connections;
|
||||
QList<BlockLink> block_links;
|
||||
QHash<quintptr, Item*> item_ptrs;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -99,6 +99,11 @@ void ProjectPanel::set_project(Project *p)
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex ProjectPanel::get_root_index() const
|
||||
{
|
||||
return explorer_->get_root_index();
|
||||
}
|
||||
|
||||
void ProjectPanel::set_root(Item *item)
|
||||
{
|
||||
explorer_->set_root(item);
|
||||
@@ -161,7 +166,7 @@ void ProjectPanel::Edit(Item* item)
|
||||
|
||||
void ProjectPanel::Retranslate()
|
||||
{
|
||||
if (explorer_->root_index().isValid()) {
|
||||
if (explorer_->get_root_index().isValid()) {
|
||||
SetTitle(tr("Folder"));
|
||||
} else {
|
||||
SetTitle(tr("Project"));
|
||||
@@ -198,10 +203,10 @@ void ProjectPanel::UpdateSubtitle()
|
||||
if (project()) {
|
||||
QString project_title = QStringLiteral("[*]%1").arg(project()->name());
|
||||
|
||||
if (explorer_->root_index().isValid()) {
|
||||
if (explorer_->get_root_index().isValid()) {
|
||||
QString folder_path;
|
||||
|
||||
Item* item = static_cast<Item*>(explorer_->root_index().internalPointer());
|
||||
Item* item = static_cast<Item*>(explorer_->get_root_index().internalPointer());
|
||||
|
||||
do {
|
||||
folder_path.prepend(QStringLiteral("/%1").arg(item->name()));
|
||||
|
||||
@@ -40,6 +40,8 @@ public:
|
||||
Project* project() const;
|
||||
void set_project(Project* p);
|
||||
|
||||
QModelIndex get_root_index() const;
|
||||
|
||||
void set_root(Item* item);
|
||||
|
||||
QList<Item*> SelectedItems() const;
|
||||
|
||||
@@ -51,6 +51,8 @@ void Folder::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const QA
|
||||
|
||||
if (attr.name() == QStringLiteral("name")) {
|
||||
set_name(attr.value().toString());
|
||||
} else if (attr.name() == QStringLiteral("ptr")) {
|
||||
xml_node_data.item_ptrs.insert(attr.value().toULongLong(), this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,9 +81,11 @@ void Folder::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const QA
|
||||
|
||||
void Folder::Save(QXmlStreamWriter *writer) const
|
||||
{
|
||||
writer->writeStartElement("folder");
|
||||
writer->writeStartElement(QStringLiteral("folder"));
|
||||
|
||||
writer->writeAttribute("name", name());
|
||||
writer->writeAttribute(QStringLiteral("name"), name());
|
||||
|
||||
writer->writeAttribute(QStringLiteral("ptr"), QString::number(reinterpret_cast<quintptr>(this)));
|
||||
|
||||
foreach (ItemPtr child, children()) {
|
||||
child->Save(writer);
|
||||
|
||||
@@ -51,10 +51,10 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const
|
||||
return;
|
||||
}
|
||||
|
||||
if (attr.name() == "name") {
|
||||
if (attr.name() == QStringLiteral("name")) {
|
||||
set_name(attr.value().toString());
|
||||
|
||||
// Currently the only thing we care about
|
||||
} else if (attr.name() == QStringLiteral("ptr")) {
|
||||
xml_node_data.item_ptrs.insert(attr.value().toULongLong(), this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,22 +137,24 @@ void Sequence::Load(QXmlStreamReader *reader, XMLNodeData& xml_node_data, const
|
||||
|
||||
void Sequence::Save(QXmlStreamWriter *writer) const
|
||||
{
|
||||
writer->writeStartElement("sequence");
|
||||
writer->writeStartElement(QStringLiteral("sequence"));
|
||||
|
||||
writer->writeAttribute("name", name());
|
||||
writer->writeAttribute(QStringLiteral("name"), name());
|
||||
|
||||
writer->writeStartElement("video");
|
||||
writer->writeAttribute(QStringLiteral("ptr"), QString::number(reinterpret_cast<quintptr>(viewer_output_)));
|
||||
|
||||
writer->writeTextElement("width", QString::number(video_params().width()));
|
||||
writer->writeTextElement("height", QString::number(video_params().height()));
|
||||
writer->writeTextElement("timebase", video_params().time_base().toString());
|
||||
writer->writeStartElement(QStringLiteral("video"));
|
||||
|
||||
writer->writeTextElement(QStringLiteral("width"), QString::number(video_params().width()));
|
||||
writer->writeTextElement(QStringLiteral("height"), QString::number(video_params().height()));
|
||||
writer->writeTextElement(QStringLiteral("timebase"), video_params().time_base().toString());
|
||||
|
||||
writer->writeEndElement(); // video
|
||||
|
||||
writer->writeStartElement("audio");
|
||||
writer->writeStartElement(QStringLiteral("audio"));
|
||||
|
||||
writer->writeTextElement("rate", QString::number(audio_params().sample_rate()));
|
||||
writer->writeTextElement("layout", QString::number(audio_params().channel_layout()));
|
||||
writer->writeTextElement(QStringLiteral("rate"), QString::number(audio_params().sample_rate()));
|
||||
writer->writeTextElement(QStringLiteral("layout"), QString::number(audio_params().channel_layout()));
|
||||
|
||||
writer->writeEndElement(); // audio
|
||||
|
||||
@@ -165,7 +167,7 @@ void Sequence::Save(QXmlStreamWriter *writer) const
|
||||
}
|
||||
}
|
||||
|
||||
viewer_output_->Save(writer, "viewer");
|
||||
viewer_output_->Save(writer, QStringLiteral("viewer"));
|
||||
|
||||
writer->writeEndElement(); // sequence
|
||||
}
|
||||
|
||||
@@ -60,6 +60,10 @@ void Project::Load(QXmlStreamReader *reader, const QAtomicInt* cancelled)
|
||||
}
|
||||
}
|
||||
|
||||
} else if (reader->name() == QStringLiteral("layout")) {
|
||||
|
||||
Core::instance()->main_window()->LoadLayout(reader, xml_node_data);
|
||||
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
@@ -88,6 +92,9 @@ void Project::Save(QXmlStreamWriter *writer) const
|
||||
|
||||
writer->writeEndElement(); // colormanagement
|
||||
|
||||
// Save main window project layout
|
||||
Core::instance()->main_window()->SaveLayout(writer);
|
||||
|
||||
writer->writeEndElement(); // project
|
||||
}
|
||||
|
||||
|
||||
@@ -357,7 +357,7 @@ void ProjectExplorer::set_project(Project *p)
|
||||
model_.set_project(p);
|
||||
}
|
||||
|
||||
QModelIndex ProjectExplorer::root_index() const
|
||||
QModelIndex ProjectExplorer::get_root_index() const
|
||||
{
|
||||
return tree_view_->rootIndex();
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
Project* project() const;
|
||||
void set_project(Project* p);
|
||||
|
||||
QModelIndex root_index() const;
|
||||
QModelIndex get_root_index() const;
|
||||
|
||||
void set_root(Item* item);
|
||||
|
||||
|
||||
@@ -112,6 +112,42 @@ MainWindow::~MainWindow()
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWindow::LoadLayout(QXmlStreamReader *reader, XMLNodeData &xml_data)
|
||||
{
|
||||
QMetaObject::invokeMethod(this,
|
||||
"LoadLayoutInternal",
|
||||
Qt::BlockingQueuedConnection,
|
||||
Q_ARG(QXmlStreamReader*, reader),
|
||||
Q_ARG(XMLNodeData*, &xml_data));
|
||||
}
|
||||
|
||||
void MainWindow::SaveLayout(QXmlStreamWriter *writer) const
|
||||
{
|
||||
writer->writeStartElement(QStringLiteral("layout"));
|
||||
|
||||
writer->writeStartElement(QStringLiteral("folders"));
|
||||
|
||||
foreach (ProjectPanel* panel, folder_panels_) {
|
||||
writer->writeTextElement(QStringLiteral("folder"),
|
||||
QString::number(reinterpret_cast<quintptr>(panel->get_root_index().internalPointer())));
|
||||
}
|
||||
|
||||
writer->writeEndElement(); // folders
|
||||
|
||||
writer->writeStartElement(QStringLiteral("timeline"));
|
||||
|
||||
foreach (TimelinePanel* panel, timeline_panels_) {
|
||||
writer->writeTextElement(QStringLiteral("sequence"),
|
||||
QString::number(reinterpret_cast<quintptr>(panel->GetConnectedViewer())));
|
||||
}
|
||||
|
||||
writer->writeEndElement(); // timeline
|
||||
|
||||
writer->writeTextElement(QStringLiteral("state"), QString(saveState().toBase64()));
|
||||
|
||||
writer->writeEndElement(); // layout
|
||||
}
|
||||
|
||||
void MainWindow::OpenSequence(Sequence *sequence)
|
||||
{
|
||||
// See if this sequence is already open, and switch to it if so
|
||||
@@ -372,6 +408,53 @@ void MainWindow::FolderCloseRequested()
|
||||
panel->deleteLater();
|
||||
}
|
||||
|
||||
void MainWindow::LoadLayoutInternal(QXmlStreamReader *reader, XMLNodeData *xml_data)
|
||||
{
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("folders")) {
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("folder")) {
|
||||
quintptr item_id = reader->readElementText().toULongLong();
|
||||
|
||||
Item* open_item = xml_data->item_ptrs.value(item_id);
|
||||
|
||||
if (open_item) {
|
||||
FolderOpen(open_item->project(), open_item, true);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
} else if (reader->name() == QStringLiteral("timeline")) {
|
||||
|
||||
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) {
|
||||
OpenSequence(open_seq);
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
|
||||
} else if (reader->name() == QStringLiteral("state")) {
|
||||
|
||||
QByteArray state = QByteArray::fromBase64(reader->readElementText().toLatin1());
|
||||
|
||||
restoreState(state);
|
||||
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TimelinePanel* MainWindow::AppendTimelinePanel()
|
||||
{
|
||||
TimelinePanel* panel = AppendPanelInternal<TimelinePanel>(timeline_panels_);
|
||||
|
||||
@@ -53,6 +53,10 @@ public:
|
||||
|
||||
virtual ~MainWindow() override;
|
||||
|
||||
void LoadLayout(QXmlStreamReader* reader, XMLNodeData& xml_data);
|
||||
|
||||
void SaveLayout(QXmlStreamWriter* writer) const;
|
||||
|
||||
void OpenSequence(Sequence* sequence);
|
||||
|
||||
void CloseSequence(Sequence* sequence);
|
||||
@@ -135,6 +139,8 @@ private slots:
|
||||
|
||||
void FolderCloseRequested();
|
||||
|
||||
void LoadLayoutInternal(QXmlStreamReader* reader, XMLNodeData *xml_data);
|
||||
|
||||
};
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
Reference in New Issue
Block a user