1 /*
2 * $Id: screen_utils.c,v 1.4 2004/03/16 13:57:24 kalle Exp $
3 *
4 */
6 #include <stdlib.h>
7 #include <string.h>
8 #include <glib.h>
9 #include <ncurses.h>
11 #include "libmpdclient.h"
12 #include "mpc.h"
13 #include "command.h"
14 #include "screen.h"
18 list_window_t *
19 list_window_init(WINDOW *w, int width, int height)
20 {
21 list_window_t *lw;
23 lw = malloc(sizeof(list_window_t));
24 memset(lw, 0, sizeof(list_window_t));
25 lw->w = w;
26 lw->cols = width;
27 lw->rows = height;
28 lw->clear = 1;
29 return lw;
30 }
32 list_window_t *
33 list_window_free(list_window_t *lw)
34 {
35 if( lw )
36 {
37 memset(lw, 0, sizeof(list_window_t));
38 free(lw);
39 }
40 return NULL;
41 }
43 void
44 list_window_reset(list_window_t *lw)
45 {
46 lw->selected = 0;
47 lw->start = 0;
48 lw->clear = 1;
49 }
51 void
52 list_window_set_selected(list_window_t *lw, int n)
53 {
54 lw->selected=n;
55 }
57 void
58 list_window_paint(list_window_t *lw,
59 list_window_callback_fn_t callback,
60 void *callback_data)
61 {
62 int i;
64 while( lw->selected < lw->start )
65 {
66 lw->start--;
67 lw->clear=1;
68 }
69 while( lw->selected >= lw->start+lw->rows )
70 {
71 lw->start++;
72 lw->clear=1;
73 }
74 if( lw->clear )
75 {
76 wclear(lw->w);
77 lw->clear=0;
78 }
80 for(i=0; i<lw->rows; i++)
81 {
82 int highlight;
83 char *label;
85 label = (callback) (lw->start+i, &highlight, callback_data);
86 if( label )
87 {
88 wmove(lw->w, i, 0);
89 if( highlight )
90 wattron(lw->w, A_BOLD);
91 if( lw->start+i == lw->selected )
92 wattron(lw->w, A_REVERSE);
94 waddnstr(lw->w, label, lw->cols);
96 if( highlight )
97 wattroff(lw->w, A_BOLD);
98 if( lw->start+i == lw->selected )
99 wattroff(lw->w, A_REVERSE);
100 }
101 }
102 }
104 void
105 list_window_next(list_window_t *lw, int length)
106 {
107 if( lw->selected < length-1 )
108 lw->selected++;
109 }
111 void
112 list_window_previous(list_window_t *lw)
113 {
114 if( lw->selected > 0 )
115 lw->selected--;
116 }
118 void
119 list_window_first(list_window_t *lw)
120 {
121 lw->selected = 0;
122 }
124 void
125 list_window_last(list_window_t *lw, int length)
126 {
127 lw->selected = length-1;
128 }
130 void
131 list_window_next_page(list_window_t *lw, int length)
132 {
133 int step = lw->rows-1;
134 if( step<= 0 )
135 return;
136 if( lw->selected+step < length-1 )
137 lw->selected+=step;
138 else
139 return list_window_last(lw,length);
140 }
142 void
143 list_window_previous_page(list_window_t *lw)
144 {
145 int step = lw->rows-1;
146 if( step<= 0 )
147 return;
148 if( lw->selected-step > 0 )
149 lw->selected-=step;
150 else
151 list_window_first(lw);
152 }