Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Committer:
duncanFrance
Date:
Sat May 21 18:02:20 2016 +0000
Revision:
15:e69fd74d42e4
Parent:
12:63db16fea709
Child:
17:5184762fda6c
Make attach and detach register/unregister event handlers if needed.;  - need to move the event handling into widget so we can attach/detach

Who changed what in which revision?

UserRevisionLine numberNew contents of line
duncanFrance 12:63db16fea709 1 #include "Window.h"
duncanFrance 12:63db16fea709 2
duncanFrance 12:63db16fea709 3 Window::Window(GraphicsContext* context) : Widget(context)
duncanFrance 12:63db16fea709 4 {
duncanFrance 12:63db16fea709 5 }
duncanFrance 12:63db16fea709 6
duncanFrance 12:63db16fea709 7 void Window::attach(Widget *widget)
duncanFrance 12:63db16fea709 8 {
duncanFrance 12:63db16fea709 9 _widgets.append(widget);
duncanFrance 12:63db16fea709 10 widget->setParent(this);
duncanFrance 12:63db16fea709 11 dirtyAll();
duncanFrance 12:63db16fea709 12 damage();
duncanFrance 12:63db16fea709 13 }
duncanFrance 12:63db16fea709 14
duncanFrance 12:63db16fea709 15
duncanFrance 12:63db16fea709 16 void Window::detach(Widget *widget)
duncanFrance 12:63db16fea709 17 {
duncanFrance 15:e69fd74d42e4 18 widget->clear();
duncanFrance 12:63db16fea709 19 _widgets.remove(widget);
duncanFrance 12:63db16fea709 20 widget->setParent(NULL);
duncanFrance 12:63db16fea709 21 dirty();
duncanFrance 12:63db16fea709 22 }
duncanFrance 12:63db16fea709 23
duncanFrance 12:63db16fea709 24 void Window::dirtyAll() {
duncanFrance 12:63db16fea709 25 if(!_dirtying) {
duncanFrance 12:63db16fea709 26
duncanFrance 12:63db16fea709 27 _dirtying = true;
duncanFrance 12:63db16fea709 28
duncanFrance 12:63db16fea709 29 _dirty();
duncanFrance 12:63db16fea709 30
duncanFrance 12:63db16fea709 31 Widget *w;
duncanFrance 12:63db16fea709 32 _widgets.reset();
duncanFrance 12:63db16fea709 33
duncanFrance 12:63db16fea709 34 while((w = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 35 w->dirtyAll();
duncanFrance 12:63db16fea709 36 }
duncanFrance 12:63db16fea709 37
duncanFrance 12:63db16fea709 38 _dirtying = false;
duncanFrance 12:63db16fea709 39 }
duncanFrance 12:63db16fea709 40 }
duncanFrance 12:63db16fea709 41
duncanFrance 12:63db16fea709 42 void Window::_draw()
duncanFrance 12:63db16fea709 43 {
duncanFrance 12:63db16fea709 44 Widget::_draw();
duncanFrance 12:63db16fea709 45
duncanFrance 12:63db16fea709 46 Widget* w;
duncanFrance 12:63db16fea709 47
duncanFrance 12:63db16fea709 48 // Draw only the damaged widgets first
duncanFrance 12:63db16fea709 49 LinkedList<Widget> _damaged;
duncanFrance 12:63db16fea709 50
duncanFrance 12:63db16fea709 51 _widgets.reset();
duncanFrance 12:63db16fea709 52 while((w = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 53 if(w->isDamaged()) {
duncanFrance 12:63db16fea709 54 _damaged.appendOnce(w);
duncanFrance 12:63db16fea709 55 w->adjust();
duncanFrance 12:63db16fea709 56 w->draw();
duncanFrance 12:63db16fea709 57 }
duncanFrance 12:63db16fea709 58 }
duncanFrance 12:63db16fea709 59
duncanFrance 12:63db16fea709 60 _damaged.reset();
duncanFrance 12:63db16fea709 61 while((w = _damaged.next()) != NULL) {
duncanFrance 12:63db16fea709 62 _dirtyIntersected(w);
duncanFrance 12:63db16fea709 63 }
duncanFrance 12:63db16fea709 64 _damaged.clear();
duncanFrance 12:63db16fea709 65
duncanFrance 12:63db16fea709 66 _widgets.reset();
duncanFrance 12:63db16fea709 67 while((w = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 68 w->draw();
duncanFrance 12:63db16fea709 69 }
duncanFrance 12:63db16fea709 70 }
duncanFrance 12:63db16fea709 71
duncanFrance 12:63db16fea709 72 void Window::_dirtyIntersected(Widget *w)
duncanFrance 12:63db16fea709 73 {
duncanFrance 12:63db16fea709 74 Widget *o;
duncanFrance 12:63db16fea709 75 _widgets.reset();
duncanFrance 12:63db16fea709 76 while((o = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 77 if((o != w) && o->intersects(w)) {
duncanFrance 12:63db16fea709 78 o->dirtyAll();
duncanFrance 12:63db16fea709 79 }
duncanFrance 12:63db16fea709 80 }
duncanFrance 12:63db16fea709 81 }
duncanFrance 12:63db16fea709 82