Blender V4.3
ScrollBar.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <stdlib.h>
6
7#include <math.h>
8
9#include "MEM_guardedalloc.h"
10
11#include "Basic.h"
12#include "ScrollBar.h"
13
14struct _ScrollBar {
15 int rect[2][2];
17
18 int inset;
20
23};
24
26{
27 int scrollable_h = rect_height(sb->rect) - 2 * sb->inset;
28
29 return clamp_i(sb->thumbpct * scrollable_h, sb->minthumb, scrollable_h);
30}
31
33{
34 int scrollable_h = rect_height(sb->rect) - 2 * sb->inset;
35 int thumb_h = scrollbar_get_thumbH(sb);
36
37 return scrollable_h - thumb_h;
38}
39
40static float scrollbar_co_to_pos(ScrollBar *sb, int yco)
41{
42 int thumb_h = scrollbar_get_thumbH(sb);
43 int thumbable_h = scrollbar_get_thumbableH(sb);
44 int thumbable_y = (sb->rect[0][1] + sb->inset) + thumb_h / 2;
45
46 return (float)(yco - thumbable_y) / thumbable_h;
47}
48
49
50
51ScrollBar *scrollbar_new(int inset, int minthumb)
52{
53 ScrollBar *sb = MEM_callocN(sizeof(*sb), "scrollbar_new");
54 sb->inset = inset;
55 sb->minthumb = minthumb;
56
57 return sb;
58}
59
60void scrollbar_get_thumb(ScrollBar *sb, int thumb_r[2][2])
61{
62 int thumb_h = scrollbar_get_thumbH(sb);
63 int thumbable_h = scrollbar_get_thumbableH(sb);
64
65 thumb_r[0][0] = sb->rect[0][0] + sb->inset;
66 thumb_r[1][0] = sb->rect[1][0] - sb->inset;
67
68 thumb_r[0][1] = sb->rect[0][1] + sb->inset + sb->thumbpos * thumbable_h;
69 thumb_r[1][1] = thumb_r[0][1] + thumb_h;
70}
71
73{
74 return sb->scrolling;
75}
77{
78 return rect_contains_pt(sb->rect, pt);
79}
80
82{
83 int thumb_h_2 = scrollbar_get_thumbH(sb) / 2;
84 int thumbable_h = scrollbar_get_thumbableH(sb);
85 float npos = scrollbar_co_to_pos(sb, yco);
86
87 sb->scrolloffs = sb->thumbpos - npos;
88 if (fabs(sb->scrolloffs) >= (float)thumb_h_2 / thumbable_h) {
89 sb->scrolloffs = 0.0;
90 }
91
92 sb->scrolling = 1;
93 sb->thumbpos = clamp_f(npos + sb->scrolloffs, 0.0, 1.0);
94}
96{
97 float npos = scrollbar_co_to_pos(sb, yco);
98
99 sb->thumbpos = clamp_f(npos + sb->scrolloffs, 0.0, 1.0);
100}
102{
103 sb->scrolling = 0;
104 sb->scrolloffs = 0.0;
105}
106
108{
109 sb->thumbpct = pct;
110}
112{
113 sb->thumbpos = clamp_f(pos, 0.0, 1.0);
114}
115void scrollbar_set_rect(ScrollBar *sb, int rect[2][2])
116{
117 rect_copy(sb->rect, rect);
118}
119
121{
122 return sb->thumbpct;
123}
125{
126 return sb->thumbpos;
127}
128void scrollbar_get_rect(ScrollBar *sb, int rect_r[2][2])
129{
130 rect_copy(rect_r, sb->rect);
131}
132
134{
135 MEM_freeN(sb);
136}
MINLINE float clamp_f(float value, float min, float max)
MINLINE int clamp_i(int value, int min, int max)
int rect_contains_pt(int rect[2][2], int pt[2])
Definition Basic.c:38
int rect_height(int rect[2][2])
Definition Basic.c:47
void rect_copy(int dst[2][2], int src[2][2])
Definition Basic.c:33
Read Guarded memory(de)allocation.
static int scrollbar_get_thumbH(ScrollBar *sb)
Definition ScrollBar.c:25
void scrollbar_keep_scrolling(ScrollBar *sb, int yco)
Definition ScrollBar.c:95
void scrollbar_start_scrolling(ScrollBar *sb, int yco)
Definition ScrollBar.c:81
int scrollbar_is_scrolling(ScrollBar *sb)
Definition ScrollBar.c:72
static int scrollbar_get_thumbableH(ScrollBar *sb)
Definition ScrollBar.c:32
float scrollbar_get_thumbpos(ScrollBar *sb)
Definition ScrollBar.c:124
static float scrollbar_co_to_pos(ScrollBar *sb, int yco)
Definition ScrollBar.c:40
void scrollbar_get_rect(ScrollBar *sb, int rect_r[2][2])
Definition ScrollBar.c:128
void scrollbar_get_thumb(ScrollBar *sb, int thumb_r[2][2])
Definition ScrollBar.c:60
void scrollbar_set_rect(ScrollBar *sb, int rect[2][2])
Definition ScrollBar.c:115
float scrollbar_get_thumbpct(ScrollBar *sb)
Definition ScrollBar.c:120
void scrollbar_free(ScrollBar *sb)
Definition ScrollBar.c:133
int scrollbar_contains_pt(ScrollBar *sb, int pt[2])
Definition ScrollBar.c:76
void scrollbar_set_thumbpct(ScrollBar *sb, float pct)
Definition ScrollBar.c:107
void scrollbar_stop_scrolling(ScrollBar *sb)
Definition ScrollBar.c:101
ScrollBar * scrollbar_new(int inset, int minthumb)
Definition ScrollBar.c:51
void scrollbar_set_thumbpos(ScrollBar *sb, float pos)
Definition ScrollBar.c:111
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
ccl_device_inline float2 fabs(const float2 a)
int scrolling
Definition ScrollBar.c:21
float thumbpos
Definition ScrollBar.c:16
int minthumb
Definition ScrollBar.c:19
float thumbpct
Definition ScrollBar.c:16
float scrolloffs
Definition ScrollBar.c:22
int rect[2][2]
Definition ScrollBar.c:15