} else if (wasKeyDown(KeyType::NOCLIP)) {
toggleNoClip();
} else if (wasKeyDown(KeyType::MUTE)) {
- float volume = g_settings->getFloat("sound_volume");
- if (volume < 0.001f) {
- g_settings->setFloat("sound_volume", 1.0f);
- showStatusTextSimple("Volume changed to 100%");
- } else {
- g_settings->setFloat("sound_volume", 0.0f);
- showStatusTextSimple("Volume changed to 0%");
- }
+ bool new_mute_sound = !g_settings->getBool("mute_sound");
+ g_settings->setBool("mute_sound", new_mute_sound);
+ if (new_mute_sound)
+ showStatusTextSimple("Sound muted");
+ else
+ showStatusTextSimple("Sound unmuted");
runData.statustext_time = 0;
} else if (wasKeyDown(KeyType::INC_VOLUME)) {
float new_volume = rangelim(g_settings->getFloat("sound_volume") + 0.1f, 0.0f, 1.0f);
camera->getDirection(),
camera->getCameraNode()->getUpVector());
- // Check if volume is in the proper range, else fix it.
- float old_volume = g_settings->getFloat("sound_volume");
- float new_volume = rangelim(old_volume, 0.0f, 1.0f);
- sound->setListenerGain(new_volume);
+ bool mute_sound = g_settings->getBool("mute_sound");
+ if (mute_sound) {
+ sound->setListenerGain(0.0f);
+ } else {
+ // Check if volume is in the proper range, else fix it.
+ float old_volume = g_settings->getFloat("sound_volume");
+ float new_volume = rangelim(old_volume, 0.0f, 1.0f);
+ sound->setListenerGain(new_volume);
- if (old_volume != new_volume) {
- g_settings->setFloat("sound_volume", new_volume);
+ if (old_volume != new_volume) {
+ g_settings->setFloat("sound_volume", new_volume);
+ }
}
LocalPlayer *player = client->getEnv().getLocalPlayer();
const int ID_soundText = 263;
const int ID_soundExitButton = 264;
const int ID_soundSlider = 265;
+const int ID_soundMuteButton = 266;
GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id,
*/
{
core::rect<s32> rect(0, 0, 160, 20);
- rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 35);
+ rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 70);
const wchar_t *text = wgettext("Sound Volume: ");
core::stringw volume_text = text;
}
{
core::rect<s32> rect(0, 0, 300, 20);
- rect = rect + v2s32(size.X/2-150, size.Y/2);
+ rect = rect + v2s32(size.X / 2 - 150, size.Y / 2);
gui::IGUIScrollBar *e = Environment->addScrollBar(true,
rect, this, ID_soundSlider);
e->setMax(100);
e->setPos(volume);
}
+ {
+ core::rect<s32> rect(0, 0, 160, 20);
+ rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 35);
+ const wchar_t *text = wgettext("Muted");
+ Environment->addCheckBox(g_settings->getBool("mute_sound"), rect, this,
+ ID_soundMuteButton, text);
+ delete[] text;
+ }
}
void GUIVolumeChange::drawMenu()
quitMenu();
return true;
}
- }
-
- if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
- if (event.GUIEvent.Caller->getID() == ID_soundExitButton) {
- quitMenu();
+ } else if (event.EventType == EET_GUI_EVENT) {
+ if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED) {
+ gui::IGUIElement *e = getElementFromId(ID_soundMuteButton);
+ if (e != NULL && e->getType() == gui::EGUIET_CHECK_BOX) {
+ g_settings->setBool("mute_sound", ((gui::IGUICheckBox*)e)->isChecked());
+ }
+
+ Environment->setFocus(this);
return true;
}
- }
- if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
- if (event.GUIEvent.Caller->getID() == ID_soundSlider) {
- s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
- g_settings->setFloat("sound_volume", (float) pos / 100);
-
- gui::IGUIElement *e = getElementFromId(ID_soundText);
- const wchar_t *text = wgettext("Sound Volume: ");
- core::stringw volume_text = text;
- delete [] text;
+ if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
+ if (event.GUIEvent.Caller->getID() == ID_soundExitButton) {
+ quitMenu();
+ return true;
+ }
+ Environment->setFocus(this);
+ }
- volume_text += core::stringw(pos) + core::stringw("%");
- e->setText(volume_text.c_str());
- return true;
+ if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST
+ && isVisible()) {
+ if (!canTakeFocus(event.GUIEvent.Element)) {
+ dstream << "GUIMainMenu: Not allowing focus change."
+ << std::endl;
+ // Returning true disables focus change
+ return true;
+ }
+ }
+ if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
+ if (event.GUIEvent.Caller->getID() == ID_soundSlider) {
+ s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
+ g_settings->setFloat("sound_volume", (float) pos / 100);
+
+ gui::IGUIElement *e = getElementFromId(ID_soundText);
+ const wchar_t *text = wgettext("Sound Volume: ");
+ core::stringw volume_text = text;
+ delete [] text;
+
+ volume_text += core::stringw(pos) + core::stringw("%");
+ e->setText(volume_text.c_str());
+ return true;
+ }
}
+
}
return Parent ? Parent->OnEvent(event) : false;