summaryrefslogtreecommitdiffstats
path: root/src/listnav.c
blob: f8563197fbfe684e484264df767aade5276cafbb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "listnav.h"
#include "util.h"

#include <string.h>

static void listnav_update_win(struct listnav *nav);

void
listnav_update_win(struct listnav *nav)
{
	nav->wmin = MAX(nav->wmax - nav->wlen, nav->min);
	nav->wmax = MIN(nav->wmin + nav->wlen, nav->max);
	nav->sel = MAX(MIN(nav->sel, nav->wmax - 1), nav->wmin);
}

void
listnav_init(struct listnav *nav)
{
	nav->sel = 0;
	nav->min = 0;
	nav->max = 0;
	nav->wlen = 0;
	nav->wmin = 0;
	nav->wmax = 0;
}

void
listnav_update_bounds(struct listnav *nav, int min, int max)
{
	ASSERT(max >= min);

	nav->min = min;
	nav->max = max;

	listnav_update_win(nav);
}

void
listnav_update_wlen(struct listnav *nav, int wlen)
{
	ASSERT(wlen >= 0);

	nav->wlen = wlen;
	listnav_update_win(nav);
}

void
listnav_update_sel(struct listnav *nav, int sel)
{
	nav->sel = MAX(MIN(sel, nav->max - 1), nav->min);
	if (nav->sel >= nav->wmax) {
		nav->wmax = nav->sel + 1;
		nav->wmin = MAX(nav->min, nav->wmax - nav->wlen);
	} else if (nav->sel < nav->wmin) {
		nav->wmin = nav->sel;
		nav->wmax = MIN(nav->wmin + nav->wlen, nav->max);
	}
}