FilterPluginContainer to manage FilterPlugins in PluginManager

This commit is contained in:
alemuntoni 2021-02-26 17:30:52 +01:00
parent 3beef1f0a5
commit ce6693d80a
7 changed files with 230 additions and 89 deletions

View File

@ -19,6 +19,8 @@ endif()
set(HEADERS
globals.h
plugins/containers/generic_container_iterator.h
plugins/containers/filter_plugin_container.h
plugins/interfaces/plugin_file_interface.h
plugins/interfaces/decorate_plugin_interface.h
plugins/interfaces/edit_plugin_interface.h
@ -64,6 +66,7 @@ set(HEADERS
set(SOURCES
globals.cpp
plugins/containers/filter_plugin_container.cpp
plugins/interfaces/decorate_plugin_interface.cpp
plugins/interfaces/filter_plugin_interface.cpp
plugins/interfaces/plugin_interface.cpp

View File

@ -0,0 +1,68 @@
/****************************************************************************
* MeshLab o o *
* A versatile mesh processing toolbox o o *
* _ O _ *
* Copyright(C) 2005-2021 \/)\/ *
* Visual Computing Lab /\/| *
* ISTI - Italian National Research Council | *
* \ *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
* for more details. *
* *
****************************************************************************/
#include "filter_plugin_container.h"
FilterPluginContainer::FilterPluginContainer()
{
}
void FilterPluginContainer::clear()
{
filterPlugins.clear();
actionFilterMap.clear();
}
void FilterPluginContainer::pushFilterPlugin(
FilterPluginInterface* iFilter)
{
for(QAction *filterAction : iFilter->actions()) {
filterAction->setData(QVariant(iFilter->pluginName()));
actionFilterMap.insert(filterAction->text(), filterAction);
}
filterPlugins.push_back(iFilter);
}
void FilterPluginContainer::eraseFilterPlugin(
FilterPluginInterface* iFilter)
{
for(QAction *filterAction : iFilter->actions()) {
actionFilterMap.remove(filterAction->text());
}
filterPlugins.erase(std::find(filterPlugins.begin(), filterPlugins.end(), iFilter));
}
QAction* FilterPluginContainer::filterAction(const QString& name)
{
auto it = actionFilterMap.find(name);
if (it != actionFilterMap.end())
return it.value();
else
return nullptr;
}
FilterPluginContainer::FilterPluginRangeIterator FilterPluginContainer::filterPluginIterator(bool iterateAlsoDisabledPlugins) const
{
return FilterPluginRangeIterator(this, iterateAlsoDisabledPlugins);
}

View File

@ -0,0 +1,68 @@
/****************************************************************************
* MeshLab o o *
* A versatile mesh processing toolbox o o *
* _ O _ *
* Copyright(C) 2005-2021 \/)\/ *
* Visual Computing Lab /\/| *
* ISTI - Italian National Research Council | *
* \ *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
* for more details. *
* *
****************************************************************************/
#ifndef MESHLAB_FILTER_PLUGIN_CONTAINER_H
#define MESHLAB_FILTER_PLUGIN_CONTAINER_H
#include "../interfaces/filter_plugin_interface.h"
#include "generic_container_iterator.h"
/**
* @brief The PluginManager::FilterPluginContainer class allows to organize
* all the filter plugins contained in the PluginManager.
*
* Note: plugins are not owned by this container, but by the PluginManager,
* since each plugin can inherit from more than one PluginInterface.
*/
class FilterPluginContainer
{
public:
class FilterPluginRangeIterator;
FilterPluginContainer();
void clear();
void pushFilterPlugin(FilterPluginInterface* iFilter);
void eraseFilterPlugin(FilterPluginInterface* iFilter);
QAction* filterAction(const QString& name);
FilterPluginRangeIterator filterPluginIterator(bool iterateAlsoDisabledPlugins = false) const;
private:
std::vector<FilterPluginInterface*> filterPlugins;
QMap<QString, QAction*> actionFilterMap;
};
class FilterPluginContainer::FilterPluginRangeIterator
{
friend class FilterPluginContainer;
public:
ConstPluginIterator<FilterPluginInterface> begin() {return ConstPluginIterator<FilterPluginInterface>(pm->filterPlugins, pm->filterPlugins.begin(), b);}
ConstPluginIterator<FilterPluginInterface> end() {return ConstPluginIterator<FilterPluginInterface>(pm->filterPlugins, pm->filterPlugins.end(), b);}
private:
FilterPluginRangeIterator(const FilterPluginContainer* pm, bool iterateAlsoDisabledPlugins = false) : pm(pm), b(iterateAlsoDisabledPlugins) {}
const FilterPluginContainer* pm;
bool b;
};
#endif // MESHLAB_FILTER_PLUGIN_CONTAINER_H

View File

@ -0,0 +1,48 @@
#ifndef HEADERFILE_H
#define HEADERFILE_H
#include <vector>
template <typename PluginType>
class ConstPluginIterator
{
public:
using Container = std::vector<PluginType*>;
using iterator_category = std::forward_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = PluginType*;
using pointer = typename Container::const_iterator;
using reference = PluginType*&;
ConstPluginIterator(
const Container& c,
const pointer& it,
bool iterateAlsoDisabledPlugins = false)
: c(c), m_ptr(it), iterateAlsoDisabledPlugins(iterateAlsoDisabledPlugins)
{
if (m_ptr != c.end() && !iterateAlsoDisabledPlugins && !(*m_ptr)->isEnabled())
++(*this);
}
value_type operator*() const {return *m_ptr; }
pointer operator->() { return m_ptr; }
ConstPluginIterator& operator++() {
if (iterateAlsoDisabledPlugins)
m_ptr++;
else {
do {
m_ptr++;
} while((m_ptr != c.end()) && !(*m_ptr)->isEnabled());
}
return *this;
}
ConstPluginIterator operator++(int) {ConstPluginIterator tmp = *this; ++(*this); return tmp; }
friend bool operator== (const ConstPluginIterator& a, const ConstPluginIterator& b) { return a.m_ptr == b.m_ptr; };
friend bool operator!= (const ConstPluginIterator& a, const ConstPluginIterator& b) { return a.m_ptr != b.m_ptr; };
private:
const Container& c;
pointer m_ptr;
bool iterateAlsoDisabledPlugins;
};
#endif // HEADERFILE_H

View File

@ -53,14 +53,8 @@ PluginManager::PluginManager()
PluginManager::~PluginManager()
{
ioMeshPlugins.clear();
filterPlugins.clear();
renderPlugins.clear();
decoratePlugins.clear();
editPlugins.clear();
for (auto& plugin : allPlugins)
delete plugin;
allPlugins.clear();
}
/**
@ -206,7 +200,8 @@ void PluginManager::loadPlugin(const QString& fileName)
loadEditPlugin(qobject_cast<EditPluginInterfaceFactory *>(plugin));
}
if (type.isFilterPlugin()){
loadFilterPlugin(qobject_cast<FilterPluginInterface *>(plugin));
filterPlugins.pushFilterPlugin(qobject_cast<FilterPluginInterface *>(plugin));
//loadFilterPlugin(qobject_cast<FilterPluginInterface *>(plugin));
}
if (type.isIOMeshPlugin()){
loadIOMeshPlugin(qobject_cast<IOMeshPluginInterface *>(plugin));
@ -237,7 +232,8 @@ void PluginManager::unloadPlugin(PluginFileInterface* ifp)
unloadEditPlugin(dynamic_cast<EditPluginInterfaceFactory *>(ifp));
}
if (type.isFilterPlugin()){
unloadFilterPlugin(dynamic_cast<FilterPluginInterface *>(ifp));
filterPlugins.eraseFilterPlugin(dynamic_cast<FilterPluginInterface *>(ifp));
//unloadFilterPlugin(dynamic_cast<FilterPluginInterface *>(ifp));
}
if (type.isIOMeshPlugin()){
unloadIOMeshPlugin(dynamic_cast<IOMeshPluginInterface *>(ifp));
@ -294,11 +290,7 @@ DecoratePluginInterface *PluginManager::getDecoratePlugin(const QString& name)
QAction* PluginManager::filterAction(const QString& name)
{
auto it = actionFilterMap.find(name);
if (it != actionFilterMap.end())
return it.value();
else
return nullptr;
return filterPlugins.filterAction(name);
}
IOMeshPluginInterface* PluginManager::inputMeshPlugin(const QString& inputFormat) const
@ -380,9 +372,9 @@ PluginManager::PluginRangeIterator PluginManager::pluginIterator(bool iterateAls
return PluginRangeIterator(this, iterateAlsoDisabledPlugins);
}
PluginManager::FilterPluginRangeIterator PluginManager::filterPluginIterator(bool iterateAlsoDisabledPlugins) const
FilterPluginContainer::FilterPluginRangeIterator PluginManager::filterPluginIterator(bool iterateAlsoDisabledPlugins) const
{
return FilterPluginRangeIterator(this, iterateAlsoDisabledPlugins);
return filterPlugins.filterPluginIterator(iterateAlsoDisabledPlugins);
}
PluginManager::IOMeshPluginIterator PluginManager::ioMeshPluginIterator(bool iterateAlsoDisabledPlugins) const
@ -431,14 +423,14 @@ void PluginManager::checkFilterPlugin(FilterPluginInterface* iFilter)
}
}
void PluginManager::loadFilterPlugin(FilterPluginInterface* iFilter)
{
for(QAction *filterAction : iFilter->actions()) {
filterAction->setData(QVariant(iFilter->pluginName()));
actionFilterMap.insert(filterAction->text(), filterAction);
}
filterPlugins.push_back(iFilter);
}
//void PluginManager::loadFilterPlugin(FilterPluginInterface* iFilter)
//{
// for(QAction *filterAction : iFilter->actions()) {
// filterAction->setData(QVariant(iFilter->pluginName()));
// actionFilterMap.insert(filterAction->text(), filterAction);
// }
// filterPlugins.push_back(iFilter);
//}
void PluginManager::loadIOMeshPlugin(IOMeshPluginInterface* iIOMesh)
{
@ -495,13 +487,13 @@ 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::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)
{

View File

@ -31,6 +31,8 @@
#include "interfaces/decorate_plugin_interface.h"
#include "interfaces/edit_plugin_interface.h"
#include "containers/filter_plugin_container.h"
#include<QMap>
#include<QObject>
#include <QDir>
@ -46,7 +48,7 @@ public:
/** Iterators (definitions can be found in plugin_manager_iterators.h) **/
class PluginRangeIterator;
class FilterPluginRangeIterator;
//class FilterPluginRangeIterator;
class IOMeshPluginIterator;
class IORasterPluginIterator;
class RenderPluginRangeIterator;
@ -90,7 +92,7 @@ public:
/** Member functions for range iterators **/
PluginRangeIterator pluginIterator(bool iterateAlsoDisabledPlugins = false) const;
FilterPluginRangeIterator filterPluginIterator(bool iterateAlsoDisabledPlugins = false) const;
FilterPluginContainer::FilterPluginRangeIterator filterPluginIterator(bool iterateAlsoDisabledPlugins = false) const;
IOMeshPluginIterator ioMeshPluginIterator(bool iterateAlsoDisabledPlugins = false) const;
IORasterPluginIterator ioRasterPluginIterator(bool iterateAlsoDisabledPlugins = false) const;
RenderPluginRangeIterator renderPluginIterator(bool iterateAlsoDisabledPlugins = false) const;
@ -112,8 +114,9 @@ private:
QMap<QString, IORasterPluginInterface*> inputRasterFormatToPluginMap;
//Filter Plugins
std::vector<FilterPluginInterface*> filterPlugins;
QMap<QString, QAction*> actionFilterMap;
FilterPluginContainer filterPlugins;
//std::vector<FilterPluginInterface*> filterPlugins;
//QMap<QString, QAction*> actionFilterMap;
//Render Plugins
std::vector<RenderPluginInterface*> renderPlugins;
@ -126,14 +129,14 @@ private:
static void checkFilterPlugin(FilterPluginInterface* iFilter);
void loadFilterPlugin(FilterPluginInterface* iFilter);
//void loadFilterPlugin(FilterPluginInterface* iFilter);
void loadIOMeshPlugin(IOMeshPluginInterface* iIOMesh);
void loadIORasterPlugin(IORasterPluginInterface* iIORaster);
void loadDecoratePlugin(DecoratePluginInterface* iDecorate);
void loadRenderPlugin(RenderPluginInterface* iRender);
void loadEditPlugin(EditPluginInterfaceFactory* iEditFactory);
void unloadFilterPlugin(FilterPluginInterface* iFilter);
//void unloadFilterPlugin(FilterPluginInterface* iFilter);
void unloadIOMeshPlugin(IOMeshPluginInterface* iIOMesh);
void unloadIORasterPlugin(IORasterPluginInterface* iIORaster);
void unloadDecoratePlugin(DecoratePluginInterface* iDecorate);

View File

@ -25,48 +25,7 @@
#define MESHLAB_PLUGIN_MANAGER_ITERATORS_H
#include "plugin_manager.h"
template <typename PluginType>
class ConstPluginIterator
{
public:
using Container = std::vector<PluginType*>;
using iterator_category = std::forward_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = PluginType*;
using pointer = typename Container::const_iterator;
using reference = PluginType*&;
ConstPluginIterator(
const Container& c,
const pointer& it,
bool iterateAlsoDisabledPlugins = false)
: c(c), m_ptr(it), iterateAlsoDisabledPlugins(iterateAlsoDisabledPlugins)
{
if (m_ptr != c.end() && !iterateAlsoDisabledPlugins && !(*m_ptr)->isEnabled())
++(*this);
}
value_type operator*() const {return *m_ptr; }
pointer operator->() { return m_ptr; }
ConstPluginIterator& operator++() {
if (iterateAlsoDisabledPlugins)
m_ptr++;
else {
do {
m_ptr++;
} while((m_ptr != c.end()) && !(*m_ptr)->isEnabled());
}
return *this;
}
ConstPluginIterator operator++(int) {ConstPluginIterator tmp = *this; ++(*this); return tmp; }
friend bool operator== (const ConstPluginIterator& a, const ConstPluginIterator& b) { return a.m_ptr == b.m_ptr; };
friend bool operator!= (const ConstPluginIterator& a, const ConstPluginIterator& b) { return a.m_ptr != b.m_ptr; };
private:
const Container& c;
pointer m_ptr;
bool iterateAlsoDisabledPlugins;
};
#include "containers/generic_container_iterator.h"
/** Range iterators **/
@ -82,17 +41,17 @@ private:
bool b;
};
class PluginManager::FilterPluginRangeIterator
{
friend class PluginManager;
public:
ConstPluginIterator<FilterPluginInterface> begin() {return ConstPluginIterator<FilterPluginInterface>(pm->filterPlugins, pm->filterPlugins.begin(), b);}
ConstPluginIterator<FilterPluginInterface> end() {return ConstPluginIterator<FilterPluginInterface>(pm->filterPlugins, pm->filterPlugins.end(), b);}
private:
FilterPluginRangeIterator(const PluginManager* pm, bool iterateAlsoDisabledPlugins = false) : pm(pm), b(iterateAlsoDisabledPlugins) {}
const PluginManager* pm;
bool b;
};
//class PluginManager::FilterPluginRangeIterator
//{
// friend class PluginManager;
//public:
// ConstPluginIterator<FilterPluginInterface> begin() {return ConstPluginIterator<FilterPluginInterface>(pm->filterPlugins, pm->filterPlugins.begin(), b);}
// ConstPluginIterator<FilterPluginInterface> end() {return ConstPluginIterator<FilterPluginInterface>(pm->filterPlugins, pm->filterPlugins.end(), b);}
//private:
// FilterPluginRangeIterator(const PluginManager* pm, bool iterateAlsoDisabledPlugins = false) : pm(pm), b(iterateAlsoDisabledPlugins) {}
// const PluginManager* pm;
// bool b;
//};
class PluginManager::IOMeshPluginIterator
{