diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index c3cbf186..2fe989d0 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -238,6 +238,7 @@ add_files( utility/messaging/type/MessageRefresh.h utility/messaging/type/MessageResetZoom.h utility/messaging/type/MessageSaveProject.h + utility/messaging/type/MessageScrollCode.h utility/messaging/type/MessageSearch.h utility/messaging/type/MessageSearchAutocomplete.h utility/messaging/type/MessageShowErrors.h diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index 650dcc75..1c5426da 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -100,7 +100,7 @@ void CodeController::handleMessage(MessageActivateTokens* message) if (message->isEdge) { - view->showFirstActiveSnippet(activeTokenIds); + view->showFirstActiveSnippet(activeTokenIds, message->isLast()); } if (message->keepContent()) @@ -202,6 +202,14 @@ void CodeController::handleMessage(MessageFocusOut* message) getView()->defocusTokenIds(); } +void CodeController::handleMessage(MessageScrollCode* message) +{ + if (!message->isFresh()) + { + getView()->scrollToValue(message->value); + } +} + void CodeController::handleMessage(MessageShowErrors* message) { std::vector errorMessages; diff --git a/src/lib/component/controller/CodeController.h b/src/lib/component/controller/CodeController.h index 9729fc29..aa6ba4c2 100644 --- a/src/lib/component/controller/CodeController.h +++ b/src/lib/component/controller/CodeController.h @@ -11,6 +11,7 @@ #include "utility/messaging/type/MessageFlushUpdates.h" #include "utility/messaging/type/MessageFocusIn.h" #include "utility/messaging/type/MessageFocusOut.h" +#include "utility/messaging/type/MessageScrollCode.h" #include "utility/messaging/type/MessageShowErrors.h" #include "utility/messaging/type/MessageShowScope.h" #include "utility/types.h" @@ -31,6 +32,7 @@ class CodeController , public MessageListener , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener { @@ -47,6 +49,7 @@ private: virtual void handleMessage(MessageFlushUpdates* message); virtual void handleMessage(MessageFocusIn* message); virtual void handleMessage(MessageFocusOut* message); + virtual void handleMessage(MessageScrollCode* message); virtual void handleMessage(MessageShowErrors* message); virtual void handleMessage(MessageShowScope* message); diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index 74465383..70717bf1 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -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(m_lastCommand.subMessage.get())->value = message->value; + return; + } + + m_lastCommand.subMessage = std::make_shared(*message); +} + void UndoRedoController::handleMessage(MessageSearch* message) { 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->undoRedoType = MessageBase::UNDOTYPE_IGNORE; + m->setIsLast(false); m->dispatch(); i++; } m = m_undo.back().message; + std::shared_ptr sm; + if (m_lastCommand.order == 0) + { + sm = m_undo.back().subMessage; + } + if (removeLast) { m_undo.pop_back(); @@ -244,12 +267,25 @@ void UndoRedoController::replayCommands(bool removeLast) m->undoRedoType = MessageBase::UNDOTYPE_IGNORE; } + m->setIsLast(!sm); 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) { case MessageBase::UNDOTYPE_NORMAL: diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index 7e8b7bca..722b1bfc 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -17,6 +17,7 @@ #include "utility/messaging/type/MessageLoadProject.h" #include "utility/messaging/type/MessageRedo.h" #include "utility/messaging/type/MessageRefresh.h" +#include "utility/messaging/type/MessageScrollCode.h" #include "utility/messaging/type/MessageSearch.h" #include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageUndo.h" @@ -41,6 +42,7 @@ class UndoRedoController , public MessageListener , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -57,6 +59,7 @@ private: Command(std::shared_ptr message, size_t order); std::shared_ptr message; + std::shared_ptr subMessage; size_t order; }; @@ -72,13 +75,14 @@ private: virtual void handleMessage(MessageLoadProject* message); virtual void handleMessage(MessageRedo* message); virtual void handleMessage(MessageRefresh* message); + virtual void handleMessage(MessageScrollCode* message); virtual void handleMessage(MessageSearch* message); virtual void handleMessage(MessageShowScope* message); virtual void handleMessage(MessageUndo* message); void replayCommands(bool removeLast); - void processCommand(const Command& command); + void processCommand(Command command); void processNormalCommand(const Command& command); void processRedoCommand(const Command& command); void processUndoCommand(const Command& command); diff --git a/src/lib/component/controller/helper/ActivationTranslator.cpp b/src/lib/component/controller/helper/ActivationTranslator.cpp index daf40f63..3b25b04e 100644 --- a/src/lib/component/controller/helper/ActivationTranslator.cpp +++ b/src/lib/component/controller/helper/ActivationTranslator.cpp @@ -28,9 +28,8 @@ std::shared_ptr ActivationTranslator::translateMessage(co const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy); const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy); - m = std::make_shared(m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId)); + m = std::make_shared(message, m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId)); m->isAggregation = true; - m->undoRedoType = message->undoRedoType; } else { @@ -43,10 +42,8 @@ std::shared_ptr ActivationTranslator::translateMessage(co if (edgeId) { - m = std::make_shared(std::vector(1, edgeId)); + m = std::make_shared(message, std::vector(1, edgeId)); m->isEdge = true; - m->undoRedoType = message->undoRedoType; - m->setKeepContent(message->keepContent()); } } return m; @@ -71,11 +68,7 @@ std::shared_ptr ActivationTranslator::translateMessage(co return nullptr; } - std::shared_ptr m; - m = std::make_shared(std::vector(1, fileId)); - m->undoRedoType = message->undoRedoType; - m->setKeepContent(message->keepContent()); - return m; + return std::make_shared(message, std::vector(1, fileId)); } std::shared_ptr ActivationTranslator::translateMessage(const MessageActivateNodes* message) const @@ -101,20 +94,14 @@ std::shared_ptr ActivationTranslator::translateMessage(co } std::shared_ptr m; - m = std::make_shared(nodeIds); + m = std::make_shared(message, nodeIds); m->isFromSystem = message->isFromSystem; - m->undoRedoType = message->undoRedoType; - m->setKeepContent(message->keepContent()); return m; } std::shared_ptr ActivationTranslator::translateMessage(const MessageActivateTokenIds* message) const { - std::shared_ptr m; - m = std::make_shared(message->tokenIds); - m->undoRedoType = message->undoRedoType; - m->setKeepContent(message->keepContent()); - return m; + return std::make_shared(message, message->tokenIds); } std::shared_ptr ActivationTranslator::translateMessage(const MessageSearch* message) const @@ -144,13 +131,11 @@ std::shared_ptr ActivationTranslator::translateMessage(co std::vector tokenIds = m_storageAccess->getTokenIdsForMatches(matches); tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds); - std::shared_ptr m; - m = std::make_shared(tokenIds); - m->undoRedoType = message->undoRedoType; - m->setKeepContent(message->keepContent()); + std::shared_ptr m = std::make_shared(message, tokenIds); if (message->isFresh()) { m->isFromSearch = true; } + return m; } diff --git a/src/lib/component/view/CodeView.h b/src/lib/component/view/CodeView.h index 0a34337d..dae9da6f 100644 --- a/src/lib/component/view/CodeView.h +++ b/src/lib/component/view/CodeView.h @@ -59,7 +59,7 @@ public: virtual void setFileState(const FilePath filePath, FileState state) = 0; - virtual void showFirstActiveSnippet(const std::vector& activeTokenIds) = 0; + virtual void showFirstActiveSnippet(const std::vector& activeTokenIds, bool scrollTo) = 0; virtual void showActiveTokenIds(const std::vector& activeTokenIds) = 0; virtual void focusTokenIds(const std::vector& focusedTokenIds) = 0; @@ -67,6 +67,8 @@ public: virtual void showContents() = 0; + virtual void scrollToValue(int value) = 0; + private: CodeController* getController(); }; diff --git a/src/lib/utility/messaging/MessageBase.h b/src/lib/utility/messaging/MessageBase.h index dcefb592..bf49be26 100644 --- a/src/lib/utility/messaging/MessageBase.h +++ b/src/lib/utility/messaging/MessageBase.h @@ -20,6 +20,7 @@ public: , m_sendAsTask(true) , m_keepContent(false) , m_cancelled(false) + , m_isLast(true) { } @@ -45,9 +46,14 @@ public: 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) @@ -86,6 +92,7 @@ private: bool m_sendAsTask; bool m_keepContent; bool m_cancelled; + bool m_isLast; }; #endif // MESSAGE_BASE_H diff --git a/src/lib/utility/messaging/type/MessageActivateTokens.h b/src/lib/utility/messaging/type/MessageActivateTokens.h index b02eb3a3..a3f0f2be 100644 --- a/src/lib/utility/messaging/type/MessageActivateTokens.h +++ b/src/lib/utility/messaging/type/MessageActivateTokens.h @@ -8,13 +8,16 @@ class MessageActivateTokens : public Message { public: - MessageActivateTokens(const std::vector& tokenIds) + MessageActivateTokens(const MessageBase* other, const std::vector& tokenIds) : tokenIds(tokenIds) , isEdge(false) , isAggregation(false) , isFromSystem(false) , isFromSearch(false) { + undoRedoType = other->undoRedoType; + setKeepContent(other->keepContent()); + setIsLast(other->isLast()); } static const std::string getStaticType() diff --git a/src/lib/utility/messaging/type/MessageScrollCode.h b/src/lib/utility/messaging/type/MessageScrollCode.h new file mode 100644 index 00000000..d33a17ad --- /dev/null +++ b/src/lib/utility/messaging/type/MessageScrollCode.h @@ -0,0 +1,23 @@ +#ifndef MESSAGE_SCROLL_CODE_H +#define MESSAGE_SCROLL_CODE_H + +#include "utility/messaging/Message.h" + +class MessageScrollCode + : public Message +{ +public: + MessageScrollCode(int value) + : value(value) + { + } + + static const std::string getStaticType() + { + return "MessageScrollCode"; + } + + int value; +}; + +#endif // MESSAGE_SCROLL_CODE_H diff --git a/src/lib_gui/qt/element/QtCodeArea.cpp b/src/lib_gui/qt/element/QtCodeArea.cpp index 70ad579f..ec5efed1 100644 --- a/src/lib_gui/qt/element/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/QtCodeArea.cpp @@ -173,6 +173,11 @@ std::shared_ptr QtCodeArea::getTokenLocationFile() const return m_locationFile; } +QtCodeFile* QtCodeArea::getFile() const +{ + return m_fileWidget; +} + void QtCodeArea::lineNumberAreaPaintEvent(QPaintEvent *event) { QPainter painter(m_lineNumberArea); diff --git a/src/lib_gui/qt/element/QtCodeArea.h b/src/lib_gui/qt/element/QtCodeArea.h index f2bdcf2c..247ffd82 100644 --- a/src/lib_gui/qt/element/QtCodeArea.h +++ b/src/lib_gui/qt/element/QtCodeArea.h @@ -71,6 +71,7 @@ public: uint getEndLineNumber() const; std::shared_ptr getTokenLocationFile() const; + QtCodeFile* getFile() const; void lineNumberAreaPaintEvent(QPaintEvent* event); int lineNumberDigits() const; diff --git a/src/lib_gui/qt/element/QtCodeFile.cpp b/src/lib_gui/qt/element/QtCodeFile.cpp index 7030056f..e093ab93 100644 --- a/src/lib_gui/qt/element/QtCodeFile.cpp +++ b/src/lib_gui/qt/element/QtCodeFile.cpp @@ -265,13 +265,13 @@ QtCodeSnippet* QtCodeFile::findFirstActiveSnippet() const return nullptr; } -bool QtCodeFile::openCollapsedActiveSnippet() const +bool QtCodeFile::isCollapsedActiveFile() const { + bool isActiveFile = false; if (m_locationFile) { std::vector ids = getActiveTokenIds(); - bool isActiveFile = false; m_locationFile->forEachTokenLocation( [&](TokenLocation* location) { @@ -281,15 +281,9 @@ bool QtCodeFile::openCollapsedActiveSnippet() const } } ); - - if (isActiveFile) - { - showSnippets(); - return true; - } } - return false; + return isActiveFile; } void QtCodeFile::updateContent() @@ -430,7 +424,7 @@ void QtCodeFile::clickedMaximizeButton() const ).dispatch(); } -void QtCodeFile::showSnippets() const +void QtCodeFile::requestSnippets() const { if (m_snippetsRequested) { @@ -450,6 +444,11 @@ void QtCodeFile::showSnippets() const msg.dispatch(); } +bool QtCodeFile::hasSnippets() const +{ + return m_snippets.size() > 0; +} + void QtCodeFile::handleMessage(MessageWindowFocus* message) { updateTitleBar(); diff --git a/src/lib_gui/qt/element/QtCodeFile.h b/src/lib_gui/qt/element/QtCodeFile.h index 341677fc..aaec0d96 100644 --- a/src/lib_gui/qt/element/QtCodeFile.h +++ b/src/lib_gui/qt/element/QtCodeFile.h @@ -59,7 +59,7 @@ public: ); QtCodeSnippet* findFirstActiveSnippet() const; - bool openCollapsedActiveSnippet() const; + bool isCollapsedActiveFile() const; void updateContent(); @@ -69,7 +69,8 @@ public: void setSnippets(); void setMaximized(); - void showSnippets() const; + void requestSnippets() const; + bool hasSnippets() const; public slots: void clickedMinimizeButton() const; diff --git a/src/lib_gui/qt/element/QtCodeFileList.cpp b/src/lib_gui/qt/element/QtCodeFileList.cpp index f9f742e4..66125a2b 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.cpp +++ b/src/lib_gui/qt/element/QtCodeFileList.cpp @@ -2,10 +2,12 @@ #include #include +#include #include #include #include "utility/file/FileSystem.h" +#include "utility/messaging/type/MessageScrollCode.h" #include "data/location/TokenLocationFile.h" #include "qt/element/QtCodeFile.h" @@ -13,6 +15,8 @@ QtCodeFileList::QtCodeFileList(QWidget* parent) : QScrollArea(parent) + , m_scrollToFile(nullptr) + , m_value(0) { setObjectName("code_file_list_base"); @@ -28,6 +32,7 @@ QtCodeFileList::QtCodeFileList(QWidget* parent) setWidgetResizable(true); 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); } @@ -112,37 +117,26 @@ void QtCodeFileList::showActiveTokenIds() updateFiles(); } -bool QtCodeFileList::scrollToFirstActiveSnippet() +void QtCodeFileList::showFirstActiveSnippet(bool scrollTo) { updateFiles(); - QtCodeSnippet* snippet = nullptr; - for (std::shared_ptr file: m_files) - { - snippet = file->findFirstActiveSnippet(); - if (snippet) - { - if (!snippet->isVisible()) - { - file->showSnippets(); - } + QtCodeSnippet* snippet = getFirstActiveSnippet(); - emit shouldScrollToSnippet(snippet); - return true; - } + if (!snippet) + { + expandActiveSnippetFile(scrollTo); + return; } - return false; -} - -void QtCodeFileList::expandActiveSnippetFile() -{ - for (std::shared_ptr file: m_files) + if (!snippet->isVisible()) { - if (file->openCollapsedActiveSnippet()) - { - return; - } + snippet->getFile()->setSnippets(); + } + + 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) { this->ensureWidgetVisibleAnimated(snippet, snippet->getFirstActiveLineRect()); } +void QtCodeFileList::setValue() +{ + this->verticalScrollBar()->setValue(m_value); +} + QtCodeFile* QtCodeFileList::getFile(const FilePath filePath) { QtCodeFile* file = nullptr; @@ -225,6 +244,21 @@ QtCodeFile* QtCodeFileList::getFile(const FilePath filePath) return file; } +QtCodeSnippet* QtCodeFileList::getFirstActiveSnippet() const +{ + QtCodeSnippet* snippet = nullptr; + for (std::shared_ptr file: m_files) + { + snippet = file->findFirstActiveSnippet(); + if (snippet) + { + break; + } + } + + return snippet; +} + void QtCodeFileList::updateFiles() { for (std::shared_ptr file: m_files) @@ -233,6 +267,24 @@ void QtCodeFileList::updateFiles() } } +void QtCodeFileList::expandActiveSnippetFile(bool scrollTo) +{ + for (std::shared_ptr file: m_files) + { + if (file->isCollapsedActiveFile()) + { + file->requestSnippets(); + + if (scrollTo) + { + m_scrollToFile = file.get(); + } + + return; + } + } +} + void QtCodeFileList::ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF rect) { if (!widget()->isAncestorOf(childWidget)) @@ -259,7 +311,7 @@ void QtCodeFileList::ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF re if (scrollBar && value != 0) { QPropertyAnimation* anim = new QPropertyAnimation(scrollBar, "value"); - anim->setDuration(500); + anim->setDuration(300); anim->setStartValue(scrollBar->value()); anim->setEndValue(scrollBar->value() + value); anim->setEasingCurve(QEasingCurve::InOutQuad); diff --git a/src/lib_gui/qt/element/QtCodeFileList.h b/src/lib_gui/qt/element/QtCodeFileList.h index 09472b9b..13597fe3 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.h +++ b/src/lib_gui/qt/element/QtCodeFileList.h @@ -55,8 +55,7 @@ public: void showActiveTokenIds(); - bool scrollToFirstActiveSnippet(); - void expandActiveSnippetFile(); + void showFirstActiveSnippet(bool scrollTo); void focusTokenIds(const std::vector& focusedTokenIds); void defocusTokenIds(); @@ -66,15 +65,21 @@ public: void setFileMaximized(const FilePath path); void showContents(); + void scrollToValue(int value); + void scrollToActiveFileIfRequested(); private slots: + void scrolled(int value); void scrollToSnippet(QtCodeSnippet* snippet); + void setValue(); private: QtCodeFile* getFile(const FilePath filePath); + QtCodeSnippet* getFirstActiveSnippet() const; void updateFiles(); + void expandActiveSnippetFile(bool scrollTo); void ensureWidgetVisibleAnimated(QWidget *childWidget, QRectF rect); std::shared_ptr m_frame; @@ -83,6 +88,9 @@ private: std::vector m_activeTokenIds; std::vector m_focusedTokenIds; std::vector m_errorMessages; + + QtCodeFile* m_scrollToFile; + int m_value; }; #endif // QT_CODE_FILE_LIST diff --git a/src/lib_gui/qt/element/QtCodeSnippet.cpp b/src/lib_gui/qt/element/QtCodeSnippet.cpp index fea80d53..b87e2ac0 100644 --- a/src/lib_gui/qt/element/QtCodeSnippet.cpp +++ b/src/lib_gui/qt/element/QtCodeSnippet.cpp @@ -110,6 +110,11 @@ QtCodeSnippet::~QtCodeSnippet() { } +QtCodeFile* QtCodeSnippet::getFile() const +{ + return m_codeArea->getFile(); +} + uint QtCodeSnippet::getStartLineNumber() const { return m_codeArea->getStartLineNumber(); diff --git a/src/lib_gui/qt/element/QtCodeSnippet.h b/src/lib_gui/qt/element/QtCodeSnippet.h index 5e14d848..84121b51 100644 --- a/src/lib_gui/qt/element/QtCodeSnippet.h +++ b/src/lib_gui/qt/element/QtCodeSnippet.h @@ -32,6 +32,8 @@ public: ); virtual ~QtCodeSnippet(); + QtCodeFile* getFile() const; + uint getStartLineNumber() const; uint getEndLineNumber() const; diff --git a/src/lib_gui/qt/view/QtCodeView.cpp b/src/lib_gui/qt/view/QtCodeView.cpp index e02a12f3..a10ceb09 100644 --- a/src/lib_gui/qt/view/QtCodeView.cpp +++ b/src/lib_gui/qt/view/QtCodeView.cpp @@ -16,12 +16,12 @@ QtCodeView::QtCodeView(ViewLayout* viewLayout) , m_addCodeSnippetsFunctor(std::bind(&QtCodeView::doAddCodeSnippets, this, std::placeholders::_1, std::placeholders::_2)) , m_showCodeFileFunctor(std::bind(&QtCodeView::doShowCodeFile, this, std::placeholders::_1)) , 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_focusTokenIdsFunctor(std::bind(&QtCodeView::doFocusTokenIds, this, std::placeholders::_1)) , m_defocusTokenIdsFunctor(std::bind(&QtCodeView::doDefocusTokenIds, 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(); setStyleSheet(); @@ -75,9 +75,9 @@ void QtCodeView::setFileState(const FilePath filePath, FileState state) m_setFileStateFunctor(filePath, state); } -void QtCodeView::showFirstActiveSnippet(const std::vector& activeTokenIds) +void QtCodeView::showFirstActiveSnippet(const std::vector& activeTokenIds, bool scrollTo) { - m_doShowFirstActiveSnippetFunctor(activeTokenIds); + m_doShowFirstActiveSnippetFunctor(activeTokenIds, scrollTo); } void QtCodeView::showActiveTokenIds(const std::vector& activeTokenIds) @@ -100,6 +100,11 @@ void QtCodeView::showContents() m_showContentsFunctor(); } +void QtCodeView::scrollToValue(int value) +{ + m_scrollToValueFunctor(value); +} + void QtCodeView::doRefreshView() { setStyleSheet(); @@ -155,11 +160,7 @@ void QtCodeView::doAddCodeSnippets(const std::vector& snippet setStyleSheet(); // so property "isLast" of QtCodeSnippet is computed correctly - if (m_isExpanding) - { - m_widget->scrollToFirstActiveSnippet(); - m_isExpanding = false; - } + m_widget->scrollToActiveFileIfRequested(); } void QtCodeView::doShowCodeFile(const CodeSnippetParams& params) @@ -183,15 +184,10 @@ void QtCodeView::doSetFileState(const FilePath filePath, FileState state) } } -void QtCodeView::doShowFirstActiveSnippet(const std::vector& activeTokenIds) +void QtCodeView::doShowFirstActiveSnippet(const std::vector& activeTokenIds, bool scrollTo) { m_widget->setActiveTokenIds(activeTokenIds); - - if (!m_widget->scrollToFirstActiveSnippet()) - { - m_widget->expandActiveSnippetFile(); - m_isExpanding = true; - } + m_widget->showFirstActiveSnippet(scrollTo); } void QtCodeView::doShowActiveTokenIds(const std::vector& activeTokenIds) @@ -210,11 +206,16 @@ void QtCodeView::doDefocusTokenIds() m_widget->defocusTokenIds(); } -void QtCodeView::doShowContents() const +void QtCodeView::doShowContents() { m_widget->showContents(); } +void QtCodeView::doScrollToValue(int value) +{ + m_widget->scrollToValue(value); +} + void QtCodeView::setStyleSheet() const { utility::setWidgetBackgroundColor(m_widget, ColorScheme::getInstance()->getColor("code/background")); diff --git a/src/lib_gui/qt/view/QtCodeView.h b/src/lib_gui/qt/view/QtCodeView.h index 7ad62c1b..05c8e9a3 100644 --- a/src/lib_gui/qt/view/QtCodeView.h +++ b/src/lib_gui/qt/view/QtCodeView.h @@ -35,7 +35,7 @@ public: virtual void setFileState(const FilePath filePath, FileState state); - virtual void showFirstActiveSnippet(const std::vector& activeTokenIds); + virtual void showFirstActiveSnippet(const std::vector& activeTokenIds, bool scrollTo); virtual void showActiveTokenIds(const std::vector& activeTokenIds); virtual void focusTokenIds(const std::vector& focusedTokenIds); @@ -43,6 +43,8 @@ public: virtual void showContents(); + virtual void scrollToValue(int value); + private: void doRefreshView(); @@ -52,13 +54,15 @@ private: void doSetFileState(const FilePath filePath, FileState state); - void doShowFirstActiveSnippet(const std::vector& activeTokenIds); + void doShowFirstActiveSnippet(const std::vector& activeTokenIds, bool scrollTo); void doShowActiveTokenIds(const std::vector& activeTokenIds); void doFocusTokenIds(const std::vector& focusedTokenIds); void doDefocusTokenIds(); - void doShowContents() const; + void doShowContents(); + + void doScrollToValue(int value); void setStyleSheet() const; @@ -67,18 +71,17 @@ private: QtThreadedFunctor&, bool> m_addCodeSnippetsFunctor; QtThreadedFunctor m_showCodeFileFunctor; QtThreadedFunctor m_setFileStateFunctor; - QtThreadedFunctor&> m_doShowFirstActiveSnippetFunctor; + QtThreadedFunctor&, bool> m_doShowFirstActiveSnippetFunctor; QtThreadedFunctor&> m_doShowActiveTokenIdsFunctor; QtThreadedFunctor&> m_focusTokenIdsFunctor; QtThreadedFunctor<> m_defocusTokenIdsFunctor; QtThreadedFunctor<> m_showContentsFunctor; + QtThreadedFunctor m_scrollToValueFunctor; QtCodeFileList* m_widget; std::vector m_activeTokenIds; std::vector m_errorMessages; - - bool m_isExpanding; }; # endif // QT_CODE_VIEW_H