Code

b3452f13d23d51df6d971e66e2d87a22469c905a
[ncmpc.git] / src / list_window.h
1 /* ncmpc (Ncurses MPD Client)
2  * (c) 2004-2017 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  */
20 #ifndef LIST_WINDOW_H
21 #define LIST_WINDOW_H
23 #include "config.h"
24 #include "command.h"
25 #include "colors.h"
26 #include "ncmpc_curses.h"
28 #include <glib.h>
29 #include <stdbool.h>
31 typedef const char *
32 (*list_window_callback_fn_t)(unsigned i, void *data);
34 typedef void
35 (*list_window_paint_callback_t)(WINDOW *w, unsigned i,
36                                 unsigned y, unsigned width,
37                                 bool selected,
38                                 const void *data);
40 struct list_window {
41         WINDOW *w;
42         unsigned rows, cols;
44         /**
45          * Number of items in this list.
46          */
47         unsigned length;
49         unsigned start;
50         unsigned selected;
51         unsigned range_base;        /* represents the base item. */
52         bool range_selection;       /* range selection activated */
54         bool hide_cursor;
55 };
57 /**
58  * The bounds of a range selection, see list_window_get_range().
59  */
60 struct list_window_range {
61         /**
62          * The index of the first selected item.
63          */
64         unsigned start;
66         /**
67          * The index after the last selected item.  The selection is
68          * empty when this is the same as "start".
69          */
70         unsigned end;
71 };
73 /* create a new list window */
74 struct list_window *list_window_init(WINDOW *w,
75                                      unsigned width, unsigned height);
77 /* destroy a list window */
78 void list_window_free(struct list_window *lw);
80 /* reset a list window (selected=0, start=0) */
81 void list_window_reset(struct list_window *lw);
83 void
84 list_window_resize(struct list_window *lw, unsigned width, unsigned height);
86 void
87 list_window_set_length(struct list_window *lw, unsigned length);
89 /* paint a list window */
90 void list_window_paint(const struct list_window *lw,
91                        list_window_callback_fn_t callback,
92                        void *callback_data);
94 void
95 list_window_paint2(const struct list_window *lw,
96                    list_window_paint_callback_t paint_callback,
97                    const void *callback_data);
99 /* perform basic list window commands (movement) */
100 bool
101 list_window_cmd(struct list_window *lw, command_t cmd);
103 /**
104  * Scroll the window.  Returns true if the command has been
105  * consumed.
106  */
107 bool
108 list_window_scroll_cmd(struct list_window *lw, command_t cmd);
110 #ifdef HAVE_GETMOUSE
111 /**
112  * The mouse was clicked.  Check if the list should be scrolled
113  * Returns non-zero if the mouse event has been handled.
114  */
115 bool
116 list_window_mouse(struct list_window *lw, unsigned long bstate, int y);
117 #endif
119 /**
120  * Centers the visible range around item n on the list.
121  */
122 void
123 list_window_center(struct list_window *lw, unsigned n);
125 /**
126  * Scrolls the view to item n, as if the cursor would have been moved
127  * to the position.
128  */
129 void
130 list_window_scroll_to(struct list_window *lw, unsigned n);
132 /**
133  * Sets the position of the cursor.  Disables range selection.
134  */
135 void
136 list_window_set_cursor(struct list_window *lw, unsigned i);
138 /**
139  * Moves the cursor.  Modifies the range if range selection is
140  * enabled.
141  */
142 void
143 list_window_move_cursor(struct list_window *lw, unsigned n);
145 /**
146  * Ensures that the cursor is visible on the screen, i.e. it is not
147  * outside the current scrolling range.
148  */
149 void
150 list_window_fetch_cursor(struct list_window *lw);
152 /**
153  * Determines the lower and upper bound of the range selection.  If
154  * range selection is disabled, it returns the cursor position (range
155  * length is 1).
156  */
157 void
158 list_window_get_range(const struct list_window *lw,
159                       struct list_window_range *range);
161 /* find a string in a list window */
162 bool
163 list_window_find(struct list_window *lw,
164                  list_window_callback_fn_t callback,
165                  void *callback_data,
166                  const char *str,
167                  bool wrap,
168                  bool bell_on_wrap);
170 /* find a string in a list window (reversed) */
171 bool
172 list_window_rfind(struct list_window *lw,
173                   list_window_callback_fn_t callback,
174                   void *callback_data,
175                   const char *str,
176                   bool wrap,
177                   bool bell_on_wrap);
179 /* find a string in a list window which begins with the given characters in *str */
180 bool
181 list_window_jump(struct list_window *lw,
182                  list_window_callback_fn_t callback,
183                  void *callback_data,
184                  const char *str);
186 #endif