玉兔远程控制 0.1.0-bate8
载入中...
搜索中...
未找到
FrmManagePlugins.cpp
1#include <QLoggingCategory>
2#include <QVBoxLayout>
3#include <QHBoxLayout>
4#include <QHeaderView>
5#include <QPluginLoader>
6#include <QPushButton>
7#include <QFileDialog>
8#include "Plugin.h"
9#include "RabbitCommonDir.h"
10#include "FrmManagePlugins.h"
11#include "CheckBoxHeader.h"
12#include "ui_FrmManagePlugins.h"
13
14static Q_LOGGING_CATEGORY(log, "Manage")
15CFrmManagePlugins::CFrmManagePlugins(QWidget *parent) : CParameterUI(parent)
16 , m_pPara(nullptr)
17 , ui(new Ui::CFrmManagePluginsUI)
18 , m_pModelFilter(nullptr)
19{
20 ui->setupUi(this);
21 setWindowTitle(tr("Load Plugins"));
22
23 bool check = connect(ui->lvPluginsPath, SIGNAL(customContextMenuRequested(QPoint)),
24 this, SLOT(slotCustomContextPluginsPath(QPoint)));
25 Q_ASSERT(check);
26 m_pModelPluginPath = new QStandardItemModel(ui->lvPluginsPath);
27 ui->lvPluginsPath->setModel(m_pModelPluginPath);
28
29 ui->tvFilter->setSelectionMode(QAbstractItemView::SingleSelection);
30 ui->tvFilter->setSelectionBehavior(QAbstractItemView::SelectRows);
31 ui->tvFilter->setEditTriggers(QAbstractItemView::NoEditTriggers);
32
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*)));
37 Q_ASSERT(check);
38 SetFilterHeader();
39
40 /*必须在 setModel 后,才能应用
41 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
42 QHeaderView::Fixed :2 用户不可更改列宽
43 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
44 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
45 */
46 /*
47 ui->tvFilter->horizontalHeader()->setSectionResizeMode(
48 QHeaderView::Interactive);//*/
49}
50
52{
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());
59 return 0;
60}
61
63{
64 QStringList lstPath;
65 m_pPara->SetEnableSetPluginsPath(ui->gbPluginsPath->isChecked());
66 for(int i = 0; i < m_pModelPluginPath->rowCount(); i++) {
67 lstPath << m_pModelPluginPath->item(i)->text();
68 }
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);
81 }
82 m_pPara->SetOnlyLoadInWhitelist(ui->cbOnlyLoadInWhitelist->isChecked());
83 return 0;
84}
85
86int CFrmManagePlugins::AddPath(const QString &szPath)
87{
88 auto pFind = m_pModelPluginPath->findItems(szPath);
89 if(!pFind.isEmpty()) return 0;
90
91 auto pPath = new QStandardItem(szPath);
92 m_pModelPluginPath->appendRow(pPath);
93
94 QStringList filters;
95 if(filters.isEmpty())
96 {
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";
101#else
102 filters << "*Plugin*.so";
103#endif
104 }
105 FindPlugins(szPath, filters);
106 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Whitelist));
107 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Blacklist));
108 return 0;
109}
110
111int CFrmManagePlugins::FindPlugins(QDir dir, QStringList filters, bool bAdd)
112{
113 QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
114
115 foreach (auto fileName, files) {
116 QString szPath = dir.absoluteFilePath(fileName);
117 if(!bAdd) {
118 RemoveItem(fileName);
119 continue;
120 }
121 auto pFind = m_pModelFilter->findItems(szPath, Qt::MatchExactly, ColumnNo::File);
122 if(!pFind.isEmpty()) continue;
123
124 QPluginLoader loader(szPath);
125 QObject *plugin = loader.instance();
126 if(plugin) {
127 CPlugin* p = qobject_cast<CPlugin*>(plugin);
128 if(p)
129 AddItem(p, fileName);
130 loader.unload();
131 }
132 }
133
134 foreach (auto d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
135 QDir pluginDir = dir;
136 if(pluginDir.cd(d))
137 FindPlugins(pluginDir, filters);
138 }
139
140 return 0;
141}
142
143int CFrmManagePlugins::AddItem(CPlugin* plugin, const QString& szPath)
144{
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);
150 //pWhitelist->setText(QString(tr("Whitelist").toStdString().size(), ' '));
151 }
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);
157 //pBlacklist->setText(QString(tr("Blacklist").toStdString().size(), ' '));
158 }
159 lstItems << pBlacklist;
160 auto pName = new QStandardItem(plugin->Icon(), plugin->DisplayName());
161 lstItems << pName;
162 auto pType = new QStandardItem(plugin->TypeName(plugin->Type()));
163 lstItems << pType;
164 auto pPath = new QStandardItem(szPath);
165 lstItems << pPath;
166 m_pModelFilter->appendRow(lstItems);
167
168 //以下设置列宽函数必须要数据加载完成后使用,才能应用
169 ui->tvFilter->resizeColumnsToContents(); //设置所有列宽度自适应内容
170 return 0;
171}
172
173int CFrmManagePlugins::RemoveItem(const QString &szPath)
174{
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());
179 }
180 return 0;
181}
182
183void CFrmManagePlugins::on_pbAdd_clicked()
184{
185 QString szPath = QFileDialog::getExistingDirectory(
186 this, tr("Plugin path"),
187 RabbitCommon::CDir::Instance()->GetDirPlugins());
188 if(szPath.isEmpty()) return;
189 AddPath(szPath);
190}
191
192void CFrmManagePlugins::on_pbRemove_clicked()
193{
194 QModelIndex index = ui->lvPluginsPath->currentIndex();
195 if(!index.isValid())
196 return;
197
198 auto item = m_pModelPluginPath->item(index.row());
199 if(item) {
200 QString szPath = item->text();
201 if(!szPath.isEmpty()) {
202 QStringList filters;
203 if(filters.isEmpty())
204 {
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";
209#else
210 filters << "*Plugin*.so";
211#endif
212 }
213 FindPlugins(szPath, filters, false);
214 }
215 }
216 m_pModelPluginPath->removeRow(index.row());
217 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Whitelist));
218 slotFilterItemChanged(m_pModelFilter->item(0, ColumnNo::Blacklist));
219}
220
221void CFrmManagePlugins::slotCustomContextPluginsPath(const QPoint &pos)
222{
223 QMenu m;
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));
227}
228
229void CFrmManagePlugins::on_gbPluginsPath_clicked(bool checked)
230{
231 m_pModelPluginPath->clear();
232 m_pModelFilter->clear();
233 SetFilterHeader();
234
235 QStringList lstPaths;
236 if(checked)
237 lstPaths = m_pPara->GetPluginsPath();
238 else
239 lstPaths << RabbitCommon::CDir::Instance()->GetDirPlugins();
240 foreach(auto szPath, lstPaths) {
241 AddPath(szPath);
242 }
243}
244
245int CFrmManagePlugins::SetFilterHeader()
246{
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")));
259
260 if(qobject_cast<CCheckBoxHeader*>(ui->tvFilter->horizontalHeader()))
261 return 0;
262
263 auto pHeader = new CCheckBoxHeader(Qt::Horizontal, ui->tvFilter);
264 if(pHeader) {
265 ui->tvFilter->setHorizontalHeader(pHeader);
266 bool check = false;
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);
272 switch(state)
273 {
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);
279 else
280 item->setCheckState(Qt::Unchecked);
281 }
282 if(ColumnNo::Blacklist == index) {
283 if(m_pPara->m_BlackList.contains(szPath))
284 item->setCheckState(Qt::Checked);
285 else
286 item->setCheckState(Qt::Unchecked);
287 }
288 break;
289 }
290 default:
291 item->setCheckState(state);
292 break;
293 }
294 }
295 });
296 Q_ASSERT(check);
297 }
298
299 return 0;
300}
301
302void CFrmManagePlugins::slotFilterItemChanged(QStandardItem *item)
303{
304 qDebug(log) << Q_FUNC_INFO;
305 if(!m_pModelFilter) return;
306 if(!item) 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);
313 return;
314 }
315 }
316 m_pModelFilter->horizontalHeaderItem(item->column())->setCheckState(item->checkState());
317}
包含复选框的表头
virtual int SetParameter(CParameter *pParameter) override
[override functions]
virtual int Accept() override
接受参数。如果需要,可先调用 CheckValidity
参数界面接口
Definition ParameterUI.h:15
参数接口
Definition Parameter.h:218
插件接口
Definition Plugin.h:15
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:76