]> icculus.org git repositories - divverent/nexuiz.git/blob - data/menuqc/control/visual/slider.qc
rename menu directories
[divverent/nexuiz.git] / data / menuqc / control / visual / slider.qc
1 // DP/Nex Menu
2 // control/visual/slider.qc
3
4 ////////////////
5 // Item_Slider
6 ///
7
8 // returns a value in the range of 0..1
9 float() _IS_GetValue =
10 {
11         local float lValue;
12         local entity lLink;
13
14         if( !self._target )
15                 return 0;
16
17         lLink = self._target;
18
19         Raise_DataEvent( lLink, ITEM_DATALINK_GET );
20
21         if( lLink.maxValue <= lLink.minValue )
22                 lValue = 0;
23         else
24                 lValue = ( lLink._realValue - lLink.minValue ) / (lLink.maxValue - lLink.minValue);
25         return lValue;
26 };
27
28 void( bool pSelect, bool pUser ) Item_Slider_Select =
29 {
30         if( pSelect & pUser )
31                 Sound_Play( self.soundSelected );
32 };
33
34 void() Item_Slider_Draw =
35 {
36         local float lValue;
37         local vector lSliderPos;
38
39         lValue = _IS_GetValue();
40         lSliderPos_x = self.pos_x + self.size_x * (self.proportions_x + lValue * self.proportions_y) - lValue * self.sizeSlider_x;
41         lSliderPos_y = self.pos_y + (self.size_y - self.sizeSlider_y) * (1 - (self.direction_y - self.direction_x) * lValue - self.direction_x);
42
43         if( Menu_ActiveItem == self ) {
44                 Menu_DrawPicture( self.pos, self.picture, self.size, self.colorSelected, self.alphas_y, self.drawFlags_y );
45                 Menu_DrawPicture( lSliderPos, self.pictureSlider, self.sizeSlider, self.colorSelected, self.alphas_y, self.drawFlags_y );
46         } else {
47                 Menu_DrawPicture( self.pos, self.picture, self.size, self.color, self.alphas_x, self.drawFlags_x );
48                 Menu_DrawPicture( lSliderPos, self.pictureSlider, self.sizeSlider, self.color, self.alphas_x, self.drawFlags_x );
49         }
50 };
51
52 void( float pValue ) _IS_Change =
53 {
54         if( pValue < 0 )
55                 Sound_Play( self.soundDecrease );
56         else
57                 Sound_Play( self.soundIncrease );
58
59         self._target._realValue = self._target._realValue + pValue;
60         // FIXME: self._target.realValue += pValue; FTEQCC BUG
61         Raise_DataEvent( self._target, ITEM_DATALINK_SET );
62
63         CtCall_Action();
64 };
65
66 bool( float pKey, float pAscii ) Item_Slider_Key =
67 {
68         if( !self._target )
69                 return false;
70
71         switch( pKey ) {
72                 case K_LEFTARROW:
73                         _IS_Change( 0 - self._target.stepValue );
74                         return true;
75                         break;
76                 case K_RIGHTARROW:
77                         _IS_Change( self._target.stepValue );
78                         return true;
79                         break;
80                 case K_MOUSE1: {
81                         local float lPos;
82
83                         // test if it is within the slider area at all
84                         // TODO: Check if this is necessary with the future composition implementations
85                         if( !Util_InRect( Menu_Cursor_Position, self.pos, self.size ) )
86                                 return false;
87                         lPos = ( Menu_Cursor_Position_x - self.pos_x ) / self.size_x;
88                         if( lPos <= self.proportions_x )
89                                 _IS_Change( 0 - self._target.stepValue );
90                         else if( lPos <= self.proportions_x + self.proportions_y && self.proportions_y ) {
91                                 local float lValue;
92
93                                 lValue = Menu_Cursor_Position_x - self.pos_x - self.sizeSlider_x / 2 - self.size_x * self.proportions_x;
94                                 lValue = lValue / (self.size_x * self.proportions_y - self.sizeSlider_x);
95                                 lValue = lValue * ( self._target.maxValue - self._target.minValue ) + self._target.minValue;
96                                 _IS_Change( lValue - self._target._realValue );
97                         } else
98                                 _IS_Change( self._target.stepValue );
99                         return true;
100                 }
101         }
102         return false;
103 };
104
105 void() Item_Slider_Destroy =
106 {
107         CtCall_Destroy();
108
109         Item_DataUser_Destroy();
110
111         String_EntityFree( self, picture );
112         String_EntityFree( self, pictureSlider );
113         String_EntityFree( self, soundSelected );
114         String_EntityFree( self, soundIncrease );
115         String_EntityFree( self, soundDecrease );
116 };
117
118 void() Item_Slider_Spawn =
119 {
120         String_EntityZone( self, picture );
121         String_EntityZone( self, pictureSlider );
122         String_EntityZone( self, soundSelected );
123         String_EntityZone( self, soundIncrease );
124         String_EntityZone( self, soundDecrease );
125         Item_DataUser_Init();
126
127         Gfx_Precache( self.picture );
128         Gfx_Precache( self.pictureSlider );
129         Sound_Precache( self.soundSelected );
130         Sound_Precache( self.soundIncrease );
131         Sound_Precache( self.soundDecrease );
132
133         if( self.size == '0 0 0' )
134                 self.size = Gfx_GetImageSize( self.picture );
135         if( self.sizeSlider == '0 0 0' )
136                 self.sizeSlider = Gfx_GetImageSize( self.pictureSlider );
137
138         self._reinit = CtCall_Reinit;
139         self._destroy = Item_Slider_Destroy;
140         self._key = Item_Slider_Key;
141         self._draw = Item_Slider_Draw;
142         self._select = Item_Slider_Select;
143         self._update = Item_DataUser_Update;
144
145         CtCall_Init();
146 };