#include "item/modalcontroller.c"
#include "item/image.c"
#include "item/label.c"
+#include "item/dialog.c"
#include "item/button.c"
#include "item/checkbox.c"
#include "item/radiobutton.c"
#include "item/borderimage.c"
#include "item/slider.c"
-#include "item/dialog.c"
#include "item/tab.c"
#include "item/textslider.c"
#include "item/listbox.c"
}
}
else if(argc == 2 && !isdemo()) // don't allow this command in demos
+ {
+ m_play_click_sound(MENU_SOUND_OPEN);
m_goto(strcat(filter, argv(1))); // switch to a menu item
+ }
if(filter)
strunzone(filter);
return;
METHOD(Item, destroy, void(entity))
ATTRIB(Item, focused, float, 0)
ATTRIB(Item, focusable, float, 0)
+ ATTRIB(Item, allowFocusSound, float, 0)
ATTRIB(Item, parent, entity, NULL)
ATTRIB(Item, preferredFocusPriority, float, 0)
ATTRIB(Item, origin, vector, '0 0 0')
void Item_focusEnter(entity me)
{
+ if(me.allowFocusSound)
+ m_play_focus_sound();
}
void Item_focusLeave(entity me)
METHOD(Button, mousePress, float(entity, vector))
METHOD(Button, mouseDrag, float(entity, vector))
METHOD(Button, mouseRelease, float(entity, vector))
- METHOD(Button, focusEnter, void(entity))
+ METHOD(Button, playClickSound, void(entity))
ATTRIB(Button, onClick, void(entity, entity), func_null)
ATTRIB(Button, onClickEntity, entity, NULL)
ATTRIB(Button, src, string, string_null)
ATTRIB(Button, srcMulti, float, 1) // 0: button square left, text right; 1: button stretched, text over it
ATTRIB(Button, buttonLeftOfText, float, 0)
ATTRIB(Button, focusable, float, 1)
+ ATTRIB(Button, allowFocusSound, float, 1)
ATTRIB(Button, pressed, float, 0)
ATTRIB(Button, clickTime, float, 0)
ATTRIB(Button, disabled, float, 0)
{
if(key == K_ENTER || key == K_SPACE || key == K_KP_ENTER)
{
+ me.playClickSound(me);
me.clickTime = 0.1; // delayed for effect
return 1;
}
{
if (!me.disabled)
{
- if(cvar("menu_sounds"))
- localsound("sound/misc/menu2.wav");
+ me.playClickSound(me);
if(me.onClick)
me.onClick(me, me.onClickEntity);
}
{
me.focusable = !me.disabled;
}
-void Button_focusEnter(entity me)
-{
- if(cvar("menu_sounds") > 1)
- localsound("sound/misc/menu1.wav");
- SUPER(Button).focusEnter(me);
-}
void Button_draw(entity me)
{
vector bOrigin, bSize;
SUPER(Button).draw(me);
}
+void Button_playClickSound(entity me)
+{
+ if(me.onClick == DialogOpenButton_Click)
+ m_play_click_sound(MENU_SOUND_OPEN);
+ else if(me.onClick == Dialog_Close)
+ m_play_click_sound(MENU_SOUND_CLOSE);
+ else
+ m_play_click_sound(MENU_SOUND_EXECUTE);
+}
#endif
CLASS(CheckBox) EXTENDS(Button)
METHOD(CheckBox, configureCheckBox, void(entity, string, float, string))
METHOD(CheckBox, draw, void(entity))
+ METHOD(CheckBox, playClickSound, void(entity))
METHOD(CheckBox, toString, string(entity))
METHOD(CheckBox, setChecked, void(entity, float))
ATTRIB(CheckBox, useDownAsChecked, float, 0)
me.pressed = s;
SUPER(CheckBox).draw(me);
}
+void CheckBox_playClickSound(entity me)
+{
+ m_play_click_sound(MENU_SOUND_SELECT);
+}
#endif
{
if(key == K_ESCAPE)
{
+ m_play_click_sound(MENU_SOUND_CLOSE);
me.close(me);
return 1;
}
ATTRIB(InputBox, scrollPos, float, 0) // widths
ATTRIB(InputBox, focusable, float, 1)
+ ATTRIB(InputBox, allowFocusSound, float, 1)
ATTRIB(InputBox, disabled, float, 0)
ATTRIB(InputBox, lastChangeTime, float, 0)
ATTRIB(InputBox, dragScrollTimer, float, 0)
ATTRIB(InputBox, cb_colorF, vector, '1 1 1')
ATTRIB(InputBox, cb_colorC, vector, '1 1 1')
ENDCLASS(InputBox)
-void InputBox_Clear_Click(entity btn, entity me);
#endif
#ifdef IMPLEMENTATION
SUPER(InputBox).setText(me, strzone(txt));
}
-void InputBox_Clear_Click(entity btn, entity me)
-{
- me.setText(me, "");
-}
-
float over_ClearButton(entity me, vector pos)
{
if (pos_x >= 1 + me.cb_offset - me.cb_width)
if(me.cb_pressed)
if (over_ClearButton(me, pos))
{
+ m_play_click_sound(MENU_SOUND_CLEAR);
+ me.setText(me, "");
me.cb_pressed = 0;
- InputBox_Clear_Click(world, me);
return 1;
}
float r = InputBox_mouseDrag(me, pos);
case K_KP_DEL:
case K_DEL:
if(shift & S_CTRL)
+ {
+ m_play_click_sound(MENU_SOUND_CLEAR);
me.setText(me, "");
+ }
else
me.setText(me, strcat(substring(me.text, 0, me.cursorPos), substring(me.text, me.cursorPos + 1, strlen(me.text) - me.cursorPos - 1)));
return 1;
METHOD(ListBox, mouseRelease, float(entity, vector))
METHOD(ListBox, focusLeave, void(entity))
ATTRIB(ListBox, focusable, float, 1)
+ ATTRIB(ListBox, allowFocusSound, float, 1)
ATTRIB(ListBox, selectedItem, float, 0)
ATTRIB(ListBox, size, vector, '0 0 0')
ATTRIB(ListBox, origin, vector, '0 0 0')
Nexposee_mouseMove(me, pos);
if(me.mouseFocusedChild)
{
+ m_play_click_sound(MENU_SOUND_OPEN);
me.animationState = 1;
SUPER(Nexposee).setFocus(me, NULL);
}
{
if (!(SUPER(Nexposee).mousePress(me, pos)))
{
+ m_play_click_sound(MENU_SOUND_CLOSE);
me.animationState = 3;
SUPER(Nexposee).setFocus(me, NULL);
}
default:
case 0:
case 3:
+ m_play_click_sound(MENU_SOUND_OPEN);
me.animationState = 1;
break;
case 1:
case 2:
+ m_play_click_sound(MENU_SOUND_CLOSE);
me.animationState = 3;
break;
}
METHOD(Slider, configureSliderValues, void(entity, float, float, float, float, float, float))
METHOD(Slider, draw, void(entity))
METHOD(Slider, keyDown, float(entity, float, float, float))
+ METHOD(Slider, keyUp, float(entity, float, float, float))
METHOD(Slider, mousePress, float(entity, vector))
METHOD(Slider, mouseDrag, float(entity, vector))
METHOD(Slider, mouseRelease, float(entity, vector))
- METHOD(Slider, focusEnter, void(entity))
METHOD(Slider, valueToText, string(entity, float))
METHOD(Slider, toString, string(entity))
METHOD(Slider, setValue, void(entity, float))
METHOD(Slider, showNotify, void(entity))
ATTRIB(Slider, src, string, string_null)
ATTRIB(Slider, focusable, float, 1)
+ ATTRIB(Slider, allowFocusSound, float, 1)
ATTRIB(Slider, value, float, 0)
ATTRIB(Slider, animated, float, 1)
ATTRIB(Slider, sliderValue, float, 0)
me.setValue(me, me.valueMax);
return 1;
}
- // TODO more keys
+ // TODO more keys (NOTE also add them to Slider_keyUp)
+ return 0;
+}
+float Slider_keyUp(entity me, float key, float ascii, float shift)
+{
+ if(me.disabled)
+ return 0;
+ switch(key)
+ {
+ case K_LEFTARROW:
+ case K_KP_LEFTARROW:
+ case K_RIGHTARROW:
+ case K_KP_RIGHTARROW:
+ case K_PGUP:
+ case K_KP_PGUP:
+ case K_PGDN:
+ case K_KP_PGDN:
+ case K_HOME:
+ case K_KP_HOME:
+ case K_END:
+ case K_KP_END:
+ m_play_click_sound(MENU_SOUND_SLIDE);
+ }
return 0;
}
float Slider_mouseDrag(entity me, vector pos)
me.pressed = 0;
if(me.disabled)
return 0;
- if(cvar("menu_sounds"))
- localsound("sound/misc/menu2.wav");
+ m_play_click_sound(MENU_SOUND_SLIDE);
return 1;
}
void Slider_showNotify(entity me)
{
me.focusable = !me.disabled;
}
-void Slider_focusEnter(entity me)
-{
- if(cvar("menu_sounds") > 1)
- localsound("sound/misc/menu1.wav");
- SUPER(Slider).focusEnter(me);
-}
void Slider_draw(entity me)
{
float controlLeft;
}
}
}
+
+float menuLastFocusSoundTime;
+void m_play_focus_sound()
+{
+ if(cvar("menu_sounds") > 1)
+ if(time - menuLastFocusSoundTime > 0.25)
+ {
+ localsound(MENU_SOUND_FOCUS);
+ menuLastFocusSoundTime = time;
+ }
+}
+
+void m_play_click_sound(string soundfile)
+{
+ if(cvar("menu_sounds"))
+ localsound(soundfile);
+}
void postMenuDraw(); // this is run just after the menu is drawn (or not). Useful to draw something over everything else.
void m_sync();
+
+// sounds
+
+const string MENU_SOUND_CLEAR = "sound/menu/clear.wav";
+const string MENU_SOUND_CLOSE = "sound/menu/close.wav";
+const string MENU_SOUND_EXECUTE = "sound/menu/execute.wav";
+const string MENU_SOUND_FOCUS = "sound/menu/focus.wav";
+const string MENU_SOUND_OPEN = "sound/menu/open.wav";
+const string MENU_SOUND_SELECT = "sound/menu/select.wav";
+const string MENU_SOUND_SLIDE = "sound/menu/slide.wav";
+const string MENU_SOUND_WINNER = "sound/menu/winner.wav";
+
+void m_play_focus_sound();
+void m_play_click_sound(string soundfile);
float XonoticColorpicker_mouseRelease(entity me, vector coords)
{
+ m_play_click_sound(MENU_SOUND_SLIDE);
me.mouseDrag(me, coords);
return 1;
}
float XonoticColorpickerString_mouseRelease(entity me, vector coords)
{
+ m_play_click_sound(MENU_SOUND_SLIDE);
me.mouseDrag(me, coords);
return 1;
}
ATTRIB(XonoticAudioSettingsTab, intendedWidth, float, 0.9)
ATTRIB(XonoticAudioSettingsTab, rows, float, 15.5)
ATTRIB(XonoticAudioSettingsTab, columns, float, 6.2) // added extra .2 for center space
+ ATTRIB(XonoticAudioSettingsTab, hiddenMenuSoundsSlider, entity, NULL)
ENDCLASS(XonoticAudioSettingsTab)
entity makeXonoticAudioSettingsTab();
#endif
me.TR(me);
me.TD(me, 1, 3, makeXonoticCheckBox(0, "con_chatsound", _("Chat message sound")));
me.TR(me);
- me.TD(me, 1, 3, makeXonoticCheckBoxEx(2, 0, "menu_sounds", _("Menu sounds")));
+ me.hiddenMenuSoundsSlider = makeXonoticSlider(1, 1, 1, "menu_sounds");
+ me.TD(me, 1, 1.2, makeXonoticSliderCheckBox(0, 1, me.hiddenMenuSoundsSlider, _("Menu sounds")));
+ me.TD(me, 1, 1.8, e = makeXonoticSliderCheckBox(2, 0, me.hiddenMenuSoundsSlider, _("Focus sounds")));
+ setDependent(e, "menu_sounds", 1, 2);
me.TR(me);
me.TR(me);
me.TD(me, 1, 1, makeXonoticTextLabel(0, _("Time announcer:")));
#ifdef INTERFACE
CLASS(XonoticWinnerDialog) EXTENDS(XonoticDialog)
METHOD(XonoticWinnerDialog, fill, void(entity))
+ METHOD(XonoticWinnerDialog, focusEnter, void(entity))
ATTRIB(XonoticWinnerDialog, title, string, _("Winner"))
ATTRIB(XonoticWinnerDialog, color, vector, SKINCOLOR_DIALOG_SINGLEPLAYER)
ATTRIB(XonoticWinnerDialog, intendedWidth, float, 0.32)
e.onClick = Dialog_Close;
e.onClickEntity = me;
}
+void XonoticWinnerDialog_focusEnter(entity me)
+{
+ m_play_click_sound(MENU_SOUND_WINNER);
+}
#endif
METHOD(XonoticGametypeList, loadCvars, void(entity))
METHOD(XonoticGametypeList, saveCvars, void(entity))
METHOD(XonoticGametypeList, keyDown, float(entity, float, float, float))
+ METHOD(XonoticGametypeList, clickListBoxItem, void(entity, float, vector))
ATTRIB(XonoticGametypeList, realFontSize, vector, '0 0 0')
ATTRIB(XonoticGametypeList, realUpperMargin, float, 0)
SUPER(XonoticGametypeList).setSelected(me, i);
me.saveCvars(me);
}
-
void XonoticGametypeList_loadCvars(entity me)
{
float t;
me.columnNameOrigin = me.columnIconOrigin + me.columnIconSize + (0.5 * me.realFontSize_x);
me.columnNameSize = 1 - me.columnIconSize - (1.5 * me.realFontSize_x);
}
-
float XonoticGametypeList_keyDown(entity me, float scan, float ascii, float shift)
{
if(scan == K_ENTER || scan == K_KP_ENTER)
{
+ m_play_click_sound(MENU_SOUND_EXECUTE);
me.parent.gameTypeSelectNotify(me.parent);
return 1;
}
return SUPER(XonoticGametypeList).keyDown(me, scan, ascii, shift);
}
+void XonoticGametypeList_clickListBoxItem(entity me, float i, vector where)
+{
+ m_play_click_sound(MENU_SOUND_SELECT);
+}
#endif
localcmd("\nbind \"", keynumtostring(k), "\" \"", KEY_NOT_BOUND_CMD, "\"\n");
}
}
+ m_play_click_sound(MENU_SOUND_SELECT);
localcmd("\nbind \"", keynumtostring(key), "\" \"", func, "\"\n");
localcmd("-zoom\n"); // to make sure we aren't in togglezoom'd state
cvar_set("_hud_showbinds_reload", "1");
//localcmd("\nunbind \"", keynumtostring(k), "\"\n");
localcmd("\nbind \"", keynumtostring(k), "\" \"", KEY_NOT_BOUND_CMD, "\"\n");
}
+ m_play_click_sound(MENU_SOUND_CLEAR);
localcmd("-zoom\n"); // to make sure we aren't in togglezoom'd state
cvar_set("_hud_showbinds_reload", "1");
}
void XonoticLanguageList_doubleClickListBoxItem(entity me, float i, vector where)
{
+ m_play_click_sound(MENU_SOUND_EXECUTE);
me.setLanguage(me);
}
float XonoticLanguageList_keyDown(entity me, float scan, float ascii, float shift)
{
- if(scan == K_ENTER || scan == K_KP_ENTER) {
+ if(scan == K_ENTER || scan == K_KP_ENTER)
+ {
+ m_play_click_sound(MENU_SOUND_EXECUTE);
me.setLanguage(me);
return 1;
}
{
if(where_x <= me.columnPreviewOrigin + me.columnPreviewSize)
if(where_x >= 0)
+ {
+ m_play_click_sound(MENU_SOUND_SELECT);
me.g_maplistCacheToggle(me, i);
+ }
}
void XonoticMapList_doubleClickListBoxItem(entity me, float i, vector where)
if(where_x <= 1)
{
// pop up map info screen
+ m_play_click_sound(MENU_SOUND_OPEN);
main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, i, me);
DialogOpenButton_Click_withCoords(NULL, main.mapInfoDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * i - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize));
}
if(scan == K_MOUSE2 || scan == K_SPACE || scan == K_ENTER || scan == K_KP_ENTER)
{
// pop up map info screen
+ m_play_click_sound(MENU_SOUND_OPEN);
main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, me.selectedItem, me);
DialogOpenButton_Click_withCoords(NULL, main.mapInfoDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * me.selectedItem - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize));
}
else if(scan == K_MOUSE3 || scan == K_INS || scan == K_KP_INS)
{
+ m_play_click_sound(MENU_SOUND_SELECT);
me.g_maplistCacheToggle(me, me.selectedItem);
}
else if(ascii == 43) // +
{
if (!me.g_maplistCacheQuery(me, me.selectedItem))
+ {
+ m_play_click_sound(MENU_SOUND_SELECT);
me.g_maplistCacheToggle(me, me.selectedItem);
+ }
}
else if(ascii == 45) // -
{
if(me.g_maplistCacheQuery(me, me.selectedItem))
+ {
+ m_play_click_sound(MENU_SOUND_SELECT);
me.g_maplistCacheToggle(me, me.selectedItem);
+ }
}
else if(scan == K_BACKSPACE)
{
ATTRIB(XonoticPlayerList, rowsPerItem, float, 1)
METHOD(XonoticPlayerList, resizeNotify, void(entity, vector, vector, vector, vector))
METHOD(XonoticPlayerList, drawListBoxItem, void(entity, float, vector, float))
+ ATTRIB(XonoticPlayerList, allowFocusSound, float, 0)
ATTRIB(XonoticPlayerList, realFontSize, vector, '0 0 0')
ATTRIB(XonoticPlayerList, columnNameOrigin, float, 0)
ATTRIB(XonoticPlayerList, columnNameSize, float, 0)
}
void XonoticServerList_focusEnter(entity me)
{
+ SUPER(XonoticServerList).focusEnter(me);
if(time < me.nextRefreshTime)
{
//print("sorry, no refresh yet\n");
ipstr = netaddress_resolve(me.ipAddressBox.text, 26000);
if(ipstr != "")
{
+ m_play_click_sound(MENU_SOUND_SELECT);
me.toggleFavorite(me, me.ipAddressBox.text);
me.ipAddressBoxFocused = -1;
}
{
if(me.nItems != 0)
{
+ m_play_click_sound(MENU_SOUND_OPEN);
main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
return 1;
void XonoticSkinList_doubleClickListBoxItem(entity me, float i, vector where)
{
+ m_play_click_sound(MENU_SOUND_EXECUTE);
me.setSkin(me);
}
float XonoticSkinList_keyDown(entity me, float scan, float ascii, float shift)
{
- if(scan == K_ENTER || scan == K_KP_ENTER) {
+ if(scan == K_ENTER || scan == K_KP_ENTER)
+ {
+ m_play_click_sound(MENU_SOUND_EXECUTE);
me.setSkin(me);
return 1;
}
--- /dev/null
+SOUND PLAYED WHEN
+
+open opening dialog
+close closing dialog
+focus moving focus to new item
+execute pressing button, enter key, or double click
+select using checkbox, radiobutton, or similar
+slide using slider or colorpicker
+clear clearing inputbox or keybind
+winner winning single player campaign