1#include <QLoggingCategory>
5#include <QPluginLoader>
9#include "RabbitCommonDir.h"
10#include "FrmManagePlugins.h"
11#include "CheckBoxHeader.h"
12#include "ui_FrmManagePlugins.h"
14static Q_LOGGING_CATEGORY(log,
"Manage")
17 , ui(new
Ui::CFrmManagePluginsUI)
18 , m_pModelFilter(
nullptr)
21 setWindowTitle(tr(
"Load Plugins"));
23 bool check = connect(ui->lvPluginsPath, SIGNAL(customContextMenuRequested(QPoint)),
24 this, SLOT(slotCustomContextPluginsPath(QPoint)));
26 m_pModelPluginPath =
new QStandardItemModel(ui->lvPluginsPath);
27 ui->lvPluginsPath->setModel(m_pModelPluginPath);
29 ui->tvFilter->setSelectionMode(QAbstractItemView::SingleSelection);
30 ui->tvFilter->setSelectionBehavior(QAbstractItemView::SelectRows);
31 ui->tvFilter->setEditTriggers(QAbstractItemView::NoEditTriggers);
33 m_pModelFilter =
new QStandardItemModel(ui->tvFilter);
34 ui->tvFilter->setModel(m_pModelFilter);
35 check = connect(m_pModelFilter, SIGNAL(itemChanged(QStandardItem*)),
36 this, SLOT(slotFilterItemChanged(QStandardItem*)));
53 m_pPara = qobject_cast<CParameterPlugin*>(pParameter);
54 if(!m_pPara)
return -1;
55 bool checked = m_pPara->GetEnableSetPluginsPath();
56 ui->gbPluginsPath->setChecked(checked);
57 on_gbPluginsPath_clicked(checked);
58 ui->cbOnlyLoadInWhitelist->setChecked(m_pPara->GetOnlyLoadInWhitelist());
65 m_pPara->SetEnableSetPluginsPath(ui->gbPluginsPath->isChecked());
66 for(
int i = 0; i < m_pModelPluginPath->rowCount(); i++) {
67 lstPath << m_pModelPluginPath->item(i)->text();
69 m_pPara->SetPluginsPath(lstPath);
70 m_pPara->m_WhiteList.Clear();
71 m_pPara->m_BlackList.Clear();
72 for(
int i = 0; i < m_pModelFilter->rowCount(); i++) {
73 QString szPath = m_pModelFilter->item(i, ColumnNo::File)->text();
74 if(szPath.isEmpty())
continue;
75 auto pWhitelist = m_pModelFilter->item(i, ColumnNo::Whitelist);
76 if(pWhitelist->checkState() == Qt::Checked)
77 m_pPara->m_WhiteList.AddKey(szPath);
78 auto pBlacklist = m_pModelFilter->item(i, ColumnNo::Blacklist);
79 if(pBlacklist->checkState() == Qt::Checked)
80 m_pPara->m_BlackList.AddKey(szPath);
82 m_pPara->SetOnlyLoadInWhitelist(ui->cbOnlyLoadInWhitelist->isChecked());
86int CFrmManagePlugins::AddPath(
const QString &szPath)
88 auto pFind = m_pModelPluginPath->findItems(szPath);
89 if(!pFind.isEmpty())
return 0;
91 auto pPath =
new QStandardItem(szPath);
92 m_pModelPluginPath->appendRow(pPath);
97#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
98 filters <<
"*Plugin*.dll";
99#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
100 filters <<
"*Plugin*.dylib";
102 filters <<
"*Plugin*.so";
105 FindPlugins(szPath, filters);
106 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Whitelist));
107 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Blacklist));
111int CFrmManagePlugins::FindPlugins(QDir dir, QStringList filters,
bool bAdd)
113 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
115 foreach (
auto fileName, files) {
116 QString szPath = dir.absoluteFilePath(fileName);
118 RemoveItem(fileName);
121 auto pFind = m_pModelFilter->findItems(szPath, Qt::MatchExactly, ColumnNo::File);
122 if(!pFind.isEmpty())
continue;
124 QPluginLoader loader(szPath);
125 QObject *plugin = loader.instance();
127 CPlugin* p = qobject_cast<CPlugin*>(plugin);
129 AddItem(p, fileName);
134 foreach (
auto d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
135 QDir pluginDir = dir;
137 FindPlugins(pluginDir, filters);
143int CFrmManagePlugins::AddItem(
CPlugin* plugin,
const QString& szPath)
145 QList<QStandardItem*> lstItems;
146 auto pWhitelist =
new QStandardItem(QString(tr(
"Whitelist").toStdString().size(),
' '));
147 pWhitelist->setCheckable(
true);
148 if(m_pPara->m_WhiteList.contains(szPath)) {
149 pWhitelist->setCheckState(Qt::Checked);
152 lstItems << pWhitelist;
153 auto pBlacklist =
new QStandardItem(QString(tr(
"Blacklist").toStdString().size(),
' '));
154 pBlacklist->setCheckable(
true);
155 if(m_pPara->m_BlackList.contains(szPath)) {
156 pBlacklist->setCheckState(Qt::Checked);
159 lstItems << pBlacklist;
160 auto pName =
new QStandardItem(plugin->Icon(), plugin->
DisplayName());
162 auto pType =
new QStandardItem(plugin->TypeName(plugin->Type()));
164 auto pPath =
new QStandardItem(szPath);
166 m_pModelFilter->appendRow(lstItems);
169 ui->tvFilter->resizeColumnsToContents();
173int CFrmManagePlugins::RemoveItem(
const QString &szPath)
175 auto pFind = m_pModelFilter->findItems(szPath, Qt::MatchExactly, ColumnNo::File);
176 if(pFind.isEmpty())
return 0;
177 foreach(
auto item, pFind) {
178 m_pModelFilter->removeRow(item->index().row());
183void CFrmManagePlugins::on_pbAdd_clicked()
185 QString szPath = QFileDialog::getExistingDirectory(
186 this, tr(
"Plugin path"),
187 RabbitCommon::CDir::Instance()->GetDirPlugins());
188 if(szPath.isEmpty())
return;
192void CFrmManagePlugins::on_pbRemove_clicked()
194 QModelIndex index = ui->lvPluginsPath->currentIndex();
198 auto item = m_pModelPluginPath->item(index.row());
200 QString szPath = item->text();
201 if(!szPath.isEmpty()) {
203 if(filters.isEmpty())
205#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
206 filters <<
"*Plugin*.dll";
207#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
208 filters <<
"*Plugin*.dylib";
210 filters <<
"*Plugin*.so";
213 FindPlugins(szPath, filters,
false);
216 m_pModelPluginPath->removeRow(index.row());
217 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Whitelist));
218 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Blacklist));
221void CFrmManagePlugins::slotCustomContextPluginsPath(
const QPoint &pos)
224 m.addAction(tr(
"Add"),
this, SLOT(on_pbAdd_clicked()));
225 m.addAction(tr(
"Remove"),
this, SLOT(on_pbRemove_clicked()));
226 m.exec(this->mapToGlobal(pos));
229void CFrmManagePlugins::on_gbPluginsPath_clicked(
bool checked)
231 m_pModelPluginPath->clear();
232 m_pModelFilter->clear();
235 QStringList lstPaths;
237 lstPaths = m_pPara->GetPluginsPath();
239 lstPaths << RabbitCommon::CDir::Instance()->GetDirPlugins();
240 foreach(
auto szPath, lstPaths) {
245int CFrmManagePlugins::SetFilterHeader()
247 if(!m_pModelFilter)
return -1;
248 auto pWhitelist =
new QStandardItem(tr(
"Whitelist"));
249 pWhitelist->setToolTip(pWhitelist->text());
250 pWhitelist->setCheckable(
true);
251 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Whitelist, pWhitelist);
252 auto pBlacklist =
new QStandardItem(tr(
"Blacklist"));
253 pBlacklist->setToolTip(pBlacklist->text());
254 pBlacklist->setCheckable(
true);
255 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Blacklist, pBlacklist);
256 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Name,
new QStandardItem(tr(
"Name")));
257 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Type,
new QStandardItem(tr(
"Type")));
258 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::File,
new QStandardItem(tr(
"File")));
260 if(qobject_cast<CCheckBoxHeader*>(ui->tvFilter->horizontalHeader()))
265 ui->tvFilter->setHorizontalHeader(pHeader);
267 check = connect(pHeader, &CCheckBoxHeader::sigCheckStateChanged,
268 this, [
this](
int index, Qt::CheckState state) {
269 qDebug(log) <<
"CCheckBoxHeader::sigCheckStateChanged";
270 for(
int row = 0; row < m_pModelFilter->rowCount(); row++) {
271 auto item = m_pModelFilter->item(row, index);
274 case Qt::PartiallyChecked: {
275 QString szPath = m_pModelFilter->item(row, ColumnNo::File)->text();
276 if(ColumnNo::Whitelist == index) {
277 if(m_pPara->m_WhiteList.contains(szPath))
278 item->setCheckState(Qt::Checked);
280 item->setCheckState(Qt::Unchecked);
282 if(ColumnNo::Blacklist == index) {
283 if(m_pPara->m_BlackList.contains(szPath))
284 item->setCheckState(Qt::Checked);
286 item->setCheckState(Qt::Unchecked);
291 item->setCheckState(state);
302void CFrmManagePlugins::slotFilterItemChanged(QStandardItem *item)
304 qDebug(log) << Q_FUNC_INFO;
305 if(!m_pModelFilter)
return;
307 if(!item->isCheckable())
return;
308 for(
int i = 0; i < m_pModelFilter->rowCount(); i++) {
309 if(i == item->row())
continue;
310 auto state = m_pModelFilter->item(i, item->column())->checkState();
311 if(state != item->checkState()) {
312 m_pModelFilter->horizontalHeaderItem(item->column())->setCheckState(Qt::PartiallyChecked);
316 m_pModelFilter->horizontalHeaderItem(item->column())->setCheckState(item->checkState());
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual int Accept() override
接受参数。如果需要,可先调用 CheckValidity
virtual const QString DisplayName() const
在界面上显示的名称