5 return me.scrollPos != me.scrollPosTarget;
12 if (me.itemHeight == 1)
14 me.needScrollToItem = i;
18 i =
bound(0, i, me.nItems - 1);
22 if (i < me.getFirstFullyVisibleItemAtScrollPos(me, me.scrollPos))
25 me.scrollPosTarget = me.getItemStart(me, i);
27 else if (i > me.getLastFullyVisibleItemAtScrollPos(me, me.scrollPos))
30 if (i == me.nItems - 1) me.scrollPosTarget = me.getTotalHeight(me) - 1;
31 else me.scrollPosTarget = me.getItemStart(me, i + 1) - 1;
37 i =
bound(0, i, me.nItems - 1);
38 me.scrollToItem(me, i);
43 SUPER(
ListBox).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
44 me.controlWidth = me.scrollbarWidth / absSize.x;
48 me.scrollbarWidth = theScrollbarWidth;
49 me.itemHeight = theItemHeight;
54 return me.nItems * me.itemHeight;
58 return floor(pos / me.itemHeight);
62 return me.itemHeight * i;
71 return me.getItemAtPos(me, pos + 0.999) - 1;
75 return me.getItemAtPos(me, pos + 0.001) + 1;
81 me.scrollPosTarget =
max(me.scrollPosTarget - 0.5, 0);
85 me.scrollPosTarget =
min(me.scrollPosTarget + 0.5,
max(0, me.getTotalHeight(me) - 1));
89 if (me.selectionDoesntMatter)
91 me.scrollPosTarget =
max(me.scrollPosTarget - 0.5, 0);
95 float i = me.selectedItem;
96 float a = me.getItemHeight(me, i);
101 a += me.getItemHeight(me, i);
104 me.setSelected(me, i + 1);
108 if (me.selectionDoesntMatter)
110 me.scrollPosTarget =
min(me.scrollPosTarget + 0.5, me.nItems * me.itemHeight - 1);
114 float i = me.selectedItem;
115 float a = me.getItemHeight(me, i);
119 if (i >= me.nItems)
break;
120 a += me.getItemHeight(me, i);
123 me.setSelected(me, i - 1);
127 if (me.selectionDoesntMatter)
129 me.scrollPosTarget =
max(me.scrollPosTarget - me.itemHeight, 0);
133 me.setSelected(me, me.selectedItem - 1);
137 if (me.selectionDoesntMatter)
139 me.scrollPosTarget =
min(me.scrollPosTarget + me.itemHeight, me.nItems * me.itemHeight - 1);
143 me.setSelected(me, me.selectedItem + 1);
147 me.setSelected(me, 0);
151 me.setSelected(me, me.nItems - 1);
161 me.mouseMoveOffset = -1;
162 if (pos_x < 0)
return 0;
163 if (pos_y < 0)
return 0;
164 if (pos_x >= 1)
return 0;
165 if (pos_y >= 1)
return 0;
166 if (pos_x < 1 - me.controlWidth)
168 me.mouseMoveOffset = pos.y;
172 me.setFocusedItem(me, -1);
173 me.mouseMoveOffset = -1;
180 me.updateControlTopBottom(me);
181 me.dragScrollPos = pos;
182 if (me.pressed == 1 && me.getTotalHeight(me) > 1)
185 if (pos.x < 1 - me.controlWidth - me.tolerance.x * me.controlWidth) hit = 0;
186 if (pos.y < 0 - me.tolerance.y) hit = 0;
187 if (pos.x >= 1 + me.tolerance.x * me.controlWidth) hit = 0;
188 if (pos.y >= 1 + me.tolerance.y) hit = 0;
193 d = (pos.y - me.pressOffset) / (1 - (me.controlBottom - me.controlTop)) * (me.getTotalHeight(me) - 1);
194 me.scrollPosTarget = me.previousValue + d;
198 me.scrollPosTarget = me.previousValue;
200 me.scrollPosTarget =
min(me.scrollPosTarget, me.getTotalHeight(me) - 1);
201 me.scrollPosTarget =
max(me.scrollPosTarget, 0);
203 else if (me.pressed == 2)
205 int clickeditem = me.getItemAtPos(me, me.scrollPos + pos.y);
206 me.setSelected(me, clickeditem);
207 me.setFocusedItem(me, clickeditem);
208 me.mouseMoveOffset = -1;
214 if (pos.x < 0)
return false;
215 if (pos.y < 0)
return false;
216 if (pos.x >= 1)
return false;
217 if (pos.y >= 1)
return false;
220 if (pos.x >= 1 -
this.controlWidth)
223 if (pos.y <
this.controlTop)
228 else if (pos.y >
this.controlBottom)
253 float focusedItem_save = me.focusedItem;
254 me.focusedItem = (item >= 0 && item < me.nItems) ? item : -1;
255 if (focusedItem_save != me.focusedItem)
257 me.focusedItemChangeNotify(me);
258 if (me.focusedItem >= 0) me.focusedItemAlpha = SKINALPHA_LISTBOX_FOCUSED;
268 else if (me.pressed == 2)
273 int clickeditem = me.getItemAtPos(me, me.scrollPos + pos.y);
274 me.setSelected(me, clickeditem);
275 me.setFocusedItem(me, clickeditem);
279 vector where =
globalToBox(pos,
eY * (me.getItemStart(me, me.selectedItem) - me.scrollPos),
eX * (1 - me.controlWidth) +
eY * me.getItemHeight(me, me.selectedItem));
281 if ((me.selectedItem == me.lastClickedItem && clickeditem == me.selectedItem) && (
time < me.lastClickedTime + 0.3))
282 me.doubleClickListBoxItem(me, me.selectedItem, where);
284 me.clickListBoxItem(me, me.selectedItem, where);
286 me.lastClickedItem = me.selectedItem;
287 me.lastClickedTime =
time;
299 me.setFocusedItem(me, -1);
300 me.mouseMoveOffset = -1;
305 if (me.getTotalHeight(me) <= 1)
309 me.controlBottom = 1;
315 me.scrollPos =
bound(0, me.scrollPos, me.getTotalHeight(me) - 1);
317 me.controlTop =
max(0, me.scrollPos / me.getTotalHeight(me));
318 me.controlBottom =
min((me.scrollPos + 1) / me.getTotalHeight(me), 1);
320 const float minfactor = 2 * me.controlWidth / me.size.y * me.size.x;
321 float f = me.controlBottom - me.controlTop;
328 f = (minfactor - 1) / (f - 1);
329 me.controlTop = me.controlTop * f + 0 * (1 - f);
330 me.controlBottom = me.controlBottom * f + 1 * (1 - f);
334 AUTOCVAR(menu_scroll_averaging_time,
float, 0.16,
"smooth scroll averaging time");
336 AUTOCVAR(menu_scroll_averaging_time_pressed,
float, 0.06,
"smooth scroll averaging time when dragging the scrollbar");
339 vector fillSize =
'0 0 0';
342 if (me.mouseMoveOffset != -1) me.setFocusedItem(me, me.getItemAtPos(me, me.scrollPos + me.mouseMoveOffset));
344 if (me.needScrollToItem >= 0)
346 me.scrollToItem(me, me.needScrollToItem);
347 me.needScrollToItem = -1;
349 if (me.scrollPos != me.scrollPosTarget)
351 float averaging_time = (me.pressed == 1)
352 ? autocvar_menu_scroll_averaging_time_pressed
353 : autocvar_menu_scroll_averaging_time;
355 float f = averaging_time ?
exp(-
frametime / averaging_time) : 0;
356 me.scrollPos = me.scrollPos * f + me.scrollPosTarget * (1 - f);
357 if (
fabs(me.scrollPos - me.scrollPosTarget) < 0.001) me.scrollPos = me.scrollPosTarget;
360 if (me.pressed == 2) me.mouseDrag(me, me.dragScrollPos);
361 me.updateControlTopBottom(me);
362 fillSize.x = (1 - me.controlWidth);
363 if (me.alphaBG)
draw_Fill(
'0 0 0',
'0 1 0' + fillSize, me.colorBG, me.alphaBG);
367 if (me.getTotalHeight(me) > 1)
370 o =
eX * (1 - me.controlWidth) +
eY * me.controlTop;
371 s =
eX * me.controlWidth +
eY * (me.controlBottom - me.controlTop);
381 int i = me.getItemAtPos(me, me.scrollPos);
382 float y = me.getItemStart(me, i) - me.scrollPos;
383 for ( ; i < me.nItems &&
y < 1; ++i)
386 vector relSize =
eX * (1 - me.controlWidth) +
eY * me.getItemHeight(me, i);
389 me.drawListBoxItem(me, i, absSize, (me.selectedItem == i), (me.focusedItem == i));
415 draw_Text(
'0 0 0', sprintf(_(
"Item %d"), i),
eX * (8 / absSize.x) +
eY * (8 / absSize.y), (isSelected ?
'0 1 0' :
'1 1 1'), 1, 0);
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
virtual void setSelected()
virtual void getTotalHeight()
virtual void mousePress()
virtual void getItemAtPos()
virtual void updateControlTopBottom()
virtual void setFocusedItem()
float ListBox_getLastFullyVisibleItemAtScrollPos(entity me, float pos)
void ListBox_draw(entity me)
float ListBox_mouseRelease(entity me, vector pos)
void ListBox_updateControlTopBottom(entity me)
void ListBox_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
void ListBox_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
void ListBox_clickListBoxItem(entity me, float i, vector where)
float ListBox_getItemAtPos(entity me, float pos)
void ListBox_doubleClickListBoxItem(entity me, float i, vector where)
void ListBox_scrollToItem(entity me, int i)
void ListBox_setSelected(entity me, float i)
bool ListBox_isScrolling(entity me)
float ListBox_getFirstFullyVisibleItemAtScrollPos(entity me, float pos)
void ListBox_configureListBox(entity me, float theScrollbarWidth, float theItemHeight)
float ListBox_getItemHeight(entity me, float i)
void ListBox_focusedItemChangeNotify(entity me)
float ListBox_mouseDrag(entity me, vector pos)
void ListBox_setFocusedItem(entity me, int item)
float ListBox_getItemStart(entity me, float i)
float ListBox_keyDown(entity me, float key, float ascii, float shift)
void ListBox_focusLeave(entity me)
float ListBox_mouseMove(entity me, vector pos)
float ListBox_getTotalHeight(entity me)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define METHOD(cname, name, prototype)