103 lines
2.7 KiB
C++
103 lines
2.7 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "ui/widget_staticcontainer.h"
|
|
#include "log/log.h"
|
|
|
|
using namespace GS;
|
|
using namespace GS::S2D;
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
ContainerCell *ContainerWidget::GetCell(const Widget *widget) const
|
|
//-------------------------------------------------------------------------
|
|
{
|
|
ListForeachPtr(ContainerCell *, cell, cell_list)
|
|
if (cell->widget == widget)
|
|
return cell;
|
|
return NULL;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
Widget *ContainerWidget::Add(Widget *widget, const iRect &cell_rect)
|
|
{
|
|
if (!widget)
|
|
__ERR__(__LOG_E__ << "Cannot create a cell for a NULL widget.\n", NULL)
|
|
|
|
ContainerCell *cell = new ContainerCell;
|
|
if (!cell)
|
|
__ERR__(__LOG_E__ << "Failed to allocate new container cell.\n", NULL)
|
|
|
|
widget->SetParent(this);
|
|
|
|
cell->cell_rect = cell_rect;
|
|
cell->widget = widget;
|
|
cell_list.Add(cell, true, false);
|
|
|
|
children.Add(widget);
|
|
|
|
return widget;
|
|
}
|
|
bool ContainerWidget::Remove(Widget *widget)
|
|
{
|
|
ContainerCell *e = GetCell(widget);
|
|
if (!e)
|
|
return false;
|
|
|
|
cell_list.Remove(e);
|
|
_safe_delete(e);
|
|
|
|
children.Remove(widget);
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------
|
|
void ContainerWidget::Invalidate()
|
|
//------------------------------------------------
|
|
{
|
|
ListForeachPtr(ContainerCell *, cell, cell_list)
|
|
cell->widget->Invalidate();
|
|
Widget::Invalidate();
|
|
}
|
|
|
|
//---------------------------------------------
|
|
void ContainerWidget::Refresh()
|
|
//---------------------------------------------
|
|
{
|
|
ListForeachPtr(ContainerCell *, cell, cell_list)
|
|
{
|
|
cell->widget->Refresh();
|
|
if (cell->widget->IsDirty())
|
|
dirty = true;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void ContainerWidget::Compose(Picture &output, const iRect &out_rect)
|
|
{
|
|
if (hidden || !dirty || !cell_list.GetCount())
|
|
return;
|
|
|
|
rect = out_rect;
|
|
ListForeachPtr(ContainerCell *, cell, cell_list)
|
|
if (!cell->widget->IsHidden())
|
|
cell->widget->Compose(output, cell->cell_rect.Offset(rect.sx, rect.sy));
|
|
else
|
|
cell->widget->Validate();
|
|
|
|
dirty = false;
|
|
}
|
|
ContainerWidget::~ContainerWidget()
|
|
{
|
|
/*
|
|
Only cells are deleted here since children are handled by the base
|
|
Widget class destructor.
|
|
*/
|
|
ListDeleteAllPtr(ContainerCell *, cell_list)
|
|
}
|
|
//------------------------------------------------------------------------------
|