From 2009b7526a52f66b52fa518ef17146cdd86c69e4 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 9 Jul 2014 15:22:41 +0200 Subject: [PATCH] ui: load project via MenuBar This change adds a MenuBar to QtMainWindow and adds an action for opening a different project settings XML file. The message MessageLoadProject is thereon used to load a new project in the Application and clearing the Storage. --- src/app/main.cpp | 2 +- src/app/qt/element/QtMainWindow.cpp | 69 +++++++++++++++++-- src/app/qt/element/QtMainWindow.h | 7 ++ src/lib/Application.cpp | 13 +++- src/lib/Application.h | 8 ++- src/lib/CMakeLists.txt | 2 + src/lib/data/Storage.cpp | 35 ++++++---- src/lib/data/Storage.h | 9 ++- src/lib/data/graph/Graph.cpp | 6 ++ src/lib/data/graph/Graph.h | 2 + .../data/location/TokenLocationCollection.cpp | 6 ++ .../data/location/TokenLocationCollection.h | 2 + .../messaging/type/MessageLoadProject.h | 22 ++++++ 13 files changed, 156 insertions(+), 27 deletions(-) create mode 100644 src/lib/utility/messaging/type/MessageLoadProject.h diff --git a/src/app/main.cpp b/src/app/main.cpp index c6d5d76f..33f4855c 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -12,7 +12,7 @@ int main(int argc, char *argv[]) QtGuiFactory guiFactory; std::shared_ptr app = Application::create(&guiFactory); - app->loadProject(); + app->loadProject("data/ProjectSettings.xml"); return qtApp.exec(); } diff --git a/src/app/qt/element/QtMainWindow.cpp b/src/app/qt/element/QtMainWindow.cpp index d4ff4cef..006b4d99 100644 --- a/src/app/qt/element/QtMainWindow.cpp +++ b/src/app/qt/element/QtMainWindow.cpp @@ -1,26 +1,69 @@ #include "qt/element/QtMainWindow.h" +#include + +#include +#include #include +#include +#include #include "component/view/View.h" #include "qt/QtWidgetWrapper.h" +#include "utility/messaging/type/MessageLoadProject.h" QtMainWindow::QtMainWindow() { setObjectName("QtMainWindow"); setCentralWidget(nullptr); + + setupProjectMenu(); + setupHelpMenu(); } QtMainWindow::~QtMainWindow() { } +void QtMainWindow::about() +{ + QMessageBox::about( + this, + tr("About"), + tr( + "Developed by:\n\n" + "Manuel Dobusch\n" + "Eberhard Gräther\n" + "Malte Langkabel\n" + "Victoria Pfausler\n" + "Andreas Stallinger\n" + ) + ); +} + +void QtMainWindow::openProject(const QString &path) +{ + QString fileName = path; + + if (fileName.isNull()) + { + fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", "XML Files (*.xml)"); + } + + if (!fileName.isEmpty()) + { + std::cout << fileName.toStdString() << std::endl; + MessageLoadProject message(fileName.toStdString()); + message.dispatch(); + } +} + void QtMainWindow::addView(View* view) { - QDockWidget* dock = new QDockWidget(tr(view->getName().c_str()), this); - dock->setWidget(QtWidgetWrapper::getWidgetOfView(view)); - addDockWidget(Qt::TopDockWidgetArea, dock); - m_dockWidgets.push_back(std::make_pair(view, dock)); + QDockWidget* dock = new QDockWidget(tr(view->getName().c_str()), this); + dock->setWidget(QtWidgetWrapper::getWidgetOfView(view)); + addDockWidget(Qt::TopDockWidgetArea, dock); + m_dockWidgets.push_back(std::make_pair(view, dock)); } void QtMainWindow::removeView(View* view) @@ -35,3 +78,21 @@ void QtMainWindow::removeView(View* view) } } } + +void QtMainWindow::setupProjectMenu() +{ + QMenu *fileMenu = new QMenu(tr("&Project"), this); + menuBar()->addMenu(fileMenu); + + fileMenu->addAction(tr("&Open..."), this, SLOT(openProject()), QKeySequence::Open); + fileMenu->addAction(tr("E&xit"), QCoreApplication::instance(), SLOT(quit()), QKeySequence::Quit); +} + +void QtMainWindow::setupHelpMenu() +{ + QMenu *helpMenu = new QMenu(tr("&Help"), this); + menuBar()->addMenu(helpMenu); + + helpMenu->addAction(tr("&About"), this, SLOT(about())); + helpMenu->addAction(tr("About &Qt"), QCoreApplication::instance(), SLOT(aboutQt())); +} diff --git a/src/app/qt/element/QtMainWindow.h b/src/app/qt/element/QtMainWindow.h index 0034562f..3a360443 100644 --- a/src/app/qt/element/QtMainWindow.h +++ b/src/app/qt/element/QtMainWindow.h @@ -20,7 +20,14 @@ public: void addView(View* view); void removeView(View* view); +public slots: + void about(); + void openProject(const QString &path = QString()); + private: + void setupProjectMenu(); + void setupHelpMenu(); + std::vector > m_dockWidgets; }; diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 44ef05d5..403ecdd2 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -23,6 +23,8 @@ std::shared_ptr Application::create(GuiFactory* guiFactory) ptr->m_componentManager = ComponentManager::create(guiFactory, ptr->m_mainView.get(), ptr->m_storage, ptr->m_storage); + ptr->m_componentManager->setup(); + return ptr; } @@ -36,14 +38,19 @@ Application::~Application() MessageQueue::getInstance()->stopMessageLoop(); } -void Application::loadProject() +void Application::loadProject(const std::string& projectSettingsFilePath) { - m_componentManager->setup(); + m_storage->clear(); m_project = Project::create(m_storage); - m_project->loadProjectSettings("data/ProjectSettings.xml"); + m_project->loadProjectSettings(projectSettingsFilePath); m_project->parseCode(); MessageActivateToken message(1); message.dispatch(); } + +void Application::handleMessage(MessageLoadProject* message) +{ + loadProject(message->projectSettingsFilePath); +} diff --git a/src/lib/Application.h b/src/lib/Application.h index 77588a50..a4f68f01 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -5,23 +5,27 @@ #include "component/ComponentManager.h" #include "Project.h" +#include "utility/messaging/MessageListener.h" +#include "utility/messaging/type/MessageLoadProject.h" class GuiFactory; class MainView; class Storage; -class Application +class Application: public MessageListener { public: static std::shared_ptr create(GuiFactory* guiFactory); ~Application(); - void loadProject(); + void loadProject(const std::string& projectSettingsFilePath); private: Application(); + virtual void handleMessage(MessageLoadProject* message); + std::shared_ptr m_project; std::shared_ptr m_storage; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 9035567f..8ad62f54 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -130,6 +130,8 @@ add_files( utility/math/VectorBase.h utility/messaging/type/MessageActivateToken.h + utility/messaging/type/MessageFinishedParsing.h + utility/messaging/type/MessageLoadProject.h utility/messaging/Message.h utility/messaging/MessageBase.h diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index c7751603..4ed811d2 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -18,6 +18,27 @@ Storage::~Storage() { } +void Storage::clear() +{ + m_graph.clear(); + m_locationCollection.clear(); +} + +void Storage::logGraph() const +{ + std::stringstream str; + str << "\n" << m_graph; + LOG_INFO(str.str()); +} + +void Storage::logLocations() const +{ + std::stringstream str; + str << "\n" << m_locationCollection; + LOG_INFO(str.str()); +} + + void Storage::onTypedefParsed( const ParseLocation& location, const std::string& fullName, const std::string& underlyingFullName, AccessType access @@ -188,20 +209,6 @@ void Storage::onCallParsed(const ParseLocation& location, const std::string& cal addTokenLocation(edge, location); } -void Storage::logGraph() const -{ - std::stringstream str; - str << "\n" << m_graph; - LOG_INFO(str.str()); -} - -void Storage::logLocations() const -{ - std::stringstream str; - str << "\n" << m_locationCollection; - LOG_INFO(str.str()); -} - Id Storage::getIdForNodeWithName(const std::string& name) const { diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index 87ceb5f8..c2c32fcd 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -19,6 +19,12 @@ public: Storage(); virtual ~Storage(); + void clear(); + + void logGraph() const; + void logLocations() const; + + // ParserClient implementation virtual void onTypedefParsed( const ParseLocation& location, const std::string& fullName, const std::string& underlyingFullName, AccessType access @@ -47,9 +53,6 @@ public: virtual void onCallParsed( const ParseLocation& location, const std::string& callerName, const std::string& calleeName); - void logGraph() const; - void logLocations() const; - // GraphAccess implementation virtual Id getIdForNodeWithName(const std::string& name) const; virtual std::string getNameForNodeWithId(Id id) const; diff --git a/src/lib/data/graph/Graph.cpp b/src/lib/data/graph/Graph.cpp index dc8f6cfc..768db2cd 100644 --- a/src/lib/data/graph/Graph.cpp +++ b/src/lib/data/graph/Graph.cpp @@ -223,6 +223,12 @@ void Graph::forEachToken(std::function func) const forEachEdge(func); } +void Graph::clear() +{ + m_edges.clear(); + m_nodes.clear(); +} + const std::vector >& Graph::getNodes() const { return m_nodes; diff --git a/src/lib/data/graph/Graph.h b/src/lib/data/graph/Graph.h index f178af4e..f6dacd96 100644 --- a/src/lib/data/graph/Graph.h +++ b/src/lib/data/graph/Graph.h @@ -38,6 +38,8 @@ public: Node* addNodeAsPlainCopy(Node* node); Edge* addEdgeAsPlainCopy(Edge* edge); + void clear(); + protected: const std::vector >& getNodes() const; const std::vector >& getEdges() const; diff --git a/src/lib/data/location/TokenLocationCollection.cpp b/src/lib/data/location/TokenLocationCollection.cpp index a83c63b3..df2de11f 100644 --- a/src/lib/data/location/TokenLocationCollection.cpp +++ b/src/lib/data/location/TokenLocationCollection.cpp @@ -129,6 +129,12 @@ TokenLocation* TokenLocationCollection::addTokenLocationAsPlainCopy(const TokenL return copy; } +void TokenLocationCollection::clear() +{ + m_locations.clear(); + m_files.clear(); +} + TokenLocationFile* TokenLocationCollection::createTokenLocationFile(const std::string& filePath) { TokenLocationFile* file = findTokenLocationFileByPath(filePath); diff --git a/src/lib/data/location/TokenLocationCollection.h b/src/lib/data/location/TokenLocationCollection.h index d498b150..a9daeedd 100644 --- a/src/lib/data/location/TokenLocationCollection.h +++ b/src/lib/data/location/TokenLocationCollection.h @@ -43,6 +43,8 @@ public: TokenLocation* addTokenLocationAsPlainCopy(const TokenLocation* location); + void clear(); + private: TokenLocationFile* createTokenLocationFile(const std::string& filePath); diff --git a/src/lib/utility/messaging/type/MessageLoadProject.h b/src/lib/utility/messaging/type/MessageLoadProject.h new file mode 100644 index 00000000..c3509868 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageLoadProject.h @@ -0,0 +1,22 @@ +#ifndef MESSAGE_LOAD_PROJECT_H +#define MESSAGE_LOAD_PROJECT_H + +#include "utility/messaging/Message.h" + +class MessageLoadProject: public Message +{ +public: + MessageLoadProject(const std::string& filePath) + : projectSettingsFilePath(filePath) + { + } + + static const std::string getStaticType() + { + return "MessageLoadProject"; + } + + const std::string projectSettingsFilePath; +}; + +#endif // MESSAGE_LOAD_PROJECT_H