2 // control/visual/scrollbar.qc
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;
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';
13 // scroller == scroll button
14 float() _IVSB_GetSizeOfScroller = {
15 local float lScrollerRange;
16 local float lVisibleSize;
17 local float lTotalSize;
18 local float lScrollerSize;
20 lTotalSize = self._target._child.size_y;
21 lVisibleSize = self.size_y;
22 lScrollerRange = self.size_y - _VSB_DOWN_HEIGHT - _VSB_UP_HEIGHT;
24 lScrollerSize = lVisibleSize * lScrollerRange / lTotalSize;
25 lScrollerSize = max( _VSB_MINHEIGHT, lScrollerSize );
30 void() Item_VScrollBar_Draw = {
31 local vector lPosition;
34 if( self._target == null_entity ) {
40 lSize_y = _VSB_UP_HEIGHT;
41 Menu_Fill( lPosition, lSize, _VSB_CLICKAREA_COLOR, 1.0, 0 );
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 );
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 );
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 );
56 void() _IVSB_RangeBound = {
57 self._target.origin_y = bound( - (self._target._child.size_y - self.size_y) , self._target.origin_y, 0 );
60 void() _IVSB_ScrollUp = {
61 self._target.origin_y = self._target.origin_y + _VSB_PRECISION;
65 void() _IVSB_ScrollDown = {
66 self._target.origin_y = self._target.origin_y - _VSB_PRECISION;
70 void( float lLevel ) _IVSB_MouseSelect = {
71 local float lScrollerRange;
72 local float lVisibleSize;
73 local float lTotalSize;
74 local float lScrollerSize;
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();
81 lLevel = lLevel - _VSB_UP_HEIGHT - lScrollerSize / 2;
82 self._target.origin_y = - ( lLevel * (lTotalSize - lVisibleSize) / (lScrollerRange - lScrollerSize ) );
86 bool( float pKey, float Ascii ) Item_VScrollBar_Key = {
87 if( self._target == null_entity ) {
91 if( pKey == K_UPARROW ) {
94 } else if( pKey == K_DOWNARROW ) {
97 } else if( pKey == K_MOUSE1 ) {
100 if( !Util_InRect( Menu_Cursor_Position, self.pos, self.size ) ) {
104 lLevel = Menu_Cursor_Position_y - self.pos_y;
105 if( lLevel < _VSB_UP_HEIGHT ) {
107 } else if( lLevel >= self.size_y - _VSB_DOWN_HEIGHT ) {
110 _IVSB_MouseSelect( lLevel );
113 } else if( pKey == K_MWHEELUP ) {
116 } else if( pKey == K_MWHEELDOWN ) {
123 void() Item_VScrollBar_Update =
125 if( self.target == "" ) {
126 self._target = null_entity;
127 } else if( self.target != self._target.name ) {
128 self._target = Menu_GetItem( self.target );
131 if( self._target == null_entity ) {
135 // set size height to the height of the scrollwindow's parent
136 self.size_y = self._target.size_y;
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;
146 void() Item_VScrollBar_Destroy = {
147 String_EntityFree( self, target );
150 void() Item_VScrollBar_Spawn = {
151 String_EntityZone( self, target );
152 Item_VScrollBar_Update();
154 self._update = Item_VScrollBar_Update;
155 self._key = Item_VScrollBar_Key;
156 self._draw = Item_VScrollBar_Draw;
157 self._destroy = Item_VScrollBar_Destroy;