1 ///////////////////////////////////////////////
2 // Controls/Item Source File
3 ///////////////////////
4 // This file belongs to dpmod/darkplaces
5 // AK contains all item specific stuff
6 ////////////////////////////////////////////////
12 void(void) ITEM_WINDOW =
14 self.flag = self.flag | FLAG_NOSELECT | FLAG_DRAWONLY;
31 void(void) ITEM_REFERENCE_REINIT =
33 self._child = menu_getitem(self.link);
34 if(self._child == null_entity)
36 print(self.name, " removed, cause link ", self.link, " not found\n");
37 remove(self); // no need to call terminate
43 self._reinit = defct_reinit;
46 void(void) ITEM_REFERENCE =
48 self.flag = self.flag | FLAG_NOSELECT | FLAG_DRAWONLY;
52 remove(self); // no need to call terminate
57 ITEM_REFERENCE_REINIT,
71 void(void) ITEM_CUSTOM =
73 item_init(defct_reinit, defct_destroy, defct_key, defct_draw, defct_mouse_enter, defct_mouse_leave, defct_action, defct_refresh);
80 // ITEM_PICTURE has a special draw function
81 void(void) ITEM_PICTURE_DRAW =
83 menu_drawpic(self.pos, self.picture, self.size, self.color, self.alpha, self.drawflag);
88 void(void) ITEM_PICTURE =
90 if(self.picture == "")
91 // a picture has to have a picture
92 remove(self); // no need to call terminate
94 // load the picture if it isnt loaded already
95 gfx_loadpic(self.picture, MENU_ENFORCELOADING);
97 // if flag wasnt set yet, then set it to FLAG_DRAWONLY
99 self.flag = FLAG_DRAWONLY;
101 if(self.color == '0 0 0')
102 self.color = ITEM_PICTURE_NORMAL_COLOR;
104 self.alpha = ITEM_PICTURE_NORMAL_ALPHA;
121 void(void) ITEM_TEXT_REFRESH =
123 // first do own refresh, *then* call the default refresh !
124 if(self.size == '0 0 0')
126 if(self.font_size == '0 0 0')
127 self.font_size = ITEM_TEXT_FONT_SIZE;
129 self.size_x = self.font_size_x * strlen(self.text);
130 self.size_y = self.font_size_y;
131 } else if(self.font_size == '0 0 0')
133 self.font_size_x = self.size_x / strlen(self.text);
134 self.font_size_y = self.size_y;
141 void(void) ITEM_TEXT_DRAW =
145 // align to the rect pos - (pos + size)
147 // now check the alignement
148 if(self.alignment & TEXT_ALIGN_CENTER)
149 alignpos_x = self.pos_x + (self.size_x - strlen(self.text) * self.font_size_x) / 2;
150 else if(self.alignment & TEXT_ALIGN_RIGHT)
151 alignpos_x = self.pos_x + self.size_x - strlen(self.text) * self.font_size_x;
153 alignpos_x = self.pos_x;
154 alignpos_y = self.pos_y;
156 menu_drawstring(alignpos, self.text, self.font_size, self.color, self.alpha, self.drawflag);
161 void(void) ITEM_TEXT =
164 self.flag = FLAG_DRAWONLY;
166 if(self.color == '0 0 0')
167 self.color = ITEM_TEXT_NORMAL_COLOR;
169 self.alpha = ITEM_TEXT_NORMAL_ALPHA;
172 if(self.alignment & TEXT_ALIGN_CENTERPOS)
174 self.pos_x = self.pos_x - self.size_x / 2;
175 } else if(self.alignment & TEXT_ALIGN_LEFTPOS)
177 self.pos_x = self.pos_x - self.size_x;
195 void(void) ITEM_RECTANGLE_DRAW =
197 menu_fillarea(self.pos, self.size, self.color, self.alpha, self.drawflag);
200 void(void) ITEM_RECTANGLE =
203 self.flag = FLAG_DRAWONLY;
220 void(void) ITEM_BUTTON_DRAW =
222 if(self._button_state == BUTTON_NORMAL)
223 menu_drawpic(self.pos, self.picture, self.size, self.color, self.alpha, self.drawflag);
224 else if(self._button_state == BUTTON_SELECTED)
225 menu_drawpic(self.pos, self.picture_selected, self.size, self.color_selected, self.alpha_selected, self.drawflag_selected);
227 menu_drawpic(self.pos, self.picture_pressed, self.size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
232 void(void) ITEM_BUTTON_REFRESH =
235 if((self.hold_pressed + self._press_time < time && self._button_state == BUTTON_PRESSED) || (menu_selected != self && self._button_state == BUTTON_SELECTED))
237 self._button_state = BUTTON_NORMAL;
239 if(menu_selected == self && self._button_state == BUTTON_NORMAL)
241 self._button_state = BUTTON_SELECTED;
242 if(self.sound_selected)
243 snd_play(self.sound_selected);
249 void(float keynr, float ascii) ITEM_BUTTON_KEY =
251 if(ctcall_key(keynr, ascii))
254 if(keynr == K_ENTER || keynr == K_MOUSE1)
258 def_keyevent(keynr, ascii);
261 void(void) ITEM_BUTTON_ACTION =
263 self._press_time = time;
264 self._button_state = BUTTON_PRESSED;
265 if(self.sound_pressed)
266 snd_play(self.sound_pressed);
270 void(void) ITEM_BUTTON_REINIT =
272 self._button_state = BUTTON_NORMAL;
277 void(void) ITEM_BUTTON =
279 if(self.picture == "" || self.picture_selected == "" || self.picture_pressed == "")
280 // a picture has to have a picture
281 remove(self); // no need to call terminate
283 // load the picture if it isnt loaded already
284 gfx_loadpic(self.picture, MENU_ENFORCELOADING);
286 if(self.sound_selected != "")
287 snd_loadsound(self.sound_selected, SOUND_ENFORCELOADING);
289 self.sound_selected = SOUND_SELECT;
291 if(self.sound_pressed != "")
292 snd_loadsound(self.sound_pressed, SOUND_ENFORCELOADING);
294 self.sound_pressed = SOUND_ACTION;
296 // if flag wasnt set yet, then set it to FLAG_DRAWONLY
298 self.flag = FLAG_AUTOSETCLICK;
300 if(self.color == '0 0 0')
301 self.color = ITEM_PICTURE_NORMAL_COLOR;
303 self.alpha = ITEM_PICTURE_NORMAL_ALPHA;
304 if(self.color_selected == '0 0 0')
305 self.color_selected = ITEM_PICTURE_SELECTED_COLOR;
306 if(self.alpha_selected == 0)
307 self.alpha_selected = ITEM_PICTURE_SELECTED_ALPHA;
308 if(self.color_pressed == '0 0 0')
309 self.color_pressed = ITEM_PICTURE_PRESSED_COLOR;
310 if(self.alpha_pressed == 0)
311 self.alpha_pressed = ITEM_PICTURE_PRESSED_ALPHA;
313 if(self.hold_pressed == 0)
314 self.hold_pressed = ITEM_BUTTON_HOLD_PRESSED;
324 ITEM_BUTTON_REFRESH);
331 void(void) ITEM_TEXTBUTTON_REFRESH =
333 // first do own refresh, *then* call the default refresh !
334 if(self.size == '0 0 0')
336 if(self.font_size == '0 0 0')
337 self.font_size = ITEM_TEXT_FONT_SIZE;
339 self.size_x = self.font_size_x * strlen(self.text);
340 self.size_y = self.font_size_y;
341 } else if(self.font_size == '0 0 0')
343 self.font_size_x = self.size_x / strlen(self.text);
344 self.font_size_y = self.size_y;
347 if((self.hold_pressed + self._press_time < time && self._button_state == BUTTON_PRESSED) || (menu_selected != self && self._button_state == BUTTON_SELECTED))
349 self._button_state = BUTTON_NORMAL;
351 if(menu_selected == self && self._button_state == BUTTON_NORMAL)
353 self._button_state = BUTTON_SELECTED;
354 if(self.sound_selected)
355 snd_play(self.sound_selected);
362 void(void) ITEM_TEXTBUTTON_DRAW =
367 // align to the rect pos - (pos + size)
369 // now check the alignement
370 if(self.alignment & TEXT_ALIGN_CENTER)
371 alignpos_x = self.pos_x + (self.size_x - strlen(self.text) * self.font_size_x) / 2;
372 else if(self.alignment & TEXT_ALIGN_RIGHT)
373 alignpos_x = self.pos_x + self.size_x - strlen(self.text) * self.font_size_x;
375 alignpos_x = self.pos_x;
376 alignpos_y = self.pos_y;
378 if(self.style == TEXTBUTTON_STYLE_OUTLINE && self._button_state != BUTTON_NORMAL)
384 s_x = TEXTBUTTON_OUTLINE_WIDTH;
386 if(self._button_state == BUTTON_PRESSED)
388 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
390 else if(self._button_state == BUTTON_SELECTED)
392 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
395 p_x = self.pos_x + self.size_x - TEXTBUTTON_OUTLINE_WIDTH;
397 s_x = TEXTBUTTON_OUTLINE_WIDTH;
399 if(self._button_state == BUTTON_PRESSED)
401 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
403 else if(self._button_state == BUTTON_SELECTED)
405 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
410 s_y = TEXTBUTTON_OUTLINE_WIDTH;
412 if(self._button_state == BUTTON_PRESSED)
414 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
416 else if(self._button_state == BUTTON_SELECTED)
418 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
422 p_y = self.pos_y + self.size_y - TEXTBUTTON_OUTLINE_WIDTH;
423 s_y = TEXTBUTTON_OUTLINE_WIDTH;
425 if(self._button_state == BUTTON_PRESSED)
427 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
429 else if(self._button_state == BUTTON_SELECTED)
431 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
433 } else if(self.style == TEXTBUTTON_STYLE_BOX)
435 if(self._button_state == BUTTON_PRESSED)
437 menu_fillarea(alignpos, self.size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
439 else if(self._button_state == BUTTON_SELECTED)
441 menu_fillarea(alignpos, self.size, self.color_selected, self.alpha_selected, self.drawflag_selected);
445 if(self._button_state == BUTTON_NORMAL || self.style == TEXTBUTTON_STYLE_BOX || self.style == TEXTBUTTON_STYLE_OUTLINE)
446 menu_drawstring(alignpos, self.text, self.font_size, self.color, self.alpha, self.drawflag);
448 if(self.style == TEXTBUTTON_STYLE_TEXT)
450 if(self._button_state == BUTTON_PRESSED)
452 menu_drawstring(alignpos, self.text, self.font_size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
454 else if(self._button_state == BUTTON_SELECTED)
456 menu_drawstring(alignpos, self.text, self.font_size, self.color_selected, self.alpha_selected, self.drawflag_selected);
463 void(void) ITEM_TEXTBUTTON_ACTION =
465 self._press_time = time;
466 self._button_state = BUTTON_PRESSED;
467 if(self.sound_pressed)
468 snd_play(self.sound_pressed);
473 void(float keynr, float ascii) ITEM_TEXTBUTTON_KEY =
475 if(ctcall_key(keynr, ascii))
478 if(keynr == K_ENTER || keynr == K_MOUSE1)
482 def_keyevent(keynr, ascii);
485 void(void) ITEM_TEXTBUTTON_REINIT =
487 self._button_state = BUTTON_NORMAL;
492 void(void) ITEM_TEXTBUTTON =
495 self.flag = FLAG_AUTOSETCLICK;
497 if(self.color == '0 0 0')
498 self.color = ITEM_TEXT_NORMAL_COLOR;
500 self.alpha = ITEM_TEXT_NORMAL_ALPHA;
501 if(self.color_selected == '0 0 0')
502 self.color_selected = ITEM_TEXT_SELECTED_COLOR;
503 if(self.alpha_selected == 0)
504 self.alpha_selected = ITEM_TEXT_SELECTED_ALPHA;
505 if(self.color_pressed == '0 0 0')
506 self.color_pressed = ITEM_TEXT_PRESSED_COLOR;
507 if(self.alpha_pressed == 0)
508 self.alpha_pressed = ITEM_TEXT_PRESSED_ALPHA;
510 if(self.hold_pressed == 0)
511 self.hold_pressed = ITEM_BUTTON_HOLD_PRESSED;
513 if(self.sound_selected != "")
514 snd_loadsound(self.sound_selected, SOUND_ENFORCELOADING);
516 self.sound_selected = SOUND_SELECT;
518 if(self.sound_pressed != "")
519 snd_loadsound(self.sound_pressed, SOUND_ENFORCELOADING);
521 self.sound_pressed = SOUND_ACTION;
523 ITEM_TEXTBUTTON_REFRESH();
524 if(self.alignment & TEXT_ALIGN_CENTERPOS)
526 self.pos_x = self.pos_x - self.size_x / 2;
527 } else if(self.alignment & TEXT_ALIGN_LEFTPOS)
529 self.pos_x = self.pos_x - self.size_x;
533 ITEM_TEXTBUTTON_REINIT,
536 ITEM_TEXTBUTTON_DRAW,
539 ITEM_TEXTBUTTON_ACTION,
540 ITEM_TEXTBUTTON_REFRESH);
545 void(void) ITEM_SLIDER_DRAW =
551 if(self.picture_bar != "")
553 menu_drawpic(self.pos, self.picture_bar, self.size, self.color, self.alpha, self.drawflag);
557 menu_fillarea(self.pos, self.size, self.color, self.alpha, self.drawflag);
561 slider_pos = self.pos;
562 slider_pos_x = slider_pos_x + ((self.size_x - self.slider_size_x) / (self.max_value - self.min_value)) * (self.value - self.min_value);
563 if(self.picture != "")
565 menu_drawpic(slider_pos, self.picture, self.slider_size, self.color, self.alpha, self.drawflag);
569 menu_fillarea(slider_pos, self.slider_size, self.color + ITEM_SLIDER_BAR_COLOR_DELTA, self.alpha, self.drawflag);
573 void(void) ITEM_SLIDER_UPDATESLIDER =
575 self.value = bound(self.min_value, self.value, self.max_value);
580 void(float keynr, float ascii) ITEM_SLIDER_KEY =
582 if(ctcall_key(keynr, ascii))
585 if(keynr == K_LEFTARROW)
587 self.value = (rint(self.value / self.step) - 1) * self.step;
588 ITEM_SLIDER_UPDATESLIDER();
590 else if(keynr == K_RIGHTARROW)
592 self.value = (rint(self.value / self.step) + 1)* self.step;
593 ITEM_SLIDER_UPDATESLIDER();
595 else if(keynr == K_MOUSE1)
597 if(inrect(menu_cursor, self.pos, self.size))
599 self.value = self.min_value + ((menu_cursor_x - self.slider_size_x / 2) - self.pos_x) * ((self.max_value - self.min_value) / (self.size_x - self.slider_size_x));
604 def_keyevent(keynr, ascii);
608 snd_play(self.sound_changed);
609 ITEM_SLIDER_UPDATESLIDER();
612 void(void) ITEM_SLIDER =
614 if(self.picture != "")
615 self.picture = gfx_loadpic(self.picture, MENU_ENFORCELOADING);
616 if(self.picture_bar != "")
617 self.picture_bar = gfx_loadpic(self.picture_bar, MENU_ENFORCELOADING);
618 if(self.sound_changed == "")
619 self.sound_changed = SOUND_CHANGE;
621 if(self.color == '0 0 0')
622 self.color = ITEM_SLIDER_COLOR;
624 self.alpha = ITEM_SLIDER_ALPHA;
626 self.step = ITEM_SLIDER_STEP;
627 if(self.slider_size == '0 0 0')
629 if(self.picture != "")
630 self.slider_size = gfx_getimagesize(self.picture);
632 self.slider_size = ITEM_SLIDER_SIZE;
648 void(void) ITEM_TEXTSWITCH_DRAW =
652 // get the current text
654 self.text = getaltstring(self.value, self.text);
660 void(void) ITEM_TEXTSWITCH_REFRESH =
665 self.text = getaltstring(self.value, self.text);
672 void(float keynr, float ascii) ITEM_TEXTSWITCH_KEY =
674 if(ctcall_key(keynr, ascii))
677 if(keynr == K_LEFTARROW || keynr == K_MOUSE2)
679 self.value = self.value - 1;
681 self.value = getaltstringcount(self.text) - 1;
683 else if(keynr == K_RIGHTARROW || keynr == K_MOUSE1 || keynr == K_ENTER)
685 self.value = self.value + 1;
686 if(self.value > getaltstringcount(self.text) - 1)
690 def_keyevent(keynr, ascii);
693 snd_play(self.sound_changed);
694 if(self.switchchange)
698 void(void) ITEM_TEXTSWITCH =
702 if(self.sound_changed != "")
703 snd_loadsound(self.sound_changed, SOUND_ENFORCELOADING);
705 self.sound_changed = SOUND_CHANGE;
708 self.text = getaltstring(self.value, self.text);
716 ITEM_TEXTSWITCH_DRAW,
720 ITEM_TEXTSWITCH_REFRESH);
724 /////////////////////////////////////////////////////////////////////////
725 // The "actual" funtions
727 void(void) ctinit_picture =
732 // draws a text (uses the std. way)
733 void(string text, vector pos, vector size, float alignment, float style, float state) ctdrawtext =
740 // align to the rect pos - (pos + size)
742 // now check the alignement
743 if(alignment & TEXT_ALIGN_CENTER)
744 alignpos_x = pos_x + (size_x - strlen(text) * self.font_size_x) / 2;
745 else if(alignment & TEXT_ALIGN_RIGHT)
746 alignpos_x = pos_x + size_x - strlen(text) * self.font_size_x;
751 if(style == TEXTBUTTON_STYLE_OUTLINE && state != BUTTON_NORMAL)
757 s_x = TEXTBUTTON_OUTLINE_WIDTH;
759 if(state == BUTTON_PRESSED)
761 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
763 else if(state == BUTTON_SELECTED)
765 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
768 p_x = pos_x + size_x - TEXTBUTTON_OUTLINE_WIDTH;
770 s_x = TEXTBUTTON_OUTLINE_WIDTH;
772 if(state == BUTTON_PRESSED)
774 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
776 else if(state == BUTTON_SELECTED)
778 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
783 s_y = TEXTBUTTON_OUTLINE_WIDTH;
785 if(state == BUTTON_PRESSED)
787 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
789 else if(self._button_state == BUTTON_SELECTED)
791 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
795 p_y = pos_y + size_y - TEXTBUTTON_OUTLINE_WIDTH;
796 s_y = TEXTBUTTON_OUTLINE_WIDTH;
798 if(state == BUTTON_PRESSED)
800 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
802 else if(state == BUTTON_SELECTED)
804 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
806 } else if(style == TEXTBUTTON_STYLE_BOX)
808 if(state == BUTTON_PRESSED)
810 menu_fillarea(alignpos, size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
812 else if(self._button_state == BUTTON_SELECTED)
814 menu_fillarea(alignpos, size, self.color_selected, self.alpha_selected, self.drawflag_selected);
818 if(state == BUTTON_NORMAL || style == TEXTBUTTON_STYLE_BOX || style == TEXTBUTTON_STYLE_OUTLINE)
819 menu_drawstring(alignpos, text, self.font_size, self.color, self.alpha, self.drawflag);
821 if(style == TEXTBUTTON_STYLE_TEXT)
823 if(state == BUTTON_PRESSED)
825 menu_drawstring(alignpos, text, self.font_size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
827 else if(state == BUTTON_SELECTED)
829 menu_drawstring(alignpos, text, self.font_size, self.color_selected, self.alpha_selected, self.drawflag_selected);