From b30908800a6594524171afb1eed22413f3e85bba Mon Sep 17 00:00:00 2001 From: Kalle Wallin Date: Wed, 24 Mar 2004 15:17:52 +0000 Subject: Moved list window fuctions to list_window.c. Added function list_window_cmd() for basic commands (movment). git-svn-id: https://svn.musicpd.org/ncmpc/trunk@454 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- list_window.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 list_window.c (limited to 'list_window.c') diff --git a/list_window.c b/list_window.c new file mode 100644 index 000000000..21ee9119f --- /dev/null +++ b/list_window.c @@ -0,0 +1,206 @@ +#include +#include +#include +#include +#include + +#include "support.h" +#include "command.h" +#include "list_window.h" + +list_window_t * +list_window_init(WINDOW *w, int width, int height) +{ + list_window_t *lw; + + lw = malloc(sizeof(list_window_t)); + memset(lw, 0, sizeof(list_window_t)); + lw->w = w; + lw->cols = width; + lw->rows = height; + lw->clear = 1; + return lw; +} + +list_window_t * +list_window_free(list_window_t *lw) +{ + if( lw ) + { + memset(lw, 0, sizeof(list_window_t)); + free(lw); + } + return NULL; +} + +void +list_window_reset(list_window_t *lw) +{ + lw->selected = 0; + lw->start = 0; + lw->clear = 1; +} + +void +list_window_set_selected(list_window_t *lw, int n) +{ + lw->selected=n; +} + +void +list_window_next(list_window_t *lw, int length) +{ + if( lw->selected < length-1 ) + lw->selected++; +} + +void +list_window_previous(list_window_t *lw) +{ + if( lw->selected > 0 ) + lw->selected--; +} + +void +list_window_first(list_window_t *lw) +{ + lw->selected = 0; +} + +void +list_window_last(list_window_t *lw, int length) +{ + lw->selected = length-1; +} + +void +list_window_next_page(list_window_t *lw, int length) +{ + int step = lw->rows-1; + if( step<= 0 ) + return; + if( lw->selected+step < length-1 ) + lw->selected+=step; + else + return list_window_last(lw,length); +} + +void +list_window_previous_page(list_window_t *lw) +{ + int step = lw->rows-1; + if( step<= 0 ) + return; + if( lw->selected-step > 0 ) + lw->selected-=step; + else + list_window_first(lw); +} + + +void +list_window_paint(list_window_t *lw, + list_window_callback_fn_t callback, + void *callback_data) +{ + int i; + + while( lw->selected < lw->start ) + { + lw->start--; + lw->clear=1; + } + while( lw->selected >= lw->start+lw->rows ) + { + lw->start++; + lw->clear=1; + } + if( lw->clear ) + { + wclear(lw->w); + lw->clear=0; + } + + for(i=0; irows; i++) + { + int highlight; + char *label; + + label = (callback) (lw->start+i, &highlight, callback_data); + if( label ) + { + wmove(lw->w, i, 0); + if( highlight ) + wattron(lw->w, A_BOLD); + if( lw->start+i == lw->selected ) + wattron(lw->w, A_REVERSE); + + waddnstr(lw->w, label, lw->cols); + + if( highlight ) + wattroff(lw->w, A_BOLD); + if( lw->start+i == lw->selected ) + wattroff(lw->w, A_REVERSE); + } + } +} + + +int +list_window_find(list_window_t *lw, + list_window_callback_fn_t callback, + void *callback_data, + char *str) +{ + int h; + int i = lw->selected+1; + char *label; + + while( (label=(callback) (i,&h,callback_data)) ) + { + if( str && label && strcasestr(label, str) ) + { + lw->selected = i; + return 0; + } + i++; + } + return 1; +} + + +/* perform basic list window commands (movement) */ +int +list_window_cmd(list_window_t *lw, int rows, command_t cmd) +{ + switch(cmd) + { + case CMD_LIST_PREVIOUS: + list_window_previous(lw); + lw->repaint=1; + break; + case CMD_LIST_NEXT: + list_window_next(lw, rows); + lw->repaint=1; + break; + case CMD_LIST_FIRST: + list_window_first(lw); + lw->repaint = 1; + break; + case CMD_LIST_LAST: + list_window_last(lw, rows); + lw->repaint = 1; + break; + case CMD_LIST_NEXT_PAGE: + list_window_next_page(lw, rows); + lw->repaint = 1; + break; + case CMD_LIST_PREVIOUS_PAGE: + list_window_previous_page(lw); + lw->repaint = 1; + break; + default: + return 0; + } + return 1; +} -- cgit v1.2.3