Clean up scroll bar implementation
This commit is contained in:
parent
2d7262aa22
commit
4127542d1d
@ -929,12 +929,12 @@ INTERNAL i32 button(UiState *uiState, AssetManager *assetManager,
|
||||
{
|
||||
// Set focus to nothing and let next widget get focus
|
||||
uiState->kbdItem = 0;
|
||||
if (input->leftShift)
|
||||
if (input.leftShift)
|
||||
uiState->kbdItem = uiState->lastWidget;
|
||||
|
||||
// Clear key state so next widget doesn't auto grab
|
||||
input->space = FALSE;
|
||||
input->leftShift = FALSE;
|
||||
input.space = FALSE;
|
||||
input.leftShift = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -951,48 +951,60 @@ INTERNAL i32 button(UiState *uiState, AssetManager *assetManager,
|
||||
}
|
||||
|
||||
INTERNAL i32 scrollBar(UiState *uiState, AssetManager *assetManager,
|
||||
Renderer *renderer, KeyInput input, i32 id, Rect rect,
|
||||
i32 *value, i32 max)
|
||||
Renderer *renderer, KeyInput input, i32 id,
|
||||
Rect scrollBarRect, i32 *value, i32 maxValue)
|
||||
{
|
||||
i32 yPos = ((256 - 16) * (*value)) / max;
|
||||
#ifdef DENGINE_DEBUG
|
||||
ASSERT(*value <= maxValue);
|
||||
#endif
|
||||
|
||||
Rect scrollRect;
|
||||
scrollRect.pos = v2_add(rect.pos, V2i(8, 8));
|
||||
scrollRect.size = V2(16, 255);
|
||||
if (math_pointInRect(scrollRect, input.mouseP))
|
||||
if (math_pointInRect(scrollBarRect, input.mouseP))
|
||||
{
|
||||
uiState->hotItem = id;
|
||||
if (uiState->activeItem == 0 && input.mouseLeft)
|
||||
uiState->activeItem = id;
|
||||
}
|
||||
|
||||
v2 scrollBarSize = V2(32, 256 + 16);
|
||||
RenderTex renderTex = renderer_createNullRenderTex(assetManager);
|
||||
renderer_staticRect(renderer, rect.pos, scrollBarSize, V2(0, 0), 0,
|
||||
renderTex, V4(0.5f, 0.5f, 0.5f, 1));
|
||||
|
||||
// Render scroll bar background
|
||||
renderer_staticRect(renderer, scrollBarRect.pos, scrollBarRect.size,
|
||||
V2(0, 0), 0, renderTex, V4(0.75f, 0.5f, 0.5f, 1));
|
||||
|
||||
// Render scroll bar slider
|
||||
v2 sliderSize = V2(16, 16);
|
||||
v4 sliderColor = V4(0, 0, 0, 1);
|
||||
|
||||
f32 sliderPercentageOffset = (CAST(f32) *value / CAST(f32) maxValue);
|
||||
f32 sliderYOffsetToBar =
|
||||
(scrollBarRect.size.h - sliderSize.h) * sliderPercentageOffset;
|
||||
v2 sliderPos = v2_add(scrollBarRect.pos, V2(0, sliderYOffsetToBar));
|
||||
|
||||
if (uiState->hotItem == id || uiState->activeItem == id)
|
||||
{
|
||||
renderer_staticRect(renderer, v2_add(V2i(8, 8 + yPos), rect.pos),
|
||||
V2(16, 16), V2(0, 0), 0, renderTex,
|
||||
V4(1.0f, 0, 0, 1));
|
||||
}
|
||||
sliderColor = V4(1.0f, 0, 0, 1);
|
||||
else
|
||||
{
|
||||
renderer_staticRect(renderer, v2_add(V2i(8, 8 + yPos), rect.pos),
|
||||
V2(16, 16), V2(0, 0), 0, renderTex,
|
||||
V4(0, 1.0f, 0, 1));
|
||||
}
|
||||
sliderColor = V4(0.0f, 1.0f, 0, 1);
|
||||
|
||||
renderer_staticRect(renderer, sliderPos, sliderSize, V2(0, 0), 0, renderTex,
|
||||
sliderColor);
|
||||
|
||||
if (uiState->activeItem == id)
|
||||
{
|
||||
i32 mousePos = CAST(i32)(input.mouseP.y - (rect.pos.y + 8));
|
||||
if (mousePos < 0) mousePos = 0;
|
||||
if (mousePos > 255) mousePos = 255;
|
||||
i32 v = (mousePos * max) / 255;
|
||||
if (v != *value)
|
||||
f32 mouseYRelToRect = input.mouseP.y - scrollBarRect.pos.y;
|
||||
|
||||
// Bounds check
|
||||
if (mouseYRelToRect < 0)
|
||||
mouseYRelToRect = 0;
|
||||
else if (mouseYRelToRect > scrollBarRect.size.h)
|
||||
mouseYRelToRect = scrollBarRect.size.h;
|
||||
|
||||
f32 newSliderPercentOffset =
|
||||
(CAST(f32) mouseYRelToRect / scrollBarRect.size.h);
|
||||
|
||||
i32 newValue = CAST(i32)(newSliderPercentOffset * CAST(f32)maxValue);
|
||||
if (newValue != *value)
|
||||
{
|
||||
*value = v;
|
||||
*value = newValue;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user