src/widget/widget_composite.cpp
branchcpp_gui
changeset 6297 4bf29d14edba
parent 6295 a88d8c2cff6e
child 6301 e0251f797d59
equal deleted inserted replaced
6296:3205d21b662f 6297:4bf29d14edba
    15 #include "../table/sprites.h"
    15 #include "../table/sprites.h"
    16 #include "../genworld.h"
    16 #include "../genworld.h"
    17 #include "../helpers.hpp"
    17 #include "../helpers.hpp"
    18 #include "window_events.hpp"
    18 #include "window_events.hpp"
    19 
    19 
       
    20 #include <algorithm>
       
    21 
    20 namespace gui {
    22 namespace gui {
    21 
    23 
    22 
    24 
    23 void CompositeWidget::AddWidget(Widget *wd)
    25 void CompositeWidget::AddWidget(Widget *wi)
    24 {
    26 {
    25 	WidgetId id = wd->GetId();
    27 	Widgets::value_type new_slot = {wi, 0};
    26 	std::pair<WidgetIterator, bool> pib = m_widgets.insert(Widgets::value_type(id, wd));
    28 	m_widgets.push_back(new_slot);
    27 	assert(pib.second);
    29 }
       
    30 
       
    31 CompositeWidget::WidgetIterator CompositeWidget::FindWidget(WidgetId id)
       
    32 {
       
    33 	/* iterate through children */
       
    34 	for (WidgetIterator it = m_widgets.begin(); it != m_widgets.end(); ++it) {
       
    35 		/* get child */
       
    36 		Slot &child = (*it);
       
    37 		/* check its id */
       
    38 		if (child.m_wi == NULL || child.m_wi->m_id != id) continue;
       
    39 		return it;
       
    40 	}
       
    41 	return m_widgets.end();
    28 }
    42 }
    29 
    43 
    30 Widget* CompositeWidget::GetWidget(WidgetId id)
    44 Widget* CompositeWidget::GetWidget(WidgetId id)
    31 {
    45 {
    32 	WidgetIterator it = m_widgets.find(id);
    46 	WidgetIterator it = FindWidget(id);
    33 	return (it != m_widgets.end()) ? (*it).second : NULL;
    47 	return it != m_widgets.end() ? (*it).m_wi : NULL;
    34 }
    48 }
    35 
    49 
    36 Widget* CompositeWidget::RemoveWidget(WidgetId id)
    50 Widget* CompositeWidget::RemoveWidget(WidgetId id)
    37 {
    51 {
    38 	WidgetIterator it = m_widgets.find(id);
    52 	WidgetIterator it = FindWidget(id);
    39 	if (it == m_widgets.end()) return NULL;
    53 	if (it == m_widgets.end()) return NULL;
    40 	Widget *wd = (*it).second;
    54 	Widget *wd = (*it).m_wi;
    41 	assert(wd->m_container == this);
    55 	assert(wd->m_container == this);
    42 	wd->m_container = NULL;
    56 	wd->m_container = NULL;
    43 	m_widgets.erase(it);
    57 	m_widgets.erase(it);
    44 	return wd;
    58 	return wd;
    45 }
    59 }
    48 {
    62 {
    49 	Point16 pt_local = pt_parent - TopLeft();
    63 	Point16 pt_local = pt_parent - TopLeft();
    50 	bool inside_me = m_rect.PtInRect(pt_parent);
    64 	bool inside_me = m_rect.PtInRect(pt_parent);
    51 	for (WidgetReverseIterator rit = m_widgets.rbegin(); rit != m_widgets.rend(); ++rit) {
    65 	for (WidgetReverseIterator rit = m_widgets.rbegin(); rit != m_widgets.rend(); ++rit) {
    52 		/* get next child */
    66 		/* get next child */
    53 		Widget *wd_child = (*rit).second;
    67 		Widget *wd_child = (*rit).m_wi;
    54 		/* ask the child recursively */
    68 		/* ask the child recursively */
    55 		Widget *wd = wd_child->WidgetFromPt(pt_local);
    69 		Widget *wd = wd_child->WidgetFromPt(pt_local);
    56 		if (wd != NULL) {
    70 		if (wd != NULL) {
    57 			/* if the widget we found is inside me it is what we are searching for */
    71 			/* if the widget we found is inside me it is what we are searching for */
    58 			if (inside_me) return wd;
    72 			if (inside_me) return wd;
    69 	/* mark all children as closed in safe way */
    83 	/* mark all children as closed in safe way */
    70 	for (WidgetReverseIterator rit_next = m_widgets.rbegin(); rit_next != m_widgets.rend(); ) {
    84 	for (WidgetReverseIterator rit_next = m_widgets.rbegin(); rit_next != m_widgets.rend(); ) {
    71 		/* save the iterator (it can be invalidated) and move forward */
    85 		/* save the iterator (it can be invalidated) and move forward */
    72 		WidgetReverseIterator rit = rit_next++;
    86 		WidgetReverseIterator rit = rit_next++;
    73 		/* get child */
    87 		/* get child */
    74 		Widget *wd_child = (*rit).second;
    88 		Widget *wd_child = (*rit).m_wi;
    75 		/* tell him we are closing */
    89 		/* tell him we are closing */
    76 		wd_child->Close();
    90 		wd_child->Close();
    77 	}
    91 	}
    78 	/* remove children */
    92 	/* remove children */
    79 	m_widgets.clear();
    93 	m_widgets.clear();
    91 	/* notify all children that we are creating */
   105 	/* notify all children that we are creating */
    92 	for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
   106 	for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
    93 		/* save the iterator (it can be invalidated) and move forward */
   107 		/* save the iterator (it can be invalidated) and move forward */
    94 		WidgetIterator it = it_next++;
   108 		WidgetIterator it = it_next++;
    95 		/* get child */
   109 		/* get child */
    96 		Widget *wd_child = (*it).second;
   110 		Widget *wd_child = (*it).m_wi;
    97 		/* tell him we are creating window */
   111 		/* tell him we are creating window */
    98 		wd_child->OnCreate(ev);
   112 		wd_child->OnCreate(ev);
    99 	}
   113 	}
   100 
   114 
   101 	super::OnCreate(ev);
   115 	super::OnCreate(ev);
   109 	/* paint all children */
   123 	/* paint all children */
   110 	for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
   124 	for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
   111 		/* save the iterator (it can be invalidated) and move forward */
   125 		/* save the iterator (it can be invalidated) and move forward */
   112 		WidgetIterator it = it_next++;
   126 		WidgetIterator it = it_next++;
   113 		/* get child */
   127 		/* get child */
   114 		Widget *wd_child = (*it).second;
   128 		Widget *wd_child = (*it).m_wi;
   115 		/* tell him we are painting */
   129 		/* tell him we are painting */
   116 		ClipDrawContext ctx(wd_child->Left(), wd_child->Top(), wd_child->Width(), wd_child->Height());
   130 		ClipDrawContext ctx(wd_child->Left(), wd_child->Top(), wd_child->Width(), wd_child->Height());
   117 		if (!ctx.IsEmpty()) wd_child->OnPaint(ev);
   131 		if (!ctx.IsEmpty()) wd_child->OnPaint(ev);
   118 	}
   132 	}
   119 }
   133 }
   148 	/* notify all children */
   162 	/* notify all children */
   149 	for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
   163 	for (WidgetIterator it_next = m_widgets.begin(); it_next != m_widgets.end(); ) {
   150 		/* save the iterator (it can be invalidated) and move forward */
   164 		/* save the iterator (it can be invalidated) and move forward */
   151 		WidgetIterator it = it_next++;
   165 		WidgetIterator it = it_next++;
   152 		/* get child */
   166 		/* get child */
   153 		Widget *wd_child = (*it).second;
   167 		Widget *wd_child = (*it).m_wi;
   154 		/* tell him we are resizing */
   168 		/* tell him we are resizing */
   155 		wd_child->OnResizeParent(evp);
   169 		wd_child->OnResizeParent(evp);
   156 	}
   170 	}
   157 	super::OnResize(ev);
   171 	super::OnResize(ev);
   158 }
   172 }