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