Skip to content

Commit 30cbdfa

Browse files
committed
Plugin: add load plugins parameters
1 parent 8477425 commit 30cbdfa

File tree

16 files changed

+625
-56
lines changed

16 files changed

+625
-56
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ jobs:
212212
fi
213213
echo "## Download:" >> ${{github.workspace}}/Release.md
214214
echo "" >> ${{github.workspace}}/Release.md
215-
echo "| | x86-64 (64-bit) | x86-32 (32-bit) | AArch64 (ARM64) | ARMv7 (32-bit) |Remark|" >> ${{github.workspace}}/Release.md
215+
echo "| | x86-64 (64-bit) | x86-32 (32-bit) | AArch64 (ARM64) | ARMv7 (32-bit) |Comment|" >> ${{github.workspace}}/Release.md
216216
echo "|:- | :-------------- | :-------------- | :-------------- | :------------- |:-----|" >> ${{github.workspace}}/Release.md
217217
#echo "|Windows|[EXE](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win64_msvc2022_64_qt6.9.3_Setup.exe) [Portable](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win64_msvc2022_64_qt6.9.3_Portable.zip)|[EXE](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win32_msvc2019_qt5.15.2_Setup.exe) [Portable](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win32_msvc2019_qt5.15.2_Portable.zip)|[EXE](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win64_msvc2022_arm64_qt6.9.3_Setup.exe) [Portable](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win64_msvc2022_arm64_qt6.9.3_Portable.zip) | |Unzip the portable zip file and execute \`bin/RabbitRemoteControl.exe\` to run the program. If this is the first run, execute \`npcap-1.80.exe\` to install npcap driver. the wake on lan depends on it.|" >> ${{github.workspace}}/Release.md
218218
echo "|Windows|[EXE](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win64_msvc2022_64_qt6.9.3_Setup.exe)|[EXE](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win32_msvc2019_qt5.15.2_Setup.exe)|[EXE](https://github.com/KangLin/RabbitRemoteControl/releases/download/${BRANCH_NAME}/RabbitRemoteControl_v${{env.RabbitRemoteControl_VERSION}}_win64_msvc2022_arm64_qt6.9.3_Setup.exe)| |Supported platforms: [x86-32(Qt5)](https://doc.qt.io/qt-5/supported-platforms.html) [x86-64(Qt6)](https://doc.qt.io/qt-6/supported-platforms.html)|" >> ${{github.workspace}}/Release.md

App/Client/ParameterDlgSettings.ui

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>500</width>
10-
<height>473</height>
9+
<width>600</width>
10+
<height>450</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">

