#ifndef CVVISUAL_MATCH_SETTINGS_SELECTOR
#define CVVISUAL_MATCH_SETTINGS_SELECTOR

#include <vector>

#include "opencv2/features2d.hpp"

#include "matchsettings.hpp"
#include "../registerhelper.hpp"

namespace cvv{ namespace qtutil{

/**
 * @brief this class can use diffrent MatchSettings
 * you can register functios which take a std::vector<cv::DMatch> as argument.
 */
class MatchSettingsSelector:public MatchSettings, public RegisterHelper<MatchSettings,std::vector<cv::DMatch>>{

	Q_OBJECT

public:
	/**
	 * @brief the constructor
	 */
	MatchSettingsSelector(const std::vector<cv::DMatch>& univers,QWidget * parent=nullptr);

	/**
	 * @brief set settings o the given match
	 *
	 */
	virtual void setSettings(CVVMatch &match)override;

public slots:

	/**
	 * @brief emits the remove signal this
	 */
	void removeMe()
		{emit remove(this);}

signals:
	/**
	 * @brief this signal will be emit if this selector should be removed
	 */
	void remove(MatchSettingsSelector*);
private slots:

	/**
	 * @brief swap the current MatchSetting if the user choose another.
	 */
	virtual void changedSetting();

private:
	MatchSettings * setting_=nullptr;
	std::vector<cv::DMatch> univers_;
	QLayout * layout_;

};

template <class Setting>
bool registerMatchSettings(const QString &name)
{
	return MatchSettingsSelector::registerElement(
	    name, [](std::vector<cv::DMatch> univers)
	{
		    return std::unique_ptr<MatchSettings>{ new Setting{univers}};
	});
}

}}

#endif