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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -35,6 +35,8 @@ void QtCodeView::refreshView()
|
||||
|
||||
QtCodeArea::clearAnnotationColors();
|
||||
QtHighlighter::clearHighlightingRules();
|
||||
|
||||
m_widget->clearCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user