diff options
| author | Jack Jamison <jackqjamison@gmail.com> | 2025-10-26 20:59:05 -0400 |
|---|---|---|
| committer | Jack Jamison <jackqjamison@gmail.com> | 2025-10-26 21:04:55 -0400 |
| commit | 77c11183c22d640939cd8a6a7588329a5879c64c (patch) | |
| tree | 88d79731cb0563e1986280fa282618de1e121b23 /layout.c | |
| parent | 7557fb423436f21e485e27ffd7f10e2c15232135 (diff) | |
refactor to layout
Diffstat (limited to 'layout.c')
| -rw-r--r-- | layout.c | 96 |
1 files changed, 96 insertions, 0 deletions
@@ -1,2 +1,98 @@ #include "layout.h" +#include "array.h" +#include "config.h" +void init_layout(client_state* state) { + +} + +void calculate_layout(client_state* state, rect_t* input, rect_t* options, bool recalc_options) { + + // calculate input rect + *input = (rect_t){ .x = 0, .y = state->line_height * state->lines, .dx = state->width, .dy = state->line_height }; + if (state->lines == 0 && array_size(state->filtered_items) != 0) { + input->dx = state->width / 3.0f; + } + + // calculate options rect + *options = (rect_t){0}; + if (state->lines) { + options->dx = state->width; + options->dy = input->y; + } else { + options->x = input->x + input->dx; + options->dx = state->width - options->x; + options->dy = state->line_height; + } + + if (recalc_options) { + + // calculate starting conditions + rect_t cur; + if (state->lines) { + cur = (rect_t){ .x = options->x, .y = input->y - state->line_height, .dx = options->dx, .dy = state->line_height }; + } else { + cur = (rect_t){ .x = options->x, .y = options->y, .dx = 0.0f, .dy = state->line_height }; + } + + // calculate base filtered item rects + array_for_all(item_display_t, display, state->filtered_items) { + if (!state->lines) { + cur.dx = display->item->pixel_len + state->horizontal_spacing; + } + + display->r = cur; + + if (state->lines) { + cur.y -= state->line_height; + } else { + cur.x += cur.dx; + } + } + + // calculate fancy scroll + if (fancy_scroll && array_size(state->filtered_items) != 0) { + + // calculate if we should adjust scrolling + if (state->lines) { + // calc vertical scroll + float selected_bot = state->fancy_scroll + state->filtered_items[state->selected_filtered_item].r.y; + float selected_top = selected_bot + state->filtered_items[state->selected_filtered_item].r.dy; + if (selected_bot < options->y) { + state->fancy_scroll -= selected_bot; + } + float diff = selected_top - (options->y + options->dy); + if (diff > 0) { + state->fancy_scroll -= diff; + } + } else { + // calc horizontal scroll + item_display_t* selected = &state->filtered_items[state->selected_filtered_item]; + float selected_left = state->fancy_scroll + selected->r.x; + float selected_right = selected_left + selected->r.dx; + float right_diff = selected_right - (options->x + options->dx); + float left_diff = selected_left - options->x; + + if (selected->r.dx > options->dx) { + state->fancy_scroll -= left_diff; + } + else if (right_diff > 0) { + state->fancy_scroll -= right_diff; + } + else if (left_diff < 0) { + state->fancy_scroll -= left_diff; + } + } + + // apply scroll offset + array_for_all(item_display_t, display, state->filtered_items) { + if (state->lines) { + display->r.y += state->fancy_scroll; + } else { + display->r.x += state->fancy_scroll; + } + } + + } + } +} |
