SPKT

Dependents:   Player

Committer:
phungductung
Date:
Fri Jun 07 05:06:42 2019 +0000
Revision:
0:4e245f4bc8ac
spkt

Who changed what in which revision?

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