Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

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?

UserRevisionLine numberNew 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 }