fix & improve platform popups

This commit is contained in:
2026-03-05 17:43:19 -05:00
parent cb7ecbd3f7
commit a0875fd1ff
12 changed files with 189 additions and 17 deletions

View File

@@ -126,6 +126,20 @@ static const char *g_icon_svgs[UI_ICON_COUNT] = {
R"(<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="8" fill="white"/>
</svg>)",
// UI_ICON_POP_OUT - box with arrow pointing out (top-right)
R"(<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<rect x="3" y="6" width="14" height="14" rx="2" stroke="white" stroke-width="2" fill="none"/>
<path d="M14 3 L21 3 L21 10" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
<path d="M21 3 L12 12" stroke="white" stroke-width="2" stroke-linecap="round"/>
</svg>)",
// UI_ICON_POP_IN - arrow pointing into a box (bottom-left)
R"(<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<rect x="3" y="6" width="14" height="14" rx="2" stroke="white" stroke-width="2" fill="none"/>
<path d="M21 3 L12 12" stroke="white" stroke-width="2" stroke-linecap="round"/>
<path d="M12 5 L12 12 L19 12" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
</svg>)",
};
U8 *ui_icons_rasterize_atlas(S32 *out_w, S32 *out_h, S32 icon_size) {

View File

@@ -14,6 +14,8 @@ enum UI_IconID {
UI_ICON_TRANSPORT_STOP,
UI_ICON_TRANSPORT_PLAY,
UI_ICON_TRANSPORT_RECORD,
UI_ICON_POP_OUT,
UI_ICON_POP_IN,
UI_ICON_COUNT
};

View File

@@ -2,6 +2,12 @@
static PopupWindow g_popups[MAX_POPUP_WINDOWS];
static void popup_frame_callback(void *user_data) {
PopupWindow *popup = (PopupWindow *)user_data;
if (popup && popup->alive)
popup_do_frame(popup, 1.0f / 60.0f);
}
PopupWindow *popup_find_by_flag(B32 *flag) {
for (S32 i = 0; i < MAX_POPUP_WINDOWS; i++)
if (g_popups[i].alive && g_popups[i].open_flag == flag)
@@ -12,7 +18,8 @@ PopupWindow *popup_find_by_flag(B32 *flag) {
PopupWindow *popup_open(PlatformWindow *parent_window, Renderer *parent_renderer,
const char *title, B32 *open_flag,
S32 width, S32 height,
UI_WindowContentFn content_fn, void *user_data) {
UI_WindowContentFn content_fn, void *user_data,
PlatformWindowStyle style, B32 independent) {
// Find free slot
PopupWindow *popup = nullptr;
for (S32 i = 0; i < MAX_POPUP_WINDOWS; i++) {
@@ -27,8 +34,9 @@ PopupWindow *popup_open(PlatformWindow *parent_window, Renderer *parent_renderer
desc.title = title;
desc.width = width;
desc.height = height;
desc.style = PLATFORM_WINDOW_STYLE_POPUP;
desc.parent = parent_window;
desc.style = style;
desc.parent = parent_window;
desc.independent = independent;
popup->platform_window = platform_create_window(&desc);
if (!popup->platform_window) return nullptr;
@@ -61,6 +69,8 @@ PopupWindow *popup_open(PlatformWindow *parent_window, Renderer *parent_renderer
popup->title = title;
popup->wstate = {};
platform_set_frame_callback(popup->platform_window, popup_frame_callback, popup);
return popup;
}
@@ -95,6 +105,19 @@ void popup_do_frame(PopupWindow *popup, F32 dt) {
// Gather input from popup window
PlatformInput input = platform_get_input(popup->platform_window);
// Handle Cmd+/- zoom (propagate to global scale)
for (S32 k = 0; k < input.key_count; k++) {
if (input.ctrl_held) {
if (input.keys[k] == PKEY_EQUAL) g_ui_scale *= 1.1f;
if (input.keys[k] == PKEY_MINUS) g_ui_scale /= 1.1f;
if (input.keys[k] == PKEY_0) g_ui_scale = 1.0f;
}
}
g_ui_scale = Clamp(0.5f, g_ui_scale, 3.0f);
// Sync shared font atlas from parent renderer (picks up zoom changes)
renderer_sync_from_parent(popup->renderer);
// Swap widget state
UI_WidgetState saved_wstate = g_wstate;
g_wstate = popup->wstate;

View File

@@ -23,7 +23,9 @@ struct PopupWindow {
PopupWindow *popup_open(PlatformWindow *parent_window, Renderer *parent_renderer,
const char *title, B32 *open_flag,
S32 width, S32 height,
UI_WindowContentFn content_fn, void *user_data);
UI_WindowContentFn content_fn, void *user_data,
PlatformWindowStyle style = PLATFORM_WINDOW_STYLE_POPUP,
B32 independent = 0);
void popup_close(PopupWindow *popup);
PopupWindow *popup_find_by_flag(B32 *flag);
void popup_do_frame(PopupWindow *popup, F32 dt);