| 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