LCOV - code coverage report
Current view: top level - src/tui - list_view.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 60 60
Test Date: 2026-04-20 19:54:22 Functions: 100.0 % 11 11

            Line data    Source code
       1              : /* SPDX-License-Identifier: GPL-3.0-or-later */
       2              : /* Copyright 2026 Peter Csaszar */
       3              : 
       4              : /**
       5              :  * @file tui/list_view.c
       6              :  * @brief Scroll + selection helper for vertical list panes (US-11 v2).
       7              :  */
       8              : 
       9              : #include "tui/list_view.h"
      10              : 
      11              : #include <string.h>
      12              : 
      13           83 : void list_view_init(ListView *lv) {
      14           83 :     if (!lv) return;
      15           83 :     memset(lv, 0, sizeof(*lv));
      16           83 :     lv->selected = -1;
      17              : }
      18              : 
      19          111 : void list_view_reveal_selected(ListView *lv) {
      20          111 :     if (!lv || lv->count <= 0 || lv->rows_visible <= 0) return;
      21           77 :     if (lv->selected < lv->scroll_top) {
      22            4 :         lv->scroll_top = lv->selected;
      23           73 :     } else if (lv->selected >= lv->scroll_top + lv->rows_visible) {
      24           12 :         lv->scroll_top = lv->selected - lv->rows_visible + 1;
      25              :     }
      26           77 :     if (lv->scroll_top < 0) lv->scroll_top = 0;
      27              : }
      28              : 
      29           19 : void list_view_set_viewport(ListView *lv, int rows_visible) {
      30           19 :     if (!lv) return;
      31           19 :     lv->rows_visible = rows_visible < 0 ? 0 : rows_visible;
      32           19 :     list_view_reveal_selected(lv);
      33              : }
      34              : 
      35           53 : void list_view_set_count(ListView *lv, int count) {
      36           53 :     if (!lv) return;
      37           53 :     if (count < 0) count = 0;
      38           53 :     lv->count = count;
      39           53 :     if (count == 0) {
      40            8 :         lv->selected = -1;
      41            8 :         lv->scroll_top = 0;
      42            8 :         return;
      43              :     }
      44           45 :     if (lv->selected < 0) lv->selected = 0;
      45           45 :     if (lv->selected >= count) lv->selected = count - 1;
      46           45 :     if (lv->scroll_top > count - 1) lv->scroll_top = count - 1;
      47           45 :     if (lv->scroll_top < 0) lv->scroll_top = 0;
      48           45 :     list_view_reveal_selected(lv);
      49              : }
      50              : 
      51           13 : void list_view_move_up(ListView *lv) {
      52           13 :     if (!lv || lv->count == 0) return;
      53           12 :     if (lv->selected > 0) lv->selected--;
      54           12 :     list_view_reveal_selected(lv);
      55              : }
      56              : 
      57           27 : void list_view_move_down(ListView *lv) {
      58           27 :     if (!lv || lv->count == 0) return;
      59           25 :     if (lv->selected < lv->count - 1) lv->selected++;
      60           25 :     list_view_reveal_selected(lv);
      61              : }
      62              : 
      63            2 : void list_view_page_up(ListView *lv) {
      64            2 :     if (!lv || lv->count == 0) return;
      65            1 :     int step = lv->rows_visible > 0 ? lv->rows_visible : 1;
      66            1 :     lv->selected -= step;
      67            1 :     if (lv->selected < 0) lv->selected = 0;
      68            1 :     list_view_reveal_selected(lv);
      69              : }
      70              : 
      71            3 : void list_view_page_down(ListView *lv) {
      72            3 :     if (!lv || lv->count == 0) return;
      73            2 :     int step = lv->rows_visible > 0 ? lv->rows_visible : 1;
      74            2 :     lv->selected += step;
      75            2 :     if (lv->selected >= lv->count) lv->selected = lv->count - 1;
      76            2 :     list_view_reveal_selected(lv);
      77              : }
      78              : 
      79            3 : void list_view_home(ListView *lv) {
      80            3 :     if (!lv || lv->count == 0) return;
      81            2 :     lv->selected = 0;
      82            2 :     lv->scroll_top = 0;
      83              : }
      84              : 
      85            6 : void list_view_end(ListView *lv) {
      86            6 :     if (!lv || lv->count == 0) return;
      87            5 :     lv->selected = lv->count - 1;
      88            5 :     list_view_reveal_selected(lv);
      89              : }
      90              : 
      91            8 : int list_view_is_visible(const ListView *lv, int index) {
      92            8 :     if (!lv || lv->rows_visible <= 0) return 0;
      93            8 :     return index >= lv->scroll_top
      94            8 :         && index <  lv->scroll_top + lv->rows_visible;
      95              : }
        

Generated by: LCOV version 2.0-1