diff --git a/src/plugins/coreplugin/CMakeLists.txt b/src/plugins/coreplugin/CMakeLists.txt index a37b2f216ca..10b5475e5fe 100644 --- a/src/plugins/coreplugin/CMakeLists.txt +++ b/src/plugins/coreplugin/CMakeLists.txt @@ -1,5 +1,5 @@ add_qtc_plugin(Core - DEPENDS Qt::PrintSupport Qt::Qml Qt::Sql Qt::Gui Qt::GuiPrivate + DEPENDS Qt::PrintSupport Qt::Qml Qt::Sql Qt::Gui Qt::GuiPrivate TerminalLib PUBLIC_DEPENDS Aggregation ExtensionSystem Utils SOURCES actionmanager/actioncontainer.cpp @@ -285,6 +285,8 @@ add_qtc_plugin(Core statusbarmanager.h systemsettings.cpp systemsettings.h + terminal/searchableterminal.cpp + terminal/searchableterminal.h textdocument.cpp textdocument.h themechooser.cpp diff --git a/src/plugins/terminal/terminalsearch.cpp b/src/plugins/coreplugin/terminal/searchableterminal.cpp similarity index 79% rename from src/plugins/terminal/terminalsearch.cpp rename to src/plugins/coreplugin/terminal/searchableterminal.cpp index 20fa12908cb..5a98d3e57d4 100644 --- a/src/plugins/terminal/terminalsearch.cpp +++ b/src/plugins/coreplugin/terminal/searchableterminal.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "terminalsearch.h" +#include "searchableterminal.h" #include #include @@ -15,7 +15,7 @@ using namespace Utils; using namespace std::chrono_literals; -namespace Terminal { +namespace Core { constexpr std::chrono::milliseconds debounceInterval = 100ms; @@ -115,7 +115,8 @@ QList TerminalSearch::search() if (it != m_surface->end()) { auto hit = TerminalSolution::SearchHit{it.position(), - static_cast(it.position() + searchString.size())}; + static_cast(it.position() + + searchString.size())}; if (m_findFlags.testFlag(FindFlag::FindWholeWords)) { hit.start++; hit.end--; @@ -207,8 +208,8 @@ void TerminalSearch::debouncedUpdateHits() FindFlags TerminalSearch::supportedFindFlags() const { - return FindFlag::FindCaseSensitively | FindFlag::FindBackward - | FindFlag::FindRegularExpression | FindFlag::FindWholeWords; + return FindFlag::FindCaseSensitively | FindFlag::FindBackward | FindFlag::FindRegularExpression + | FindFlag::FindWholeWords; } void TerminalSearch::resetIncrementalSearch() @@ -273,4 +274,57 @@ void TerminalSearch::highlightAll(const QString &txt, FindFlags findFlags) setSearchString(txt, findFlags); } -} // namespace Terminal +SearchableTerminal::SearchableTerminal(QWidget *parent) + : TerminalSolution::TerminalView(parent) +{ + m_aggregate = new Aggregation::Aggregate(this); + m_aggregate->add(this); + + surfaceChanged(); +} + +SearchableTerminal::~SearchableTerminal() = default; + +void SearchableTerminal::surfaceChanged() +{ + TerminalView::surfaceChanged(); + + m_search = TerminalSearchPtr(new TerminalSearch(surface()), [this](TerminalSearch *p) { + m_aggregate->remove(p); + delete p; + }); + + m_aggregate->add(m_search.get()); + + connect(m_search.get(), &TerminalSearch::hitsChanged, this, &SearchableTerminal::updateViewport); + connect(m_search.get(), &TerminalSearch::currentHitChanged, this, [this] { + TerminalSolution::SearchHit hit = m_search->currentHit(); + if (hit.start >= 0) { + setSelection(Selection{hit.start, hit.end, true}, hit != m_lastSelectedHit); + m_lastSelectedHit = hit; + } + }); +} + +void SearchableTerminal::selectionChanged(const std::optional &newSelection) +{ + TerminalView::selectionChanged(newSelection); + + if (selection() && selection()->final) { + QString text = textFromSelection(); + + if (m_search) { + m_search->setCurrentSelection( + SearchHitWithText{{newSelection->start, newSelection->end}, text}); + } + } +} + +const QList &SearchableTerminal::searchHits() const +{ + if (!m_search) + return TerminalSolution::TerminalView::searchHits(); + return m_search->hits(); +} + +} // namespace Core diff --git a/src/plugins/terminal/terminalsearch.h b/src/plugins/coreplugin/terminal/searchableterminal.h similarity index 69% rename from src/plugins/terminal/terminalsearch.h rename to src/plugins/coreplugin/terminal/searchableterminal.h index 4a176e7c643..d1747fd99b2 100644 --- a/src/plugins/terminal/terminalsearch.h +++ b/src/plugins/coreplugin/terminal/searchableterminal.h @@ -3,23 +3,21 @@ #pragma once -#include +#include "../core_global.h" +#include "../find/ifindsupport.h" + +#include #include -#include -#include - -#include - -namespace Terminal { +namespace Core { struct SearchHitWithText : TerminalSolution::SearchHit { QString text; }; -class TerminalSearch : public Core::IFindSupport +class TerminalSearch : public IFindSupport { Q_OBJECT public: @@ -69,4 +67,23 @@ private: QTimer m_debounceTimer; }; -} // namespace Terminal +class CORE_EXPORT SearchableTerminal : public TerminalSolution::TerminalView +{ +public: + SearchableTerminal(QWidget *parent = nullptr); + ~SearchableTerminal() override; + +protected: + void surfaceChanged() override; + const QList &searchHits() const override; + void selectionChanged(const std::optional &newSelection) override; + +private: + using TerminalSearchPtr = std::unique_ptr>; + TerminalSearchPtr m_search; + TerminalSolution::SearchHit m_lastSelectedHit{}; + + Aggregation::Aggregate *m_aggregate{nullptr}; +}; + +} // namespace Core diff --git a/src/plugins/terminal/CMakeLists.txt b/src/plugins/terminal/CMakeLists.txt index 28037780af2..fd73e5d6e67 100644 --- a/src/plugins/terminal/CMakeLists.txt +++ b/src/plugins/terminal/CMakeLists.txt @@ -12,7 +12,6 @@ add_qtc_plugin(Terminal terminalpane.cpp terminalpane.h terminalplugin.cpp terminalprocessimpl.cpp terminalprocessimpl.h - terminalsearch.cpp terminalsearch.h terminalsettings.cpp terminalsettings.h terminaltr.h terminalwidget.cpp terminalwidget.h diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 8916328971f..bfb58ba708a 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -49,7 +49,7 @@ using namespace Core; namespace Terminal { TerminalWidget::TerminalWidget(QWidget *parent, const OpenTerminalParameters &openParameters) - : TerminalSolution::TerminalView(parent) + : Core::SearchableTerminal(parent) , m_context(Utils::Id("TerminalWidget_").withSuffix(QString::number((uintptr_t) this))) , m_openParameters(openParameters) { @@ -73,10 +73,6 @@ TerminalWidget::TerminalWidget(QWidget *parent, const OpenTerminalParameters &op configBlinkTimer(); setAllowBlinkingCursor(settings().allowBlinkingCursor()); }); - - m_aggregate = new Aggregation::Aggregate(this); - m_aggregate->add(this); - m_aggregate->add(m_search.get()); } void TerminalWidget::setupPty() @@ -278,23 +274,11 @@ void TerminalWidget::resizePty(QSize newSize) void TerminalWidget::surfaceChanged() { + Core::SearchableTerminal::surfaceChanged(); + m_shellIntegration.reset(new ShellIntegration()); setSurfaceIntegration(m_shellIntegration.get()); - m_search = TerminalSearchPtr(new TerminalSearch(surface()), [this](TerminalSearch *p) { - m_aggregate->remove(p); - delete p; - }); - - connect(m_search.get(), &TerminalSearch::hitsChanged, this, &TerminalWidget::updateViewport); - connect(m_search.get(), &TerminalSearch::currentHitChanged, this, [this] { - TerminalSolution::SearchHit hit = m_search->currentHit(); - if (hit.start >= 0) { - setSelection(Selection{hit.start, hit.end, true}, hit != m_lastSelectedHit); - m_lastSelectedHit = hit; - } - }); - connect(m_shellIntegration.get(), &ShellIntegration::titleChanged, this, @@ -373,11 +357,6 @@ std::optional TerminalWidget::toLink(const return std::nullopt; } -const QList &TerminalWidget::searchHits() const -{ - return m_search->hits(); -} - void TerminalWidget::onReadyRead(bool forceFlush) { QByteArray data = m_process->readAllRawStandardOutput(); @@ -429,6 +408,8 @@ void TerminalWidget::restart(const OpenTerminalParameters &openParameters) void TerminalWidget::selectionChanged(const std::optional &newSelection) { + Q_UNUSED(newSelection); + updateCopyState(); if (selection() && selection()->final) { @@ -437,9 +418,6 @@ void TerminalWidget::selectionChanged(const std::optional &newSelecti QClipboard *clipboard = QApplication::clipboard(); if (clipboard->supportsSelection()) clipboard->setText(text, QClipboard::Selection); - - m_search->setCurrentSelection( - SearchHitWithText{{newSelection->start, newSelection->end}, text}); } } diff --git a/src/plugins/terminal/terminalwidget.h b/src/plugins/terminal/terminalwidget.h index 4b54562cc6c..c836c832b54 100644 --- a/src/plugins/terminal/terminalwidget.h +++ b/src/plugins/terminal/terminalwidget.h @@ -5,14 +5,12 @@ #include "shellintegration.h" #include "shortcutmap.h" -#include "terminalsearch.h" - -#include #include #include #include +#include #include #include @@ -22,7 +20,7 @@ namespace Terminal { using RegisteredAction = std::unique_ptr>; -class TerminalWidget : public TerminalSolution::TerminalView +class TerminalWidget : public Core::SearchableTerminal { Q_OBJECT public: @@ -31,8 +29,6 @@ public: void closeTerminal(); - TerminalSearch *search() { return m_search.get(); } - void setShellName(const QString &shellName); QString shellName() const; QString title() const; @@ -80,8 +76,6 @@ protected: void setClipboard(const QString &text) override; std::optional toLink(const QString &text) override; - const QList &searchHits() const override; - RegisteredAction registerAction(Utils::Id commandId, const Core::Context &context); void registerShortcut(Core::Command *command); @@ -95,8 +89,6 @@ private: QString m_shellName; QString m_title; - TerminalSolution::SearchHit m_lastSelectedHit{}; - Utils::Id m_identifier; Utils::Terminal::OpenTerminalParameters m_openParameters; @@ -104,11 +96,6 @@ private: Utils::FilePath m_cwd; Utils::CommandLine m_currentCommand; - using TerminalSearchPtr = std::unique_ptr>; - TerminalSearchPtr m_search; - - Aggregation::Aggregate *m_aggregate{nullptr}; - RegisteredAction m_copy; RegisteredAction m_paste; RegisteredAction m_clearSelection;