Revision 1 (by (no author), 2006/09/28 22:53:53) Initial import
/// \file widgets.cpp
/// Common Widgets

#include <allegro.h>
#include "widgets.h"

using namespace std;

WidgetPanel::WidgetPanel(Widget* parent): Widget(parent), background(-1)
{
}

void WidgetPanel::FocusChild(Widget* child)
{
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		child->isFocused = *i == child;
	}
}

template <class Type, void (Widget::*Method)(Type*)> void WidgetPanel::PropagateEvent(Type* e)
{
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
		((*i)->*Method)(e);
}

void WidgetPanel::Redraw(RedrawEventArgs* e)
{
	if(background != -1)
		clear_to_color(e->to, background);

	Widget::Redraw(e);
	
	RedrawEventArgs e2;
	e2.off_x = e->off_x + x;
	e2.off_y = e->off_y + y;
	e2.to = e->to;
	
	PropagateEvent<RedrawEventArgs, &Widget::Redraw>(&e2);
}

void WidgetPanel::KeyDown(KeyEventArgs* e)
{
	Widget::KeyDown(e);
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		if((*i)->isFocused || (*i)->wantKeyboard)
			(*i)->KeyDown(e);
	}
}

void WidgetPanel::KeyUp(KeyEventArgs* e)
{
	Widget::KeyUp(e);
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		if((*i)->isFocused || (*i)->wantKeyboard)
			(*i)->KeyUp(e);
	}
}

void WidgetPanel::MouseMove(MouseEventArgs* e)
{
	Widget::MouseMove(e);
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		if(e->x >= (*i)->x && e->x < (*i)->x + (*i)->w && e->y >= (*i)->y && e->y < (*i)->y + (*i)->h)
			(*i)->MouseMove(e);
	}
}

void WidgetPanel::MousePress(MouseEventArgs* e)
{
	Widget::MousePress(e);
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		if(e->x >= (*i)->x && e->x < (*i)->x + (*i)->w && e->y >= (*i)->y && e->y < (*i)->y + (*i)->h)
			(*i)->MousePress(e);
	}
}

void WidgetPanel::MouseRelease(MouseEventArgs* e)
{
	Widget::MouseRelease(e);
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		if(e->x >= (*i)->x && e->x < (*i)->x + (*i)->w && e->y >= (*i)->y && e->y < (*i)->y + (*i)->h)
			(*i)->MouseRelease(e);
	}
}

void WidgetPanel::MouseScroll(MouseEventArgs* e)
{
	Widget::MouseScroll(e);
	for(list<WidgetRef>::iterator i = widgets.begin(); i != widgets.end(); i++)
	{
		if((*i)->isFocused)
			(*i)->MouseScroll(e);
	}
}

Button::Button(Widget* parent): Widget(parent), visible(true)
{
}

void Button::Redraw(RedrawEventArgs* e)
{
	if(!visible)
		return;
		
	int outline_color = makecol(0, 0, 0);
	if(IsMouseOver())
	{
		if(mouse_b & 1)
			outline_color = makecol(255, 255, 255);
		else
			outline_color = makecol(128, 128, 128);
	}
	if(mouse_b & 1 && isFocused)
		outline_color = makecol(255, 255, 255);
	rect(e->to, x, y, x + w, y + h, outline_color);
	rectfill(e->to, x + 1, y + 1, x + w - 1, y + h - 1, makecol(128, 128, 64));
	textprintf_centre_ex(e->to, font, x + w / 2, y + (h - text_height(font)) / 2, makecol(0, 0, 0), -1, "%s", text.c_str());
}

void Button::MouseMove(MouseEventArgs* e)
{
	Widget::MouseMove(e);
	WantRedraw();
}

void Button::MousePress(MouseEventArgs* e)
{
	Widget::MousePress(e);
	WantRedraw();
}

void Button::MouseRelease(MouseEventArgs* e)
{
	Widget::MouseRelease(e);
	WantRedraw();
}

void Button::MouseClick()
{
	if(visible)
		Widget::MouseClick();
}

// The end