Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Widgets/Window.cpp@12:63db16fea709, 2016-05-08 (annotated)
- 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?
User | Revision | Line number | New 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 |