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 bool checked = m_pPara->GetEnableSetPluginsPath();
55 ui->gbPluginsPath->setChecked(checked);
56 on_gbPluginsPath_clicked(checked);
57 ui->cbOnlyLoadInWhitelist->setChecked(m_pPara->GetOnlyLoadInWhitelist());
64 m_pPara->SetEnableSetPluginsPath(ui->gbPluginsPath->isChecked());
65 for(
int i = 0; i < m_pModelPluginPath->rowCount(); i++) {
66 lstPath << m_pModelPluginPath->item(i)->text();
68 m_pPara->SetPluginsPath(lstPath);
69 m_pPara->m_WhiteList.Clear();
70 m_pPara->m_BlackList.Clear();
71 for(
int i = 0; i < m_pModelFilter->rowCount(); i++) {
72 QString szPath = m_pModelFilter->item(i, ColumnNo::File)->text();
73 if(szPath.isEmpty())
continue;
74 auto pWhitelist = m_pModelFilter->item(i, ColumnNo::Whitelist);
75 if(pWhitelist->checkState() == Qt::Checked)
76 m_pPara->m_WhiteList.AddKey(szPath);
77 auto pBlacklist = m_pModelFilter->item(i, ColumnNo::Blacklist);
78 if(pBlacklist->checkState() == Qt::Checked)
79 m_pPara->m_BlackList.AddKey(szPath);
81 m_pPara->SetOnlyLoadInWhitelist(ui->cbOnlyLoadInWhitelist->isChecked());
85int CFrmManagePlugins::AddPath(
const QString &szPath)
87 auto pFind = m_pModelPluginPath->findItems(szPath);
88 if(!pFind.isEmpty())
return 0;
90 auto pPath =
new QStandardItem(szPath);
91 m_pModelPluginPath->appendRow(pPath);
96#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
97 filters <<
"*Plugin*.dll";
98#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
99 filters <<
"*Plugin*.dylib";
101 filters <<
"*Plugin*.so";
104 FindPlugins(szPath, filters);
105 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Whitelist));
106 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Blacklist));
110int CFrmManagePlugins::FindPlugins(QDir dir, QStringList filters,
bool bAdd)
112 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
114 foreach (
auto fileName, files) {
115 QString szPath = dir.absoluteFilePath(fileName);
117 RemoveItem(fileName);
120 auto pFind = m_pModelFilter->findItems(szPath, Qt::MatchExactly, ColumnNo::File);
121 if(!pFind.isEmpty())
continue;
123 QPluginLoader loader(szPath);
124 QObject *plugin = loader.instance();
126 CPlugin* p = qobject_cast<CPlugin*>(plugin);
128 AddItem(p, fileName);
133 foreach (
auto d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
134 QDir pluginDir = dir;
136 FindPlugins(pluginDir, filters);
142int CFrmManagePlugins::AddItem(
CPlugin* plugin,
const QString& szPath)
144 QList<QStandardItem*> lstItems;
145 auto pWhitelist =
new QStandardItem();
146 pWhitelist->setCheckable(
true);
147 if(m_pPara->m_WhiteList.contains(szPath))
148 pWhitelist->setCheckState(Qt::Checked);
149 lstItems << pWhitelist;
150 auto pBlacklist =
new QStandardItem();
151 pBlacklist->setCheckable(
true);
152 if(m_pPara->m_BlackList.contains(szPath))
153 pBlacklist->setCheckState(Qt::Checked);
154 lstItems << pBlacklist;
155 auto pName =
new QStandardItem(plugin->Icon(), plugin->
DisplayName());
157 auto pType =
new QStandardItem(plugin->TypeName(plugin->Type()));
159 auto pPath =
new QStandardItem(szPath);
161 m_pModelFilter->appendRow(lstItems);
164 ui->tvFilter->resizeColumnsToContents();
168int CFrmManagePlugins::RemoveItem(
const QString &szPath)
170 auto pFind = m_pModelFilter->findItems(szPath, Qt::MatchExactly, ColumnNo::File);
171 if(pFind.isEmpty())
return 0;
172 foreach(
auto item, pFind) {
173 m_pModelFilter->removeRow(item->index().row());
178void CFrmManagePlugins::on_pbAdd_clicked()
180 QString szPath = QFileDialog::getExistingDirectory(
181 this, tr(
"Plugin path"),
182 RabbitCommon::CDir::Instance()->GetDirPlugins());
183 if(szPath.isEmpty())
return;
187void CFrmManagePlugins::on_pbRemove_clicked()
189 QModelIndex index = ui->lvPluginsPath->currentIndex();
193 auto item = m_pModelPluginPath->item(index.row());
195 QString szPath = item->text();
196 if(!szPath.isEmpty()) {
198 if(filters.isEmpty())
200#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
201 filters <<
"*Plugin*.dll";
202#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
203 filters <<
"*Plugin*.dylib";
205 filters <<
"*Plugin*.so";
208 FindPlugins(szPath, filters,
false);
211 m_pModelPluginPath->removeRow(index.row());
212 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Whitelist));
213 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Blacklist));
216void CFrmManagePlugins::slotCustomContextPluginsPath(
const QPoint &pos)
219 m.addAction(tr(
"Add"),
this, SLOT(on_pbAdd_clicked()));
220 m.addAction(tr(
"Remove"),
this, SLOT(on_pbRemove_clicked()));
221 m.exec(this->mapToGlobal(pos));
224void CFrmManagePlugins::on_gbPluginsPath_clicked(
bool checked)
226 m_pModelPluginPath->clear();
227 m_pModelFilter->clear();
230 QStringList lstPaths;
232 lstPaths = m_pPara->GetPluginsPath();
234 lstPaths << RabbitCommon::CDir::Instance()->GetDirPlugins();
235 foreach(
auto szPath, lstPaths) {
240int CFrmManagePlugins::SetFilterHeader()
242 if(!m_pModelFilter)
return -1;
243 auto pWhitelist =
new QStandardItem(tr(
"Whitelist"));
244 pWhitelist->setToolTip(pWhitelist->text());
245 pWhitelist->setCheckable(
true);
246 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Whitelist, pWhitelist);
247 auto pBlacklist =
new QStandardItem(tr(
"Blacklist"));
248 pBlacklist->setToolTip(pBlacklist->text());
249 pBlacklist->setCheckable(
true);
250 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Blacklist, pBlacklist);
251 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Name,
new QStandardItem(tr(
"Name")));
252 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Type,
new QStandardItem(tr(
"Type")));
253 m_pModelFilter->setHorizontalHeaderItem(ColumnNo::File,
new QStandardItem(tr(
"File")));
255 if(qobject_cast<CCheckBoxHeader*>(ui->tvFilter->horizontalHeader()))
260 ui->tvFilter->setHorizontalHeader(pHeader);
262 check = connect(pHeader, &CCheckBoxHeader::sigCheckStateChanged,
263 this, [
this](
int index, Qt::CheckState state) {
264 qDebug(log) <<
"CCheckBoxHeader::sigCheckStateChanged";
265 for(
int row = 0; row < m_pModelFilter->rowCount(); row++) {
266 auto item = m_pModelFilter->item(row, index);
269 case Qt::PartiallyChecked: {
270 QString szPath = m_pModelFilter->item(row, ColumnNo::File)->text();
271 if(ColumnNo::Whitelist == index) {
272 if(m_pPara->m_WhiteList.contains(szPath))
273 item->setCheckState(Qt::Checked);
275 item->setCheckState(Qt::Unchecked);
277 if(ColumnNo::Blacklist == index) {
278 if(m_pPara->m_BlackList.contains(szPath))
279 item->setCheckState(Qt::Checked);
281 item->setCheckState(Qt::Unchecked);
286 item->setCheckState(state);
297void CFrmManagePlugins::slotFilterItemChanged(QStandardItem *item)
299 qDebug(log) << Q_FUNC_INFO;
300 if(!m_pModelFilter)
return;
302 if(!item->isCheckable())
return;
303 for(
int i = 0; i < m_pModelFilter->rowCount(); i++) {
304 if(i == item->row())
continue;
305 auto state = m_pModelFilter->item(i, item->column())->checkState();
306 if(state != item->checkState()) {
307 m_pModelFilter->horizontalHeaderItem(item->column())->setCheckState(Qt::PartiallyChecked);
311 m_pModelFilter->horizontalHeaderItem(item->column())->setCheckState(item->checkState());
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual int Accept() override
接受参数
virtual const QString DisplayName() const
在界面上显示的名称