diff --git a/bin/app/data/gui/code_view/code_view.css b/bin/app/data/gui/code_view/code_view.css index 4df3caf8..1889048f 100644 --- a/bin/app/data/gui/code_view/code_view.css +++ b/bin/app/data/gui/code_view/code_view.css @@ -2,16 +2,13 @@ background-color: ; } -* { - font-size: pt; -} - #code_file { background-color: ; border: 2px solid ; border-radius: 12px; border-top-left-radius: 14px; border-top-right-radius: 14px; + font-size: pt; padding-bottom: 7px; } @@ -19,6 +16,7 @@ background-color: ; border-top-left-radius: 7px; border-top-right-radius: 7px; + font-size: pt; padding-right: 5px; } @@ -27,6 +25,7 @@ border: none; border-radius: 3px; color: ; + font-size: pt; padding: 2px 4px; margin: 1px 8px 3px; } @@ -52,10 +51,7 @@ #code_file #code_snippet { background-color: ; border-top: 2px solid ; -} - -#code_file #code_snippet * { - font-family: ""; + font-size: pt; } #code_file #code_snippet[isFirst=true] { @@ -65,8 +61,10 @@ #code_file #code_snippet #scope_name, #code_file #code_snippet #dots { background-color: ; - color: ; border: none; + color: ; + font-family: ""; + font-size: pt; } #code_file #code_snippet #scope_name:hover { @@ -88,11 +86,15 @@ background-color: ; border: none; color: ; + font-family: ""; + font-size: pt; } #code_area { background-color: transparent; color: ; + font-family: ""; + font-size: pt; } #code_file #maximize_button, #code_file #snippet_button, #code_file #minimize_button { diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index fe9ee3f6..f0b39956 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -243,23 +243,40 @@ void UndoRedoController::handleMessage(MessageShowScope* message) void UndoRedoController::handleMessage(MessageUndo* message) { - if (!m_list.size() || std::prev(m_iterator) == m_list.begin()) + if (!m_list.size()) { return; } - while (std::prev(m_iterator)->order == Command::ORDER_VIEW) + // return to last non view command + std::list::iterator it = m_iterator; + while (std::prev(it)->order == Command::ORDER_VIEW) { - std::advance(m_iterator, -1); + std::advance(it, -1); } - std::advance(m_iterator, -1); + std::advance(it, -1); - if (std::distance(m_list.begin(), m_iterator) <= 1) + // disable undo button if there is no non view command till the first command + std::list::iterator it2 = std::prev(it); + while (it2->order == Command::ORDER_VIEW) + { + std::advance(it2, -1); + } + if (it2 == m_list.begin()) { getView()->setUndoButtonEnabled(false); } + + // abort if first command is reached + if (it == m_list.begin()) + { + return; + } + getView()->setRedoButtonEnabled(true); + m_iterator = it; + replayCommands(); MessageFlushUpdates().dispatch(); @@ -392,3 +409,39 @@ MessageBase* UndoRedoController::lastMessage() const { return std::prev(m_iterator)->message.get(); } + +void UndoRedoController::dump() const +{ + std::cout << "Undo Redo Stack:\n\n"; + + std::list::const_iterator it = m_list.begin(); + while (it != m_list.end()) + { + switch (it->order) + { + case Command::ORDER_VIEW: + std::cout << "\t"; + case Command::ORDER_ADAPT: + std::cout << "\t"; + case Command::ORDER_ACTIVATE: + break; + } + + std::cout << it->message->getType() << " " << it->replayLastOnly; + + if (it == m_iterator) + { + std::cout << " <-"; + } + std::cout << std::endl; + + std::advance(it, 1); + } + + if (m_list.end() == m_iterator) + { + std::cout << " <-"; + } + + std::cout << std::endl; +} diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index 1c5e5bc3..befe07ad 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -99,6 +99,8 @@ private: bool sameMessageTypeAsLast(MessageBase* message) const; MessageBase* lastMessage() const; + void dump() const; + std::list m_list; std::list::iterator m_iterator; }; diff --git a/src/lib_gui/CMakeLists.txt b/src/lib_gui/CMakeLists.txt index 2e0548c4..c6d02708 100644 --- a/src/lib_gui/CMakeLists.txt +++ b/src/lib_gui/CMakeLists.txt @@ -52,6 +52,8 @@ add_files( qt/network/QtTcpWrapper.cpp qt/network/QtTcpWrapper.h + qt/utility/QtContextMenu.cpp + qt/utility/QtContextMenu.h qt/utility/QtDeviceScaledPixmap.cpp qt/utility/QtDeviceScaledPixmap.h qt/utility/QtHighlighter.cpp diff --git a/src/lib_gui/qt/element/QtCodeArea.cpp b/src/lib_gui/qt/element/QtCodeArea.cpp index 365d05be..02f3cfab 100644 --- a/src/lib_gui/qt/element/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/QtCodeArea.cpp @@ -21,6 +21,7 @@ #include "data/location/TokenLocationFile.h" #include "qt/element/QtCodeFile.h" #include "qt/element/QtCodeSnippet.h" +#include "qt/utility/QtContextMenu.h" #include "qt/utility/QtHighlighter.h" #include "settings/ApplicationSettings.h" #include "settings/ColorScheme.h" @@ -498,10 +499,7 @@ void QtCodeArea::contextMenuEvent(QContextMenuEvent* event) if (m_setIDECursorPositionAction != nullptr) { m_eventPosition = event->pos(); - - QMenu menu(this); - menu.addAction(m_setIDECursorPositionAction); - menu.exec(event->globalPos()); + QtContextMenu::getInstance()->showExtended(event, this, std::vector(1, m_setIDECursorPositionAction)); } } diff --git a/src/lib_gui/qt/utility/QtContextMenu.cpp b/src/lib_gui/qt/utility/QtContextMenu.cpp new file mode 100644 index 00000000..99645e63 --- /dev/null +++ b/src/lib_gui/qt/utility/QtContextMenu.cpp @@ -0,0 +1,67 @@ +#include "qt/utility/QtContextMenu.h" + +#include +#include + +#include "utility/messaging/type/MessageRedo.h" +#include "utility/messaging/type/MessageUndo.h" + +std::shared_ptr QtContextMenu::s_instance; + +QtContextMenu* QtContextMenu::getInstance() +{ + if (!s_instance) + { + s_instance = std::make_shared(); + } + + return s_instance.get(); +} + +QtContextMenu::QtContextMenu() +{ + m_undoAction = new QAction(tr("Back"), this); + m_undoAction->setStatusTip(tr("Go back to last active symbol")); + m_undoAction->setToolTip(tr("Go back to last active symbol")); + connect(m_undoAction, SIGNAL(triggered()), this, SLOT(undoActionTriggered())); + + m_redoAction = new QAction(tr("Forward"), this); + m_redoAction->setStatusTip(tr("Go forward to next active symbol")); + m_redoAction->setToolTip(tr("Go forward to next active symbol")); + connect(m_redoAction, SIGNAL(triggered()), this, SLOT(redoActionTriggered())); +} + +void QtContextMenu::showDefault(QContextMenuEvent* event, QWidget* origin) +{ + showExtended(event, origin, std::vector()); +} + +void QtContextMenu::showExtended(QContextMenuEvent* event, QWidget* origin, const std::vector& actions) +{ + QMenu menu(origin); + + menu.addAction(m_undoAction); + menu.addAction(m_redoAction); + + if (actions.size()) + { + menu.addSeparator(); + + for (QAction* action : actions) + { + menu.addAction(action); + } + } + + menu.exec(event->globalPos()); +} + +void QtContextMenu::undoActionTriggered() +{ + MessageUndo().dispatch(); +} + +void QtContextMenu::redoActionTriggered() +{ + MessageRedo().dispatch(); +} diff --git a/src/lib_gui/qt/utility/QtContextMenu.h b/src/lib_gui/qt/utility/QtContextMenu.h new file mode 100644 index 00000000..ab8cfd89 --- /dev/null +++ b/src/lib_gui/qt/utility/QtContextMenu.h @@ -0,0 +1,31 @@ +#ifndef QT_CONTEXT_MENU_H +#define QT_CONTEXT_MENU_H + +#include +#include + +class QtContextMenu + : public QObject +{ + Q_OBJECT + +public: + static QtContextMenu* getInstance(); + + QtContextMenu(); + + void showDefault(QContextMenuEvent* event, QWidget* origin); + void showExtended(QContextMenuEvent* event, QWidget* origin, const std::vector& actions); + +private slots: + void undoActionTriggered(); + void redoActionTriggered(); + +private: + static std::shared_ptr s_instance; + + QAction* m_undoAction; + QAction* m_redoAction; +}; + +#endif // QT_CONTEXT_MENU_H diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index 029dd24c..70d83ab7 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -12,6 +12,7 @@ #include "component/view/View.h" #include "component/view/CompositeView.h" +#include "qt/utility/QtContextMenu.h" #include "qt/utility/utilityQt.h" #include "qt/view/QtViewWidgetWrapper.h" #include "qt/window/project_wizzard/QtProjectWizzard.h" @@ -139,8 +140,6 @@ QtMainWindow::QtMainWindow() setWindowIcon(QIcon((ResourcePaths::getGuiPath() + "icon/logo_1024_1024.png").c_str())); setWindowFlags(Qt::Widget); -// QApplication::setOverrideCursor(Qt::ArrowCursor); - QApplication* app = dynamic_cast(QCoreApplication::instance()); app->installEventFilter(new MouseReleaseFilter(this)); app->installEventFilter(new MouseWheelFilter(this)); @@ -314,6 +313,11 @@ void QtMainWindow::keyPressEvent(QKeyEvent* event) } } +void QtMainWindow::contextMenuEvent(QContextMenuEvent* event) +{ + QtContextMenu::getInstance()->showDefault(event, this); +} + void QtMainWindow::activateWindow() { this->setEnabled(true); diff --git a/src/lib_gui/qt/window/QtMainWindow.h b/src/lib_gui/qt/window/QtMainWindow.h index 0230dc6e..f239ea49 100644 --- a/src/lib_gui/qt/window/QtMainWindow.h +++ b/src/lib_gui/qt/window/QtMainWindow.h @@ -89,6 +89,7 @@ public: protected: bool event(QEvent* event); void keyPressEvent(QKeyEvent* event); + void contextMenuEvent(QContextMenuEvent* event); public slots: void activateWindow(); @@ -157,6 +158,7 @@ private: QAction* m_viewSeparator; QAction** m_recentProjectAction; QAction* m_showTitleBarsAction; + bool m_showDockWidgetTitleBars; QtWindowStack m_windowStack;