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

Dependents:   F746_SD_GraphicEqualizer_ren0620

Fork of F746_GUI by 不韋 呂

Committer:
MikamiUitOpen
Date:
Tue Apr 12 04:15:41 2016 +0000
Revision:
6:b8f197b0012c
Parent:
5:9c3ea4d4bc6b
Child:
9:c379410bda15
7

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 6:b8f197b0012c 4 // 2016/04/12, 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 6:b8f197b0012c 22 MIN_(min), MAX_(max), ORIENT_(Holizontal),
MikamiUitOpen 6:b8f197b0012c 23 v_(initialValue), active_(true)
MikamiUitOpen 6:b8f197b0012c 24 {
MikamiUitOpen 6:b8f197b0012c 25 Draw(initialValue);
MikamiUitOpen 6:b8f197b0012c 26 labelL = new Label(x, y-28, left, Label::CENTER);
MikamiUitOpen 6:b8f197b0012c 27 labelC = new Label(x+length/2, y-28, center, Label::CENTER);
MikamiUitOpen 6:b8f197b0012c 28 labelR = new Label(x+length, y-28, right, Label::CENTER);
MikamiUitOpen 6:b8f197b0012c 29 }
MikamiUitOpen 6:b8f197b0012c 30
MikamiUitOpen 0:a2686ef737c2 31 // Slide thumb
MikamiUitOpen 0:a2686ef737c2 32 // If the thumb is not touched, return false
MikamiUitOpen 0:a2686ef737c2 33 bool SeekBar::Slide()
MikamiUitOpen 0:a2686ef737c2 34 {
MikamiUitOpen 5:9c3ea4d4bc6b 35 if (!active_) return false;
MikamiUitOpen 5:9c3ea4d4bc6b 36
MikamiUitOpen 0:a2686ef737c2 37 if (!PanelTouched())
MikamiUitOpen 0:a2686ef737c2 38 {
MikamiUitOpen 0:a2686ef737c2 39 if (slided_) Draw(v_);
MikamiUitOpen 0:a2686ef737c2 40 slided_ = false;
MikamiUitOpen 0:a2686ef737c2 41 return false;
MikamiUitOpen 0:a2686ef737c2 42 }
MikamiUitOpen 0:a2686ef737c2 43
MikamiUitOpen 0:a2686ef737c2 44 uint16_t x, y;
MikamiUitOpen 0:a2686ef737c2 45 bool rtn = IsOnThumb(x, y);
MikamiUitOpen 0:a2686ef737c2 46 if (rtn)
MikamiUitOpen 0:a2686ef737c2 47 {
MikamiUitOpen 0:a2686ef737c2 48 v_ = ToValue(Point(x, y));
MikamiUitOpen 0:a2686ef737c2 49 Draw(v_, true);
MikamiUitOpen 0:a2686ef737c2 50 slided_ = true;
MikamiUitOpen 0:a2686ef737c2 51 }
MikamiUitOpen 0:a2686ef737c2 52
MikamiUitOpen 0:a2686ef737c2 53 return rtn;
MikamiUitOpen 0:a2686ef737c2 54 }
MikamiUitOpen 6:b8f197b0012c 55
MikamiUitOpen 5:9c3ea4d4bc6b 56 void SeekBar::Activate()
MikamiUitOpen 5:9c3ea4d4bc6b 57 {
MikamiUitOpen 5:9c3ea4d4bc6b 58 active_ = true;
MikamiUitOpen 5:9c3ea4d4bc6b 59 Draw(v_);
MikamiUitOpen 6:b8f197b0012c 60 if (labelL != NULL)
MikamiUitOpen 6:b8f197b0012c 61 {
MikamiUitOpen 6:b8f197b0012c 62 labelL->Draw(TEXT_COLOR_);
MikamiUitOpen 6:b8f197b0012c 63 labelC->Draw(TEXT_COLOR_);
MikamiUitOpen 6:b8f197b0012c 64 labelR->Draw(TEXT_COLOR_);
MikamiUitOpen 6:b8f197b0012c 65 }
MikamiUitOpen 5:9c3ea4d4bc6b 66 }
MikamiUitOpen 6:b8f197b0012c 67
MikamiUitOpen 5:9c3ea4d4bc6b 68 void SeekBar::Inactivate()
MikamiUitOpen 5:9c3ea4d4bc6b 69 {
MikamiUitOpen 5:9c3ea4d4bc6b 70 active_ = false;
MikamiUitOpen 5:9c3ea4d4bc6b 71 Draw(v_);
MikamiUitOpen 6:b8f197b0012c 72 if (labelL != NULL)
MikamiUitOpen 6:b8f197b0012c 73 {
MikamiUitOpen 6:b8f197b0012c 74 labelL->Draw(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 6:b8f197b0012c 75 labelC->Draw(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 6:b8f197b0012c 76 labelR->Draw(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 6:b8f197b0012c 77 }
MikamiUitOpen 5:9c3ea4d4bc6b 78 }
MikamiUitOpen 0:a2686ef737c2 79
MikamiUitOpen 0:a2686ef737c2 80 // Draw seekbar
MikamiUitOpen 0:a2686ef737c2 81 void SeekBar::Draw(float value, bool fill)
MikamiUitOpen 0:a2686ef737c2 82 {
MikamiUitOpen 0:a2686ef737c2 83 // Erase previous seekbar
MikamiUitOpen 0:a2686ef737c2 84 lcd_.SetTextColor(BACK_COLOR_);
MikamiUitOpen 0:a2686ef737c2 85 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 86 lcd_.FillRect(X_-SIZE_/2, Y_-SIZE_/2, L_+SIZE_+1, SIZE_+1);
MikamiUitOpen 0:a2686ef737c2 87 else
MikamiUitOpen 0:a2686ef737c2 88 lcd_.FillRect(X_-SIZE_/2, Y_-SIZE_/2, SIZE_+1, L_+SIZE_+1);
MikamiUitOpen 5:9c3ea4d4bc6b 89
MikamiUitOpen 0:a2686ef737c2 90 Point pt = ToPoint(Saturate(value)); // Position of thumb
MikamiUitOpen 0:a2686ef737c2 91
MikamiUitOpen 0:a2686ef737c2 92 // Draw upper line
MikamiUitOpen 5:9c3ea4d4bc6b 93 if (active_) lcd_.SetTextColor(COLOR_H_);
MikamiUitOpen 5:9c3ea4d4bc6b 94 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_-0x404040);
MikamiUitOpen 0:a2686ef737c2 95 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 96 lcd_.FillRect(pt.x, Y_-W_/4, X_+L_-pt.x, W_/2);
MikamiUitOpen 0:a2686ef737c2 97 else
MikamiUitOpen 0:a2686ef737c2 98 lcd_.FillRect(X_-W_/4, Y_, W_/2, pt.y-Y_);
MikamiUitOpen 0:a2686ef737c2 99
MikamiUitOpen 0:a2686ef737c2 100 // Draw lower line
MikamiUitOpen 5:9c3ea4d4bc6b 101 if (active_) lcd_.SetTextColor(COLOR_L_);
MikamiUitOpen 5:9c3ea4d4bc6b 102 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_-0x202020);
MikamiUitOpen 0:a2686ef737c2 103 if ((ORIENT_ == Holizontal) && ((pt.x-X_) > 0))
MikamiUitOpen 0:a2686ef737c2 104 lcd_.FillRect(X_, Y_-W_/2, pt.x-X_, W_);
MikamiUitOpen 0:a2686ef737c2 105 if ((ORIENT_ == Vertical) && ((Y_+L_-pt.y) > 0))
MikamiUitOpen 0:a2686ef737c2 106 lcd_.FillRect(X_-W_/2, pt.y, W_, Y_+L_-pt.y);
MikamiUitOpen 0:a2686ef737c2 107
MikamiUitOpen 0:a2686ef737c2 108 // Draw thumb
MikamiUitOpen 5:9c3ea4d4bc6b 109 if (active_) lcd_.SetTextColor(CREATED_COLOR_);
MikamiUitOpen 5:9c3ea4d4bc6b 110 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 0:a2686ef737c2 111 if (fill)
MikamiUitOpen 0:a2686ef737c2 112 lcd_.FillCircle(pt.x, pt.y, SIZE_/2);
MikamiUitOpen 0:a2686ef737c2 113 else
MikamiUitOpen 0:a2686ef737c2 114 lcd_.DrawCircle(pt.x, pt.y, SIZE_/2);
MikamiUitOpen 0:a2686ef737c2 115 }
MikamiUitOpen 0:a2686ef737c2 116
MikamiUitOpen 0:a2686ef737c2 117 // If touched position is on the button, return true
MikamiUitOpen 0:a2686ef737c2 118 bool SeekBar::IsOnThumb(uint16_t &x, uint16_t &y)
MikamiUitOpen 0:a2686ef737c2 119 {
MikamiUitOpen 0:a2686ef737c2 120 x = state_.touchX[0];
MikamiUitOpen 0:a2686ef737c2 121 y = state_.touchY[0];
MikamiUitOpen 0:a2686ef737c2 122
MikamiUitOpen 0:a2686ef737c2 123 Point pt = ToPoint(v_);
MikamiUitOpen 0:a2686ef737c2 124 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 125 {
MikamiUitOpen 0:a2686ef737c2 126 if ( (pt.x-SIZE_/5 <= x) && (x <= pt.x+SIZE_/5) &&
MikamiUitOpen 0:a2686ef737c2 127 (pt.y-SIZE_ <= y) && (y <= pt.y+SIZE_) ) return true;
MikamiUitOpen 0:a2686ef737c2 128 }
MikamiUitOpen 0:a2686ef737c2 129 else
MikamiUitOpen 0:a2686ef737c2 130 {
MikamiUitOpen 0:a2686ef737c2 131 if ( (pt.x-SIZE_ <= x) && (x <= pt.x+SIZE_) &&
MikamiUitOpen 0:a2686ef737c2 132 (pt.y-SIZE_/5 <= y) && (y <= pt.y+SIZE_/5) ) return true;
MikamiUitOpen 0:a2686ef737c2 133 }
MikamiUitOpen 0:a2686ef737c2 134
MikamiUitOpen 0:a2686ef737c2 135 return false;
MikamiUitOpen 0:a2686ef737c2 136 }
MikamiUitOpen 0:a2686ef737c2 137
MikamiUitOpen 0:a2686ef737c2 138 SeekBar::Point SeekBar::ToPoint(float value)
MikamiUitOpen 0:a2686ef737c2 139 {
MikamiUitOpen 0:a2686ef737c2 140 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 141 return Point(X_ + L_*(value - MIN_)/(MAX_ - MIN_), Y_);
MikamiUitOpen 0:a2686ef737c2 142 else
MikamiUitOpen 0:a2686ef737c2 143 return Point(X_, Y_ + L_ - L_*(value - MIN_)/(MAX_ - MIN_));
MikamiUitOpen 0:a2686ef737c2 144 }
MikamiUitOpen 0:a2686ef737c2 145
MikamiUitOpen 0:a2686ef737c2 146 float SeekBar::ToValue(Point pt)
MikamiUitOpen 0:a2686ef737c2 147 {
MikamiUitOpen 0:a2686ef737c2 148 float value;
MikamiUitOpen 0:a2686ef737c2 149 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 150 value = (pt.x - X_)*(MAX_ - MIN_)/(float)L_ + MIN_;
MikamiUitOpen 0:a2686ef737c2 151 else
MikamiUitOpen 0:a2686ef737c2 152 value = -(pt.y - Y_ - L_)*(MAX_ - MIN_)/(float)L_ + MIN_;
MikamiUitOpen 0:a2686ef737c2 153 return Saturate(value);
MikamiUitOpen 0:a2686ef737c2 154 }
MikamiUitOpen 0:a2686ef737c2 155
MikamiUitOpen 0:a2686ef737c2 156 float SeekBar::Saturate(float value)
MikamiUitOpen 0:a2686ef737c2 157 {
MikamiUitOpen 0:a2686ef737c2 158 if (value < MIN_) value = MIN_;
MikamiUitOpen 0:a2686ef737c2 159 if (value > MAX_) value = MAX_;
MikamiUitOpen 0:a2686ef737c2 160 return value;
MikamiUitOpen 0:a2686ef737c2 161 }
MikamiUitOpen 0:a2686ef737c2 162 }