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;