logic: Return to last scroll position in code view on undo

* fixed scrolling on undo
* refactored autoscrolling in code view
* save scroll position of user with MessageScrollCode
This commit is contained in:
Eberhard Graether
2016-01-29 13:08:30 +01:00
parent 427c94457b
commit ead0abfba2
20 changed files with 240 additions and 91 deletions
+1
View File
@@ -238,6 +238,7 @@ add_files(
utility/messaging/type/MessageRefresh.h utility/messaging/type/MessageRefresh.h
utility/messaging/type/MessageResetZoom.h utility/messaging/type/MessageResetZoom.h
utility/messaging/type/MessageSaveProject.h utility/messaging/type/MessageSaveProject.h
utility/messaging/type/MessageScrollCode.h
utility/messaging/type/MessageSearch.h utility/messaging/type/MessageSearch.h
utility/messaging/type/MessageSearchAutocomplete.h utility/messaging/type/MessageSearchAutocomplete.h
utility/messaging/type/MessageShowErrors.h utility/messaging/type/MessageShowErrors.h
@@ -100,7 +100,7 @@ void CodeController::handleMessage(MessageActivateTokens* message)
if (message->isEdge) if (message->isEdge)
{ {
view->showFirstActiveSnippet(activeTokenIds); view->showFirstActiveSnippet(activeTokenIds, message->isLast());
} }
if (message->keepContent()) if (message->keepContent())
@@ -202,6 +202,14 @@ void CodeController::handleMessage(MessageFocusOut* message)
getView()->defocusTokenIds(); getView()->defocusTokenIds();
} }
void CodeController::handleMessage(MessageScrollCode* message)
{
if (!message->isFresh())
{
getView()->scrollToValue(message->value);
}
}
void CodeController::handleMessage(MessageShowErrors* message) void CodeController::handleMessage(MessageShowErrors* message)
{ {
std::vector<std::string> errorMessages; std::vector<std::string> errorMessages;
@@ -11,6 +11,7 @@
#include "utility/messaging/type/MessageFlushUpdates.h" #include "utility/messaging/type/MessageFlushUpdates.h"
#include "utility/messaging/type/MessageFocusIn.h" #include "utility/messaging/type/MessageFocusIn.h"
#include "utility/messaging/type/MessageFocusOut.h" #include "utility/messaging/type/MessageFocusOut.h"
#include "utility/messaging/type/MessageScrollCode.h"
#include "utility/messaging/type/MessageShowErrors.h" #include "utility/messaging/type/MessageShowErrors.h"
#include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageShowScope.h"
#include "utility/types.h" #include "utility/types.h"
@@ -31,6 +32,7 @@ class CodeController
, public MessageListener<MessageFlushUpdates> , public MessageListener<MessageFlushUpdates>
, public MessageListener<MessageFocusIn> , public MessageListener<MessageFocusIn>
, public MessageListener<MessageFocusOut> , public MessageListener<MessageFocusOut>
, public MessageListener<MessageScrollCode>
, public MessageListener<MessageShowErrors> , public MessageListener<MessageShowErrors>
, public MessageListener<MessageShowScope> , public MessageListener<MessageShowScope>
{ {
@@ -47,6 +49,7 @@ private:
virtual void handleMessage(MessageFlushUpdates* message); virtual void handleMessage(MessageFlushUpdates* message);
virtual void handleMessage(MessageFocusIn* message); virtual void handleMessage(MessageFocusIn* message);
virtual void handleMessage(MessageFocusOut* message); virtual void handleMessage(MessageFocusOut* message);
virtual void handleMessage(MessageScrollCode* message);
virtual void handleMessage(MessageShowErrors* message); virtual void handleMessage(MessageShowErrors* message);
virtual void handleMessage(MessageShowScope* message); virtual void handleMessage(MessageShowScope* message);
@@ -188,6 +188,22 @@ void UndoRedoController::handleMessage(MessageRefresh* message)
} }
} }
void UndoRedoController::handleMessage(MessageScrollCode* message)
{
if (!m_lastCommand.message)
{
return;
}
if (m_lastCommand.subMessage && m_lastCommand.subMessage->getType() == message->getType())
{
static_cast<MessageScrollCode*>(m_lastCommand.subMessage.get())->value = message->value;
return;
}
m_lastCommand.subMessage = std::make_shared<MessageScrollCode>(*message);
}
void UndoRedoController::handleMessage(MessageSearch* message) void UndoRedoController::handleMessage(MessageSearch* message)
{ {
if (m_lastCommand.message && m_lastCommand.message->getType() == message->getType() && if (m_lastCommand.message && m_lastCommand.message->getType() == message->getType() &&
@@ -228,12 +244,19 @@ void UndoRedoController::replayCommands(bool removeLast)
{ {
m = m_undo[i].message; m = m_undo[i].message;
m->undoRedoType = MessageBase::UNDOTYPE_IGNORE; m->undoRedoType = MessageBase::UNDOTYPE_IGNORE;
m->setIsLast(false);
m->dispatch(); m->dispatch();
i++; i++;
} }
m = m_undo.back().message; m = m_undo.back().message;
std::shared_ptr<MessageBase> sm;
if (m_lastCommand.order == 0)
{
sm = m_undo.back().subMessage;
}
if (removeLast) if (removeLast)
{ {
m_undo.pop_back(); m_undo.pop_back();
@@ -244,12 +267,25 @@ void UndoRedoController::replayCommands(bool removeLast)
m->undoRedoType = MessageBase::UNDOTYPE_IGNORE; m->undoRedoType = MessageBase::UNDOTYPE_IGNORE;
} }
m->setIsLast(!sm);
m->dispatch(); m->dispatch();
if (sm)
{
sm->undoRedoType = MessageBase::UNDOTYPE_IGNORE;
sm->setIsLast(true);
sm->dispatch();
}
} }
} }
void UndoRedoController::processCommand(const Command& command) void UndoRedoController::processCommand(Command command)
{ {
if (command.order == 0 && command.message->keepContent())
{
command.order = 1;
}
switch (command.message->undoRedoType) switch (command.message->undoRedoType)
{ {
case MessageBase::UNDOTYPE_NORMAL: case MessageBase::UNDOTYPE_NORMAL:
@@ -17,6 +17,7 @@
#include "utility/messaging/type/MessageLoadProject.h" #include "utility/messaging/type/MessageLoadProject.h"
#include "utility/messaging/type/MessageRedo.h" #include "utility/messaging/type/MessageRedo.h"
#include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageRefresh.h"
#include "utility/messaging/type/MessageScrollCode.h"
#include "utility/messaging/type/MessageSearch.h" #include "utility/messaging/type/MessageSearch.h"
#include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageShowScope.h"
#include "utility/messaging/type/MessageUndo.h" #include "utility/messaging/type/MessageUndo.h"
@@ -41,6 +42,7 @@ class UndoRedoController
, public MessageListener<MessageLoadProject> , public MessageListener<MessageLoadProject>
, public MessageListener<MessageRedo> , public MessageListener<MessageRedo>
, public MessageListener<MessageRefresh> , public MessageListener<MessageRefresh>
, public MessageListener<MessageScrollCode>
, public MessageListener<MessageSearch> , public MessageListener<MessageSearch>
, public MessageListener<MessageShowScope> , public MessageListener<MessageShowScope>
, public MessageListener<MessageUndo> , public MessageListener<MessageUndo>
@@ -57,6 +59,7 @@ private:
Command(std::shared_ptr<MessageBase> message, size_t order); Command(std::shared_ptr<MessageBase> message, size_t order);
std::shared_ptr<MessageBase> message; std::shared_ptr<MessageBase> message;
std::shared_ptr<MessageBase> subMessage;
size_t order; size_t order;
}; };
@@ -72,13 +75,14 @@ private:
virtual void handleMessage(MessageLoadProject* message); virtual void handleMessage(MessageLoadProject* message);
virtual void handleMessage(MessageRedo* message); virtual void handleMessage(MessageRedo* message);
virtual void handleMessage(MessageRefresh* message); virtual void handleMessage(MessageRefresh* message);
virtual void handleMessage(MessageScrollCode* message);
virtual void handleMessage(MessageSearch* message); virtual void handleMessage(MessageSearch* message);
virtual void handleMessage(MessageShowScope* message); virtual void handleMessage(MessageShowScope* message);
virtual void handleMessage(MessageUndo* message); virtual void handleMessage(MessageUndo* message);
void replayCommands(bool removeLast); void replayCommands(bool removeLast);
void processCommand(const Command& command); void processCommand(Command command);
void processNormalCommand(const Command& command); void processNormalCommand(const Command& command);
void processRedoCommand(const Command& command); void processRedoCommand(const Command& command);
void processUndoCommand(const Command& command); void processUndoCommand(const Command& command);
@@ -28,9 +28,8 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy); const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy);
const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy); const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy);
m = std::make_shared<MessageActivateTokens>(m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId)); m = std::make_shared<MessageActivateTokens>(message, m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId));
m->isAggregation = true; m->isAggregation = true;
m->undoRedoType = message->undoRedoType;
} }
else else
{ {
@@ -43,10 +42,8 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
if (edgeId) if (edgeId)
{ {
m = std::make_shared<MessageActivateTokens>(std::vector<Id>(1, edgeId)); m = std::make_shared<MessageActivateTokens>(message, std::vector<Id>(1, edgeId));
m->isEdge = true; m->isEdge = true;
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
} }
} }
return m; return m;
@@ -71,11 +68,7 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
return nullptr; return nullptr;
} }
std::shared_ptr<MessageActivateTokens> m; return std::make_shared<MessageActivateTokens>(message, std::vector<Id>(1, fileId));
m = std::make_shared<MessageActivateTokens>(std::vector<Id>(1, fileId));
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
return m;
} }
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateNodes* message) const std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateNodes* message) const
@@ -101,20 +94,14 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
} }
std::shared_ptr<MessageActivateTokens> m; std::shared_ptr<MessageActivateTokens> m;
m = std::make_shared<MessageActivateTokens>(nodeIds); m = std::make_shared<MessageActivateTokens>(message, nodeIds);
m->isFromSystem = message->isFromSystem; m->isFromSystem = message->isFromSystem;
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
return m; return m;
} }
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateTokenIds* message) const std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageActivateTokenIds* message) const
{ {
std::shared_ptr<MessageActivateTokens> m; return std::make_shared<MessageActivateTokens>(message, message->tokenIds);
m = std::make_shared<MessageActivateTokens>(message->tokenIds);
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
return m;
} }
std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageSearch* message) const std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(const MessageSearch* message) const
@@ -144,13 +131,11 @@ std::shared_ptr<MessageActivateTokens> ActivationTranslator::translateMessage(co
std::vector<Id> tokenIds = m_storageAccess->getTokenIdsForMatches(matches); std::vector<Id> tokenIds = m_storageAccess->getTokenIdsForMatches(matches);
tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds); tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds);
std::shared_ptr<MessageActivateTokens> m; std::shared_ptr<MessageActivateTokens> m = std::make_shared<MessageActivateTokens>(message, tokenIds);
m = std::make_shared<MessageActivateTokens>(tokenIds);
m->undoRedoType = message->undoRedoType;
m->setKeepContent(message->keepContent());
if (message->isFresh()) if (message->isFresh())
{ {
m->isFromSearch = true; m->isFromSearch = true;
} }
return m; return m;
} }
+3 -1
View File
@@ -59,7 +59,7 @@ public:
virtual void setFileState(const FilePath filePath, FileState state) = 0; virtual void setFileState(const FilePath filePath, FileState state) = 0;
virtual void showFirstActiveSnippet(const std::vector<Id>& activeTokenIds) = 0; virtual void showFirstActiveSnippet(const std::vector<Id>& activeTokenIds, bool scrollTo) = 0;
virtual void showActiveTokenIds(const std::vector<Id>& activeTokenIds) = 0; virtual void showActiveTokenIds(const std::vector<Id>& activeTokenIds) = 0;
virtual void focusTokenIds(const std::vector<Id>& focusedTokenIds) = 0; virtual void focusTokenIds(const std::vector<Id>& focusedTokenIds) = 0;
@@ -67,6 +67,8 @@ public:
virtual void showContents() = 0; virtual void showContents() = 0;
virtual void scrollToValue(int value) = 0;
private: private:
CodeController* getController(); CodeController* getController();
}; };
+9 -2
View File
@@ -20,6 +20,7 @@ public:
, m_sendAsTask(true) , m_sendAsTask(true)
, m_keepContent(false) , m_keepContent(false)
, m_cancelled(false) , m_cancelled(false)
, m_isLast(true)
{ {
} }
@@ -45,9 +46,14 @@ public:
return (undoRedoType == UNDOTYPE_NORMAL); return (undoRedoType == UNDOTYPE_NORMAL);
} }
bool isIgnorable() const bool isLast() const
{ {
return (undoRedoType == UNDOTYPE_IGNORE); return m_isLast;
}
void setIsLast(bool isLast)
{
m_isLast = isLast;
} }
void setKeepContent(bool keepContent) void setKeepContent(bool keepContent)
@@ -86,6 +92,7 @@ private:
bool m_sendAsTask; bool m_sendAsTask;
bool m_keepContent; bool m_keepContent;
bool m_cancelled; bool m_cancelled;
bool m_isLast;
}; };
#endif // MESSAGE_BASE_H #endif // MESSAGE_BASE_H
@@ -8,13 +8,16 @@ class MessageActivateTokens
: public Message<MessageActivateTokens> : public Message<MessageActivateTokens>
{ {
public: public:
MessageActivateTokens(const std::vector<Id>& tokenIds) MessageActivateTokens(const MessageBase* other, const std::vector<Id>& tokenIds)
: tokenIds(tokenIds) : tokenIds(tokenIds)
, isEdge(false) , isEdge(false)
, isAggregation(false) , isAggregation(false)
, isFromSystem(false) , isFromSystem(false)
, isFromSearch(false) , isFromSearch(false)
{ {
undoRedoType = other->undoRedoType;
setKeepContent(other->keepContent());
setIsLast(other->isLast());
} }
static const std::string getStaticType() static const std::string getStaticType()
@@ -0,0 +1,23 @@
#ifndef MESSAGE_SCROLL_CODE_H
#define MESSAGE_SCROLL_CODE_H
#include "utility/messaging/Message.h"
class MessageScrollCode
: public Message<MessageScrollCode>
{
public:
MessageScrollCode(int value)
: value(value)
{
}
static const std::string getStaticType()
{
return "MessageScrollCode";
}
int value;
};
#endif // MESSAGE_SCROLL_CODE_H
+5
View File
@@ -173,6 +173,11 @@ std::shared_ptr<TokenLocationFile> QtCodeArea::getTokenLocationFile() const
return m_locationFile; return m_locationFile;
} }
QtCodeFile* QtCodeArea::getFile() const
{
return m_fileWidget;
}
void QtCodeArea::lineNumberAreaPaintEvent(QPaintEvent *event) void QtCodeArea::lineNumberAreaPaintEvent(QPaintEvent *event)
{ {
QPainter painter(m_lineNumberArea); QPainter painter(m_lineNumberArea);
+1
View File
@@ -71,6 +71,7 @@ public:
uint getEndLineNumber() const; uint getEndLineNumber() const;
std::shared_ptr<TokenLocationFile> getTokenLocationFile() const; std::shared_ptr<TokenLocationFile> getTokenLocationFile() const;
QtCodeFile* getFile() const;
void lineNumberAreaPaintEvent(QPaintEvent* event); void lineNumberAreaPaintEvent(QPaintEvent* event);
int lineNumberDigits() const; int lineNumberDigits() const;
+9 -10
View File
@@ -265,13 +265,13 @@ QtCodeSnippet* QtCodeFile::findFirstActiveSnippet() const
return nullptr; return nullptr;
} }
bool QtCodeFile::openCollapsedActiveSnippet() const bool QtCodeFile::isCollapsedActiveFile() const
{ {
bool isActiveFile = false;
if (m_locationFile) if (m_locationFile)
{ {
std::vector<Id> ids = getActiveTokenIds(); std::vector<Id> ids = getActiveTokenIds();
bool isActiveFile = false;
m_locationFile->forEachTokenLocation( m_locationFile->forEachTokenLocation(
[&](TokenLocation* location) [&](TokenLocation* location)
{ {
@@ -281,15 +281,9 @@ bool QtCodeFile::openCollapsedActiveSnippet() const
} }
} }
); );
if (isActiveFile)
{
showSnippets();
return true;
}
} }
return false; return isActiveFile;
} }
void QtCodeFile::updateContent() void QtCodeFile::updateContent()
@@ -430,7 +424,7 @@ void QtCodeFile::clickedMaximizeButton() const
).dispatch(); ).dispatch();
} }
void QtCodeFile::showSnippets() const void QtCodeFile::requestSnippets() const
{ {
if (m_snippetsRequested) if (m_snippetsRequested)
{ {
@@ -450,6 +444,11 @@ void QtCodeFile::showSnippets() const
msg.dispatch(); msg.dispatch();
} }
bool QtCodeFile::hasSnippets() const
{
return m_snippets.size() > 0;
}
void QtCodeFile::handleMessage(MessageWindowFocus* message) void QtCodeFile::handleMessage(MessageWindowFocus* message)
{ {
updateTitleBar(); updateTitleBar();
+3 -2
View File
@@ -59,7 +59,7 @@ public:
); );
QtCodeSnippet* findFirstActiveSnippet() const; QtCodeSnippet* findFirstActiveSnippet() const;
bool openCollapsedActiveSnippet() const; bool isCollapsedActiveFile() const;
void updateContent(); void updateContent();
@@ -69,7 +69,8 @@ public:
void setSnippets(); void setSnippets();
void setMaximized(); void setMaximized();
void showSnippets() const; void requestSnippets() const;
bool hasSnippets() const;
public slots: public slots:
void clickedMinimizeButton() const; void clickedMinimizeButton() const;
+77 -25
View File
@@ -2,10 +2,12 @@
#include <QPropertyAnimation> #include <QPropertyAnimation>
#include <QScrollBar> #include <QScrollBar>
#include <QTimer>
#include <QVariant> #include <QVariant>
#include <QVBoxLayout> #include <QVBoxLayout>
#include "utility/file/FileSystem.h" #include "utility/file/FileSystem.h"
#include "utility/messaging/type/MessageScrollCode.h"
#include "data/location/TokenLocationFile.h" #include "data/location/TokenLocationFile.h"
#include "qt/element/QtCodeFile.h" #include "qt/element/QtCodeFile.h"
@@ -13,6 +15,8 @@
QtCodeFileList::QtCodeFileList(QWidget* parent) QtCodeFileList::QtCodeFileList(QWidget* parent)
: QScrollArea(parent) : QScrollArea(parent)
, m_scrollToFile(nullptr)
, m_value(0)
{ {
setObjectName("code_file_list_base"); setObjectName("code_file_list_base");
@@ -28,6 +32,7 @@ QtCodeFileList::QtCodeFileList(QWidget* parent)
setWidgetResizable(true); setWidgetResizable(true);
setWidget(m_frame.get()); setWidget(m_frame.get());
connect(this->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrolled(int)));
connect(this, SIGNAL(shouldScrollToSnippet(QtCodeSnippet*)), this, SLOT(scrollToSnippet(QtCodeSnippet*)), Qt::QueuedConnection); connect(this, SIGNAL(shouldScrollToSnippet(QtCodeSnippet*)), this, SLOT(scrollToSnippet(QtCodeSnippet*)), Qt::QueuedConnection);
} }
@@ -112,37 +117,26 @@ void QtCodeFileList::showActiveTokenIds()
updateFiles(); updateFiles();
} }
bool QtCodeFileList::scrollToFirstActiveSnippet() void QtCodeFileList::showFirstActiveSnippet(bool scrollTo)
{ {
updateFiles(); updateFiles();
QtCodeSnippet* snippet = nullptr; QtCodeSnippet* snippet = getFirstActiveSnippet();
for (std::shared_ptr<QtCodeFile> file: m_files)
{
snippet = file->findFirstActiveSnippet();
if (snippet)
{
if (!snippet->isVisible())
{
file->showSnippets();
}
emit shouldScrollToSnippet(snippet); if (!snippet)
return true; {
} expandActiveSnippetFile(scrollTo);
return;
} }
return false; if (!snippet->isVisible())
}
void QtCodeFileList::expandActiveSnippetFile()
{
for (std::shared_ptr<QtCodeFile> file: m_files)
{ {
if (file->openCollapsedActiveSnippet()) snippet->getFile()->setSnippets();
{ }
return;
} if (scrollTo)
{
emit shouldScrollToSnippet(snippet);
} }
} }
@@ -193,11 +187,36 @@ void QtCodeFileList::showContents()
} }
} }
void QtCodeFileList::scrollToValue(int value)
{
m_value = value;
QTimer::singleShot(100, this, SLOT(setValue()));
}
void QtCodeFileList::scrollToActiveFileIfRequested()
{
if (m_scrollToFile && m_scrollToFile->hasSnippets())
{
showFirstActiveSnippet(true);
m_scrollToFile = nullptr;
}
}
void QtCodeFileList::scrolled(int value)
{
MessageScrollCode(value).dispatch();
}
void QtCodeFileList::scrollToSnippet(QtCodeSnippet* snippet) void QtCodeFileList::scrollToSnippet(QtCodeSnippet* snippet)
{ {
this->ensureWidgetVisibleAnimated(snippet, snippet->getFirstActiveLineRect()); this->ensureWidgetVisibleAnimated(snippet, snippet->getFirstActiveLineRect());
} }
void QtCodeFileList::setValue()
{
this->verticalScrollBar()->setValue(m_value);
}
QtCodeFile* QtCodeFileList::getFile(const FilePath filePath) QtCodeFile* QtCodeFileList::getFile(const FilePath filePath)
{ {
QtCodeFile* file = nullptr; QtCodeFile* file = nullptr;
@@ -225,6 +244,21 @@ QtCodeFile* QtCodeFileList::getFile(const FilePath filePath)
return file; return file;
} }
QtCodeSnippet* QtCodeFileList::getFirstActiveSnippet() const
{
QtCodeSnippet* snippet = nullptr;
for (std::shared_ptr<QtCodeFile> file: m_files)
{
snippet = file->findFirstActiveSnippet();
if (snippet)
{
break;
}
}
return snippet;
}
void QtCodeFileList::updateFiles() void QtCodeFileList::updateFiles()
{ {
for (std::shared_ptr<QtCodeFile> file: m_files) for (std::shared_ptr<QtCodeFile> file: m_files)
@@ -233,6 +267,24 @@ void QtCodeFileList::updateFiles()
} }
} }
void QtCodeFileList::expandActiveSnippetFile(bool scrollTo)
{
for (std::shared_ptr<QtCodeFile> file: m_files)
{
if (file->isCollapsedActiveFile())
{
file->requestSnippets();
if (scrollTo)
{
m_scrollToFile = file.get();
}
return;
}
}
}
void QtCodeFileList::ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF rect) void QtCodeFileList::ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF rect)
{ {
if (!widget()->isAncestorOf(childWidget)) if (!widget()->isAncestorOf(childWidget))
@@ -259,7 +311,7 @@ void QtCodeFileList::ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF re
if (scrollBar && value != 0) if (scrollBar && value != 0)
{ {
QPropertyAnimation* anim = new QPropertyAnimation(scrollBar, "value"); QPropertyAnimation* anim = new QPropertyAnimation(scrollBar, "value");
anim->setDuration(500); anim->setDuration(300);
anim->setStartValue(scrollBar->value()); anim->setStartValue(scrollBar->value());
anim->setEndValue(scrollBar->value() + value); anim->setEndValue(scrollBar->value() + value);
anim->setEasingCurve(QEasingCurve::InOutQuad); anim->setEasingCurve(QEasingCurve::InOutQuad);
+10 -2
View File
@@ -55,8 +55,7 @@ public:
void showActiveTokenIds(); void showActiveTokenIds();
bool scrollToFirstActiveSnippet(); void showFirstActiveSnippet(bool scrollTo);
void expandActiveSnippetFile();
void focusTokenIds(const std::vector<Id>& focusedTokenIds); void focusTokenIds(const std::vector<Id>& focusedTokenIds);
void defocusTokenIds(); void defocusTokenIds();
@@ -66,15 +65,21 @@ public:
void setFileMaximized(const FilePath path); void setFileMaximized(const FilePath path);
void showContents(); void showContents();
void scrollToValue(int value);
void scrollToActiveFileIfRequested();
private slots: private slots:
void scrolled(int value);
void scrollToSnippet(QtCodeSnippet* snippet); void scrollToSnippet(QtCodeSnippet* snippet);
void setValue();
private: private:
QtCodeFile* getFile(const FilePath filePath); QtCodeFile* getFile(const FilePath filePath);
QtCodeSnippet* getFirstActiveSnippet() const;
void updateFiles(); void updateFiles();
void expandActiveSnippetFile(bool scrollTo);
void ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF rect); void ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF rect);
std::shared_ptr<QFrame> m_frame; std::shared_ptr<QFrame> m_frame;
@@ -83,6 +88,9 @@ private:
std::vector<Id> m_activeTokenIds; std::vector<Id> m_activeTokenIds;
std::vector<Id> m_focusedTokenIds; std::vector<Id> m_focusedTokenIds;
std::vector<std::string> m_errorMessages; std::vector<std::string> m_errorMessages;
QtCodeFile* m_scrollToFile;
int m_value;
}; };
#endif // QT_CODE_FILE_LIST #endif // QT_CODE_FILE_LIST
+5
View File
@@ -110,6 +110,11 @@ QtCodeSnippet::~QtCodeSnippet()
{ {
} }
QtCodeFile* QtCodeSnippet::getFile() const
{
return m_codeArea->getFile();
}
uint QtCodeSnippet::getStartLineNumber() const uint QtCodeSnippet::getStartLineNumber() const
{ {
return m_codeArea->getStartLineNumber(); return m_codeArea->getStartLineNumber();
+2
View File
@@ -32,6 +32,8 @@ public:
); );
virtual ~QtCodeSnippet(); virtual ~QtCodeSnippet();
QtCodeFile* getFile() const;
uint getStartLineNumber() const; uint getStartLineNumber() const;
uint getEndLineNumber() const; uint getEndLineNumber() const;
+18 -17
View File
@@ -16,12 +16,12 @@ QtCodeView::QtCodeView(ViewLayout* viewLayout)
, m_addCodeSnippetsFunctor(std::bind(&QtCodeView::doAddCodeSnippets, this, std::placeholders::_1, std::placeholders::_2)) , m_addCodeSnippetsFunctor(std::bind(&QtCodeView::doAddCodeSnippets, this, std::placeholders::_1, std::placeholders::_2))
, m_showCodeFileFunctor(std::bind(&QtCodeView::doShowCodeFile, this, std::placeholders::_1)) , m_showCodeFileFunctor(std::bind(&QtCodeView::doShowCodeFile, this, std::placeholders::_1))
, m_setFileStateFunctor(std::bind(&QtCodeView::doSetFileState, this, std::placeholders::_1, std::placeholders::_2)) , m_setFileStateFunctor(std::bind(&QtCodeView::doSetFileState, this, std::placeholders::_1, std::placeholders::_2))
, m_doShowFirstActiveSnippetFunctor(std::bind(&QtCodeView::doShowFirstActiveSnippet, this, std::placeholders::_1)) , m_doShowFirstActiveSnippetFunctor(std::bind(&QtCodeView::doShowFirstActiveSnippet, this, std::placeholders::_1, std::placeholders::_2))
, m_doShowActiveTokenIdsFunctor(std::bind(&QtCodeView::doShowActiveTokenIds, this, std::placeholders::_1)) , m_doShowActiveTokenIdsFunctor(std::bind(&QtCodeView::doShowActiveTokenIds, this, std::placeholders::_1))
, m_focusTokenIdsFunctor(std::bind(&QtCodeView::doFocusTokenIds, this, std::placeholders::_1)) , m_focusTokenIdsFunctor(std::bind(&QtCodeView::doFocusTokenIds, this, std::placeholders::_1))
, m_defocusTokenIdsFunctor(std::bind(&QtCodeView::doDefocusTokenIds, this)) , m_defocusTokenIdsFunctor(std::bind(&QtCodeView::doDefocusTokenIds, this))
, m_showContentsFunctor(std::bind(&QtCodeView::doShowContents, this)) , m_showContentsFunctor(std::bind(&QtCodeView::doShowContents, this))
, m_isExpanding(false) , m_scrollToValueFunctor(std::bind(&QtCodeView::doScrollToValue, this, std::placeholders::_1))
{ {
m_widget = new QtCodeFileList(); m_widget = new QtCodeFileList();
setStyleSheet(); setStyleSheet();
@@ -75,9 +75,9 @@ void QtCodeView::setFileState(const FilePath filePath, FileState state)
m_setFileStateFunctor(filePath, state); m_setFileStateFunctor(filePath, state);
} }
void QtCodeView::showFirstActiveSnippet(const std::vector<Id>& activeTokenIds) void QtCodeView::showFirstActiveSnippet(const std::vector<Id>& activeTokenIds, bool scrollTo)
{ {
m_doShowFirstActiveSnippetFunctor(activeTokenIds); m_doShowFirstActiveSnippetFunctor(activeTokenIds, scrollTo);
} }
void QtCodeView::showActiveTokenIds(const std::vector<Id>& activeTokenIds) void QtCodeView::showActiveTokenIds(const std::vector<Id>& activeTokenIds)
@@ -100,6 +100,11 @@ void QtCodeView::showContents()
m_showContentsFunctor(); m_showContentsFunctor();
} }
void QtCodeView::scrollToValue(int value)
{
m_scrollToValueFunctor(value);
}
void QtCodeView::doRefreshView() void QtCodeView::doRefreshView()
{ {
setStyleSheet(); setStyleSheet();
@@ -155,11 +160,7 @@ void QtCodeView::doAddCodeSnippets(const std::vector<CodeSnippetParams>& snippet
setStyleSheet(); // so property "isLast" of QtCodeSnippet is computed correctly setStyleSheet(); // so property "isLast" of QtCodeSnippet is computed correctly
if (m_isExpanding) m_widget->scrollToActiveFileIfRequested();
{
m_widget->scrollToFirstActiveSnippet();
m_isExpanding = false;
}
} }
void QtCodeView::doShowCodeFile(const CodeSnippetParams& params) void QtCodeView::doShowCodeFile(const CodeSnippetParams& params)
@@ -183,15 +184,10 @@ void QtCodeView::doSetFileState(const FilePath filePath, FileState state)
} }
} }
void QtCodeView::doShowFirstActiveSnippet(const std::vector<Id>& activeTokenIds) void QtCodeView::doShowFirstActiveSnippet(const std::vector<Id>& activeTokenIds, bool scrollTo)
{ {
m_widget->setActiveTokenIds(activeTokenIds); m_widget->setActiveTokenIds(activeTokenIds);
m_widget->showFirstActiveSnippet(scrollTo);
if (!m_widget->scrollToFirstActiveSnippet())
{
m_widget->expandActiveSnippetFile();
m_isExpanding = true;
}
} }
void QtCodeView::doShowActiveTokenIds(const std::vector<Id>& activeTokenIds) void QtCodeView::doShowActiveTokenIds(const std::vector<Id>& activeTokenIds)
@@ -210,11 +206,16 @@ void QtCodeView::doDefocusTokenIds()
m_widget->defocusTokenIds(); m_widget->defocusTokenIds();
} }
void QtCodeView::doShowContents() const void QtCodeView::doShowContents()
{ {
m_widget->showContents(); m_widget->showContents();
} }
void QtCodeView::doScrollToValue(int value)
{
m_widget->scrollToValue(value);
}
void QtCodeView::setStyleSheet() const void QtCodeView::setStyleSheet() const
{ {
utility::setWidgetBackgroundColor(m_widget, ColorScheme::getInstance()->getColor("code/background")); utility::setWidgetBackgroundColor(m_widget, ColorScheme::getInstance()->getColor("code/background"));
+9 -6
View File
@@ -35,7 +35,7 @@ public:
virtual void setFileState(const FilePath filePath, FileState state); virtual void setFileState(const FilePath filePath, FileState state);
virtual void showFirstActiveSnippet(const std::vector<Id>& activeTokenIds); virtual void showFirstActiveSnippet(const std::vector<Id>& activeTokenIds, bool scrollTo);
virtual void showActiveTokenIds(const std::vector<Id>& activeTokenIds); virtual void showActiveTokenIds(const std::vector<Id>& activeTokenIds);
virtual void focusTokenIds(const std::vector<Id>& focusedTokenIds); virtual void focusTokenIds(const std::vector<Id>& focusedTokenIds);
@@ -43,6 +43,8 @@ public:
virtual void showContents(); virtual void showContents();
virtual void scrollToValue(int value);
private: private:
void doRefreshView(); void doRefreshView();
@@ -52,13 +54,15 @@ private:
void doSetFileState(const FilePath filePath, FileState state); void doSetFileState(const FilePath filePath, FileState state);
void doShowFirstActiveSnippet(const std::vector<Id>& activeTokenIds); void doShowFirstActiveSnippet(const std::vector<Id>& activeTokenIds, bool scrollTo);
void doShowActiveTokenIds(const std::vector<Id>& activeTokenIds); void doShowActiveTokenIds(const std::vector<Id>& activeTokenIds);
void doFocusTokenIds(const std::vector<Id>& focusedTokenIds); void doFocusTokenIds(const std::vector<Id>& focusedTokenIds);
void doDefocusTokenIds(); void doDefocusTokenIds();
void doShowContents() const; void doShowContents();
void doScrollToValue(int value);
void setStyleSheet() const; void setStyleSheet() const;
@@ -67,18 +71,17 @@ private:
QtThreadedFunctor<const std::vector<CodeSnippetParams>&, bool> m_addCodeSnippetsFunctor; QtThreadedFunctor<const std::vector<CodeSnippetParams>&, bool> m_addCodeSnippetsFunctor;
QtThreadedFunctor<const CodeSnippetParams&> m_showCodeFileFunctor; QtThreadedFunctor<const CodeSnippetParams&> m_showCodeFileFunctor;
QtThreadedFunctor<const FilePath, FileState> m_setFileStateFunctor; QtThreadedFunctor<const FilePath, FileState> m_setFileStateFunctor;
QtThreadedFunctor<const std::vector<Id>&> m_doShowFirstActiveSnippetFunctor; QtThreadedFunctor<const std::vector<Id>&, bool> m_doShowFirstActiveSnippetFunctor;
QtThreadedFunctor<const std::vector<Id>&> m_doShowActiveTokenIdsFunctor; QtThreadedFunctor<const std::vector<Id>&> m_doShowActiveTokenIdsFunctor;
QtThreadedFunctor<const std::vector<Id>&> m_focusTokenIdsFunctor; QtThreadedFunctor<const std::vector<Id>&> m_focusTokenIdsFunctor;
QtThreadedFunctor<> m_defocusTokenIdsFunctor; QtThreadedFunctor<> m_defocusTokenIdsFunctor;
QtThreadedFunctor<> m_showContentsFunctor; QtThreadedFunctor<> m_showContentsFunctor;
QtThreadedFunctor<int> m_scrollToValueFunctor;
QtCodeFileList* m_widget; QtCodeFileList* m_widget;
std::vector<Id> m_activeTokenIds; std::vector<Id> m_activeTokenIds;
std::vector<std::string> m_errorMessages; std::vector<std::string> m_errorMessages;
bool m_isExpanding;
}; };
# endif // QT_CODE_VIEW_H # endif // QT_CODE_VIEW_H