Add basic scrollbar imgui code
This commit is contained in:
parent
f85ab5c86d
commit
2d7262aa22
@ -885,8 +885,24 @@ INTERNAL i32 button(UiState *uiState, AssetManager *assetManager,
|
||||
}
|
||||
|
||||
RenderTex renderTex = renderer_createNullRenderTex(assetManager);
|
||||
|
||||
/* If no widget has keyboard focus, take it */
|
||||
if (uiState->kbdItem == 0)
|
||||
uiState->kbdItem = id;
|
||||
|
||||
/* If we have keyboard focus, show it */
|
||||
if (uiState->kbdItem == id)
|
||||
{
|
||||
// Draw outline
|
||||
renderer_staticRect(renderer, v2_add(V2(-6, -6), rect.pos),
|
||||
v2_add(V2(20, 20), rect.size), V2(0, 0), 0, renderTex,
|
||||
V4(1.0f, 0, 0, 1));
|
||||
}
|
||||
|
||||
// Draw shadow
|
||||
renderer_staticRect(renderer, v2_add(V2(8, 8), rect.pos), rect.size,
|
||||
V2(0, 0), 0, renderTex, V4(0, 0, 0, 1));
|
||||
|
||||
if (uiState->hotItem == id)
|
||||
{
|
||||
if (uiState->activeItem == id)
|
||||
@ -906,6 +922,24 @@ INTERNAL i32 button(UiState *uiState, AssetManager *assetManager,
|
||||
V2(0, 0), 0, renderTex, V4(0.5f, 0.5f, 0.5f, 1));
|
||||
}
|
||||
|
||||
// After renderering before click check, see if we need to process keys
|
||||
if (uiState->kbdItem == id)
|
||||
{
|
||||
if (input.space)
|
||||
{
|
||||
// Set focus to nothing and let next widget get focus
|
||||
uiState->kbdItem = 0;
|
||||
if (input->leftShift)
|
||||
uiState->kbdItem = uiState->lastWidget;
|
||||
|
||||
// Clear key state so next widget doesn't auto grab
|
||||
input->space = FALSE;
|
||||
input->leftShift = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
uiState->lastWidget = id;
|
||||
|
||||
if (!input.mouseLeft &&
|
||||
uiState->hotItem == id &&
|
||||
uiState->activeItem == id)
|
||||
@ -916,6 +950,56 @@ INTERNAL i32 button(UiState *uiState, AssetManager *assetManager,
|
||||
return 0;
|
||||
}
|
||||
|
||||
INTERNAL i32 scrollBar(UiState *uiState, AssetManager *assetManager,
|
||||
Renderer *renderer, KeyInput input, i32 id, Rect rect,
|
||||
i32 *value, i32 max)
|
||||
{
|
||||
i32 yPos = ((256 - 16) * (*value)) / max;
|
||||
|
||||
Rect scrollRect;
|
||||
scrollRect.pos = v2_add(rect.pos, V2i(8, 8));
|
||||
scrollRect.size = V2(16, 255);
|
||||
if (math_pointInRect(scrollRect, 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));
|
||||
|
||||
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));
|
||||
}
|
||||
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));
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
*value = v;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
||||
{
|
||||
if (dt >= 1.0f) dt = 1.0f;
|
||||
@ -1178,6 +1262,11 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
||||
button(&state->uiState, assetManager, renderer, state->input, 3,
|
||||
buttonRectC);
|
||||
|
||||
LOCAL_PERSIST i32 scrollValue = 30;
|
||||
Rect scrollRectA = {V2(900, 500), V2(16, 255)};
|
||||
scrollBar(&state->uiState, assetManager, renderer, state->input, 3,
|
||||
scrollRectA, &scrollValue, 160);
|
||||
|
||||
// RESET IMGUI
|
||||
if (!state->input.mouseLeft) state->uiState.activeItem = 0;
|
||||
else if (state->uiState.activeItem == 0) state->uiState.activeItem = -1;
|
||||
|
@ -14,6 +14,7 @@ enum KeyCodes
|
||||
keycode_left,
|
||||
keycode_right,
|
||||
keycode_space,
|
||||
keycode_leftShift,
|
||||
keycode_mouseLeft,
|
||||
keycode_count,
|
||||
};
|
||||
|
@ -17,6 +17,12 @@ typedef struct UiState
|
||||
{
|
||||
i32 hotItem;
|
||||
i32 activeItem;
|
||||
|
||||
i32 kbdItem;
|
||||
i32 keyEntered;
|
||||
i32 keyMod;
|
||||
|
||||
i32 lastWidget;
|
||||
} UiState;
|
||||
|
||||
typedef struct World
|
||||
|
Loading…
Reference in New Issue
Block a user