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;
33 void(void) ITEM_REFERENCE =
35 self.flag = self.flag | FLAG_NOSELECT | FLAG_DRAWONLY;
37 // if there is no link, this is a dynamic reference
40 self._child = menu_getitem(self.link);
41 if(self._child == null_entity)
43 print(self.name, " removed, cause link ", self.link, " not found\n");
44 remove(self); // no need to call terminate
66 void(void) ITEM_CUSTOM =
68 item_init(defct_reinit, defct_destroy, defct_key, defct_draw, defct_mouse_enter, defct_mouse_leave, defct_action, defct_refresh);
76 // ITEM_PICTURE has a special draw function
77 void(void) ITEM_PICTURE_DRAW =
79 menu_drawpic(self.pos, self.picture, self.size, self.color, self.alpha, self.drawflag);
84 void(void) ITEM_PICTURE_DESTROY =
86 gfx_unloadpic(self.picture);
91 void(void) ITEM_PICTURE =
93 if(self.picture == "")
94 // a picture has to have a picture
95 remove(self); // no need to call terminate
97 // load the picture if it isnt loaded already
98 gfx_loadpic(self.picture, MENU_ENFORCELOADING);
100 // if flag wasnt set yet, then set it to FLAG_DRAWONLY
102 self.flag = FLAG_DRAWONLY;
104 if(self.color == '0 0 0')
105 self.color = ITEM_PICTURE_NORMAL_COLOR;
107 self.alpha = ITEM_PICTURE_NORMAL_ALPHA;
111 ITEM_PICTURE_DESTROY,
126 void(void) ITEM_TEXT_REFRESH =
128 // first do own refresh, *then* call the default refresh !
129 if(self.size == '0 0 0')
131 if(self.font_size == '0 0 0')
132 self.font_size = ITEM_TEXT_FONT_SIZE;
134 self.size_x = self.font_size_x * strlen(self.text);
135 self.size_y = self.font_size_y;
136 } else if(self.font_size == '0 0 0')
138 self.font_size_x = self.size_x / strlen(self.text);
139 self.font_size_y = self.size_y;
146 void(void) ITEM_TEXT_DRAW =
150 // align to the rect pos - (pos + size)
152 // now check the alignement
153 if(self.alignment & TEXT_ALIGN_CENTER)
154 alignpos_x = self.pos_x + (self.size_x - strlen(self.text) * self.font_size_x) / 2;
155 else if(self.alignment & TEXT_ALIGN_RIGHT)
156 alignpos_x = self.pos_x + self.size_x - strlen(self.text) * self.font_size_x;
158 alignpos_x = self.pos_x;
159 alignpos_y = self.pos_y;
161 menu_drawstring(alignpos, self.text, self.font_size, self.color, self.alpha, self.drawflag);
166 void(void) ITEM_TEXT =
169 self.flag = FLAG_DRAWONLY;
171 if(self.color == '0 0 0')
172 self.color = ITEM_TEXT_NORMAL_COLOR;
174 self.alpha = ITEM_TEXT_NORMAL_ALPHA;
177 if(self.alignment & TEXT_ALIGN_CENTERPOS)
179 self.pos_x = self.pos_x - self.size_x / 2;
180 } else if(self.alignment & TEXT_ALIGN_LEFTPOS)
182 self.pos_x = self.pos_x - self.size_x;
202 void(void) ITEM_RECTANGLE_DRAW =
204 menu_fillarea(self.pos, self.size, self.color, self.alpha, self.drawflag);
207 void(void) ITEM_RECTANGLE =
210 self.flag = FLAG_DRAWONLY;
229 void(void) ITEM_BUTTON_DRAW =
231 if(self._button_state == BUTTON_NORMAL)
232 menu_drawpic(self.pos, self.picture, self.size, self.color, self.alpha, self.drawflag);
233 else if(self._button_state == BUTTON_SELECTED)
234 menu_drawpic(self.pos, self.picture_selected, self.size, self.color_selected, self.alpha_selected, self.drawflag_selected);
236 menu_drawpic(self.pos, self.picture_pressed, self.size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
241 void(void) ITEM_BUTTON_REFRESH =
244 if((self.hold_pressed + self._press_time < time && self._button_state == BUTTON_PRESSED) || (menu_selected != self && self._button_state == BUTTON_SELECTED))
246 self._button_state = BUTTON_NORMAL;
248 if(menu_selected == self && self._button_state == BUTTON_NORMAL)
250 self._button_state = BUTTON_SELECTED;
251 if(self.sound_selected)
252 snd_play(self.sound_selected);
258 void(float keynr, float ascii) ITEM_BUTTON_KEY =
260 if(ctcall_key(keynr, ascii))
263 if(keynr == K_ENTER || keynr == K_MOUSE1)
267 def_keyevent(keynr, ascii);
270 void(void) ITEM_BUTTON_ACTION =
272 self._press_time = time;
273 self._button_state = BUTTON_PRESSED;
274 if(self.sound_pressed)
275 snd_play(self.sound_pressed);
279 void(void) ITEM_BUTTON_REINIT =
281 self._button_state = BUTTON_NORMAL;
286 void(void) ITEM_BUTTON_DESTROY =
288 gfx_unloadpic(self.picture);
289 gfx_unloadpic(self.picture_selected);
290 gfx_unloadpic(self.picture_pressed);
295 void(void) ITEM_BUTTON =
297 if(self.picture == "" || self.picture_selected == "" || self.picture_pressed == "")
298 // a picture has to have pictures
299 remove(self); // no need to call terminate
301 // load the picture if it isnt loaded already
302 gfx_loadpic(self.picture, MENU_ENFORCELOADING);
303 gfx_loadpic(self.picture_selected, MENU_ENFORCELOADING);
304 gfx_loadpic(self.picture_pressed, MENU_ENFORCELOADING);
306 if(self.sound_selected != "")
307 snd_loadsound(self.sound_selected, SOUND_ENFORCELOADING);
309 self.sound_selected = SOUND_SELECT;
311 if(self.sound_pressed != "")
312 snd_loadsound(self.sound_pressed, SOUND_ENFORCELOADING);
314 self.sound_pressed = SOUND_ACTION;
316 // if flag wasnt set yet, then set it to FLAG_DRAWONLY
318 self.flag = FLAG_AUTOSETCLICK;
320 if(self.color == '0 0 0')
321 self.color = ITEM_PICTURE_NORMAL_COLOR;
323 self.alpha = ITEM_PICTURE_NORMAL_ALPHA;
324 if(self.color_selected == '0 0 0')
325 self.color_selected = ITEM_PICTURE_SELECTED_COLOR;
326 if(self.alpha_selected == 0)
327 self.alpha_selected = ITEM_PICTURE_SELECTED_ALPHA;
328 if(self.color_pressed == '0 0 0')
329 self.color_pressed = ITEM_PICTURE_PRESSED_COLOR;
330 if(self.alpha_pressed == 0)
331 self.alpha_pressed = ITEM_PICTURE_PRESSED_ALPHA;
333 if(self.hold_pressed == 0)
334 self.hold_pressed = ITEM_BUTTON_HOLD_PRESSED;
344 ITEM_BUTTON_REFRESH);
353 void(void) ITEM_TEXTBUTTON_REFRESH =
355 // first do own refresh, *then* call the default refresh !
356 if(self.size == '0 0 0')
358 if(self.font_size == '0 0 0')
359 self.font_size = ITEM_TEXT_FONT_SIZE;
361 self.size_x = self.font_size_x * strlen(self.text);
362 self.size_y = self.font_size_y;
363 } else if(self.font_size == '0 0 0')
365 self.font_size_x = self.size_x / strlen(self.text);
366 self.font_size_y = self.size_y;
369 if((self.hold_pressed + self._press_time < time && self._button_state == BUTTON_PRESSED) || (menu_selected != self && self._button_state == BUTTON_SELECTED))
371 self._button_state = BUTTON_NORMAL;
373 if(menu_selected == self && self._button_state == BUTTON_NORMAL)
375 self._button_state = BUTTON_SELECTED;
376 if(self.sound_selected)
377 snd_play(self.sound_selected);
384 void(void) ITEM_TEXTBUTTON_DRAW =
389 // align to the rect pos - (pos + size)
391 // now check the alignement
392 if(self.alignment & TEXT_ALIGN_CENTER)
393 alignpos_x = self.pos_x + (self.size_x - strlen(self.text) * self.font_size_x) / 2;
394 else if(self.alignment & TEXT_ALIGN_RIGHT)
395 alignpos_x = self.pos_x + self.size_x - strlen(self.text) * self.font_size_x;
397 alignpos_x = self.pos_x;
398 alignpos_y = self.pos_y;
400 if(self.style == TEXTBUTTON_STYLE_OUTLINE && self._button_state != BUTTON_NORMAL)
406 s_x = TEXTBUTTON_OUTLINE_WIDTH;
408 if(self._button_state == BUTTON_PRESSED)
410 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
412 else if(self._button_state == BUTTON_SELECTED)
414 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
417 p_x = self.pos_x + self.size_x - TEXTBUTTON_OUTLINE_WIDTH;
419 s_x = TEXTBUTTON_OUTLINE_WIDTH;
421 if(self._button_state == BUTTON_PRESSED)
423 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
425 else if(self._button_state == BUTTON_SELECTED)
427 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
432 s_y = TEXTBUTTON_OUTLINE_WIDTH;
434 if(self._button_state == BUTTON_PRESSED)
436 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
438 else if(self._button_state == BUTTON_SELECTED)
440 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
444 p_y = self.pos_y + self.size_y - TEXTBUTTON_OUTLINE_WIDTH;
445 s_y = TEXTBUTTON_OUTLINE_WIDTH;
447 if(self._button_state == BUTTON_PRESSED)
449 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
451 else if(self._button_state == BUTTON_SELECTED)
453 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
455 } else if(self.style == TEXTBUTTON_STYLE_BOX)
457 if(self._button_state == BUTTON_PRESSED)
459 menu_fillarea(alignpos, self.size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
461 else if(self._button_state == BUTTON_SELECTED)
463 menu_fillarea(alignpos, self.size, self.color_selected, self.alpha_selected, self.drawflag_selected);
467 if(self._button_state == BUTTON_NORMAL || self.style == TEXTBUTTON_STYLE_BOX || self.style == TEXTBUTTON_STYLE_OUTLINE)
468 menu_drawstring(alignpos, self.text, self.font_size, self.color, self.alpha, self.drawflag);
470 if(self.style == TEXTBUTTON_STYLE_TEXT)
472 if(self._button_state == BUTTON_PRESSED)
474 menu_drawstring(alignpos, self.text, self.font_size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
476 else if(self._button_state == BUTTON_SELECTED)
478 menu_drawstring(alignpos, self.text, self.font_size, self.color_selected, self.alpha_selected, self.drawflag_selected);
485 void(void) ITEM_TEXTBUTTON_ACTION =
487 self._press_time = time;
488 self._button_state = BUTTON_PRESSED;
489 if(self.sound_pressed)
490 snd_play(self.sound_pressed);
495 void(float keynr, float ascii) ITEM_TEXTBUTTON_KEY =
497 if(ctcall_key(keynr, ascii))
500 if(keynr == K_ENTER || keynr == K_MOUSE1)
504 def_keyevent(keynr, ascii);
507 void(void) ITEM_TEXTBUTTON_REINIT =
509 self._button_state = BUTTON_NORMAL;
514 void(void) ITEM_TEXTBUTTON =
517 self.flag = FLAG_AUTOSETCLICK;
519 if(self.color == '0 0 0')
520 self.color = ITEM_TEXT_NORMAL_COLOR;
522 self.alpha = ITEM_TEXT_NORMAL_ALPHA;
523 if(self.color_selected == '0 0 0')
524 self.color_selected = ITEM_TEXT_SELECTED_COLOR;
525 if(self.alpha_selected == 0)
526 self.alpha_selected = ITEM_TEXT_SELECTED_ALPHA;
527 if(self.color_pressed == '0 0 0')
528 self.color_pressed = ITEM_TEXT_PRESSED_COLOR;
529 if(self.alpha_pressed == 0)
530 self.alpha_pressed = ITEM_TEXT_PRESSED_ALPHA;
532 if(self.hold_pressed == 0)
533 self.hold_pressed = ITEM_BUTTON_HOLD_PRESSED;
535 if(self.sound_selected != "")
536 snd_loadsound(self.sound_selected, SOUND_ENFORCELOADING);
538 self.sound_selected = SOUND_SELECT;
540 if(self.sound_pressed != "")
541 snd_loadsound(self.sound_pressed, SOUND_ENFORCELOADING);
543 self.sound_pressed = SOUND_ACTION;
545 ITEM_TEXTBUTTON_REFRESH();
546 if(self.alignment & TEXT_ALIGN_CENTERPOS)
548 self.pos_x = self.pos_x - self.size_x / 2;
549 } else if(self.alignment & TEXT_ALIGN_LEFTPOS)
551 self.pos_x = self.pos_x - self.size_x;
555 ITEM_TEXTBUTTON_REINIT,
558 ITEM_TEXTBUTTON_DRAW,
561 ITEM_TEXTBUTTON_ACTION,
562 ITEM_TEXTBUTTON_REFRESH);
569 void(void) ITEM_SLIDER_DRAW =
575 if(self.picture_bar != "")
577 menu_drawpic(self.pos, self.picture_bar, self.size, self.color, self.alpha, self.drawflag);
581 menu_fillarea(self.pos, self.size, self.color, self.alpha, self.drawflag);
585 slider_pos = self.pos;
586 slider_pos_x = slider_pos_x + self.left_margin + ((self.size_x - self.slider_size_x - self.left_margin - self.right_margin) / (self.max_value - self.min_value)) * (self.value - self.min_value);
587 if(self.picture != "")
589 menu_drawpic(slider_pos, self.picture, self.slider_size, self.color, self.alpha, self.drawflag);
593 menu_fillarea(slider_pos, self.slider_size, self.color + ITEM_SLIDER_BAR_COLOR_DELTA, self.alpha, self.drawflag);
597 void(void) ITEM_SLIDER_UPDATESLIDER =
599 self.value = bound(self.min_value, self.value, self.max_value);
604 void(float keynr, float ascii) ITEM_SLIDER_KEY =
609 if(ctcall_key(keynr, ascii))
612 if(keynr == K_LEFTARROW)
614 self.value = (rint(self.value / self.step) - 1) * self.step;
616 else if(keynr == K_RIGHTARROW)
618 self.value = (rint(self.value / self.step) + 1)* self.step;
620 else if(keynr == K_MOUSE1)
622 if(inrect(menu_cursor, self.pos, self.size))
624 if(menu_cursor_x - self.pos_x <= self.left_margin)
626 self.value = (rint(self.value / self.step) - 1)* self.step;
628 else if(menu_cursor_x - self.pos_x >= self.size_x - self.right_margin)
630 self.value = (rint(self.value / self.step) + 1)* self.step;
634 self.value = self.min_value + ((menu_cursor_x - self.slider_size_x / 2) - self.pos_x - self.left_margin) * ((self.max_value - self.min_value) / (self.size_x - self.slider_size_x - self.left_margin - self.right_margin));
640 def_keyevent(keynr, ascii);
646 snd_play(self.sound_increase);
648 else if(self.value < old)
650 snd_play(self.sound_decrease);
653 ITEM_SLIDER_UPDATESLIDER();
657 void(void) ITEM_SLIDER_DESTROY =
659 if(self.picture != "" && self.picture != ITEM_SLIDER_DEFAULT_SLIDER)
660 gfx_unloadpic(self.picture);
661 if(self.picture_bar != "" && self.picture_bar != ITEM_SLIDER_DEFAULT_BAR)
662 gfx_unloadpic(self.picture);
663 if(self.sound_increase != SOUND_INCREASE)
664 snd_unloadsound(self.sound_decrease);
665 if(self.sound_increase != SOUND_INCREASE)
666 snd_unloadsound(self.sound_increase);
671 void(void) ITEM_SLIDER =
673 if(self.picture != "")
674 self.picture = gfx_loadpic(self.picture, MENU_ENFORCELOADING);
675 if(self.picture == "")
676 self.picture = gfx_loadpic(ITEM_SLIDER_DEFAULT_SLIDER, MENU_ENFORCELOADING);
677 if(self.picture_bar != "")
678 self.picture_bar = gfx_loadpic(self.picture_bar, MENU_ENFORCELOADING);
679 if(self.picture_bar == "")
680 self.picture_bar = gfx_loadpic(ITEM_SLIDER_DEFAULT_BAR, MENU_ENFORCELOADING);
681 if(self.sound_decrease == "")
682 self.sound_decrease = SOUND_DECREASE;
684 snd_loadsound(self.sound_decrease, MENU_ENFORCELOADING);
685 if(self.sound_increase == "")
686 self.sound_increase = SOUND_INCREASE;
688 snd_loadsound(self.sound_increase, MENU_ENFORCELOADING);
690 if(self.color == '0 0 0')
691 self.color = ITEM_SLIDER_COLOR;
693 self.alpha = ITEM_SLIDER_ALPHA;
695 self.step = ITEM_SLIDER_STEP;
696 if(self.slider_size == '0 0 0')
698 /*if(self.picture != "")
699 self.slider_size = gfx_getimagesize(self.picture);
701 self.slider_size = ITEM_SLIDER_SIZE;
703 if(self.left_margin == 0)
704 self.left_margin = ITEM_SLIDER_LEFT_MARGIN;
705 if(self.right_margin == 0)
706 self.right_margin = ITEM_SLIDER_RIGHT_MARGIN;
723 void(void) ITEM_TEXTSWITCH_DRAW =
727 // get the current text
729 self.text = getaltstring(self.value, self.text);
735 void(void) ITEM_TEXTSWITCH_REFRESH =
740 self.text = getaltstring(self.value, self.text);
747 void(float keynr, float ascii) ITEM_TEXTSWITCH_KEY =
752 if(ctcall_key(keynr, ascii))
755 if(keynr == K_LEFTARROW || keynr == K_MOUSE2)
757 self.value = self.value - 1;
759 self.value = getaltstringcount(self.text) - 1;
761 else if(keynr == K_RIGHTARROW || keynr == K_MOUSE1 || keynr == K_ENTER)
763 self.value = self.value + 1;
764 if(self.value > getaltstringcount(self.text) - 1)
768 def_keyevent(keynr, ascii);
773 snd_play(self.sound_increase);
774 else if(self.value < old)
775 snd_play(self.sound_decrease);
777 if(self.switchchange)
781 void(void) ITEM_TEXTSWITCH_DESTROY =
783 if(self.sound_increase != SOUND_INCREASE)
784 snd_unloadsound(self.sound_decrease);
785 if(self.sound_increase != SOUND_INCREASE)
786 snd_unloadsound(self.sound_increase);
789 void(void) ITEM_TEXTSWITCH =
793 if(self.sound_decrease == "")
794 self.sound_decrease = SOUND_DECREASE;
796 snd_loadsound(self.sound_decrease, MENU_ENFORCELOADING);
797 if(self.sound_increase == "")
798 self.sound_increase = SOUND_INCREASE;
800 snd_loadsound(self.sound_increase, MENU_ENFORCELOADING);
803 self.text = getaltstring(self.value, self.text);
809 ITEM_TEXTSWITCH_DESTROY,
811 ITEM_TEXTSWITCH_DRAW,
815 ITEM_TEXTSWITCH_REFRESH);
821 /////////////////////////////////////////////////////////////////////////
822 // The "actual" funtions
824 void(void) ctinit_picture =
829 // draws a text (uses the std. way)
830 void(string text, vector pos, vector size, float alignment, float style, float state) ctdrawtext =
837 // align to the rect pos - (pos + size)
839 // now check the alignement
840 if(alignment & TEXT_ALIGN_CENTER)
841 alignpos_x = pos_x + (size_x - strlen(text) * self.font_size_x) / 2;
842 else if(alignment & TEXT_ALIGN_RIGHT)
843 alignpos_x = pos_x + size_x - strlen(text) * self.font_size_x;
848 if(style == TEXTBUTTON_STYLE_OUTLINE && state != BUTTON_NORMAL)
854 s_x = TEXTBUTTON_OUTLINE_WIDTH;
856 if(state == BUTTON_PRESSED)
858 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
860 else if(state == BUTTON_SELECTED)
862 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
865 p_x = pos_x + size_x - TEXTBUTTON_OUTLINE_WIDTH;
867 s_x = TEXTBUTTON_OUTLINE_WIDTH;
869 if(state == BUTTON_PRESSED)
871 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
873 else if(state == BUTTON_SELECTED)
875 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
880 s_y = TEXTBUTTON_OUTLINE_WIDTH;
882 if(state == BUTTON_PRESSED)
884 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
886 else if(self._button_state == BUTTON_SELECTED)
888 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
892 p_y = pos_y + size_y - TEXTBUTTON_OUTLINE_WIDTH;
893 s_y = TEXTBUTTON_OUTLINE_WIDTH;
895 if(state == BUTTON_PRESSED)
897 menu_fillarea(p, s, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
899 else if(state == BUTTON_SELECTED)
901 menu_fillarea(p, s, self.color_selected, self.alpha_selected, self.drawflag_selected);
903 } else if(style == TEXTBUTTON_STYLE_BOX)
905 if(state == BUTTON_PRESSED)
907 menu_fillarea(alignpos, size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
909 else if(self._button_state == BUTTON_SELECTED)
911 menu_fillarea(alignpos, size, self.color_selected, self.alpha_selected, self.drawflag_selected);
915 if(state == BUTTON_NORMAL || style == TEXTBUTTON_STYLE_BOX || style == TEXTBUTTON_STYLE_OUTLINE)
916 menu_drawstring(alignpos, text, self.font_size, self.color, self.alpha, self.drawflag);
918 if(style == TEXTBUTTON_STYLE_TEXT)
920 if(state == BUTTON_PRESSED)
922 menu_drawstring(alignpos, text, self.font_size, self.color_pressed, self.alpha_pressed, self.drawflag_pressed);
924 else if(state == BUTTON_SELECTED)
926 menu_drawstring(alignpos, text, self.font_size, self.color_selected, self.alpha_selected, self.drawflag_selected);