From b4f53143b0e05fd3061cdf2e65e17a6a2904090b Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Fri, 24 Jul 2015 00:50:58 -0700 Subject: Migrate source files into src/ directory This change moves source files into a src/ directory, and puts object files into an obj/ directory. The Makefile and xcode project are updated accordingly. Fixes #1866 --- src/pager.h | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/pager.h (limited to 'src/pager.h') diff --git a/src/pager.h b/src/pager.h new file mode 100644 index 00000000..c3e47df7 --- /dev/null +++ b/src/pager.h @@ -0,0 +1,168 @@ +/** \file pager.h + Pager support +*/ + +#include "complete.h" +#include "screen.h" +#include "reader.h" + +#define PAGER_SELECTION_NONE ((size_t)(-1)) + +/* Represents rendering from the pager */ +class page_rendering_t +{ +public: + int term_width; + int term_height; + size_t rows; + size_t cols; + size_t row_start; + size_t row_end; + size_t selected_completion_idx; + screen_data_t screen_data; + + size_t remaining_to_disclose; + + bool search_field_shown; + editable_line_t search_field_line; + + /* Returns a rendering with invalid data, useful to indicate "no rendering" */ + page_rendering_t(); +}; + +/* The space between adjacent completions */ +#define PAGER_SPACER_STRING L" " +#define PAGER_SPACER_STRING_WIDTH 2 + +/* How many rows we will show in the "initial" pager */ +#define PAGER_UNDISCLOSED_MAX_ROWS 4 + +typedef std::vector completion_list_t; +page_rendering_t render_completions(const completion_list_t &raw_completions, const wcstring &prefix); + +class pager_t +{ + int available_term_width; + int available_term_height; + + size_t selected_completion_idx; + size_t suggested_row_start; + + /* Fully disclosed means that we show all completions */ + bool fully_disclosed; + + /* Whether we show the search field */ + bool search_field_shown; + + /* Returns the index of the completion that should draw selected, using the given number of columns */ + size_t visual_selected_completion_index(size_t rows, size_t cols) const; + + /** Data structure describing one or a group of related completions */ +public: + struct comp_t + { + /** The list of all completin strings this entry applies to */ + wcstring_list_t comp; + + /** The description */ + wcstring desc; + + /** The representative completion */ + completion_t representative; + + /** On-screen width of the completion string */ + int comp_width; + + /** On-screen width of the description information */ + int desc_width; + + /** Preferred total width */ + int pref_width; + + /** Minimum acceptable width */ + int min_width; + + comp_t() : comp(), desc(), representative(L""), comp_width(0), desc_width(0), pref_width(0), min_width(0) + { + } + }; + +private: + typedef std::vector comp_info_list_t; + + /* The filtered list of completion infos */ + comp_info_list_t completion_infos; + + /* The unfiltered list. Note there's a lot of duplication here. */ + comp_info_list_t unfiltered_completion_infos; + + wcstring prefix; + + bool completion_try_print(size_t cols, const wcstring &prefix, const comp_info_list_t &lst, page_rendering_t *rendering, size_t suggested_start_row) const; + + void recalc_min_widths(comp_info_list_t * lst) const; + void measure_completion_infos(std::vector *infos, const wcstring &prefix) const; + + bool completion_info_passes_filter(const comp_t &info) const; + + void completion_print(size_t cols, int *width_per_column, size_t row_start, size_t row_stop, const wcstring &prefix, const comp_info_list_t &lst, page_rendering_t *rendering) const; + line_t completion_print_item(const wcstring &prefix, const comp_t *c, size_t row, size_t column, int width, bool secondary, bool selected, page_rendering_t *rendering) const; + + +public: + + /* The text of the search field */ + editable_line_t search_field_line; + + /* Sets the set of completions */ + void set_completions(const completion_list_t &comp); + + /* Sets the prefix */ + void set_prefix(const wcstring &pref); + + /* Sets the terminal width and height */ + void set_term_size(int w, int h); + + /* Changes the selected completion in the given direction according to the layout of the given rendering. Returns true if the selection changed. */ + bool select_next_completion_in_direction(selection_direction_t direction, const page_rendering_t &rendering); + + /* Returns the currently selected completion for the given rendering */ + const completion_t *selected_completion(const page_rendering_t &rendering) const; + + /* Indicates the row and column for the given rendering. Returns -1 if no selection. */ + size_t get_selected_row(const page_rendering_t &rendering) const; + size_t get_selected_column(const page_rendering_t &rendering) const; + + /* Produces a rendering of the completions, at the given term size */ + page_rendering_t render() const; + + /* Updates the rendering if it's stale */ + void update_rendering(page_rendering_t *rendering) const; + + /* Indicates if there are no completions, and therefore nothing to render */ + bool empty() const; + + /* Clears all completions and the prefix */ + void clear(); + + /* Updates the completions list per the filter */ + void refilter_completions(); + + /* Sets whether the search field is shown */ + void set_search_field_shown(bool flag); + + /* Gets whether the search field shown */ + bool is_search_field_shown() const; + + /* Indicates if we are navigating our contents */ + bool is_navigating_contents() const; + + /* Become fully disclosed */ + void set_fully_disclosed(bool flag); + + /* Position of the cursor */ + size_t cursor_position() const; + + /* Constructor */ + pager_t(); +}; -- cgit v1.2.3