Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SimpleGUI by
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 }
Generated on Tue Jul 12 2022 22:27:14 by
