Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Widgets/Window.cpp@15:e69fd74d42e4, 2016-05-21 (annotated)
- 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?
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 | 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 |