]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/menu.qc
start of mapinfo system; beware: menu-div0test now starts up longer for the first...
[divverent/nexuiz.git] / data / qcsrc / menu-div0test / menu.qc
1 ///////////////////////////////////////////////
2 // Menu Source File
3 ///////////////////////
4 // This file belongs to dpmod/darkplaces
5 // AK contains all menu functions (especially the required ones)
6 ///////////////////////////////////////////////
7
8 float mouseButtonsPressed;
9 vector menuMousePos;
10 float menuShiftState;
11 float menuPrevTime;
12 float menuAlpha;
13 float prevMenuAlpha;
14 float menuLoadedMaplist;
15
16 void SUB_Null() { };
17
18 void() m_init =
19 {
20         dprint_load();
21
22         menuLoadedMaplist = 0;
23         MapInfo_Enumerate();
24         if(!MapInfo_FilterGametype(MAPINFO_TYPE_ALL))
25                 return;
26         menuLoadedMaplist = 1;
27
28         GameCommand_Init();
29
30         if(cvar("developer") == 42)
31                 draw_currentSkin = "qcsrc/menu-div0test/xawskin";
32         else
33                 draw_currentSkin = "qcsrc/menu-div0test/defaultskin";
34         // TODO load SKIN constants from file later
35         
36         draw_setMousePointer("cursor");
37
38         main = spawnMainWindow(); main.configureMainWindow(main);
39         draw_reset();
40         main.resizeNotify(main, draw_shift, draw_scale, draw_shift, draw_scale);
41         main.focused = 1;
42         menuShiftState = 0;
43
44         if(Menu_Active)
45                 m_display(); // delayed menu display
46 };
47
48 void(float key, float ascii) m_keyup =
49 {
50         if(!menuLoadedMaplist)
51                 return;
52         if(!Menu_Active)
53                 return;
54         draw_reset();
55         main.keyUp(main, key, ascii, menuShiftState);
56         if(key >= K_MOUSE1 && key <= K_MOUSE3)
57         {
58                 --mouseButtonsPressed;
59                 if(!mouseButtonsPressed)
60                         main.mouseRelease(main, menuMousePos);
61                 if(mouseButtonsPressed < 0)
62                 {
63                         mouseButtonsPressed = 0;
64                         print("Warning: released an already released button\n");
65                 }
66         }
67         if(key == K_ALT) menuShiftState -= (menuShiftState & S_ALT);
68         if(key == K_CTRL) menuShiftState -= (menuShiftState & S_CTRL);
69         if(key == K_SHIFT) menuShiftState -= (menuShiftState & S_SHIFT);
70 };
71
72 void(float key, float ascii) m_keydown =
73 {
74         if(!menuLoadedMaplist)
75                 return;
76         if(!Menu_Active)
77                 return;
78         if(keyGrabber)
79         {
80                 entity e;
81                 e = keyGrabber;
82                 keyGrabber = NULL;
83                 e.keyGrabbed(e, key, ascii);
84         }
85         else
86         {
87                 draw_reset();
88                 if(!main.keyDown(main, key, ascii, menuShiftState))
89                         if(key == K_ESCAPE)
90                                 if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)) // don't back out to console only
91                                         m_hide(); // disable menu on unhandled ESC
92                 if(key >= K_MOUSE1 && key <= K_MOUSE3)
93                         if(!mouseButtonsPressed)
94                                 main.mousePress(main, menuMousePos);
95         }
96         if(key >= K_MOUSE1 && key <= K_MOUSE3)
97         {
98                 ++mouseButtonsPressed;
99                 if(mouseButtonsPressed > 10)
100                 {
101                         mouseButtonsPressed = 10;
102                         print("Warning: pressed an already pressed button\n");
103                 }
104         }
105         if(key == K_ALT) menuShiftState |= S_ALT;
106         if(key == K_CTRL) menuShiftState |= S_CTRL;
107         if(key == K_SHIFT) menuShiftState |= S_SHIFT;
108 };
109
110 void() m_draw =
111 {
112         float t;
113         float realFrametime;
114         if(!menuLoadedMaplist)
115         {
116                 m_init();
117                 return;
118         }
119         t = gettime();
120         realFrametime = frametime = min(0.2, t - menuPrevTime);
121         menuPrevTime = t;
122         time += frametime;
123
124         if(Menu_Active)
125                 if(getkeydest() != KEY_MENU || getmousetarget() != MT_MENU)
126                         m_hide();
127
128         if(cvar("cl_capturevideo"))
129                 frametime = 1 / cvar("cl_capturevideo_fps"); // make capturevideo work smoothly
130
131         prevMenuAlpha = menuAlpha;
132         if(Menu_Active)
133                 menuAlpha = min(1, menuAlpha + frametime * 5);
134         else
135                 menuAlpha = max(0, menuAlpha - frametime * 5);
136
137         if(menuAlpha <= 0)
138         {
139                 if(prevMenuAlpha > 0)
140                         main.initializeDialog(main, main.firstChild);
141                 return;
142         }
143
144         dprint_load();
145         gamestatus = 0;
146         if(isserver())
147                 gamestatus = gamestatus | GAME_ISSERVER;
148         if(clientstate() == CS_CONNECTED)
149                 gamestatus = gamestatus | GAME_CONNECTED;
150         if(cvar("developer"))
151                 gamestatus = gamestatus | GAME_DEVELOPER;
152
153         draw_reset();
154         draw_alpha *= menuAlpha;
155
156         vector dMouse;
157         dMouse = getmousepos();
158         dMouse *= frametime / realFrametime; // for capturevideo
159         if(dMouse != '0 0 0')
160         {
161                 dMouse = globalToBoxSize(dMouse, draw_scale);
162                 menuMousePos += dMouse * 1; // TODO use a cvar here
163                 menuMousePos_x = bound(0, menuMousePos_x, 1);
164                 menuMousePos_y = bound(0, menuMousePos_y, 1);
165                 if(mouseButtonsPressed)
166                         main.mouseDrag(main, menuMousePos);
167                 else
168                         main.mouseMove(main, menuMousePos);
169         }
170         main.draw(main);
171         draw_drawMousePointer(menuMousePos);
172
173         frametime = 0;
174 };
175
176 void() m_display =
177 {
178         Menu_Active = true;
179         setkeydest(KEY_MENU);
180         setmousetarget(MT_MENU);
181
182         if(!menuLoadedMaplist)
183                 return;
184
185         if(mouseButtonsPressed)
186                 main.mouseRelease(main, menuMousePos);
187         mouseButtonsPressed = 0;
188
189         main.focusEnter(main);
190         main.showNotify(main);
191 };
192
193 void() m_hide =
194 {
195         Menu_Active = false;
196         setkeydest(KEY_GAME);
197         setmousetarget(MT_CLIENT);
198
199         if(!menuLoadedMaplist)
200                 return;
201
202         main.focusLeave(main);
203         main.hideNotify(main);
204 };
205
206 void() m_toggle =
207 {
208         if(Menu_Active)
209                 m_hide();
210         else
211                 m_display();
212 };
213
214 void() m_shutdown =
215 {
216         m_hide();
217 };
218
219 void(string itemname) m_goto =
220 {
221         entity e;
222         if(!menuLoadedMaplist)
223                 return;
224         if(itemname == "") // this can be called by GameCommand
225         {
226                 if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED))
227                         m_hide();
228                 else
229                 {
230                         main.initializeDialog(main, main.firstChild);
231                         m_display();
232                 }
233         }
234         else
235         {
236                 e = findstring(NULL, name, itemname);
237                 if(e && e.parent == main)
238                 {
239                         m_hide();
240                         main.initializeDialog(main, e);
241                         m_display();
242                 }
243         }
244 }