Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Widgets/SpinnerWidget.cpp@17:5184762fda6c, 2016-05-22 (annotated)
- Committer:
- duncanFrance
- Date:
- Sun May 22 16:35:23 2016 +0000
- Revision:
- 17:5184762fda6c
- Parent:
- 13:6714534e7974
Improved Window attach/detach handling; Improved TextWidget MIDDLE layout for multi-line
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
duncanFrance | 11:b485561aa112 | 1 | #include "SpinnerWidget.h" |
duncanFrance | 11:b485561aa112 | 2 | |
duncanFrance | 13:6714534e7974 | 3 | #include"resources/BlueButtonLeft_50x64_bmp.h" |
duncanFrance | 13:6714534e7974 | 4 | #include"resources/BlueButtonRight_50x64_bmp.h" |
duncanFrance | 11:b485561aa112 | 5 | |
duncanFrance | 12:63db16fea709 | 6 | SpinnerWidget::SpinnerWidget(GraphicsContext *context) |
duncanFrance | 12:63db16fea709 | 7 | : ContainerWidget(context), |
duncanFrance | 12:63db16fea709 | 8 | _upArrow(context), _text(context), _downArrow(context), |
duncanFrance | 12:63db16fea709 | 9 | _min(0), _max(0), _increment(0.5), _value(0), |
duncanFrance | 12:63db16fea709 | 10 | _format(""), _buf("") |
duncanFrance | 11:b485561aa112 | 11 | { |
duncanFrance | 12:63db16fea709 | 12 | |
duncanFrance | 13:6714534e7974 | 13 | setLayout(FIXED); |
duncanFrance | 13:6714534e7974 | 14 | setBorder(1, White); |
duncanFrance | 13:6714534e7974 | 15 | setPadding(1); |
duncanFrance | 13:6714534e7974 | 16 | _upArrow.setBitmap(BlueButtonLeft_50x64_bmp, 50, 64); |
duncanFrance | 13:6714534e7974 | 17 | _downArrow.setBitmap(BlueButtonRight_50x64_bmp, 50, 64); |
duncanFrance | 13:6714534e7974 | 18 | |
duncanFrance | 13:6714534e7974 | 19 | // Calculate these here to take account of border and margin settings |
duncanFrance | 13:6714534e7974 | 20 | // since BitmapWidgets resize themselves rather than clip (!) |
duncanFrance | 13:6714534e7974 | 21 | setSize( |
duncanFrance | 13:6714534e7974 | 22 | context->display()->width(), |
duncanFrance | 13:6714534e7974 | 23 | _upArrow.height() + 2*(_borderWidth+_padding) |
duncanFrance | 13:6714534e7974 | 24 | ); |
duncanFrance | 13:6714534e7974 | 25 | |
duncanFrance | 13:6714534e7974 | 26 | _upArrow.setLocation( |
duncanFrance | 13:6714534e7974 | 27 | _borderWidth + _padding, |
duncanFrance | 13:6714534e7974 | 28 | _borderWidth + _padding |
duncanFrance | 13:6714534e7974 | 29 | ); |
duncanFrance | 13:6714534e7974 | 30 | |
duncanFrance | 13:6714534e7974 | 31 | _downArrow.setLocation( |
duncanFrance | 13:6714534e7974 | 32 | width() - _downArrow.width() - (_borderWidth + _padding), |
duncanFrance | 13:6714534e7974 | 33 | _borderWidth + _padding |
duncanFrance | 13:6714534e7974 | 34 | ); |
duncanFrance | 13:6714534e7974 | 35 | |
duncanFrance | 12:63db16fea709 | 36 | |
duncanFrance | 13:6714534e7974 | 37 | int textWidth = width() |
duncanFrance | 13:6714534e7974 | 38 | - _upArrow.width() - 2*(_borderWidth + _padding) |
duncanFrance | 13:6714534e7974 | 39 | - _downArrow.width() - 2*(_borderWidth + _padding) |
duncanFrance | 13:6714534e7974 | 40 | ; |
duncanFrance | 13:6714534e7974 | 41 | |
duncanFrance | 13:6714534e7974 | 42 | int textHeight = height() - 2*(_borderWidth + _padding +1); |
duncanFrance | 12:63db16fea709 | 43 | |
duncanFrance | 13:6714534e7974 | 44 | _text.setSize(textWidth, textHeight); |
duncanFrance | 13:6714534e7974 | 45 | _text.setLocation(_downArrow.width() + _borderWidth + _padding, _borderWidth + _padding); |
duncanFrance | 12:63db16fea709 | 46 | _text.setForeground(White); |
duncanFrance | 12:63db16fea709 | 47 | _text.setBackground(Black); |
duncanFrance | 17:5184762fda6c | 48 | _text.setVAlign(TextWidget::MIDDLE); |
duncanFrance | 12:63db16fea709 | 49 | |
duncanFrance | 12:63db16fea709 | 50 | EventHandler* up = new EventHandler(TOUCH_TAP, this, &SpinnerWidget::_onUpClick); |
duncanFrance | 12:63db16fea709 | 51 | EventHandler* down = new EventHandler(TOUCH_TAP, this, &SpinnerWidget::_onDownClick); |
duncanFrance | 12:63db16fea709 | 52 | |
duncanFrance | 12:63db16fea709 | 53 | attach(&_upArrow); |
duncanFrance | 12:63db16fea709 | 54 | attach(&_text); |
duncanFrance | 12:63db16fea709 | 55 | attach(&_downArrow); |
duncanFrance | 12:63db16fea709 | 56 | |
duncanFrance | 12:63db16fea709 | 57 | _upArrow.setEventHandler(up); |
duncanFrance | 12:63db16fea709 | 58 | _downArrow.setEventHandler(down); |
duncanFrance | 11:b485561aa112 | 59 | } |
duncanFrance | 11:b485561aa112 | 60 | |
duncanFrance | 17:5184762fda6c | 61 | TextWidget *SpinnerWidget::getTextWidget() { |
duncanFrance | 17:5184762fda6c | 62 | return &_text; |
duncanFrance | 17:5184762fda6c | 63 | } |
duncanFrance | 17:5184762fda6c | 64 | |
duncanFrance | 11:b485561aa112 | 65 | void SpinnerWidget::setMin(float min) |
duncanFrance | 11:b485561aa112 | 66 | { |
duncanFrance | 12:63db16fea709 | 67 | if(_min != min) { |
duncanFrance | 12:63db16fea709 | 68 | _min = min; |
duncanFrance | 12:63db16fea709 | 69 | dirty(); |
duncanFrance | 12:63db16fea709 | 70 | } |
duncanFrance | 11:b485561aa112 | 71 | } |
duncanFrance | 11:b485561aa112 | 72 | |
duncanFrance | 11:b485561aa112 | 73 | void SpinnerWidget::setMax(float max) |
duncanFrance | 11:b485561aa112 | 74 | { |
duncanFrance | 12:63db16fea709 | 75 | if(_max != max) { |
duncanFrance | 12:63db16fea709 | 76 | _max = max; |
duncanFrance | 12:63db16fea709 | 77 | dirty(); |
duncanFrance | 12:63db16fea709 | 78 | } |
duncanFrance | 11:b485561aa112 | 79 | } |
duncanFrance | 11:b485561aa112 | 80 | |
duncanFrance | 11:b485561aa112 | 81 | void SpinnerWidget::setIncrement(float increment) |
duncanFrance | 11:b485561aa112 | 82 | { |
duncanFrance | 12:63db16fea709 | 83 | if(_increment != increment) { |
duncanFrance | 12:63db16fea709 | 84 | _increment = increment; |
duncanFrance | 12:63db16fea709 | 85 | dirty(); |
duncanFrance | 12:63db16fea709 | 86 | } |
duncanFrance | 11:b485561aa112 | 87 | } |
duncanFrance | 11:b485561aa112 | 88 | |
duncanFrance | 11:b485561aa112 | 89 | void SpinnerWidget::setValue(float value) |
duncanFrance | 11:b485561aa112 | 90 | { |
duncanFrance | 12:63db16fea709 | 91 | if(_value != value) { |
duncanFrance | 12:63db16fea709 | 92 | _value = value; |
duncanFrance | 12:63db16fea709 | 93 | dirty(); |
duncanFrance | 12:63db16fea709 | 94 | } |
duncanFrance | 12:63db16fea709 | 95 | } |
duncanFrance | 12:63db16fea709 | 96 | |
duncanFrance | 12:63db16fea709 | 97 | void SpinnerWidget::setFormat(const char* format) |
duncanFrance | 12:63db16fea709 | 98 | { |
duncanFrance | 12:63db16fea709 | 99 | _format = format; |
duncanFrance | 12:63db16fea709 | 100 | dirty(); |
duncanFrance | 12:63db16fea709 | 101 | } |
duncanFrance | 12:63db16fea709 | 102 | |
duncanFrance | 12:63db16fea709 | 103 | |
duncanFrance | 12:63db16fea709 | 104 | float SpinnerWidget::getMin() |
duncanFrance | 12:63db16fea709 | 105 | { |
duncanFrance | 12:63db16fea709 | 106 | return _min; |
duncanFrance | 11:b485561aa112 | 107 | } |
duncanFrance | 11:b485561aa112 | 108 | |
duncanFrance | 12:63db16fea709 | 109 | float SpinnerWidget::getMax() |
duncanFrance | 12:63db16fea709 | 110 | { |
duncanFrance | 12:63db16fea709 | 111 | return _max; |
duncanFrance | 12:63db16fea709 | 112 | } |
duncanFrance | 12:63db16fea709 | 113 | |
duncanFrance | 12:63db16fea709 | 114 | float SpinnerWidget::getIncrement() |
duncanFrance | 11:b485561aa112 | 115 | { |
duncanFrance | 12:63db16fea709 | 116 | return _increment; |
duncanFrance | 12:63db16fea709 | 117 | } |
duncanFrance | 12:63db16fea709 | 118 | |
duncanFrance | 12:63db16fea709 | 119 | float SpinnerWidget::getValue() |
duncanFrance | 12:63db16fea709 | 120 | { |
duncanFrance | 12:63db16fea709 | 121 | return _value; |
duncanFrance | 12:63db16fea709 | 122 | } |
duncanFrance | 12:63db16fea709 | 123 | |
duncanFrance | 12:63db16fea709 | 124 | const char* SpinnerWidget::getFormat() |
duncanFrance | 12:63db16fea709 | 125 | { |
duncanFrance | 12:63db16fea709 | 126 | return _format; |
duncanFrance | 11:b485561aa112 | 127 | } |
duncanFrance | 11:b485561aa112 | 128 | |
duncanFrance | 11:b485561aa112 | 129 | template<typename T> |
duncanFrance | 12:63db16fea709 | 130 | void SpinnerWidget::onChange(T* tptr, void (T::*mptr)(Event)) |
duncanFrance | 11:b485561aa112 | 131 | { |
duncanFrance | 11:b485561aa112 | 132 | _onChange.attach(tptr, mptr); |
duncanFrance | 11:b485561aa112 | 133 | } |
duncanFrance | 11:b485561aa112 | 134 | |
duncanFrance | 12:63db16fea709 | 135 | void SpinnerWidget::setSize(int width, int height) |
duncanFrance | 12:63db16fea709 | 136 | { |
duncanFrance | 12:63db16fea709 | 137 | ContainerWidget::setSize(width, height); |
duncanFrance | 12:63db16fea709 | 138 | } |
duncanFrance | 11:b485561aa112 | 139 | |
duncanFrance | 12:63db16fea709 | 140 | void SpinnerWidget::_dirty() |
duncanFrance | 12:63db16fea709 | 141 | { |
duncanFrance | 12:63db16fea709 | 142 | |
duncanFrance | 12:63db16fea709 | 143 | sprintf(_buf, _format, _value); |
duncanFrance | 12:63db16fea709 | 144 | _text.setText(_buf); |
duncanFrance | 12:63db16fea709 | 145 | |
duncanFrance | 12:63db16fea709 | 146 | ContainerWidget::_dirty(); |
duncanFrance | 11:b485561aa112 | 147 | } |
duncanFrance | 12:63db16fea709 | 148 | |
duncanFrance | 12:63db16fea709 | 149 | |
duncanFrance | 12:63db16fea709 | 150 | void SpinnerWidget::_onUpClick(Event e) |
duncanFrance | 12:63db16fea709 | 151 | { |
duncanFrance | 12:63db16fea709 | 152 | _value += _increment; |
duncanFrance | 12:63db16fea709 | 153 | if(_value > _max) { |
duncanFrance | 12:63db16fea709 | 154 | _value = _max; |
duncanFrance | 12:63db16fea709 | 155 | } |
duncanFrance | 12:63db16fea709 | 156 | dirty(); |
duncanFrance | 12:63db16fea709 | 157 | } |
duncanFrance | 12:63db16fea709 | 158 | |
duncanFrance | 12:63db16fea709 | 159 | void SpinnerWidget::_onDownClick(Event e) |
duncanFrance | 12:63db16fea709 | 160 | { |
duncanFrance | 12:63db16fea709 | 161 | _value -= _increment; |
duncanFrance | 12:63db16fea709 | 162 | if(_value < _min) { |
duncanFrance | 12:63db16fea709 | 163 | _value = _min; |
duncanFrance | 12:63db16fea709 | 164 | } |
duncanFrance | 12:63db16fea709 | 165 | dirty(); |
duncanFrance | 11:b485561aa112 | 166 | } |