From 08f43173c0bab7864f2d8a4b8ffe1001cebf0bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eberhard=20Gr=C3=A4ther?= Date: Tue, 11 Feb 2020 01:19:44 +0100 Subject: [PATCH] ui: Refresh UI state only after every style refresh in each view finished (#917) Separated UI refresh into 'style' and 'state' refresh to avoid race condition between task scheduler thread and UI thread that affected code view state. fixes #916 --- src/lib/CMakeLists.txt | 1 + src/lib/app/Application.cpp | 2 ++ .../controller/UndoRedoController.cpp | 2 +- .../component/controller/UndoRedoController.h | 6 +++--- src/lib/component/view/MainView.h | 1 + .../messaging/type/MessageRefreshUIState.h | 19 +++++++++++++++++++ .../qt/element/code/QtCodeNavigator.cpp | 10 ---------- src/lib_gui/qt/element/code/QtCodeNavigator.h | 6 ------ src/lib_gui/qt/view/QtCodeView.cpp | 2 ++ src/lib_gui/qt/view/QtMainView.cpp | 6 ++++++ src/lib_gui/qt/view/QtMainView.h | 1 + 11 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 src/lib/utility/messaging/type/MessageRefreshUIState.h diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 2e2bbbf4..261dabeb 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -520,6 +520,7 @@ add_files( utility/messaging/type/MessageQuitApplication.h utility/messaging/type/MessageRefresh.h utility/messaging/type/MessageRefreshUI.h + utility/messaging/type/MessageRefreshUIState.h utility/messaging/type/MessageResetZoom.h utility/messaging/type/MessageShowStatus.h utility/messaging/type/MessageStatus.cpp diff --git a/src/lib/app/Application.cpp b/src/lib/app/Application.cpp index 24ef6878..93355ffd 100644 --- a/src/lib/app/Application.cpp +++ b/src/lib/app/Application.cpp @@ -351,6 +351,8 @@ void Application::handleMessage(MessageRefreshUI* message) } m_mainView->refreshViews(); + + m_mainView->refreshUIState(message->isAfterIndexing); } } diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index 2514a3ba..93c60905 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -350,7 +350,7 @@ void UndoRedoController::handleMessage(MessageIndexingFinished* message) m_iterator = m_list.end(); } -void UndoRedoController::handleMessage(MessageRefreshUI* message) +void UndoRedoController::handleMessage(MessageRefreshUIState* message) { std::list::iterator startIterator = m_iterator; do diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index b5bf0b3d..86695292 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -24,7 +24,7 @@ #include "MessageHistoryUndo.h" #include "MessageIndexingFinished.h" #include "MessageListener.h" -#include "MessageRefreshUI.h" +#include "MessageRefreshUIState.h" #include "MessageScrollCode.h" #include "MessageScrollGraph.h" #include "MessageShowError.h" @@ -57,7 +57,7 @@ class UndoRedoController , public MessageListener , public MessageListener , public MessageListener - , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -110,7 +110,7 @@ private: void handleMessage(MessageHistoryToPosition* message) override; void handleMessage(MessageHistoryUndo* message) override; void handleMessage(MessageIndexingFinished* message) override; - void handleMessage(MessageRefreshUI* message) override; + void handleMessage(MessageRefreshUIState* message) override; void handleMessage(MessageScrollCode* message) override; void handleMessage(MessageScrollGraph* message) override; void handleMessage(MessageShowError* message) override; diff --git a/src/lib/component/view/MainView.h b/src/lib/component/view/MainView.h index 105839f3..427edb8f 100644 --- a/src/lib/component/view/MainView.h +++ b/src/lib/component/view/MainView.h @@ -30,6 +30,7 @@ public: virtual void saveLayout() = 0; virtual void refreshView() = 0; + virtual void refreshUIState(bool isAfterIndexing) = 0; virtual void loadWindow(bool showStartWindow) = 0; diff --git a/src/lib/utility/messaging/type/MessageRefreshUIState.h b/src/lib/utility/messaging/type/MessageRefreshUIState.h new file mode 100644 index 00000000..d8ca57f1 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageRefreshUIState.h @@ -0,0 +1,19 @@ +#ifndef MESSAGE_REFRESH_UI_STATE_H +#define MESSAGE_REFRESH_UI_STATE_H + +#include "Message.h" + +class MessageRefreshUIState: public Message +{ +public: + static const std::string getStaticType() + { + return "MessageRefreshUIState"; + } + + MessageRefreshUIState(bool isAfterIndexing) : isAfterIndexing(isAfterIndexing) {} + + bool isAfterIndexing = false; +}; + +#endif // MESSAGE_REFRESH_UI_STATE_H diff --git a/src/lib_gui/qt/element/code/QtCodeNavigator.cpp b/src/lib_gui/qt/element/code/QtCodeNavigator.cpp index 51cac598..150ec665 100644 --- a/src/lib_gui/qt/element/code/QtCodeNavigator.cpp +++ b/src/lib_gui/qt/element/code/QtCodeNavigator.cpp @@ -632,16 +632,6 @@ void QtCodeNavigator::setModeSingle() } } -void QtCodeNavigator::handleMessage(MessageIndexingFinished* message) -{ - m_onQtThread([=]() { clearCache(); }); -} - -void QtCodeNavigator::handleMessage(MessageSwitchColorScheme* message) -{ - m_onQtThread([=]() { clearCache(); }); -} - void QtCodeNavigator::handleMessage(MessageWindowFocus* message) { if (message->focusIn) diff --git a/src/lib_gui/qt/element/code/QtCodeNavigator.h b/src/lib_gui/qt/element/code/QtCodeNavigator.h index 295252b4..e9c8248b 100644 --- a/src/lib_gui/qt/element/code/QtCodeNavigator.h +++ b/src/lib_gui/qt/element/code/QtCodeNavigator.h @@ -5,9 +5,7 @@ #include "ErrorInfo.h" #include "LocationType.h" -#include "MessageIndexingFinished.h" #include "MessageListener.h" -#include "MessageSwitchColorScheme.h" #include "MessageWindowFocus.h" #include "QtCodeFileList.h" #include "QtCodeFileSingle.h" @@ -21,8 +19,6 @@ class SourceLocationFile; class QtCodeNavigator : public QWidget - , public MessageListener - , public MessageListener , public MessageListener { Q_OBJECT @@ -117,8 +113,6 @@ private slots: void setModeSingle(); private: - void handleMessage(MessageIndexingFinished* message) override; - void handleMessage(MessageSwitchColorScheme* message) override; void handleMessage(MessageWindowFocus* message) override; QtThreadedLambdaFunctor m_onQtThread; diff --git a/src/lib_gui/qt/view/QtCodeView.cpp b/src/lib_gui/qt/view/QtCodeView.cpp index 217660f9..c6ff0933 100644 --- a/src/lib_gui/qt/view/QtCodeView.cpp +++ b/src/lib_gui/qt/view/QtCodeView.cpp @@ -35,6 +35,8 @@ void QtCodeView::refreshView() QtCodeArea::clearAnnotationColors(); QtHighlighter::clearHighlightingRules(); + + m_widget->clearCache(); }); } diff --git a/src/lib_gui/qt/view/QtMainView.cpp b/src/lib_gui/qt/view/QtMainView.cpp index b6e47547..3b72b686 100644 --- a/src/lib_gui/qt/view/QtMainView.cpp +++ b/src/lib_gui/qt/view/QtMainView.cpp @@ -1,5 +1,6 @@ #include "QtMainView.h" +#include "MessageRefreshUIState.h" #include "QtMainWindow.h" #include "QtViewWidgetWrapper.h" @@ -95,6 +96,11 @@ void QtMainView::refreshView() m_onQtThread([=]() { m_window->refreshStyle(); }); } +void QtMainView::refreshUIState(bool isAfterIndexing) +{ + m_onQtThread([=]() { MessageRefreshUIState(isAfterIndexing).dispatch(); }); +} + QStatusBar* QtMainView::getStatusBar() { return m_window->statusBar(); diff --git a/src/lib_gui/qt/view/QtMainView.h b/src/lib_gui/qt/view/QtMainView.h index 9e6786ad..5206ec76 100644 --- a/src/lib_gui/qt/view/QtMainView.h +++ b/src/lib_gui/qt/view/QtMainView.h @@ -51,6 +51,7 @@ public: void loadWindow(bool showStartWindow) override; void refreshView() override; + void refreshUIState(bool isAfterIndexing) override; void hideStartScreen() override; void setTitle(const std::wstring& title) override;