diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-01-06 10:36:18 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-01-08 09:05:40 +0000 |
commit | a6b7f22b4dcdc90c7d737ffb12937fd11078e585 (patch) | |
tree | d47f0cadc1623b38260bf08ae47c6aa4c2b9f496 | |
parent | d7bd54769f3bda0b1cb8ef3580d03b0386f7c9ff (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.cpp | 44 | ||||
-rw-r--r-- | src/designer/src/lib/shared/plugindialog_p.h | 6 |
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; |