]> icculus.org git repositories - divverent/nexuiz.git/blob - data/menuqc/control/visual/scrollbar.qc
rename menu directories
[divverent/nexuiz.git] / data / menuqc / control / visual / scrollbar.qc
1 // DP/Nex Menu
2 // control/visual/scrollbar.qc
3
4 const float _VSB_UP_HEIGHT = 20;
5 const float _VSB_DOWN_HEIGHT = 20;
6 const float _VSB_PRECISION = 5;
7 const float _VSB_MINHEIGHT = 10;
8
9 const vector _VSB_CLICKAREA_COLOR = '1 1 1';
10 const vector _VSB_SCOLLER_COLOR = '0.9 0.9 0.9';
11 const vector _VSB_SCROLLAREA_COLOR = '0.3 0.3 0.3';
12
13 // scroller == scroll button
14 float() _IVSB_GetSizeOfScroller = {
15         local float lScrollerRange;
16         local float lVisibleSize;
17         local float lTotalSize;
18         local float lScrollerSize;
19
20         lTotalSize = self._target._child.size_y;
21         lVisibleSize = self.size_y;
22         lScrollerRange = self.size_y - _VSB_DOWN_HEIGHT - _VSB_UP_HEIGHT;
23
24         lScrollerSize = lVisibleSize * lScrollerRange / lTotalSize;
25         lScrollerSize = max( _VSB_MINHEIGHT, lScrollerSize );
26
27         return lScrollerSize;
28 }
29
30 void() Item_VScrollBar_Draw = {
31         local vector lPosition;
32         local vector lSize;
33
34         if( self._target == null_entity ) {
35                 return;
36         }
37
38         lPosition = self.pos;
39         lSize = self.size;
40         lSize_y = _VSB_UP_HEIGHT;
41         Menu_Fill( lPosition, lSize, _VSB_CLICKAREA_COLOR, 1.0, 0 );
42
43         lPosition_y = self.pos_y + _VSB_UP_HEIGHT;
44         lSize_y = self.size_y - _VSB_UP_HEIGHT - _VSB_DOWN_HEIGHT;
45         Menu_Fill( lPosition, lSize, _VSB_SCROLLAREA_COLOR, 1.0, 0 );
46
47         lPosition_y = self.pos_y + self.size_y - _VSB_DOWN_HEIGHT;
48         lSize_y = _VSB_DOWN_HEIGHT;
49         Menu_Fill( lPosition, lSize, _VSB_CLICKAREA_COLOR, 1.0, 0 );
50
51         lSize_y = _IVSB_GetSizeOfScroller();
52         lPosition_y = self.pos_y + _VSB_UP_HEIGHT - self._target.origin_y * (self.size_y - _VSB_DOWN_HEIGHT - _VSB_UP_HEIGHT - lSize_y) / (self._target._child.size_y - self.size_y);
53         Menu_Fill( lPosition, lSize, _VSB_SCOLLER_COLOR, 1.0, 0 );
54 };
55
56 void() _IVSB_RangeBound = {
57         self._target.origin_y = bound( - (self._target._child.size_y - self.size_y) , self._target.origin_y, 0 );
58 };
59
60 void() _IVSB_ScrollUp = {
61         self._target.origin_y = self._target.origin_y + _VSB_PRECISION;
62         _IVSB_RangeBound();
63 };
64
65 void() _IVSB_ScrollDown = {
66         self._target.origin_y = self._target.origin_y - _VSB_PRECISION;
67         _IVSB_RangeBound();
68 };
69
70 void( float lLevel ) _IVSB_MouseSelect = {
71         local float lScrollerRange;
72         local float lVisibleSize;
73         local float lTotalSize;
74         local float lScrollerSize;
75
76         lTotalSize = self._target._child.size_y;
77         lVisibleSize = self.size_y;
78         lScrollerRange = self.size_y - _VSB_DOWN_HEIGHT - _VSB_UP_HEIGHT;
79         lScrollerSize = _IVSB_GetSizeOfScroller();
80
81         lLevel = lLevel - _VSB_UP_HEIGHT - lScrollerSize / 2;
82         self._target.origin_y = - ( lLevel * (lTotalSize - lVisibleSize) / (lScrollerRange - lScrollerSize ) );
83         _IVSB_RangeBound();
84 };
85
86 bool( float pKey, float Ascii ) Item_VScrollBar_Key = {
87         if( self._target == null_entity ) {
88                 return false;
89         }
90
91         if( pKey == K_UPARROW ) {
92                 _IVSB_ScrollUp();
93                 return true;
94         } else if( pKey == K_DOWNARROW ) {
95                 _IVSB_ScrollDown();
96                 return true;
97         } else if( pKey == K_MOUSE1 ) {
98                 local float lLevel;
99
100                 if( !Util_InRect( Menu_Cursor_Position, self.pos, self.size ) ) {
101                         return false;
102                 }
103
104                 lLevel = Menu_Cursor_Position_y - self.pos_y;
105                 if( lLevel < _VSB_UP_HEIGHT ) {
106                         _IVSB_ScrollUp();
107                 } else if( lLevel >= self.size_y - _VSB_DOWN_HEIGHT ) {
108                         _IVSB_ScrollDown();
109                 } else {
110                         _IVSB_MouseSelect( lLevel );
111                 }
112                 return true;
113         } else if( pKey == K_MWHEELUP ) {
114                 _IVSB_ScrollUp();
115                 return true;
116         } else if( pKey == K_MWHEELDOWN ) {
117                 _IVSB_ScrollDown();
118                 return true;
119         }
120         return false;
121 };
122
123 void() Item_VScrollBar_Update =
124 {
125         if( self.target == "" ) {
126                 self._target = null_entity;
127         } else if( self.target != self._target.name ) {
128                 self._target = Menu_GetItem( self.target );
129         }
130
131         if( self._target == null_entity ) {
132                 return;
133         }
134
135         // set size height to the height of the scrollwindow's parent
136         self.size_y = self._target.size_y;
137
138         // if the scrollbar isnt needed it becomes invisible
139         if( self.size_y >= self._target._child.size_y ) {
140                 self.flag = self.flag | FLAG_HIDDEN;
141         } else if( self.flag & FLAG_HIDDEN ) {
142                 self.flag = self.flag - FLAG_HIDDEN;
143         }
144 };
145
146 void() Item_VScrollBar_Destroy = {
147         String_EntityFree( self, target );
148 };
149
150 void() Item_VScrollBar_Spawn = {
151         String_EntityZone( self, target );
152         Item_VScrollBar_Update();
153
154         self._update = Item_VScrollBar_Update;
155         self._key = Item_VScrollBar_Key;
156         self._draw = Item_VScrollBar_Draw;
157         self._destroy = Item_VScrollBar_Destroy;
158 };