Blob Blame Raw


#ifndef TNZ_BUTTON_INCLUDED
#define TNZ_BUTTON_INCLUDED

#include "tw/tw.h"
#include "tw/action.h"
#include "traster.h"

#undef DVAPI
#undef DVVAR
#ifdef TWIN_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

class TButtonSet;

class DVAPI TButton : public TWidget, public TCommandSource
{
protected:
	bool m_pressed, m_active;
	int m_border;

	vector<TButtonSet *> *m_buttonSets;
	friend class TButtonSet;

public:
	TButton(TWidget *parent, string name = "button");
	~TButton();

	void repaint();
	void enter(const TPoint &p);
	void leave(const TPoint &p);
	void leftButtonDown(const TMouseEvent &);
	void leftButtonUp(const TMouseEvent &);

	virtual void setTitle(string title) { m_name = title; }
};

class DVAPI TIconButton : public TButton
{
	TRaster32P m_rasterUp, m_rasterDown;

public:
	TIconButton(TWidget *parent, TRaster32P raster, string name = "button");
	TIconButton(TWidget *parent, TRaster32P rasterUp, TRaster32P rasterDown, string name = "button");
	void repaint();
	void leftButtonDown(const TMouseEvent &);
	void leftButtonUp(const TMouseEvent &);
};

class DVAPI TIconToggle : public TButton
{
	TRaster32P m_up, m_down;

public:
	TIconToggle(TWidget *parent,
				TRaster32P up, TRaster32P down,
				string name = "button");
	void repaint();
	void setStatus(bool v);
	bool getStatus();
	void leftButtonDown(const TMouseEvent &e);
	void leftButtonUp(const TMouseEvent &e);
};

class TButtonSetAction
{
public:
	TButtonSetAction(){};
	virtual ~TButtonSetAction(){};
	virtual void sendCommand(string value) = 0;
};

template <class T>
class TButtonSetActionT : public TButtonSetAction
{
public:
	typedef void (T::*CommandMethod)(string);

	T *m_target;
	CommandMethod m_method;

	TButtonSetActionT<T>(T *target, CommandMethod method) : m_target(target), m_method(method){};
	void sendCommand(string value) { (m_target->*m_method)(value); };
};

class DVAPI TButtonSet
{
	std::map<TButton *, string> *m_buttons;
	string m_currentValue;
	TButtonSetAction *m_action;

public:
	TButtonSet();
	~TButtonSet();

private:
	// not implemented
	TButtonSet(const TButtonSet &);
	TButtonSet &operator=(const TButtonSet &);

public:
	void addButton(TButton *button, string value);
	void removeButton(TButton *button);
	void setValue(string value);
	void setValue(TButton *value);
	// Note: setValue fires the buttons actions as well as the buttonset action
	string getValue() { return m_currentValue; };

	void setAction(TButtonSetAction *action);

	void enable(bool on);
};

#endif