Fix faders, z indexing, svg rendering
This commit is contained in:
105
src/main.cpp
105
src/main.cpp
@@ -115,6 +115,11 @@ struct AppState {
|
||||
F32 demo_slider_v;
|
||||
F32 demo_fader;
|
||||
|
||||
// Scrollbar drag state
|
||||
B32 scrollbar_dragging;
|
||||
F32 scrollbar_drag_start_y;
|
||||
F32 scrollbar_drag_start_scroll;
|
||||
|
||||
// Audio device selection
|
||||
S32 audio_device_sel; // dropdown index: 0 = None, 1+ = device
|
||||
S32 audio_device_prev; // previous selection for change detection
|
||||
@@ -175,13 +180,20 @@ static void build_main_panel(AppState *app) {
|
||||
ui_tab_bar("MainTabRow", main_tabs, 1, &sel);
|
||||
}
|
||||
|
||||
CLAY(CLAY_ID("MainScrollArea"),
|
||||
.layout = {
|
||||
.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() },
|
||||
.layoutDirection = CLAY_LEFT_TO_RIGHT,
|
||||
}
|
||||
) {
|
||||
CLAY(CLAY_ID("MainContent"),
|
||||
.layout = {
|
||||
.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() },
|
||||
.padding = { uip(16), uip(16), uip(12), uip(12) },
|
||||
.childGap = uip(12),
|
||||
.layoutDirection = CLAY_TOP_TO_BOTTOM,
|
||||
}
|
||||
},
|
||||
.clip = { .vertical = true, .childOffset = Clay_GetScrollOffset() },
|
||||
) {
|
||||
// Top highlight (beveled edge)
|
||||
CLAY(CLAY_ID("MainHighlight"),
|
||||
@@ -353,6 +365,97 @@ static void build_main_panel(AppState *app) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Scrollbar
|
||||
{
|
||||
Clay_ScrollContainerData scroll_data = Clay_GetScrollContainerData(CLAY_ID("MainContent"));
|
||||
if (scroll_data.found && scroll_data.contentDimensions.height > scroll_data.scrollContainerDimensions.height) {
|
||||
float track_h = scroll_data.scrollContainerDimensions.height;
|
||||
float content_h = scroll_data.contentDimensions.height;
|
||||
float visible_ratio = track_h / content_h;
|
||||
float thumb_h = Max(visible_ratio * track_h, uis(24));
|
||||
float scroll_range = content_h - track_h;
|
||||
float scroll_pct = scroll_range > 0 ? -scroll_data.scrollPosition->y / scroll_range : 0;
|
||||
float thumb_y = scroll_pct * (track_h - thumb_h);
|
||||
float bar_w = uis(8);
|
||||
|
||||
// Handle scrollbar drag
|
||||
Clay_ElementId thumb_id = CLAY_ID("MainScrollThumb");
|
||||
Clay_ElementId track_id = CLAY_ID("MainScrollTrack");
|
||||
B32 thumb_hovered = Clay_PointerOver(thumb_id);
|
||||
B32 track_hovered = Clay_PointerOver(track_id);
|
||||
PlatformInput input = g_wstate.input;
|
||||
B32 mouse_clicked = input.mouse_down && !input.was_mouse_down;
|
||||
|
||||
if (mouse_clicked && thumb_hovered) {
|
||||
app->scrollbar_dragging = true;
|
||||
app->scrollbar_drag_start_y = input.mouse_pos.y;
|
||||
app->scrollbar_drag_start_scroll = scroll_data.scrollPosition->y;
|
||||
} else if (mouse_clicked && track_hovered && !thumb_hovered) {
|
||||
// Click on track: jump scroll position so thumb centers on click
|
||||
Clay_BoundingBox track_bb = Clay_GetElementData(track_id).boundingBox;
|
||||
float click_rel = input.mouse_pos.y - track_bb.y;
|
||||
float target_pct = (click_rel - thumb_h / 2) / (track_h - thumb_h);
|
||||
if (target_pct < 0) target_pct = 0;
|
||||
if (target_pct > 1) target_pct = 1;
|
||||
scroll_data.scrollPosition->y = -target_pct * scroll_range;
|
||||
// Start dragging from new position
|
||||
app->scrollbar_dragging = true;
|
||||
app->scrollbar_drag_start_y = input.mouse_pos.y;
|
||||
app->scrollbar_drag_start_scroll = scroll_data.scrollPosition->y;
|
||||
}
|
||||
|
||||
if (!input.mouse_down) {
|
||||
app->scrollbar_dragging = false;
|
||||
}
|
||||
|
||||
if (app->scrollbar_dragging) {
|
||||
float dy = input.mouse_pos.y - app->scrollbar_drag_start_y;
|
||||
float scroll_per_px = scroll_range / (track_h - thumb_h);
|
||||
float new_scroll = app->scrollbar_drag_start_scroll - dy * scroll_per_px;
|
||||
if (new_scroll > 0) new_scroll = 0;
|
||||
if (new_scroll < -scroll_range) new_scroll = -scroll_range;
|
||||
scroll_data.scrollPosition->y = new_scroll;
|
||||
}
|
||||
|
||||
// Thumb color: highlight on hover or drag
|
||||
Clay_Color thumb_color = g_theme.scrollbar_grab;
|
||||
if (app->scrollbar_dragging || thumb_hovered) {
|
||||
thumb_color = Clay_Color{
|
||||
(float)Min((int)thumb_color.r + 30, 255),
|
||||
(float)Min((int)thumb_color.g + 30, 255),
|
||||
(float)Min((int)thumb_color.b + 30, 255),
|
||||
thumb_color.a
|
||||
};
|
||||
}
|
||||
|
||||
CLAY(track_id,
|
||||
.layout = {
|
||||
.sizing = { .width = CLAY_SIZING_FIXED(bar_w), .height = CLAY_SIZING_GROW() },
|
||||
},
|
||||
.backgroundColor = g_theme.scrollbar_bg
|
||||
) {
|
||||
CLAY(thumb_id,
|
||||
.layout = {
|
||||
.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(thumb_h) },
|
||||
},
|
||||
.backgroundColor = thumb_color,
|
||||
.cornerRadius = CLAY_CORNER_RADIUS(CORNER_RADIUS),
|
||||
.floating = {
|
||||
.offset = { 0, thumb_y },
|
||||
.attachPoints = {
|
||||
.element = CLAY_ATTACH_POINT_LEFT_TOP,
|
||||
.parent = CLAY_ATTACH_POINT_LEFT_TOP,
|
||||
},
|
||||
.attachTo = CLAY_ATTACH_TO_PARENT,
|
||||
},
|
||||
) {}
|
||||
}
|
||||
} else {
|
||||
app->scrollbar_dragging = false;
|
||||
}
|
||||
}
|
||||
} // MainScrollArea
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user