#include "decorate_plugin_interface.h"

/** \brief
 * This function is called by the framework, for each plugin that has global parameters (e.g. \ref MeshDecorateInterface) at the start of the application.
 * The rationale is to allow to each plugin to have a list of global persistent parameters that can be changed from the meshlab itself and whose value is persistent between different meshlab invocations.
 * A typical example is the background color.
 *
 * For the global parameters the following rules apply:
 *
 * \li there is a <b>hardwired</b> default value: a safe consistent value that is directly coded into the plugin and to which the user can always revert if needed.
 * \li there is a <b>saved</b> value: a value that is stored into a persistent location into the user space (registry/home/library) and it is presented as default value of the parameter at each MeshLab invocation.
 * \li there is a <b>current</b> value: a value that is currently used, different for each document instance and that is not stored permanently.
 *
 * The plugin use the current value to draw its decoration.
 * at startup the current value is always silently initialized to the saved value.
 * User can revert current value to the saved values and to the hardwired values.
 * In the dialog for each parameter some buttons should be present:

 * \li apply: use the currently edited parameter value without saving it anywhere. After the closure of the document these values will be lost.
 * \li load:  load from the saved values
 * \li save:  save to a permanent location the current value (to the registry),
 * \li reset:  revert to the hardwired values

 * If your plugins/action has no GlobalParameter, do nothing.
 * The RichParameterList comes to the StartDecorate already initialized with the values stored on the permanent storage.
 * At the start up the initGlobalParameterList function is called with an empty RichParameterList (to collect the default values)
 * If a filter wants to save some permanent stuff should set the permanent default values.
 */
void DecoratePluginInterface::initGlobalParameterList(const QAction* /*format*/, RichParameterList& /*globalparam*/)
{
}

QAction* DecoratePluginInterface::action(QString name) const
{
	QString n = name;
	foreach(QAction *tt, actions())
		if (name == this->decorationName(ID(tt))) return tt;
	n.replace("&","");
	foreach(QAction *tt, actions())
		if (n == this->decorationName(ID(tt))) return tt;

	qDebug("unable to find the id corresponding to action  '%s'", qUtf8Printable(name));
	return 0;
}

PluginInterface::FilterIDType DecoratePluginInterface::ID(const QAction* a) const
{
	QString aa=a->text();
	foreach(FilterIDType tt, types())
		if (a->text() == this->decorationName(tt)) return tt;
	aa.replace("&","");
	foreach(FilterIDType tt, types())
		if (aa == this->decorationName(tt)) return tt;

	qDebug("unable to find the id corresponding to action  '%s'", qUtf8Printable(a->text()));
	assert(0);
	return -1;
}

PluginInterface::FilterIDType DecoratePluginInterface::ID(QString name) const
{
	QString n = name;
	foreach(FilterIDType tt, types())
		if (name == this->decorationName(tt)) return tt;
	n.replace("&","");
	foreach(FilterIDType tt, types())
		if (n == this->decorationName(tt)) return tt;

	qDebug("unable to find the id corresponding to action  '%s'", qUtf8Printable(name));
	assert(0);
	return -1;
}
