diff --git a/src/app/GUI/mainwindow.cpp b/src/app/GUI/mainwindow.cpp index a26d2c18c..388fcb488 100644 --- a/src/app/GUI/mainwindow.cpp +++ b/src/app/GUI/mainwindow.cpp @@ -86,6 +86,7 @@ MainWindow::MainWindow(Document& document, const QString &openProject, QWidget * const parent) : QMainWindow(parent) + , mShutdown(false) , mWelcomeDialog(nullptr) //, mCentralWidget(nullptr) , mStackWidget(nullptr) @@ -138,6 +139,7 @@ MainWindow::MainWindow(Document& document, , mAutoSaveTimer(nullptr) , mAboutWidget(nullptr) , mAboutWindow(nullptr) + , mViewTimelineAct(nullptr) , mTimelineWindow(nullptr) , mTimelineWindowAct(nullptr) , mRenderWindow(nullptr) @@ -422,6 +424,7 @@ MainWindow::MainWindow(Document& document, MainWindow::~MainWindow() { + mShutdown = true; std::cout << "Closing Friction, please wait ... " << std::endl; if (mAutoSaveTimer->isActive()) { mAutoSaveTimer->stop(); } writeSettings(); @@ -1009,14 +1012,14 @@ void MainWindow::setupMenuBar() else { showNormal(); } }); - const auto viewTimelineAct = mViewMenu->addAction(tr("View Timeline")); - viewTimelineAct->setCheckable(true); - viewTimelineAct->setChecked(true); - viewTimelineAct->setShortcut(QKeySequence(Qt::Key_T)); - connect(viewTimelineAct, &QAction::triggered, + mViewTimelineAct = mViewMenu->addAction(tr("View Timeline")); + mViewTimelineAct->setCheckable(true); + mViewTimelineAct->setChecked(true); + mViewTimelineAct->setShortcut(QKeySequence(Qt::Key_T)); + connect(mViewTimelineAct, &QAction::triggered, this, [this](bool triggered) { if (mTimelineWindowAct->isChecked()) { - openTimelineWindow(); + mViewTimelineAct->setChecked(true); // ignore if window } else { mUI->setDockVisible(tr("Timeline"), triggered); } @@ -1026,12 +1029,9 @@ void MainWindow::setupMenuBar() mTimelineWindowAct->setCheckable(true); connect(mTimelineWindowAct, &QAction::triggered, this, [this](bool triggered) { - if (!triggered) { - mUI->addDockWidget(tr("Timeline"), mTimeline); - mTimelineWindow->deleteLater(); - } else { - openTimelineWindow(); - } + if (mShutdown) { return; } + if (!triggered) { mTimelineWindow->close(); } + else { openTimelineWindow(); } AppSupport::setSettings("ui", "TimelineWindow", triggered); @@ -1041,14 +1041,9 @@ void MainWindow::setupMenuBar() mRenderWindowAct->setCheckable(true); connect(mRenderWindowAct, &QAction::triggered, this, [this](bool triggered) { - if (!triggered) { - mTabQueueIndex = mTabProperties->addTab(mRenderWidget, - QIcon::fromTheme("render_animation"), - tr("Queue")); - mRenderWindow->deleteLater(); - } else { - openRenderQueueWindow(); - } + if (mShutdown) { return; } + if (!triggered) { mRenderWindow->close(); } + else { openRenderQueueWindow(); } AppSupport::setSettings("ui", "RenderWindow", triggered); @@ -1234,28 +1229,57 @@ void MainWindow::openTimelineWindow() true, true, true); - mUI->setDockVisible(tr("Timeline"), false); + connect(mTimelineWindow, &Window::closed, + this, [this]() { + if (mShutdown) { return; } + closedTimelineWindow(); + }); + } else { + mTimelineWindow->addWidget(mTimeline); } + mTimelineWindowAct->setChecked(true); + mUI->setDockVisible(tr("Timeline"), false); mTimelineWindow->focusWindow(); } -void MainWindow::openRenderQueueWindow(const bool &focus) +void MainWindow::closedTimelineWindow() +{ + mTimelineWindowAct->setChecked(false); + mUI->addDockWidget(tr("Timeline"), mTimeline); +} + +void MainWindow::openRenderQueueWindow() { + mRenderWindowAct->setChecked(true); + mTabProperties->removeTab(mTabQueueIndex); + mRenderWidget->setVisible(true); if (!mRenderWindow) { - mTabProperties->removeTab(mTabQueueIndex); - mRenderWidget->setVisible(true); mRenderWindow = new Window(this, mRenderWidget, tr("Renderer"), QString("RenderWindow"), - focus, + true, true, false); + connect(mRenderWindow, &Window::closed, + this, [this]() { + if (mShutdown) { return; } + closedRenderQueueWindow(); + }); + } else { + mRenderWindow->addWidget(mRenderWidget); } - if (!focus) { return; } mRenderWindow->focusWindow(); } +void MainWindow::closedRenderQueueWindow() +{ + mRenderWindowAct->setChecked(false); + mTabQueueIndex = mTabProperties->addTab(mRenderWidget, + QIcon::fromTheme("render_animation"), + tr("Queue")); +} + void MainWindow::openWelcomeDialog() { mStackWidget->setCurrentIndex(mStackIndexWelcome); @@ -1648,7 +1672,7 @@ void MainWindow::readSettings(const QString &openProject) mRenderWindowAct->blockSignals(false); if (isTimelineWindow) { openTimelineWindow(); } - if (isRenderWindow) { openRenderQueueWindow(false); } + if (isRenderWindow) { openRenderQueueWindow(); } if (isFull) { showFullScreen(); } else if (isMax) { showMaximized(); } diff --git a/src/app/GUI/mainwindow.h b/src/app/GUI/mainwindow.h index f3236bf3e..b45c715c3 100644 --- a/src/app/GUI/mainwindow.h +++ b/src/app/GUI/mainwindow.h @@ -199,6 +199,7 @@ class MainWindow : public QMainWindow void showEvent(QShowEvent *e); private: + bool mShutdown; QWidget *mWelcomeDialog; //CentralWidget *mCentralWidget; QStackedWidget *mStackWidget; @@ -396,13 +397,16 @@ class MainWindow : public QMainWindow Window *mAboutWindow; void openAboutWindow(); + QAction *mViewTimelineAct; Window *mTimelineWindow; QAction *mTimelineWindowAct; void openTimelineWindow(); + void closedTimelineWindow(); Window *mRenderWindow; QAction *mRenderWindowAct; - void openRenderQueueWindow(const bool &focus = true); + void openRenderQueueWindow(); + void closedRenderQueueWindow(); protected: void keyPressEvent(QKeyEvent *event); diff --git a/src/app/GUI/window.cpp b/src/app/GUI/window.cpp index 5eb6c7ebd..98eafe95a 100644 --- a/src/app/GUI/window.cpp +++ b/src/app/GUI/window.cpp @@ -25,7 +25,6 @@ #include "appsupport.h" #include -#include #include #include "mainwindow.h" @@ -38,6 +37,7 @@ Window::Window(QWidget *parent, bool blockEscKey, bool forwardKeys) : QDialog(parent) + , mLayout(nullptr) , mBlockEscKey(blockEscKey) , mForwardKeys(forwardKeys) { @@ -51,7 +51,7 @@ Window::Window(QWidget *parent, setObjectName(id); setContentsMargins(0, 0, 0, 0); - QVBoxLayout *mLayout = new QVBoxLayout(this); + mLayout = new QVBoxLayout(this); mLayout->setMargin(0); mLayout->addWidget(child); @@ -69,6 +69,12 @@ void Window::focusWindow() if (windowHandle()) { windowHandle()->requestActivate(); } } +void Window::addWidget(QWidget *child) +{ + if (!child) { return; } + mLayout->addWidget(child); +} + void Window::keyPressEvent(QKeyEvent *event) { if (mForwardKeys) { @@ -82,6 +88,7 @@ void Window::closeEvent(QCloseEvent *event) { qDebug() << "closed window" << objectName(); saveState(); + emit closed(); QDialog::closeEvent(event); } diff --git a/src/app/GUI/window.h b/src/app/GUI/window.h index 4f8e882e8..aa9aea72c 100644 --- a/src/app/GUI/window.h +++ b/src/app/GUI/window.h @@ -25,6 +25,7 @@ #define WINDOW_H #include +#include #include #include @@ -42,12 +43,17 @@ class Window : public QDialog bool forwardKeys = false); ~Window(); void focusWindow(); + void addWidget(QWidget *child); + +signals: + void closed(); protected: void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; private: + QVBoxLayout *mLayout; void loadState(bool visible = true); void saveState(); bool mBlockEscKey;