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:
Sun Apr 10 09:25:36 2016 +0000
Revision:
5:9c3ea4d4bc6b
Parent:
0:a2686ef737c2
Child:
6:b8f197b0012c
6

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 5:9c3ea4d4bc6b 4 // 2016/04/10, 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 0:a2686ef737c2 11 // Slide thumb
MikamiUitOpen 0:a2686ef737c2 12 // If the thumb is not touched, return false
MikamiUitOpen 0:a2686ef737c2 13 bool SeekBar::Slide()
MikamiUitOpen 0:a2686ef737c2 14 {
MikamiUitOpen 5:9c3ea4d4bc6b 15 if (!active_) return false;
MikamiUitOpen 5:9c3ea4d4bc6b 16
MikamiUitOpen 0:a2686ef737c2 17 if (!PanelTouched())
MikamiUitOpen 0:a2686ef737c2 18 {
MikamiUitOpen 0:a2686ef737c2 19 if (slided_) Draw(v_);
MikamiUitOpen 0:a2686ef737c2 20 slided_ = false;
MikamiUitOpen 0:a2686ef737c2 21 return false;
MikamiUitOpen 0:a2686ef737c2 22 }
MikamiUitOpen 0:a2686ef737c2 23
MikamiUitOpen 0:a2686ef737c2 24 uint16_t x, y;
MikamiUitOpen 0:a2686ef737c2 25 bool rtn = IsOnThumb(x, y);
MikamiUitOpen 0:a2686ef737c2 26 if (rtn)
MikamiUitOpen 0:a2686ef737c2 27 {
MikamiUitOpen 0:a2686ef737c2 28 v_ = ToValue(Point(x, y));
MikamiUitOpen 0:a2686ef737c2 29 Draw(v_, true);
MikamiUitOpen 0:a2686ef737c2 30 slided_ = true;
MikamiUitOpen 0:a2686ef737c2 31 }
MikamiUitOpen 0:a2686ef737c2 32
MikamiUitOpen 0:a2686ef737c2 33 return rtn;
MikamiUitOpen 0:a2686ef737c2 34 }
MikamiUitOpen 5:9c3ea4d4bc6b 35
MikamiUitOpen 5:9c3ea4d4bc6b 36 void SeekBar::Activate()
MikamiUitOpen 5:9c3ea4d4bc6b 37 {
MikamiUitOpen 5:9c3ea4d4bc6b 38 active_ = true;
MikamiUitOpen 5:9c3ea4d4bc6b 39 Draw(v_);
MikamiUitOpen 5:9c3ea4d4bc6b 40 }
MikamiUitOpen 5:9c3ea4d4bc6b 41
MikamiUitOpen 5:9c3ea4d4bc6b 42 void SeekBar::Inactivate()
MikamiUitOpen 5:9c3ea4d4bc6b 43 {
MikamiUitOpen 5:9c3ea4d4bc6b 44 active_ = false;
MikamiUitOpen 5:9c3ea4d4bc6b 45 Draw(v_);
MikamiUitOpen 5:9c3ea4d4bc6b 46 }
MikamiUitOpen 0:a2686ef737c2 47
MikamiUitOpen 0:a2686ef737c2 48 // Draw seekbar
MikamiUitOpen 0:a2686ef737c2 49 void SeekBar::Draw(float value, bool fill)
MikamiUitOpen 0:a2686ef737c2 50 {
MikamiUitOpen 0:a2686ef737c2 51 // Erase previous seekbar
MikamiUitOpen 0:a2686ef737c2 52 lcd_.SetTextColor(BACK_COLOR_);
MikamiUitOpen 0:a2686ef737c2 53 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 54 lcd_.FillRect(X_-SIZE_/2, Y_-SIZE_/2, L_+SIZE_+1, SIZE_+1);
MikamiUitOpen 0:a2686ef737c2 55 else
MikamiUitOpen 0:a2686ef737c2 56 lcd_.FillRect(X_-SIZE_/2, Y_-SIZE_/2, SIZE_+1, L_+SIZE_+1);
MikamiUitOpen 5:9c3ea4d4bc6b 57
MikamiUitOpen 0:a2686ef737c2 58 Point pt = ToPoint(Saturate(value)); // Position of thumb
MikamiUitOpen 0:a2686ef737c2 59
MikamiUitOpen 0:a2686ef737c2 60 // Draw upper line
MikamiUitOpen 5:9c3ea4d4bc6b 61 if (active_) lcd_.SetTextColor(COLOR_H_);
MikamiUitOpen 5:9c3ea4d4bc6b 62 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_-0x404040);
MikamiUitOpen 0:a2686ef737c2 63 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 64 lcd_.FillRect(pt.x, Y_-W_/4, X_+L_-pt.x, W_/2);
MikamiUitOpen 0:a2686ef737c2 65 else
MikamiUitOpen 0:a2686ef737c2 66 lcd_.FillRect(X_-W_/4, Y_, W_/2, pt.y-Y_);
MikamiUitOpen 0:a2686ef737c2 67
MikamiUitOpen 0:a2686ef737c2 68 // Draw lower line
MikamiUitOpen 5:9c3ea4d4bc6b 69 if (active_) lcd_.SetTextColor(COLOR_L_);
MikamiUitOpen 5:9c3ea4d4bc6b 70 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_-0x202020);
MikamiUitOpen 0:a2686ef737c2 71 if ((ORIENT_ == Holizontal) && ((pt.x-X_) > 0))
MikamiUitOpen 0:a2686ef737c2 72 lcd_.FillRect(X_, Y_-W_/2, pt.x-X_, W_);
MikamiUitOpen 0:a2686ef737c2 73 if ((ORIENT_ == Vertical) && ((Y_+L_-pt.y) > 0))
MikamiUitOpen 0:a2686ef737c2 74 lcd_.FillRect(X_-W_/2, pt.y, W_, Y_+L_-pt.y);
MikamiUitOpen 0:a2686ef737c2 75
MikamiUitOpen 0:a2686ef737c2 76 // Draw thumb
MikamiUitOpen 5:9c3ea4d4bc6b 77 if (active_) lcd_.SetTextColor(CREATED_COLOR_);
MikamiUitOpen 5:9c3ea4d4bc6b 78 else lcd_.SetTextColor(INACTIVE_TEXT_COLOR_);
MikamiUitOpen 0:a2686ef737c2 79 if (fill)
MikamiUitOpen 0:a2686ef737c2 80 lcd_.FillCircle(pt.x, pt.y, SIZE_/2);
MikamiUitOpen 0:a2686ef737c2 81 else
MikamiUitOpen 0:a2686ef737c2 82 lcd_.DrawCircle(pt.x, pt.y, SIZE_/2);
MikamiUitOpen 0:a2686ef737c2 83 }
MikamiUitOpen 0:a2686ef737c2 84
MikamiUitOpen 0:a2686ef737c2 85 // If touched position is on the button, return true
MikamiUitOpen 0:a2686ef737c2 86 bool SeekBar::IsOnThumb(uint16_t &x, uint16_t &y)
MikamiUitOpen 0:a2686ef737c2 87 {
MikamiUitOpen 0:a2686ef737c2 88 x = state_.touchX[0];
MikamiUitOpen 0:a2686ef737c2 89 y = state_.touchY[0];
MikamiUitOpen 0:a2686ef737c2 90
MikamiUitOpen 0:a2686ef737c2 91 Point pt = ToPoint(v_);
MikamiUitOpen 0:a2686ef737c2 92 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 93 {
MikamiUitOpen 0:a2686ef737c2 94 if ( (pt.x-SIZE_/5 <= x) && (x <= pt.x+SIZE_/5) &&
MikamiUitOpen 0:a2686ef737c2 95 (pt.y-SIZE_ <= y) && (y <= pt.y+SIZE_) ) return true;
MikamiUitOpen 0:a2686ef737c2 96 }
MikamiUitOpen 0:a2686ef737c2 97 else
MikamiUitOpen 0:a2686ef737c2 98 {
MikamiUitOpen 0:a2686ef737c2 99 if ( (pt.x-SIZE_ <= x) && (x <= pt.x+SIZE_) &&
MikamiUitOpen 0:a2686ef737c2 100 (pt.y-SIZE_/5 <= y) && (y <= pt.y+SIZE_/5) ) return true;
MikamiUitOpen 0:a2686ef737c2 101 }
MikamiUitOpen 0:a2686ef737c2 102
MikamiUitOpen 0:a2686ef737c2 103 return false;
MikamiUitOpen 0:a2686ef737c2 104 }
MikamiUitOpen 0:a2686ef737c2 105
MikamiUitOpen 0:a2686ef737c2 106 SeekBar::Point SeekBar::ToPoint(float value)
MikamiUitOpen 0:a2686ef737c2 107 {
MikamiUitOpen 0:a2686ef737c2 108 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 109 return Point(X_ + L_*(value - MIN_)/(MAX_ - MIN_), Y_);
MikamiUitOpen 0:a2686ef737c2 110 else
MikamiUitOpen 0:a2686ef737c2 111 return Point(X_, Y_ + L_ - L_*(value - MIN_)/(MAX_ - MIN_));
MikamiUitOpen 0:a2686ef737c2 112 }
MikamiUitOpen 0:a2686ef737c2 113
MikamiUitOpen 0:a2686ef737c2 114 float SeekBar::ToValue(Point pt)
MikamiUitOpen 0:a2686ef737c2 115 {
MikamiUitOpen 0:a2686ef737c2 116 float value;
MikamiUitOpen 0:a2686ef737c2 117 if (ORIENT_ == Holizontal)
MikamiUitOpen 0:a2686ef737c2 118 value = (pt.x - X_)*(MAX_ - MIN_)/(float)L_ + MIN_;
MikamiUitOpen 0:a2686ef737c2 119 else
MikamiUitOpen 0:a2686ef737c2 120 value = -(pt.y - Y_ - L_)*(MAX_ - MIN_)/(float)L_ + MIN_;
MikamiUitOpen 0:a2686ef737c2 121 return Saturate(value);
MikamiUitOpen 0:a2686ef737c2 122 }
MikamiUitOpen 0:a2686ef737c2 123
MikamiUitOpen 0:a2686ef737c2 124 float SeekBar::Saturate(float value)
MikamiUitOpen 0:a2686ef737c2 125 {
MikamiUitOpen 0:a2686ef737c2 126 if (value < MIN_) value = MIN_;
MikamiUitOpen 0:a2686ef737c2 127 if (value > MAX_) value = MAX_;
MikamiUitOpen 0:a2686ef737c2 128 return value;
MikamiUitOpen 0:a2686ef737c2 129 }
MikamiUitOpen 0:a2686ef737c2 130 }
MikamiUitOpen 5:9c3ea4d4bc6b 131