]> icculus.org git repositories - divverent/nexuiz.git/blob - data/scmenu/source/control/visual/list.qc
restructure
[divverent/nexuiz.git] / data / scmenu / source / control / visual / list.qc
1 // DP/Nex Menu
2 // control/visual/list.qc
3
4 float() _IL_GetItemUnderCursor =
5 {
6         local float lItem;
7         local float lStart;
8         local float lLines;
9
10         lLines = floor( self.size_y / ( self.fontSize_y + 2 ) );
11         lStart = max( 0, floor( DataLink_Switch_GetOrdinal( self._target, self._target._realValue ) - lLines / 2 ) );
12         lItem = floor( ( Menu_Cursor_Position_y - self.pos_y ) / ( self.fontSize_y + 2 ) );
13         lItem = min( lStart + lItem, DataLink_Switch_GetOrdinal( self._target, self._target.maxValue ) );
14
15         return lItem;
16 }
17
18 void() Item_List_Draw =
19 {
20         local float lStart;
21         local float lLines;
22         local float lLine;
23         local float lEnd;
24         local vector lPos;
25         local float lItemUnderCursor;
26
27         if( !self._target )
28                 return;
29
30         Raise_DataEvent( self._target, ITEM_DATALINK_GET );
31         lLines = floor( self.size_y / ( self.fontSize_y + 2 ) );
32         lStart = max( 0, floor( DataLink_Switch_GetOrdinal( self._target, self._target._realValue ) - lLines / 2 ) );
33         lEnd = min( lStart + lLines, DataLink_Switch_GetOrdinal( self._target, self._target.maxValue ) );
34
35         if( self._state == ITEM_STATE_NORMAL ) {
36                 lItemUnderCursor = -1;
37         } else {
38                 lItemUnderCursor =  _IL_GetItemUnderCursor();
39         }
40
41         lPos = '0 1 0' + self.pos;
42         for( lLine = lStart ; lLine <= lEnd ; lLine++ ) {
43                 local string lText;
44                 lText = Util_GetAltStringItem( self._target.descList, lLine );
45                 if( lLine == DataLink_Switch_GetOrdinal( self._target, self._target._realValue ) ) {
46                         if( self._state == ITEM_STATE_SELECTED )
47                                 Menu_DrawString( lPos, lText, self.fontSize, self.colorSelected, self.alphas_y, self.drawFlags_y );
48                         else if( self._state == ITEM_STATE_PRESSED )
49                                 Menu_DrawString( lPos, lText, self.fontSize, self.colorPressed, self.alphas_z, self.drawFlags_z );
50                         else
51                                 Menu_DrawString( lPos, lText, self.fontSize, self.colorInactive, self.alphaInactive, self.drawFlagInactive );
52                 } else if( lLine == lItemUnderCursor ) {
53                         Menu_DrawString( lPos, lText, self.fontSize, self.colorInactive, self.alphaInactive, self.drawFlagInactive );
54                 } else {
55                         Menu_DrawString( lPos, lText, self.fontSize, self.color, self.alphas_x, self.drawFlags_x );
56                 }
57
58                 lPos_y = lPos_y + self.fontSize_y + 2;
59
60                 String_Free( lText );
61         }
62 };
63
64 void() Item_List_Update =
65 {
66         Item_DataUser_Update();
67
68         if( self._presstime + ITEM_BUTTON_ACTIONTIME > Timer_Time )
69                 self._state = ITEM_STATE_PRESSED;
70         else if( Menu_ActiveItem == self )
71                 self._state = ITEM_STATE_SELECTED;
72         else
73                 self._state = ITEM_STATE_NORMAL;
74 };
75
76 void( bool pSelect, bool pUser ) Item_List_Select =
77 {
78         if( pSelect && pUser )
79                 Sound_Play( self.soundSelected );
80 };
81
82 bool( float pKey, float pAscii ) Item_List_Key =
83 {
84         if( pKey == K_DOWNARROW ) {
85                 Sound_Play( self.soundPressed );
86                 self._presstime = Timer_Time;
87
88                 self._target._realValue = self._target._realValue + 1;
89                 Raise_DataEvent( self._target, ITEM_DATALINK_SET );
90
91                 return true;
92         } else if( pKey == K_UPARROW ) {
93                 Sound_Play( self.soundPressed );
94                 self._presstime = Timer_Time;
95
96                 self._target._realValue = self._target._realValue - 1;
97                 Raise_DataEvent( self._target, ITEM_DATALINK_SET );
98
99                 return true;
100         } else if( pKey == K_MOUSE1 ) {
101                 local float lSelected;
102                 Sound_Play( self.soundPressed );
103
104                 lSelected = _IL_GetItemUnderCursor() * self._target.stepValue + self._target.minValue;
105                 // double-click?
106                 if( self._presstime + ITEM_BUTTON_ACTIONTIME > Timer_Time && lSelected == self._target._realValue ) {
107                         CtCall_Action();
108                 } else {
109                         self._presstime = Timer_Time;
110
111                         self._target._realValue = lSelected;
112                         Raise_DataEvent( self._target, ITEM_DATALINK_SET );
113                 }
114
115                 return true;
116         }
117         return false;
118 };
119
120 void() Item_List_Destroy =
121 {
122         CtCall_Destroy();
123
124         String_EntityFree( self, soundSelected );
125         String_EntityFree( self, soundPressed );
126
127         Item_DataUser_Destroy();
128 };
129
130 void() Item_List_Spawn =
131 {
132         Item_DataUser_Init();
133
134         String_EntityZone( self, soundSelected );
135         String_EntityZone( self, soundPressed );
136
137         Sound_Precache( self.soundSelected );
138         Sound_Precache( self.soundPressed );
139
140         self._draw = Item_List_Draw;
141         self._update = Item_List_Update;
142         self._select = Item_List_Select;
143         self._key = Item_List_Key;
144         self._reinit = CtCall_Reinit;
145
146         CtCall_Init();
147 };