diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 0c42fb77c7d..4d70830ccec 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -33,6 +33,8 @@ #include #include +#include +#include #include #include #include @@ -512,6 +514,33 @@ bool OutputWindow::isScrollbarAtBottom() const return verticalScrollBar()->value() == verticalScrollBar()->maximum(); } +QMimeData *OutputWindow::createMimeDataFromSelection() const +{ + const auto mimeData = new QMimeData; + QString content; + const int selStart = textCursor().selectionStart(); + const int selEnd = textCursor().selectionEnd(); + const QTextBlock firstBlock = document()->findBlock(selStart); + const QTextBlock lastBlock = document()->findBlock(selEnd); + for (QTextBlock curBlock = firstBlock; curBlock != lastBlock; curBlock = curBlock.next()) { + if (!curBlock.isVisible()) + continue; + if (curBlock == firstBlock) + content += curBlock.text().mid(selStart - firstBlock.position()); + else + content += curBlock.text(); + content += '\n'; + } + if (lastBlock.isValid() && lastBlock.isVisible()) { + if (firstBlock == lastBlock) + content = textCursor().selectedText(); + else + content += lastBlock.text().mid(0, selEnd - lastBlock.position()); + } + mimeData->setText(content); + return mimeData; +} + void OutputWindow::clear() { d->enforceNewline = false; diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h index a8a44a52474..8490caa5d49 100644 --- a/src/plugins/coreplugin/outputwindow.h +++ b/src/plugins/coreplugin/outputwindow.h @@ -66,8 +66,6 @@ public: void grayOutOldContent(); void clear(); - void showEvent(QShowEvent *) override; - void scrollToBottom(); void setMaxCharCount(int count); @@ -94,14 +92,16 @@ public slots: protected: bool isScrollbarAtBottom() const; +private: + QMimeData *createMimeDataFromSelection() const override; + void keyPressEvent(QKeyEvent *ev) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void keyPressEvent(QKeyEvent *ev) override; + void showEvent(QShowEvent *) override; void wheelEvent(QWheelEvent *e) override; -private: using QPlainTextEdit::setFont; // call setBaseFont instead, which respects the zoom factor QTimer m_scrollTimer; QElapsedTimer m_lastMessage;