diff --git a/cmake/version.cmake b/cmake/version.cmake index 337a6787..9530c46c 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -40,7 +40,7 @@ endif(EXISTS "${CMAKE_SOURCE_DIR}/.git") message(STATUS "Git current branch: ${GIT_BRANCH}") message(STATUS "Git commit hash: ${GIT_COMMIT_HASH}") message(STATUS "Git commit time: ${GIT_COMMIT_TIME}") -message(STATUS "Git version number:" ${GIT_VERSION_NUMBER} ) +message(STATUS "Git version number: " ${GIT_VERSION_NUMBER} ) configure_file( ${CMAKE_SOURCE_DIR}/cmake/version.h.in diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 75813373..35c8befa 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -220,6 +220,7 @@ add_files( utility/messaging/type/MessageActivateTokens.h utility/messaging/type/MessageActivateWindow.h utility/messaging/type/MessageAutoRefreshChanged.h + utility/messaging/type/MessageChangeFileView.h utility/messaging/type/MessageDeactivateEdge.h utility/messaging/type/MessageFind.h utility/messaging/type/MessageFinishedParsing.h @@ -239,9 +240,7 @@ add_files( utility/messaging/type/MessageSearch.h utility/messaging/type/MessageSearchAutocomplete.h utility/messaging/type/MessageShowErrors.h - utility/messaging/type/MessageShowFile.h utility/messaging/type/MessageShowScope.h - utility/messaging/type/MessageShowSnippets.h utility/messaging/type/MessageStatus.h utility/messaging/type/MessageSwitchColorScheme.h utility/messaging/type/MessageUndo.h diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index 924daba9..650dcc75 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -78,18 +78,14 @@ void CodeController::handleMessage(MessageActivateAll* message) snippets.insert(snippets.begin(), statsSnippet); CodeView* view = getView(); - view->setActiveTokenIds(std::vector()); view->setErrorMessages(errorMessages); - view->showCodeSnippets(snippets); + view->showCodeSnippets(snippets, std::vector()); + + showContents(message); } void CodeController::handleMessage(MessageActivateTokens* message) { - if (message->keepContent() && message->isIgnorable()) - { - return; - } - std::vector activeTokenIds = message->tokenIds; Id declarationId = 0; // 0 means that no token is found. @@ -100,42 +96,100 @@ void CodeController::handleMessage(MessageActivateTokens* message) // TODO: what about declarationId if more than 1 token is active? FIX THIS! CodeView* view = getView(); - view->setActiveTokenIds(activeTokenIds); view->setErrorMessages(std::vector()); if (message->isEdge) { - view->showFirstActiveSnippet(); + view->showFirstActiveSnippet(activeTokenIds); } if (message->keepContent()) { - view->showActiveTokenIds(); - return; + view->showActiveTokenIds(activeTokenIds); } - - std::shared_ptr collection = m_storageAccess->getTokenLocationsForTokenIds(activeTokenIds); - view->showCodeSnippets(getSnippetsForActiveTokenLocations(collection.get(), declarationId)); - - if (!message->isFromSystem) + else { - size_t fileCount = collection->getTokenLocationFileCount(); - size_t referenceCount = collection->getTokenLocationCount(); + std::shared_ptr collection = m_storageAccess->getTokenLocationsForTokenIds(activeTokenIds); + view->showCodeSnippets(getSnippetsForActiveTokenLocations(collection.get(), declarationId), activeTokenIds); - std::stringstream ss; - ss << message->tokenIds.size() << ' '; - ss << (message->tokenIds.size() == 1 ? "result" : "results"); - - if (fileCount > 0) + if (!message->isFromSystem) { - ss << " with " << referenceCount << ' '; - ss << (referenceCount == 1 ? "reference" : "references"); - ss << " in " << fileCount << ' '; - ss << (fileCount == 1 ? "file" : "files"); - } + size_t fileCount = collection->getTokenLocationFileCount(); + size_t referenceCount = collection->getTokenLocationCount(); - MessageStatus(ss.str()).dispatch(); + std::stringstream ss; + ss << message->tokenIds.size() << ' '; + ss << (message->tokenIds.size() == 1 ? "result" : "results"); + + if (fileCount > 0) + { + ss << " with " << referenceCount << ' '; + ss << (referenceCount == 1 ? "reference" : "references"); + ss << " in " << fileCount << ' '; + ss << (fileCount == 1 ? "file" : "files"); + } + + MessageStatus(ss.str()).dispatch(); + } } + + showContents(message); +} + +void CodeController::handleMessage(MessageChangeFileView* message) +{ + CodeView* view = getView(); + + switch (message->state) + { + case MessageChangeFileView::FILE_MINIMIZED: + view->setFileState(message->filePath, CodeView::FILE_MINIMIZED); + break; + + case MessageChangeFileView::FILE_SNIPPETS: + if (message->needsData) + { + view->addCodeSnippets(getSnippetsForActiveTokenLocationsInFile(message->locationFile), false); + } + view->setFileState(message->filePath, CodeView::FILE_SNIPPETS); + break; + + case MessageChangeFileView::FILE_MAXIMIZED: + if (message->needsData) + { + CodeView::CodeSnippetParams params; + params.startLineNumber = 0; + params.endLineNumber = 0; + + std::shared_ptr textAccess = m_storageAccess->getFileContent(message->filePath); + params.code = textAccess->getText(); + + params.modificationTime = m_storageAccess->getFileModificationTime(message->filePath); + + if (message->showErrors) + { + std::vector errorMessages; + TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(&errorMessages); + params.locationFile = std::make_shared(*errorCollection.findTokenLocationFileByPath(message->filePath)); + params.locationFile->isWholeCopy = true; + } + else + { + params.locationFile = m_storageAccess->getTokenLocationsForFile(message->filePath.str()); + } + + getView()->showCodeFile(params); + } + view->setFileState(message->filePath, CodeView::FILE_MAXIMIZED); + break; + } + + showContents(message); +} + +void CodeController::handleMessage(MessageFlushUpdates* message) +{ + showContents(message); } void CodeController::handleMessage(MessageFocusIn* message) @@ -154,35 +208,10 @@ void CodeController::handleMessage(MessageShowErrors* message) std::vector snippets = getSnippetsForErrorLocations(&errorMessages); CodeView* view = getView(); - view->setActiveTokenIds(std::vector()); view->setErrorMessages(errorMessages); - view->showCodeSnippets(snippets); -} + view->showCodeSnippets(snippets, std::vector()); -void CodeController::handleMessage(MessageShowFile* message) -{ - CodeView::CodeSnippetParams params; - params.startLineNumber = 0; - params.endLineNumber = 0; - - std::shared_ptr textAccess = m_storageAccess->getFileContent(message->filePath); - params.code = textAccess->getText(); - - params.modificationTime = m_storageAccess->getFileModificationTime(message->filePath); - - if (message->showErrors) - { - std::vector errorMessages; - TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(&errorMessages); - params.locationFile = std::make_shared(*errorCollection.findTokenLocationFileByPath(message->filePath)); - params.locationFile->isWholeCopy = true; - } - else - { - params.locationFile = m_storageAccess->getTokenLocationsForFile(message->filePath.str()); - } - - getView()->showCodeFile(params); + showContents(message); } void CodeController::handleMessage(MessageShowScope* message) @@ -206,11 +235,8 @@ void CodeController::handleMessage(MessageShowScope* message) } getView()->addCodeSnippets(snippets, true); -} -void CodeController::handleMessage(MessageShowSnippets* message) -{ - getView()->addCodeSnippets(getSnippetsForActiveTokenLocationsInFile(message->locationFile), false); + showContents(message); } CodeView* CodeController::getView() @@ -218,6 +244,14 @@ CodeView* CodeController::getView() return Controller::getView(); } +void CodeController::showContents(MessageBase* message) +{ + if (message->undoRedoType == MessageBase::UNDOTYPE_NORMAL) + { + getView()->showContents(); + } +} + std::vector CodeController::getSnippetsForActiveTokenLocations( const TokenLocationCollection* collection, Id declarationId ) const { diff --git a/src/lib/component/controller/CodeController.h b/src/lib/component/controller/CodeController.h index fcb464d2..9729fc29 100644 --- a/src/lib/component/controller/CodeController.h +++ b/src/lib/component/controller/CodeController.h @@ -7,12 +7,12 @@ #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageActivateAll.h" #include "utility/messaging/type/MessageActivateTokens.h" +#include "utility/messaging/type/MessageChangeFileView.h" +#include "utility/messaging/type/MessageFlushUpdates.h" #include "utility/messaging/type/MessageFocusIn.h" #include "utility/messaging/type/MessageFocusOut.h" #include "utility/messaging/type/MessageShowErrors.h" -#include "utility/messaging/type/MessageShowFile.h" #include "utility/messaging/type/MessageShowScope.h" -#include "utility/messaging/type/MessageShowSnippets.h" #include "utility/types.h" #include "component/controller/helper/SnippetMerger.h" @@ -27,12 +27,12 @@ class CodeController : public Controller , public MessageListener , public MessageListener + , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener - , public MessageListener , public MessageListener - , public MessageListener { public: CodeController(StorageAccess* storageAccess); @@ -43,14 +43,15 @@ private: virtual void handleMessage(MessageActivateAll* message); virtual void handleMessage(MessageActivateTokens* message); + virtual void handleMessage(MessageChangeFileView* message); + virtual void handleMessage(MessageFlushUpdates* message); virtual void handleMessage(MessageFocusIn* message); virtual void handleMessage(MessageFocusOut* message); virtual void handleMessage(MessageShowErrors* message); - virtual void handleMessage(MessageShowFile* message); virtual void handleMessage(MessageShowScope* message); - virtual void handleMessage(MessageShowSnippets* message); CodeView* getView(); + void showContents(MessageBase* message); std::vector getSnippetsForActiveTokenLocations( const TokenLocationCollection* collection, Id declarationId) const; diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index f1a5a4ee..fcfb76b1 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -79,6 +79,12 @@ void UndoRedoController::handleMessage(MessageActivateTokenIds* message) processCommand(command); } +void UndoRedoController::handleMessage(MessageChangeFileView* message) +{ + Command command(std::make_shared(*message), 1); + processCommand(command); +} + void UndoRedoController::handleMessage(MessageDeactivateEdge* message) { MessageBase* m = nullptr; @@ -205,18 +211,6 @@ void UndoRedoController::handleMessage(MessageShowErrors* message) processCommand(command); } -void UndoRedoController::handleMessage(MessageShowFile* message) -{ - if (m_lastCommand.message && m_lastCommand.message->getType() == message->getType() && - static_cast(m_lastCommand.message.get())->filePath == message->filePath) - { - return; - } - - Command command(std::make_shared(*message), 1); - processCommand(command); -} - void UndoRedoController::handleMessage(MessageShowScope* message) { Command command(std::make_shared(*message), 1); diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index f465b9d0..862ba723 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -9,6 +9,7 @@ #include "utility/messaging/type/MessageActivateFile.h" #include "utility/messaging/type/MessageActivateNodes.h" #include "utility/messaging/type/MessageActivateTokenIds.h" +#include "utility/messaging/type/MessageChangeFileView.h" #include "utility/messaging/type/MessageDeactivateEdge.h" #include "utility/messaging/type/MessageGraphNodeBundleSplit.h" #include "utility/messaging/type/MessageGraphNodeExpand.h" @@ -18,7 +19,6 @@ #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageSearch.h" #include "utility/messaging/type/MessageShowErrors.h" -#include "utility/messaging/type/MessageShowFile.h" #include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageUndo.h" @@ -34,6 +34,7 @@ class UndoRedoController , public MessageListener , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -43,7 +44,6 @@ class UndoRedoController , public MessageListener , public MessageListener , public MessageListener - , public MessageListener , public MessageListener , public MessageListener { @@ -66,6 +66,7 @@ private: virtual void handleMessage(MessageActivateFile* message); virtual void handleMessage(MessageActivateNodes* message); virtual void handleMessage(MessageActivateTokenIds* message); + virtual void handleMessage(MessageChangeFileView* message); virtual void handleMessage(MessageDeactivateEdge* message); virtual void handleMessage(MessageGraphNodeBundleSplit* message); virtual void handleMessage(MessageGraphNodeExpand* message); @@ -75,7 +76,6 @@ private: virtual void handleMessage(MessageRefresh* message); virtual void handleMessage(MessageSearch* message); virtual void handleMessage(MessageShowErrors* message); - virtual void handleMessage(MessageShowFile* message); virtual void handleMessage(MessageShowScope* message); virtual void handleMessage(MessageUndo* message); diff --git a/src/lib/component/controller/helper/ActivationTranslator.cpp b/src/lib/component/controller/helper/ActivationTranslator.cpp index 44c159f9..0c5d2547 100644 --- a/src/lib/component/controller/helper/ActivationTranslator.cpp +++ b/src/lib/component/controller/helper/ActivationTranslator.cpp @@ -7,9 +7,9 @@ #include "utility/messaging/type/MessageActivateNodes.h" #include "utility/messaging/type/MessageActivateTokenIds.h" #include "utility/messaging/type/MessageActivateTokens.h" +#include "utility/messaging/type/MessageChangeFileView.h" #include "utility/messaging/type/MessageSearch.h" #include "utility/messaging/type/MessageShowErrors.h" -#include "utility/messaging/type/MessageShowFile.h" ActivationTranslator::ActivationTranslator(StorageAccess* storageAccess) : m_storageAccess(storageAccess) @@ -58,7 +58,13 @@ std::shared_ptr ActivationTranslator::translateMessage(co if (fileId == 0) { - MessageShowFile msg(message->filePath, true); + MessageChangeFileView msg( + message->filePath, + MessageChangeFileView::FILE_MAXIMIZED, + true, + false, + nullptr + ); msg.undoRedoType = message->undoRedoType; msg.setKeepContent(message->keepContent()); msg.dispatch(); diff --git a/src/lib/component/view/CodeView.h b/src/lib/component/view/CodeView.h index 55fed815..0a34337d 100644 --- a/src/lib/component/view/CodeView.h +++ b/src/lib/component/view/CodeView.h @@ -13,6 +13,13 @@ class CodeController; class CodeView: public View { public: + enum FileState + { + FILE_MINIMIZED, + FILE_SNIPPETS, + FILE_MAXIMIZED + }; + struct CodeSnippetParams { CodeSnippetParams(); @@ -46,16 +53,20 @@ public: virtual void setActiveTokenIds(const std::vector& activeTokenIds) = 0; virtual void setErrorMessages(const std::vector& errorMessages) = 0; - virtual void showCodeSnippets(const std::vector& snippets) = 0; + virtual void showCodeSnippets(const std::vector& snippets, const std::vector& activeTokenIds) = 0; virtual void addCodeSnippets(const std::vector& snippets, bool insert) = 0; virtual void showCodeFile(const CodeSnippetParams& params) = 0; - virtual void showFirstActiveSnippet() = 0; - virtual void showActiveTokenIds() = 0; + virtual void setFileState(const FilePath filePath, FileState state) = 0; + + virtual void showFirstActiveSnippet(const std::vector& activeTokenIds) = 0; + virtual void showActiveTokenIds(const std::vector& activeTokenIds) = 0; virtual void focusTokenIds(const std::vector& focusedTokenIds) = 0; virtual void defocusTokenIds() = 0; + virtual void showContents() = 0; + private: CodeController* getController(); }; diff --git a/src/lib/utility/messaging/type/MessageChangeFileView.h b/src/lib/utility/messaging/type/MessageChangeFileView.h new file mode 100644 index 00000000..7bea9cde --- /dev/null +++ b/src/lib/utility/messaging/type/MessageChangeFileView.h @@ -0,0 +1,64 @@ +#ifndef MESSAGE_CHANGE_FILE_VIEW_H +#define MESSAGE_CHANGE_FILE_VIEW_H + +#include "utility/messaging/Message.h" +#include "utility/types.h" + +#include "data/location/TokenLocationFile.h" + +class MessageChangeFileView + : public Message +{ +public: + enum FileState + { + FILE_MINIMIZED, + FILE_SNIPPETS, + FILE_MAXIMIZED + }; + + MessageChangeFileView( + const FilePath filePath, + FileState state, + bool needsData, + bool showErrors, + std::shared_ptr locationFile + ) + : filePath(filePath) + , state(state) + , needsData(needsData) + , showErrors(showErrors) + , locationFile(locationFile) + { + } + + static const std::string getStaticType() + { + return "MessageChangeFileView"; + } + + virtual void print(std::ostream& os) const + { + switch (state) + { + case FILE_MINIMIZED: os << "minimize"; break; + case FILE_SNIPPETS: os << "snippets"; break; + case FILE_MAXIMIZED: os << "maximize"; break; + } + + if (needsData) + { + os << ", needs data"; + } + } + + FilePath filePath; + FileState state; + + bool needsData; + bool showErrors; + + std::shared_ptr locationFile; +}; + +#endif // MESSAGE_CHANGE_FILE_VIEW_H diff --git a/src/lib/utility/messaging/type/MessageShowFile.h b/src/lib/utility/messaging/type/MessageShowFile.h deleted file mode 100644 index b6b6ca78..00000000 --- a/src/lib/utility/messaging/type/MessageShowFile.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MESSAGE_SHOW_FILE_H -#define MESSAGE_SHOW_FILE_H - -#include "utility/file/FilePath.h" -#include "utility/messaging/Message.h" -#include "utility/types.h" - -class MessageShowFile - : public Message -{ -public: - MessageShowFile(const FilePath& filePath, bool showErrors) - : filePath(filePath) - , showErrors(showErrors) - { - } - - static const std::string getStaticType() - { - return "MessageShowFile"; - } - - virtual void print(std::ostream& os) const - { - os << filePath.str(); - } - - const FilePath filePath; - const bool showErrors; -}; - -#endif // MESSAGE_SHOW_FILE_H diff --git a/src/lib/utility/messaging/type/MessageShowSnippets.h b/src/lib/utility/messaging/type/MessageShowSnippets.h deleted file mode 100644 index 1f55aeaa..00000000 --- a/src/lib/utility/messaging/type/MessageShowSnippets.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef MESSAGE_SHOW_SNIPPETS_H -#define MESSAGE_SHOW_SNIPPETS_H - -#include "utility/messaging/Message.h" -#include "utility/types.h" - -#include "data/location/TokenLocationFile.h" - -class MessageShowSnippets - : public Message -{ -public: - MessageShowSnippets(std::shared_ptr locationFile) - : locationFile(locationFile) - { - } - - static const std::string getStaticType() - { - return "MessageShowSnippets"; - } - - virtual void print(std::ostream& os) const - { - os << locationFile->getFilePath().str(); - } - - std::shared_ptr locationFile; -}; - -#endif // MESSAGE_SHOW_SNIPPETS_H diff --git a/src/lib_gui/qt/element/QtCodeArea.cpp b/src/lib_gui/qt/element/QtCodeArea.cpp index f3997877..70ad579f 100644 --- a/src/lib_gui/qt/element/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/QtCodeArea.cpp @@ -11,7 +11,6 @@ #include "utility/messaging/type/MessageActivateTokenLocations.h" #include "utility/messaging/type/MessageActivateTokenIds.h" -#include "utility/messaging/type/MessageShowFile.h" #include "utility/messaging/type/MessageFocusIn.h" #include "utility/messaging/type/MessageFocusOut.h" #include "utility/messaging/type/MessageMoveIDECursor.h" @@ -436,14 +435,6 @@ void QtCodeArea::mouseReleaseEvent(QMouseEvent* event) } } -void QtCodeArea::mouseDoubleClickEvent(QMouseEvent* event) -{ - if (event->button() == Qt::LeftButton && m_fileWidget->getFilePath().str().size()) - { - MessageShowFile(m_fileWidget->getFilePath().str(), (m_fileWidget->getErrorMessages().size() > 0)).dispatch(); - } -} - void QtCodeArea::mouseMoveEvent(QMouseEvent* event) { if (m_panningValue != -1) diff --git a/src/lib_gui/qt/element/QtCodeArea.h b/src/lib_gui/qt/element/QtCodeArea.h index 984f1241..f2bdcf2c 100644 --- a/src/lib_gui/qt/element/QtCodeArea.h +++ b/src/lib_gui/qt/element/QtCodeArea.h @@ -94,7 +94,6 @@ protected: virtual void enterEvent(QEvent* event) Q_DECL_OVERRIDE; virtual void leaveEvent(QEvent* event) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE; - virtual void mouseDoubleClickEvent(QMouseEvent* event) Q_DECL_OVERRIDE; virtual void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE; virtual void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE; diff --git a/src/lib_gui/qt/element/QtCodeFile.cpp b/src/lib_gui/qt/element/QtCodeFile.cpp index 2e0f8749..7030056f 100644 --- a/src/lib_gui/qt/element/QtCodeFile.cpp +++ b/src/lib_gui/qt/element/QtCodeFile.cpp @@ -8,8 +8,7 @@ #include "utility/file/FileSystem.h" #include "utility/logging/logging.h" #include "utility/messaging/type/MessageActivateFile.h" -#include "utility/messaging/type/MessageShowFile.h" -#include "utility/messaging/type/MessageShowSnippets.h" +#include "utility/messaging/type/MessageChangeFileView.h" #include "data/location/TokenLocation.h" #include "data/location/TokenLocationFile.h" @@ -23,6 +22,7 @@ QtCodeFile::QtCodeFile(const FilePath& filePath, QtCodeFileList* parent) , m_updateTitleBarFunctor(std::bind(&QtCodeFile::doUpdateTitleBar, this)) , m_parent(parent) , m_filePath(filePath) + , m_snippetsRequested(false) { setObjectName("code_file"); @@ -173,7 +173,7 @@ void QtCodeFile::addCodeSnippet( m_fileSnippet->setIsActiveFile(true); } - clickedMaximizeButton(); + setMaximized(); if (refCount != -1) { updateRefCount(0); @@ -284,7 +284,7 @@ bool QtCodeFile::openCollapsedActiveSnippet() const if (isActiveFile) { - MessageShowSnippets(m_locationFile).dispatch(); + showSnippets(); return true; } } @@ -308,11 +308,74 @@ void QtCodeFile::updateContent() void QtCodeFile::setLocationFile(std::shared_ptr locationFile, int refCount) { m_locationFile = locationFile; - clickedMinimizeButton(); + setMinimized(); updateRefCount(refCount); } +void QtCodeFile::setMinimized() +{ + for (std::shared_ptr snippet : m_snippets) + { + snippet->hide(); + } + + if (m_fileSnippet) + { + m_fileSnippet->hide(); + } + + m_minimizeButton->setEnabled(false); + if (m_snippets.size() || m_locationFile) + { + m_snippetButton->setEnabled(true); + } + m_maximizeButton->setEnabled(true); + + m_minimizePlaceholder->show(); +} + +void QtCodeFile::setSnippets() +{ + for (std::shared_ptr snippet : m_snippets) + { + snippet->show(); + } + + if (m_fileSnippet) + { + m_fileSnippet->hide(); + } + + m_minimizeButton->setEnabled(true); + m_snippetButton->setEnabled(false); + m_maximizeButton->setEnabled(true); + + m_minimizePlaceholder->hide(); +} + +void QtCodeFile::setMaximized() +{ + for (std::shared_ptr snippet : m_snippets) + { + snippet->hide(); + } + + if (m_fileSnippet) + { + m_fileSnippet->show(); + } + + m_minimizeButton->setEnabled(true); + if (m_snippets.size()) + { + m_snippetButton->setEnabled(true); + } + m_maximizeButton->setEnabled(false); + + m_minimizePlaceholder->hide(); +} + void QtCodeFile::clickedTitleBar() { if (m_minimizeButton->isEnabled()) @@ -334,77 +397,57 @@ void QtCodeFile::clickedTitle() MessageActivateFile(m_filePath).dispatch(); } -void QtCodeFile::clickedMinimizeButton() +void QtCodeFile::clickedMinimizeButton() const { - for (std::shared_ptr snippet : m_snippets) - { - snippet->hide(); - } - - if (m_fileSnippet) - { - m_fileSnippet->hide(); - } - - m_minimizeButton->setEnabled(false); - if (m_snippets.size() || m_locationFile) - { - m_snippetButton->setEnabled(true); - } - m_maximizeButton->setEnabled(true); - - m_minimizePlaceholder->show(); + MessageChangeFileView( + m_filePath, + MessageChangeFileView::FILE_MINIMIZED, + false, + false, + nullptr + ).dispatch(); } -void QtCodeFile::clickedSnippetButton() +void QtCodeFile::clickedSnippetButton() const { - if (m_locationFile) + MessageChangeFileView( + m_filePath, + MessageChangeFileView::FILE_SNIPPETS, + (m_locationFile != nullptr), + false, + m_locationFile + ).dispatch(); +} + +void QtCodeFile::clickedMaximizeButton() const +{ + MessageChangeFileView( + m_filePath, + MessageChangeFileView::FILE_MAXIMIZED, + (m_fileSnippet == nullptr), + false, + nullptr + ).dispatch(); +} + +void QtCodeFile::showSnippets() const +{ + if (m_snippetsRequested) { - MessageShowSnippets(m_locationFile).dispatch(); return; } - for (std::shared_ptr snippet : m_snippets) - { - snippet->show(); - } + m_snippetsRequested = true; - if (m_fileSnippet) - { - m_fileSnippet->hide(); - } - - m_minimizeButton->setEnabled(true); - m_snippetButton->setEnabled(false); - m_maximizeButton->setEnabled(true); - - m_minimizePlaceholder->hide(); -} - -void QtCodeFile::clickedMaximizeButton() -{ - for (std::shared_ptr snippet : m_snippets) - { - snippet->hide(); - } - - if (m_fileSnippet) - { - m_fileSnippet->show(); - } - else - { - MessageShowFile(m_filePath, (getErrorMessages().size() > 0)).dispatch(); - } - - m_minimizeButton->setEnabled(true); - if (m_snippets.size()) - { - m_snippetButton->setEnabled(true); - } - m_maximizeButton->setEnabled(false); - - m_minimizePlaceholder->hide(); + MessageChangeFileView msg( + m_filePath, + MessageChangeFileView::FILE_SNIPPETS, + (m_locationFile != nullptr), + false, + m_locationFile + ); + msg.undoRedoType = MessageBase::UNDOTYPE_IGNORE; + msg.dispatch(); } void QtCodeFile::handleMessage(MessageWindowFocus* message) @@ -431,7 +474,7 @@ void QtCodeFile::updateSnippets() m_snippets.front()->setProperty("isFirst", true); m_snippets.back()->setProperty("isLast", true); - clickedSnippetButton(); + setSnippets(); } void QtCodeFile::updateRefCount(int refCount) diff --git a/src/lib_gui/qt/element/QtCodeFile.h b/src/lib_gui/qt/element/QtCodeFile.h index ee4795d8..341677fc 100644 --- a/src/lib_gui/qt/element/QtCodeFile.h +++ b/src/lib_gui/qt/element/QtCodeFile.h @@ -65,14 +65,20 @@ public: void setLocationFile(std::shared_ptr locationFile, int refCount); + void setMinimized(); + void setSnippets(); + void setMaximized(); + + void showSnippets() const; + public slots: - void clickedSnippetButton(); + void clickedMinimizeButton() const; + void clickedSnippetButton() const; + void clickedMaximizeButton() const; private slots: void clickedTitleBar(); void clickedTitle(); - void clickedMinimizeButton(); - void clickedMaximizeButton(); private: virtual void handleMessage(MessageWindowFocus* message); @@ -101,7 +107,9 @@ private: const FilePath m_filePath; TimePoint m_modificationTime; + std::shared_ptr m_locationFile; + mutable bool m_snippetsRequested; }; #endif // QT_CODE_FILE_H diff --git a/src/lib_gui/qt/element/QtCodeFileList.cpp b/src/lib_gui/qt/element/QtCodeFileList.cpp index 9643fa71..f9f742e4 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.cpp +++ b/src/lib_gui/qt/element/QtCodeFileList.cpp @@ -50,7 +50,7 @@ void QtCodeFileList::addCodeSnippet( TimePoint modificationTime, bool insert ){ - QtCodeFile* file = getFile(locationFile); + QtCodeFile* file = getFile(locationFile->getFilePath()); if (insert) { @@ -66,7 +66,7 @@ void QtCodeFileList::addCodeSnippet( void QtCodeFileList::addFile(std::shared_ptr locationFile, int refCount, TimePoint modificationTime) { - QtCodeFile* file = getFile(locationFile); + QtCodeFile* file = getFile(locationFile->getFilePath()); file->setLocationFile(locationFile, refCount); file->setModificationTime(modificationTime); } @@ -124,7 +124,7 @@ bool QtCodeFileList::scrollToFirstActiveSnippet() { if (!snippet->isVisible()) { - file->clickedSnippetButton(); + file->showSnippets(); } emit shouldScrollToSnippet(snippet); @@ -158,14 +158,48 @@ void QtCodeFileList::defocusTokenIds() updateFiles(); } +void QtCodeFileList::setFileMinimized(const FilePath path) +{ + QtCodeFile* file = getFile(path); + if (file) + { + file->setMinimized(); + } +} + +void QtCodeFileList::setFileSnippets(const FilePath path) +{ + QtCodeFile* file = getFile(path); + if (file) + { + file->setSnippets(); + } +} + +void QtCodeFileList::setFileMaximized(const FilePath path) +{ + QtCodeFile* file = getFile(path); + if (file) + { + file->setMaximized(); + } +} + +void QtCodeFileList::showContents() +{ + for (std::shared_ptr filePtr : m_files) + { + filePtr->show(); + } +} + void QtCodeFileList::scrollToSnippet(QtCodeSnippet* snippet) { this->ensureWidgetVisibleAnimated(snippet, snippet->getFirstActiveLineRect()); } -QtCodeFile* QtCodeFileList::getFile(std::shared_ptr locationFile) +QtCodeFile* QtCodeFileList::getFile(const FilePath filePath) { - FilePath filePath = locationFile->getFilePath(); QtCodeFile* file = nullptr; for (std::shared_ptr filePtr : m_files) @@ -179,11 +213,13 @@ QtCodeFile* QtCodeFileList::getFile(std::shared_ptr locationF if (!file) { - std::shared_ptr filePtr = std::make_shared(locationFile->getFilePath(), this); + std::shared_ptr filePtr = std::make_shared(filePath, this); m_files.push_back(filePtr); file = filePtr.get(); m_frame->layout()->addWidget(file); + + file->hide(); } return file; diff --git a/src/lib_gui/qt/element/QtCodeFileList.h b/src/lib_gui/qt/element/QtCodeFileList.h index 0783c655..09472b9b 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.h +++ b/src/lib_gui/qt/element/QtCodeFileList.h @@ -7,6 +7,7 @@ #include #include +#include "utility/file/FilePath.h" #include "utility/TimePoint.h" #include "utility/types.h" @@ -60,11 +61,17 @@ public: void focusTokenIds(const std::vector& focusedTokenIds); void defocusTokenIds(); + void setFileMinimized(const FilePath path); + void setFileSnippets(const FilePath path); + void setFileMaximized(const FilePath path); + + void showContents(); + private slots: void scrollToSnippet(QtCodeSnippet* snippet); private: - QtCodeFile* getFile(std::shared_ptr locationFile); + QtCodeFile* getFile(const FilePath filePath); void updateFiles(); diff --git a/src/lib_gui/qt/element/QtCodeSnippet.cpp b/src/lib_gui/qt/element/QtCodeSnippet.cpp index ea996f90..fea80d53 100644 --- a/src/lib_gui/qt/element/QtCodeSnippet.cpp +++ b/src/lib_gui/qt/element/QtCodeSnippet.cpp @@ -5,7 +5,6 @@ #include #include "utility/messaging/type/MessageShowScope.h" -#include "utility/messaging/type/MessageShowFile.h" #include "utility/text/TextAccess.h" #include "data/location/TokenLocationFile.h" @@ -160,11 +159,11 @@ std::string QtCodeSnippet::getCode() const void QtCodeSnippet::contextMenuEvent(QContextMenuEvent* event) { - QMenu menu(this); - menu.addAction(new QAction("Bar", this)); - menu.addAction(new QAction("Brew Tea", this)); - menu.addAction(new QAction("Translate", this)); - menu.exec(event->globalPos()); + // QMenu menu(this); + // menu.addAction(new QAction("Bar", this)); + // menu.addAction(new QAction("Brew Tea", this)); + // menu.addAction(new QAction("Translate", this)); + // menu.exec(event->globalPos()); } void QtCodeSnippet::clickedTitle() @@ -175,7 +174,7 @@ void QtCodeSnippet::clickedTitle() } else { - MessageShowFile(FilePath(m_titleString), (dynamic_cast(parent())->getErrorMessages().size() > 0)).dispatch(); + dynamic_cast(parent())->clickedMaximizeButton(); } } diff --git a/src/lib_gui/qt/view/QtCodeView.cpp b/src/lib_gui/qt/view/QtCodeView.cpp index 9209789c..e02a12f3 100644 --- a/src/lib_gui/qt/view/QtCodeView.cpp +++ b/src/lib_gui/qt/view/QtCodeView.cpp @@ -12,13 +12,15 @@ QtCodeView::QtCodeView(ViewLayout* viewLayout) : CodeView(viewLayout) , m_refreshViewFunctor(std::bind(&QtCodeView::doRefreshView, this)) - , m_showCodeSnippetsFunctor(std::bind(&QtCodeView::doShowCodeSnippets, this, std::placeholders::_1)) + , m_showCodeSnippetsFunctor(std::bind(&QtCodeView::doShowCodeSnippets, 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_doShowFirstActiveSnippetFunctor(std::bind(&QtCodeView::doShowFirstActiveSnippet, this)) - , m_doShowActiveTokenIdsFunctor(std::bind(&QtCodeView::doShowActiveTokenIds, this)) + , m_setFileStateFunctor(std::bind(&QtCodeView::doSetFileState, this, std::placeholders::_1, std::placeholders::_2)) + , m_doShowFirstActiveSnippetFunctor(std::bind(&QtCodeView::doShowFirstActiveSnippet, 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_defocusTokenIdsFunctor(std::bind(&QtCodeView::doDefocusTokenIds, this)) + , m_showContentsFunctor(std::bind(&QtCodeView::doShowContents, this)) , m_isExpanding(false) { m_widget = new QtCodeFileList(); @@ -53,9 +55,9 @@ void QtCodeView::setErrorMessages(const std::vector& errorMessages) m_errorMessages = errorMessages; } -void QtCodeView::showCodeSnippets(const std::vector& snippets) +void QtCodeView::showCodeSnippets(const std::vector& snippets, const std::vector& activeTokenIds) { - m_showCodeSnippetsFunctor(snippets); + m_showCodeSnippetsFunctor(snippets, activeTokenIds); } void QtCodeView::addCodeSnippets(const std::vector& snippets, bool insert) @@ -68,14 +70,19 @@ void QtCodeView::showCodeFile(const CodeSnippetParams& params) m_showCodeFileFunctor(params); } -void QtCodeView::showFirstActiveSnippet() +void QtCodeView::setFileState(const FilePath filePath, FileState state) { - m_doShowFirstActiveSnippetFunctor(); + m_setFileStateFunctor(filePath, state); } -void QtCodeView::showActiveTokenIds() +void QtCodeView::showFirstActiveSnippet(const std::vector& activeTokenIds) { - m_doShowActiveTokenIdsFunctor(); + m_doShowFirstActiveSnippetFunctor(activeTokenIds); +} + +void QtCodeView::showActiveTokenIds(const std::vector& activeTokenIds) +{ + m_doShowActiveTokenIdsFunctor(activeTokenIds); } void QtCodeView::focusTokenIds(const std::vector& focusedTokenIds) @@ -88,6 +95,11 @@ void QtCodeView::defocusTokenIds() m_defocusTokenIdsFunctor(); } +void QtCodeView::showContents() +{ + m_showContentsFunctor(); +} + void QtCodeView::doRefreshView() { setStyleSheet(); @@ -95,11 +107,11 @@ void QtCodeView::doRefreshView() QtCodeArea::clearAnnotationColors(); } -void QtCodeView::doShowCodeSnippets(const std::vector& snippets) +void QtCodeView::doShowCodeSnippets(const std::vector& snippets, const std::vector& activeTokenIds) { m_widget->clearCodeSnippets(); - m_widget->setActiveTokenIds(m_activeTokenIds); + m_widget->setActiveTokenIds(activeTokenIds); m_widget->setErrorMessages(m_errorMessages); for (const CodeSnippetParams& params : snippets) @@ -155,9 +167,25 @@ void QtCodeView::doShowCodeFile(const CodeSnippetParams& params) m_widget->addCodeSnippet(1, params.title, 0, params.code, params.locationFile, -1, params.modificationTime); } -void QtCodeView::doShowFirstActiveSnippet() +void QtCodeView::doSetFileState(const FilePath filePath, FileState state) { - m_widget->setActiveTokenIds(m_activeTokenIds); + switch (state) + { + case FILE_MINIMIZED: + m_widget->setFileMinimized(filePath); + break; + case FILE_SNIPPETS: + m_widget->setFileSnippets(filePath); + break; + case FILE_MAXIMIZED: + m_widget->setFileMaximized(filePath); + break; + } +} + +void QtCodeView::doShowFirstActiveSnippet(const std::vector& activeTokenIds) +{ + m_widget->setActiveTokenIds(activeTokenIds); if (!m_widget->scrollToFirstActiveSnippet()) { @@ -166,9 +194,9 @@ void QtCodeView::doShowFirstActiveSnippet() } } -void QtCodeView::doShowActiveTokenIds() +void QtCodeView::doShowActiveTokenIds(const std::vector& activeTokenIds) { - m_widget->setActiveTokenIds(m_activeTokenIds); + m_widget->setActiveTokenIds(activeTokenIds); m_widget->showActiveTokenIds(); } @@ -182,6 +210,11 @@ void QtCodeView::doDefocusTokenIds() m_widget->defocusTokenIds(); } +void QtCodeView::doShowContents() const +{ + m_widget->showContents(); +} + 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 22ee5193..7ad62c1b 100644 --- a/src/lib_gui/qt/view/QtCodeView.h +++ b/src/lib_gui/qt/view/QtCodeView.h @@ -29,39 +29,49 @@ public: virtual void setActiveTokenIds(const std::vector& activeTokenIds); virtual void setErrorMessages(const std::vector& errorMessages); - virtual void showCodeSnippets(const std::vector& snippets); + virtual void showCodeSnippets(const std::vector& snippets, const std::vector& activeTokenIds); virtual void addCodeSnippets(const std::vector& snippets, bool insert); virtual void showCodeFile(const CodeSnippetParams& params); - virtual void showFirstActiveSnippet(); - virtual void showActiveTokenIds(); + virtual void setFileState(const FilePath filePath, FileState state); + + virtual void showFirstActiveSnippet(const std::vector& activeTokenIds); + virtual void showActiveTokenIds(const std::vector& activeTokenIds); virtual void focusTokenIds(const std::vector& focusedTokenIds); virtual void defocusTokenIds(); + virtual void showContents(); + private: void doRefreshView(); - void doShowCodeSnippets(const std::vector& snippets); + void doShowCodeSnippets(const std::vector& snippets, const std::vector& activeTokenIds); void doAddCodeSnippets(const std::vector& snippets, bool insert); void doShowCodeFile(const CodeSnippetParams& params); - void doShowFirstActiveSnippet(); - void doShowActiveTokenIds(); + void doSetFileState(const FilePath filePath, FileState state); + + void doShowFirstActiveSnippet(const std::vector& activeTokenIds); + void doShowActiveTokenIds(const std::vector& activeTokenIds); void doFocusTokenIds(const std::vector& focusedTokenIds); void doDefocusTokenIds(); + void doShowContents() const; + void setStyleSheet() const; QtThreadedFunctor<> m_refreshViewFunctor; - QtThreadedFunctor&> m_showCodeSnippetsFunctor; + QtThreadedFunctor&, const std::vector&> m_showCodeSnippetsFunctor; QtThreadedFunctor&, bool> m_addCodeSnippetsFunctor; QtThreadedFunctor m_showCodeFileFunctor; - QtThreadedFunctor<> m_doShowFirstActiveSnippetFunctor; - QtThreadedFunctor<> m_doShowActiveTokenIdsFunctor; + QtThreadedFunctor m_setFileStateFunctor; + QtThreadedFunctor&> m_doShowFirstActiveSnippetFunctor; + QtThreadedFunctor&> m_doShowActiveTokenIdsFunctor; QtThreadedFunctor&> m_focusTokenIdsFunctor; QtThreadedFunctor<> m_defocusTokenIdsFunctor; + QtThreadedFunctor<> m_showContentsFunctor; QtCodeFileList* m_widget;