3#include <QLoggingCategory>
11#include <QStandardItemModel>
12#include <QWebEngineProfile>
15#include <QJsonDocument>
19#include "FrmQWebEnginePluginManager.h"
20#include "ParameterWebBrowser.h"
21#include "ui_FrmQWebEnginePluginManager.h"
23static Q_LOGGING_CATEGORY(log,
"WebBrowser.PluginManager")
27 , ui(new
Ui::CFrmQWebEnginePluginManagerUI)
29 , m_pModelPlugins(
nullptr)
32 setWindowTitle(tr(
"QWebEngine Plugin Manager"));
33 setWindowIcon(QIcon::fromTheme(
"extension"));
38 qDebug(log) << Q_FUNC_INFO <<
"Plugin manager initialized";
41CFrmQWebEnginePluginManager::~CFrmQWebEnginePluginManager()
43 qDebug(log) << Q_FUNC_INFO;
47void CFrmQWebEnginePluginManager::InitializeUI()
50 m_pModelPlugins =
new QStandardItemModel(
this);
51 m_pModelPlugins->setColumnCount(6);
55 headers << tr(
"Enable") << tr(
"Name") << tr(
"Type")
56 << tr(
"Version") << tr(
"Path") << tr(
"Description");
57 m_pModelPlugins->setHorizontalHeaderLabels(headers);
60 ui->tvPlugins->setModel(m_pModelPlugins);
61 ui->tvPlugins->setSelectionMode(QAbstractItemView::SingleSelection);
62 ui->tvPlugins->setSelectionBehavior(QAbstractItemView::SelectRows);
63 ui->tvPlugins->setEditTriggers(QAbstractItemView::NoEditTriggers);
64 ui->tvPlugins->setContextMenuPolicy(Qt::CustomContextMenu);
67 ui->tvPlugins->horizontalHeader()->setStretchLastSection(
true);
68 ui->tvPlugins->horizontalHeader()->setSectionResizeMode(
69 ColumnNo::Path, QHeaderView::Stretch);
72 ui->tvPlugins->verticalHeader()->setDefaultSectionSize(24);
75 ui->pbEnableAll->setText(tr(
"Enable All"));
76 ui->pbDisableAll->setText(tr(
"Disable All"));
77 ui->pbAdd->setText(tr(
"Add Plugin"));
78 ui->pbRemove->setText(tr(
"Remove"));
79 ui->pbDetails->setText(tr(
"Details"));
80 ui->pbExport->setText(tr(
"Export"));
81 ui->pbImport->setText(tr(
"Import"));
82 ui->pbApply->setText(tr(
"Apply"));
83 ui->pbReset->setText(tr(
"Reset"));
85 qDebug(log) <<
"UI initialized";
88void CFrmQWebEnginePluginManager::SetupConnections()
93 check &= connect(ui->pbEnableAll, &QPushButton::clicked,
94 this, &CFrmQWebEnginePluginManager::on_pbEnableAll_clicked);
95 check &= connect(ui->pbDisableAll, &QPushButton::clicked,
96 this, &CFrmQWebEnginePluginManager::on_pbDisableAll_clicked);
97 check &= connect(ui->pbAdd, &QPushButton::clicked,
98 this, &CFrmQWebEnginePluginManager::on_pbAdd_clicked);
99 check &= connect(ui->pbRemove, &QPushButton::clicked,
100 this, &CFrmQWebEnginePluginManager::on_pbRemove_clicked);
101 check &= connect(ui->pbDetails, &QPushButton::clicked,
102 this, &CFrmQWebEnginePluginManager::on_pbDetails_clicked);
103 check &= connect(ui->pbExport, &QPushButton::clicked,
104 this, &CFrmQWebEnginePluginManager::on_pbExport_clicked);
105 check &= connect(ui->pbImport, &QPushButton::clicked,
106 this, &CFrmQWebEnginePluginManager::on_pbImport_clicked);
107 check &= connect(ui->pbApply, &QPushButton::clicked,
108 this, &CFrmQWebEnginePluginManager::on_pbApply_clicked);
109 check &= connect(ui->pbReset, &QPushButton::clicked,
110 this, &CFrmQWebEnginePluginManager::on_pbReset_clicked);
113 check &= connect(m_pModelPlugins, &QStandardItemModel::itemChanged,
114 this, &CFrmQWebEnginePluginManager::slotPluginItemChanged);
117 check &= connect(ui->tvPlugins->selectionModel(), &QItemSelectionModel::selectionChanged,
118 this, &CFrmQWebEnginePluginManager::slotSelectionChanged);
119 check &= connect(ui->tvPlugins, &QTableView::customContextMenuRequested,
120 this, &CFrmQWebEnginePluginManager::slotCustomContextMenu);
123 qDebug(log) <<
"Connections setup completed";
130 qWarning(log) <<
"Failed to set parameter: pPara is null";
134 LoadPluginConfiguration();
140int CFrmQWebEnginePluginManager::RefreshPluginList()
142 if(!m_pModelPlugins)
return -1;
144 m_pModelPlugins->removeRows(0, m_pModelPlugins->rowCount());
146 qDebug(log) <<
"Refreshing plugin list";
148#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
150 auto profile = QWebEngineProfile::defaultProfile();
152 qWarning(log) <<
"Default profile is null";
158 QStringList pluginPaths;
159 pluginPaths << QCoreApplication::libraryPaths();
161 for(
const auto &path : pluginPaths) {
163 if(!dir.exists())
continue;
168#elif defined(Q_OS_MACOS)
169 filters <<
"*.dylib" <<
"*.so";
174 dir.setNameFilters(filters);
175 QFileInfoList files = dir.entryInfoList();
177 for(
const auto &fileInfo : files) {
178 if(IsValidPlugin(fileInfo.filePath())) {
179 AddPluginItem(fileInfo.baseName(), fileInfo.filePath(),
true);
184 qDebug(log) <<
"Plugin list refreshed, total plugins:" << m_pModelPlugins->rowCount();
188int CFrmQWebEnginePluginManager::AddPluginItem(
189 const QString &pluginName,
const QString &pluginPath,
bool enabled)
191 if(!m_pModelPlugins)
return -1;
193 int row = m_pModelPlugins->rowCount();
194 m_pModelPlugins->insertRow(row);
197 auto itemEnabled =
new QStandardItem();
198 itemEnabled->setCheckable(
true);
199 itemEnabled->setCheckState(enabled ? Qt::Checked : Qt::Unchecked);
200 m_pModelPlugins->setItem(row, ColumnNo::Enabled, itemEnabled);
203 auto itemName =
new QStandardItem(pluginName);
204 itemName->setEditable(
false);
205 m_pModelPlugins->setItem(row, ColumnNo::Name, itemName);
208 auto itemType =
new QStandardItem(
"Web Plugin");
209 itemType->setEditable(
false);
210 m_pModelPlugins->setItem(row, ColumnNo::Type, itemType);
213 auto itemVersion =
new QStandardItem(
"1.0.0");
214 itemVersion->setEditable(
false);
215 m_pModelPlugins->setItem(row, ColumnNo::Version, itemVersion);
218 auto itemPath =
new QStandardItem(pluginPath);
219 itemPath->setEditable(
false);
220 m_pModelPlugins->setItem(row, ColumnNo::Path, itemPath);
223 auto itemDesc =
new QStandardItem(GetPluginInfo(pluginPath));
224 itemDesc->setEditable(
false);
225 m_pModelPlugins->setItem(row, ColumnNo::Description, itemDesc);
227 qDebug(log) <<
"Added plugin:" << pluginName <<
"at path:" << pluginPath;
231bool CFrmQWebEnginePluginManager::IsValidPlugin(
const QString &pluginPath)
const
233 QFileInfo fi(pluginPath);
234 if(!fi.exists() || !fi.isFile())
return false;
237 return fi.isReadable();
240QString CFrmQWebEnginePluginManager::GetPluginInfo(
const QString &pluginPath)
const
242 QFileInfo fi(pluginPath);
243 return QString(
"%1 (%2 bytes)")
250 return m_pluginConfig;
254 const QMap<QString, QVariant> &config)
256 m_pluginConfig = config;
257 return LoadPluginConfiguration();
260int CFrmQWebEnginePluginManager::SavePluginConfiguration()
262 QJsonArray pluginsArray;
264 for(
int i = 0; i < m_pModelPlugins->rowCount(); i++) {
265 QJsonObject pluginObj;
267 auto itemName = m_pModelPlugins->item(i, ColumnNo::Name);
268 auto itemPath = m_pModelPlugins->item(i, ColumnNo::Path);
269 auto itemEnabled = m_pModelPlugins->item(i, ColumnNo::Enabled);
271 if(itemName && itemPath && itemEnabled) {
272 pluginObj[
"name"] = itemName->text();
273 pluginObj[
"path"] = itemPath->text();
274 pluginObj[
"enabled"] = (itemEnabled->checkState() == Qt::Checked);
275 pluginsArray.append(pluginObj);
279 QJsonObject configObj;
280 configObj[
"plugins"] = pluginsArray;
281 configObj[
"version"] =
"1.0";
283 m_pluginConfig[
"config"] = QJsonDocument(configObj).toJson();
285 qDebug(log) <<
"Plugin configuration saved";
289int CFrmQWebEnginePluginManager::LoadPluginConfiguration()
292 qDebug(log) <<
"Plugin configuration loaded";
296void CFrmQWebEnginePluginManager::on_pbEnableAll_clicked()
298 qDebug(log) << Q_FUNC_INFO;
299 for(
int i = 0; i < m_pModelPlugins->rowCount(); i++) {
300 auto item = m_pModelPlugins->item(i, ColumnNo::Enabled);
302 item->setCheckState(Qt::Checked);
305 QMessageBox::information(
this, tr(
"Info"), tr(
"All plugins enabled"));
308void CFrmQWebEnginePluginManager::on_pbDisableAll_clicked()
310 qDebug(log) << Q_FUNC_INFO;
311 for(
int i = 0; i < m_pModelPlugins->rowCount(); i++) {
312 auto item = m_pModelPlugins->item(i, ColumnNo::Enabled);
314 item->setCheckState(Qt::Unchecked);
317 QMessageBox::information(
this, tr(
"Info"), tr(
"All plugins disabled"));
320void CFrmQWebEnginePluginManager::on_pbAdd_clicked()
322 qDebug(log) << Q_FUNC_INFO;
323 QString filter = tr(
"Plugin Files (*.dll *.so *.dylib);;All Files (*)");
324 QString filePath = QFileDialog::getOpenFileName(
this, tr(
"Select Plugin"),
"", filter);
326 if(!filePath.isEmpty() && IsValidPlugin(filePath)) {
327 QFileInfo fi(filePath);
328 AddPluginItem(fi.baseName(), filePath,
true);
332void CFrmQWebEnginePluginManager::on_pbRemove_clicked()
334 qDebug(log) << Q_FUNC_INFO;
335 auto indexes = ui->tvPlugins->selectionModel()->selectedRows();
336 if(indexes.isEmpty()) {
337 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Please select a plugin to remove"));
341 int row = indexes.at(0).row();
342 m_pModelPlugins->removeRow(row);
345void CFrmQWebEnginePluginManager::on_pbDetails_clicked()
347 qDebug(log) << Q_FUNC_INFO;
348 auto indexes = ui->tvPlugins->selectionModel()->selectedRows();
349 if(indexes.isEmpty())
return;
351 int row = indexes.at(0).row();
352 QString name = m_pModelPlugins->item(row, ColumnNo::Name)->text();
353 QString path = m_pModelPlugins->item(row, ColumnNo::Path)->text();
354 QString version = m_pModelPlugins->item(row, ColumnNo::Version)->text();
355 QString description = m_pModelPlugins->item(row, ColumnNo::Description)->text();
357 QString details = QString(
"Plugin Details:\n\nName: %1\nPath: %2\nVersion: %3\n\nInfo: %4")
358 .arg(name, path, version, description);
360 QMessageBox::information(
this, tr(
"Plugin Details"), details);
363void CFrmQWebEnginePluginManager::on_pbExport_clicked()
365 qDebug(log) << Q_FUNC_INFO;
366 QString filePath = QFileDialog::getSaveFileName(
this,
367 tr(
"Export Plugin Configuration"),
"",
368 tr(
"JSON Files (*.json);;All Files (*)"));
370 if(!filePath.isEmpty()) {
371 SavePluginConfiguration();
373 QMessageBox::information(
this, tr(
"Success"), tr(
"Configuration exported successfully"));
377void CFrmQWebEnginePluginManager::on_pbImport_clicked()
379 qDebug(log) << Q_FUNC_INFO;
380 QString filePath = QFileDialog::getOpenFileName(
this,
381 tr(
"Import Plugin Configuration"),
"",
382 tr(
"JSON Files (*.json);;All Files (*)"));
384 if(!filePath.isEmpty()) {
386 QMessageBox::information(
this, tr(
"Success"), tr(
"Configuration imported successfully"));
390void CFrmQWebEnginePluginManager::on_pbApply_clicked()
392 qDebug(log) << Q_FUNC_INFO;
393 SavePluginConfiguration();
394 QMessageBox::information(
this, tr(
"Success"), tr(
"Configuration applied"));
397void CFrmQWebEnginePluginManager::on_pbReset_clicked()
399 qDebug(log) << Q_FUNC_INFO;
400 LoadPluginConfiguration();
402 QMessageBox::information(
this, tr(
"Success"), tr(
"Configuration reset"));
405void CFrmQWebEnginePluginManager::slotPluginItemChanged(QStandardItem *item)
408 qDebug(log) <<
"Plugin item changed:" << item->text();
411void CFrmQWebEnginePluginManager::slotSelectionChanged()
413 auto indexes = ui->tvPlugins->selectionModel()->selectedRows();
414 bool hasSelection = !indexes.isEmpty();
416 ui->pbRemove->setEnabled(hasSelection);
417 ui->pbDetails->setEnabled(hasSelection);
420void CFrmQWebEnginePluginManager::slotCustomContextMenu(
const QPoint &pos)
422 qDebug(log) << Q_FUNC_INFO;
CFrmQWebEnginePluginManager - QWebEngine 插件管理窗体
QMap< QString, QVariant > GetPluginConfiguration() const
获取插件管理器配置
int SetPluginConfiguration(const QMap< QString, QVariant > &config)
设置插件管理器配置
int SetParameter(CParameterWebBrowser *pPara)
设置 WebEngine 参数