(svn r9091) [cpp_gui] -Codechange: Widgets now use container's coordinate space instead of window's space
/* $Id$ */
#include "../stdafx.h"
#include <stdarg.h>
#include "../openttd.h"
#include "../debug.h"
#include "../functions.h"
#include "../map.h"
#include "../player.h"
#include "../window.h"
#include "../gfx.h"
#include "../viewport.h"
#include "../console.h"
#include "../variables.h"
#include "../table/sprites.h"
#include "../genworld.h"
#include "../helpers.hpp"
#include "window_events.hpp"
namespace gui {
void CompositeWidget::AddWidget(Widget *wd)
{
WidgetId id = wd->GetId();
std::pair<WidgetIterator, bool> pib = m_widgets.insert(Widgets::value_type(id, wd));
assert(pib.second);
}
Widget* CompositeWidget::GetWidget(WidgetId id)
{
WidgetIterator it = m_widgets.find(id);
return (it != m_widgets.end()) ? (*it).second : NULL;
}
Widget* CompositeWidget::RemoveWidget(WidgetId id)
{
WidgetIterator it = m_widgets.find(id);
if (it == m_widgets.end()) return NULL;
Widget *wd = (*it).second;
assert(wd->m_container == this);
wd->m_container = NULL;
m_widgets.erase(it);
return wd;
}
/*virtual*/ Widget* CompositeWidget::WidgetFromPt(const Point16 &pt_parent)
{
Point16 pt_local = pt_parent - TopLeft();
bool inside_me = m_rect.PtInRect(pt_parent);
for (WidgetReverseIterator rit = m_widgets.rbegin(); rit != m_widgets.rend(); ++rit) {
/* get next child */
Widget *wd_child = (*rit).second;
/* ask the child recursively */
Widget *wd = wd_child->WidgetFromPt(pt_local);
if (wd != NULL) {
/* if the widget we found is inside me it is what we are searching for */
if (inside_me) return wd;
/* the point is outside me. The widget is clipped unless it is on-top widget */
if (wd->m_dont_clip) return wd;
/* try next child */
}
}
return inside_me ? this : NULL;
}
/*virtual*/ void CompositeWidget::Close()
{
/* mark all children as closed in safe way */
for (WidgetReverseIterator rit_next = m_widgets.rbegin(); rit_next != m_widgets.rend(); ) {
/* save the iterator (it can be invalidated) and move forward */
WidgetReverseIterator rit = rit_next++;
/* get child */
Widget *wd_child = (*rit).second;
/* tell him we are closing */
wd_child->Close();
}
/* remove children */
m_widgets.clear();
/* mark self as closed */
super::Close();
}
/*virtual*/ void CompositeWidget::OnCreate(EvtCreate &ev)
{
/* create standard children */
CreateWidgets();
/* if there are any non-client widgets, create them */
CreateNcWidgets();
/* notify all children that we are creating */
for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
/* save the iterator (it can be invalidated) and move forward */
WidgetIterator it = it_next++;
/* get child */
Widget *wd_child = (*it).second;
/* tell him we are creating window */
wd_child->OnCreate(ev);
}
super::OnCreate(ev);
}
/*virtual*/ void CompositeWidget::OnPaint(EvtPaint &ev)
{
/* paint background */
DrawBackground(ev);
/* paint all children */
for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
/* save the iterator (it can be invalidated) and move forward */
WidgetIterator it = it_next++;
/* get child */
Widget *wd_child = (*it).second;
/* tell him we are painting */
ClipDrawContext ctx(wd_child->Left(), wd_child->Top(), wd_child->Width(), wd_child->Height());
if (!ctx.IsEmpty()) wd_child->OnPaint(ev);
}
}
/*virtual*/ void CompositeWidget::OnLeftButtonDown(EvtLeftButtonDown &ev)
{
//Point16 pt(ev->we.click.pt.x, ev->we.click.pt.y);
Widget *wd_child = WidgetFromPt(ev.m_pt);
if (wd_child != NULL && wd_child != this) {
wd_child->OnLeftButtonDown(ev);
return;
}
super::OnLeftButtonDown(ev);
}
/*virtual*/ void CompositeWidget::OnRightButtonDown(EvtRightButtonDown &ev)
{
//Point16 pt(ev->we.click.pt.x, ev->we.click.pt.y);
Widget *wd_child = WidgetFromPt(ev.m_pt);
if (wd_child != NULL && wd_child != this) {
wd_child->OnRightButtonDown(ev);
return;
}
super::OnRightButtonDown(ev);
}
/*virtual*/ void CompositeWidget::OnResize(EvtResize &ev)
{
if (ev.m_change == Point16(0, 0)) return;
EvtResizeParent evp(ev);
/* notify all children */
for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
/* save the iterator (it can be invalidated) and move forward */
WidgetIterator it = it_next++;
/* get child */
Widget *wd_child = (*it).second;
/* tell him we are resizing */
wd_child->OnResizeParent(evp);
}
super::OnResize(ev);
}
}; // namespace gui