#ifndef QT_CODE_FIELD_H #define QT_CODE_FIELD_H #include #include #include "data/location/LocationType.h" #include "utility/types.h" class QtHighlighter; class SourceLocation; class SourceLocationFile; class QtCodeField : public QPlainTextEdit { Q_OBJECT public: static void clearAnnotationColors(); QtCodeField( uint startLineNumber, const std::string& code, std::shared_ptr locationFile, QWidget* parent = nullptr); ~QtCodeField(); virtual QSize sizeHint() const Q_DECL_OVERRIDE; uint getStartLineNumber() const; uint getEndLineNumber() const; std::string getCode() const; std::shared_ptr getSourceLocationFile() const; void annotateText(); protected: virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE; virtual void enterEvent(QEvent* event) Q_DECL_OVERRIDE; virtual void leaveEvent(QEvent* event) Q_DECL_OVERRIDE; virtual void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE; virtual void focusTokenIds(const std::vector& tokenIds); virtual void defocusTokenIds(const std::vector& tokenIds); struct Annotation { int startLine; int endLine; int startCol; int endCol; int start; int end; std::set tokenIds; Id locationId; LocationType locationType; bool isActive; bool isFocused; QColor oldTextColor; }; struct AnnotationColor { std::string border; std::string fill; std::string text; }; bool annotateText( const std::set& activeSymbolIds, const std::set& activeLocationIds, const std::set& focusedSymbolIds); void createAnnotations(std::shared_ptr locationFile); int toTextEditPosition(int lineNumber, int columnNumber) const; std::pair toLineColumn(int textEditPosition) const; int startTextEditPosition() const; int endTextEditPosition() const; void setHoveredAnnotations(const std::vector& annotations); std::vector getCursorRectsForAnnotation(const Annotation& annotation) const; const AnnotationColor& getAnnotationColorForAnnotation(const Annotation& annotation); void setTextColorForAnnotation(Annotation& annotation, QColor color) const; std::vector getInteractiveAnnotationsForPosition(int pos) const; std::vector m_annotations; std::vector m_hoveredAnnotations; private: static std::vector s_annotationColors; void createLineLengthCache(); const uint m_startLineNumber; const std::string m_code; std::shared_ptr m_locationFile; QtHighlighter* m_highlighter; std::vector m_lineLengths; std::set m_colorChangedAnnotationIndices; int m_endTextEditPosition; bool m_wasAnnotated; }; #endif // QT_CODE_FIELD_H