Src/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ list(APPEND PLUGIN_INSTALL_HEADER_FILES
4040
ParameterUI.h
4141
ParameterOperate.h
4242
ParameterCompone/ParameterPlugin.h
43+
ParameterCompone/ParameterFilter.h
4344
ParameterCompone/ParameterBase.h
4445
ParameterCompone/ParameterNet.h
4546
ParameterCompone/ParameterNetUI.h
@@ -57,6 +58,7 @@ list(APPEND PLUGIN_INSTALL_HEADER_FILES
5758

5859
list(APPEND PLUGIN_HEADER_FILES
5960
${PLUGIN_INSTALL_HEADER_FILES}
61+
FrmManagePlugins.h
6062
FrmViewer.h
6163
FrmScroll.h
6264
DlgInputPassword.h
@@ -68,6 +70,7 @@ list(APPEND PLUGIN_HEADER_FILES
6870

6971
list(APPEND PLUGIN_SOURCE_FILES
7072
Manager.cpp
73+
FrmManagePlugins.cpp
7174
Plugin.cpp
7275
Operate.cpp
7376
OperateDesktop.cpp
@@ -82,6 +85,7 @@ list(APPEND PLUGIN_SOURCE_FILES
8285
ParameterOperate.cpp
8386
ParameterCompone/ParameterPlugin.cpp
8487
ParameterCompone/ParameterPluginUI.cpp
88+
ParameterCompone/ParameterFilter.cpp
8589
ParameterCompone/ParameterBase.cpp
8690
ParameterCompone/ParameterNet.cpp
8791
ParameterCompone/ParameterNetUI.cpp
@@ -103,6 +107,7 @@ list(APPEND PLUGIN_SOURCE_FILES
103107
)
104108

105109
set(PLUGIN_UI_FILES
110+
FrmManagePlugins.ui
106111
DlgInputPassword.ui
107112
DlgUserPassword.ui
108113
ParameterCompone/ParameterPluginUI.ui

Src/FrmManagePlugins.cpp

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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 "ui_FrmManagePlugins.h"
12+
13+
static Q_LOGGING_CATEGORY(log, "Manage")
14+
CFrmManagePlugins::CFrmManagePlugins(QWidget *parent) : CParameterUI(parent)
15+
, m_pPara(nullptr)
16+
, ui(new Ui::CFrmManagePluginsUI)
17+
, m_pModelFilter(nullptr)
18+
{
19+
ui->setupUi(this);
20+
setWindowTitle(tr("Load Plugins"));
21+
22+
bool check = connect(ui->lvPluginsPath, SIGNAL(customContextMenuRequested(QPoint)),
23+
this, SLOT(slotCustomContextPluginsPath(QPoint)));
24+
Q_ASSERT(check);
25+
m_pModelPluginPath = new QStandardItemModel(ui->lvPluginsPath);
26+
ui->lvPluginsPath->setModel(m_pModelPluginPath);
27+
28+
ui->tvFilter->setSelectionMode(QAbstractItemView::SingleSelection);
29+
ui->tvFilter->setSelectionBehavior(QAbstractItemView::SelectRows);
30+
ui->tvFilter->setEditTriggers(QAbstractItemView::NoEditTriggers);
31+
32+
m_pModelFilter = new QStandardItemModel(ui->tvFilter);
33+
ui->tvFilter->setModel(m_pModelFilter);
34+
m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Whitelist, new QStandardItem(tr("Whitelist")));
35+
m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Blacklist, new QStandardItem(tr("Blacklist")));
36+
m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Name, new QStandardItem(tr("Name")));
37+
m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Type, new QStandardItem(tr("Type")));
38+
m_pModelFilter->setHorizontalHeaderItem(ColumnNo::Path, new QStandardItem(tr("Path")));
39+
40+
//必须在 setModel 后,才能应用
41+
/*第二个参数可以为:
42+
QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
43+
QHeaderView::Fixed :2 用户不可更改列宽
44+
QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
45+
QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
46+
*/
47+
ui->tvFilter->horizontalHeader()->setSectionResizeMode(
48+
#if defined(DEBUG) && !defined(Q_OS_ANDROID)
49+
0,
50+
#endif
51+
QHeaderView::Interactive);
52+
}
53+
54+
int CFrmManagePlugins::SetParameter(CParameter *pParameter)
55+
{
56+
m_pPara = qobject_cast<CParameterPlugin*>(pParameter);
57+
foreach(auto szPath, m_pPara->GetPluginsPath()) {
58+
auto pPath = new QStandardItem(szPath);
59+
m_pModelPluginPath->appendRow(pPath);
60+
61+
QStringList filters;
62+
if(filters.isEmpty())
63+
{
64+
#if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN)
65+
filters << "*Plugin*.dll";
66+
#elif defined(Q_OS_MACOS) || defined(Q_OS_MAC)
67+
filters << "*Plugin*.dylib";
68+
#else
69+
filters << "*Plugin*.so";
70+
#endif
71+
}
72+
FindPlugins(szPath, filters);
73+
}
74+
return 0;
75+
}
76+
77+
int CFrmManagePlugins::Accept()
78+
{
79+
QStringList lstPath;
80+
for(int i = 0; i < m_pModelPluginPath->rowCount(); i++) {
81+
lstPath << m_pModelPluginPath->item(i)->text();
82+
}
83+
m_pPara->SetPluginsPath(lstPath);
84+
m_pPara->m_WhiteList.Clear();
85+
m_pPara->m_BlackList.Clear();
86+
for(int i = 0; i < m_pModelFilter->rowCount(); i++) {
87+
QString szPath = m_pModelFilter->item(i, ColumnNo::Path)->text();
88+
if(szPath.isEmpty()) continue;
89+
auto pWhitelist = m_pModelFilter->item(i, ColumnNo::Whitelist);
90+
if(pWhitelist->checkState() == Qt::Checked)
91+
m_pPara->m_WhiteList.AddKey(szPath);
92+
auto pBlacklist = m_pModelFilter->item(i, ColumnNo::Blacklist);
93+
if(pBlacklist->checkState() == Qt::Checked)
94+
m_pPara->m_BlackList.AddKey(szPath);
95+
}
96+
return 0;
97+
}
98+
99+
int CFrmManagePlugins::FindPlugins(QDir dir, QStringList filters)
100+
{
101+
QStringList files = dir.entryList(filters, QDir::Files | QDir::NoDotAndDotDot);
102+
103+
foreach (auto fileName, files) {
104+
QString szPlugins = dir.absoluteFilePath(fileName);
105+
QPluginLoader loader(szPlugins);
106+
QObject *plugin = loader.instance();
107+
if(plugin) {
108+
CPlugin* p = qobject_cast<CPlugin*>(plugin);
109+
if(p)
110+
AddItem(p, szPlugins);
111+
loader.unload();
112+
}
113+
}
114+
115+
foreach (auto d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
116+
QDir pluginDir = dir;
117+
if(pluginDir.cd(d))
118+
FindPlugins(pluginDir, filters);
119+
}
120+
121+
return 0;
122+
}
123+
124+
int CFrmManagePlugins::AddItem(CPlugin* plugin, const QString& szPath)
125+
{
126+
QList<QStandardItem*> lstItems;
127+
auto pWhitelist = new QStandardItem();
128+
pWhitelist->setCheckable(true);
129+
if(m_pPara->m_WhiteList.contains(szPath))
130+
pWhitelist->setCheckState(Qt::Checked);
131+
lstItems << pWhitelist;
132+
auto pBlacklist = new QStandardItem();
133+
pBlacklist->setCheckable(true);
134+
if(m_pPara->m_BlackList.contains(szPath))
135+
pBlacklist->setCheckState(Qt::Checked);
136+
lstItems << pBlacklist;
137+
auto pName = new QStandardItem(plugin->Icon(), plugin->DisplayName());
138+
lstItems << pName;
139+
auto pType = new QStandardItem(plugin->TypeName(plugin->Type()));
140+
lstItems << pType;
141+
auto pPath = new QStandardItem(szPath);
142+
lstItems << pPath;
143+
m_pModelFilter->appendRow(lstItems);
144+
//以下设置列宽函数必须要数据加载完成后使用,才能应用
145+
ui->tvFilter->resizeColumnsToContents(); //设置所有列宽度自适应内容
146+
return 0;
147+
}
148+
149+
void CFrmManagePlugins::on_pbAdd_clicked()
150+
{
151+
QString szPath = QFileDialog::getExistingDirectory(
152+
this, tr("Plugin path"),
153+
RabbitCommon::CDir::Instance()->GetDirPlugins());
154+
if(szPath.isEmpty()) return;
155+
auto pFind = m_pModelPluginPath->findItems(szPath);
156+
if(!pFind.isEmpty()) return;
157+
auto pItem = new QStandardItem(szPath);
158+
m_pModelPluginPath->appendRow(pItem);
159+
}
160+
161+
void CFrmManagePlugins::on_pbRemove_clicked()
162+
{
163+
QModelIndex index = ui->lvPluginsPath->currentIndex();
164+
if(!index.isValid())
165+
return;
166+
m_pModelPluginPath->removeRow(index.row());
167+
}
168+
169+
void CFrmManagePlugins::slotCustomContextPluginsPath(const QPoint &pos)
170+
{
171+
QMenu m;
172+
m.addAction(tr("Add"), this, SLOT(on_pbAdd_clicked()));
173+
m.addAction(tr("Remove"), this, SLOT(on_pbRemove_clicked()));
174+
m.exec(this->mapToGlobal(pos));
175+
}

Src/FrmManagePlugins.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Author: Kang Lin <kl222@126.com>
2+
3+
#pragma once
4+
5+
#include <QListView>
6+
#include <QTableView>
7+
#include <QDir>
8+
#include <QStandardItemModel>
9+
#include "ParameterUI.h"
10+
#include "ParameterPlugin.h"
11+
12+
class CPlugin;
13+
namespace Ui {
14+
class CFrmManagePluginsUI;
15+
}
16+
class CFrmManagePlugins : public CParameterUI
17+
{
18+
Q_OBJECT
19+
public:
20+
CFrmManagePlugins(QWidget *parent = nullptr);
21+
22+
// CParameterUI interface
23+
public:
24+
virtual int SetParameter(CParameter *pParameter) override;
25+
virtual int Accept() override;
26+
private slots:
27+
void on_pbAdd_clicked();
28+
void on_pbRemove_clicked();
29+
void slotCustomContextPluginsPath(const QPoint& pos);
30+
private:
31+
int FindPlugins(QDir dir, QStringList filters);
32+
int AddItem(CPlugin* plugin, const QString& szPath);
33+
private:
34+
Ui::CFrmManagePluginsUI* ui;
35+
enum ColumnNo {
36+
Whitelist,
37+
Blacklist,
38+
Name,
39+
Type,
40+
Path
41+
};
42+
CParameterPlugin* m_pPara;
43+
QStandardItemModel* m_pModelPluginPath;
44+
QStandardItemModel* m_pModelFilter;
45+
};
46+

Src/FrmManagePlugins.ui

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>CFrmManagePluginsUI</class>
4+
<widget class="QWidget" name="CFrmManagePluginsUI">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>600</width>
10+
<height>450</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Form</string>
15+
</property>
16+
<layout class="QGridLayout" name="gridLayout">
17+
<item row="0" column="0">
18+
<widget class="QGroupBox" name="groupBox">
19+
<property name="sizePolicy">
20+
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
21+
<horstretch>0</horstretch>
22+
<verstretch>1</verstretch>
23+
</sizepolicy>
24+
</property>
25+
<property name="title">
26+
<string>Plugins path:</string>
27+
</property>
28+
<layout class="QGridLayout" name="gridLayout_2">
29+
<item row="0" column="0">
30+
<widget class="QListView" name="lvPluginsPath">
31+
<property name="sizePolicy">
32+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
33+
<horstretch>0</horstretch>
34+
<verstretch>1</verstretch>
35+
</sizepolicy>
36+
</property>
37+
<property name="contextMenuPolicy">
38+
<enum>Qt::ContextMenuPolicy::CustomContextMenu</enum>
39+
</property>
40+
<property name="editTriggers">
41+
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
42+
</property>
43+
</widget>
44+
</item>
45+
<item row="0" column="1">
46+
<layout class="QVBoxLayout" name="verticalLayout">
47+
<item>
48+
<widget class="QPushButton" name="pbAdd">
49+
<property name="text">
50+
<string>Add</string>
51+
</property>
52+
</widget>
53+
</item>
54+
<item>
55+
<widget class="QPushButton" name="pbRemove">
56+
<property name="text">
57+
<string>Remove</string>
58+
</property>
59+
</widget>
60+
</item>
61+
</layout>
62+
</item>
63+
</layout>
64+
</widget>
65+
</item>
66+
<item row="1" column="0">
67+
<widget class="QTableView" name="tvFilter">
68+
<property name="sizePolicy">
69+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
70+
<horstretch>0</horstretch>
71+
<verstretch>2</verstretch>
72+
</sizepolicy>
73+
</property>
74+
</widget>
75+
</item>
76+
</layout>
77+
</widget>
78+
<resources/>
79+
<connections/>
80+
</ui>

0 commit comments

Comments
 (0)