Slider widget

This commit is contained in:
IlyaShurupov 2024-10-18 10:03:45 +03:00 committed by Ilya Shurupov
parent b1ba1c2975
commit 03da5e41d6
4 changed files with 98 additions and 1 deletions

View file

@ -79,3 +79,52 @@ void ButtonWidget::mouseLeave() {
triggerWidgetUpdate("button out of focus");
}
void SliderWidget::process(const EventHandler& events) {
const auto pointer = events.getPointer();
switch (mState) {
case SLIDING:
if (events.isReleased(InputID::MOUSE1)) {
mState = IDLE;
freeFocus();
}
mFactor = ((pointer - mHandleSize / 2) / (getArea().relative().size - mHandleSize)).x;
mFactor = clamp(mFactor, 0.f, 1.f);
break;
case IDLE:
case HOVER:
mState = getHandleArea().isInside(pointer) ? HOVER : IDLE;
if (getRelativeAreaT().isInside(pointer) && events.isPressed(InputID::MOUSE1)) {
mState = SLIDING;
lockFocus();
}
break;
}
}
void SliderWidget::draw(Canvas& canvas) {
canvas.rect(getArea().relative(), mColorBG, mRounding);
switch (mState) {
case IDLE: canvas.rect(getHandleArea(), mColorIdle, mRounding); break;
case HOVER: canvas.rect(getHandleArea(), mColorHovered, mRounding); break;
case SLIDING: canvas.rect(getHandleArea(), mColorActive, mRounding); break;
}
}
RectF SliderWidget::getHandleArea() const {
auto area = getArea().relative();
const auto& size = area.size;
auto center = area.center();
auto tilt = -(mFactor - 0.5f) * 2;
area.pos.x = center.x - (tilt * ((size.x - mHandleSize) / 2)) - mHandleSize / 2;
area.size.x = mHandleSize;
return area;
}