diff options
Diffstat (limited to 'src/plugins/projectexplorer/compileoutputwindow.cpp')
-rw-r--r-- | src/plugins/projectexplorer/compileoutputwindow.cpp | 113 |
1 files changed, 35 insertions, 78 deletions
diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 3eeedee281..97ab9b69be 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -24,12 +24,14 @@ ****************************************************************************/ #include "compileoutputwindow.h" + #include "buildmanager.h" -#include "showoutputtaskhandler.h" -#include "task.h" +#include "ioutputparser.h" #include "projectexplorer.h" #include "projectexplorericons.h" #include "projectexplorersettings.h" +#include "showoutputtaskhandler.h" +#include "task.h" #include "taskhub.h" #include <coreplugin/outputwindow.h> @@ -40,6 +42,7 @@ #include <texteditor/texteditorsettings.h> #include <texteditor/fontsettings.h> #include <texteditor/behaviorsettings.h> +#include <utils/algorithm.h> #include <utils/outputformatter.h> #include <utils/proxyaction.h> #include <utils/theme/theme.h> @@ -67,75 +70,28 @@ const char WRAP_OUTPUT_KEY[] = "ProjectExplorer/Settings/WrapBuildOutput"; const char MAX_LINES_KEY[] = "ProjectExplorer/Settings/MaxBuildOutputLines"; const char OPTIONS_PAGE_ID[] = "C.ProjectExplorer.CompileOutputOptions"; -class CompileOutputTextEdit : public Core::OutputWindow -{ - Q_OBJECT -public: - CompileOutputTextEdit(const Core::Context &context) : Core::OutputWindow(context, SETTINGS_KEY) - { - setMouseTracking(true); - } - - void addTask(const Task &task, int blocknumber) - { - m_taskids.insert(blocknumber, task.taskId); - } - - void clearTasks() - { - m_taskids.clear(); - } - -protected: - void mouseMoveEvent(QMouseEvent *ev) override - { - const int line = cursorForPosition(ev->pos()).block().blockNumber(); - if (m_taskids.contains(line) && m_mousePressButton == Qt::NoButton) - viewport()->setCursor(Qt::PointingHandCursor); - else - viewport()->setCursor(Qt::IBeamCursor); - QPlainTextEdit::mouseMoveEvent(ev); - } - - void mousePressEvent(QMouseEvent *ev) override - { - m_mousePressPosition = ev->pos(); - m_mousePressButton = ev->button(); - QPlainTextEdit::mousePressEvent(ev); - } - - void mouseReleaseEvent(QMouseEvent *ev) override - { - if ((m_mousePressPosition - ev->pos()).manhattanLength() < 4 - && m_mousePressButton == Qt::LeftButton) { - int line = cursorForPosition(ev->pos()).block().blockNumber(); - if (unsigned taskid = m_taskids.value(line, 0)) - TaskHub::showTaskInEditor(taskid); - } - - m_mousePressButton = Qt::NoButton; - QPlainTextEdit::mouseReleaseEvent(ev); - } - -private: - QHash<int, unsigned int> m_taskids; //Map blocknumber to taskId - QPoint m_mousePressPosition; - Qt::MouseButton m_mousePressButton = Qt::NoButton; -}; - CompileOutputWindow::CompileOutputWindow(QAction *cancelBuildAction) : m_cancelBuildButton(new QToolButton), - m_settingsButton(new QToolButton), - m_formatter(new Utils::OutputFormatter) + m_settingsButton(new QToolButton) { Core::Context context(C_COMPILE_OUTPUT); - m_outputWindow = new CompileOutputTextEdit(context); + m_outputWindow = new Core::OutputWindow(context, SETTINGS_KEY); m_outputWindow->setWindowTitle(displayName()); m_outputWindow->setWindowIcon(Icons::WINDOW.icon()); m_outputWindow->setReadOnly(true); m_outputWindow->setUndoRedoEnabled(false); m_outputWindow->setMaxCharCount(Core::Constants::DEFAULT_MAX_CHAR_COUNT); - m_outputWindow->setFormatter(m_formatter); + + 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(); + }); // Let selected text be colored as if the text edit was editable, // otherwise the highlight for searching is too light @@ -198,7 +154,6 @@ CompileOutputWindow::~CompileOutputWindow() delete m_handler; delete m_cancelBuildButton; delete m_settingsButton; - delete m_formatter; } void CompileOutputWindow::updateFromSettings() @@ -257,7 +212,6 @@ void CompileOutputWindow::appendText(const QString &text, BuildStep::OutputForma void CompileOutputWindow::clearContents() { m_outputWindow->clear(); - m_outputWindow->clearTasks(); m_taskPositions.clear(); } @@ -290,22 +244,17 @@ bool CompileOutputWindow::canNavigate() const return false; } -void CompileOutputWindow::registerPositionOf(const Task &task, int linkedOutputLines, int skipLines) +void CompileOutputWindow::registerPositionOf(const Task &task, int linkedOutputLines, int skipLines, + int offset) { if (linkedOutputLines <= 0) return; - const int charNumber = m_outputWindow->document()->characterCount(); - if (charNumber > m_outputWindow->maxCharCount()) - return; - - const int blocknumber = m_outputWindow->document()->blockCount(); - const int startLine = blocknumber - linkedOutputLines + 1 - skipLines; - const int endLine = blocknumber - skipLines; - m_taskPositions.insert(task.taskId, qMakePair(startLine, endLine)); + const int blocknumber = m_outputWindow->document()->blockCount() - offset - 1; + const int firstLine = blocknumber - linkedOutputLines - skipLines; + const int lastLine = firstLine + linkedOutputLines - 1; - for (int i = startLine; i <= endLine; ++i) - m_outputWindow->addTask(task, i); + m_taskPositions.insert(task.taskId, qMakePair(firstLine, lastLine)); } bool CompileOutputWindow::knowsPositionOf(const Task &task) @@ -333,7 +282,12 @@ void CompileOutputWindow::showPositionOf(const Task &task) void CompileOutputWindow::flush() { - m_formatter->flush(); + m_outputWindow->flush(); +} + +void CompileOutputWindow::reset() +{ + m_outputWindow->reset(); } void CompileOutputWindow::setSettings(const CompileOutputSettings &settings) @@ -343,6 +297,11 @@ void CompileOutputWindow::setSettings(const CompileOutputSettings &settings) updateFromSettings(); } +Utils::OutputFormatter *CompileOutputWindow::outputFormatter() const +{ + return m_outputWindow->outputFormatter(); +} + void CompileOutputWindow::updateFilter() { m_outputWindow->updateFilterProperties(filterText(), filterCaseSensitivity(), @@ -418,5 +377,3 @@ CompileOutputSettingsPage::CompileOutputSettingsPage() } // Internal } // ProjectExplorer - -#include "compileoutputwindow.moc" |