| 185 | } |
| 186 | |
| 187 | void ScrollBar::TrackMove(int _left, int _top) |
| 188 | { |
| 189 | if (mWidgetTrack == nullptr) |
| 190 | return; |
| 191 | |
| 192 | const IntPoint& point = InputManager::getInstance().getLastPressedPosition(MouseButton::Left); |
| 193 | |
| 194 | if (mVerticalAlignment) |
| 195 | { |
| 196 | // расчитываем позицию виджета |
| 197 | int start = mPreActionOffset.top + (_top - point.top); |
| 198 | if (start < (int)mSkinRangeStart) |
| 199 | start = (int)mSkinRangeStart; |
| 200 | else if (start > (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getHeight())) |
| 201 | start = (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getHeight()); |
| 202 | if (mWidgetTrack->getTop() != start) |
| 203 | mWidgetTrack->setPosition(mWidgetTrack->getLeft(), start); |
| 204 | |
| 205 | int pos = 0; |
| 206 | if (mScrollRange >= 2) |
| 207 | { |
| 208 | // расчитываем положение соответствующее позиции |
| 209 | // плюс пол позиции |
| 210 | pos = start - (int)mSkinRangeStart + (getLineSize() - getTrackSize()) / (((int)mScrollRange - 1) * 2); |
| 211 | // высчитываем ближайшее значение и обновляем |
| 212 | pos = pos * (int)(mScrollRange - 1) / (getLineSize() - getTrackSize()); |
| 213 | } |
| 214 | |
| 215 | // проверяем на выходы и изменения |
| 216 | if (pos < 0) |
| 217 | pos = 0; |
| 218 | else if (pos >= (int)mScrollRange) |
| 219 | pos = (int)mScrollRange - 1; |
| 220 | if (pos == (int)mScrollPosition) |
| 221 | return; |
| 222 | |
| 223 | mScrollPosition = pos; |
| 224 | } |
| 225 | else |
| 226 | { |
| 227 | // расчитываем позицию виджета |
| 228 | int start = mPreActionOffset.left + (_left - point.left); |
| 229 | if (start < (int)mSkinRangeStart) |
| 230 | start = (int)mSkinRangeStart; |
| 231 | else if (start > (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getWidth())) |
| 232 | start = (getTrackPlaceLength() - (int)mSkinRangeEnd - mWidgetTrack->getWidth()); |
| 233 | if (mWidgetTrack->getLeft() != start) |
| 234 | mWidgetTrack->setPosition(IntPoint(start, mWidgetTrack->getTop())); |
| 235 | |
| 236 | int pos = 0; |
| 237 | if (mScrollRange >= 2) |
| 238 | { |
| 239 | // расчитываем положение соответствующее позиции |
| 240 | // плюс пол позиции |
| 241 | pos = start - (int)mSkinRangeStart + (getLineSize() - getTrackSize()) / (((int)mScrollRange - 1) * 2); |
| 242 | // высчитываем ближайшее значение и обновляем |
| 243 | pos = pos * (int)(mScrollRange - 1) / (getLineSize() - getTrackSize()); |
| 244 | } |