]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Add sound to press event of some formspecs elements (#10402)
authorPierre-Yves Rollo <dev@pyrollo.com>
Wed, 16 Sep 2020 15:10:17 +0000 (17:10 +0200)
committerSmallJoker <mk939@ymail.com>
Mon, 23 Nov 2020 20:28:25 +0000 (21:28 +0100)
doc/lua_api.txt
src/client/game.cpp
src/gui/StyleSpec.h
src/gui/guiEngine.cpp
src/gui/guiFormSpecMenu.cpp
src/gui/guiFormSpecMenu.h

index ef283f0c136073db33cb9c36f7a2c9ccf50a54b4..27f8716183fa269d433d0a472a19daa29b242e0c 100644 (file)
@@ -2843,11 +2843,14 @@ Some types may inherit styles from parent types.
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
     * padding - rect, adds space between the edges of the button and the content. This value is
                 relative to bgimg_middle.
+    * sound - a sound to be played when clicked.
     * textcolor - color, default white.
 * checkbox
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * sound - a sound to be played when clicked.
 * dropdown
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * sound - a sound to be played when clicked.
 * field, pwdfield, textarea
     * border - set to false to hide the textbox background and border. Default true.
     * font - Sets font type. See button `font` property for more information.
@@ -2874,10 +2877,12 @@ Some types may inherit styles from parent types.
     * fgimg_pressed - image when pressed. Defaults to fgimg when not provided.
         * This is deprecated, use states instead.
     * NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed
+    * sound - a sound to be played when clicked.
 * scrollbar
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
 * tabheader
     * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * sound - a sound to be played when clicked.
     * textcolor - color. Default white.
 * table, textlist
     * font - Sets font type. See button `font` property for more information.
index 5c38e027d37c5681e8cbcf31747e6b87f2794036..b7bb0a330df7e41fddb117d03d4c29977ff8b30d 100644 (file)
@@ -2071,7 +2071,7 @@ void Game::openInventory()
                TextDest *txt_dst = new TextDestPlayerInventory(client);
                auto *&formspec = m_game_ui->updateFormspec("");
                GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src,
-                       txt_dst, client->getFormspecPrepend());
+                       txt_dst, client->getFormspecPrepend(), sound);
 
                formspec->setFormSpec(fs_src->getForm(), inventoryloc);
        }
@@ -2603,7 +2603,7 @@ void Game::handleClientEvent_ShowFormSpec(ClientEvent *event, CameraOrientation
 
                auto *&formspec = m_game_ui->updateFormspec(*(event->show_formspec.formname));
                GUIFormSpecMenu::create(formspec, client, &input->joystick,
-                       fs_src, txt_dst, client->getFormspecPrepend());
+                       fs_src, txt_dst, client->getFormspecPrepend(), sound);
        }
 
        delete event->show_formspec.formspec;
@@ -2616,7 +2616,7 @@ void Game::handleClientEvent_ShowLocalFormSpec(ClientEvent *event, CameraOrienta
        LocalFormspecHandler *txt_dst =
                new LocalFormspecHandler(*event->show_formspec.formname, client);
        GUIFormSpecMenu::create(m_game_ui->getFormspecGUI(), client, &input->joystick,
-                       fs_src, txt_dst, client->getFormspecPrepend());
+                       fs_src, txt_dst, client->getFormspecPrepend(), sound);
 
        delete event->show_formspec.formspec;
        delete event->show_formspec.formname;
@@ -3336,7 +3336,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
 
                auto *&formspec = m_game_ui->updateFormspec("");
                GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src,
-                       txt_dst, client->getFormspecPrepend());
+                       txt_dst, client->getFormspecPrepend(), sound);
 
                formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
                return false;
@@ -4108,7 +4108,7 @@ void Game::showDeathFormspec()
 
        auto *&formspec = m_game_ui->getFormspecGUI();
        GUIFormSpecMenu::create(formspec, client, &input->joystick,
-               fs_src, txt_dst, client->getFormspecPrepend());
+               fs_src, txt_dst, client->getFormspecPrepend(), sound);
        formspec->setFocus("btn_respawn");
 }
 
@@ -4242,7 +4242,7 @@ void Game::showPauseMenu()
 
        auto *&formspec = m_game_ui->getFormspecGUI();
        GUIFormSpecMenu::create(formspec, client, &input->joystick,
-                       fs_src, txt_dst, client->getFormspecPrepend());
+                       fs_src, txt_dst, client->getFormspecPrepend(), sound);
        formspec->setFocus("btn_continue");
        formspec->doPause = true;
 }
