#ifndef IPLUGINCONTENTWIDGETCONTEXT_H #define IPLUGINCONTENTWIDGETCONTEXT_H #include #include #include #include #include "plugin_support/ModuleActionParameters.h" class OpenDatabase; class PluginContentWidget; /** This class serves to isolate the plugin from the actual construct in which it is * used. * * It provides interface for operating on the context without needing to many details. * Actual default implementation is in PluginContentWidgetContextBase. * * objectRegistry implementation is from Igor Tandetnik answer to the following question * https://stackoverflow.com/questions/35413745/using-shared-ptr-with-a-generic-registry-or-shared-object-storage-or-not */ class IPluginContentWidgetContext { public: virtual ~IPluginContentWidgetContext() = default; /** Tells the context what to use as a caption for this content widget. * * Depending on the context the caption might not be visible or used as the caption * of a window or tab. */ virtual void setCaption(PluginContentWidget *content, const QString &caption, const QString &hint = {}) = 0; /** Tells the context what icon to use. * * In general the icon is used in a similar place as the caption. * \param iconname Assumed to be the name of an iconresource. The system will look for different * sizes under :/icons//iconname */ virtual void setIcon(PluginContentWidget *content, const QString &iconname) = 0; virtual void showStatusMessage(const QString &msg) = 0; virtual void moduleAction( const QString &module_identifier, QString module_action, const ModuleActionParameters &action_params ) = 0; virtual void addContentWidget(PluginContentWidget *widget) = 0; template bool addObjects(Args&&...args); template bool registerObject(std::shared_ptr object); template std::shared_ptr getObject() const; private: std::map > m_objectRegistry; }; template bool IPluginContentWidgetContext::addObjects(Args&&...args) { std::type_index key(typeid(T)); if (!m_objectRegistry.count(key)) { auto p = std::make_shared(std::forward(args)...); m_objectRegistry[key] = p; return true; } return false; } template bool IPluginContentWidgetContext::registerObject(std::shared_ptr object) { return m_objectRegistry.emplace(std::type_index(typeid(T)), object).second; } template std::shared_ptr IPluginContentWidgetContext::getObject() const { auto it = m_objectRegistry.find(typeid(T)); if (it == m_objectRegistry.end()) { return {}; } return std::static_pointer_cast(it->second); } #endif // IPLUGINCONTENTWIDGETCONTEXT_H