#ifndef QT_CODE_NAVIGATOR_H #define QT_CODE_NAVIGATOR_H #include #include "data/ErrorInfo.h" #include "data/location/LocationType.h" #include "qt/element/QtCodeFileList.h" #include "qt/element/QtCodeFileSingle.h" #include "qt/utility/QtThreadedFunctor.h" #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageCodeReference.h" #include "utility/messaging/type/MessageFinishedParsing.h" #include "utility/messaging/type/MessageShowReference.h" #include "utility/messaging/type/MessageSwitchColorScheme.h" #include "utility/messaging/type/MessageWindowFocus.h" class QLabel; class QPushButton; class SourceLocationCollection; class SourceLocationFile; class QtCodeNavigator : public QWidget , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener { Q_OBJECT public: QtCodeNavigator(QWidget* parent = nullptr); virtual ~QtCodeNavigator(); void addCodeSnippet(const CodeSnippetParams& params); void addFile(std::shared_ptr locationFile, int refCount, TimePoint modificationTime); void addedFiles(); void clear(); void clearCodeSnippets(); void clearFile(); void clearCaches(); const std::set& getCurrentActiveTokenIds() const; void setCurrentActiveTokenIds(const std::vector& currentActiveTokenIds); const std::set& getCurrentActiveLocationIds() const; void setCurrentActiveLocationIds(const std::vector& currentActiveLocationIds); const std::set& getActiveTokenIds() const; void setActiveTokenIds(const std::vector& activeTokenIds); const std::set& getActiveLocalSymbolIds() const; void setActiveLocalSymbolIds(const std::vector& activeLocalSymbolIds); const std::set& getFocusedTokenIds() const; void setFocusedTokenIds(const std::vector& focusedTokenIds); std::string getErrorMessageForId(Id errorId) const; void setErrorInfos(const std::vector& errorInfos); bool hasErrors() const; size_t getFatalErrorCountForFile(const FilePath& filePath) const; bool isInListMode() const; bool hasSingleFileCached(const FilePath& filePath) const; void showActiveSnippet( const std::vector& activeTokenIds, std::shared_ptr collection, bool scrollTo); void focusTokenIds(const std::vector& focusedTokenIds); void defocusTokenIds(); void setFileMinimized(const FilePath path); void setFileSnippets(const FilePath path); void setFileMaximized(const FilePath path); void updateFiles(); void showContents(); void refreshStyle(); void scrollToValue(int value, bool inListMode); void scrollToLine(const FilePath& filePath, unsigned int line); void scrollToDefinition(bool animated, bool ignoreActiveReference); void scrollToSnippetIfRequested(); void requestScroll(const FilePath& filePath, uint lineNumber, Id locationId, bool animated, bool onTop); signals: void scrollRequest(); public slots: void scrolled(int value); private slots: void handleScrollRequest(); void setValue(); void previousReference(bool fromUI = true); void nextReference(bool fromUI = true); void setModeList(); void setModeSingle(); private: enum Mode { MODE_NONE, MODE_LIST, MODE_SINGLE }; void setMode(Mode mode); struct Reference { Reference() : tokenId(0) , locationId(0) , locationType(LOCATION_TOKEN) { } FilePath filePath; Id tokenId; Id locationId; LocationType locationType; }; void showCurrentReference(bool fromUI); void updateRefLabel(); struct ScrollRequest { ScrollRequest() : lineNumber(0) , locationId(0) , animated(false) , onTop(false) { } FilePath filePath; uint lineNumber; Id locationId; bool animated; bool onTop; }; void handleMessage(MessageCodeReference* message); void handleMessage(MessageFinishedParsing* message); void handleMessage(MessageShowReference* message); void handleMessage(MessageSwitchColorScheme* message); void handleMessage(MessageWindowFocus* message); QtThreadedLambdaFunctor m_onQtThread; QtCodeNavigateable* m_current; QtCodeFileList* m_list; QtCodeFileSingle* m_single; Mode m_mode; std::set m_currentActiveTokenIds; std::set m_currentActiveLocationIds; std::set m_activeTokenIds; std::set m_activeLocalSymbolIds; std::set m_focusedTokenIds; std::map m_errorInfos; Id m_activeTokenId; int m_value; QPushButton* m_listButton; QPushButton* m_fileButton; QLabel* m_refLabel; QPushButton* m_prevButton; QPushButton* m_nextButton; QFrame* m_separatorLine; std::vector m_references; Reference m_activeReference; size_t m_refIndex; ScrollRequest m_scrollRequest; bool m_singleHasNewFile; }; #endif // QT_CODE_NAVIGATOR_H