RasterProcessTool/RasterProcessToolWidget/ToolBoxManager/PluginManageDialog.cpp

178 lines
4.7 KiB
C++

#include <ui_PluginManageDialog.h>
#include "PluginManageDialog.h"
#include "MainWindow/MainWindow.h"
#include "PluginManager.h"
#include "Settings/BusAPI.h"
#include <QDir>
#include <QMessageBox>
#include <QDebug>
namespace Plugins
{
PluginManageDialog::PluginManageDialog(GUI::MainWindow *mw, PluginManager *m)
: _manager(m), _mainWindow(mw)
{
_ui = new Ui::PluginManageDialog;
_ui->setupUi(this);
_ui->availableList->setSelectionMode(QAbstractItemView::ExtendedSelection);
_ui->selectedList->setSelectionMode(QAbstractItemView::ExtendedSelection);
this->init();
connect(this, SIGNAL(updateMainWindowInteface()), mw, SIGNAL(updateInterfaces()));
}
PluginManageDialog::~PluginManageDialog()
{
if (_ui != nullptr)
delete _ui;
}
void PluginManageDialog::init()
{
QStringList insplugs = Setting::BusAPI::instance()->getPlugins();
for (int i = 0; i < insplugs.size(); ++i)
{
QString name = insplugs.at(i);
this->appendItemToSelectedList(name);
}
QString suffix = "dll";
QString pre = "plugin";
#ifdef Q_OS_LINUX
suffix = "so";
pre = "libplugin";
#endif
const QString plugdir = QApplication::applicationDirPath() + "/plugins/";
QDir dir(plugdir);
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
QString plugpath = fileInfo.absoluteFilePath();
QString pluginname = fileInfo.fileName();
if (insplugs.contains(pluginname))
continue;
if (!pluginname.toLower().startsWith(pre))
continue;
if (!pluginname.toLower().endsWith(suffix))
continue;
this->appendItemToAvailableList(pluginname);
}
}
void PluginManageDialog::on_addButton_clicked()
{
// int iSelectListItemNumber = _ui->selectedList->count();
QList<QListWidgetItem *> itemList = _ui->availableList->selectedItems();
const int n = itemList.size();
for (int i = 0; i < n; ++i)
{
QListWidgetItem *availitem = itemList.at(i);
const int row = _ui->availableList->row(availitem);
QListWidgetItem *selectitem = new QListWidgetItem(QIcon("://QUI/icon/Plugin_ins.png"), availitem->text());
_ui->selectedList->addItem(selectitem);
_ui->availableList->takeItem(row);
}
}
void PluginManageDialog::on_removeButton_clicked()
{
QList<QListWidgetItem *> itemList = _ui->selectedList->selectedItems();
const int n = itemList.size();
for (int i = 0; i < n; ++i)
{
QListWidgetItem *selectitem = itemList.at(i);
const int row = _ui->selectedList->row(selectitem);
QListWidgetItem *availitem = new QListWidgetItem(QIcon("://QUI/icon/Plugin_ava.png"), selectitem->text());
_ui->availableList->addItem(availitem);
_ui->selectedList->takeItem(row);
}
}
void PluginManageDialog::appendItemToAvailableList(QString name)
{
QListWidgetItem *item = new QListWidgetItem(QIcon("://QUI/icon/Plugin_ava.png"), name);
_ui->availableList->addItem(item);
}
void PluginManageDialog::appendItemToSelectedList(QString name)
{
QListWidgetItem *item = new QListWidgetItem(QIcon("://QUI/icon/Plugin_ins.png"), name);
_ui->selectedList->addItem(item);
}
QStringList PluginManageDialog::getSelectedItemNames()
{
QStringList names;
const int n = _ui->selectedList->count();
for (int i = 0; i < n; ++i)
{
QListWidgetItem *item = _ui->selectedList->item(i);
const QString text = item->text();
names.append(text);
}
return names;
}
void PluginManageDialog::accept()
{
QStringList selectedNames = this->getSelectedItemNames();
QStringList installedNames = Setting::BusAPI::instance()->getPlugins();
QStringList commonList;
for (QString name : installedNames)
{
if (selectedNames.contains(name))
commonList.append(name);
}
QStringList ins = commonList;
QStringList failres;
for (QString name : installedNames)
{
if (!commonList.contains(name))
{
bool ok = _manager->releasePlugin(name);
{
if (!ok)
{
failres.append(name);
ins.append(name);
}
}
}
}
QStringList failins;
for (QString name : selectedNames)
{
qDebug()<< QString("check loading plugin :")+name;
if (!commonList.contains(name))
{
qDebug()<< QString("start loading plugin :")+name;
bool ok = _manager->loadPlugin(name);
if (!ok)
{
failins.append(name);
}
ins.append(name);
}
}
if (!failins.isEmpty())
{
QString info = failins.join(",") + QString(tr(" load failed!"));
QMessageBox::warning(this, tr("Warning"), info);
}
if (!failres.isEmpty())
{
QString info = failres.join(",") + QString(tr(" uninstall failed!"));
QMessageBox::warning(this, tr("Warning"), info);
}
Setting::BusAPI::instance()->setPlugins(ins);
emit this->updateMainWindowInteface();
QDialog::accept();
}
}