diff options
Diffstat (limited to 'layout.c')
| -rw-r--r-- | layout.c | 72 |
1 files changed, 39 insertions, 33 deletions
@@ -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); |
