Fix window logic to stop stealing scrollbar focus
This commit is contained in:
parent
4e585a4939
commit
ca415619dd
@ -374,23 +374,57 @@ i32 userInterface_window(UiState *const uiState, MemoryArena *const arena,
|
|||||||
renderer_staticString(renderer, arena, font, window->title, menuTitleP,
|
renderer_staticString(renderer, arena, font, window->title, menuTitleP,
|
||||||
V2(0, 0), 0, V4(0, 0, 0, 1));
|
V2(0, 0), 0, V4(0, 0, 0, 1));
|
||||||
|
|
||||||
|
/* Draw window elements */
|
||||||
|
i32 firstActiveChildId = -1;
|
||||||
|
for (i32 i = 0; i < window->numChildUiItems; i++)
|
||||||
|
{
|
||||||
|
UiItem *childUi = &window->childUiItems[i];
|
||||||
|
|
||||||
|
// TODO(doyle): Redundant? If we can only have 1 active child at a time
|
||||||
|
// What about overlapping elements?
|
||||||
|
i32 getChildActiveState = -1;
|
||||||
|
switch(childUi->type)
|
||||||
|
{
|
||||||
|
case uitype_button:
|
||||||
|
// TODO(doyle): Bug in font rendering once button reaches 700-800+
|
||||||
|
// pixels
|
||||||
|
getChildActiveState = userInterface_button(
|
||||||
|
uiState, arena, assetManager, renderer, font, input,
|
||||||
|
childUi->id, childUi->rect, childUi->label);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case uitype_scrollbar:
|
||||||
|
getChildActiveState = userInterface_scrollbar(
|
||||||
|
uiState, assetManager, renderer, input, childUi->id,
|
||||||
|
childUi->rect, &childUi->value, childUi->maxValue);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case uitype_textField:
|
||||||
|
getChildActiveState = userInterface_textField(
|
||||||
|
uiState, arena, assetManager, renderer, font, input,
|
||||||
|
childUi->id, childUi->rect, childUi->string);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DEBUG_LOG(
|
||||||
|
"userInterface_window() warning: Enum uitype unrecognised");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(doyle): Capture only the first active id, but keep loop going to
|
||||||
|
// render the rest of the window ui
|
||||||
|
if (firstActiveChildId == -1 && getChildActiveState > 0)
|
||||||
|
firstActiveChildId = getChildActiveState;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (firstActiveChildId != -1)
|
||||||
|
return firstActiveChildId;
|
||||||
|
|
||||||
// NOTE(doyle): activeItem captures mouse click within the UI bounds, but if
|
// NOTE(doyle): activeItem captures mouse click within the UI bounds, but if
|
||||||
// the user drags the mouse outside the bounds quicker than the game updates
|
// the user drags the mouse outside the bounds quicker than the game updates
|
||||||
// then we use a second flag which only "unclicks" when the mouse is let go
|
// then we use a second flag which only "unclicks" when the mouse is let go
|
||||||
if (uiState->activeItem == window->id) window->windowHeld = TRUE;
|
if (uiState->activeItem == window->id) window->windowHeld = TRUE;
|
||||||
|
|
||||||
#if 0
|
|
||||||
for (i32 i = 0; i < window->numChildItems; i++)
|
|
||||||
{
|
|
||||||
if (uiState->activeItem == window->childUiId[i])
|
|
||||||
{
|
|
||||||
window->windowHeld = FALSE;
|
|
||||||
window->prevFrameWindowHeld = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (window->windowHeld)
|
if (window->windowHeld)
|
||||||
{
|
{
|
||||||
if (!input.keys[keycode_mouseLeft].endedDown)
|
if (!input.keys[keycode_mouseLeft].endedDown)
|
||||||
@ -426,52 +460,6 @@ i32 userInterface_window(UiState *const uiState, MemoryArena *const arena,
|
|||||||
window->prevMouseP = input.mouseP;
|
window->prevMouseP = input.mouseP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw window elements */
|
|
||||||
i32 firstActiveChildId = -1;
|
|
||||||
for (i32 i = 0; i < window->numChildUiItems; i++)
|
|
||||||
{
|
|
||||||
UiItem *childUi = &window->childUiItems[i];
|
|
||||||
|
|
||||||
// TODO(doyle): Redundant? If we can only have 1 active child at a time
|
|
||||||
// What about overlapping elements?
|
|
||||||
i32 getChildActiveState = -1;
|
|
||||||
switch(childUi->type)
|
|
||||||
{
|
|
||||||
case uitype_button:
|
|
||||||
// TODO(doyle): Bug in font rendering once button reaches 700-800+
|
|
||||||
// pixels
|
|
||||||
getChildActiveState = userInterface_button(
|
|
||||||
uiState, arena, assetManager, renderer, font, input,
|
|
||||||
childUi->id, childUi->rect, childUi->label);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case uitype_scrollbar:
|
|
||||||
// TODO(doyle): window steals scrollbar focus
|
|
||||||
getChildActiveState = userInterface_scrollbar(
|
|
||||||
uiState, assetManager, renderer, input, childUi->id,
|
|
||||||
childUi->rect, &childUi->value, childUi->maxValue);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case uitype_textField:
|
|
||||||
getChildActiveState = userInterface_textField(
|
|
||||||
uiState, arena, assetManager, renderer, font, input,
|
|
||||||
childUi->id, childUi->rect, childUi->string);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DEBUG_LOG(
|
|
||||||
"userInterface_window() warning: Enum uitype unrecognised");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(doyle): Capture only the first active id, but keep loop going to
|
|
||||||
// render the rest of the window ui
|
|
||||||
if (firstActiveChildId == -1 && getChildActiveState > 0)
|
|
||||||
firstActiveChildId = getChildActiveState;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstActiveChildId != -1)
|
|
||||||
return firstActiveChildId;
|
|
||||||
|
|
||||||
if (!input.keys[keycode_mouseLeft].endedDown &&
|
if (!input.keys[keycode_mouseLeft].endedDown &&
|
||||||
uiState->hotItem == window->id &&
|
uiState->hotItem == window->id &&
|
||||||
|
Loading…
Reference in New Issue
Block a user