]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/menu.qc
fix team select dialog notification; fix clicking outside of menu items outside game
[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
15 void SUB_Null() { };
16
17 void() m_init =
18 {
19         dprint_load();
20         GameCommand_Init();
21         
22         draw_setMousePointer("gfx/cursor");
23
24         main = spawnMainWindow(); main.configureMainWindow(main);
25         draw_reset();
26         main.resizeNotify(main, draw_shift, draw_scale, draw_shift, draw_scale);
27         main.focused = 1;
28         menuShiftState = 0;
29 };
30
31 void(float key, float ascii) m_keyup =
32 {
33         if(!Menu_Active)
34                 return;
35         draw_reset();
36         main.keyUp(main, key, ascii, menuShiftState);
37         if(key >= K_MOUSE1 && key <= K_MOUSE3)
38         {
39                 --mouseButtonsPressed;
40                 if(!mouseButtonsPressed)
41                         main.mouseRelease(main, menuMousePos);
42                 if(mouseButtonsPressed < 0)
43                 {
44                         mouseButtonsPressed = 0;
45                         print("Warning: released an already released button\n");
46                 }
47         }
48         if(key == K_ALT) menuShiftState -= (menuShiftState & S_ALT);
49         if(key == K_CTRL) menuShiftState -= (menuShiftState & S_CTRL);
50         if(key == K_SHIFT) menuShiftState -= (menuShiftState & S_SHIFT);
51 };
52
53 void(float key, float ascii) m_keydown =
54 {
55         if(!Menu_Active)
56                 return;
57         if(keyGrabber)
58         {
59                 entity e;
60                 e = keyGrabber;
61                 keyGrabber = NULL;
62                 e.keyGrabbed(e, key, ascii);
63         }
64         else
65         {
66                 draw_reset();
67                 if(!main.keyDown(main, key, ascii, menuShiftState))
68                         if(key == K_ESCAPE)
69                                 if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)) // don't back out to console only
70                                         m_hide(); // disable menu on unhandled ESC
71                 if(key >= K_MOUSE1 && key <= K_MOUSE3)
72                         if(!mouseButtonsPressed)
73                                 main.mousePress(main, menuMousePos);
74         }
75         if(key >= K_MOUSE1 && key <= K_MOUSE3)
76         {
77                 ++mouseButtonsPressed;
78                 if(mouseButtonsPressed > 10)
79                 {
80                         mouseButtonsPressed = 10;
81                         print("Warning: pressed an already pressed button\n");
82                 }
83         }
84         if(key == K_ALT) menuShiftState |= S_ALT;
85         if(key == K_CTRL) menuShiftState |= S_CTRL;
86         if(key == K_SHIFT) menuShiftState |= S_SHIFT;
87 };
88
89 void() m_draw =
90 {
91         float t;
92         float realFrametime;
93         t = gettime();
94         realFrametime = frametime = min(0.2, t - menuPrevTime);
95         menuPrevTime = t;
96         time += frametime;
97
98         if(Menu_Active)
99                 if(getkeydest() != KEY_MENU || getmousetarget() != MT_MENU)
100                         m_hide();
101
102         if(cvar("cl_capturevideo"))
103                 frametime = 1 / cvar("cl_capturevideo_fps"); // make capturevideo work smoothly
104
105         prevMenuAlpha = menuAlpha;
106         if(Menu_Active)
107                 menuAlpha = min(1, menuAlpha + frametime * 5);
108         else
109                 menuAlpha = max(0, menuAlpha - frametime * 5);
110
111         if(menuAlpha <= 0)
112         {
113                 if(prevMenuAlpha > 0)
114                         main.initializeDialog(main, main.firstChild);
115                 return;
116         }
117
118         dprint_load();
119         gamestatus = 0;
120         if(isserver())
121                 gamestatus = gamestatus | GAME_ISSERVER;
122         if(clientstate() == CS_CONNECTED)
123                 gamestatus = gamestatus | GAME_CONNECTED;
124         if(cvar("developer"))
125                 gamestatus = gamestatus | GAME_DEVELOPER;
126
127         draw_reset();
128         draw_alpha *= menuAlpha;
129
130         vector dMouse;
131         dMouse = getmousepos();
132         dMouse *= frametime / realFrametime; // for capturevideo
133         if(dMouse != '0 0 0')
134         {
135                 dMouse = globalToBoxSize(dMouse, draw_scale);
136                 menuMousePos += dMouse * 1; // TODO use a cvar here
137                 menuMousePos_x = bound(0, menuMousePos_x, 1);
138                 menuMousePos_y = bound(0, menuMousePos_y, 1);
139                 if(mouseButtonsPressed)
140                         main.mouseDrag(main, menuMousePos);
141                 else
142                         main.mouseMove(main, menuMousePos);
143         }
144         main.draw(main);
145         draw_drawMousePointer(menuMousePos);
146
147         frametime = 0;
148 };
149
150 void() m_display =
151 {
152         Menu_Active = true;
153
154         if(mouseButtonsPressed)
155                 main.mouseRelease(main, menuMousePos);
156         mouseButtonsPressed = 0;
157
158         setkeydest(KEY_MENU);
159         setmousetarget(MT_MENU);
160
161         main.focusEnter(main);
162 };
163
164 void() m_hide =
165 {
166         Menu_Active = false;
167         setkeydest(KEY_GAME);
168         setmousetarget(MT_CLIENT);
169
170         main.focusLeave(main);
171 };
172
173 void() m_toggle =
174 {
175         if(Menu_Active)
176                 m_hide();
177         else
178                 m_display();
179 };
180
181 void() m_shutdown =
182 {
183         m_hide();
184 };
185
186 void(string itemname) m_goto =
187 {
188         entity e;
189         if(itemname == "") // this can be called by GameCommand
190         {
191                 if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED))
192                         m_hide();
193                 else
194                 {
195                         main.initializeDialog(main, main.firstChild);
196                         m_display();
197                 }
198         }
199         else
200         {
201                 e = findstring(NULL, name, itemname);
202                 if(e && e.parent == main)
203                 {
204                         main.initializeDialog(main, e);
205                         m_display();
206                 }
207         }
208 }