el h / SimpleGUI

Fork of SimpleGUI by Duncan McIntyre

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Window.cpp Source File

Window.cpp

00001 #include "Window.h"
00002 
00003 Window::Window(GraphicsContext* context) : Widget(context), _childHandledEvents(0) 
00004 {
00005     setSize(context->display()->width(), context->display()->height());
00006 }
00007 
00008 void Window::attach(Widget *widget)
00009 {
00010     _widgets.append(widget);
00011     widget->setParent(this);
00012     _reenumerateEvents();
00013     widget->show();
00014     dirtyAll();
00015     damage();
00016 }
00017 
00018 
00019 void Window::detach(Widget *widget)
00020 {
00021     widget->hide();
00022     _widgets.remove(widget);
00023     widget->setParent(NULL);
00024     _reenumerateEvents();
00025     dirty();
00026 }
00027 
00028 void Window::dirtyAll() {
00029     if(!_dirtying) {
00030         
00031         _dirtying = true;
00032         
00033         _dirty();
00034         
00035         Widget *w;
00036         _widgets.reset();
00037         
00038         while((w = _widgets.next()) != NULL) {
00039             w->dirtyAll();
00040         }
00041         
00042         _dirtying = false;
00043     }
00044 }
00045 
00046 void Window::_draw()
00047 {
00048     Widget::_draw();
00049     
00050     Widget* w;
00051 
00052     // Draw only the damaged widgets first
00053     LinkedList<Widget> _damaged;
00054     
00055     _widgets.reset();
00056     while((w = _widgets.next()) != NULL) {
00057         if(w->isDamaged()) {
00058             _damaged.appendOnce(w);
00059             w->adjust();
00060             w->draw();
00061         }
00062     }
00063     
00064     _damaged.reset();
00065     while((w = _damaged.next()) != NULL) {
00066             _dirtyIntersected(w);
00067     }
00068     _damaged.clear();
00069     
00070     _widgets.reset();
00071     while((w = _widgets.next()) != NULL) {
00072         w->draw();
00073     }
00074 }
00075 
00076 void Window::_dirtyIntersected(Widget *w)
00077 {
00078     Widget *o;
00079     LinkedListIterator<Widget> it = _widgets.getIterator();
00080     while((o = it.next()) != NULL) {
00081         if((o != w) && o->intersects(w)) {
00082             o->dirtyAll();
00083         }
00084     }
00085 }
00086 
00087 void Window::handleEvent(Event e) {
00088     Widget::handleEvent(e);
00089     // At this point we can do bubbling, cancelling etc. One day
00090     if(_childHandledEvents & e.type) {
00091         LinkedListIterator<Widget> it = _widgets.getIterator();
00092         Widget *w;
00093         while((w = it.next()) != NULL) {
00094             w->handleEvent(e);
00095         }
00096     }
00097 }
00098 
00099 void Window::_reenumerateHandledEvents() {
00100         
00101     Widget::_reenumerateHandledEvents();
00102     
00103     _childHandledEvents = 0;
00104     Widget *w;
00105     LinkedListIterator<Widget> wit = _widgets.getIterator();
00106     while((w = wit.next()) != NULL) {
00107         _childHandledEvents |= w->_getHandledEvents();
00108         w = _widgets.next();
00109     }
00110 }
00111 
00112 uint16_t Window::_getHandledEvents() {
00113     uint16_t m = Widget::_getHandledEvents();
00114     m |= _childHandledEvents;
00115     return m;
00116 }