af7656d8f380ea25f230ace24b1e0449758bc003
[ncmpc-debian.git] / src / list_window.hxx
1 /* ncmpc (Ncurses MPD Client)
2  * (c) 2004-2018 The Music Player Daemon Project
3  * Project homepage: http://musicpd.org
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19
20 #ifndef LIST_WINDOW_H
21 #define LIST_WINDOW_H
22
23 #include "config.h"
24 #include "command.hxx"
25 #include "colors.hxx"
26 #include "ncmpc_curses.h"
27
28 typedef const char *
29 (*list_window_callback_fn_t)(unsigned i, void *data);
30
31 typedef void
32 (*list_window_paint_callback_t)(WINDOW *w, unsigned i,
33                                 unsigned y, unsigned width,
34                                 bool selected,
35                                 const void *data);
36
37 struct ListWindow {
38         WINDOW *w;
39         unsigned rows, cols;
40
41         /**
42          * Number of items in this list.
43          */
44         unsigned length = 0;
45
46         unsigned start = 0;
47         unsigned selected = 0;
48
49         /**
50          * Represents the base item.
51          */
52         unsigned range_base = 0;
53
54         /**
55          * Range selection activated?
56          */
57         bool range_selection = false;
58
59         bool hide_cursor = false;
60
61         ListWindow(WINDOW *_w, unsigned _cols, unsigned _rows)
62                 :w(_w), rows(_rows), cols(_cols) {}
63 };
64
65 /**
66  * The bounds of a range selection, see list_window_get_range().
67  */
68 struct ListWindowRange {
69         /**
70          * The index of the first selected item.
71          */
72         unsigned start;
73
74         /**
75          * The index after the last selected item.  The selection is
76          * empty when this is the same as "start".
77          */
78         unsigned end;
79 };
80
81 /* reset a list window (selected=0, start=0) */
82 void list_window_reset(ListWindow *lw);
83
84 void
85 list_window_resize(ListWindow *lw, unsigned width, unsigned height);
86
87 void
88 list_window_set_length(ListWindow *lw, unsigned length);
89
90 /* paint a list window */
91 void list_window_paint(const ListWindow *lw,
92                        list_window_callback_fn_t callback,
93                        void *callback_data);
94
95 void
96 list_window_paint2(const ListWindow *lw,
97                    list_window_paint_callback_t paint_callback,
98                    const void *callback_data);
99
100 /* perform basic list window commands (movement) */
101 bool
102 list_window_cmd(ListWindow *lw, command_t cmd);
103
104 /**
105  * Scroll the window.  Returns true if the command has been
106  * consumed.
107  */
108 bool
109 list_window_scroll_cmd(ListWindow *lw, command_t cmd);
110
111 #ifdef HAVE_GETMOUSE
112 /**
113  * The mouse was clicked.  Check if the list should be scrolled
114  * Returns non-zero if the mouse event has been handled.
115  */
116 bool
117 list_window_mouse(ListWindow *lw, unsigned long bstate, int y);
118 #endif
119
120 /**
121  * Centers the visible range around item n on the list.
122  */
123 void
124 list_window_center(ListWindow *lw, unsigned n);
125
126 /**
127  * Scrolls the view to item n, as if the cursor would have been moved
128  * to the position.
129  */
130 void
131 list_window_scroll_to(ListWindow *lw, unsigned n);
132
133 /**
134  * Sets the position of the cursor.  Disables range selection.
135  */
136 void
137 list_window_set_cursor(ListWindow *lw, unsigned i);
138
139 /**
140  * Moves the cursor.  Modifies the range if range selection is
141  * enabled.
142  */
143 void
144 list_window_move_cursor(ListWindow *lw, unsigned n);
145
146 /**
147  * Ensures that the cursor is visible on the screen, i.e. it is not
148  * outside the current scrolling range.
149  */
150 void
151 list_window_fetch_cursor(ListWindow *lw);
152
153 /**
154  * Determines the lower and upper bound of the range selection.  If
155  * range selection is disabled, it returns the cursor position (range
156  * length is 1).
157  */
158 void
159 list_window_get_range(const ListWindow *lw,
160                       ListWindowRange *range);
161
162 /* find a string in a list window */
163 bool
164 list_window_find(ListWindow *lw,
165                  list_window_callback_fn_t callback,
166                  void *callback_data,
167                  const char *str,
168                  bool wrap,
169                  bool bell_on_wrap);
170
171 /* find a string in a list window (reversed) */
172 bool
173 list_window_rfind(ListWindow *lw,
174                   list_window_callback_fn_t callback,
175                   void *callback_data,
176                   const char *str,
177                   bool wrap,
178                   bool bell_on_wrap);
179
180 /* find a string in a list window which begins with the given characters in *str */
181 bool
182 list_window_jump(ListWindow *lw,
183                  list_window_callback_fn_t callback,
184                  void *callback_data,
185                  const char *str);
186
187 #endif