2 // control/window/scroll.qc
4 void() Item_ScrollWindow_Update =
10 // reset _link and return if the window isnt owner of the currently selected item
11 if( !Menu_IsVisible( self ) || !_Menu_IsEmbeddedParentOf( Menu_ActiveItem, self._child ) ) {
12 self._link = null_entity;
15 // if the window has been selected just now, we set _link and scroll to its position
16 // if the selection has changed we also scroll down
17 // only if nothing has changed, we do nothing, too (this makes scrollbar support possible)
18 if( self._link == Menu_ActiveItem ) {
21 self._link = Menu_ActiveItem;
25 lLevel = Menu_ActiveItem.pos_y;
26 for( lParent = Menu_ActiveItem._parent; lParent != self ; lParent = lParent._parent )
27 lLevel += lParent.origin_y + lParent.pos_y;
29 // self.origin_y is negative to move everything up, -self.origin_y is the level
30 lOldLevel = -self.origin_y;
31 if( ( Menu_ActiveItem.size_y > self.size_y && lLevel + Menu_ActiveItem.size_y > lOldLevel && lLevel < self.size_y + lOldLevel )
32 || ( lLevel >= lOldLevel && lLevel + Menu_ActiveItem.size_y < lOldLevel + self.size_y ) )
35 // TODO: make this a bit more flexible
36 if( lOldLevel < lLevel )
37 self.origin_y = self.direction_x - lLevel;
39 self.origin_y = self.size_y - self.direction_x - lLevel;
42 self.origin_y = bound( self.size_y - self._child.size_y, self.origin_y, 0 );
43 //print( ftos( self.origin_y ), "\n" );
46 void() Item_ScrollWindow_Reinit =
51 void() Item_ScrollWindow_Spawn =
55 self._update = Item_ScrollWindow_Update;
56 self._reinit = Item_ScrollWindow_Reinit;