Revision 1 (by (no author), 2006/09/28 22:53:53) Initial import
/// \file widget.h
/// Class for GUI elements

#ifndef WIDGET_H_INCLUDED
#define WIDGET_H_INCLUDED

#include "event.h"
#include "events.h"

class Widget
{
	public: // Public variables
		int x, y, w, h;
		bool isFocused;
		bool wantKeyboard;
		Widget* parent;
		bool wantRedraw;
		/// For tracking mouse clicks
		int saved_buttons;
		
		Event<> onClick;
		
	public: // Public functions
		Widget(Widget* parent = NULL);
		virtual ~Widget();
		
		bool IsMouseOver();
		
		virtual void WantRedraw();
		virtual void Focus();
		virtual void FocusChild(Widget* child);
		
		virtual void Redraw(RedrawEventArgs* e);
		virtual void KeyDown(KeyEventArgs* e);
		virtual void KeyUp(KeyEventArgs* e);
		virtual void MouseMove(MouseEventArgs* e);
		virtual void MousePress(MouseEventArgs* e);
		virtual void MouseRelease(MouseEventArgs* e);
		virtual void MouseScroll(MouseEventArgs* e);
		
		virtual void MouseClick();
};

struct WidgetRef
{
	WidgetRef(Widget* widget): widget(widget), refs(new int(1))
	{ }
	WidgetRef(const WidgetRef& other): widget(other.widget), refs(other.refs)
	{ ++*refs; }
	~WidgetRef()
	{
		--*refs;
		if(!*refs)
		{
			delete widget;
			delete refs;
		}
	}
	Widget* operator->()
	{ return widget; }
	operator Widget*()
	{ return widget; }
	
	Widget* widget;
	int* refs;
};

#endif

// The end