bool GUIFloatField::_mouseEvent(const GUIMouseEvent& event) { GUIElementContainer::_mouseEvent(event); Rect2I draggableArea; if(mLabel != nullptr) draggableArea = mLabel->_getLayoutData().area; if(event.getType() == GUIMouseEventType::MouseDragStart) { if (!_isDisabled()) { if (draggableArea.contains(event.getDragStartPosition())) { mLastDragPos = event.getPosition().x; mIsDragging = true; } } return true; } else if(event.getType() == GUIMouseEventType::MouseDrag) { if (!_isDisabled()) { if (mIsDragging) { INT32 xDiff = event.getPosition().x - mLastDragPos; INT32 jumpAmount = 0; Rect2I viewArea = _getParentWidget()->getTarget()->getPixelArea(); if (event.getPosition().x <= 0) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); jumpAmount = viewArea.width - event.getPosition().x - 1; cursorScreenPos.x += jumpAmount; Cursor::instance().setScreenPosition(cursorScreenPos); } else if (event.getPosition().x >= (INT32)viewArea.width) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); jumpAmount = -(INT32)viewArea.width - (event.getPosition().x - (INT32)viewArea.width) + 1; cursorScreenPos.x += jumpAmount; Cursor::instance().setScreenPosition(cursorScreenPos); } float oldValue = getValue(); float newValue = oldValue + xDiff * DRAG_SPEED; mLastDragPos = event.getPosition().x + jumpAmount; if (oldValue != newValue) valueChanged(newValue); } } return true; } else if(event.getType() == GUIMouseEventType::MouseDragEnd) { if (!_isDisabled()) mIsDragging = false; return true; } return false; }
bool GUIIntField::_mouseEvent(const GUIMouseEvent& event) { GUIElementContainer::_mouseEvent(event); Rect2I draggableArea; if(mLabel != nullptr) draggableArea = mLabel->_getLayoutData().area; if(event.getType() == GUIMouseEventType::MouseDragStart) { if (!_isDisabled()) { if (draggableArea.contains(event.getDragStartPosition())) { mLastDragPos = event.getPosition().x; mIsDragging = true; } } return true; } else if(event.getType() == GUIMouseEventType::MouseDrag) { if (!_isDisabled()) { if (mIsDragging) { INT32 xDiff = event.getPosition().x - mLastDragPos; INT32 jumpAmount = 0; if (event.getPosition().x < 0) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); cursorScreenPos.x += _getParentWidget()->getTarget()->getWidth(); jumpAmount = _getParentWidget()->getTarget()->getWidth(); Cursor::instance().setScreenPosition(cursorScreenPos); } else if (event.getPosition().x >= _getParentWidget()->getTarget()->getWidth()) { Vector2I cursorScreenPos = Cursor::instance().getScreenPosition(); cursorScreenPos.x -= _getParentWidget()->getTarget()->getWidth(); jumpAmount = -_getParentWidget()->getTarget()->getWidth(); Cursor::instance().setScreenPosition(cursorScreenPos); } INT32 oldValue = getValue(); INT32 newValue = oldValue; if (xDiff >= DRAG_SPEED) { while (xDiff >= DRAG_SPEED) { newValue++; xDiff -= DRAG_SPEED; } } else if (xDiff <= -DRAG_SPEED) { while (xDiff <= -DRAG_SPEED) { newValue--; xDiff += DRAG_SPEED; } } mLastDragPos += (newValue - oldValue) * DRAG_SPEED + jumpAmount; if (oldValue != newValue) valueChanged(newValue); } } return true; } else if(event.getType() == GUIMouseEventType::MouseDragEnd) { if (!_isDisabled()) mIsDragging = false; return true; } return false; }