1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_ScrollBar.h"
9 #include "MyGUI_InputManager.h"
10 #include "MyGUI_Button.h"
11 #include "MyGUI_ResourceSkin.h"
12 #include "MyGUI_ControllerRepeatClick.h"
13 #include "MyGUI_ControllerManager.h"
14 
15 namespace MyGUI
16 {
17 
ScrollBar()18 	ScrollBar::ScrollBar() :
19 		mWidgetStart(nullptr),
20 		mWidgetEnd(nullptr),
21 		mWidgetTrack(nullptr),
22 		mWidgetFirstPart(nullptr),
23 		mWidgetSecondPart(nullptr),
24 		mSkinRangeStart(0),
25 		mSkinRangeEnd(0),
26 		mScrollRange(0),
27 		mScrollPosition(0),
28 		mScrollPage(0),
29 		mScrollViewPage(0),
30 		mScrollWheelPage(0),
31 		mEnableRepeat(true),
32 		mRepeatTriggerTime(0.f),
33 		mRepeatStepTime(0.f),
34 		mMinTrackSize(0),
35 		mMoveToClick(false),
36 		mVerticalAlignment(true)
37 	{
38 	}
39 
initialiseOverride()40 	void ScrollBar::initialiseOverride()
41 	{
42 		Base::initialiseOverride();
43 
44 		// при нуле, будет игнорировать кнопки
45 		mScrollPage = 1;
46 		mScrollViewPage = 1;
47 		mScrollWheelPage = 1;
48 		mMinTrackSize = 0;
49 		mSkinRangeStart = 0;
50 		mSkinRangeEnd = 0;
51 
52 		mRepeatTriggerTime = 0.5f;
53 		mRepeatStepTime = 0.1f;
54 
55 		///@wskin_child{ScrollBar, Button, Start} Кнопка начала диапазона.
56 		assignWidget(mWidgetStart, "Start");
57 		if (mWidgetStart != nullptr)
58 		{
59 			mWidgetStart->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
60 			mWidgetStart->eventMouseButtonReleased += newDelegate(this, &ScrollBar::notifyMouseReleased);
61 			mWidgetStart->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
62 		}
63 
64 		///@wskin_child{ScrollBar, Button, End} Кнопка конца диапазона.
65 		assignWidget(mWidgetEnd, "End");
66 		if (mWidgetEnd != nullptr)
67 		{
68 			mWidgetEnd->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
69 			mWidgetEnd->eventMouseButtonReleased += newDelegate(this, &ScrollBar::notifyMouseReleased);
70 			mWidgetEnd->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
71 		}
72 
73 		///@wskin_child{ScrollBar, Button, Track} Кнопка трекера.
74 		assignWidget(mWidgetTrack, "Track");
75 		if (mWidgetTrack)
76 		{
77 			mWidgetTrack->eventMouseDrag += newDelegate(this, &ScrollBar::notifyMouseDrag);
78 			mWidgetTrack->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
79 			mWidgetTrack->eventMouseButtonReleased += newDelegate(this, &ScrollBar::notifyMouseReleased);
80 			mWidgetTrack->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
81 			mWidgetTrack->setVisible(false);
82 		}
83 
84 		///@wskin_child{ScrollBar, Widget, FirstPart} Виджет первой половины прокрутки от начала до трекера, при нажатии восприницмается как прокрутка страницы.
85 		assignWidget(mWidgetFirstPart, "FirstPart");
86 		if (mWidgetFirstPart != nullptr)
87 		{
88 			mWidgetFirstPart->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
89 			mWidgetFirstPart->eventMouseButtonReleased += newDelegate(this, &ScrollBar::notifyMouseReleased);
90 			mWidgetFirstPart->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
91 		}
92 
93 		///@wskin_child{ScrollBar, Widget, SecondPart} Виджет второй половины прокрутки от трекера до конца, при нажатии восприницмается как прокрутка страницы.
94 		assignWidget(mWidgetSecondPart, "SecondPart");
95 		if (mWidgetSecondPart != nullptr)
96 		{
97 			mWidgetSecondPart->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
98 			mWidgetSecondPart->eventMouseButtonReleased += newDelegate(this, &ScrollBar::notifyMouseReleased);
99 			mWidgetSecondPart->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
100 		}
101 
102 		if (isUserString("MinTrackSize"))
103 			mMinTrackSize = utility::parseValue<int>(getUserString("MinTrackSize"));
104 
105 		if (isUserString("TrackRangeMargins"))
106 			utility::parseComplex<size_t>(getUserString("TrackRangeMargins"), mSkinRangeStart, mSkinRangeEnd);
107 
108 		if (mWidgetTrack != nullptr)
109 		{
110 			if (mWidgetTrack->isUserString("MinTrackSize"))
111 				mMinTrackSize = utility::parseValue<int>(mWidgetTrack->getUserString("MinTrackSize"));
112 		}
113 	}
114 
shutdownOverride()115 	void ScrollBar::shutdownOverride()
116 	{
117 		mWidgetStart = nullptr;
118 		mWidgetEnd = nullptr;
119 		mWidgetTrack = nullptr;
120 		mWidgetFirstPart = nullptr;
121 		mWidgetSecondPart = nullptr;
122 
123 		Base::shutdownOverride();
124 	}
125 
updateTrack()126 	void ScrollBar::updateTrack()
127 	{
128 		if (mWidgetTrack == nullptr)
129 			return;
130 
131 		_forcePick(mWidgetTrack);
132 		// размер диапазана в пикселях
133 		int pos = getLineSize();
134 
135 		if (mVerticalAlignment)
136 		{
137 			// скрываем если диапазан маленький или места мало
138 			if ((mScrollRange < 2) || (pos <= mWidgetTrack->getHeight()))
139 			{
140 				mWidgetTrack->setVisible(false);
141 				if (nullptr != mWidgetFirstPart)
142 					mWidgetFirstPart->setSize(mWidgetFirstPart->getWidth(), pos / 2);
143 				if (nullptr != mWidgetSecondPart)
144 					mWidgetSecondPart->setCoord(mWidgetSecondPart->getLeft(), pos / 2 + (int)mSkinRangeStart, mWidgetSecondPart->getWidth(), pos - pos / 2);
145 				return;
146 			}
147 			// если скрыт то покажем
148 			if (!mWidgetTrack->getVisible())
149 				mWidgetTrack->setVisible(true);
150 
151 			// и обновляем позицию
152 			pos = (int)(((size_t)(pos - getTrackSize()) * mScrollPosition) / (mScrollRange - 1) + mSkinRangeStart);
153 
154 			mWidgetTrack->setPosition(mWidgetTrack->getLeft(), pos);
155 			if (nullptr != mWidgetFirstPart)
156 			{
157 				int height = pos - mWidgetFirstPart->getTop();
158 				mWidgetFirstPart->setSize(mWidgetFirstPart->getWidth(), height);
159 			}
160 			if (nullptr != mWidgetSecondPart)
161 			{
162 				int top = pos + mWidgetTrack->getHeight();
163 				int height = getTrackPlaceLength() - top;
164 				mWidgetSecondPart->setCoord(mWidgetSecondPart->getLeft(), top, mWidgetSecondPart->getWidth(), height);
165 			}
166 		}
167 		else
168 		{
169 			// скрываем если диапазан маленький или места мало
170 			if ((mScrollRange < 2) || (pos <= mWidgetTrack->getWidth()))
171 			{
172 				mWidgetTrack->setVisible(false);
173 				if (nullptr != mWidgetFirstPart)
174 					mWidgetFirstPart->setSize(pos / 2, mWidgetFirstPart->getHeight());
175 				if (nullptr != mWidgetSecondPart)
176 					mWidgetSecondPart->setCoord(pos / 2 + (int)mSkinRangeStart, mWidgetSecondPart->getTop(), pos - pos / 2, mWidgetSecondPart->getHeight());
177 				return;
178 			}
179 			// если скрыт то покажем
180 			if (!mWidgetTrack->getVisible())
181 				mWidgetTrack->setVisible(true);
182 
183 			// и обновляем позицию
184 			pos = (int)(((size_t)(pos - getTrackSize()) * mScrollPosition) / (mScrollRange - 1) + mSkinRangeStart);
185 
186 			mWidgetTrack->setPosition(pos, mWidgetTrack->getTop());
187 			if (nullptr != mWidgetFirstPart)
188 			{
189 				int height = pos - mWidgetFirstPart->getLeft();
190 				mWidgetFirstPart->setSize(height, mWidgetFirstPart->getHeight());
191 			}
192 			if (nullptr != mWidgetSecondPart)
193 			{
194 				int left = pos + mWidgetTrack->getWidth();
195 				int width = getTrackPlaceLength() - left;
196 				mWidgetSecondPart->setCoord(left, mWidgetSecondPart->getTop(), width, mWidgetSecondPart->getHeight());
197 			}
198 		}
199 	}
200 
TrackMove(int _left,int _top)201 	void ScrollBar::TrackMove(int _left, int _top)
202 	{
203 		if (mWidgetTrack == nullptr)
204 			return;
205 
206 		const IntPoint& point = InputManager::getInstance().getLastPressedPosition(MouseButton::Left);
207 
208 		if (mVerticalAlignment)
209 		{
210 			// расчитываем позицию виджета
211 			int start = mPreActionOffset.top + (_top - point.top);
212 			if (start < (int)mSkinRangeStart)
213 				start = (int)mSkinRangeStart;
214 			else if (start > (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getHeight()))
215 				start = (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getHeight());
216 			if (mWidgetTrack->getTop() != start)
217 				mWidgetTrack->setPosition(mWidgetTrack->getLeft(), start);
218 
219 			// расчитываем положение соответствующее позиции
220 			// плюс пол позиции
221 			int pos = start - (int)mSkinRangeStart + (getLineSize() - getTrackSize()) / (((int)mScrollRange - 1) * 2);
222 			// высчитываем ближайшее значение и обновляем
223 			pos = pos * (int)(mScrollRange - 1) / (getLineSize() - getTrackSize());
224 
225 			// проверяем на выходы и изменения
226 			if (pos < 0)
227 				pos = 0;
228 			else if (pos >= (int)mScrollRange)
229 				pos = (int)mScrollRange - 1;
230 			if (pos == (int)mScrollPosition)
231 				return;
232 
233 			mScrollPosition = pos;
234 		}
235 		else
236 		{
237 			// расчитываем позицию виджета
238 			int start = mPreActionOffset.left + (_left - point.left);
239 			if (start < (int)mSkinRangeStart)
240 				start = (int)mSkinRangeStart;
241 			else if (start > (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getWidth()))
242 				start = (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getWidth());
243 			if (mWidgetTrack->getLeft() != start)
244 				mWidgetTrack->setPosition(IntPoint(start, mWidgetTrack->getTop()));
245 
246 			// расчитываем положение соответствующее позиции
247 			// плюс пол позиции
248 			int pos = start - (int)mSkinRangeStart + (getLineSize() - getTrackSize()) / (((int)mScrollRange - 1) * 2);
249 			// высчитываем ближайшее значение и обновляем
250 			pos = pos * (int)(mScrollRange - 1) / (getLineSize() - getTrackSize());
251 
252 			// проверяем на выходы и изменения
253 			if (pos < 0)
254 				pos = 0;
255 			else if (pos >= (int)mScrollRange)
256 				pos = (int)mScrollRange - 1;
257 			if (pos == (int)mScrollPosition)
258 				return;
259 
260 			mScrollPosition = pos;
261 		}
262 
263 		updateTrack();
264 
265 		// отсылаем событие
266 		eventScrollChangePosition(this, (int)mScrollPosition);
267 	}
268 
notifyMousePressed(Widget * _sender,int _left,int _top,MouseButton _id)269 	void ScrollBar::notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id)
270 	{
271 		// диспечерезируем нажатие своих детей как свое
272 		eventMouseButtonPressed(this, _left, _top, _id);
273 
274 		if (MouseButton::Left != _id)
275 			return;
276 
277 		if (mEnableRepeat && _sender != mWidgetTrack
278 			&& ((_sender != mWidgetFirstPart && _sender != mWidgetSecondPart) || !mMoveToClick))
279 		{
280 			ControllerItem* item = ControllerManager::getInstance().createItem(ControllerRepeatClick::getClassTypeName());
281 			ControllerRepeatClick* controller = item->castType<ControllerRepeatClick>();
282 			controller->eventRepeatClick += newDelegate(this, &ScrollBar::repeatClick);
283 			controller->setRepeat(mRepeatTriggerTime, mRepeatStepTime);
284 			ControllerManager::getInstance().addItem(_sender, controller);
285 		}
286 
287 		if (mMoveToClick &&
288 			_sender != mWidgetTrack &&
289 			_sender != mWidgetStart &&
290 			_sender != mWidgetEnd)
291 		{
292 			if (mWidgetTrack != nullptr)
293 			{
294 				mPreActionOffset = InputManager::getInstance().getLastPressedPosition(MouseButton::Left);
295 				const IntPoint& point = InputManager::getInstance().getMousePositionByLayer() - mWidgetTrack->getParent()->getAbsolutePosition();
296 
297 				mPreActionOffset.left -= getTrackSize() / 2;
298 				mPreActionOffset.top -= getTrackSize() / 2;
299 
300 				TrackMove(point.left, point.top);
301 			}
302 		}
303 		else if (_sender == mWidgetStart)
304 		{
305 			widgetStartPressed();
306 		}
307 		else if (_sender == mWidgetEnd)
308 		{
309 			widgetEndPressed();
310 		}
311 		else if (_sender == mWidgetFirstPart)
312 		{
313 			widgetFirstPartPressed();
314 		}
315 		else if (_sender == mWidgetSecondPart)
316 		{
317 			widgetSecondPartPressed();
318 		}
319 		else if (_sender == mWidgetTrack)
320 		{
321 			mPreActionOffset.left = _sender->getLeft();
322 			mPreActionOffset.top = _sender->getTop();
323 		}
324 	}
325 
notifyMouseReleased(Widget * _sender,int _left,int _top,MouseButton _id)326 	void ScrollBar::notifyMouseReleased(Widget* _sender, int _left, int _top, MouseButton _id)
327 	{
328 		updateTrack();
329 		MyGUI::ControllerManager::getInstance().removeItem(_sender);
330 	}
331 
notifyMouseDrag(Widget * _sender,int _left,int _top,MouseButton _id)332 	void ScrollBar::notifyMouseDrag(Widget* _sender, int _left, int _top, MouseButton _id)
333 	{
334 		if (mScrollRange < 2)
335 			return;
336 		if (_id == MouseButton::Left)
337 			TrackMove(_left, _top);
338 	}
339 
setScrollRange(size_t _range)340 	void ScrollBar::setScrollRange(size_t _range)
341 	{
342 		if (_range == mScrollRange)
343 			return;
344 
345 		mScrollRange = _range;
346 		mScrollPosition = (mScrollPosition < mScrollRange) ? mScrollPosition : 0;
347 		updateTrack();
348 	}
349 
setScrollPosition(size_t _position)350 	void ScrollBar::setScrollPosition(size_t _position)
351 	{
352 		if (_position == mScrollPosition)
353 			return;
354 
355 		if (_position >= mScrollRange)
356 			_position = 0;
357 
358 		mScrollPosition = _position;
359 		updateTrack();
360 	}
361 
setPosition(const IntPoint & _point)362 	void ScrollBar::setPosition(const IntPoint& _point)
363 	{
364 		Base::setPosition(_point);
365 	}
366 
setSize(const IntSize & _size)367 	void ScrollBar::setSize(const IntSize& _size)
368 	{
369 		Base::setSize(_size);
370 		// обновляем трек
371 		updateTrack();
372 	}
373 
setCoord(const IntCoord & _coord)374 	void ScrollBar::setCoord(const IntCoord& _coord)
375 	{
376 		Base::setCoord(_coord);
377 		// обновляем трек
378 		updateTrack();
379 	}
380 
setTrackSize(int _size)381 	void ScrollBar::setTrackSize(int _size)
382 	{
383 		if (mWidgetTrack != nullptr)
384 		{
385 			if (mVerticalAlignment)
386 				mWidgetTrack->setSize(mWidgetTrack->getWidth(), ((int)_size < (int)mMinTrackSize) ? (int)mMinTrackSize : (int)_size);
387 			else
388 				mWidgetTrack->setSize(((int)_size < (int)mMinTrackSize) ? (int)mMinTrackSize : (int)_size, mWidgetTrack->getHeight());
389 		}
390 		updateTrack();
391 	}
392 
setRepeatTriggerTime(float time)393 	void ScrollBar::setRepeatTriggerTime(float time)
394 	{
395 		mRepeatTriggerTime = time;
396 	}
397 
setRepeatStepTime(float time)398 	void ScrollBar::setRepeatStepTime(float time)
399 	{
400 		mRepeatStepTime = time;
401 	}
402 
getRepeatTriggerTime(float time) const403 	float ScrollBar::getRepeatTriggerTime(float time) const
404 	{
405 		return mRepeatTriggerTime;
406 	}
407 
getRepeatStepTime(float time) const408 	float ScrollBar::getRepeatStepTime(float time) const
409 	{
410 		return mRepeatStepTime;
411 	}
412 
setRepeatEnabled(bool enabled)413 	void ScrollBar::setRepeatEnabled(bool enabled)
414 	{
415 		mEnableRepeat = enabled;
416 	}
417 
getRepeatEnabled() const418 	bool ScrollBar::getRepeatEnabled() const
419 	{
420 		return mEnableRepeat;
421 	}
422 
getTrackSize() const423 	int ScrollBar::getTrackSize() const
424 	{
425 		if (mWidgetTrack != nullptr)
426 		{
427 			if (mVerticalAlignment)
428 				return mWidgetTrack->getHeight();
429 			else
430 				return mWidgetTrack->getWidth();
431 		}
432 		return 1;
433 	}
434 
getLineSize() const435 	int ScrollBar::getLineSize() const
436 	{
437 		return getTrackPlaceLength() - (int)(mSkinRangeStart + mSkinRangeEnd);
438 	}
439 
onMouseWheel(int _rel)440 	void ScrollBar::onMouseWheel(int _rel)
441 	{
442 		notifyMouseWheel(nullptr, _rel);
443 
444 		Base::onMouseWheel(_rel);
445 	}
446 
notifyMouseWheel(Widget * _sender,int _rel)447 	void ScrollBar::notifyMouseWheel(Widget* _sender, int _rel)
448 	{
449 		if (mScrollRange < 2)
450 			return;
451 
452 		int offset = mScrollPosition;
453 		if (_rel < 0)
454 			offset += mScrollWheelPage;
455 		else
456 			offset -= mScrollWheelPage;
457 
458 		if (offset < 0)
459 			offset = 0;
460 		else if (offset > (int)(mScrollRange - 1))
461 			offset = mScrollRange - 1;
462 
463 		if ((size_t)offset != mScrollPosition)
464 		{
465 			mScrollPosition = offset;
466 			// оповещаем
467 			eventScrollChangePosition(this, (int)mScrollPosition);
468 			updateTrack();
469 		}
470 	}
471 
repeatClick(Widget * _widget,ControllerItem * _controller)472 	void ScrollBar::repeatClick(Widget *_widget, ControllerItem *_controller)
473 	{
474 		if (_widget == mWidgetStart)
475 			widgetStartPressed();
476 		else if (_widget == mWidgetEnd)
477 			widgetEndPressed();
478 		else if (_widget == mWidgetFirstPart)
479 			widgetFirstPartPressed();
480 		else if (_widget == mWidgetSecondPart)
481 			widgetSecondPartPressed();
482 	}
483 
widgetStartPressed()484 	void ScrollBar::widgetStartPressed()
485 	{
486 		// минимальное значение
487 		if (mScrollPosition == 0)
488 			return;
489 
490 		// расчитываем следующее положение
491 		if (mScrollPosition > mScrollPage)
492 			mScrollPosition -= mScrollPage;
493 		else
494 			mScrollPosition = 0;
495 
496 		// оповещаем
497 		eventScrollChangePosition(this, (int)mScrollPosition);
498 		updateTrack();
499 	}
500 
widgetEndPressed()501 	void ScrollBar::widgetEndPressed()
502 	{
503 		// максимальное значение
504 		if ((mScrollRange < 2) || (mScrollPosition >= (mScrollRange - 1)))
505 			return;
506 
507 		// расчитываем следующее положение
508 		if ((mScrollPosition + mScrollPage) < (mScrollRange - 1))
509 			mScrollPosition += mScrollPage;
510 		else
511 			mScrollPosition = mScrollRange - 1;
512 
513 		// оповещаем
514 		eventScrollChangePosition(this, (int)mScrollPosition);
515 		updateTrack();
516 	}
517 
widgetFirstPartPressed()518 	void ScrollBar::widgetFirstPartPressed()
519 	{
520 		// минимальное значение
521 		if (mScrollPosition == 0)
522 			return;
523 
524 		// расчитываем следующее положение
525 		if (mScrollPosition > mScrollViewPage)
526 			mScrollPosition -= mScrollViewPage;
527 		else
528 			mScrollPosition = 0;
529 
530 		// оповещаем
531 		eventScrollChangePosition(this, (int)mScrollPosition);
532 		updateTrack();
533 	}
534 
widgetSecondPartPressed()535 	void ScrollBar::widgetSecondPartPressed()
536 	{
537 		// максимальное значение
538 		if ((mScrollRange < 2) || (mScrollPosition >= (mScrollRange - 1)))
539 			return;
540 
541 		// расчитываем следующее положение
542 		if ((mScrollPosition + mScrollViewPage) < (mScrollRange - 1))
543 			mScrollPosition += mScrollViewPage;
544 		else
545 			mScrollPosition = mScrollRange - 1;
546 
547 		// оповещаем
548 		eventScrollChangePosition(this, (int)mScrollPosition);
549 		updateTrack();
550 	}
551 
setPropertyOverride(const std::string & _key,const std::string & _value)552 	void ScrollBar::setPropertyOverride(const std::string& _key, const std::string& _value)
553 	{
554 		/// @wproperty{ScrollBar, Range, size_t} Диапазон прокрутки.
555 		if (_key == "Range")
556 			setScrollRange(utility::parseValue<size_t>(_value));
557 
558 		/// @wproperty{ScrollBar, RangePosition, size_t} Положение прокрутки.
559 		else if (_key == "RangePosition")
560 			setScrollPosition(utility::parseValue<size_t>(_value));
561 
562 		/// @wproperty{ScrollBar, Page, size_t} Шаг прокрутки при нажатии на кнопку начала или конца.
563 		else if (_key == "Page")
564 			setScrollPage(utility::parseValue<size_t>(_value));
565 
566 		/// @wproperty{ScrollBar, ViewPage, size_t} Шаг прокрутки при нажатии на одну из частей от кнопки до трекера.
567 		else if (_key == "ViewPage")
568 			setScrollViewPage(utility::parseValue<size_t>(_value));
569 
570 		/// @wproperty{ScrollBar, WheelPage, size_t} Шаг прокрутки при прокрутке колесиком мыши.
571 		else if (_key == "WheelPage")
572 			setScrollWheelPage(utility::parseValue<size_t>(_value));
573 
574 		/// @wproperty{ScrollBar, MoveToClick, bool} Режим перескакивания бегунка к месту клика.
575 		else if (_key == "MoveToClick")
576 			setMoveToClick(utility::parseValue<bool>(_value));
577 
578 		/// @wproperty{ScrollBar, VerticalAlignment, bool} Вертикальное выравнивание.
579 		else if (_key == "VerticalAlignment")
580 			setVerticalAlignment(utility::parseValue<bool>(_value));
581 
582 		/// @wproperty{ScrollBar, Repeat, bool} Sets whether scrollbar buttons should be triggered repeatedly so long as the mouse button is pressed down.
583 		else if (_key == "Repeat")
584 			setRepeatEnabled(utility::parseValue<bool>(_value));
585 
586 		/// @wproperty{ScrollBar, RepeatTriggerTime, float} How long the mouse needs to be pressed on a scrollbar button for repeating to start.
587 		else if (_key == "RepeatTriggerTime")
588 			setRepeatTriggerTime(utility::parseValue<float>(_value));
589 
590 		/// @wproperty{ScrollBar, RepeatStepTime, float) The time between each repeat step once repeating has started.
591 		else if (_key == "RepeatStepTime")
592 			setRepeatStepTime(utility::parseValue<float>(_value));
593 
594 		else
595 		{
596 			Base::setPropertyOverride(_key, _value);
597 			return;
598 		}
599 
600 		eventChangeProperty(this, _key, _value);
601 	}
602 
getScrollRange() const603 	size_t ScrollBar::getScrollRange() const
604 	{
605 		return mScrollRange;
606 	}
607 
getScrollPosition() const608 	size_t ScrollBar::getScrollPosition() const
609 	{
610 		return mScrollPosition;
611 	}
612 
setScrollPage(size_t _value)613 	void ScrollBar::setScrollPage(size_t _value)
614 	{
615 		mScrollPage = _value;
616 	}
617 
getScrollPage() const618 	size_t ScrollBar::getScrollPage() const
619 	{
620 		return mScrollPage;
621 	}
622 
setScrollViewPage(size_t _value)623 	void ScrollBar::setScrollViewPage(size_t _value)
624 	{
625 		mScrollViewPage = _value;
626 	}
627 
getScrollViewPage() const628 	size_t ScrollBar::getScrollViewPage() const
629 	{
630 		return mScrollViewPage;
631 	}
632 
setScrollWheelPage(size_t _value)633 	void ScrollBar::setScrollWheelPage(size_t _value)
634 	{
635 		mScrollWheelPage = _value;
636 	}
getScrollWheelPage() const637 	size_t ScrollBar::getScrollWheelPage() const
638 	{
639 		return mScrollWheelPage;
640 	}
641 
setMinTrackSize(int _value)642 	void ScrollBar::setMinTrackSize(int _value)
643 	{
644 		mMinTrackSize = _value;
645 	}
646 
getMinTrackSize() const647 	int ScrollBar::getMinTrackSize() const
648 	{
649 		return mMinTrackSize;
650 	}
651 
setMoveToClick(bool _value)652 	void ScrollBar::setMoveToClick(bool _value)
653 	{
654 		mMoveToClick = _value;
655 	}
656 
getMoveToClick() const657 	bool ScrollBar::getMoveToClick() const
658 	{
659 		return mMoveToClick;
660 	}
661 
getTrackPlaceLength() const662 	int ScrollBar::getTrackPlaceLength() const
663 	{
664 		if (mWidgetTrack != nullptr)
665 		{
666 			if (mVerticalAlignment)
667 				return mWidgetTrack->getParent()->getHeight();
668 			else
669 				return mWidgetTrack->getParent()->getWidth();
670 		}
671 		return 0;
672 	}
673 
setVerticalAlignment(bool _value)674 	void ScrollBar::setVerticalAlignment(bool _value)
675 	{
676 		mVerticalAlignment = _value;
677 
678 		updateTrack();
679 	}
680 
getVerticalAlignment() const681 	bool ScrollBar::getVerticalAlignment() const
682 	{
683 		return mVerticalAlignment;
684 	}
685 
686 } // namespace MyGUI
687