From 2496789ea7632556486560f80590d5ba7f8da0f5 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Tue, 27 Jun 2023 22:17:57 +1000 Subject: [PATCH] Improve button audio feedback --- assets/opensb/interface.config.patch | 8 ++++++- assets/opensb/sfx/interface/button/click.wav | Bin 0 -> 1158 bytes assets/opensb/sfx/interface/button/hover.wav | Bin 0 -> 2982 bytes .../opensb/sfx/interface/button/hover_off.wav | Bin 0 -> 410 bytes .../opensb/sfx/interface/button/release.wav | Bin 0 -> 842 bytes source/windowing/StarButtonWidget.cpp | 21 ++++++++++++++++-- source/windowing/StarButtonWidget.hpp | 5 +++++ 7 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 assets/opensb/sfx/interface/button/click.wav create mode 100644 assets/opensb/sfx/interface/button/hover.wav create mode 100644 assets/opensb/sfx/interface/button/hover_off.wav create mode 100644 assets/opensb/sfx/interface/button/release.wav diff --git a/assets/opensb/interface.config.patch b/assets/opensb/interface.config.patch index 2904d22..d39e16d 100644 --- a/assets/opensb/interface.config.patch +++ b/assets/opensb/interface.config.patch @@ -15,5 +15,11 @@ }, "debugFont" : "", - "planetNameFormatString" : "- {} -" + // Change planet name to support the new internal string formatting. + "planetNameFormatString" : "- {} -", + + "buttonClickSound" : [ "/sfx/interface/button/click.wav" ], + "buttonReleaseSound" : [ "/sfx/interface/button/release.wav" ], + "buttonHoverSound" : [ "/sfx/interface/button/hover.wav" ], + "buttonHoverOffSound" : [ "/sfx/interface/button/hover_off.wav" ] } \ No newline at end of file diff --git a/assets/opensb/sfx/interface/button/click.wav b/assets/opensb/sfx/interface/button/click.wav new file mode 100644 index 0000000000000000000000000000000000000000..ff319a14ac797683ede4504e11793bee7ad1f498 GIT binary patch literal 1158 zcmWNR4NR4F6vm(PzV}`}6a)lBZzf5CCMw^rOJmEP{p*#^7^&rQI)J$LQ*Ddt$b< z?QVGOUPWu84`IE(bo_BOa#VO=^vL*&5wSs;{zFwuS0p?2*k6IVlZF@z z{obc_x8rX-h&&!=v_AH5+gLdFJBD^AU2Jamj|>S+j5;+qQ{@JF``bDk_Ivi3zC@#> zx6*UOGr^ZOEMi!ir>Aocmj|VW)lj%+mHI||OS${Hy`{X>|C-;k`d$fl2R&NqNVBi8 zB?MkJzUw~N_d{O;WkgIIY;cVy#qcvj`v<9g=3#+V+83VYsBg%=a})lh#e=@E*D;mCi~dUZv$|QZYs}-=yQxDgL%3eJU95 z(tZ9r21@yo`KgMBMU4AW&6%=UGS~ys|H03)1&6iK z`g7c679*CInroz%kMU&f87)@xXb&Zqo4Ao{sE#W6FKLnr{*j&_@Oo^gbU7;rWTWa* zNr+euY&#f`-9a>^k=!kK{_eCTO zsv1~k_cy=vKINYBue+nH!|dGawd-2~@&Z2!9vMC>v_3GvzEiopk)DI@MUT$--VxH9 zY=$k{)}yuHNo<$X<}1E1-?v7MEYK_Lg^p$RhuST4>rU*D?6Au&@ zP14)6l{6cn(yhj;c`8f%}P}#LXmC zG5{}GOaXKVE3pVsxGW9UeO{7HvRf|5Zvu=*HdbIYO7JvlC0`avisa`^h>o*9N$T_o jx+TEyxmj6RmJYUZ#;j@S(`RI$Ab(lW>YTj%f?WI$qKPC; literal 0 HcmV?d00001 diff --git a/assets/opensb/sfx/interface/button/hover.wav b/assets/opensb/sfx/interface/button/hover.wav new file mode 100644 index 0000000000000000000000000000000000000000..bdc8e3b9eefa5959cfa2a03c37da548af88eba69 GIT binary patch literal 2982 zcmZWrd0bW17GCSzd%5>A1xjeB2|=kjy-1tPvL`qeCQ4%F7?P%;rdEzQPlcF}nwVzg z2v(+9YN?f_r73Anp{6O6q&cK`x$M2x`{ez8@1J+~@7&)$=j?sfTHpHCw|08x4jq<< z5%qfFnbho;#>7Vv5o4qj6V1tFawv+j296on1#ABQ$0X{I;^!ixZnAo7uf@#Z$$y_$ ztLJ}rR;%=c9@nE-;i7$*UDj`Pgf7radR{l`@7hIINU^Mx0x6YHy{UdWBT2eed&>`Y zh0K+Dwxc0C)8^P-vR^jY!L~@|>qf~mn}gGX?Sds$zXl`iKG~{C^eUC{`|h_wc7!B` zWP2LB&pI8Pg^u5K&iRBRX^_k|yMq*rtWLGznnL?|kn2tNUiWU7*QrZ&B-RWGHmI5y zm=>rE6jzl8kDDA7zT|4>`Nz{cq?I?#*V2E)PoZo5UVn}++&9fTD&*gu3$8ZKG}l(Cwv|0<)|q$BK9ggYijT(f87I#Dgr{#vA8!-i2fl^Ac;5(bW=I3i71wnq z(HY3g=(Ikphvgl~lrY(DN7;vL0~>=c^|i}woCGDFrgD<&KF?@xp?_r9q41&zi3o{Y z7I8X!PuSg|BYfY5+~+yxDsvh-YxybulkzE@`p_sEM+2xa9oOmlpl*6c?sw7vmC*@Xg-am zXXpW{L$^^&%AwCF3~!40GS_pGot92p=OL$y^Nf?_40O6XO`RM3B@k@FC0N^(uIn|u zs<+c)$jv6YT!Zr>-ouX5%E@qsJFhw8oFPtg=O^yL6||IwQ46Zn@3dIw=>#3A({vlk z^AQ@3ci&NfA~=SbFVb;ZLu2V7N`P09sQw^Uc_|!4W$jCb%cF2^{;pK>9x^8%-GA~^Xc7<82O zA*cED0&?u7a^O{@@8}%FwOP-ok6KednoT=ktpwM3I!Ol*=Tv0mY3hVM4^RWDOEEzA z9?X*{f-3Nh)j+csG$KI_82Gc4$Zq*kzK{*FLYBxJSuF3#8gO);%#g`48j3keQl+gV zN*#%m5UC|`sE5W9FU=(bRW? z|4MSPo15}h9?wgu2l!h;^Er-hf>DXG$y6AZRLN%GeoVH>Rhgur6o+`cKsb*-cS>Co z-Ss{Bo;N+|xGs4PdS-gEJpDWaJk31Teabz|y~XvUtD&o|>n~@F^A~@>Gg0T~`4^tg z-*6Mh>&!;}OX)EDxk}qn>$muKQ2Xlb`aAkTw2sk*@V^51-c3&e$3|2FE*zFUz`@u8 z+s7u`QfR80PIikuX}8)R?e{j@M%(k|l(}xo&2Q$AIb(dbo{h8j*xq(A6v%BqG>gr* z=73pa7MYD^7b3Ohnkg|;O}go2=9%TD!1OkK%p6l{n%WN7*V}frX|NcuZKau%+Fbjz zz1!BZ#+)mXlVor+G`n{sI<{Y?$IEA+BEDsdt7_IvH9%jAZA-KN?E+t~KB zAKBZaJ(Mz6_KHefsLv?ff@l*cgI1wBvUx2Z1siwr+dK(ue2z0Xh3|uE)aL7`xUcEM z8r^vmxNX;&sIz-jR z?WOl=I=w~{puek7gN2x-)BThP&PI_Br+`yXm}NQ_jGv%0bP1|^8x-LeXviOW1YLhK zp5V*m^ zL)DLgVzkg$^=q8A(;S_zpX*`h)lKM86qKnUG&YV}(X%uO^|+copd~b!`cpe<27V+% zL%YEDZuAuRl7g!{YW6j#&Pv)?qX(r>nH}^do<4#d_318Zj~!1@S9%VsK80V!G#I{| zfWCeUb-b!~pfcv-=_(ot9#(2Ol&m>o%SCjBG!K>45B7RN+j>APPh;OXjlq09bY}oB zg|2*sj`=w6rZ?YMyRvVG?5lST?-It zHt?HIyP;)OP|AbAbR}}smpa2vHz<5OEJs6kEA>x3s{!=R$0!rK#=yS~(5@5E+?Bu~ z3z2rF$5BnU&H_Vd3UV<6|M~Ft8*u6d#Xm}_i+$KB)$=YZ$+Y$hQf!TS@*{`#&NoH%KfgIQ+0!$nVFfG)y9>Y W*1lUxYB~)cI%srGR`$^0gXuq-S~o!e literal 0 HcmV?d00001 diff --git a/assets/opensb/sfx/interface/button/hover_off.wav b/assets/opensb/sfx/interface/button/hover_off.wav new file mode 100644 index 0000000000000000000000000000000000000000..1681a8efb43993dd4648d7291e588a841ca7a130 GIT binary patch literal 410 zcmW+yODKe46g_u_JQhPKk2FllE3ugH0l-MySk1VVdl00IiJQilb zLLpL`D1FEG&pn;az31MuxeXq-dscwv>Lyor@1QLafM__kfN8J5ghcq- z2iqO`W{3~W#|&=qhAlX7$tHfOO*OAJR9MAvl*w4syA&yuPFa={xt0T&lc2OofxKb? zrMTxXOZcr$)w)_yXDXAcEI}A`5|R%|FeRA2N|9uVMV_&TAX-q2bo}v^cf4YlN8D$Kdm4v4*4`(rsKq!=buvfFq*BTy zTjJ#ryO=;Ls!)gwq``t%#AwDN8fN_Rhwpsi4NYK#iqM@=iUOrQLk$>v#i+<^+!zV{ qQeA$Z-Ik}---z9HKM0BEwP7ogFPAixFHl?|1X0-zT=xSV`2qMGSVk%GtRC%z>5(cpr6 z1-CZSqx0o#kD3eJ86Ub9U76^&YMgt(@^fgd{A}T_>{WJF`z{X-d!zrR>`VD5EqTtz zb~ohB3dU-}ZM4E_g;FCY-Wqu}(j8qrT{dfPR>-*^_SDq+#ILsZTr)*S1(*FF=D`H3A%G6K#f+CLqR_sjCc zcZovzyZlCVXoqdbEU#N8uv(7FKX?^>g=6ART4Mxx8~4aJ=pU+3J}T5N>q!uV!?2w) zc@)MuRpnD$#I+`T3E#qnIEIrr$hYNLRZLyRQsa{BRySxXvX-x>i)+x05<+|z$F(Ck zAUDWGd`50cbf^a0Ail@X;RyIJ$UX3w*pE}dJV9-0F~#{jJNYEn!++exK4`;fY{4h7 z6IMV4oa3dGrVgqn_$Ie;8CURcoCTx2mA^G}PC!WQp&ja!;iVbzvi`S7w>+JkH~Vf% zft}^N$=(~af87}`yOklwQfo4Ix~m>=XQaC>B)xC9Vr63cj6LGIGcVkEyE05u?eSr8 z+76CDQeSFm8auB$f|g-E7he#)5}Amck8Vt?rk&WNHS4XqTTj;l__o>b2YOW=OOz)z z8*}Lpy7f;jbFBH6dd-0ilq(&^MdPNrkH6*-Xh#puhsU{#4iZ47Sf*VSBRB+u{0Vg_ zP;1l)s)F74kSG>k;4-*IK3YxzQuHNzLBj+13O2)!oXZb$BRk<;2*HE+2wsP0poIk= zq6*qgOW+Le;Q+tDCHxK#F>$fE`v80Z>me7iP2LYN9_FLm!mWJVT(g(^xUM=Ud$IWj lZ&8l<4-;7%{eHjcX{J2Ih0hgvN?=P})wb8FYwNbu!2j#4k{tj5 literal 0 HcmV?d00001 diff --git a/source/windowing/StarButtonWidget.cpp b/source/windowing/StarButtonWidget.cpp index 0c323aa..c052599 100644 --- a/source/windowing/StarButtonWidget.cpp +++ b/source/windowing/StarButtonWidget.cpp @@ -27,6 +27,11 @@ ButtonWidget::ButtonWidget() { m_fontSize = interfaceConfig.query("font.buttonSize").toInt(); m_fontDirectives = interfaceConfig.queryString("font.defaultDirectives", ""); m_font = interfaceConfig.query("font.defaultFont").toString(); + + m_clickSounds = jsonToStringList(assets->json("/interface.config:buttonClickSound")); + m_releaseSounds = jsonToStringList(assets->json("/interface.config:buttonReleaseSound")); + m_hoverSounds = jsonToStringList(assets->json("/interface.config:buttonHoverSound")); + m_hoverOffSounds = jsonToStringList(assets->json("/interface.config:buttonHoverOffSound")); } ButtonWidget::ButtonWidget(WidgetCallbackFunc callback, @@ -112,7 +117,7 @@ bool ButtonWidget::sendEvent(InputEvent const& event) { if (inMember(*context()->mousePosition(event))) { if (!isPressed()) { auto assets = Root::singleton().assets(); - auto sound = Random::randValueFrom(assets->json("/interface.config:buttonClickSound").toArray(), "").toString(); + auto sound = Random::randValueFrom(m_clickSounds, ""); if (!sound.empty()) context()->playAudio(sound); } @@ -126,6 +131,12 @@ bool ButtonWidget::sendEvent(InputEvent const& event) { return false; } } else if (event.is()) { + if (isPressed()) { + auto assets = Root::singleton().assets(); + auto sound = Random::randValueFrom(m_releaseSounds, ""); + if (!sound.empty()) + context()->playAudio(sound); + } setPressed(false); return false; } @@ -139,7 +150,7 @@ void ButtonWidget::mouseOver() { if (!m_disabled) { if (!m_hovered) { auto assets = Root::singleton().assets(); - auto sound = Random::randValueFrom(assets->json("/interface.config:buttonHoverSound").toArray(), "").toString(); + auto sound = Random::randValueFrom(m_hoverSounds); if (!sound.empty()) context()->playAudio(sound); } @@ -149,6 +160,12 @@ void ButtonWidget::mouseOver() { void ButtonWidget::mouseOut() { Widget::mouseOut(); + if (!m_disabled && m_hovered) { + auto assets = Root::singleton().assets(); + auto sound = Random::randValueFrom(m_hoverOffSounds); + if (!sound.empty()) + context()->playAudio(sound); + } m_hovered = false; m_pressed = false; } diff --git a/source/windowing/StarButtonWidget.hpp b/source/windowing/StarButtonWidget.hpp index e39c90e..d89f03c 100644 --- a/source/windowing/StarButtonWidget.hpp +++ b/source/windowing/StarButtonWidget.hpp @@ -127,6 +127,11 @@ protected: String m_text; Vec2I m_textOffset; + StringList m_clickSounds; + StringList m_releaseSounds; + StringList m_hoverSounds; + StringList m_hoverOffSounds; + bool m_sustain; private: