diff --git a/src/common/plugins/plugin_manager.cpp b/src/common/plugins/plugin_manager.cpp index b8704c974..720721ed4 100644 --- a/src/common/plugins/plugin_manager.cpp +++ b/src/common/plugins/plugin_manager.cpp @@ -214,20 +214,48 @@ void PluginManager::loadPlugin(const QString& fileName) allPlugins.push_back(ifp); } -void PluginManager::enablePlugin(PluginFileInterface* fpi) +void PluginManager::unloadPlugin(PluginFileInterface* ifp) { - auto it = std::find(allPlugins.begin(), allPlugins.end(), fpi); - if (it != allPlugins.end() && !fpi->isEnabled()){ - fpi->enable(); + auto it = std::find(allPlugins.begin(), allPlugins.end(), ifp); + if (it != allPlugins.end()){ + MeshLabPluginType type(ifp); + if (type.isDecoratePlugin()){ + unloadDecoratePlugin(dynamic_cast(ifp)); + } + if (type.isEditPlugin()){ + unloadEditPlugin(dynamic_cast(ifp)); + } + if (type.isFilterPlugin()){ + unloadFilterPlugin(dynamic_cast(ifp)); + } + if (type.isIOMeshPlugin()){ + unloadIOMeshPlugin(dynamic_cast(ifp)); + } + if (type.isIORasterPlugin()){ + unloadIORasterPlugin(dynamic_cast(ifp)); + } + if (type.isRenderPlugin()){ + unloadRenderPlugin(dynamic_cast(ifp)); + } + allPlugins.erase(it); + delete ifp; + } +} + +void PluginManager::enablePlugin(PluginFileInterface* ifp) +{ + auto it = std::find(allPlugins.begin(), allPlugins.end(), ifp); + if (it != allPlugins.end() && !ifp->isEnabled()){ + ifp->enable(); //ToDo other checks... } } -void PluginManager::disablePlugin(PluginFileInterface* fpi) +void PluginManager::disablePlugin(PluginFileInterface* ifp) { - auto it = std::find(allPlugins.begin(), allPlugins.end(), fpi); - if (it != allPlugins.end() && fpi->isEnabled()){ - fpi->disable(); + auto it = std::find(allPlugins.begin(), allPlugins.end(), ifp); + if (it != allPlugins.end() && ifp->isEnabled()){ + ifp->disable(); //ToDo other checks... } } @@ -456,6 +484,54 @@ void PluginManager::loadEditPlugin(EditPluginInterfaceFactory* iEditFactory) editPlugins.push_back(iEditFactory); } +void PluginManager::unloadFilterPlugin(FilterPluginInterface* iFilter) +{ + for(QAction *filterAction : iFilter->actions()) { + actionFilterMap.remove(filterAction->text()); + } + filterPlugins.erase(std::find(filterPlugins.begin(), filterPlugins.end(), iFilter)); +} + +void PluginManager::unloadIOMeshPlugin(IOMeshPluginInterface* iIOMesh) +{ + ioMeshPlugins.erase(std::find(ioMeshPlugins.begin(), ioMeshPlugins.end(), iIOMesh)); + for (const FileFormat& ff : iIOMesh->importFormats()){ + for (QString currentExtension : ff.extensions) { + inputMeshFormatToPluginMap.remove(currentExtension.toLower()); + } + } + for (const FileFormat& ff : iIOMesh->exportFormats()){ + for (QString currentExtension : ff.extensions) { + outputMeshFormatToPluginMap.remove(currentExtension.toLower()); + } + } +} + +void PluginManager::unloadIORasterPlugin(IORasterPluginInterface* iIORaster) +{ + ioRasterPlugins.erase(std::find(ioRasterPlugins.begin(), ioRasterPlugins.end(), iIORaster)); + for (const FileFormat& ff : iIORaster->importFormats()){ + for (QString currentExtension : ff.extensions) { + inputRasterFormatToPluginMap.remove(currentExtension.toLower()); + } + } +} + +void PluginManager::unloadDecoratePlugin(DecoratePluginInterface* iDecorate) +{ + decoratePlugins.erase(std::find(decoratePlugins.begin(), decoratePlugins.end(), iDecorate)); +} + +void PluginManager::unloadRenderPlugin(RenderPluginInterface* iRender) +{ + renderPlugins.erase(std::find(renderPlugins.begin(), renderPlugins.end(), iRender)); +} + +void PluginManager::unloadEditPlugin(EditPluginInterfaceFactory* iEditFactory) +{ + editPlugins.erase(std::find(editPlugins.begin(), editPlugins.end(), iEditFactory)); +} + template QStringList PluginManager::inputFormatListDialog(RangeIterator iterator) { diff --git a/src/common/plugins/plugin_manager.h b/src/common/plugins/plugin_manager.h index 78ee8c9b4..1388f9648 100644 --- a/src/common/plugins/plugin_manager.h +++ b/src/common/plugins/plugin_manager.h @@ -59,9 +59,10 @@ public: void loadPlugins(); void loadPlugins(QDir pluginsDirectory); void loadPlugin(const QString& filename); + void unloadPlugin(PluginFileInterface* ifp); - void enablePlugin(PluginFileInterface* fpi); - void disablePlugin(PluginFileInterface* fpi); + void enablePlugin(PluginFileInterface* ifp); + void disablePlugin(PluginFileInterface* ifp); QString pluginsCode() const; @@ -131,6 +132,13 @@ private: void loadRenderPlugin(RenderPluginInterface* iRender); void loadEditPlugin(EditPluginInterfaceFactory* iEditFactory); + void unloadFilterPlugin(FilterPluginInterface* iFilter); + void unloadIOMeshPlugin(IOMeshPluginInterface* iIOMesh); + void unloadIORasterPlugin(IORasterPluginInterface* iIORaster); + void unloadDecoratePlugin(DecoratePluginInterface* iDecorate); + void unloadRenderPlugin(RenderPluginInterface* iRender); + void unloadEditPlugin(EditPluginInterfaceFactory* iEditFactory); + template static QStringList inputFormatListDialog(RangeIterator iterator); diff --git a/src/meshlab/dialogs/plugin_info_dialog.cpp b/src/meshlab/dialogs/plugin_info_dialog.cpp index 69cac633f..38f5b7661 100644 --- a/src/meshlab/dialogs/plugin_info_dialog.cpp +++ b/src/meshlab/dialogs/plugin_info_dialog.cpp @@ -89,8 +89,12 @@ void PluginInfoDialog::uninstallPluginPushButtonClicked() int nPlug = pb->property("np").toInt(); PluginManager& pm = meshlab::pluginManagerInstance(); PluginFileInterface* fpi = pm[nPlug]; - /** TODO **/ - std::cerr << fpi->pluginName().toStdString() << " deleted!\n"; + QFileInfo fdel = fpi->pluginFileInfo(); + pm.unloadPlugin(fpi); + QFile::remove(fdel.absoluteFilePath()); + ui->treeWidget->clear(); + populateTreeWidget(); + ui->treeWidget->update(); } void PluginInfoDialog::on_loadPluginsPushButton_clicked() @@ -117,8 +121,6 @@ void PluginInfoDialog::on_loadPluginsPushButton_clicked() QString newFileName = appDir.absolutePath() + "/" +finfo.fileName(); QFile::copy(fileName, newFileName); - std::cerr << "PATH: " << newFileName.toStdString() << "\n"; - pm.loadPlugin(newFileName); loadOk = true; }