diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index f662e1d2..5614caab 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -42,7 +42,7 @@ std::shared_ptr Application::create( std::string startupProjectFilePath = ApplicationSettings::getInstance()->getStartupProjectFilePath(); if (startupProjectFilePath.size()) { - MessageLoadProject(startupProjectFilePath).dispatch(); + MessageLoadProject(startupProjectFilePath, false).dispatch(); ptr->m_mainView->hideStartScreen(); } @@ -73,7 +73,7 @@ Application::~Application() m_mainView->saveLayout(); } -void Application::loadProject(const FilePath& projectSettingsFilePath) +void Application::loadProject(const FilePath& projectSettingsFilePath, bool forceRefresh) { MessageStatus("Loading Project: " + projectSettingsFilePath.str()).dispatch(); @@ -88,7 +88,7 @@ void Application::loadProject(const FilePath& projectSettingsFilePath) m_componentManager->refreshViews(); m_project = Project::create(m_storageCache.get()); - m_project->loadProject(projectSettingsFilePath); + m_project->load(projectSettingsFilePath, forceRefresh); m_mainView->updateRecentProjectMenu(); m_mainView->hideStartScreen(); @@ -101,12 +101,12 @@ void Application::refreshProject() m_storageCache->clear(); m_componentManager->refreshViews(); - m_project->reloadProject(); + m_project->reload(); } void Application::saveProject(const FilePath& projectSettingsFilePath) { - if (!m_project->saveProject(projectSettingsFilePath)) + if (!m_project->save(projectSettingsFilePath)) { LOG_ERROR("No Project Settings File defined"); } @@ -138,7 +138,7 @@ void Application::handleMessage(MessageFinishedParsing* message) void Application::handleMessage(MessageLoadProject* message) { - loadProject(message->projectSettingsFilePath); + loadProject(message->projectSettingsFilePath, message->forceRefresh); } void Application::handleMessage(MessageRefresh* message) diff --git a/src/lib/Application.h b/src/lib/Application.h index 7fec3f6a..4869157a 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -32,7 +32,7 @@ public: ~Application(); - void loadProject(const FilePath& projectSettingsFilePath); + void loadProject(const FilePath& projectSettingsFilePath, bool forceRefresh); void refreshProject(); void saveProject(const FilePath& projectSettingsFilePath); diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp index 5ab24869..4b45a4f1 100644 --- a/src/lib/Project.cpp +++ b/src/lib/Project.cpp @@ -25,7 +25,7 @@ Project::~Project() { } -bool Project::loadProject(const FilePath& projectSettingsFile) +bool Project::load(const FilePath& projectSettingsFile, bool forceRefresh) { bool success = ProjectSettings::getInstance()->load(projectSettingsFile); if (success) @@ -34,6 +34,12 @@ bool Project::loadProject(const FilePath& projectSettingsFile) updateFileManager(); } + if (forceRefresh) + { + clearStorage(); + m_storageWasLoaded = false; + } + if (m_storageWasLoaded) { m_storage->startParsing(); @@ -50,7 +56,7 @@ bool Project::loadProject(const FilePath& projectSettingsFile) return success; } -bool Project::saveProject(const FilePath& projectSettingsFile) +bool Project::save(const FilePath& projectSettingsFile) { if (!projectSettingsFile.empty()) { @@ -69,7 +75,7 @@ bool Project::saveProject(const FilePath& projectSettingsFile) return true; } -void Project::reloadProject() +void Project::reload() { if (!m_projectSettingsFilepath.empty()) { diff --git a/src/lib/Project.h b/src/lib/Project.h index 96a9fe93..0aaa3ed0 100644 --- a/src/lib/Project.h +++ b/src/lib/Project.h @@ -17,9 +17,9 @@ public: ~Project(); - bool loadProject(const FilePath& projectSettingsFile); - bool saveProject(const FilePath& projectSettingsFile); - void reloadProject(); + bool load(const FilePath& projectSettingsFile, bool forceRefresh); + bool save(const FilePath& projectSettingsFile); + void reload(); void clearStorage(); diff --git a/src/lib/utility/messaging/type/MessageLoadProject.h b/src/lib/utility/messaging/type/MessageLoadProject.h index 2b6c8e08..8c9e4acb 100644 --- a/src/lib/utility/messaging/type/MessageLoadProject.h +++ b/src/lib/utility/messaging/type/MessageLoadProject.h @@ -6,8 +6,9 @@ class MessageLoadProject: public Message { public: - MessageLoadProject(const std::string& filePath) + MessageLoadProject(const std::string& filePath, bool forceRefresh) : projectSettingsFilePath(filePath) + , forceRefresh(forceRefresh) { } @@ -18,10 +19,11 @@ public: virtual void print(std::ostream& os) const { - os << projectSettingsFilePath; + os << projectSettingsFilePath << ", forceRefresh: " << std::boolalpha << forceRefresh; } const std::string projectSettingsFilePath; + const bool forceRefresh; }; #endif // MESSAGE_LOAD_PROJECT_H diff --git a/src/lib/utility/utility.h b/src/lib/utility/utility.h index 810d84e6..d707da0b 100644 --- a/src/lib/utility/utility.h +++ b/src/lib/utility/utility.h @@ -1,6 +1,7 @@ #ifndef UTILITY_H #define UTILITY_H +#include #include #include #include @@ -35,6 +36,12 @@ namespace utility template std::vector toStrings(const std::vector& d); + template + bool isPermutation(const std::vector& a, const std::vector& b) + { + return std::is_permutation(a.begin(), a.end(), b.begin()); + } + bool intersectionPoint(Vec2f a1, Vec2f b1, Vec2f a2, Vec2f b2, Vec2f* i); size_t digits(size_t n); diff --git a/src/lib_gui/qt/commandline/QtCommandLineParser.cpp b/src/lib_gui/qt/commandline/QtCommandLineParser.cpp index 0ebf5b98..376efd11 100644 --- a/src/lib_gui/qt/commandline/QtCommandLineParser.cpp +++ b/src/lib_gui/qt/commandline/QtCommandLineParser.cpp @@ -58,7 +58,7 @@ void QtCommandLineParser::parseCommandline() if(isValidProjectfile) { - MessageLoadProject(projectfile.str()).dispatch(); + MessageLoadProject(projectfile.str(), false).dispatch(); } else { diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index dd993527..31b21bbb 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -382,7 +382,7 @@ void QtMainWindow::openProject(const QString &path) if (!fileName.isEmpty()) { - MessageLoadProject(fileName.toStdString()).dispatch(); + MessageLoadProject(fileName.toStdString(), false).dispatch(); clearWindows(); } } diff --git a/src/lib_gui/qt/window/QtProjectSetupScreen.cpp b/src/lib_gui/qt/window/QtProjectSetupScreen.cpp index 0e89cd0a..60e672b1 100644 --- a/src/lib_gui/qt/window/QtProjectSetupScreen.cpp +++ b/src/lib_gui/qt/window/QtProjectSetupScreen.cpp @@ -7,6 +7,7 @@ #include #include "utility/messaging/type/MessageLoadProject.h" +#include "utility/utility.h" #include "settings/ProjectSettings.h" @@ -43,6 +44,11 @@ void QtTextLine::setText(QString text) m_data->setText(text); } +void QtTextLine::clearText() +{ + m_data->clear(); +} + void QtTextLine::handleButtonPress() { QString file = QFileDialog::getExistingDirectory(this, tr("Select Directory"), ""); @@ -66,8 +72,12 @@ QSize QtProjectSetupScreen::sizeHint() const void QtProjectSetupScreen::clear() { - m_projectName->setText(""); - m_projectFileLocation->setText(""); + m_projectName->clear(); + m_projectFileLocation->clearText(); + + m_language->setCurrentIndex(0); + m_cppStandard->setCurrentIndex(0); + m_cStandard->setCurrentIndex(0); m_sourcePaths->clear(); m_includePaths->clear(); @@ -95,8 +105,7 @@ void QtProjectSetupScreen::loadEmpty() updateTitle("NEW PROJECT"); updateDoneButton("Create"); - m_cppStandard->setCurrentIndex(0); - m_cStandard->setCurrentIndex(0); + clear(); } void QtProjectSetupScreen::loadProjectSettings() @@ -238,45 +247,53 @@ void QtProjectSetupScreen::handleUpdateButtonPress() return; } - ProjectSettings* projSettings = ProjectSettings::getInstance().get(); - projSettings->clear(); + std::shared_ptr projectSettings = ProjectSettings::getInstance(); - projSettings->setLanguage(m_language->currentText().toStdString()); + std::string newLanguage = m_language->currentText().toStdString(); + + std::string newStandard = ""; if (m_cppStandard->isVisible()) { - projSettings->setStandard(m_cppStandard->currentText().toStdString()); + newStandard = m_cppStandard->currentText().toStdString(); } else if (m_cStandard->isVisible()) { - projSettings->setStandard(m_cStandard->currentText().toStdString()); - } - projSettings->setSourcePaths(m_sourcePaths->getList()); - projSettings->setHeaderSearchPaths(m_includePaths->getList()); - - if (m_frameworkPaths) - { - projSettings->setFrameworkSearchPaths(m_frameworkPaths->getList()); + newStandard = m_cStandard->currentText().toStdString(); } - std::string projectFile = + std::vector newSourcePaths = m_sourcePaths->getList(); + std::vector newHeaderSearchPaths = m_includePaths->getList(); + std::vector newFrameworkPaths = m_frameworkPaths ? m_frameworkPaths->getList() : std::vector(); + + bool somethingChanged = !( + newLanguage == projectSettings->getLanguage() && + newStandard == projectSettings->getStandard() && + utility::isPermutation(newSourcePaths, projectSettings->getSourcePaths()) && + utility::isPermutation(newHeaderSearchPaths, projectSettings->getHeaderSearchPaths()) && + utility::isPermutation(newFrameworkPaths, projectSettings->getFrameworkSearchPaths()) + ); + + projectSettings->clear(); + projectSettings->setLanguage(newLanguage); + projectSettings->setStandard(newStandard); + projectSettings->setSourcePaths(newSourcePaths); + projectSettings->setHeaderSearchPaths(newHeaderSearchPaths); + projectSettings->setFrameworkSearchPaths(newFrameworkPaths); + + std::string projectFilePath = m_projectFileLocation->getText().toStdString() + "/" + m_projectName->text().toStdString() + ".coatiproject"; - projSettings->save(projectFile); - projSettings->setLanguage(m_language->currentText().toStdString()); + projectSettings->save(projectFilePath); - if (m_cppStandard->isVisible()) + if (m_title->text() == "NEW PROJECT") { - projSettings->setStandard(m_cppStandard->currentText().toStdString()); + MessageLoadProject(projectFilePath, false).dispatch(); } - else if (m_cStandard->isVisible()) + else if (somethingChanged) { - projSettings->setStandard(m_cStandard->currentText().toStdString()); + MessageLoadProject(projectFilePath, true).dispatch(); } - - MessageLoadProject(projectFile).dispatch(); - clear(); - emit finished(); } diff --git a/src/lib_gui/qt/window/QtProjectSetupScreen.h b/src/lib_gui/qt/window/QtProjectSetupScreen.h index 0b97b980..b8c9e333 100644 --- a/src/lib_gui/qt/window/QtProjectSetupScreen.h +++ b/src/lib_gui/qt/window/QtProjectSetupScreen.h @@ -20,6 +20,7 @@ public: QtTextLine(QWidget *parent); QString getText(); void setText(QString text); + void clearText(); private slots: void handleButtonPress(); diff --git a/src/lib_gui/qt/window/QtStartScreen.cpp b/src/lib_gui/qt/window/QtStartScreen.cpp index 0838c23d..640b5504 100644 --- a/src/lib_gui/qt/window/QtStartScreen.cpp +++ b/src/lib_gui/qt/window/QtStartScreen.cpp @@ -22,7 +22,7 @@ QtRecentProjectButton::QtRecentProjectButton(const QString &text, QWidget *paren void QtRecentProjectButton::handleButtonClick() { - MessageLoadProject(m_projectFile).dispatch(); + MessageLoadProject(m_projectFile, false).dispatch(); }; QtStartScreen::QtStartScreen(QWidget *parent)