Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Committer:
duncanFrance
Date:
Sun May 08 14:42:08 2016 +0000
Revision:
12:63db16fea709
Child:
15:e69fd74d42e4
Update to handle dirty pixels and geometric change/damage

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 12:63db16fea709 18 _widgets.remove(widget);
duncanFrance 12:63db16fea709 19 widget->setParent(NULL);
duncanFrance 12:63db16fea709 20 dirty();
duncanFrance 12:63db16fea709 21 }
duncanFrance 12:63db16fea709 22
duncanFrance 12:63db16fea709 23 void Window::dirtyAll() {
duncanFrance 12:63db16fea709 24 if(!_dirtying) {
duncanFrance 12:63db16fea709 25
duncanFrance 12:63db16fea709 26 _dirtying = true;
duncanFrance 12:63db16fea709 27
duncanFrance 12:63db16fea709 28 _dirty();
duncanFrance 12:63db16fea709 29
duncanFrance 12:63db16fea709 30 Widget *w;
duncanFrance 12:63db16fea709 31 _widgets.reset();
duncanFrance 12:63db16fea709 32
duncanFrance 12:63db16fea709 33 while((w = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 34 w->dirtyAll();
duncanFrance 12:63db16fea709 35 }
duncanFrance 12:63db16fea709 36
duncanFrance 12:63db16fea709 37 _dirtying = false;
duncanFrance 12:63db16fea709 38 }
duncanFrance 12:63db16fea709 39 }
duncanFrance 12:63db16fea709 40
duncanFrance 12:63db16fea709 41 void Window::_draw()
duncanFrance 12:63db16fea709 42 {
duncanFrance 12:63db16fea709 43 Widget::_draw();
duncanFrance 12:63db16fea709 44
duncanFrance 12:63db16fea709 45 Widget* w;
duncanFrance 12:63db16fea709 46
duncanFrance 12:63db16fea709 47 // Draw only the damaged widgets first
duncanFrance 12:63db16fea709 48 LinkedList<Widget> _damaged;
duncanFrance 12:63db16fea709 49
duncanFrance 12:63db16fea709 50 _widgets.reset();
duncanFrance 12:63db16fea709 51 while((w = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 52 if(w->isDamaged()) {
duncanFrance 12:63db16fea709 53 _damaged.appendOnce(w);
duncanFrance 12:63db16fea709 54 w->adjust();
duncanFrance 12:63db16fea709 55 w->draw();
duncanFrance 12:63db16fea709 56 }
duncanFrance 12:63db16fea709 57 }
duncanFrance 12:63db16fea709 58
duncanFrance 12:63db16fea709 59 _damaged.reset();
duncanFrance 12:63db16fea709 60 while((w = _damaged.next()) != NULL) {
duncanFrance 12:63db16fea709 61 _dirtyIntersected(w);
duncanFrance 12:63db16fea709 62 }
duncanFrance 12:63db16fea709 63 _damaged.clear();
duncanFrance 12:63db16fea709 64
duncanFrance 12:63db16fea709 65 _widgets.reset();
duncanFrance 12:63db16fea709 66 while((w = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 67 w->draw();
duncanFrance 12:63db16fea709 68 }
duncanFrance 12:63db16fea709 69 }
duncanFrance 12:63db16fea709 70
duncanFrance 12:63db16fea709 71 void Window::_dirtyIntersected(Widget *w)
duncanFrance 12:63db16fea709 72 {
duncanFrance 12:63db16fea709 73 Widget *o;
duncanFrance 12:63db16fea709 74 _widgets.reset();
duncanFrance 12:63db16fea709 75 while((o = _widgets.next()) != NULL) {
duncanFrance 12:63db16fea709 76 if((o != w) && o->intersects(w)) {
duncanFrance 12:63db16fea709 77 o->dirtyAll();
duncanFrance 12:63db16fea709 78 }
duncanFrance 12:63db16fea709 79 }
duncanFrance 12:63db16fea709 80 }
duncanFrance 12:63db16fea709 81