From 944554d03443e847daf8e6cd2b129bee9f738dcf Mon Sep 17 00:00:00 2001 From: Andreas Stallinger Date: Tue, 3 Feb 2015 10:47:56 +0100 Subject: [PATCH] logic: UndoRedo UndoRedo working for ActiveTokensMessages --- CMakeLists.txt | 2 +- .../gui/undoredo_view/images/arrow_left.png | Bin 0 -> 2975 bytes .../gui/undoredo_view/images/arrow_right.png | Bin 0 -> 2970 bytes .../data/gui/undoredo_view/undoredo_view.css | 42 ++++++ cmake/CLANGConfig.cmake | 2 +- src/app/CMakeLists.txt | 4 + src/app/qt/element/QtMainWindow.cpp | 22 +++ src/app/qt/element/QtMainWindow.h | 3 + src/app/qt/element/QtUndoRedo.cpp | 61 ++++++++ src/app/qt/element/QtUndoRedo.h | 31 ++++ src/app/qt/view/QtUndoRedoView.cpp | 60 ++++++++ src/app/qt/view/QtUndoRedoView.h | 37 +++++ src/app/qt/view/QtViewFactory.cpp | 6 + src/app/qt/view/QtViewFactory.h | 1 + src/lib/CMakeLists.txt | 6 + src/lib/component/ComponentFactory.cpp | 11 ++ src/lib/component/ComponentFactory.h | 1 + src/lib/component/ComponentManager.cpp | 3 + .../controller/UndoRedoController.cpp | 136 ++++++++++++++++++ .../component/controller/UndoRedoController.h | 64 +++++++++ src/lib/component/view/UndoRedoView.cpp | 22 +++ src/lib/component/view/UndoRedoView.h | 22 +++ src/lib/component/view/ViewFactory.h | 2 + src/lib/utility/messaging/Message.h | 1 + src/lib/utility/messaging/MessageBase.h | 11 ++ src/lib/utility/messaging/type/MessageRedo.h | 20 +++ src/lib/utility/messaging/type/MessageUndo.h | 20 +++ 27 files changed, 588 insertions(+), 2 deletions(-) create mode 100755 bin/app/data/gui/undoredo_view/images/arrow_left.png create mode 100755 bin/app/data/gui/undoredo_view/images/arrow_right.png create mode 100644 bin/app/data/gui/undoredo_view/undoredo_view.css create mode 100644 src/app/qt/element/QtUndoRedo.cpp create mode 100644 src/app/qt/element/QtUndoRedo.h create mode 100644 src/app/qt/view/QtUndoRedoView.cpp create mode 100644 src/app/qt/view/QtUndoRedoView.h create mode 100644 src/lib/component/controller/UndoRedoController.cpp create mode 100644 src/lib/component/controller/UndoRedoController.h create mode 100644 src/lib/component/view/UndoRedoView.cpp create mode 100644 src/lib/component/view/UndoRedoView.h create mode 100644 src/lib/utility/messaging/type/MessageRedo.h create mode 100644 src/lib/utility/messaging/type/MessageUndo.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b25f18ae..966a826c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ endif () # Settings --------------------------------------------------------------------- if (UNIX) - add_definitions(-std=c++11 -Wno-unknown-warning-option) + add_definitions(-std=c++11 -Wno-unknown-warning-option -fcolor-diagnostics) endif () # Project ---------------------------------------------------------------------- diff --git a/bin/app/data/gui/undoredo_view/images/arrow_left.png b/bin/app/data/gui/undoredo_view/images/arrow_left.png new file mode 100755 index 0000000000000000000000000000000000000000..acf2fca9d577f349607adb760a5a394bf4989dd8 GIT binary patch literal 2975 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 QcmMzZ07*qoM6N<$g3)b)TL1t6 literal 0 HcmV?d00001 diff --git a/bin/app/data/gui/undoredo_view/undoredo_view.css b/bin/app/data/gui/undoredo_view/undoredo_view.css new file mode 100644 index 00000000..a5fc2ddf --- /dev/null +++ b/bin/app/data/gui/undoredo_view/undoredo_view.css @@ -0,0 +1,42 @@ +#undo_redo_bar { + background: white; +} + +QPushButton { + background: #E0E0E0; + border: none; + background-position: 15px 5px; + height: 30px; + width: 30px; +} + +#undo_button { + border-bottom-left-radius: 12px; + border-top-left-radius: 12px; +} + +#redo_button { + border-bottom-right-radius: 12px; + border-top-right-radius: 12px; +} + +#undo_button:disabled, +#redo_button:disabled { + background: #F4F4F4; +} + +#undo_button:hover, +#redo_button:hover { + background: #B2B2B2; +} + +#undo_button:pressed, +#redo_button:pressed { + background: #626262; +} + +QToolTip { + background-color: rgb(204, 204, 204); + border: 1px solid rgb(0, 0, 0); + color: rgb(0, 0, 0); +} diff --git a/cmake/CLANGConfig.cmake b/cmake/CLANGConfig.cmake index fb8db6cf..cba3b8c9 100644 --- a/cmake/CLANGConfig.cmake +++ b/cmake/CLANGConfig.cmake @@ -11,7 +11,7 @@ set(CLANG_INCLUDE_DIRS set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build/lib") if (UNIX) - if (${CMAKE_BUILD_TYPE} STREQUAL "Release") + if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build/Release+Asserts/lib") endif() endif () diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 505fdf8f..38dbee85 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -21,6 +21,8 @@ add_files( qt/element/QtSmartSearchBox.h qt/element/QtStatusBar.cpp qt/element/QtStatusBar.h + qt/element/QtUndoRedo.cpp + qt/element/QtUndoRedo.h qt/graphics/QtGraphicsRoundedRectItem.cpp qt/graphics/QtGraphicsRoundedRectItem.h @@ -58,6 +60,8 @@ add_files( qt/view/QtSearchView.h qt/view/QtStatusBarView.cpp qt/view/QtStatusBarView.h + qt/view/QtUndoRedoView.cpp + qt/view/QtUndoRedoView.h qt/view/QtViewFactory.cpp qt/view/QtViewFactory.h qt/view/QtViewWidgetWrapper.cpp diff --git a/src/app/qt/element/QtMainWindow.cpp b/src/app/qt/element/QtMainWindow.cpp index a424ddcc..cdc3c151 100644 --- a/src/app/qt/element/QtMainWindow.cpp +++ b/src/app/qt/element/QtMainWindow.cpp @@ -13,8 +13,10 @@ #include "utility/messaging/type/MessageFind.h" #include "utility/messaging/type/MessageLoadProject.h" #include "utility/messaging/type/MessageLoadSource.h" +#include "utility/messaging/type/MessageRedo.h" #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageSaveProject.h" +#include "utility/messaging/type/MessageUndo.h" QtMainWindow::QtMainWindow() { @@ -23,6 +25,7 @@ QtMainWindow::QtMainWindow() setDockNestingEnabled(true); setupProjectMenu(); + setupEditMenu(); setupViewMenu(); setupFindMenu(); setupHelpMenu(); @@ -73,6 +76,16 @@ void QtMainWindow::openProject(const QString &path) } } +void QtMainWindow::undo() +{ + MessageUndo().dispatch(); +} + +void QtMainWindow::redo() +{ + MessageRedo().dispatch(); +} + void QtMainWindow::saveProject() { MessageSaveProject("").dispatch(); @@ -216,6 +229,15 @@ void QtMainWindow::setupViewMenu() menu->addAction(tr("&Refresh"), this, SLOT(refresh()), QKeySequence::Refresh); } +void QtMainWindow::setupEditMenu() +{ + QMenu *menu = new QMenu(tr("&Edit"), this); + menuBar()->addMenu(menu); + + menu->addAction(tr("Undo"), this, SLOT(undo()), QKeySequence::Undo ); + menu->addAction(tr("Redo"), this, SLOT(redo()), QKeySequence::Redo ); +} + void QtMainWindow::setupFindMenu() { QMenu *menu = new QMenu(tr("&Find"), this); diff --git a/src/app/qt/element/QtMainWindow.h b/src/app/qt/element/QtMainWindow.h index acdcdf57..d5d41a68 100644 --- a/src/app/qt/element/QtMainWindow.h +++ b/src/app/qt/element/QtMainWindow.h @@ -35,8 +35,11 @@ public slots: void refresh(); void saveProject(); void saveAsProject(); + void undo(); + void redo(); private: + void setupEditMenu(); void setupProjectMenu(); void setupViewMenu(); void setupFindMenu(); diff --git a/src/app/qt/element/QtUndoRedo.cpp b/src/app/qt/element/QtUndoRedo.cpp new file mode 100644 index 00000000..32b714a0 --- /dev/null +++ b/src/app/qt/element/QtUndoRedo.cpp @@ -0,0 +1,61 @@ +#include "qt/element/QtUndoRedo.h" + +#include +#include + +#include +#include + + +QtUndoRedo::QtUndoRedo() +{ + setObjectName("undo_redo_bar"); + + m_undoButton = new QPushButton(this); + m_undoButton->setObjectName("undo_button"); + m_undoButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac + m_undoButton->setIcon(QIcon("data/gui/undoredo_view/images/arrow_left.png")); + m_undoButton->setEnabled(false); + + m_redoButton = new QPushButton(this); + m_redoButton->setObjectName("redo_button"); + m_redoButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac + m_redoButton->setIcon(QIcon("data/gui/undoredo_view/images/arrow_right.png")); + m_redoButton->setEnabled(false); + + QBoxLayout* layout = new QHBoxLayout(); + layout->setSpacing(0); + layout->setAlignment(Qt::AlignTop); + setLayout(layout); + layout->addWidget(m_undoButton); + layout->addSpacing(2); + layout->addWidget(m_redoButton); + layout->addStretch(); + + connect(m_undoButton, SIGNAL(clicked()), this, SLOT(undo())); + connect(m_redoButton, SIGNAL(clicked()), this, SLOT(redo())); +} + +QtUndoRedo::~QtUndoRedo() +{ +} + +void QtUndoRedo::undo() +{ + MessageUndo().dispatch(); +} + +void QtUndoRedo::redo() +{ + MessageRedo().dispatch(); +} + +void QtUndoRedo::setUndoButtonEnabled(bool enabled) +{ + m_undoButton->setEnabled(enabled); +} + +void QtUndoRedo::setRedoButtonEnabled(bool enabled) +{ + m_redoButton->setEnabled(enabled); +} diff --git a/src/app/qt/element/QtUndoRedo.h b/src/app/qt/element/QtUndoRedo.h new file mode 100644 index 00000000..c5732393 --- /dev/null +++ b/src/app/qt/element/QtUndoRedo.h @@ -0,0 +1,31 @@ +#ifndef QT_UNDO_REDO_H +#define QT_UNDO_REDO_H + +#include +#include + + +class QPushButton; + +class QtUndoRedo + : public QFrame +{ + Q_OBJECT + +public: + QtUndoRedo(); + ~QtUndoRedo(); + void setRedoButtonEnabled(bool enabled); + void setUndoButtonEnabled(bool enabled); + +private slots: + void undo(); + void redo(); + +private: + QPushButton* m_undoButton; + QPushButton* m_redoButton; + +}; + +#endif // QT_UNDO_REDO_H diff --git a/src/app/qt/view/QtUndoRedoView.cpp b/src/app/qt/view/QtUndoRedoView.cpp new file mode 100644 index 00000000..e123bdff --- /dev/null +++ b/src/app/qt/view/QtUndoRedoView.cpp @@ -0,0 +1,60 @@ +#include "qt/view/QtUndoRedoView.h" + +#include "qt/view/QtMainView.h" +#include "qt/view/QtViewWidgetWrapper.h" +#include "utility/text/TextAccess.h" + +QtUndoRedoView::QtUndoRedoView(ViewLayout* viewLayout) + : UndoRedoView(viewLayout) + , m_setRedoButtonEnabledFunctor(std::bind(&QtUndoRedoView::doSetRedoButtonEnabled, this, std::placeholders::_1)) + , m_setUndoButtonEnabledFunctor(std::bind(&QtUndoRedoView::doSetUndoButtonEnabled, this, std::placeholders::_1)) +{ + m_widget = std::make_shared(); + setStyleSheet(); +} + +QtUndoRedoView::~QtUndoRedoView() +{ +} + +void QtUndoRedoView::createWidgetWrapper() +{ + setWidgetWrapper(std::make_shared(m_widget)); +} + +void QtUndoRedoView::initView() +{ +} + +void QtUndoRedoView::refreshView() +{ +} + + +void QtUndoRedoView::setStyleSheet() +{ + std::string css = TextAccess::createFromFile("data/gui/undoredo_view/undoredo_view.css")->getText(); + + m_widget->setStyleSheet(css.c_str()); + +} + +void QtUndoRedoView::doSetRedoButtonEnabled(bool enabled) +{ + m_widget->setRedoButtonEnabled(enabled); +} + +void QtUndoRedoView::doSetUndoButtonEnabled(bool enabled) +{ + m_widget->setUndoButtonEnabled(enabled); +} + +void QtUndoRedoView::setRedoButtonEnabled(bool enabled) +{ + m_setRedoButtonEnabledFunctor(enabled); +} + +void QtUndoRedoView::setUndoButtonEnabled(bool enabled) +{ + m_setUndoButtonEnabledFunctor(enabled); +} diff --git a/src/app/qt/view/QtUndoRedoView.h b/src/app/qt/view/QtUndoRedoView.h new file mode 100644 index 00000000..101cbb17 --- /dev/null +++ b/src/app/qt/view/QtUndoRedoView.h @@ -0,0 +1,37 @@ +#ifndef QT_UNDO_REDO_VIEW_H +#define QT_UNDO_REDO_VIEW_H + +#include +#include + +#include "component/view/UndoRedoView.h" +#include "qt/element/QtUndoRedo.h" +#include "qt/utility/QtThreadedFunctor.h" + +class QtUndoRedoView : public UndoRedoView +{ +public: + QtUndoRedoView(ViewLayout* viewLayout); + ~QtUndoRedoView(); + + // View implementation + virtual void createWidgetWrapper(); + virtual void initView(); + virtual void refreshView(); + + // UndoRedo view implementation + virtual void setRedoButtonEnabled(bool enabled); + virtual void setUndoButtonEnabled(bool enabled); + +private: + void doSetRedoButtonEnabled(bool enabled); + void doSetUndoButtonEnabled(bool enabled); + + QtThreadedFunctor m_setRedoButtonEnabledFunctor; + QtThreadedFunctor m_setUndoButtonEnabledFunctor; + + void setStyleSheet(); + std::shared_ptr m_widget; +}; + +#endif // !QT_UNDO_REDO_VIEW_H diff --git a/src/app/qt/view/QtViewFactory.cpp b/src/app/qt/view/QtViewFactory.cpp index 5de0ebd6..caec59e8 100644 --- a/src/app/qt/view/QtViewFactory.cpp +++ b/src/app/qt/view/QtViewFactory.cpp @@ -5,6 +5,7 @@ #include "qt/view/QtMainView.h" #include "qt/view/QtSearchView.h" #include "qt/view/QtStatusBarView.h" +#include "qt/view/QtUndoRedoView.h" QtViewFactory::QtViewFactory() { @@ -38,3 +39,8 @@ std::shared_ptr QtViewFactory::createStatusBarView(ViewLayout* vi { return View::createAndDontAddToLayout(viewLayout); } + +std::shared_ptr QtViewFactory::createUndoRedoView(ViewLayout* viewLayout) const +{ + return View::create(viewLayout); +} diff --git a/src/app/qt/view/QtViewFactory.h b/src/app/qt/view/QtViewFactory.h index c9d545d6..73fe5481 100644 --- a/src/app/qt/view/QtViewFactory.h +++ b/src/app/qt/view/QtViewFactory.h @@ -14,6 +14,7 @@ public: virtual std::shared_ptr createGraphView(ViewLayout* viewLayout) const; virtual std::shared_ptr createSearchView(ViewLayout* viewLayout) const; virtual std::shared_ptr createStatusBarView(ViewLayout* viewLayout) const; + virtual std::shared_ptr createUndoRedoView(ViewLayout* viewLayout) const; }; #endif // QT_VIEW_FACTORY_H diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 44a61c7e..e1293a66 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -36,6 +36,8 @@ add_files( component/controller/SearchController.h component/controller/StatusBarController.cpp component/controller/StatusBarController.h + component/controller/UndoRedoController.cpp + component/controller/UndoRedoController.h component/view/graphElements/GraphEdge.cpp component/view/graphElements/GraphEdge.h @@ -52,6 +54,8 @@ add_files( component/view/SearchView.h component/view/StatusBarView.cpp component/view/StatusBarView.h + component/view/UndoRedoView.cpp + component/view/UndoRedoView.h component/view/View.cpp component/view/View.h component/view/ViewFactory.cpp @@ -213,6 +217,8 @@ add_files( utility/messaging/type/MessageSearchAutocomplete.h utility/messaging/type/MessageShowFile.h utility/messaging/type/MessageStatus.h + utility/messaging/type/MessageRedo.h + utility/messaging/type/MessageUndo.h utility/messaging/Message.h utility/messaging/MessageBase.h diff --git a/src/lib/component/ComponentFactory.cpp b/src/lib/component/ComponentFactory.cpp index be93b665..0fd8f6bc 100644 --- a/src/lib/component/ComponentFactory.cpp +++ b/src/lib/component/ComponentFactory.cpp @@ -5,10 +5,12 @@ #include "component/controller/GraphController.h" #include "component/controller/SearchController.h" #include "component/controller/StatusBarController.h" +#include "component/controller/UndoRedoController.h" #include "component/view/CodeView.h" #include "component/view/GraphView.h" #include "component/view/SearchView.h" #include "component/view/StatusBarView.h" +#include "component/view/UndoRedoView.h" #include "component/view/ViewFactory.h" #include "component/view/ViewLayout.h" @@ -54,6 +56,15 @@ std::shared_ptr ComponentFactory::createSearchComponent() return component; } +std::shared_ptr ComponentFactory::createUndoRedoComponent() +{ + std::shared_ptr view = m_viewFactory->createUndoRedoView(m_viewLayout); + std::shared_ptr controller = std::make_shared(); + + std::shared_ptr component = std::make_shared(view, controller); + return component; +} + std::shared_ptr ComponentFactory::createStatusBarComponent() { std::shared_ptr view = m_viewFactory->createStatusBarView(m_viewLayout); diff --git a/src/lib/component/ComponentFactory.h b/src/lib/component/ComponentFactory.h index f3f72be1..f72fe47a 100644 --- a/src/lib/component/ComponentFactory.h +++ b/src/lib/component/ComponentFactory.h @@ -23,6 +23,7 @@ public: std::shared_ptr createGraphComponent(); std::shared_ptr createSearchComponent(); std::shared_ptr createStatusBarComponent(); + std::shared_ptr createUndoRedoComponent(); private: ComponentFactory(); diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp index 7ee8be71..a809c146 100644 --- a/src/lib/component/ComponentManager.cpp +++ b/src/lib/component/ComponentManager.cpp @@ -29,6 +29,9 @@ void ComponentManager::setup() std::shared_ptr statusBarComponent = m_componentFactory->createStatusBarComponent(); m_components.push_back(statusBarComponent); + + std::shared_ptr undoRedoComponent = m_componentFactory->createUndoRedoComponent(); + m_components.push_back(undoRedoComponent); } ComponentManager::ComponentManager() diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp new file mode 100644 index 00000000..a7e72177 --- /dev/null +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -0,0 +1,136 @@ +#include "component/controller/UndoRedoController.h" + +#include + +#include "component/view/UndoRedoView.h" +#include "utility/logging/logging.h" + +UndoRedoController::UndoRedoController() + : MessageListener(true) + , MessageListener(true) + , MessageListener(true) + , m_lastCommand(nullptr) +{ +} + +UndoRedoController::~UndoRedoController() +{ + for(MessageBase* m : m_redo) + { + delete m; + } + for(MessageBase* m : m_undo) + { + delete m; + } +} + +UndoRedoView* UndoRedoController::getView() +{ + return Controller::getView(); +} + +void UndoRedoController::handleMessage(MessageActivateTokens* message) +{ + MessageActivateTokens* m = new MessageActivateTokens(message->tokenIds); + m->isAggregation = message->isAggregation; + m->isEdge = message->isEdge; + m->UndoRedoType = message->UndoRedoType; + + processMessage(m); +} + +void UndoRedoController::handleMessage(MessageGraphNodeExpand* message) +{ + /*MessageGraphNodeExpand* m = new MessageGraphNodeExpand(message->tokenId,message->access); + m->UndoRedoType = message->UndoRedoType; + processMessage(m);*/ +} + +void UndoRedoController::handleMessage(MessageGraphNodeMove* message) +{ + /*MessageGraphNodeMove* m = new MessageGraphNodeMove(message->tokenId,message->position); + m->UndoRedoType = message->UndoRedoType; + processMessage(m, true);*/ +} + +void UndoRedoController::handleMessage(MessageRedo* message) +{ + if(!m_redo.empty()) + { + MessageBase* m = m_redo.back(); + m_redo.pop_back(); + m->UndoRedoType = MessageBase::UndoType_Redo; + m->dispatch(); + delete m; + } +} + +void UndoRedoController::handleMessage(MessageUndo* message) +{ + if(!m_undo.empty()) + { + MessageBase* m = m_undo.back(); + m_undo.pop_back(); + m->UndoRedoType = MessageBase::UndoType_Undo; + m->dispatch(); + delete m; + } +} + +void UndoRedoController::processMessage(MessageBase* message) +{ + switch(message->UndoRedoType) + { + case MessageBase::UndoType_Normal: + processNormalMessage(message);; + break; + case MessageBase::UndoType_Redo: + processRedoMessage(message); + break; + case MessageBase::UndoType_Undo: + processUndoMessage(message); + break; + } +} + + +void UndoRedoController::processNormalMessage(MessageBase* message) +{ + if(m_lastCommand != nullptr) + { + m_undo.push_back(m_lastCommand); + getView()->setUndoButtonEnabled(true); + } + m_lastCommand = message; + while(!m_redo.empty()) + { + MessageBase* m = m_redo.back(); + m_redo.pop_back(); + delete m; + } + getView()->setRedoButtonEnabled(false); +} + +void UndoRedoController::processRedoMessage(MessageBase* message) +{ + m_undo.push_back(m_lastCommand); + getView()->setUndoButtonEnabled(true); + m_lastCommand = message; + if(m_redo.empty()) + { + getView()->setRedoButtonEnabled(false); + } +} + +void UndoRedoController::processUndoMessage(MessageBase* message) +{ + m_redo.push_back(m_lastCommand); + getView()->setRedoButtonEnabled(true); + m_lastCommand = message; + if(m_undo.empty()) + { + getView()->setUndoButtonEnabled(false); + } +} + diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h new file mode 100644 index 00000000..3fe7bdad --- /dev/null +++ b/src/lib/component/controller/UndoRedoController.h @@ -0,0 +1,64 @@ +#ifndef UNDO_REDO_CONTROLLER_H +#define UNDO_REDO_CONTROLLER_H + +#include +#include +#include +#include + +#include "component/controller/Controller.h" + +#include "utility/messaging/MessageBase.h" +#include "utility/messaging/MessageListener.h" +#include "utility/messaging/type/MessageActivateTokens.h" +#include "utility/messaging/type/MessageGraphNodeExpand.h" +#include "utility/messaging/type/MessageGraphNodeMove.h" +#include "utility/messaging/type/MessageRedo.h" +#include "utility/messaging/type/MessageUndo.h" + +class UndoRedoView; + +struct UndoContainer +{ + MessageBase* message; + std::vector subMessages; +}; + +class UndoRedoController + : public Controller + , public MessageListener + , public MessageListener + , public MessageListener + , public MessageListener + , public MessageListener +{ +public: + UndoRedoController(void); + virtual ~UndoRedoController(void); + UndoRedoView* getView(); +private: + enum UndoRedoType + { + UndoRedoType_Normal, + UndoRedoType_Undo, + UndoRedoType_Redo + }; + + virtual void handleMessage(MessageActivateTokens* message); + virtual void handleMessage(MessageGraphNodeExpand* message); + virtual void handleMessage(MessageGraphNodeMove* message); + virtual void handleMessage(MessageRedo* message); + virtual void handleMessage(MessageUndo* message); + + void processMessage(MessageBase* message); + void processNormalMessage(MessageBase* message); + void processRedoMessage(MessageBase* message); + void processUndoMessage(MessageBase* message); + + MessageBase* m_lastCommand; + + std::deque m_undo; + std::deque m_redo; +}; + +#endif // UNDO_REDO_CONTROLLER_H diff --git a/src/lib/component/view/UndoRedoView.cpp b/src/lib/component/view/UndoRedoView.cpp new file mode 100644 index 00000000..8441b3db --- /dev/null +++ b/src/lib/component/view/UndoRedoView.cpp @@ -0,0 +1,22 @@ +#include "component/view/UndoRedoView.h" + +#include "component/controller/UndoRedoController.h" + +UndoRedoView::UndoRedoView(ViewLayout* viewLayout) + : View(viewLayout, Vec2i(100,100)) +{ +} + +UndoRedoView::~UndoRedoView() +{ +} + +std::string UndoRedoView::getName() const +{ + return "UndoRedoView"; +} + +UndoRedoController* UndoRedoView::getController() +{ + return View::getController(); +} diff --git a/src/lib/component/view/UndoRedoView.h b/src/lib/component/view/UndoRedoView.h new file mode 100644 index 00000000..f9e81c39 --- /dev/null +++ b/src/lib/component/view/UndoRedoView.h @@ -0,0 +1,22 @@ +#ifndef UNDO_REDO_VIEW_H +#define UNDO_REDO_VIEW_H + +#include "component/view/View.h" + +class UndoRedoController; + +class UndoRedoView : public View +{ +public: + UndoRedoView(ViewLayout* viewLayout); + ~UndoRedoView(void); + + virtual std::string getName() const; + + virtual void setRedoButtonEnabled(bool enabled) = 0; + virtual void setUndoButtonEnabled(bool enabled) = 0; +protected: + UndoRedoController* getController(); +}; + +#endif //UNDO_REDO_VIEW_H diff --git a/src/lib/component/view/ViewFactory.h b/src/lib/component/view/ViewFactory.h index f079b01e..96938be9 100644 --- a/src/lib/component/view/ViewFactory.h +++ b/src/lib/component/view/ViewFactory.h @@ -8,6 +8,7 @@ class GraphView; class MainView; class SearchView; class StatusBarView; +class UndoRedoView; class ViewLayout; class ViewFactory @@ -21,6 +22,7 @@ public: virtual std::shared_ptr createGraphView(ViewLayout* viewLayout) const = 0; virtual std::shared_ptr createSearchView(ViewLayout* viewLayout) const = 0; virtual std::shared_ptr createStatusBarView(ViewLayout* viewLayout) const = 0; + virtual std::shared_ptr createUndoRedoView(ViewLayout* viewLayout) const = 0; }; #endif // VIEW_FACTORY_H diff --git a/src/lib/utility/messaging/Message.h b/src/lib/utility/messaging/Message.h index 618087d0..d41f9b21 100644 --- a/src/lib/utility/messaging/Message.h +++ b/src/lib/utility/messaging/Message.h @@ -11,6 +11,7 @@ template class Message: public MessageBase { public: + virtual ~Message() { } diff --git a/src/lib/utility/messaging/MessageBase.h b/src/lib/utility/messaging/MessageBase.h index a2ac09a2..e1c0a65a 100644 --- a/src/lib/utility/messaging/MessageBase.h +++ b/src/lib/utility/messaging/MessageBase.h @@ -6,11 +6,22 @@ class MessageBase { public: + enum UndoType + { + UndoType_Normal, + UndoType_Redo, + UndoType_Undo, + }; + MessageBase() : UndoRedoType(UndoType_Normal){}; virtual ~MessageBase() { } virtual std::string getType() const = 0; + virtual void dispatch() = 0; + + UndoType UndoRedoType; + }; #endif // MESSAGE_BASE_H diff --git a/src/lib/utility/messaging/type/MessageRedo.h b/src/lib/utility/messaging/type/MessageRedo.h new file mode 100644 index 00000000..78761ac4 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageRedo.h @@ -0,0 +1,20 @@ +#ifndef MESSAGE_REDO_H +#define MESSAGE_REDO_H + +#include "utility/messaging/Message.h" +#include "utility/types.h" + +class MessageRedo: public Message +{ +public: + MessageRedo() + { + } + + static const std::string getStaticType() + { + return "MessageRedo"; + } +}; + +#endif // MESSAGE_REDO_H diff --git a/src/lib/utility/messaging/type/MessageUndo.h b/src/lib/utility/messaging/type/MessageUndo.h new file mode 100644 index 00000000..cc2994dd --- /dev/null +++ b/src/lib/utility/messaging/type/MessageUndo.h @@ -0,0 +1,20 @@ +#ifndef MESSAGE_UNDO_H +#define MESSAGE_UNDO_H + +#include "utility/messaging/Message.h" +#include "utility/types.h" + +class MessageUndo: public Message +{ +public: + MessageUndo() + { + } + + static const std::string getStaticType() + { + return "MessageUndo"; + } +}; + +#endif // MESSAGE_UNDO_H