project: improved main window layout loading
There were a lot of issues that arose from trying to make GUI changes from another thread (even though we ran those functions in the right thread). Now we store layout information until the end of the load and make the changes then. This works much better from both a business logic and user experience perspective. Also prevents multiple sequences from taking focus during load and starting a render job.
This commit is contained in:
@@ -111,43 +111,37 @@ MainWindow::~MainWindow()
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWindow::LoadLayout(QXmlStreamReader *reader, XMLNodeData &xml_data)
|
||||
void MainWindow::LoadLayout(const MainWindowLayoutInfo &info)
|
||||
{
|
||||
QMetaObject::invokeMethod(this,
|
||||
"LoadLayoutInternal",
|
||||
Qt::BlockingQueuedConnection,
|
||||
Q_ARG(QXmlStreamReader*, reader),
|
||||
Q_ARG(XMLNodeData*, &xml_data));
|
||||
foreach (Folder* folder, info.open_folders()) {
|
||||
FolderOpen(folder->project(), folder, true);
|
||||
}
|
||||
|
||||
foreach (Sequence* sequence, info.open_sequences()) {
|
||||
OpenSequence(sequence, false);
|
||||
}
|
||||
|
||||
restoreState(info.state());
|
||||
}
|
||||
|
||||
void MainWindow::SaveLayout(QXmlStreamWriter *writer) const
|
||||
MainWindowLayoutInfo MainWindow::SaveLayout() const
|
||||
{
|
||||
writer->writeStartElement(QStringLiteral("layout"));
|
||||
|
||||
writer->writeStartElement(QStringLiteral("folders"));
|
||||
MainWindowLayoutInfo info;
|
||||
|
||||
foreach (ProjectPanel* panel, folder_panels_) {
|
||||
writer->writeTextElement(QStringLiteral("folder"),
|
||||
QString::number(reinterpret_cast<quintptr>(panel->get_root_index().internalPointer())));
|
||||
info.add_folder(static_cast<Folder*>(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())));
|
||||
info.add_sequence(static_cast<Sequence*>(panel->GetConnectedViewer()->parent()));
|
||||
}
|
||||
|
||||
writer->writeEndElement(); // timeline
|
||||
info.set_state(saveState());
|
||||
|
||||
writer->writeTextElement(QStringLiteral("state"), QString(saveState().toBase64()));
|
||||
|
||||
writer->writeEndElement(); // layout
|
||||
return info;
|
||||
}
|
||||
|
||||
void MainWindow::OpenSequence(Sequence *sequence)
|
||||
void 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_) {
|
||||
@@ -164,11 +158,14 @@ void MainWindow::OpenSequence(Sequence *sequence)
|
||||
panel = timeline_panels_.first();
|
||||
} else {
|
||||
panel = AppendTimelinePanel();
|
||||
enable_focus = false;
|
||||
}
|
||||
|
||||
panel->ConnectViewerNode(sequence->viewer_output());
|
||||
|
||||
TimelineFocused(sequence->viewer_output());
|
||||
if (enable_focus) {
|
||||
TimelineFocused(sequence->viewer_output());
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::CloseSequence(Sequence *sequence)
|
||||
@@ -467,53 +464,6 @@ void MainWindow::FloatingPanelCloseRequested()
|
||||
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_);
|
||||
|
||||
Reference in New Issue
Block a user