]> icculus.org git repositories - divverent/nexuiz.git/blob - data/scmenu/source/control/window/scroll.qc
restructure
[divverent/nexuiz.git] / data / scmenu / source / control / window / scroll.qc
1 // DP/Nex Menu
2 // control/window/scroll.qc
3
4 void() Item_ScrollWindow_Update =
5 {
6         local float lLevel;
7         local float lOldLevel;
8         local entity lParent;
9
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;
13                 return;
14         }
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 ) {
19                 return;
20         } else {
21                 self._link = Menu_ActiveItem;
22         }
23
24         // find the lLevel
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;
28
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 ) )
33                 return;
34         // adapt the origin
35         // TODO: make this a bit more flexible
36         if( lOldLevel < lLevel )
37                 self.origin_y = self.direction_x - lLevel;
38         else
39                 self.origin_y = self.size_y - self.direction_x - lLevel;
40
41         // now limit it
42         self.origin_y = bound( self.size_y - self._child.size_y, self.origin_y, 0 );
43         //print( ftos( self.origin_y ), "\n" );
44 };
45
46 void() Item_ScrollWindow_Reinit =
47 {
48         self.origin_y = 0;
49 };
50
51 void() Item_ScrollWindow_Spawn =
52 {
53         Item_Window_Spawn();
54
55         self._update = Item_ScrollWindow_Update;
56         self._reinit = Item_ScrollWindow_Reinit;
57 };