index 36ad51a892a4e8ef406f9685c0d066cd092199da..f2844ce2839411cfcdbe3b63d1dce03c579ddcd3 100644 (file)
@@ -54,6 +54,7 @@ class StyleSpec
                COLORS,
                BORDERCOLORS,
                BORDERWIDTHS,
+               SOUND,
                NUM_PROPERTIES,
                NONE
        };
@@ -116,6 +117,8 @@ class StyleSpec
                        return BORDERCOLORS;
                } else if (name == "borderwidths") {
                        return BORDERWIDTHS;
+               } else if (name == "sound") {
+                       return SOUND;
                } else {
                        return NONE;
                }
index 4a13f0b11f570c70fa9ef810b081eea93339268a..c5ad5c3230f5df4e72f4a0a68e167c7e25c4d271 100644 (file)
@@ -170,6 +170,7 @@ GUIEngine::GUIEngine(JoystickController *joystick,
                        m_menumanager,
                        NULL /* &client */,
                        m_texture_source,
+                       m_sound_manager,
                        m_formspecgui,
                        m_buttonhandler,
                        "",
index 039b28e7935110e7244d2d8bacfb5e93b692b882..632b15992ae9052bd3d0b01cf17ffac2251b47fe 100644 (file)
@@ -48,6 +48,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "client/client.h"
 #include "client/fontengine.h"
+#include "client/sound.h"
 #include "util/hex.h"
 #include "util/numeric.h"
 #include "util/string.h" // for parseColorString()
@@ -95,11 +96,13 @@ inline u32 clamp_u8(s32 value)
 
 GUIFormSpecMenu::GUIFormSpecMenu(JoystickController *joystick,
                gui::IGUIElement *parent, s32 id, IMenuManager *menumgr,
-               Client *client, ISimpleTextureSource *tsrc, IFormSource *fsrc, TextDest *tdst,
+               Client *client, ISimpleTextureSource *tsrc, ISoundManager *sound_manager,
+               IFormSource *fsrc, TextDest *tdst,
                const std::string &formspecPrepend, bool remap_dbl_click):
        GUIModalMenu(RenderingEngine::get_gui_env(), parent, id, menumgr, remap_dbl_click),
        m_invmgr(client),
        m_tsrc(tsrc),
+       m_sound_manager(sound_manager),
        m_client(client),
        m_formspec_prepend(formspecPrepend),
        m_form_src(fsrc),
@@ -143,11 +146,12 @@ GUIFormSpecMenu::~GUIFormSpecMenu()
 
 void GUIFormSpecMenu::create(GUIFormSpecMenu *&cur_formspec, Client *client,
        JoystickController *joystick, IFormSource *fs_src, TextDest *txt_dest,
-       const std::string &formspecPrepend)
+       const std::string &formspecPrepend, ISoundManager *sound_manager)
 {
        if (cur_formspec == nullptr) {
                cur_formspec = new GUIFormSpecMenu(joystick, guiroot, -1, &g_menumgr,
-                       client, client->getTextureSource(), fs_src, txt_dest, formspecPrepend);
+                       client, client->getTextureSource(), sound_manager, fs_src,
+                       txt_dest, formspecPrepend);
                cur_formspec->doPause = false;
 
                /*
@@ -614,6 +618,9 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element
                                data->current_parent, spec.fid, spec.flabel.c_str());
 
                auto style = getDefaultStyleForElement("checkbox", name);
+
+               spec.sound = style.get(StyleSpec::Property::SOUND, "");
+
                e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false));
 
                if (spec.fname == m_focused_element) {
@@ -1020,6 +1027,9 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element,
                                data->current_parent, spec.fid, spec.flabel.c_str());
 
                auto style = getStyleForElement(type, name, (type != "button") ? "button" : "");
+
+               spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, "");
+
                e->setStyles(style);
 
                if (spec.fname == m_focused_element) {
@@ -1381,6 +1391,9 @@ void GUIFormSpecMenu::parseDropDown(parserData* data, const std::string &element
                        e->setSelected(stoi(str_initial_selection)-1);
 
                auto style = getDefaultStyleForElement("dropdown", name);
+
+               spec.sound = style.get(StyleSpec::Property::SOUND, "");
+
                e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false));
 
                m_fields.push_back(spec);
@@ -1747,6 +1760,10 @@ void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &elemen
        );
 
        spec.ftype = f_HyperText;
+
+       auto style = getDefaultStyleForElement("hypertext", spec.fname);
+       spec.sound = style.get(StyleSpec::Property::SOUND, "");
+
        GUIHyperText *e = new GUIHyperText(spec.flabel.c_str(), Environment,
                        data->current_parent, spec.fid, rect, m_client, m_tsrc);
        e->drop();
@@ -1999,6 +2016,8 @@ void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &elem
 
                auto style = getStyleForElement("image_button", spec.fname);
 
+               spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, "");
+
                // Override style properties with values specified directly in the element
                if (!image_name.empty())
                        style[StyleSpec::STATE_DEFAULT].set(StyleSpec::FGIMG, image_name);
@@ -2107,6 +2126,9 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data, const std::string &elemen
                e->setTabHeight(geom.Y);
 
                auto style = getDefaultStyleForElement("tabheader", name);
+
+               spec.sound = style.get(StyleSpec::Property::SOUND, "");
+
                e->setNotClipped(style.getBool(StyleSpec::NOCLIP, true));
 
                for (const std::string &button : buttons) {
@@ -2195,6 +2217,9 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string &
                                item_name, m_client);
 
                auto style = getStyleForElement("item_image_button", spec_btn.fname, "image_button");
+
+               spec_btn.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, "");
+
                e_btn->setStyles(style);
 
                if (spec_btn.fname == m_focused_element) {
@@ -4486,6 +4511,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                        for (GUIFormSpecMenu::FieldSpec &s : m_fields) {
                                if ((s.ftype == f_TabHeader) &&
                                                (s.fid == event.GUIEvent.Caller->getID())) {
+                                       if (!s.sound.empty() && m_sound_manager)
+                                               m_sound_manager->playSound(s.sound, false, 1.0f);
                                        s.send = true;
                                        acceptInput();
                                        s.send = false;
@@ -4529,6 +4556,9 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                                        continue;
 
                                if (s.ftype == f_Button || s.ftype == f_CheckBox) {
+                                       if (!s.sound.empty() && m_sound_manager)
+                                               m_sound_manager->playSound(s.sound, false, 1.0f);
+
                                        s.send = true;
                                        if (s.is_exit) {
                                                if (m_allowclose) {
@@ -4551,6 +4581,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                                                        s2.send = false;
                                                }
                                        }
+                                       if (!s.sound.empty() && m_sound_manager)
+                                               m_sound_manager->playSound(s.sound, false, 1.0f);
                                        s.send = true;
                                        acceptInput(quit_mode_no);
 
@@ -4567,6 +4599,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
                                        acceptInput(quit_mode_no);
                                        s.fdefault = L"";
                                } else if (s.ftype == f_Unknown || s.ftype == f_HyperText) {
+                                       if (!s.sound.empty() && m_sound_manager)
+                                               m_sound_manager->playSound(s.sound, false, 1.0f);
                                        s.send = true;
                                        acceptInput();
                                        s.send = false;
index c5d662a69b53e382465cbc64a84f56a8225fa813..53076e3bdbeaa368006e58e43331f2ba4cc07f5c 100644 (file)
@@ -39,6 +39,7 @@ class InventoryManager;
 class ISimpleTextureSource;
 class Client;
 class GUIScrollContainer;
+class ISoundManager;
 
 typedef enum {
        f_Button,
@@ -127,6 +128,7 @@ class GUIFormSpecMenu : public GUIModalMenu
                int priority;
                core::rect<s32> rect;
                gui::ECURSOR_ICON fcursor_icon;
+               std::string sound;
        };
 
        struct TooltipSpec
@@ -151,6 +153,7 @@ class GUIFormSpecMenu : public GUIModalMenu
                        IMenuManager *menumgr,
                        Client *client,
                        ISimpleTextureSource *tsrc,
+                       ISoundManager *sound_manager,
                        IFormSource* fs_src,
                        TextDest* txt_dst,
                        const std::string &formspecPrepend,
@@ -160,7 +163,7 @@ class GUIFormSpecMenu : public GUIModalMenu
 
        static void create(GUIFormSpecMenu *&cur_formspec, Client *client,
                JoystickController *joystick, IFormSource *fs_src, TextDest *txt_dest,
-               const std::string &formspecPrepend);
+               const std::string &formspecPrepend, ISoundManager *sound_manager);
 
        void setFormSpec(const std::string &formspec_string,
                        const InventoryLocation &current_inventory_location)
@@ -293,6 +296,7 @@ class GUIFormSpecMenu : public GUIModalMenu
 
        InventoryManager *m_invmgr;
        ISimpleTextureSource *m_tsrc;
+       ISoundManager *m_sound_manager;
        Client *m_client;
 
        std::string m_formspec_string;