diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 1751d6f3a..0366049f6 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -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 diff --git a/src/common/plugins/containers/filter_plugin_container.cpp b/src/common/plugins/containers/filter_plugin_container.cpp new file mode 100644 index 000000000..782fd9374 --- /dev/null +++ b/src/common/plugins/containers/filter_plugin_container.cpp @@ -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); +} diff --git a/src/common/plugins/containers/filter_plugin_container.h b/src/common/plugins/containers/filter_plugin_container.h new file mode 100644 index 000000000..919b34b79 --- /dev/null +++ b/src/common/plugins/containers/filter_plugin_container.h @@ -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 filterPlugins; + QMap actionFilterMap; +}; + +class FilterPluginContainer::FilterPluginRangeIterator +{ + friend class FilterPluginContainer; +public: + ConstPluginIterator begin() {return ConstPluginIterator(pm->filterPlugins, pm->filterPlugins.begin(), b);} + ConstPluginIterator end() {return ConstPluginIterator(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 diff --git a/src/common/plugins/containers/generic_container_iterator.h b/src/common/plugins/containers/generic_container_iterator.h new file mode 100644 index 000000000..209def61a --- /dev/null +++ b/src/common/plugins/containers/generic_container_iterator.h @@ -0,0 +1,48 @@ +#ifndef HEADERFILE_H +#define HEADERFILE_H + +#include + +template +class ConstPluginIterator +{ +public: + using Container = std::vector; + 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 diff --git a/src/common/plugins/plugin_manager.cpp b/src/common/plugins/plugin_manager.cpp index 09c27a2e3..474d9dcd0 100644 --- a/src/common/plugins/plugin_manager.cpp +++ b/src/common/plugins/plugin_manager.cpp @@ -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(plugin)); } if (type.isFilterPlugin()){ - loadFilterPlugin(qobject_cast(plugin)); + filterPlugins.pushFilterPlugin(qobject_cast(plugin)); + //loadFilterPlugin(qobject_cast(plugin)); } if (type.isIOMeshPlugin()){ loadIOMeshPlugin(qobject_cast(plugin)); @@ -237,7 +232,8 @@ void PluginManager::unloadPlugin(PluginFileInterface* ifp) unloadEditPlugin(dynamic_cast(ifp)); } if (type.isFilterPlugin()){ - unloadFilterPlugin(dynamic_cast(ifp)); + filterPlugins.eraseFilterPlugin(dynamic_cast(ifp)); + //unloadFilterPlugin(dynamic_cast(ifp)); } if (type.isIOMeshPlugin()){ unloadIOMeshPlugin(dynamic_cast(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) { diff --git a/src/common/plugins/plugin_manager.h b/src/common/plugins/plugin_manager.h index 517570074..841ff20ec 100644 --- a/src/common/plugins/plugin_manager.h +++ b/src/common/plugins/plugin_manager.h @@ -31,6 +31,8 @@ #include "interfaces/decorate_plugin_interface.h" #include "interfaces/edit_plugin_interface.h" +#include "containers/filter_plugin_container.h" + #include #include #include @@ -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 inputRasterFormatToPluginMap; //Filter Plugins - std::vector filterPlugins; - QMap actionFilterMap; + FilterPluginContainer filterPlugins; + //std::vector filterPlugins; + //QMap actionFilterMap; //Render Plugins std::vector 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); diff --git a/src/common/plugins/plugin_manager_iterators.h b/src/common/plugins/plugin_manager_iterators.h index 5557ec143..6eace5cb1 100644 --- a/src/common/plugins/plugin_manager_iterators.h +++ b/src/common/plugins/plugin_manager_iterators.h @@ -25,48 +25,7 @@ #define MESHLAB_PLUGIN_MANAGER_ITERATORS_H #include "plugin_manager.h" - -template -class ConstPluginIterator -{ -public: - using Container = std::vector; - 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 begin() {return ConstPluginIterator(pm->filterPlugins, pm->filterPlugins.begin(), b);} - ConstPluginIterator end() {return ConstPluginIterator(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 begin() {return ConstPluginIterator(pm->filterPlugins, pm->filterPlugins.begin(), b);} +// ConstPluginIterator end() {return ConstPluginIterator(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 {