Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Widgets/ContainerWidget.cpp@18:d849f3ada858, 2016-05-28 (annotated)
- Committer:
- duncanFrance
- Date:
- Sat May 28 14:50:14 2016 +0000
- Revision:
- 18:d849f3ada858
- Parent:
- 13:6714534e7974
Moved the event queue into the EventDispatcher; Improved event handling across Window/Widget
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
duncanFrance | 12:63db16fea709 | 1 | #include "ContainerWidget.h" |
duncanFrance | 12:63db16fea709 | 2 | |
duncanFrance | 12:63db16fea709 | 3 | ContainerWidget::ContainerWidget(GraphicsContext *context) |
duncanFrance | 12:63db16fea709 | 4 | : |
duncanFrance | 12:63db16fea709 | 5 | Window(context), _layout(HORIZONTAL) |
duncanFrance | 12:63db16fea709 | 6 | { |
duncanFrance | 12:63db16fea709 | 7 | } |
duncanFrance | 12:63db16fea709 | 8 | |
duncanFrance | 12:63db16fea709 | 9 | void ContainerWidget::setLayout(Layout l) |
duncanFrance | 12:63db16fea709 | 10 | { |
duncanFrance | 12:63db16fea709 | 11 | if(_layout != l) { |
duncanFrance | 12:63db16fea709 | 12 | _layout = l; |
duncanFrance | 12:63db16fea709 | 13 | damage(); |
duncanFrance | 12:63db16fea709 | 14 | } |
duncanFrance | 12:63db16fea709 | 15 | } |
duncanFrance | 12:63db16fea709 | 16 | |
duncanFrance | 12:63db16fea709 | 17 | void ContainerWidget::setSize(int width, int height) |
duncanFrance | 12:63db16fea709 | 18 | { |
duncanFrance | 12:63db16fea709 | 19 | if(_minWidth != width || _minHeight != height) { |
duncanFrance | 12:63db16fea709 | 20 | _minWidth = width; |
duncanFrance | 12:63db16fea709 | 21 | _minHeight = height; |
duncanFrance | 12:63db16fea709 | 22 | damage(); |
duncanFrance | 12:63db16fea709 | 23 | } |
duncanFrance | 12:63db16fea709 | 24 | Window::setSize(width, height); |
duncanFrance | 12:63db16fea709 | 25 | } |
duncanFrance | 12:63db16fea709 | 26 | |
duncanFrance | 13:6714534e7974 | 27 | void ContainerWidget::attach(Widget *child) |
duncanFrance | 13:6714534e7974 | 28 | { |
duncanFrance | 13:6714534e7974 | 29 | Window::attach(child); |
duncanFrance | 13:6714534e7974 | 30 | if(_layout == FIXED) { |
duncanFrance | 13:6714534e7974 | 31 | // Re-interpret child's location referenced to the container |
duncanFrance | 13:6714534e7974 | 32 | child->setOffset(x(), y()); |
duncanFrance | 13:6714534e7974 | 33 | } |
duncanFrance | 13:6714534e7974 | 34 | } |
duncanFrance | 12:63db16fea709 | 35 | |
duncanFrance | 12:63db16fea709 | 36 | void ContainerWidget::_adjust() |
duncanFrance | 12:63db16fea709 | 37 | { |
duncanFrance | 12:63db16fea709 | 38 | setSize(_minWidth, _minHeight); |
duncanFrance | 12:63db16fea709 | 39 | Window::_adjust(); |
duncanFrance | 12:63db16fea709 | 40 | |
duncanFrance | 12:63db16fea709 | 41 | int wx = _inner.x; |
duncanFrance | 12:63db16fea709 | 42 | int wy = _inner.y; |
duncanFrance | 12:63db16fea709 | 43 | int width = 0; |
duncanFrance | 12:63db16fea709 | 44 | int height = 0; |
duncanFrance | 12:63db16fea709 | 45 | |
duncanFrance | 13:6714534e7974 | 46 | |
duncanFrance | 12:63db16fea709 | 47 | |
duncanFrance | 12:63db16fea709 | 48 | Widget *w; |
duncanFrance | 13:6714534e7974 | 49 | |
duncanFrance | 12:63db16fea709 | 50 | _widgets.reset(); |
duncanFrance | 12:63db16fea709 | 51 | |
duncanFrance | 12:63db16fea709 | 52 | while((w = _widgets.next()) != NULL) { |
duncanFrance | 12:63db16fea709 | 53 | |
duncanFrance | 13:6714534e7974 | 54 | if(_layout == FIXED) { |
duncanFrance | 13:6714534e7974 | 55 | w->setOffset(wx, wy); |
duncanFrance | 13:6714534e7974 | 56 | } else { |
duncanFrance | 13:6714534e7974 | 57 | |
duncanFrance | 13:6714534e7974 | 58 | // Position the widgets |
duncanFrance | 13:6714534e7974 | 59 | w->setLocation(wx, wy); |
duncanFrance | 12:63db16fea709 | 60 | |
duncanFrance | 13:6714534e7974 | 61 | if(_layout == HORIZONTAL) { |
duncanFrance | 13:6714534e7974 | 62 | wx += w->width(); |
duncanFrance | 13:6714534e7974 | 63 | if(w->height() > height) { |
duncanFrance | 13:6714534e7974 | 64 | height = w->height(); |
duncanFrance | 13:6714534e7974 | 65 | } |
duncanFrance | 13:6714534e7974 | 66 | } else { |
duncanFrance | 13:6714534e7974 | 67 | wy += w->height(); |
duncanFrance | 13:6714534e7974 | 68 | if(w->width() > width) { |
duncanFrance | 13:6714534e7974 | 69 | width = w->width(); |
duncanFrance | 13:6714534e7974 | 70 | } |
duncanFrance | 12:63db16fea709 | 71 | } |
duncanFrance | 12:63db16fea709 | 72 | } |
duncanFrance | 12:63db16fea709 | 73 | } |
duncanFrance | 12:63db16fea709 | 74 | |
duncanFrance | 13:6714534e7974 | 75 | if(_layout != FIXED) { |
duncanFrance | 13:6714534e7974 | 76 | |
duncanFrance | 13:6714534e7974 | 77 | int neededWidth; |
duncanFrance | 13:6714534e7974 | 78 | int neededHeight; |
duncanFrance | 13:6714534e7974 | 79 | |
duncanFrance | 13:6714534e7974 | 80 | if(_layout == HORIZONTAL) { |
duncanFrance | 13:6714534e7974 | 81 | neededWidth = _padding + _borderWidth + wx - _outer.x; |
duncanFrance | 13:6714534e7974 | 82 | neededHeight = 2 * (_padding + _borderWidth) + height; |
duncanFrance | 13:6714534e7974 | 83 | } else { |
duncanFrance | 13:6714534e7974 | 84 | neededWidth = 2 * (_padding + _borderWidth) + width; |
duncanFrance | 13:6714534e7974 | 85 | neededHeight = _padding + _borderWidth + wy - _outer.y; |
duncanFrance | 13:6714534e7974 | 86 | } |
duncanFrance | 12:63db16fea709 | 87 | |
duncanFrance | 13:6714534e7974 | 88 | if(neededWidth > _outer.width) { |
duncanFrance | 13:6714534e7974 | 89 | setWidth(neededWidth); |
duncanFrance | 13:6714534e7974 | 90 | } |
duncanFrance | 13:6714534e7974 | 91 | |
duncanFrance | 13:6714534e7974 | 92 | if(neededHeight > _outer.height) { |
duncanFrance | 13:6714534e7974 | 93 | setHeight(neededHeight); |
duncanFrance | 13:6714534e7974 | 94 | } |
duncanFrance | 12:63db16fea709 | 95 | |
duncanFrance | 13:6714534e7974 | 96 | if(_layout == VERTICAL_CENTER) { |
duncanFrance | 13:6714534e7974 | 97 | // layout again to center the widgets |
duncanFrance | 13:6714534e7974 | 98 | int center = (_outer.width/2) + _outer.x; |
duncanFrance | 13:6714534e7974 | 99 | _widgets.reset(); |
duncanFrance | 13:6714534e7974 | 100 | while((w = _widgets.next()) != NULL) { |
duncanFrance | 13:6714534e7974 | 101 | w->setLocation(center - (w->width() / 2), w->y()); |
duncanFrance | 13:6714534e7974 | 102 | } |
duncanFrance | 13:6714534e7974 | 103 | } |
duncanFrance | 12:63db16fea709 | 104 | } |
duncanFrance | 12:63db16fea709 | 105 | |
duncanFrance | 12:63db16fea709 | 106 | Window::_adjust(); |
duncanFrance | 12:63db16fea709 | 107 | } |