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