/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Designer of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "plugindialog_p.h" #include "pluginmanager_p.h" #include "iconloader_p.h" #include #include #include #include #include #include #include #include #include #if QT_CONFIG(clipboard) # include #endif #include #include QT_BEGIN_NAMESPACE enum { ErrorItemRole = Qt::UserRole + 1 }; namespace qdesigner_internal { PluginDialog::PluginDialog(QDesignerFormEditorInterface *core, QWidget *parent) : QDialog(parent #ifdef Q_OS_MACOS , Qt::Tool #endif ), m_core(core) { ui.setupUi(this); ui.message->hide(); const QStringList headerLabels(tr("Components")); ui.treeWidget->setAlternatingRowColors(false); 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); interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off); featureIcon.addPixmap(style()->standardPixmap(QStyle::SP_FileIcon)); setWindowTitle(tr("Plugin Information")); populateTreeWidget(); QPushButton *updateButton = new QPushButton(tr("Refresh")); const QString tooltip = tr("Scan for newly installed custom widget plugins."); updateButton->setToolTip(tooltip); updateButton->setWhatsThis(tooltip); connect(updateButton, &QAbstractButton::clicked, this, &PluginDialog::updateCustomWidgetPlugins); ui.buttonBox->addButton(updateButton, QDialogButtonBox::ActionRole); } void PluginDialog::populateTreeWidget() { ui.treeWidget->clear(); QDesignerPluginManager *pluginManager = m_core->pluginManager(); const QStringList fileNames = pluginManager->registeredPlugins(); if (!fileNames.isEmpty()) { QTreeWidgetItem *topLevelItem = setTopLevelItem(tr("Loaded Plugins")); QFont boldFont = topLevelItem->font(0); for (const QString &fileName : fileNames) { QPluginLoader loader(fileName); const QFileInfo fileInfo(fileName); QTreeWidgetItem *pluginItem = setPluginItem(topLevelItem, fileInfo.fileName(), boldFont); if (QObject *plugin = loader.instance()) { if (const QDesignerCustomWidgetCollectionInterface *c = qobject_cast(plugin)) { const auto &collCustomWidgets = c->customWidgets(); for (const QDesignerCustomWidgetInterface *p : collCustomWidgets) setItem(pluginItem, p->name(), p->toolTip(), p->whatsThis(), p->icon()); } else { if (const QDesignerCustomWidgetInterface *p = qobject_cast(plugin)) setItem(pluginItem, p->name(), p->toolTip(), p->whatsThis(), p->icon()); } } } } const QStringList notLoadedPlugins = pluginManager->failedPlugins(); if (!notLoadedPlugins.isEmpty()) { QTreeWidgetItem *topLevelItem = setTopLevelItem(tr("Failed Plugins")); const QFont boldFont = topLevelItem->font(0); for (const QString &plugin : notLoadedPlugins) { const QString failureReason = pluginManager->failureReason(plugin); const QString htmlFailureReason = QLatin1String("

") + failureReason.toHtmlEscaped() + QLatin1String("

"); QTreeWidgetItem *pluginItem = setPluginItem(topLevelItem, plugin, boldFont); auto errorItem = setItem(pluginItem, failureReason, htmlFailureReason, QString(), QIcon()); errorItem->setData(0, ErrorItemRole, QVariant(true)); } } if (ui.treeWidget->topLevelItemCount() == 0) { ui.label->setText(tr("Qt Designer couldn't find any plugins")); ui.treeWidget->hide(); } else { ui.label->setText(tr("Qt Designer found the following plugins")); } } QTreeWidgetItem* PluginDialog::setTopLevelItem(const QString &itemName) { QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(ui.treeWidget); topLevelItem->setText(0, itemName); topLevelItem->setExpanded(true); topLevelItem->setIcon(0, style()->standardPixmap(QStyle::SP_DirOpenIcon)); QFont boldFont = topLevelItem->font(0); boldFont.setBold(true); topLevelItem->setFont(0, boldFont); return topLevelItem; } QTreeWidgetItem* PluginDialog::setPluginItem(QTreeWidgetItem *topLevelItem, const QString &itemName, const QFont &font) { QTreeWidgetItem *pluginItem = new QTreeWidgetItem(topLevelItem); pluginItem->setFont(0, font); pluginItem->setText(0, itemName); pluginItem->setExpanded(true); pluginItem->setIcon(0, style()->standardPixmap(QStyle::SP_DirOpenIcon)); return pluginItem; } 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() { const int before = m_core->widgetDataBase()->count(); m_core->integration()->updateCustomWidgetPlugins(); const int after = m_core->widgetDataBase()->count(); if (after > before) { ui.message->setText(tr("New custom widget plugins have been found.")); ui.message->show(); } else { ui.message->setText(QString()); } 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"