35
35
#include "ScrollBar.h"
37
37
struct _ScrollBar {
39
float thumbpos, thumbpct;
39
float thumbpos, thumbpct;
48
static int scrollbar_get_thumbH(ScrollBar *sb) {
49
int scrollable_h= rect_height(sb->rect) - 2*sb->inset;
48
static int scrollbar_get_thumbH(ScrollBar *sb)
50
int scrollable_h = rect_height(sb->rect) - 2 * sb->inset;
51
return clamp_i(sb->thumbpct*scrollable_h, sb->minthumb, scrollable_h);
52
return clamp_i(sb->thumbpct * scrollable_h, sb->minthumb, scrollable_h);
53
static int scrollbar_get_thumbableH(ScrollBar *sb) {
54
int scrollable_h= rect_height(sb->rect) - 2*sb->inset;
55
int thumb_h= scrollbar_get_thumbH(sb);
55
static int scrollbar_get_thumbableH(ScrollBar *sb)
57
int scrollable_h = rect_height(sb->rect) - 2 * sb->inset;
58
int thumb_h = scrollbar_get_thumbH(sb);
57
60
return scrollable_h - thumb_h;
60
static float scrollbar_co_to_pos(ScrollBar *sb, int yco) {
61
int thumb_h= scrollbar_get_thumbH(sb);
62
int thumbable_h= scrollbar_get_thumbableH(sb);
63
int thumbable_y= (sb->rect[0][1]+sb->inset) + thumb_h/2;
63
static float scrollbar_co_to_pos(ScrollBar *sb, int yco)
65
int thumb_h = scrollbar_get_thumbH(sb);
66
int thumbable_h = scrollbar_get_thumbableH(sb);
67
int thumbable_y = (sb->rect[0][1] + sb->inset) + thumb_h / 2;
65
return (float) (yco-thumbable_y)/thumbable_h;
69
return (float) (yco - thumbable_y) / thumbable_h;
70
ScrollBar *scrollbar_new(int inset, int minthumb) {
71
ScrollBar *sb= MEM_callocN(sizeof(*sb), "scrollbar_new");
73
sb->minthumb= minthumb;
74
ScrollBar *scrollbar_new(int inset, int minthumb)
76
ScrollBar *sb = MEM_callocN(sizeof(*sb), "scrollbar_new");
78
sb->minthumb = minthumb;
78
void scrollbar_get_thumb(ScrollBar *sb, int thumb_r[2][2]) {
79
int thumb_h= scrollbar_get_thumbH(sb);
80
int thumbable_h= scrollbar_get_thumbableH(sb);
82
thumb_r[0][0]= sb->rect[0][0]+sb->inset;
83
thumb_r[1][0]= sb->rect[1][0]-sb->inset;
85
thumb_r[0][1]= sb->rect[0][1]+sb->inset + sb->thumbpos*thumbable_h;
86
thumb_r[1][1]= thumb_r[0][1] + thumb_h;
83
void scrollbar_get_thumb(ScrollBar *sb, int thumb_r[2][2])
85
int thumb_h = scrollbar_get_thumbH(sb);
86
int thumbable_h = scrollbar_get_thumbableH(sb);
88
thumb_r[0][0] = sb->rect[0][0] + sb->inset;
89
thumb_r[1][0] = sb->rect[1][0] - sb->inset;
91
thumb_r[0][1] = sb->rect[0][1] + sb->inset + sb->thumbpos * thumbable_h;
92
thumb_r[1][1] = thumb_r[0][1] + thumb_h;
89
int scrollbar_is_scrolling(ScrollBar *sb) {
95
int scrollbar_is_scrolling(ScrollBar *sb)
90
97
return sb->scrolling;
92
int scrollbar_contains_pt(ScrollBar *sb, int pt[2]) {
99
int scrollbar_contains_pt(ScrollBar *sb, int pt[2])
93
101
return rect_contains_pt(sb->rect, pt);
96
void scrollbar_start_scrolling(ScrollBar *sb, int yco) {
97
int thumb_h_2= scrollbar_get_thumbH(sb)/2;
98
int thumbable_h= scrollbar_get_thumbableH(sb);
99
float npos= scrollbar_co_to_pos(sb, yco);
104
void scrollbar_start_scrolling(ScrollBar *sb, int yco)
106
int thumb_h_2 = scrollbar_get_thumbH(sb) / 2;
107
int thumbable_h = scrollbar_get_thumbableH(sb);
108
float npos = scrollbar_co_to_pos(sb, yco);
101
sb->scrolloffs= sb->thumbpos - npos;
102
if (fabs(sb->scrolloffs) >= (float) thumb_h_2/thumbable_h) {
110
sb->scrolloffs = sb->thumbpos - npos;
111
if (fabs(sb->scrolloffs) >= (float) thumb_h_2 / thumbable_h) {
112
sb->scrolloffs = 0.0;
107
sb->thumbpos= clamp_f(npos + sb->scrolloffs, 0.0, 1.0);
109
void scrollbar_keep_scrolling(ScrollBar *sb, int yco) {
110
float npos= scrollbar_co_to_pos(sb, yco);
112
sb->thumbpos= clamp_f(npos + sb->scrolloffs, 0.0, 1.0);
114
void scrollbar_stop_scrolling(ScrollBar *sb) {
119
void scrollbar_set_thumbpct(ScrollBar *sb, float pct) {
122
void scrollbar_set_thumbpos(ScrollBar *sb, float pos) {
123
sb->thumbpos= clamp_f(pos, 0.0, 1.0);
125
void scrollbar_set_rect(ScrollBar *sb, int rect[2][2]) {
116
sb->thumbpos = clamp_f(npos + sb->scrolloffs, 0.0, 1.0);
118
void scrollbar_keep_scrolling(ScrollBar *sb, int yco)
120
float npos = scrollbar_co_to_pos(sb, yco);
122
sb->thumbpos = clamp_f(npos + sb->scrolloffs, 0.0, 1.0);
124
void scrollbar_stop_scrolling(ScrollBar *sb)
127
sb->scrolloffs = 0.0;
130
void scrollbar_set_thumbpct(ScrollBar *sb, float pct)
134
void scrollbar_set_thumbpos(ScrollBar *sb, float pos)
136
sb->thumbpos = clamp_f(pos, 0.0, 1.0);
138
void scrollbar_set_rect(ScrollBar *sb, int rect[2][2])
126
140
rect_copy(sb->rect, rect);
129
float scrollbar_get_thumbpct(ScrollBar *sb) {
143
float scrollbar_get_thumbpct(ScrollBar *sb)
130
145
return sb->thumbpct;
132
float scrollbar_get_thumbpos(ScrollBar *sb) {
147
float scrollbar_get_thumbpos(ScrollBar *sb)
133
149
return sb->thumbpos;
135
void scrollbar_get_rect(ScrollBar *sb, int rect_r[2][2]) {
151
void scrollbar_get_rect(ScrollBar *sb, int rect_r[2][2])
136
153
rect_copy(rect_r, sb->rect);
139
void scrollbar_free(ScrollBar *sb) {
156
void scrollbar_free(ScrollBar *sb)