New IHM
Dependencies: Array_Matrix TS_DISCO_F746NG LCD_DISCO_F746NG BSP_DISCO_F746NG
SeekBar.cpp@5:9c3ea4d4bc6b, 2016-04-10 (annotated)
- 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?
User | Revision | Line number | New 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 |