-
Notifications
You must be signed in to change notification settings - Fork 10
/
scrollbar.c
133 lines (107 loc) · 2.75 KB
/
scrollbar.c
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <slang.h>
#include <stdlib.h>
#include <string.h>
#include "newt.h"
#include "newt_pr.h"
struct scrollbar {
int curr;
int cs, csThumb;
int arrows;
} ;
static void sbDraw(newtComponent co);
static void sbDestroy(newtComponent co);
static void sbDrawThumb(newtComponent co, int isOn);
static struct componentOps sbOps = {
sbDraw,
newtDefaultEventHandler,
sbDestroy,
newtDefaultPlaceHandler,
newtDefaultMappedHandler,
} ;
void newtScrollbarSet(newtComponent co, int where, int total) {
struct scrollbar * sb = co->data;
int new;
if (sb->arrows)
new = (where * (co->height - 3)) / (total ? total : 1) + 1;
else
new = (where * (co->height - 1)) / (total ? total : 1);
if (new != sb->curr) {
sbDrawThumb(co, 0);
sb->curr = new;
sbDrawThumb(co, 1);
}
}
newtComponent newtVerticalScrollbar(int left, int top, int height,
int normalColorset, int thumbColorset) {
newtComponent co;
struct scrollbar * sb;
co = malloc(sizeof(*co));
sb = malloc(sizeof(*sb));
co->data = sb;
co->destroyCallback = NULL;
if (height >= 2) {
sb->arrows = 1;
sb->curr = 1;
} else {
sb->arrows = 0;
sb->curr = 0;
}
sb->cs = normalColorset;
sb->csThumb = thumbColorset;
co->ops = &sbOps;
co->isMapped = 0;
co->left = left;
co->top = top;
co->height = height;
co->width = 1;
co->takesFocus = 0;
return co;
}
void newtScrollbarSetColors(newtComponent co, int normal, int thumb) {
struct scrollbar * sb = co->data;
sb->cs = normal;
sb->csThumb = thumb;
sbDraw(co);
}
static void sbDraw(newtComponent co) {
struct scrollbar * sb = co->data;
int i;
if (!co->isMapped) return;
SLsmg_set_color(sb->cs);
SLsmg_set_char_set(1);
if (sb->arrows) {
newtGotorc(co->top, co->left);
SLsmg_write_char(SLSMG_UARROW_CHAR);
for (i = 1; i < co->height - 1; i++) {
newtGotorc(i + co->top, co->left);
SLsmg_write_char(SLSMG_CKBRD_CHAR);
}
newtGotorc(co->top + co->height - 1, co->left);
SLsmg_write_char(SLSMG_DARROW_CHAR);
} else {
for (i = 0; i < co->height; i++) {
newtGotorc(i + co->top, co->left);
SLsmg_write_char(SLSMG_CKBRD_CHAR);
}
}
SLsmg_set_char_set(0);
sbDrawThumb(co, 1);
}
static void sbDrawThumb(newtComponent co, int isOn) {
struct scrollbar * sb = co->data;
SLtt_Char_Type ch = isOn ? SLSMG_BLOCK_CHAR : SLSMG_CKBRD_CHAR;
if (!co->isMapped) return;
newtGotorc(sb->curr + co->top, co->left);
SLsmg_set_char_set(1);
/*if (isOn)
SLsmg_set_color(sb->csThumb);
else*/
SLsmg_set_color(sb->cs);
SLsmg_write_char(ch);
SLsmg_set_char_set(0);
}
static void sbDestroy(newtComponent co) {
struct scrollbar * sb = co->data;
free(sb);
free(co);
}