diff --git a/source/widgets/listview.c b/source/widgets/listview.c index 2b8f5d81..52146702 100644 --- a/source/widgets/listview.c +++ b/source/widgets/listview.c @@ -583,13 +583,20 @@ unsigned int listview_get_selected(listview *lv) { } void listview_set_selected(listview *lv, unsigned int selected) { - if (lv && lv->req_elements > 0) { + if (lv == NULL) { + return; + } + if (lv->req_elements > 0) { lv->selected = MIN(selected, lv->req_elements - 1); lv->barview.direction = LEFT_TO_RIGHT; widget_queue_redraw(WIDGET(lv)); - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } } else if (lv->req_elements == 0) { - lv->sc_callback(lv, UINT32_MAX, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, UINT32_MAX, lv->sc_udata); + } } } @@ -790,7 +797,9 @@ static void listview_nav_up_int(listview *lv) { lv->selected--; lv->barview.direction = RIGHT_TO_LEFT; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } static void listview_nav_down_int(listview *lv) { @@ -805,7 +814,9 @@ static void listview_nav_down_int(listview *lv) { ? MIN(lv->req_elements - 1, lv->selected + 1) : 0; lv->barview.direction = LEFT_TO_RIGHT; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } void listview_nav_next(listview *lv) { @@ -824,14 +835,18 @@ void listview_nav_prev(listview *lv) { static void listview_nav_column_left_int(listview *lv) { if (lv->selected >= lv->cur_columns) { lv->selected -= lv->cur_columns; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } } static void listview_nav_column_right_int(listview *lv) { if ((lv->selected + lv->cur_columns) < lv->req_elements) { lv->selected += lv->cur_columns; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } } @@ -890,7 +905,9 @@ void listview_nav_left(listview *lv) { } if (lv->selected >= lv->max_rows) { lv->selected -= lv->max_rows; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } } @@ -911,7 +928,9 @@ void listview_nav_right(listview *lv) { } if ((lv->selected + lv->max_rows) < lv->req_elements) { lv->selected += lv->max_rows; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } else if (lv->selected < (lv->req_elements - 1)) { // We do not want to move to last item, UNLESS the last column is only @@ -923,7 +942,9 @@ void listview_nav_right(listview *lv) { // If there is an extra column, move. if (col != ncol) { lv->selected = lv->req_elements - 1; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } } @@ -949,7 +970,9 @@ static void listview_nav_page_prev_int(listview *lv) { } else { lv->selected -= (lv->max_elements); } - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); } static void listview_nav_page_next_int(listview *lv) { @@ -964,7 +987,9 @@ static void listview_nav_page_next_int(listview *lv) { lv->selected = MIN(new, lv->req_elements - 1); lv->barview.direction = LEFT_TO_RIGHT; - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); return; } @@ -972,7 +997,9 @@ static void listview_nav_page_next_int(listview *lv) { if (lv->selected >= lv->req_elements) { lv->selected = lv->req_elements - 1; } - lv->sc_callback(lv, lv->selected, lv->sc_udata); + if (lv->sc_callback) { + lv->sc_callback(lv, lv->selected, lv->sc_udata); + } widget_queue_redraw(WIDGET(lv)); }