diff options
-rw-r--r-- | src/plugins/clangcodemodel/clangtextmark.cpp | 45 | ||||
-rw-r--r-- | src/plugins/clangtools/diagnosticmark.cpp | 40 | ||||
-rw-r--r-- | src/plugins/cppcheck/cppchecktextmark.cpp | 25 | ||||
-rw-r--r-- | src/plugins/languageclient/diagnosticmanager.cpp | 16 | ||||
-rw-r--r-- | src/plugins/texteditor/textmark.cpp | 34 | ||||
-rw-r--r-- | src/plugins/texteditor/textmark.h | 6 |
6 files changed, 89 insertions, 77 deletions
diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index 23baf4231cb..94ad1c82f86 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -309,31 +309,32 @@ ClangdTextMark::ClangdTextMark(const FilePath &filePath, client->addTask(createTask(m_diagnostic)); } - // Copy to clipboard action - QVector<QAction *> actions; - QAction *action = new QAction(); - action->setIcon(QIcon::fromTheme("edit-copy", Icons::COPY.icon())); - action->setToolTip(tr("Copy to Clipboard", "Clang Code Model Marks")); - QObject::connect(action, &QAction::triggered, [diag = m_diagnostic]() { - const QString text = ClangDiagnosticWidget::createText({diag}, - ClangDiagnosticWidget::InfoBar); - setClipboardAndSelection(text); - }); - actions << action; - - // Remove diagnostic warning action - Project *project = projectForCurrentEditor(); - if (project && isDiagnosticConfigChangable(project, m_diagnostic)) { - action = new QAction(); - action->setIcon(Icons::BROKEN.icon()); - action->setToolTip(tr("Disable Diagnostic in Current Project")); - QObject::connect(action, &QAction::triggered, [diag = m_diagnostic]() { - disableDiagnosticInCurrentProjectConfig(diag); + setActionsProvider([diag = m_diagnostic] { + // Copy to clipboard action + QList<QAction *> actions; + QAction *action = new QAction(); + action->setIcon(QIcon::fromTheme("edit-copy", Icons::COPY.icon())); + action->setToolTip(tr("Copy to Clipboard", "Clang Code Model Marks")); + QObject::connect(action, &QAction::triggered, [diag] { + const QString text = ClangDiagnosticWidget::createText({diag}, + ClangDiagnosticWidget::InfoBar); + setClipboardAndSelection(text); }); actions << action; - } - setActions(actions); + // Remove diagnostic warning action + Project *project = projectForCurrentEditor(); + if (project && isDiagnosticConfigChangable(project, diag)) { + action = new QAction(); + action->setIcon(Icons::BROKEN.icon()); + action->setToolTip(tr("Disable Diagnostic in Current Project")); + QObject::connect(action, &QAction::triggered, [diag] { + disableDiagnosticInCurrentProjectConfig(diag); + }); + actions << action; + } + return actions; + }); } bool ClangdTextMark::addToolTipContent(QLayout *target) const diff --git a/src/plugins/clangtools/diagnosticmark.cpp b/src/plugins/clangtools/diagnosticmark.cpp index 37dd7693921..985d917b80d 100644 --- a/src/plugins/clangtools/diagnosticmark.cpp +++ b/src/plugins/clangtools/diagnosticmark.cpp @@ -54,28 +54,28 @@ DiagnosticMark::DiagnosticMark(const Diagnostic &diagnostic) setIcon(markIcon.isNull() ? Utils::Icons::CODEMODEL_WARNING.icon() : markIcon); setToolTip(createDiagnosticToolTipString(diagnostic, Utils::nullopt, true)); setLineAnnotation(diagnostic.description); + setActionsProvider([diagnostic] { + // Copy to clipboard action + QList<QAction *> actions; + QAction *action = new QAction(); + action->setIcon(QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon())); + action->setToolTip(tr("Copy to Clipboard")); + QObject::connect(action, &QAction::triggered, [diagnostic]() { + const QString text = createFullLocationString(diagnostic.location) + + ": " + + diagnostic.description; + Utils::setClipboardAndSelection(text); + }); + actions << action; - // Copy to clipboard action - QVector<QAction *> actions; - QAction *action = new QAction(); - action->setIcon(QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon())); - action->setToolTip(tr("Copy to Clipboard")); - QObject::connect(action, &QAction::triggered, [diagnostic]() { - const QString text = createFullLocationString(diagnostic.location) - + ": " - + diagnostic.description; - Utils::setClipboardAndSelection(text); + // Disable diagnostic action + action = new QAction(); + action->setIcon(Utils::Icons::BROKEN.icon()); + action->setToolTip(tr("Disable Diagnostic")); + QObject::connect(action, &QAction::triggered, [diagnostic] { disableChecks({diagnostic}); }); + actions << action; + return actions; }); - actions << action; - - // Disable diagnostic action - action = new QAction(); - action->setIcon(Utils::Icons::BROKEN.icon()); - action->setToolTip(tr("Disable Diagnostic")); - QObject::connect(action, &QAction::triggered, [diagnostic] { disableChecks({diagnostic}); }); - actions << action; - - setActions(actions); } void DiagnosticMark::disable() diff --git a/src/plugins/cppcheck/cppchecktextmark.cpp b/src/plugins/cppcheck/cppchecktextmark.cpp index d3446a0610b..a81ac7e6f74 100644 --- a/src/plugins/cppcheck/cppchecktextmark.cpp +++ b/src/plugins/cppcheck/cppchecktextmark.cpp @@ -80,19 +80,20 @@ CppcheckTextMark::CppcheckTextMark (const Diagnostic &diagnostic) setToolTip(toolTipText(diagnostic.severityText)); setLineAnnotation(diagnostic.message); setSettingsPage(Constants::OPTIONS_PAGE_ID); - - // Copy to clipboard action - QAction *action = new QAction(); - action->setIcon(QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon())); - action->setToolTip(TextMark::tr("Copy to Clipboard")); - QObject::connect(action, &QAction::triggered, [diagnostic]() { - const QString text = QString("%1:%2: %3") - .arg(diagnostic.fileName.toUserOutput()) - .arg(diagnostic.lineNumber) - .arg(diagnostic.message); - QApplication::clipboard()->setText(text); + setActionsProvider([diagnostic] { + // Copy to clipboard action + QAction *action = new QAction; + action->setIcon(QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon())); + action->setToolTip(TextMark::tr("Copy to Clipboard")); + QObject::connect(action, &QAction::triggered, [diagnostic]() { + const QString text = QString("%1:%2: %3") + .arg(diagnostic.fileName.toUserOutput()) + .arg(diagnostic.lineNumber) + .arg(diagnostic.message); + QApplication::clipboard()->setText(text); + }); + return QList<QAction *>{action}; }); - setActions({action}); } QString CppcheckTextMark::toolTipText(const QString &severityText) const diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index e81bda7bd8a..cd6cad7e1d9 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -143,14 +143,16 @@ TextEditor::TextMark *DiagnosticManager::createTextMark(const FilePath &filePath { static const auto icon = QIcon::fromTheme("edit-copy", Utils::Icons::COPY.icon()); static const QString tooltip = tr("Copy to Clipboard"); - QAction *action = new QAction(); - action->setIcon(icon); - action->setToolTip(tooltip); - QObject::connect(action, &QAction::triggered, [text = diagnostic.message()]() { - QApplication::clipboard()->setText(text); - }); auto mark = new TextMark(filePath, diagnostic, m_client->id()); - mark->setActions({action}); + mark->setActionsProvider([text = diagnostic.message()] { + QAction *action = new QAction(); + action->setIcon(icon); + action->setToolTip(tooltip); + QObject::connect(action, &QAction::triggered, [text] { + QApplication::clipboard()->setText(text); + }); + return QList<QAction *>{action}; + }); return mark; } diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp index 72f89e7648c..635e1a0c9bc 100644 --- a/src/plugins/texteditor/textmark.cpp +++ b/src/plugins/texteditor/textmark.cpp @@ -97,9 +97,6 @@ TextMark::TextMark(const FilePath &fileName, int lineNumber, Id category, double TextMark::~TextMark() { - qDeleteAll(m_actions); - m_actions.clear(); - delete m_settingsAction; if (!m_fileName.isEmpty()) TextMarkRegistry::remove(this); if (m_baseTextDocument) @@ -311,19 +308,29 @@ void TextMark::addToToolTipLayout(QGridLayout *target) const target->addLayout(contentLayout, row, 1); // Right column: action icons/button - QVector<QAction *> actions = m_actions; - if (m_settingsAction) - actions << m_settingsAction; + QList<QAction *> actions{m_actions.begin(), m_actions.end()}; + if (m_actionsProvider) + actions = m_actionsProvider(); + if (m_settingsPage.isValid()) { + auto settingsAction = new QAction; + settingsAction->setIcon(Utils::Icons::SETTINGS_TOOLBAR.icon()); + settingsAction->setToolTip(tr("Show Diagnostic Settings")); + QObject::connect(settingsAction, &QAction::triggered, Core::ICore::instance(), + [id = m_settingsPage] { Core::ICore::showOptionsDialog(id); }, + Qt::QueuedConnection); + actions.append(settingsAction); + } if (!actions.isEmpty()) { auto actionsLayout = new QHBoxLayout; QMargins margins = actionsLayout->contentsMargins(); margins.setLeft(margins.left() + 5); actionsLayout->setContentsMargins(margins); for (QAction *action : qAsConst(actions)) { - QTC_ASSERT(!action->icon().isNull(), continue); + QTC_ASSERT(!action->icon().isNull(), delete action; continue); auto button = new QToolButton; button->setIcon(action->icon()); button->setToolTip(action->toolTip()); + action->setParent(button); QObject::connect(button, &QToolButton::clicked, action, &QAction::triggered); QObject::connect(button, &QToolButton::clicked, []() { Utils::ToolTip::hideImmediately(); @@ -423,15 +430,14 @@ void TextMark::setActions(const QVector<QAction *> &actions) m_actions = actions; } +void TextMark::setActionsProvider(const std::function<QList<QAction *>()> &actionsProvider) +{ + m_actionsProvider = actionsProvider; +} + void TextMark::setSettingsPage(Id settingsPage) { - delete m_settingsAction; - m_settingsAction = new QAction; - m_settingsAction->setIcon(Utils::Icons::SETTINGS_TOOLBAR.icon()); - m_settingsAction->setToolTip(tr("Show Diagnostic Settings")); - QObject::connect(m_settingsAction, &QAction::triggered, Core::ICore::instance(), - [settingsPage] { Core::ICore::showOptionsDialog(settingsPage); }, - Qt::QueuedConnection); + m_settingsPage = settingsPage; } TextMarkRegistry::TextMarkRegistry(QObject *parent) diff --git a/src/plugins/texteditor/textmark.h b/src/plugins/texteditor/textmark.h index 6184861ce98..d191ee07a73 100644 --- a/src/plugins/texteditor/textmark.h +++ b/src/plugins/texteditor/textmark.h @@ -133,6 +133,7 @@ public: QVector<QAction *> actions() const; void setActions(const QVector<QAction *> &actions); // Takes ownership + void setActionsProvider(const std::function<QList<QAction *>()> &actionsProvider); // Takes ownership protected: void setSettingsPage(Utils::Id settingsPage); @@ -154,8 +155,9 @@ private: QString m_toolTip; std::function<QString()> m_toolTipProvider; QString m_defaultToolTip; - QVector<QAction *> m_actions; - QAction *m_settingsAction = nullptr; + QVector<QAction *> m_actions; // FIXME Remove in master + std::function<QList<QAction *>()> m_actionsProvider; + Utils::Id m_settingsPage; }; } // namespace TextEditor |