summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-01-06 10:36:18 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-01-08 09:05:40 +0000
commita6b7f22b4dcdc90c7d737ffb12937fd11078e585 (patch)
treed47f0cadc1623b38260bf08ae47c6aa4c2b9f496
parentd7bd54769f3bda0b1cb8ef3580d03b0386f7c9ff (diff)
Qt Designer: Improve plugin error dialog
- Wrap the error message shown as tooltip by displaying it in HTML - Add a context menu with copy functionality to error items Change-Id: I74b368a4ea820be061bf8c9529f76418f5f1e68a Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io> (cherry picked from commit 349e17a714c0aa682cee05ae5c5e06a2386b35e3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/designer/src/lib/shared/plugindialog.cpp44
-rw-r--r--src/designer/src/lib/shared/plugindialog_p.h6
2 files changed, 45 insertions, 5 deletions
diff --git a/src/designer/src/lib/shared/plugindialog.cpp b/src/designer/src/lib/shared/plugindialog.cpp
index cb6ac6219..de96d55d2 100644
--- a/src/designer/src/lib/shared/plugindialog.cpp
+++ b/src/designer/src/lib/shared/plugindialog.cpp
@@ -37,14 +37,23 @@
#include <QtUiPlugin/customwidget.h>
+#include <QtWidgets/qaction.h>
#include <QtWidgets/qstyle.h>
#include <QtWidgets/qheaderview.h>
+#include <QtWidgets/qmenu.h>
#include <QtWidgets/qpushbutton.h>
+
+#if QT_CONFIG(clipboard)
+# include <QtGui/QClipboard>
+#endif
+
#include <QtCore/qfileinfo.h>
#include <QtCore/qpluginloader.h>
QT_BEGIN_NAMESPACE
+enum { ErrorItemRole = Qt::UserRole + 1 };
+
namespace qdesigner_internal {
PluginDialog::PluginDialog(QDesignerFormEditorInterface *core, QWidget *parent)
@@ -64,6 +73,9 @@ PluginDialog::PluginDialog(QDesignerFormEditorInterface *core, QWidget *parent)
ui.treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
ui.treeWidget->setHeaderLabels(headerLabels);
ui.treeWidget->header()->hide();
+ ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(ui.treeWidget, &QWidget::customContextMenuRequested,
+ this, &PluginDialog::treeWidgetContextMenu);
interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirOpenIcon),
QIcon::Normal, QIcon::On);
@@ -118,8 +130,13 @@ void PluginDialog::populateTreeWidget()
const QFont boldFont = topLevelItem->font(0);
for (const QString &plugin : notLoadedPlugins) {
const QString failureReason = pluginManager->failureReason(plugin);
+ const QString htmlFailureReason = QLatin1String("<html><head/><body><p>")
+ + failureReason.toHtmlEscaped()
+ + QLatin1String("</p></body></html>");
QTreeWidgetItem *pluginItem = setPluginItem(topLevelItem, plugin, boldFont);
- setItem(pluginItem, failureReason, failureReason, QString(), QIcon());
+ auto errorItem = setItem(pluginItem, failureReason,
+ htmlFailureReason, QString(), QIcon());
+ errorItem->setData(0, ErrorItemRole, QVariant(true));
}
}
@@ -157,14 +174,16 @@ QTreeWidgetItem* PluginDialog::setPluginItem(QTreeWidgetItem *topLevelItem,
return pluginItem;
}
-void PluginDialog::setItem(QTreeWidgetItem *pluginItem, const QString &name,
- const QString &toolTip, const QString &whatsThis, const QIcon &icon)
+QTreeWidgetItem *PluginDialog::setItem(QTreeWidgetItem *pluginItem, const QString &name,
+ const QString &toolTip, const QString &whatsThis,
+ const QIcon &icon)
{
QTreeWidgetItem *item = new QTreeWidgetItem(pluginItem);
item->setText(0, name);
item->setToolTip(0, toolTip);
item->setWhatsThis(0, whatsThis);
item->setIcon(0, icon.isNull() ? qtLogoIcon() : icon);
+ return item;
}
void PluginDialog::updateCustomWidgetPlugins()
@@ -181,8 +200,27 @@ void PluginDialog::updateCustomWidgetPlugins()
populateTreeWidget();
}
+void PluginDialog::treeWidgetContextMenu(const QPoint &pos)
+{
+#if QT_CONFIG(clipboard)
+ const QTreeWidgetItem *item = ui.treeWidget->itemAt(pos);
+ if (item == nullptr || !item->data(0, ErrorItemRole).toBool())
+ return;
+ QMenu menu;
+ //: Copy error text
+ auto copyAction = menu.addAction(tr("Copy"));
+ auto chosenAction = menu.exec(ui.treeWidget->mapToGlobal(pos));
+ if (chosenAction == nullptr)
+ return;
+ if (chosenAction == copyAction)
+ QGuiApplication::clipboard()->setText(item->text(0));
+#else
+ Q_UNUSED(pos);
+#endif
}
+} // namespace qdesigner_internal
+
QT_END_NAMESPACE
#include "moc_plugindialog_p.cpp"
diff --git a/src/designer/src/lib/shared/plugindialog_p.h b/src/designer/src/lib/shared/plugindialog_p.h
index f51d044f8..939ce68b1 100644
--- a/src/designer/src/lib/shared/plugindialog_p.h
+++ b/src/designer/src/lib/shared/plugindialog_p.h
@@ -56,14 +56,16 @@ public:
private slots:
void updateCustomWidgetPlugins();
+ void treeWidgetContextMenu(const QPoint &pos);
private:
void populateTreeWidget();
QTreeWidgetItem* setTopLevelItem(const QString &itemName);
QTreeWidgetItem* setPluginItem(QTreeWidgetItem *topLevelItem,
const QString &itemName, const QFont &font);
- void setItem(QTreeWidgetItem *pluginItem, const QString &name,
- const QString &toolTip, const QString &whatsThis, const QIcon &icon);
+ QTreeWidgetItem *setItem(QTreeWidgetItem *pluginItem, const QString &name,
+ const QString &toolTip, const QString &whatsThis,
+ const QIcon &icon);
QDesignerFormEditorInterface *m_core;
Ui::PluginDialog ui;