mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-15 17:14:39 +00:00
FilterPluginContainer to manage FilterPlugins in PluginManager
This commit is contained in:
parent
3beef1f0a5
commit
ce6693d80a
@ -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
|
||||
|
||||
68
src/common/plugins/containers/filter_plugin_container.cpp
Normal file
68
src/common/plugins/containers/filter_plugin_container.cpp
Normal 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);
|
||||
}
|
||||
68
src/common/plugins/containers/filter_plugin_container.h
Normal file
68
src/common/plugins/containers/filter_plugin_container.h
Normal 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
|
||||
48
src/common/plugins/containers/generic_container_iterator.h
Normal file
48
src/common/plugins/containers/generic_container_iterator.h
Normal 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
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user