diff --git a/src/MainWindow/main_window.h b/src/MainWindow/main_window.h index 89dd0bdd5..85ad199e8 100644 --- a/src/MainWindow/main_window.h +++ b/src/MainWindow/main_window.h @@ -69,7 +69,7 @@ class MainWindow : public QMainWindow, public TopLevelInterface { void newProjectDlg(); void openProjectDialog(const QString& dir = QString{}); void openExampleProject(); - bool closeProject(bool force = false); + bool closeProject(bool force = false, bool skipWelcomePage = false); void openFileSlot(); void openFilePath(const QString& filePath); void newDesignCreated(const QString& design); diff --git a/src/MainWindow/main_window_ql.cpp b/src/MainWindow/main_window_ql.cpp index 787068d23..b0e00b1d3 100644 --- a/src/MainWindow/main_window_ql.cpp +++ b/src/MainWindow/main_window_ql.cpp @@ -230,13 +230,16 @@ MainWindow::MainWindow(Session* session) this, &MainWindow::onDesignFilesChanged); connect(DesignFileWatcher::Instance(), &DesignFileWatcher::designCreated, this, &MainWindow::onDesignCreated); - +#ifndef UPSTREAM_PINPLANNER + connect(DesignFileWatcher::Instance(), &DesignFileWatcher::designFileContentChanged, + TaskStatusWatcher::Instance(), &TaskStatusWatcher::onDesignFilesChanged); connect(TaskStatusWatcher::Instance(), &TaskStatusWatcher::synthSucceeded, this, [this](){ if (m_pinAssignmentCreator) { m_pinAssignmentCreator->forceNextPcfFileCheck(); } refreshPinPlanner(); }); +#endif } void MainWindow::Tcl_NewProject(int argc, const char* argv[]) { @@ -294,7 +297,7 @@ void MainWindow::newFile() { } void MainWindow::newProjectDlg() { - if (!closeProject()) return; + if (!closeProject(/*force*/false, /*skipWelcomePage*/true)) return; newProjdialog->Reset(); newProjdialog->open(); } @@ -349,21 +352,30 @@ void MainWindow::openProjectDialog(const QString& dir) { if (!fileName.isEmpty()) openProject(fileName, false, false); } -bool MainWindow::closeProject(bool force) { +bool MainWindow::closeProject(bool force, bool skipWelcomePage) { if (m_projectManager && m_projectManager->HasDesign()) { if (!force && !confirmCloseProject()) { return false; } + + TaskStatusWatcher::Instance()->reset(); GlobalSession->CmdLine()->Clear(); CompilerOpenFPGA_ql* compiler_ql = static_cast(m_compiler); if (compiler_ql) { compiler_ql->CleanScripts(); } + forceStopCompilation(); Project::Instance()->InitProject(); newProjdialog->Reset(); CloseOpenedTabs(); - m_showWelcomePage ? showWelcomePage() : ReShowWindow({}); + + if (skipWelcomePage) { + ReShowWindow({}); + } else { + m_showWelcomePage ? showWelcomePage() : ReShowWindow({}); + } + setStatusAndProgressText(QString{}); if (m_taskManager) { m_taskManager->reset(); @@ -535,6 +547,10 @@ void MainWindow::openProject(const QString& project, bool delayedOpen, return; } + if (!closeProject(/*force*/false, /*skipWelcomePage*/true)) { + return; + } + ReShowWindow(project); loadFile(project); emit projectOpened(); @@ -545,12 +561,6 @@ void MainWindow::openProject(const QString& project, bool delayedOpen, showMessagesTab(); showReportsTab(); - GlobalSession->CmdLine()->Clear(); - CompilerOpenFPGA_ql* compiler_ql = static_cast(m_compiler); - if (compiler_ql) { - compiler_ql->CleanScripts(); - } - if (run) startProject(false); setStatusAndProgressText(QString{}); } @@ -774,9 +784,6 @@ void MainWindow::popRecentSetting() { void MainWindow::onDesignFilesChanged() { QString msg = "Design files changed. Recompile might be needed."; setStatusAndProgressText(msg); -#ifndef UPSTREAM_PINPLANNER - TaskStatusWatcher::Instance()->onDesignFilesChanged(); -#endif } void MainWindow::onDesignCreated() { diff --git a/src/NewProject/ProjectManager/DesignFileWatcher.cpp b/src/NewProject/ProjectManager/DesignFileWatcher.cpp index 8f026b7d4..6c1e71191 100644 --- a/src/NewProject/ProjectManager/DesignFileWatcher.cpp +++ b/src/NewProject/ProjectManager/DesignFileWatcher.cpp @@ -41,6 +41,11 @@ void DesignFileWatcher::init() { m_fileWatcher = new QFileSystemWatcher{}; QObject::connect(m_fileWatcher, &QFileSystemWatcher::fileChanged, this, &DesignFileWatcher::designFilesChanged); + + // The signal designFileContentChanged notifies explicitly on design file content changes. + // Note: designFilesChanged cannot be used because it also notifies on the setFiles event. + QObject::connect(m_fileWatcher, &QFileSystemWatcher::fileChanged, this, + &DesignFileWatcher::designFileContentChanged); } void DesignFileWatcher::emitDesignCreated() { emit designCreated(); } diff --git a/src/NewProject/ProjectManager/DesignFileWatcher.h b/src/NewProject/ProjectManager/DesignFileWatcher.h index 1c02bae97..d8438500d 100644 --- a/src/NewProject/ProjectManager/DesignFileWatcher.h +++ b/src/NewProject/ProjectManager/DesignFileWatcher.h @@ -37,6 +37,7 @@ class DesignFileWatcher : public QObject { signals: void designFilesChanged(); + void designFileContentChanged(); void designCreated(); private: diff --git a/src/NewProject/ProjectManager/TaskStatusWatcher.cpp b/src/NewProject/ProjectManager/TaskStatusWatcher.cpp index 36a224e8b..9a5420b3f 100644 --- a/src/NewProject/ProjectManager/TaskStatusWatcher.cpp +++ b/src/NewProject/ProjectManager/TaskStatusWatcher.cpp @@ -24,12 +24,8 @@ void TaskStatusWatcher::onTaskDone(uint taskId, TaskStatus status) void TaskStatusWatcher::onDesignFilesChanged() { - if (!m_isDesignChangedFirstTime) { - m_isSynthResultDirty = true; - emit synthResultDirty(); - } else { - m_isDesignChangedFirstTime = false; - } + m_isSynthResultDirty = true; + emit synthResultDirty(); } } // namespace FOEDAG diff --git a/src/NewProject/ProjectManager/TaskStatusWatcher.h b/src/NewProject/ProjectManager/TaskStatusWatcher.h index 7864e6e55..a2ac37bec 100644 --- a/src/NewProject/ProjectManager/TaskStatusWatcher.h +++ b/src/NewProject/ProjectManager/TaskStatusWatcher.h @@ -12,6 +12,7 @@ class TaskStatusWatcher : public QObject { public: static TaskStatusWatcher *Instance(); + void reset() { m_isSynthResultDirty = false; } bool isSynthResultDirty() const { return m_isSynthResultDirty; } signals: @@ -25,7 +26,6 @@ public slots: private: bool m_isSynthResultDirty = false; - bool m_isDesignChangedFirstTime = true; // when initially project is loaded it emit signal about design files change, we want to skip this event }; } // namespace FOEDAG