10
10
Property ,
11
11
Surface ,
12
12
UIEvent ,
13
+ UIKeyPressEvent ,
13
14
UILayout ,
14
15
UIMouseDragEvent ,
15
16
UIMouseEvent ,
@@ -42,7 +43,7 @@ def __init__(self, scroll_area: UIScrollArea, vertical: bool = True):
42
43
self .with_border (color = arcade .uicolor .GRAY_CONCRETE )
43
44
self .vertical = vertical
44
45
45
- self ._scroll_bar_size = 20
46
+ # self._scroll_bar_size = 20
46
47
47
48
bind (self , "_thumb_hover" , self .trigger_render )
48
49
bind (self , "_dragging" , self .trigger_render )
@@ -52,6 +53,10 @@ def __init__(self, scroll_area: UIScrollArea, vertical: bool = True):
52
53
bind (scroll_area , "content_width" , self .trigger_full_render )
53
54
54
55
def on_event (self , event : UIEvent ) -> Optional [bool ]:
56
+ # check if we are scrollable
57
+ if not self ._scrollable ():
58
+ return EVENT_UNHANDLED
59
+
55
60
# detect if event is mouse down and inside the scroll thumb
56
61
# if so, start dragging the thumb
57
62
thumb_rect_relative = self ._thumb_rect ()
@@ -68,20 +73,20 @@ def on_event(self, event: UIEvent) -> Optional[bool]:
68
73
# if so, update the scroll position
69
74
if isinstance (event , UIMouseDragEvent ) and self ._dragging :
70
75
sx , sy = event .pos - self .rect .bottom_left
71
- sx -= self ._scroll_bar_size / 2
72
- sy -= self ._scroll_bar_size / 2
76
+ sx -= self ._scroll_bar_size () / 2
77
+ sy -= self ._scroll_bar_size () / 2
73
78
74
79
scroll_area = self .scroll_area
75
80
76
81
if self .vertical :
77
- available_track_size = self .content_height - self ._scroll_bar_size
82
+ available_track_size = self .content_height - self ._scroll_bar_size ()
78
83
target_progress = 1 - sy / available_track_size
79
84
target_progress = max (0 , min (1 , target_progress ))
80
85
81
86
scroll_range = scroll_area .surface .height - scroll_area .content_height
82
87
scroll_area .scroll_y = - target_progress * scroll_range
83
88
else :
84
- available_track_size = self .content_width - self ._scroll_bar_size
89
+ available_track_size = self .content_width - self ._scroll_bar_size ()
85
90
target_progress = sx / available_track_size
86
91
target_progress = max (0 , min (1 , target_progress ))
87
92
scroll_range = scroll_area .surface .width - scroll_area .content_width
@@ -95,8 +100,33 @@ def on_event(self, event: UIEvent) -> Optional[bool]:
95
100
self ._dragging = False
96
101
return True
97
102
103
+ if isinstance (event , UIKeyPressEvent ):
104
+ print (self ._scroll_bar_size ())
105
+
98
106
return EVENT_UNHANDLED
99
107
108
+ def _scroll_bar_size (self ):
109
+ # based on: https://stackoverflow.com/a/16367035
110
+
111
+ content_size = (
112
+ self .scroll_area .surface .height if self .vertical else self .scroll_area .surface .width
113
+ )
114
+ view_size = (
115
+ self .scroll_area .content_height if self .vertical else self .scroll_area .content_width
116
+ )
117
+ ratio = view_size / content_size
118
+
119
+ scoll_range = self .content_height if self .vertical else self .content_width
120
+
121
+ return scoll_range * ratio
122
+
123
+ def _scrollable (self ):
124
+ return (
125
+ self .scroll_area .surface .height - self .scroll_area .content_height
126
+ if self .vertical
127
+ else self .scroll_area .surface .width - self .scroll_area .content_width
128
+ ) > 0
129
+
100
130
def _thumb_rect (self ):
101
131
"""Calculate the rect of the thumb."""
102
132
scroll_area = self .scroll_area
@@ -108,24 +138,26 @@ def _thumb_rect(self):
108
138
else scroll_area .surface .width - scroll_area .content_width
109
139
)
110
140
111
- if scroll_range <= 0 :
112
- # content is smaller than the scroll area, no need for a thumb
113
- return XYWH (0 , 0 , 0 , 0 )
141
+ if not self . _scrollable () :
142
+ # content is smaller than the scroll area, full size thumb
143
+ return LBWH (0 , 0 , self . content_width , self . content_height )
114
144
115
145
scroll_progress = - scroll_value / scroll_range
116
146
117
147
content_size = self .content_height if self .vertical else self .content_width
118
- available_track_size = content_size - self ._scroll_bar_size
148
+ available_track_size = content_size - self ._scroll_bar_size ()
119
149
120
150
if self .vertical :
121
- scroll_bar_y = self ._scroll_bar_size / 2 + available_track_size * (1 - scroll_progress )
151
+ scroll_bar_y = self ._scroll_bar_size () / 2 + available_track_size * (
152
+ 1 - scroll_progress
153
+ )
122
154
scroll_bar_x = self .content_width / 2
123
- return XYWH (scroll_bar_x , scroll_bar_y , self .content_width , self ._scroll_bar_size )
155
+ return XYWH (scroll_bar_x , scroll_bar_y , self .content_width , self ._scroll_bar_size () )
124
156
125
157
else :
126
- scroll_bar_x = self ._scroll_bar_size / 2 + available_track_size * scroll_progress
158
+ scroll_bar_x = self ._scroll_bar_size () / 2 + available_track_size * scroll_progress
127
159
scroll_bar_y = self .content_height / 2
128
- return XYWH (scroll_bar_x , scroll_bar_y , self ._scroll_bar_size , self .content_height )
160
+ return XYWH (scroll_bar_x , scroll_bar_y , self ._scroll_bar_size () , self .content_height )
129
161
130
162
def do_render (self , surface : Surface ):
131
163
"""Render the scroll bar."""
0 commit comments