Files
Webcam/include/engine/ui/widget.cpp

170 lines
4.3 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "ui/widget.h"
using namespace GS;
using namespace GS::S2D;
//------------------------------------------------------------------------------
void Widget::SetParent(Widget *w)
{
if (w != parent)
{
if (parent)
parent->children.Remove(this);
parent = w;
if (parent)
parent->children.Add(this);
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void Widget::SetHidden(bool h)
{
if (h != hidden)
{
hidden = h;
dirty = true;
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
Widget *Widget::GetChild(int id)
{
if (GetId() == id)
return this;
ListForeachPtr(Widget *, w, GetChildren())
if (Widget *match = w->GetChild(id))
return match;
return NULL;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void Widget::Invalidate()
{ dirty = true; }
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
iRect Widget::GetRect() const
{ return iRect(rect.sx, rect.sy, rect.ex, rect.ey); }
void Widget::SetBorderSize(float t, float b, float l, float r)
{
border_size.Set(t, b, l, r);
Invalidate();
}
void Widget::SetHAlign(Align a)
{
h_align = a;
Invalidate();
}
void Widget::SetVAlign(Align a)
{
v_align = a;
Invalidate();
}
void Widget::SetFormattingSize(const Vector2 &s)
{
format = s;
Invalidate();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
Vector2 Widget::GetFormat() const
{
switch (GetType())
{
case WidgetTypeHSizer:
case WidgetTypeVSizer:
break;
default:
return format;
}
// Combine all child formats.
Vector2 total_format(0, 0);
ListForeachPtr(Widget *, w, GetChildren())
{
Vector2 child_format = w->GetFormat();
switch (GetType())
{
case WidgetTypeHSizer:
total_format.x += child_format.x;
total_format.y = total_format.y > child_format.y ? total_format.y : child_format.y;
break;
case WidgetTypeVSizer:
total_format.x = total_format.x > child_format.x ? total_format.x : child_format.x;
total_format.y += child_format.y;
break;
}
}
return total_format * format;
}
//------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
iRect Widget::FormatOutputRect(const iRect &rect, const iRect &clip_rect)
//--------------------------------------------------------------------------------------
{
iRect out_rect(clip_rect.sx, clip_rect.sy, clip_rect.sx + rect.GetWidth(), clip_rect.sy + rect.GetHeight());
switch (h_align)
{
case AlignLeft: break;
case AlignMiddle: out_rect = out_rect.Offset((clip_rect.GetWidth() - rect.GetWidth()) / 2, 0); break;
case AlignRight: out_rect = out_rect.Offset(clip_rect.GetWidth() - rect.GetWidth(), 0); break;
case AlignGrow: out_rect.ex = clip_rect.ex; break;
}
switch (v_align)
{
case AlignTop: break;
case AlignMiddle: out_rect = out_rect.Offset(0, (clip_rect.GetHeight() - rect.GetHeight()) / 2); break;
case AlignBottom: out_rect = out_rect.Offset(0, clip_rect.GetHeight() - rect.GetHeight()); break;
case AlignGrow: out_rect.ey = clip_rect.ey; break;
}
return out_rect;
}
//------------------------------------------------------------------------------
Widget::Widget(int id)
{
object_id = id;
parent = NULL;
format.Set(1, 1);
SetBorderSize();
h_align = AlignMiddle;
v_align = AlignMiddle;
dirty = true;
hidden = false;
type = WidgetTypeBase;
event_table = new EventTable;
}
Widget::~Widget()
{
SetParent(NULL);
ListForeachPtr(Widget *, c, children)
c->SetParent(NULL);
}
//------------------------------------------------------------------------------