aboutsummaryrefslogtreecommitdiff
path: root/layout.c
diff options
context:
space:
mode:
authorJack Jamison <jackqjamison@gmail.com>2025-11-08 18:17:52 -0500
committerJack Jamison <jackqjamison@gmail.com>2025-11-08 18:17:52 -0500
commitd0b1b2db2210d4fe31701d144d03a37ea55ece00 (patch)
treee23a61d925aca202b8835f8f8e3c34097e4ce783 /layout.c
parent6e038b0c45c1c2e351ce6ead8b80bc7b1031988f (diff)
allow selecting the prompt
Diffstat (limited to 'layout.c')
-rw-r--r--layout.c72
1 files changed, 39 insertions, 33 deletions
diff --git a/layout.c b/layout.c
index 86c4155..ed561a8 100644
--- a/layout.c
+++ b/layout.c
@@ -80,34 +80,38 @@ void calculate_layout(client_state* state, rect_t* prompt, rect_t* input, rect_t
if (array_size(state->filtered_items) != 0) {
if (config.fancy_scroll) {
// calculate fancy scroll offset
- if (state->lines) {
- // calc vertical scroll
- float selected_bot = state->scroll_offset + 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->scroll_offset -= selected_bot;
- }
- float diff = selected_top - (options->y + options->dy);
- if (diff > 0) {
- state->scroll_offset -= diff;
+ if (state->selected_filtered_item != -1) {
+ if (state->lines) {
+ // calc vertical scroll
+ float selected_bot = state->scroll_offset + 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->scroll_offset -= selected_bot;
+ }
+ float diff = selected_top - (options->y + options->dy);
+ if (diff > 0) {
+ state->scroll_offset -= diff;
+ }
+ } else {
+ // calc horizontal scroll
+ item_display_t* selected = &state->filtered_items[state->selected_filtered_item];
+ float selected_left = state->scroll_offset + 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->scroll_offset -= left_diff;
+ }
+ else if (right_diff > 0) {
+ state->scroll_offset -= right_diff;
+ }
+ else if (left_diff < 0) {
+ state->scroll_offset -= left_diff;
+ }
}
} else {
- // calc horizontal scroll
- item_display_t* selected = &state->filtered_items[state->selected_filtered_item];
- float selected_left = state->scroll_offset + 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->scroll_offset -= left_diff;
- }
- else if (right_diff > 0) {
- state->scroll_offset -= right_diff;
- }
- else if (left_diff < 0) {
- state->scroll_offset -= left_diff;
- }
+ state->scroll_offset = 0;
}
// display all filtered items (could be optimized)
@@ -119,13 +123,15 @@ void calculate_layout(client_state* state, rect_t* prompt, rect_t* input, rect_t
// determine what page the selected item is in
size_t selected_page = 0;
- size_t selected_page_index = 0;
- for(size_t i = 0; i < array_size(state->page_indices); ++i) {
- if (state->selected_filtered_item < state->page_indices[i]) {
- break;
+ size_t selected_page_index = state->page_indices[selected_page];
+ if (state->selected_filtered_item != -1) {
+ for(size_t i = 0; i < array_size(state->page_indices); ++i) {
+ if (state->selected_filtered_item < state->page_indices[i]) {
+ break;
+ }
+ selected_page = i;
+ selected_page_index = state->page_indices[i];
}
- selected_page = i;
- selected_page_index = state->page_indices[i];
}
// determine scroll to put that page at the start
@@ -136,7 +142,7 @@ void calculate_layout(client_state* state, rect_t* prompt, rect_t* input, rect_t
rect_t r = state->filtered_items[selected_page_index].r;
state->scroll_offset = options->x - r.x;
}
-
+
// display filtered items on the page
state->displayed_item_start = state->page_indices[selected_page];
state->displayed_item_end = (selected_page + 1 < array_size(state->page_indices)) ? state->page_indices[selected_page + 1] : array_size(state->filtered_items);