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
This commit is contained in:
Eberhard Gräther
2020-02-11 01:19:44 +01:00
committed by GitHub
parent 9fc0a05c3b
commit 08f43173c0
11 changed files with 36 additions and 20 deletions
+1
View File
@@ -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
+2
View File
@@ -351,6 +351,8 @@ void Application::handleMessage(MessageRefreshUI* message)
}
m_mainView->refreshViews();
m_mainView->refreshUIState(message->isAfterIndexing);
}
}
@@ -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<Command>::iterator startIterator = m_iterator;
do
@@ -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<MessageHistoryToPosition>
, public MessageListener<MessageHistoryUndo>
, public MessageListener<MessageIndexingFinished>
, public MessageListener<MessageRefreshUI>
, public MessageListener<MessageRefreshUIState>
, public MessageListener<MessageScrollCode>
, public MessageListener<MessageScrollGraph>
, public MessageListener<MessageShowError>
@@ -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;
+1
View File
@@ -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;
@@ -0,0 +1,19 @@
#ifndef MESSAGE_REFRESH_UI_STATE_H
#define MESSAGE_REFRESH_UI_STATE_H
#include "Message.h"
class MessageRefreshUIState: public Message<MessageRefreshUIState>
{
public:
static const std::string getStaticType()
{
return "MessageRefreshUIState";
}
MessageRefreshUIState(bool isAfterIndexing) : isAfterIndexing(isAfterIndexing) {}
bool isAfterIndexing = false;
};
#endif // MESSAGE_REFRESH_UI_STATE_H
@@ -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)
@@ -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<MessageIndexingFinished>
, public MessageListener<MessageSwitchColorScheme>
, public MessageListener<MessageWindowFocus>
{
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;
+2
View File
@@ -35,6 +35,8 @@ void QtCodeView::refreshView()
QtCodeArea::clearAnnotationColors();
QtHighlighter::clearHighlightingRules();
m_widget->clearCache();
});
}
+6
View File
@@ -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();
+1
View File
@@ -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;