Skip to content

Commit

Permalink
Add sound to press event of some formspecs elements (#10402)
Browse files Browse the repository at this point in the history
  • Loading branch information
pyrollo authored and SmallJoker committed Nov 23, 2020
1 parent 43bc3a1 commit 7827302
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 10 deletions.
5 changes: 5 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -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.
Expand All @@ -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.
Expand Down
12 changes: 6 additions & 6 deletions src/client/game.cpp
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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");
}

Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions src/gui/StyleSpec.h
Expand Up @@ -54,6 +54,7 @@ class StyleSpec
COLORS,
BORDERCOLORS,
BORDERWIDTHS,
SOUND,
NUM_PROPERTIES,
NONE
};
Expand Down Expand Up @@ -116,6 +117,8 @@ class StyleSpec
return BORDERCOLORS;
} else if (name == "borderwidths") {
return BORDERWIDTHS;
} else if (name == "sound") {
return SOUND;
} else {
return NONE;
}
Expand Down
1 change: 1 addition & 0 deletions src/gui/guiEngine.cpp
Expand Up @@ -170,6 +170,7 @@ GUIEngine::GUIEngine(JoystickController *joystick,
m_menumanager,
NULL /* &client */,
m_texture_source,
m_sound_manager,
m_formspecgui,
m_buttonhandler,
"",
Expand Down
40 changes: 37 additions & 3 deletions src/gui/guiFormSpecMenu.cpp
Expand Up @@ -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()
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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;

/*
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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);

Expand All @@ -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;
Expand Down
6 changes: 5 additions & 1 deletion src/gui/guiFormSpecMenu.h
Expand Up @@ -39,6 +39,7 @@ class InventoryManager;
class ISimpleTextureSource;
class Client;
class GUIScrollContainer;
class ISoundManager;

typedef enum {
f_Button,
Expand Down Expand Up @@ -127,6 +128,7 @@ class GUIFormSpecMenu : public GUIModalMenu
int priority;
core::rect<s32> rect;
gui::ECURSOR_ICON fcursor_icon;
std::string sound;
};

struct TooltipSpec
Expand All @@ -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,
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 7827302

Please sign in to comment.