From 3f4ae8343cadce36f336f46a433711652ec5b054 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 2 Dec 2014 01:20:08 +0100 Subject: [PATCH] logic: initially parse source on message thread and add more StatusBar messages This change puts the initial project loading into a MessageLoadProject so that the UI thread is still responding. Also the StatusBar is now responding to more Messages and it's MessageListeners get added to the MessageQueue in front of other listeners so that the StatusBar UI can announce actions. --- src/app/main.cpp | 1 - src/app/qt/element/QtStatusBar.cpp | 2 +- src/app/qt/element/QtStatusBar.h | 2 +- src/app/qt/view/QtStatusBarView.cpp | 8 ++-- src/app/qt/view/QtStatusBarView.h | 2 +- src/lib/Application.cpp | 2 + src/lib/Application.h | 2 +- .../controller/StatusBarController.cpp | 31 +++++++++++-- .../controller/StatusBarController.h | 27 +++++++---- src/lib/component/view/StatusBarView.cpp | 4 +- src/lib/utility/messaging/MessageListener.h | 5 ++ .../utility/messaging/MessageListenerBase.h | 4 +- src/lib/utility/messaging/MessageQueue.cpp | 14 +++++- src/lib/utility/messaging/MessageQueue.h | 2 +- src/test/MessageQueueTestSuite.h | 46 ++++++++++++++++++- 15 files changed, 118 insertions(+), 34 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 11032753..5fabce4f 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -26,7 +26,6 @@ int main(int argc, char *argv[]) QtViewFactory viewFactory; std::shared_ptr app = Application::create(&viewFactory); - app->loadProject("data/ProjectSettings.xml"); return qtApp.exec(); } diff --git a/src/app/qt/element/QtStatusBar.cpp b/src/app/qt/element/QtStatusBar.cpp index 80773a96..fecab162 100644 --- a/src/app/qt/element/QtStatusBar.cpp +++ b/src/app/qt/element/QtStatusBar.cpp @@ -3,7 +3,7 @@ QtStatusBar::QtStatusBar() : m_text(this) { - m_text.setText("hallo test test"); + m_text.setText(""); addWidget(&m_text); } diff --git a/src/app/qt/element/QtStatusBar.h b/src/app/qt/element/QtStatusBar.h index 750bd8f1..8b4bfb0e 100644 --- a/src/app/qt/element/QtStatusBar.h +++ b/src/app/qt/element/QtStatusBar.h @@ -17,4 +17,4 @@ private: QLabel m_text; }; -#endif // !QT_STATUS_BAR_H +#endif // QT_STATUS_BAR_H diff --git a/src/app/qt/view/QtStatusBarView.cpp b/src/app/qt/view/QtStatusBarView.cpp index 908dfc91..e821de94 100644 --- a/src/app/qt/view/QtStatusBarView.cpp +++ b/src/app/qt/view/QtStatusBarView.cpp @@ -4,7 +4,7 @@ #include "qt/view/QtMainView.h" #include "qt/view/QtViewWidgetWrapper.h" -QtStatusBarView::QtStatusBarView( ViewLayout* viewLayout ) +QtStatusBarView::QtStatusBarView(ViewLayout* viewLayout) : StatusBarView(viewLayout) , m_showMessageFunctor(std::bind(&QtStatusBarView::doShowMessage, this, std::placeholders::_1, std::placeholders::_2)) { @@ -26,20 +26,18 @@ void QtStatusBarView::createWidgetWrapper() void QtStatusBarView::initView() { - } void QtStatusBarView::refreshView() { - } -void QtStatusBarView::doShowMessage( const std::string& message, bool isError ) +void QtStatusBarView::doShowMessage(const std::string& message, bool isError) { m_widget->setText(message, isError); } -void QtStatusBarView::showMessage( const std::string& message, bool isError ) +void QtStatusBarView::showMessage(const std::string& message, bool isError) { m_showMessageFunctor(message, isError); } diff --git a/src/app/qt/view/QtStatusBarView.h b/src/app/qt/view/QtStatusBarView.h index 4deb93ff..6f2694fc 100644 --- a/src/app/qt/view/QtStatusBarView.h +++ b/src/app/qt/view/QtStatusBarView.h @@ -28,4 +28,4 @@ private: QtThreadedFunctor m_showMessageFunctor; }; -#endif // !QT_STATUS_BAR_VIEW_H \ No newline at end of file +#endif // !QT_STATUS_BAR_VIEW_H diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 0e9342dd..33081de3 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -25,6 +25,8 @@ std::shared_ptr Application::create(ViewFactory* viewFactory) ptr->m_componentManager->setup(); ptr->m_mainView->loadLayout(); + MessageLoadProject("data/ProjectSettings.xml").dispatch(); + return ptr; } diff --git a/src/lib/Application.h b/src/lib/Application.h index 70b1d2d5..b41088f2 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -8,8 +8,8 @@ #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageLoadProject.h" #include "utility/messaging/type/MessageLoadSource.h" -#include "utility/messaging/type/MessageSaveProject.h" #include "utility/messaging/type/MessageRefresh.h" +#include "utility/messaging/type/MessageSaveProject.h" class ViewFactory; class MainView; diff --git a/src/lib/component/controller/StatusBarController.cpp b/src/lib/component/controller/StatusBarController.cpp index 466530f1..bb2c34f3 100644 --- a/src/lib/component/controller/StatusBarController.cpp +++ b/src/lib/component/controller/StatusBarController.cpp @@ -3,8 +3,13 @@ #include "component/view/StatusBarView.h" StatusBarController::StatusBarController() + : MessageListener(true) + , MessageListener(true) + , MessageListener(true) + , MessageListener(true) + , MessageListener(true) + , MessageListener(true) { - } StatusBarController::~StatusBarController() @@ -28,12 +33,28 @@ void StatusBarController::handleMessage(MessageStatus* message) void StatusBarController::handleMessage(MessageError* message) { - setStatus(message->error, true); + setStatus(message->error, true); +} + +void StatusBarController::handleMessage(MessageLoadProject* message) +{ + setStatus("Loading Project: " + message->projectSettingsFilePath); +} + +void StatusBarController::handleMessage(MessageLoadSource* message) +{ + setStatus("Loading Source: " + message->sourceDirectoryPath); +} + +void StatusBarController::handleMessage(MessageRefresh* message) +{ + setStatus("Refreshing Project"); } void StatusBarController::setStatus(const std::string& status, bool isError) { - if(!status.empty()) - getView()->showMessage(status, isError); + if (!status.empty()) + { + getView()->showMessage(status, isError); + } } - diff --git a/src/lib/component/controller/StatusBarController.h b/src/lib/component/controller/StatusBarController.h index cbb0bdf5..4fa8efe3 100644 --- a/src/lib/component/controller/StatusBarController.h +++ b/src/lib/component/controller/StatusBarController.h @@ -8,28 +8,37 @@ #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageError.h" #include "utility/messaging/type/MessageFinishedParsing.h" +#include "utility/messaging/type/MessageLoadProject.h" +#include "utility/messaging/type/MessageLoadSource.h" +#include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageStatus.h" class StatusBarView; class StatusBarController - : public Controller - , public MessageListener - , public MessageListener - , public MessageListener + : public Controller + , public MessageListener + , public MessageListener + , public MessageListener + , public MessageListener + , public MessageListener + , public MessageListener { public: - StatusBarController(void); - ~StatusBarController(void); + virtual ~StatusBarController(void); StatusBarView* getView(); -private: - void setStatus(const std::string& status, bool isError = false); - virtual void handleMessage(MessageError* message); +private: + virtual void handleMessage(MessageError* message); virtual void handleMessage(MessageFinishedParsing* message); + virtual void handleMessage(MessageLoadProject* message); + virtual void handleMessage(MessageLoadSource* message); + virtual void handleMessage(MessageRefresh* message); virtual void handleMessage(MessageStatus* message); + + void setStatus(const std::string& status, bool isError = false); }; #endif // STATUS_BAR_CONTROLLER_H diff --git a/src/lib/component/view/StatusBarView.cpp b/src/lib/component/view/StatusBarView.cpp index e146d07e..69f89106 100644 --- a/src/lib/component/view/StatusBarView.cpp +++ b/src/lib/component/view/StatusBarView.cpp @@ -5,12 +5,10 @@ StatusBarView::StatusBarView(ViewLayout* viewLayout) : View(viewLayout, Vec2i(100,100)) { - } StatusBarView::~StatusBarView() { - } std::string StatusBarView::getName() const @@ -21,4 +19,4 @@ std::string StatusBarView::getName() const StatusBarController* StatusBarView::getController() { return View::getController(); -} \ No newline at end of file +} diff --git a/src/lib/utility/messaging/MessageListener.h b/src/lib/utility/messaging/MessageListener.h index 21cc8c6b..a7aadc0f 100644 --- a/src/lib/utility/messaging/MessageListener.h +++ b/src/lib/utility/messaging/MessageListener.h @@ -11,6 +11,11 @@ template class MessageListener: public MessageListenerBase { public: + MessageListener(bool toFront = false) + : MessageListenerBase(toFront) + { + } + virtual std::string getType() const { return MessageType::getStaticType(); diff --git a/src/lib/utility/messaging/MessageListenerBase.h b/src/lib/utility/messaging/MessageListenerBase.h index b7535682..233fbda3 100644 --- a/src/lib/utility/messaging/MessageListenerBase.h +++ b/src/lib/utility/messaging/MessageListenerBase.h @@ -9,9 +9,9 @@ class MessageListenerBase { public: - MessageListenerBase() + MessageListenerBase(bool toFront) { - MessageQueue::getInstance()->registerListener(this); + MessageQueue::getInstance()->registerListener(this, toFront); } virtual ~MessageListenerBase() diff --git a/src/lib/utility/messaging/MessageQueue.cpp b/src/lib/utility/messaging/MessageQueue.cpp index 4542a1a0..e9ecb6e6 100644 --- a/src/lib/utility/messaging/MessageQueue.cpp +++ b/src/lib/utility/messaging/MessageQueue.cpp @@ -16,10 +16,20 @@ std::shared_ptr MessageQueue::getInstance() return s_instance; } -void MessageQueue::registerListener(MessageListenerBase* listener) +void MessageQueue::registerListener(MessageListenerBase* listener, bool toFront) { std::lock_guard lock(m_listenersMutex); - m_listeners.push_back(listener); + + if (toFront) + { + m_listeners.insert(m_listeners.begin(), listener); + m_listenersLength++; + m_currentListenerIndex++; + } + else + { + m_listeners.push_back(listener); + } } void MessageQueue::unregisterListener(MessageListenerBase* listener) diff --git a/src/lib/utility/messaging/MessageQueue.h b/src/lib/utility/messaging/MessageQueue.h index 593390c2..b836ae81 100644 --- a/src/lib/utility/messaging/MessageQueue.h +++ b/src/lib/utility/messaging/MessageQueue.h @@ -13,7 +13,7 @@ class MessageQueue public: static std::shared_ptr getInstance(); - void registerListener(MessageListenerBase* listener); + void registerListener(MessageListenerBase* listener, bool toFront = false); void unregisterListener(MessageListenerBase* listener); void pushMessage(std::shared_ptr message); diff --git a/src/test/MessageQueueTestSuite.h b/src/test/MessageQueueTestSuite.h index 468e1405..e7ddaa44 100644 --- a/src/test/MessageQueueTestSuite.h +++ b/src/test/MessageQueueTestSuite.h @@ -107,6 +107,28 @@ public: } } + void test_listener_registration_to_front_and_back_within_message_handling(void) + { + MessageQueue::getInstance()->startMessageLoopThreaded(); + + Test5MessageListener listener; + + TestMessage().dispatch(); + TestMessage().dispatch(); + TestMessage().dispatch(); + + waitForThread(); + + MessageQueue::getInstance()->stopMessageLoop(); + + TS_ASSERT_EQUALS(5, listener.m_listeners.size()); + TS_ASSERT_EQUALS(2, listener.m_listeners[0]->m_messageCount); + TS_ASSERT_EQUALS(2, listener.m_listeners[1]->m_messageCount); + TS_ASSERT_EQUALS(2, listener.m_listeners[2]->m_messageCount); + TS_ASSERT_EQUALS(2, listener.m_listeners[3]->m_messageCount); + TS_ASSERT_EQUALS(2, listener.m_listeners[4]->m_messageCount); + } + private: class TestMessage: public Message { @@ -129,8 +151,9 @@ private: class TestMessageListener: public MessageListener { public: - TestMessageListener() - : m_messageCount(0) + TestMessageListener(bool toFront = false) + : MessageListener(toFront) + , m_messageCount(0) { } @@ -195,6 +218,25 @@ private: } }; + class Test5MessageListener: + public MessageListener + { + public: + std::vector> m_listeners; + + private: + virtual void handleMessage(TestMessage* message) + { + if (!m_listeners.size()) + { + for (size_t i = 0; i < 5; i++) + { + m_listeners.push_back(std::make_shared(i % 2 == 1)); + } + } + } + }; + void waitForThread() const { static const int THREAD_WAIT_TIME_MS = 5;