GUI parts for DISCO-F746NG. GuiBase, Button, ButtonGroup, ResetButton, Label, BlinkLabel, NumericLabel, SeekBar, SeekbarGroup, NumericUpDown

Dependencies:   Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Dependents:   F746_AudioOutQSPI F746_AudioPlayerSD DISCO-F746NG_test001 F746_SD_WavPlayer ... more

Committer:
MikamiUitOpen
Date:
Sat Apr 30 06:33:32 2016 +0000
Revision:
12:687ec6183385
Parent:
10:5a2068884fd9
Child:
15:0511a08a3c09
13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:a2686ef737c2 1 //-----------------------------------------------------------
MikamiUitOpen 0:a2686ef737c2 2 // SeekBar class
MikamiUitOpen 0:a2686ef737c2 3 //
MikamiUitOpen 12:687ec6183385 4 // 2016/04/30, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:a2686ef737c2 5 //-----------------------------------------------------------
MikamiUitOpen 0:a2686ef737c2 6
MikamiUitOpen 0:a2686ef737c2 7 #include "SeekBar.hpp"
MikamiUitOpen 0:a2686ef737c2 8
MikamiUitOpen 0:a2686ef737c2 9 namespace Mikami
MikamiUitOpen 0:a2686ef737c2 10 {
MikamiUitOpen 6:b8f197b0012c 11 // Constructor with scale value (only horizontal)
MikamiUitOpen 6:b8f197b0012c 12 SeekBar::SeekBar(uint16_t x, uint16_t y, uint16_t length,
MikamiUitOpen 6:b8f197b0012c 13 float min, float max, float initialValue,
MikamiUitOpen 6:b8f197b0012c 14 string left, string center, string right,
MikamiUitOpen 6:b8f197b0012c 15 uint32_t thumbColor,
MikamiUitOpen 6:b8f197b0012c 16 uint16_t thumbSize, uint16_t width,
MikamiUitOpen 6:b8f197b0012c 17 uint32_t colorL, uint32_t colorH,
MikamiUitOpen 6:b8f197b0012c 18 uint32_t backColor)
MikamiUitOpen 6:b8f197b0012c 19 : GuiBase(x, y, Font12, GuiBase::ENUM_TEXT, backColor, thumbColor),
MikamiUitOpen 6:b8f197b0012c 20 L_(length), W_(width),
MikamiUitOpen 6:b8f197b0012c 21 SIZE_(thumbSize), COLOR_L_(colorL), COLOR_H_(colorH),
MikamiUitOpen 12:687ec6183385 22 MIN_(min), MAX_(max), ORIENT_(Holizontal), v_(initialValue),
MikamiUitOpen 12:687ec6183385 23 labelOn_(true), slided_(false), active_(true)
MikamiUitOpen 6:b8f197b0012c 24 {
MikamiUitOpen 6:b8f197b0012c 25 Draw(initialValue);
MikamiUitOpen 12:687ec6183385 26 labelLCR = new Label *[3];
MikamiUitOpen 12:687ec6183385 27 uint16_t y0 = y - thumbSize/2 - 13;
MikamiUitOpen 12:687ec6183385 28 labelLCR[0] = new Label(x, y0, left, Label::CENTER);
MikamiUitOpen 12:687ec6183385 29 labelLCR[1] = new Label(x+length/2, y0, center, Label::CENTER);
MikamiUitOpen 12:687ec6183385 30 labelLCR[2] = new Label(x+length, y0, right, Label::CENTER);
MikamiUitOpen 12:687ec6183385 31 }
MikamiUitOpen 12:687ec6183385 32
MikamiUitOpen 12:687ec6183385 33 SeekBar::~SeekBar()
MikamiUitOpen 12:687ec6183385 34 {
MikamiUitOpen 12:687ec6183385 35 if (labelOn_)
MikamiUitOpen 12:687ec6183385 36 {
MikamiUitOpen 12:687ec6183385 37 for (int n=0; n<3; n++) delete labelLCR[n];
MikamiUitOpen 12:687ec6183385 38 delete[] labelLCR;
MikamiUitOpen 12:687ec6183385 39 }
MikamiUitOpen 6:b8f197b0012c 40 }
MikamiUitOpen 6:b8f197b0012c 41
MikamiUitOpen 0:a2686ef737c2 42 // Slide thumb
MikamiUitOpen 0:a2686ef737c2 43 // If the thumb is not touched, return false
MikamiUitOpen 0:a2686ef737c2 44 bool SeekBar::Slide()
MikamiUitOpen 0:a2686ef737c2 45 {
MikamiUitOpen 5:9c3ea4d4bc6b 46 if (!active_) return false;
MikamiUitOpen 5:9c3ea4d4bc6b 47
MikamiUitOpen 0:a2686ef737c2 48 if (!PanelTouched())
MikamiUitOpen 0:a2686ef737c2 49 {
MikamiUitOpen 0:a2686ef737c2 50 if (slided_) Draw(v_);
MikamiUitOpen 0:a2686ef737c2 51 slided_ = false;
MikamiUitOpen 0:a2686ef737c2 52 return false;
MikamiUitOpen 0:a2686ef737c2 53 }
MikamiUitOpen 0:a2686ef737c2 54
MikamiUitOpen 0:a2686ef737c2 55 uint16_t x, y;
MikamiUitOpen 0:a2686ef737c2 56 bool rtn = IsOnThumb(x, y);
MikamiUitOpen 12:687ec6183385 57 if (rtn || slided_)
MikamiUitOpen 0:a2686ef737c2 58 {
MikamiUitOpen 12:687ec6183385 59 if (rtn) v_ = ToValue(Point(x, y));
MikamiUitOpen 12:687ec6183385 60 Draw(v_, rtn);
MikamiUitOpen 12:687ec6183385 61 slided_ = rtn;
MikamiUitOpen 0:a2686ef737c2 62 }
MikamiUitOpen 0:a2686ef737c2 63 return rtn;
MikamiUitOpen 0:a2686ef737c2 64 }
MikamiUitOpen 6:b8f197b0012c 65
MikamiUitOpen 5:9c3ea4d4bc6b 66 void SeekBar::Activate()
MikamiUitOpen 5:9c3ea4d4bc6b 67 {
MikamiUitOpen 5:9c3ea4d4bc6b 68 active_ = true;
MikamiUitOpen 5:9c3ea4d4bc6b 69 Draw(v_);
MikamiUitOpen 12:687ec6183385 70 if (labelOn_)
MikamiUitOpen 12:687ec6183385 71 for (int n=0; n<3; n++) labelLCR[n]->Draw(TEXT_COLOR_);
MikamiUitOpen 5:9c3ea4d4bc6b 72 }
MikamiUitOpen 6:b8f197b0012c 73
MikamiUitOpen 5:9c3ea4d4bc6b 74 void SeekBar::Inactivate()
MikamiUitOpen 5:9c3ea4d4bc6b 75 {
MikamiUitOpen 5:9c3ea4d4bc6b 76 active_ = false;
MikamiUitOpen 5:9c3ea4d4bc6b 77 Draw(v_);
MikamiUitOpen 12:687ec6183385 78 if (labelOn_)
MikamiUitOpen 12:687ec6183385 79 for (int n=0; n<3; n++) labelLCR[n]->Draw(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 5:9c3ea4d4bc6b 80 }
MikamiUitOpen 0:a2686ef737c2 81
MikamiUitOpen 9:c379410bda15 82 // If touched position is on the thumb, return true
MikamiUitOpen 9:c379410bda15 83 bool SeekBar::IsOnThumb(uint16_t &x, uint16_t &y)
MikamiUitOpen 9:c379410bda15 84 {
MikamiUitOpen 9:c379410bda15 85 x = state_.touchX[0];
MikamiUitOpen 9:c379410bda15 86 y = state_.touchY[0];
MikamiUitOpen 9:c379410bda15 87
MikamiUitOpen 12:687ec6183385 88 uint16_t th = SIZE_/2;
MikamiUitOpen 9:c379410bda15 89 Point pt = ToPoint(v_);
MikamiUitOpen 9:c379410bda15 90 if (ORIENT_ == Holizontal)
MikamiUitOpen 9:c379410bda15 91 {
MikamiUitOpen 12:687ec6183385 92 if ( (pt.x-th <= x) && (x <= pt.x+th) &&
MikamiUitOpen 12:687ec6183385 93 (pt.y-th <= y) && (y <= pt.y+th) ) return true;
MikamiUitOpen 9:c379410bda15 94 }
MikamiUitOpen 9:c379410bda15 95 else
MikamiUitOpen 9:c379410bda15 96 {
MikamiUitOpen 12:687ec6183385 97 if ( (pt.x-th <= x) && (x <= pt.x+th) &&
MikamiUitOpen 12:687ec6183385 98 (pt.y-th <= y) && (y <= pt.y+th) ) return true;
MikamiUitOpen 9:c379410bda15 99 }
MikamiUitOpen 9:c379410bda15 100
MikamiUitOpen 9:c379410bda15 101 return false;
MikamiUitOpen 9:c379410bda15 102 }
MikamiUitOpen 9:c379410bda15 103
MikamiUitOpen 0:a2686ef737c2 104 // Draw seekbar
MikamiUitOpen 0:a2686ef737c2 105 void SeekBar::Draw(float value, bool fill)
MikamiUitOpen 0:a2686ef737c2 106 {
MikamiUitOpen 10:5a2068884fd9 107 uint16_t sizeS = (uint16_t)(SIZE_*0.6f);
MikamiUitOpen 0:a2686ef737c2 108 // Erase previous seekbar
MikamiUitOpen 0:a2686ef737c2 109 lcd_.SetTextColor(BACK_COLOR_);
MikamiUitOpen 0:a2686ef737c2 110 if (ORIENT_ == Holizontal)
MikamiUitOpen 10:5a2068884fd9 111 lcd_.FillRect(X_-sizeS/2, Y_-SIZE_/2, L_+sizeS+1, SIZE_+1);
MikamiUitOpen 0:a2686ef737c2 112 else
MikamiUitOpen 10:5a2068884fd9 113 lcd_.FillRect(X_-SIZE_/2, Y_-sizeS/2, SIZE_+1, L_+sizeS+1);
MikamiUitOpen 5:9c3ea4d4bc6b 114
MikamiUitOpen 9:c379410bda15 115 v_ = Saturate(value); // current value
MikamiUitOpen 9:c379410bda15 116 Point pt = ToPoint(v_); // Position of thumb
MikamiUitOpen 0:a2686ef737c2 117
MikamiUitOpen 0:a2686ef737c2 118 // Draw upper line
MikamiUitOpen 5:9c3ea4d4bc6b 119 if (active_) lcd_.SetTextColor(COLOR_H_);
MikamiUitOpen 5:9c3ea4d4bc6b 120 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_-0x404040);
MikamiUitOpen 12:687ec6183385 121 if ((ORIENT_ == Holizontal) && ((X_+L_-pt.x) > 0))
MikamiUitOpen 0:a2686ef737c2 122 lcd_.FillRect(pt.x, Y_-W_/4, X_+L_-pt.x, W_/2);
MikamiUitOpen 12:687ec6183385 123 if ((ORIENT_ == Vertical) && ((pt.y-Y_) > 0))
MikamiUitOpen 0:a2686ef737c2 124 lcd_.FillRect(X_-W_/4, Y_, W_/2, pt.y-Y_);
MikamiUitOpen 0:a2686ef737c2 125
MikamiUitOpen 0:a2686ef737c2 126 // Draw lower line
MikamiUitOpen 5:9c3ea4d4bc6b 127 if (active_) lcd_.SetTextColor(COLOR_L_);
MikamiUitOpen 5:9c3ea4d4bc6b 128 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_-0x202020);
MikamiUitOpen 0:a2686ef737c2 129 if ((ORIENT_ == Holizontal) && ((pt.x-X_) > 0))
MikamiUitOpen 0:a2686ef737c2 130 lcd_.FillRect(X_, Y_-W_/2, pt.x-X_, W_);
MikamiUitOpen 0:a2686ef737c2 131 if ((ORIENT_ == Vertical) && ((Y_+L_-pt.y) > 0))
MikamiUitOpen 0:a2686ef737c2 132 lcd_.FillRect(X_-W_/2, pt.y, W_, Y_+L_-pt.y);
MikamiUitOpen 0:a2686ef737c2 133
MikamiUitOpen 0:a2686ef737c2 134 // Draw thumb
MikamiUitOpen 5:9c3ea4d4bc6b 135 if (active_) lcd_.SetTextColor(CREATED_COLOR_);
MikamiUitOpen 5:9c3ea4d4bc6b 136 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 10:5a2068884fd9 137 uint16_t width = SIZE_;
MikamiUitOpen 10:5a2068884fd9 138 uint16_t height = SIZE_;
MikamiUitOpen 10:5a2068884fd9 139 if (ORIENT_ == Holizontal) width = sizeS;
MikamiUitOpen 10:5a2068884fd9 140 else height = sizeS;
MikamiUitOpen 10:5a2068884fd9 141 uint16_t xPos = pt.x - width/2;
MikamiUitOpen 10:5a2068884fd9 142 uint16_t yPos = pt.y - height/2;
MikamiUitOpen 10:5a2068884fd9 143
MikamiUitOpen 0:a2686ef737c2 144 if (fill)
MikamiUitOpen 10:5a2068884fd9 145 lcd_.FillRect(xPos, yPos, width+1, height+1);
MikamiUitOpen 0:a2686ef737c2 146 else
MikamiUitOpen 10:5a2068884fd9 147 {
MikamiUitOpen 10:5a2068884fd9 148 lcd_.DrawRect(xPos, yPos, width, height);
MikamiUitOpen 10:5a2068884fd9 149 lcd_.DrawHLine(pt.x+width/2, pt.y+height/2, 1);
MikamiUitOpen 12:687ec6183385 150 lcd_.DrawRect(xPos+1, yPos+1, width-2, height-2);
MikamiUitOpen 12:687ec6183385 151 lcd_.DrawHLine(pt.x+width/2-1, pt.y+height/2-1, 1);
MikamiUitOpen 10:5a2068884fd9 152 if (ORIENT_ == Holizontal)
MikamiUitOpen 12:687ec6183385 153 lcd_.DrawVLine(pt.x, yPos+4, SIZE_-7);
MikamiUitOpen 10:5a2068884fd9 154 else
MikamiUitOpen 12:687ec6183385 155 lcd_.DrawHLine(xPos+4, pt.y, SIZE_-7);
MikamiUitOpen 10:5a2068884fd9 156 }
MikamiUitOpen 0:a2686ef737c2 157 }
MikamiUitOpen 0:a2686ef737c2 158
MikamiUitOpen 0:a2686ef737c2 159 SeekBar::Point SeekBar::ToPoint(float value)
MikamiUitOpen 0:a2686ef737c2 160 {
MikamiUitOpen 0:a2686ef737c2 161 if (ORIENT_ == Holizontal)
MikamiUitOpen 10:5a2068884fd9 162 return Point(X_ + Round(L_*(value - MIN_)/(MAX_ - MIN_)), Y_);
MikamiUitOpen 0:a2686ef737c2 163 else
MikamiUitOpen 10:5a2068884fd9 164 return Point(X_, Y_ + L_ - Round(L_*(value - MIN_)/(MAX_ - MIN_)));
MikamiUitOpen 0:a2686ef737c2 165 }
MikamiUitOpen 0:a2686ef737c2 166
MikamiUitOpen 0:a2686ef737c2 167 float SeekBar::ToValue(Point pt)
MikamiUitOpen 0:a2686ef737c2 168 {
MikamiUitOpen 0:a2686ef737c2 169 float value;
MikamiUitOpen 0:a2686ef737c2 170 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 171 value = (pt.x - X_)*(MAX_ - MIN_)/(float)L_ + MIN_;
MikamiUitOpen 0:a2686ef737c2 172 else
MikamiUitOpen 0:a2686ef737c2 173 value = -(pt.y - Y_ - L_)*(MAX_ - MIN_)/(float)L_ + MIN_;
MikamiUitOpen 0:a2686ef737c2 174 return Saturate(value);
MikamiUitOpen 0:a2686ef737c2 175 }
MikamiUitOpen 0:a2686ef737c2 176
MikamiUitOpen 0:a2686ef737c2 177 float SeekBar::Saturate(float value)
MikamiUitOpen 0:a2686ef737c2 178 {
MikamiUitOpen 0:a2686ef737c2 179 if (value < MIN_) value = MIN_;
MikamiUitOpen 0:a2686ef737c2 180 if (value > MAX_) value = MAX_;
MikamiUitOpen 0:a2686ef737c2 181 return value;
MikamiUitOpen 0:a2686ef737c2 182 }
MikamiUitOpen 0:a2686ef737c2 183 }