1 #include "pch.h" 2 #include "MyGUI_Precompiled.h" 3 #include "Slider.h" 4 #include "MyGUI_InputManager.h" 5 #include "MyGUI_Button.h" 6 #include "MyGUI_ResourceSkin.h" 7 #include "MyGUI_ImageBox.h" 8 9 namespace MyGUI 10 { 11 Slider()12 Slider::Slider() : 13 mWidgetStart(nullptr), 14 mWidgetEnd(nullptr), 15 mWidgetTrack(nullptr), 16 mfValue(0.f), mfDefault(0.5f) 17 { 18 } 19 20 // Init 21 //----------------------------------------------------------------------------------------------- initialiseOverride()22 void Slider::initialiseOverride() 23 { 24 Base::initialiseOverride(); 25 26 eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse); 27 eventMouseDrag += newDelegate(this, &Slider::notifyMouse); 28 eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel); 29 30 assignWidget(mWidgetTrack, "Track"); 31 if (mWidgetTrack != nullptr) 32 { 33 mWidgetTrack->eventMouseDrag += newDelegate(this, &Slider::notifyMouse); 34 mWidgetTrack->eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse); 35 mWidgetTrack->eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel); 36 mWidgetTrack->setVisible(false); 37 } 38 39 /* 40 assignWidget(mWidgetStart, "Start"); 41 if (mWidgetStart != nullptr) 42 { 43 mWidgetStart->eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse); 44 mWidgetStart->eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel); 45 } 46 assignWidget(mWidgetEnd, "End"); 47 if (mWidgetEnd != nullptr) 48 { 49 mWidgetEnd->eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse); 50 mWidgetEnd->eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel); 51 }*/ 52 } 53 shutdownOverride()54 void Slider::shutdownOverride() 55 { 56 mWidgetStart = nullptr; 57 mWidgetEnd = nullptr; 58 mWidgetTrack = nullptr; 59 60 Base::shutdownOverride(); 61 } 62 updateTrack()63 void Slider::updateTrack() 64 { 65 if (mWidgetTrack == nullptr) 66 return; 67 68 _forcePick(mWidgetTrack); 69 70 if (!mWidgetTrack->getVisible()) 71 mWidgetTrack->setVisible(true); 72 73 int iTrack = mWidgetTrack->getSize().width; 74 int iSize = mWidgetTrack->getParent()->getSize().width - iTrack; 75 76 int pos = mfValue * iSize; 77 78 mWidgetTrack->setPosition(pos, mWidgetTrack->getTop()); 79 } 80 81 /// mouse button 82 //----------------------------------------------------------------------------------------------- notifyMouse(Widget * _sender,int _left,int _top,MouseButton _id)83 void Slider::notifyMouse(Widget* _sender, int _left, int _top, MouseButton _id) 84 { 85 //eventMouseButtonPressed(this, _left, _top, _id); 86 const IntPoint& p = mWidgetTrack->getParent()->getAbsolutePosition(); 87 const IntSize& s = mWidgetTrack->getParent()->getSize(); 88 int iTrack = mWidgetTrack->getSize().width; 89 90 // LMB set (in slider range) 91 if (_id == MouseButton::Left) 92 { 93 float fx = (_left-iTrack/2 - p.left) / float(s.width - iTrack); 94 //float fy = (_top - p.top) / float(s.height); 95 fx = std::max(0.f, std::min(1.f, fx)); 96 97 mfValue = fx; 98 eventValueChanged(this, mfValue); 99 updateTrack(); 100 } 101 else /// RMB reset to default value 102 if (_id == MouseButton::Right) 103 { 104 mfValue = mfDefault; 105 eventValueChanged(this, mfValue); 106 updateTrack(); 107 } 108 } 109 110 getValue() const111 float Slider::getValue() const 112 { 113 return mfValue; 114 } 115 setValue(float val)116 void Slider::setValue(float val) 117 { 118 //if (mValue == val) 119 // return; 120 121 mfValue = val; //std::max(0.f, std::min(1.f, val)); 122 updateTrack(); 123 } 124 125 126 // mouse wheel 127 //-------------------------------------------------------------------------------- onMouseWheel(int _rel)128 void Slider::onMouseWheel(int _rel) 129 { 130 notifyMouseWheel(nullptr, _rel); 131 132 Base::onMouseWheel(_rel); 133 } 134 notifyMouseWheel(Widget * _sender,int _rel)135 void Slider::notifyMouseWheel(Widget* _sender, int _rel) 136 { 137 mfValue = std::max(0.f, std::min(1.f, mfValue - _rel/120.f*0.5f * 0.125f )); 138 eventValueChanged(this, mfValue); 139 updateTrack(); 140 } 141 setPropertyOverride(const std::string & _key,const std::string & _value)142 void Slider::setPropertyOverride(const std::string& _key, const std::string& _value) 143 { 144 if (_key == "Value") 145 setValue(utility::parseValue<float>(_value)); 146 else 147 { 148 Base::setPropertyOverride(_key, _value); 149 return; 150 } 151 eventChangeProperty(this, _key, _value); 152 } 153 154 155 // update track on resize setSize(int _width,int _height)156 void Slider::setSize(int _width, int _height) 157 { 158 setSize(IntSize(_width, _height)); 159 } 160 setCoord(int _left,int _top,int _width,int _height)161 void Slider::setCoord(int _left, int _top, int _width, int _height) 162 { 163 setCoord(IntCoord(_left, _top, _width, _height)); 164 } 165 setSize(const IntSize & _size)166 void Slider::setSize(const IntSize& _size) 167 { 168 Base::setSize(_size); 169 updateTrack(); 170 } 171 setCoord(const IntCoord & _coord)172 void Slider::setCoord(const IntCoord& _coord) 173 { 174 Base::setCoord(_coord); 175 updateTrack(); 176 } 177 178 } 179