diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-11-25 12:31:14 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2021-11-25 15:19:42 +0000 |
commit | 08a86169db490b23fc9512388c3311a79f12de56 (patch) | |
tree | 38c345d9643d94862c4fa383e0c3bd650fd048c3 | |
parent | 857ca05ac37d43bd5895b8a25a014e93c7570d4a (diff) |
ProjectExplorer: Generalize issues -> output pane linking
This feature was specific to the compile output pane, but we want
to have it in other panes too.
Change-Id: I110b27af7d0aa23acbc5623d1c0405816250df19
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/libs/utils/outputformatter.cpp | 4 | ||||
-rw-r--r-- | src/libs/utils/outputformatter.h | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/ioutputpane.h | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/outputwindow.cpp | 40 | ||||
-rw-r--r-- | src/plugins/coreplugin/outputwindow.h | 4 | ||||
-rw-r--r-- | src/plugins/projectexplorer/compileoutputwindow.cpp | 44 | ||||
-rw-r--r-- | src/plugins/projectexplorer/compileoutputwindow.h | 6 | ||||
-rw-r--r-- | src/plugins/projectexplorer/ioutputparser.cpp | 14 | ||||
-rw-r--r-- | src/plugins/projectexplorer/ioutputparser.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/showoutputtaskhandler.cpp | 18 | ||||
-rw-r--r-- | src/plugins/projectexplorer/showoutputtaskhandler.h | 8 |
11 files changed, 82 insertions, 62 deletions
diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp index cf6930cbe5..bb2973c638 100644 --- a/src/libs/utils/outputformatter.cpp +++ b/src/libs/utils/outputformatter.cpp @@ -324,7 +324,7 @@ void OutputFormatter::doAppendMessage(const QString &text, OutputFormat format) if (d->postPrintAction) d->postPrintAction(p); else - p->runPostPrintActions(); + p->runPostPrintActions(plainTextEdit()); } } @@ -591,7 +591,7 @@ void OutputFormatter::flush() for (OutputLineParser * const p : qAsConst(d->lineParsers)) p->flush(); if (d->nextParser) - d->nextParser->runPostPrintActions(); + d->nextParser->runPostPrintActions(plainTextEdit()); } bool OutputFormatter::hasFatalErrors() const diff --git a/src/libs/utils/outputformatter.h b/src/libs/utils/outputformatter.h index f3a19ca2fb..0053032522 100644 --- a/src/libs/utils/outputformatter.h +++ b/src/libs/utils/outputformatter.h @@ -91,7 +91,7 @@ public: virtual bool handleLink(const QString &href) { Q_UNUSED(href); return false; } virtual bool hasFatalErrors() const { return false; } virtual void flush() {} - virtual void runPostPrintActions() {} + virtual void runPostPrintActions(QPlainTextEdit *) {} void setRedirectionDetector(const OutputLineParser *detector); bool needsRedirection() const; diff --git a/src/plugins/coreplugin/ioutputpane.h b/src/plugins/coreplugin/ioutputpane.h index 432720f3e5..4b338a1f8b 100644 --- a/src/plugins/coreplugin/ioutputpane.h +++ b/src/plugins/coreplugin/ioutputpane.h @@ -42,6 +42,7 @@ QT_END_NAMESPACE namespace Core { class CommandButton; class IContext; +class OutputWindow; class CORE_EXPORT IOutputPane : public QObject { @@ -54,6 +55,7 @@ public: virtual QWidget *outputWidget(QWidget *parent) = 0; virtual QList<QWidget *> toolBarWidgets() const; virtual QString displayName() const = 0; + virtual const QList<OutputWindow *> outputWindows() const { return {}; } virtual int priorityInStatusBar() const = 0; diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 97885852fb..7791d22bb1 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -39,7 +39,9 @@ #include <QAction> #include <QCursor> #include <QElapsedTimer> +#include <QHash> #include <QMimeData> +#include <QPair> #include <QPointer> #include <QRegularExpression> #include <QScrollBar> @@ -88,6 +90,7 @@ public: OutputWindow::FilterModeFlags filterMode = OutputWindow::FilterModeFlag::Default; QTimer scrollTimer; QElapsedTimer lastMessage; + QHash<unsigned int, QPair<int, int>> taskPositions; }; } // namespace Internal @@ -491,6 +494,42 @@ void OutputWindow::appendMessage(const QString &output, OutputFormat format) d->queueTimer.start(); } +void OutputWindow::registerPositionOf(unsigned taskId, int linkedOutputLines, int skipLines, + int offset) +{ + if (linkedOutputLines <= 0) + return; + + const int blocknumber = document()->blockCount() - offset; + const int firstLine = blocknumber - linkedOutputLines - skipLines; + const int lastLine = firstLine + linkedOutputLines - 1; + + d->taskPositions.insert(taskId, qMakePair(firstLine, lastLine)); +} + +bool OutputWindow::knowsPositionOf(unsigned taskId) const +{ + return d->taskPositions.contains(taskId); +} + +void OutputWindow::showPositionOf(unsigned taskId) +{ + QPair<int, int> position = d->taskPositions.value(taskId); + QTextCursor newCursor(document()->findBlockByNumber(position.second)); + + // Move cursor to end of last line of interest: + newCursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); + setTextCursor(newCursor); + + // Move cursor and select lines: + newCursor.setPosition(document()->findBlockByNumber(position.first).position(), + QTextCursor::KeepAnchor); + setTextCursor(newCursor); + + // Center cursor now: + centerCursor(); +} + QMimeData *OutputWindow::createMimeDataFromSelection() const { const auto mimeData = new QMimeData; @@ -522,6 +561,7 @@ void OutputWindow::clear() { d->formatter.clear(); d->scrollToBottom = true; + d->taskPositions.clear(); } void OutputWindow::flush() diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h index 70b216b08c..f34182f115 100644 --- a/src/plugins/coreplugin/outputwindow.h +++ b/src/plugins/coreplugin/outputwindow.h @@ -62,6 +62,10 @@ public: void appendMessage(const QString &out, Utils::OutputFormat format); + void registerPositionOf(unsigned taskId, int linkedOutputLines, int skipLines, int offset = 0); + bool knowsPositionOf(unsigned taskId) const; + void showPositionOf(unsigned taskId); + void grayOutOldContent(); void clear(); void flush(); diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 609321f425..839a1d2546 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -81,17 +81,6 @@ CompileOutputWindow::CompileOutputWindow(QAction *cancelBuildAction) : m_outputWindow->setUndoRedoEnabled(false); m_outputWindow->setMaxCharCount(Core::Constants::DEFAULT_MAX_CHAR_COUNT); - outputFormatter()->overridePostPrintAction([this](Utils::OutputLineParser *parser) { - if (const auto taskParser = qobject_cast<OutputTaskParser *>(parser)) { - int offset = 0; - Utils::reverseForeach(taskParser->taskInfo(), [this, &offset](const OutputTaskParser::TaskInfo &ti) { - registerPositionOf(ti.task, ti.linkedLines, ti.skippedLines, offset); - offset += ti.linkedLines; - }); - } - parser->runPostPrintActions(); - }); - Utils::ProxyAction *cancelBuildProxyButton = Utils::ProxyAction::proxyActionWithIcon(cancelBuildAction, Utils::Icons::STOP_SMALL_TOOLBAR.icon()); @@ -198,7 +187,6 @@ void CompileOutputWindow::appendText(const QString &text, BuildStep::OutputForma void CompileOutputWindow::clearContents() { m_outputWindow->clear(); - m_taskPositions.clear(); } int CompileOutputWindow::priorityInStatusBar() const @@ -230,37 +218,7 @@ bool CompileOutputWindow::canNavigate() const void CompileOutputWindow::registerPositionOf(const Task &task, int linkedOutputLines, int skipLines, int offset) { - if (linkedOutputLines <= 0) - return; - - const int blocknumber = m_outputWindow->document()->blockCount() - offset; - const int firstLine = blocknumber - linkedOutputLines - skipLines; - const int lastLine = firstLine + linkedOutputLines - 1; - - m_taskPositions.insert(task.taskId, qMakePair(firstLine, lastLine)); -} - -bool CompileOutputWindow::knowsPositionOf(const Task &task) -{ - return (m_taskPositions.contains(task.taskId)); -} - -void CompileOutputWindow::showPositionOf(const Task &task) -{ - QPair<int, int> position = m_taskPositions.value(task.taskId); - QTextCursor newCursor(m_outputWindow->document()->findBlockByNumber(position.second)); - - // Move cursor to end of last line of interest: - newCursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); - m_outputWindow->setTextCursor(newCursor); - - // Move cursor and select lines: - newCursor.setPosition(m_outputWindow->document()->findBlockByNumber(position.first).position(), - QTextCursor::KeepAnchor); - m_outputWindow->setTextCursor(newCursor); - - // Center cursor now: - m_outputWindow->centerCursor(); + m_outputWindow->registerPositionOf(task.taskId, linkedOutputLines, skipLines, offset); } void CompileOutputWindow::flush() diff --git a/src/plugins/projectexplorer/compileoutputwindow.h b/src/plugins/projectexplorer/compileoutputwindow.h index 24265f4219..989ea944bc 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.h +++ b/src/plugins/projectexplorer/compileoutputwindow.h @@ -30,8 +30,6 @@ #include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/ioutputpane.h> -#include <QHash> -#include <QPair> QT_BEGIN_NAMESPACE class QToolButton; @@ -73,8 +71,6 @@ public: void appendText(const QString &text, BuildStep::OutputFormat format); void registerPositionOf(const Task &task, int linkedOutputLines, int skipLines, int offset = 0); - bool knowsPositionOf(const Task &task); - void showPositionOf(const Task &task); void flush(); void reset(); @@ -86,13 +82,13 @@ public: private: void updateFilter() override; + const QList<Core::OutputWindow *> outputWindows() const override { return {m_outputWindow}; } void loadSettings(); void storeSettings() const; void updateFromSettings(); Core::OutputWindow *m_outputWindow; - QHash<unsigned int, QPair<int, int>> m_taskPositions; ShowOutputTaskHandler *m_handler; QToolButton *m_cancelBuildButton; QToolButton * const m_settingsButton; diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index c03c465f8e..bbe0da41dd 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -28,10 +28,14 @@ #include "task.h" #include "taskhub.h" +#include <coreplugin/outputwindow.h> #include <texteditor/fontsettings.h> #include <texteditor/texteditorsettings.h> +#include <utils/algorithm.h> #include <utils/ansiescapecodehandler.h> +#include <QPlainTextEdit> + /*! \class ProjectExplorer::OutputTaskParser @@ -113,8 +117,16 @@ void OutputTaskParser::setDetailsFormat(Task &task, const LinkSpecs &linkSpecs) } } -void OutputTaskParser::runPostPrintActions() +void OutputTaskParser::runPostPrintActions(QPlainTextEdit *edit) { + int offset = 0; + if (const auto ow = qobject_cast<Core::OutputWindow *>(edit)) { + Utils::reverseForeach(taskInfo(), [this, ow, &offset](const TaskInfo &ti) { + ow->registerPositionOf(ti.task.taskId, ti.linkedLines, ti.skippedLines, offset); + offset += ti.linkedLines; + }); + } + for (const TaskInfo &t : qAsConst(d->scheduledTasks)) TaskHub::addTask(t.task); d->scheduledTasks.clear(); diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index b4fb8ab73c..6aefcfb403 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -57,7 +57,7 @@ protected: void setDetailsFormat(Task &task, const LinkSpecs &linkSpecs = {}); private: - void runPostPrintActions() override; + void runPostPrintActions(QPlainTextEdit *edit) override; class Private; Private * const d; diff --git a/src/plugins/projectexplorer/showoutputtaskhandler.cpp b/src/plugins/projectexplorer/showoutputtaskhandler.cpp index 4268d7d5b3..d0398d2732 100644 --- a/src/plugins/projectexplorer/showoutputtaskhandler.cpp +++ b/src/plugins/projectexplorer/showoutputtaskhandler.cpp @@ -27,22 +27,25 @@ #include "task.h" -#include "compileoutputwindow.h" +#include <coreplugin/ioutputpane.h> +#include <coreplugin/outputwindow.h> +#include <utils/algorithm.h> #include <QAction> namespace ProjectExplorer { namespace Internal { -ShowOutputTaskHandler::ShowOutputTaskHandler(CompileOutputWindow *window) : - m_window(window) +ShowOutputTaskHandler::ShowOutputTaskHandler(Core::IOutputPane *window) : m_window(window) { Q_ASSERT(m_window); } bool ShowOutputTaskHandler::canHandle(const Task &task) const { - return m_window->knowsPositionOf(task); + return Utils::anyOf(m_window->outputWindows(), [task](const Core::OutputWindow *ow) { + return ow->knowsPositionOf(task.taskId); + }); } void ShowOutputTaskHandler::handle(const Task &task) @@ -50,7 +53,12 @@ void ShowOutputTaskHandler::handle(const Task &task) Q_ASSERT(canHandle(task)); // popup first as this does move the visible area! m_window->popup(Core::IOutputPane::Flags(Core::IOutputPane::ModeSwitch | Core::IOutputPane::WithFocus)); - m_window->showPositionOf(task); + for (Core::OutputWindow * const ow : m_window->outputWindows()) { + if (ow->knowsPositionOf(task.taskId)) { + ow->showPositionOf(task.taskId); + break; + } + } } QAction *ShowOutputTaskHandler::createAction(QObject *parent) const diff --git a/src/plugins/projectexplorer/showoutputtaskhandler.h b/src/plugins/projectexplorer/showoutputtaskhandler.h index 2c9aa230d0..0dd70f7f10 100644 --- a/src/plugins/projectexplorer/showoutputtaskhandler.h +++ b/src/plugins/projectexplorer/showoutputtaskhandler.h @@ -27,24 +27,24 @@ #include "itaskhandler.h" +namespace Core { class IOutputPane; } + namespace ProjectExplorer { namespace Internal { -class CompileOutputWindow; - class ShowOutputTaskHandler : public ITaskHandler { Q_OBJECT public: - explicit ShowOutputTaskHandler(CompileOutputWindow *window); + explicit ShowOutputTaskHandler(Core::IOutputPane *window); bool canHandle(const Task &) const override; void handle(const Task &task) override; QAction *createAction(QObject *parent) const override; private: - CompileOutputWindow *m_window; + Core::IOutputPane * const m_window; }; } // namespace Internal |