10 #include <QSortFilterProxyModel>
11 #include <QStandardItemModel>
19 #include "ui_ecvPluginInfoDlg.h"
23 const QString linkFormat(
24 " <a href=\"%1\" style=\"text-decoration:none\">🔗</a>");
25 QString formattedText;
30 QStringLiteral(
"%1. ").arg(QString::number(referenceNum++));
32 formattedText += reference.article;
34 if (!reference.url.isEmpty()) {
35 formattedText += linkFormat.arg(reference.url);
38 formattedText += QStringLiteral(
"<br/>");
45 const QString &pluginName) {
46 const QString emailFormat(
47 "<<a href=\"mailto:%1?Subject=CLOUDVIEWER %2\">%1</a>>");
48 QString formattedText;
51 formattedText += contact.name;
53 if (!contact.email.isEmpty()) {
54 formattedText += emailFormat.arg(contact.email, pluginName);
57 formattedText += QStringLiteral(
"<br/>");
67 if (sIconMap.empty()) {
71 return sIconMap[inPluginType];
76 if (!sIconMap.empty()) {
81 QIcon(
":/CC/pluginManager/images/std_plugin.png");
83 QIcon(
":/CC/pluginManager/images/algorithm_plugin.png");
85 QIcon(
":/CC/pluginManager/images/io_plugin.png");
88 static QMap<CC_PLUGIN_TYPE, QIcon> sIconMap;
91 QMap<CC_PLUGIN_TYPE, QIcon> _Icons::sIconMap;
97 m_ProxyModel(new QSortFilterProxyModel(this)),
98 m_ItemModel(new QStandardItemModel(this)) {
101 setWindowTitle(tr(
"About Plugins"));
103 m_UI->mWarningLabel->setText(tr(
"Enabling/disabling plugins will take "
104 "effect next time you run %1")
105 .arg(QApplication::applicationName()));
106 m_UI->mWarningLabel->setStyleSheet(QStringLiteral(
107 "QLabel { background-color : #FFFF99; color : black; }"));
108 m_UI->mWarningLabel->hide();
110 m_UI->mSearchLineEdit->setStyleSheet(
111 "QLineEdit, QLineEdit:focus { border: none; }");
112 m_UI->mSearchLineEdit->setAttribute(Qt::WA_MacShowFocusRect,
false);
115 m_ProxyModel->setSourceModel(m_ItemModel);
117 m_UI->mPluginListView->setModel(m_ProxyModel);
118 m_UI->mPluginListView->setFocus();
120 connect(m_UI->mSearchLineEdit, &QLineEdit::textEdited, m_ProxyModel,
121 &QSortFilterProxyModel::setFilterFixedString);
122 connect(m_UI->mPluginListView->selectionModel(),
123 &QItemSelectionModel::currentChanged,
this,
124 &ccPluginInfoDlg::selectionChanged);
132 for (
const QString &
path : pluginPaths) {
133 paths += QDir::toNativeSeparators(
path);
134 paths += QStringLiteral(
"\n");
137 m_UI->mPluginPathTextEdit->setText(paths);
141 const QList<ccPluginInterface *> &pluginList) {
142 m_ItemModel->clear();
143 m_ItemModel->setRowCount(pluginList.count());
144 m_ItemModel->setColumnCount(1);
149 auto name = plugin->getName();
150 auto tooltip = tr(
"%1 Plugin").arg(plugin->getName());
152 if (plugin->isCore()) {
153 tooltip += tr(
" (core)");
156 tooltip += tr(
" (3rd Party)");
159 QStandardItem *item =
new QStandardItem(
name);
161 item->setCheckable(
true);
164 item->setCheckState(Qt::Checked);
167 item->setData(QVariant::fromValue(plugin), PLUGIN_PTR);
168 item->setIcon(_Icons::sGetIcon(plugin->getType()));
169 item->setToolTip(tooltip);
171 m_ItemModel->setItem(row, 0, item);
176 if (!pluginList.empty()) {
177 m_ItemModel->sort(0);
179 QModelIndex index = m_ItemModel->index(0, 0);
181 m_UI->mPluginListView->setCurrentIndex(index);
184 connect(m_ItemModel, &QStandardItemModel::itemChanged,
this,
185 &ccPluginInfoDlg::itemChanged);
189 const QStandardItem *item)
const {
194 void ccPluginInfoDlg::selectionChanged(
const QModelIndex ¤t,
195 const QModelIndex &previous) {
198 auto sourceItem = m_ProxyModel->mapToSource(current);
199 auto item = m_ItemModel->itemFromIndex(sourceItem);
201 if (item ==
nullptr) {
203 updatePluginInfo(
nullptr);
207 auto plugin = pluginFromItemData(item);
209 updatePluginInfo(plugin);
212 void ccPluginInfoDlg::itemChanged(QStandardItem *item) {
213 bool checked = item->checkState() == Qt::Checked;
214 auto plugin = pluginFromItemData(item);
216 if (plugin !=
nullptr) {
219 if (m_UI->mWarningLabel->isHidden()) {
222 m_UI->mWarningLabel->show();
228 if (plugin ==
nullptr) {
229 m_UI->mIcon->setPixmap(QPixmap());
230 m_UI->mNameLabel->setText(tr(
"(No plugin selected)"));
231 m_UI->mDescriptionTextEdit->clear();
232 m_UI->mReferencesTextBrowser->clear();
233 m_UI->mAuthorsTextBrowser->clear();
234 m_UI->mMaintainerTextBrowser->clear();
238 const QSize iconSize(64, 64);
242 if (!plugin->
getIcon().isNull()) {
243 iconPixmap = plugin->
getIcon().pixmap(iconSize);
248 if (iconPixmap.isNull()) {
249 iconPixmap = QPixmap(
":/CC/pluginManager/images/std_plugin.png")
253 m_UI->mPluginTypeLabel->clear();
258 if (iconPixmap.isNull()) {
259 iconPixmap = QPixmap(
":/CC/pluginManager/images/"
260 "algorithm_plugin.png")
264 m_UI->mPluginTypeLabel->setText(tr(
"PCL Algorithm"));
269 if (iconPixmap.isNull()) {
270 iconPixmap = QPixmap(
":/CC/pluginManager/images/io_plugin.png")
274 m_UI->mPluginTypeLabel->setText(tr(
"I/O"));
279 m_UI->mIcon->setPixmap(iconPixmap);
281 m_UI->mNameLabel->setText(plugin->
getName());
286 if (!referenceText.isEmpty()) {
287 m_UI->mReferencesTextBrowser->setHtml(referenceText);
288 m_UI->mReferencesLabel->show();
289 m_UI->mReferencesTextBrowser->show();
291 m_UI->mReferencesLabel->hide();
292 m_UI->mReferencesTextBrowser->hide();
293 m_UI->mReferencesTextBrowser->clear();
296 const QString authorsText =
299 if (!authorsText.isEmpty()) {
300 m_UI->mAuthorsTextBrowser->setHtml(authorsText);
302 m_UI->mAuthorsTextBrowser->clear();
305 const QString maintainersText =
308 if (!maintainersText.isEmpty()) {
309 m_UI->mMaintainerTextBrowser->setHtml(maintainersText);
311 m_UI->mMaintainerTextBrowser->clear();
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
ccPluginInfoDlg(QWidget *parent=nullptr)
void setPluginPaths(const QStringList &pluginPaths)
void setPluginList(const QList< ccPluginInterface * > &pluginList)
Standard ECV plugin interface.
virtual QString getDescription() const =0
Returns long name/description (for tooltip, etc.)
QList< Reference > ReferenceList
virtual CC_PLUGIN_TYPE getType() const =0
Returns plugin type (standard or OpenGL filter)
virtual ContactList getAuthors() const
virtual ContactList getMaintainers() const
virtual ReferenceList getReferences() const
virtual QIcon getIcon() const
Returns icon.
virtual QString getName() const =0
Returns (short) name (for menu entry, etc.)
QList< Contact > ContactList
void setPluginEnabled(const ccPluginInterface *plugin, bool enabled)
static ccPluginManager & get()
static QString sFormatReferenceList(const ccPluginInterface::ReferenceList &list)
static QString sFormatContactList(const ccPluginInterface::ContactList &list, const QString &pluginName)
CC_PLUGIN_TYPE
Plugin type.
@ ECV_PCL_ALGORITHM_PLUGIN
constexpr QRegularExpression::PatternOption CaseInsensitive
static const std::string path