Toshihiro Shimizu 890ddd
#ifndef PLUGIN_PARAM_VIEW_INTERFACE
Toshihiro Shimizu 890ddd
#define PLUGIN_PARAM_VIEW_INTERFACE
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <vector>
Toshihiro Shimizu 890ddd
#include <memory>
Toshihiro Shimizu 890ddd
#include <QWidget>
Toshihiro Shimizu 890ddd
#include "tfx.h"
Toshihiro Shimizu 890ddd
#include "toonz_hostif.h"
Toshihiro Shimizu 890ddd
#include "../include/toonzqt/fxsettings.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* 公開ヘッダからは引っ込められた都合上ここで宣言(内部ではまだ使っているので)  */
Toshihiro Shimizu 890ddd
typedef void *toonz_param_view_handle_t;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* あるパラメータの表示形式 */
Toshihiro Shimizu 890ddd
class ParamView
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	struct Component {
Toshihiro Shimizu 890ddd
		virtual ~Component() {}
Toshihiro Shimizu 890ddd
		virtual QWidget *make_widget(TFx *fx, ParamsPage *page, const char *name) const = 0;
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define TOONZ_DEFINE_COMPONENT(NAME)                                                           \
Toshihiro Shimizu 890ddd
	struct NAME : public Component {                                                           \
Toshihiro Shimizu 890ddd
		QWidget *make_widget(TFx *fx, ParamsPage *page, const char *name) const final override \
Toshihiro Shimizu 890ddd
		{                                                                                      \
Toshihiro Shimizu 890ddd
			return page->new##NAME(fx, name);                                                  \
Toshihiro Shimizu 890ddd
		}                                                                                      \
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(ParamField);
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(LineEdit);
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(Slider);
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(SpinBox);
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(CheckBox);
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(RadioButton);
Toshihiro Shimizu 890ddd
	TOONZ_DEFINE_COMPONENT(ComboBox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef TOONZ_DEFINE_COMPONENT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	ParamView() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ParamView(const ParamView &rhs)
Toshihiro Shimizu 890ddd
		: components_(rhs.components_)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline void add_component(std::shared_ptr<Component> component)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		components_.push_back(std::move(component));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ParamView *clone(TFx *) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new ParamView(*this);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void build(TFx *fx, ParamsPage *page, const char *name) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		for (const auto &component : components_) {
Toshihiro Shimizu 890ddd
			page->addWidget(component->make_widget(fx, page, name));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	std::vector<std::shared_ptr<Component>> components_;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef void *toonz_param_field_handle_t;
Toshihiro Shimizu 890ddd
typedef void *toonz_lineedit_handle_t;
Toshihiro Shimizu 890ddd
typedef void *toonz_slider_handle_t;
Toshihiro Shimizu 890ddd
typedef void *toonz_spinbox_handle_t;
Toshihiro Shimizu 890ddd
typedef void *toonz_checkbox_handle_t;
Toshihiro Shimizu 890ddd
typedef void *toonz_radiobutton_handle_t;
Toshihiro Shimizu 890ddd
typedef void *toonz_combobox_handle_t;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int add_param_field(toonz_param_view_handle_t view, toonz_param_field_handle_t *ParamField);
Toshihiro Shimizu 890ddd
int add_lineedit(toonz_param_view_handle_t view, toonz_lineedit_handle_t *LineEdit);
Toshihiro Shimizu 890ddd
int add_slider(toonz_param_view_handle_t view, toonz_slider_handle_t *Slider);
Toshihiro Shimizu 890ddd
int add_spinbox(toonz_param_view_handle_t view, toonz_spinbox_handle_t *CheckBox);
Toshihiro Shimizu 890ddd
int add_checkbox(toonz_param_view_handle_t view, toonz_checkbox_handle_t *CheckBox);
Toshihiro Shimizu 890ddd
int add_radiobutton(toonz_param_view_handle_t view, toonz_radiobutton_handle_t *RadioButton);
Toshihiro Shimizu 890ddd
int add_combobox(toonz_param_view_handle_t view, toonz_combobox_handle_t *Combobox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef TOONZ_DEFINE_ADD_COMPONENT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif