aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2019-01-28 09:32:11 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2019-02-01 08:15:36 +0000
commit0df7468e517192b5fbc6c8a5059d3ef6c412545c (patch)
tree8f203735d93e1fd467e58c9e8f6cfec0b32dcb45 /src
parent966f4ea6a9d1e46833fc30df878ba6fa8f919988 (diff)
Clang: Add tooltip action to copy to clipboard
...as selecting text in the tooltip was difficult and eventually got disabled due to other problems - see d58c0a9ac8123fd81c335b322defbbb567de840d. This adds support for actions in TextMarks. They are displayed as QToolButtons in a dedicated column in the tooltip. Change-Id: I84ee3c3e4af573a80953786881d1333b00e4200c Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io> Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp10
-rw-r--r--src/plugins/clangcodemodel/clangtextmark.cpp13
-rw-r--r--src/plugins/texteditor/textmark.cpp49
-rw-r--r--src/plugins/texteditor/textmark.h6
4 files changed, 69 insertions, 9 deletions
diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp
index 9fcec8d6b5..497af71993 100644
--- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp
+++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp
@@ -474,9 +474,17 @@ QString ClangDiagnosticWidget::createText(
const ClangDiagnosticWidget::Destination &destination)
{
const QString htmlText = WidgetFromDiagnostics(toHints(destination)).htmlText(diagnostics);
+
QTextDocument document;
document.setHtml(htmlText);
- return document.toPlainText();
+ QString text = document.toPlainText();
+
+ if (text.startsWith('\n'))
+ text = text.mid(1);
+ if (text.endsWith('\n'))
+ text.chop(1);
+
+ return text;
}
QWidget *ClangDiagnosticWidget::createWidget(
diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp
index 0b66305d6e..b8dc9a92a4 100644
--- a/src/plugins/clangcodemodel/clangtextmark.cpp
+++ b/src/plugins/clangcodemodel/clangtextmark.cpp
@@ -33,7 +33,9 @@
#include <utils/qtcassert.h>
#include <utils/theme/theme.h>
+#include <QAction>
#include <QApplication>
+#include <QClipboard>
#include <QLayout>
#include <QString>
@@ -64,7 +66,6 @@ static Core::Id categoryForSeverity(ClangBackEnd::DiagnosticSeverity severity)
} // anonymous namespace
-
ClangTextMark::ClangTextMark(const FileName &fileName,
const ClangBackEnd::DiagnosticContainer &diagnostic,
const RemovedFromEditorHandler &removedHandler,
@@ -86,6 +87,16 @@ ClangTextMark::ClangTextMark(const FileName &fileName,
setColor(warning ? ::Utils::Theme::CodeModel_Warning_TextMarkColor
: ::Utils::Theme::CodeModel_Error_TextMarkColor);
}
+
+ QAction *action = new QAction();
+ action->setIcon(QIcon::fromTheme("edit-copy", ::Utils::Icons::COPY.icon()));
+ QObject::connect(action, &QAction::triggered, [diagnostic]() {
+ using namespace ClangCodeModel::Internal;
+ const QString text = ClangDiagnosticWidget::createText({diagnostic},
+ ClangDiagnosticWidget::InfoBar);
+ QApplication::clipboard()->setText(text, QClipboard::Clipboard);
+ });
+ setActions({action});
}
void ClangTextMark::updateIcon(bool valid)
diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp
index 17c6268f85..8995167564 100644
--- a/src/plugins/texteditor/textmark.cpp
+++ b/src/plugins/texteditor/textmark.cpp
@@ -31,9 +31,12 @@
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/documentmanager.h>
#include <utils/qtcassert.h>
+#include <utils/tooltip/tooltip.h>
+#include <QAction>
#include <QGridLayout>
#include <QPainter>
+#include <QToolButton>
using namespace Core;
using namespace Utils;
@@ -88,6 +91,8 @@ TextMark::TextMark(const FileName &fileName, int lineNumber, Id category, double
TextMark::~TextMark()
{
+ qDeleteAll(m_actions);
+ m_actions.clear();
if (!m_fileName.isEmpty())
TextMarkRegistry::remove(this);
if (m_baseTextDocument)
@@ -269,14 +274,34 @@ void TextMark::addToToolTipLayout(QGridLayout *target) const
{
auto contentLayout = new QVBoxLayout;
addToolTipContent(contentLayout);
- if (contentLayout->count() > 0) {
- const int row = target->rowCount();
- if (!m_icon.isNull()) {
- auto iconLabel = new QLabel;
- iconLabel->setPixmap(m_icon.pixmap(16, 16));
- target->addWidget(iconLabel, row, 0, Qt::AlignTop | Qt::AlignHCenter);
+ if (contentLayout->count() <= 0)
+ return;
+
+ // Left column: text mark icon
+ const int row = target->rowCount();
+ if (!m_icon.isNull()) {
+ auto iconLabel = new QLabel;
+ iconLabel->setPixmap(m_icon.pixmap(16, 16));
+ target->addWidget(iconLabel, row, 0, Qt::AlignTop | Qt::AlignHCenter);
+ }
+
+ // Middle column: tooltip content
+ target->addLayout(contentLayout, row, 1);
+
+ // Right column: action icons/button
+ if (!m_actions.isEmpty()) {
+ auto actionsLayout = new QHBoxLayout;
+ for (QAction *action : m_actions) {
+ QTC_ASSERT(!action->icon().isNull(), continue);
+ auto button = new QToolButton;
+ button->setIcon(action->icon());
+ QObject::connect(button, &QToolButton::clicked, action, &QAction::triggered);
+ QObject::connect(button, &QToolButton::clicked, []() {
+ Utils::ToolTip::hideImmediately();
+ });
+ actionsLayout->addWidget(button, 0, Qt::AlignTop | Qt::AlignRight);
}
- target->addLayout(contentLayout, row, 1);
+ target->addLayout(actionsLayout, row, 2);
}
}
@@ -311,6 +336,16 @@ void TextMark::setColor(const Theme::Color &color)
m_color = color;
}
+QVector<QAction *> TextMark::actions() const
+{
+ return m_actions;
+}
+
+void TextMark::setActions(const QVector<QAction *> &actions)
+{
+ m_actions = actions;
+}
+
TextMarkRegistry::TextMarkRegistry(QObject *parent)
: QObject(parent)
{
diff --git a/src/plugins/texteditor/textmark.h b/src/plugins/texteditor/textmark.h
index 9275c254ae..eeeb761eaf 100644
--- a/src/plugins/texteditor/textmark.h
+++ b/src/plugins/texteditor/textmark.h
@@ -32,8 +32,10 @@
#include <utils/fileutils.h>
#include <QIcon>
+#include <QVector>
QT_BEGIN_NAMESPACE
+class QAction;
class QGridLayout;
class QLayout;
class QPainter;
@@ -122,6 +124,9 @@ public:
QString toolTip() const { return m_toolTip; }
void setToolTip(const QString &toolTip) { m_toolTip = toolTip; }
+ QVector<QAction *> actions() const;
+ void setActions(const QVector<QAction *> &actions); // Takes ownership
+
private:
Q_DISABLE_COPY(TextMark)
@@ -138,6 +143,7 @@ private:
QString m_lineAnnotation;
QString m_toolTip;
QString m_defaultToolTip;
+ QVector<QAction *> m_actions;
};
} // namespace TextEditor