From c40dda07f8a81d4d3513e91e88ead7e279cee02a Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Fri, 20 Nov 2015 12:02:33 +0100 Subject: [PATCH] src: Fix Annotations after Snippet Merge * snippet::merge does not take code from TextAccess since it could be out of date. Instead it takes the code from the snippets that will be merged. --- src/app/qt/element/QtCodeArea.cpp | 10 ++++++++-- src/app/qt/element/QtCodeArea.h | 15 +++++++++------ src/app/qt/element/QtCodeSnippet.cpp | 16 ++++++++++++---- src/app/qt/element/QtCodeSnippet.h | 2 ++ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/app/qt/element/QtCodeArea.cpp b/src/app/qt/element/QtCodeArea.cpp index bbfc9e1a..c61706ae 100644 --- a/src/app/qt/element/QtCodeArea.cpp +++ b/src/app/qt/element/QtCodeArea.cpp @@ -87,6 +87,7 @@ QtCodeArea::QtCodeArea( : QPlainTextEdit(parent) , m_fileWidget(file) , m_startLineNumber(startLineNumber) + , m_code(code) , m_locationFile(locationFile) , m_digits(0) , m_panningValue(-1) @@ -103,8 +104,8 @@ QtCodeArea::QtCodeArea( m_lineNumberArea = new LineNumberArea(this); m_highlighter = new QtHighlighter(document()); - std::string displayCode = code; - if (*code.rbegin() == '\n') + std::string displayCode = m_code; + if (*displayCode.rbegin() == '\n') { displayCode.pop_back(); } @@ -264,6 +265,11 @@ QRectF QtCodeArea::getFirstActiveLineRect() const return blockBoundingGeometry(block); } +std::string QtCodeArea::getCode() const +{ + return m_code; +} + void QtCodeArea::resizeEvent(QResizeEvent *e) { QPlainTextEdit::resizeEvent(e); diff --git a/src/app/qt/element/QtCodeArea.h b/src/app/qt/element/QtCodeArea.h index d425e84a..22be4d61 100644 --- a/src/app/qt/element/QtCodeArea.h +++ b/src/app/qt/element/QtCodeArea.h @@ -29,7 +29,7 @@ public: MouseWheelOverScrollbarFilter(QObject* parent); protected: - bool eventFilter(QObject*obj, QEvent* event); + bool eventFilter(QObject* obj, QEvent* event); }; class QtCodeArea @@ -42,7 +42,7 @@ public: : public QWidget { public: - LineNumberArea(QtCodeArea *codeArea); + LineNumberArea(QtCodeArea* codeArea); virtual ~LineNumberArea(); QSize sizeHint() const Q_DECL_OVERRIDE; @@ -51,7 +51,7 @@ public: virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE; private: - QtCodeArea *m_codeArea; + QtCodeArea* m_codeArea; }; static void clearAnnotationColors(); @@ -72,7 +72,7 @@ public: std::shared_ptr getTokenLocationFile() const; - void lineNumberAreaPaintEvent(QPaintEvent *event); + void lineNumberAreaPaintEvent(QPaintEvent* event); int lineNumberDigits() const; int lineNumberAreaWidth() const; void updateLineNumberAreaWidthForDigits(int digits); @@ -85,8 +85,10 @@ public: QRectF getFirstActiveLineRect() const; + std::string getCode() const; + protected: - virtual void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; + virtual void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE; virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE; virtual void enterEvent(QEvent* event) Q_DECL_OVERRIDE; @@ -100,7 +102,7 @@ protected: private slots: void updateLineNumberAreaWidth(int newBlockCount); - void updateLineNumberArea(const QRect &, int); + void updateLineNumberArea(const QRect&, int); void clearSelection(); void setIDECursorPosition(); @@ -160,6 +162,7 @@ private: QtHighlighter* m_highlighter; const uint m_startLineNumber; + const std::string m_code; std::shared_ptr m_locationFile; diff --git a/src/app/qt/element/QtCodeSnippet.cpp b/src/app/qt/element/QtCodeSnippet.cpp index 72f5f418..ea996f90 100644 --- a/src/app/qt/element/QtCodeSnippet.cpp +++ b/src/app/qt/element/QtCodeSnippet.cpp @@ -35,12 +35,15 @@ std::shared_ptr QtCodeSnippet::merged(QtCodeSnippet* a, QtCodeSni } ); - std::string code; - std::shared_ptr textAccess = TextAccess::createFromFile(locationFile->getFilePath().str()); - for (const std::string& line: textAccess->getLines(first->getStartLineNumber(), second->getEndLineNumber())) + std::string code = first->getCode(); + + std::string secondCode = second->getCode(); + int secondCodeStartIndex = 0; + for (uint i = second->getStartLineNumber(); i <= first->getEndLineNumber(); i++) { - code += line; + secondCodeStartIndex = secondCode.find("\n", secondCodeStartIndex) + 1; } + code += secondCode.substr(secondCodeStartIndex, secondCode.npos); std::string title = first->m_titleString; @@ -150,6 +153,11 @@ QRectF QtCodeSnippet::getFirstActiveLineRect() const return m_codeArea->getFirstActiveLineRect(); } +std::string QtCodeSnippet::getCode() const +{ + return m_codeArea->getCode(); +} + void QtCodeSnippet::contextMenuEvent(QContextMenuEvent* event) { QMenu menu(this); diff --git a/src/app/qt/element/QtCodeSnippet.h b/src/app/qt/element/QtCodeSnippet.h index b9697e03..5e14d848 100644 --- a/src/app/qt/element/QtCodeSnippet.h +++ b/src/app/qt/element/QtCodeSnippet.h @@ -46,6 +46,8 @@ public: QRectF getFirstActiveLineRect() const; + std::string getCode() const; + protected: virtual void contextMenuEvent(QContextMenuEvent* event) Q_DECL_OVERRIDE;