diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index a1781479d..0015da44b 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -18,6 +18,7 @@ endif() set(HEADERS globals.h plugins/containers/generic_container_iterator.h + plugins/containers/decorate_plugin_container.h plugins/containers/filter_plugin_container.h plugins/containers/iomesh_plugin_container.h plugins/containers/ioraster_plugin_container.h @@ -66,6 +67,7 @@ set(HEADERS set(SOURCES globals.cpp + plugins/containers/decorate_plugin_container.cpp plugins/containers/filter_plugin_container.cpp plugins/containers/iomesh_plugin_container.cpp plugins/containers/ioraster_plugin_container.cpp diff --git a/src/common/common.pro b/src/common/common.pro index 3e29d0dda..63298d60f 100644 --- a/src/common/common.pro +++ b/src/common/common.pro @@ -37,6 +37,7 @@ message(MeshLab Version: $$MESHLAB_VERSION) HEADERS += \ globals.h \ plugins/containers/generic_container_iterator.h \ + plugins/containers/decorate_plugin_container.h \ plugins/containers/filter_plugin_container.h \ plugins/containers/iomesh_plugin_container.h \ plugins/containers/ioraster_plugin_container.h \ @@ -82,6 +83,7 @@ HEADERS += \ SOURCES += \ globals.cpp \ + plugins/containers/decorate_plugin_container.cpp \ plugins/containers/filter_plugin_container.cpp \ plugins/containers/iomesh_plugin_container.cpp \ plugins/containers/ioraster_plugin_container.cpp \ diff --git a/src/common/plugins/containers/decorate_plugin_container.cpp b/src/common/plugins/containers/decorate_plugin_container.cpp new file mode 100644 index 000000000..3f6a05174 --- /dev/null +++ b/src/common/plugins/containers/decorate_plugin_container.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +* 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 "decorate_plugin_container.h" + +DecoratePluginContainer::DecoratePluginContainer() +{ + +} + +void DecoratePluginContainer::clear() +{ + decoratePlugins.clear(); +} + +void DecoratePluginContainer::pushFilterPlugin(DecoratePluginInterface* iDecorate) +{ + decoratePlugins.push_back(iDecorate); + for(QAction *decoratorAction : iDecorate->actions()) { + iDecorate->initGlobalParameterList(decoratorAction, meshlab::defaultGlobalParameterList()); + } +} + +void DecoratePluginContainer::eraseFilterPlugin(DecoratePluginInterface* iDecorate) +{ + decoratePlugins.erase(std::find(decoratePlugins.begin(), decoratePlugins.end(), iDecorate)); +} + +DecoratePluginInterface* DecoratePluginContainer::decoratePlugin(const QString& name) +{ + for(DecoratePluginInterface *tt : decoratePlugins) { + for( QAction *ac: tt->actions()) + if( name == tt->decorationName(ac) ) return tt; + } + return nullptr; +} + +DecoratePluginContainer::DecoratePluginRangeIterator DecoratePluginContainer::decoratePluginIterator(bool iterateAlsoDisabledPlugins) const +{ + return DecoratePluginRangeIterator(this, iterateAlsoDisabledPlugins); +} diff --git a/src/common/plugins/containers/decorate_plugin_container.h b/src/common/plugins/containers/decorate_plugin_container.h new file mode 100644 index 000000000..c68b11f8d --- /dev/null +++ b/src/common/plugins/containers/decorate_plugin_container.h @@ -0,0 +1,67 @@ +/**************************************************************************** +* 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_DECORATE_PLUGIN_CONTAINER_H +#define MESHLAB_DECORATE_PLUGIN_CONTAINER_H + +#include "../interfaces/decorate_plugin_interface.h" +#include "generic_container_iterator.h" + +/** + * @brief The DecoratePluginContainer class allows to organize + * all the decorate 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 DecoratePluginContainer +{ +public: + class DecoratePluginRangeIterator; + DecoratePluginContainer(); + + void clear(); + void pushFilterPlugin(DecoratePluginInterface* iDecorate); + void eraseFilterPlugin(DecoratePluginInterface* iDecorate); + + DecoratePluginInterface* decoratePlugin(const QString& name); + + DecoratePluginRangeIterator decoratePluginIterator(bool iterateAlsoDisabledPlugins = false) const; + +private: + std::vector decoratePlugins; +}; + +class DecoratePluginContainer::DecoratePluginRangeIterator +{ + friend class DecoratePluginContainer; +public: + ConstPluginIterator begin() {return ConstPluginIterator(pm->decoratePlugins, pm->decoratePlugins.begin(), b);} + ConstPluginIterator end() {return ConstPluginIterator(pm->decoratePlugins, pm->decoratePlugins.end(), b);} +private: + DecoratePluginRangeIterator(const DecoratePluginContainer* pm, bool iterateAlsoDisabledPlugins = false) : pm(pm), b(iterateAlsoDisabledPlugins) {} + const DecoratePluginContainer* pm; + bool b; +}; + +#endif // MESHLAB_DECORATE_PLUGIN_CONTAINER_H diff --git a/src/common/plugins/plugin_manager.cpp b/src/common/plugins/plugin_manager.cpp index 09230ea8e..b37010258 100644 --- a/src/common/plugins/plugin_manager.cpp +++ b/src/common/plugins/plugin_manager.cpp @@ -278,12 +278,7 @@ int PluginManager::numberIOPlugins() const // Search among all the decorator plugins the one that contains a decoration with the given name DecoratePluginInterface *PluginManager::getDecoratePlugin(const QString& name) { - for(DecoratePluginInterface *tt : decoratePlugins) { - for( QAction *ac: tt->actions()) - if( name == tt->decorationName(ac) ) return tt; - } - assert(0); - return 0; + return decoratePlugins.decoratePlugin(name); } QAction* PluginManager::filterAction(const QString& name) @@ -381,9 +376,9 @@ PluginManager::RenderPluginRangeIterator PluginManager::renderPluginIterator(boo return RenderPluginRangeIterator(this, iterateAlsoDisabledPlugins); } -PluginManager::DecoratePluginRangeIterator PluginManager::decoratePluginIterator(bool iterateAlsoDisabledPlugins) const +DecoratePluginContainer::DecoratePluginRangeIterator PluginManager::decoratePluginIterator(bool iterateAlsoDisabledPlugins) const { - return DecoratePluginRangeIterator(this, iterateAlsoDisabledPlugins); + return decoratePlugins.decoratePluginIterator(iterateAlsoDisabledPlugins); } PluginManager::EditPluginFactoryRangeIterator PluginManager::editPluginFactoryIterator(bool iterateAlsoDisabledPlugins) const @@ -414,10 +409,7 @@ void PluginManager::checkFilterPlugin(FilterPluginInterface* iFilter) void PluginManager::loadDecoratePlugin(DecoratePluginInterface* iDecorate) { - decoratePlugins.push_back(iDecorate); - for(QAction *decoratorAction : iDecorate->actions()) { - iDecorate->initGlobalParameterList(decoratorAction, meshlab::defaultGlobalParameterList()); - } + decoratePlugins.pushFilterPlugin(iDecorate); } void PluginManager::loadRenderPlugin(RenderPluginInterface* iRender) @@ -432,7 +424,7 @@ void PluginManager::loadEditPlugin(EditPluginInterfaceFactory* iEditFactory) void PluginManager::unloadDecoratePlugin(DecoratePluginInterface* iDecorate) { - decoratePlugins.erase(std::find(decoratePlugins.begin(), decoratePlugins.end(), iDecorate)); + decoratePlugins.eraseFilterPlugin(iDecorate); } void PluginManager::unloadRenderPlugin(RenderPluginInterface* iRender) diff --git a/src/common/plugins/plugin_manager.h b/src/common/plugins/plugin_manager.h index aa046cfc8..b5de5c8c6 100644 --- a/src/common/plugins/plugin_manager.h +++ b/src/common/plugins/plugin_manager.h @@ -24,13 +24,10 @@ #ifndef MESHLAB_PLUGIN_MANAGER_H #define MESHLAB_PLUGIN_MANAGER_H -#include "interfaces/filter_plugin_interface.h" -#include "interfaces/iomesh_plugin_interface.h" -#include "interfaces/ioraster_plugin_interface.h" #include "interfaces/render_plugin_interface.h" -#include "interfaces/decorate_plugin_interface.h" #include "interfaces/edit_plugin_interface.h" +#include "containers/decorate_plugin_container.h" #include "containers/filter_plugin_container.h" #include "containers/iomesh_plugin_container.h" #include "containers/ioraster_plugin_container.h" @@ -51,7 +48,6 @@ public: /** Iterators (definitions can be found in plugin_manager_iterators.h) **/ class PluginRangeIterator; class RenderPluginRangeIterator; - class DecoratePluginRangeIterator; class EditPluginFactoryRangeIterator; /** Member functions **/ @@ -95,7 +91,7 @@ public: IOMeshPluginContainer::IOMeshPluginRangeIterator ioMeshPluginIterator(bool iterateAlsoDisabledPlugins = false) const; IORasterPluginContainer::IORasterPluginRangeIterator ioRasterPluginIterator(bool iterateAlsoDisabledPlugins = false) const; RenderPluginRangeIterator renderPluginIterator(bool iterateAlsoDisabledPlugins = false) const; - DecoratePluginRangeIterator decoratePluginIterator(bool iterateAlsoDisabledPlugins = false) const; + DecoratePluginContainer::DecoratePluginRangeIterator decoratePluginIterator(bool iterateAlsoDisabledPlugins = false) const; EditPluginFactoryRangeIterator editPluginFactoryIterator(bool iterateAlsoDisabledPlugins = false) const; private: @@ -116,7 +112,8 @@ private: std::vector renderPlugins; //Decorate Plugins - std::vector decoratePlugins; + DecoratePluginContainer decoratePlugins; + //std::vector decoratePlugins; //Edit Plugins std::vector editPlugins; diff --git a/src/common/plugins/plugin_manager_iterators.h b/src/common/plugins/plugin_manager_iterators.h index e55e8a6a3..000f3a24f 100644 --- a/src/common/plugins/plugin_manager_iterators.h +++ b/src/common/plugins/plugin_manager_iterators.h @@ -43,20 +43,6 @@ private: bool b; }; -class PluginManager::DecoratePluginRangeIterator -{ - friend class PluginManager; -public: - ConstPluginIterator begin() {return ConstPluginIterator(pm->decoratePlugins, pm->decoratePlugins.begin(), b);} - ConstPluginIterator end() {return ConstPluginIterator(pm->decoratePlugins, pm->decoratePlugins.end(), b);} - //std::vector::const_iterator begin() {return pm->decoratePlugins.begin();} - //std::vector::const_iterator end() {return pm->decoratePlugins.end();} -private: - DecoratePluginRangeIterator(const PluginManager* pm, bool iterateAlsoDisabledPlugins = false) : pm(pm), b(iterateAlsoDisabledPlugins) {} - const PluginManager* pm; - bool b; -}; - class PluginManager::EditPluginFactoryRangeIterator { friend class PluginManager;