|
| 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 | +} |
0 commit comments