Added mute buttons for all of the audio sliders in settings

This commit is contained in:
Mckol 2022-05-09 03:11:34 +02:00 committed by LunarEclipse
parent e35e533d88
commit 6605c2657f
10 changed files with 232 additions and 48 deletions

BIN
assets/voxygen/element/ui/generic/buttons/mute_btn.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/element/ui/generic/buttons/muted_btn.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View File

@ -556,6 +556,13 @@ image_ids! {
button_hover: "voxygen.element.ui.generic.buttons.button_hover",
button_press: "voxygen.element.ui.generic.buttons.button_press",
// Mute Buttons
button_mute: "voxygen.element.ui.generic.buttons.mute_btn",
button_mute_hover: "voxygen.element.ui.generic.buttons.mute_btn_hover",
button_muted: "voxygen.element.ui.generic.buttons.muted_btn",
button_muted_hover: "voxygen.element.ui.generic.buttons.muted_btn_hover",
// Enemy Healthbar
enemy_health: "voxygen.element.ui.generic.frames.enemybar",
enemy_health_bg: "voxygen.element.ui.generic.frames.enemybar_bg",

View File

@ -3,7 +3,7 @@ use super::{RESET_BUTTONS_HEIGHT, RESET_BUTTONS_WIDTH};
use crate::{
hud::{img_ids::Imgs, TEXT_COLOR},
session::settings_change::{Audio as AudioChange, Audio::*},
ui::{fonts::Fonts, ImageSlider},
ui::{fonts::Fonts, ImageSlider, ToggleButton},
GlobalState,
};
use conrod_core::{
@ -22,18 +22,23 @@ widget_ids! {
master_volume_text,
master_volume_slider,
master_volume_number,
master_volume_muted,
inactive_master_volume_text,
inactive_master_volume_slider,
inactive_master_volume_number,
inactive_master_volume_muted,
music_volume_text,
music_volume_slider,
music_volume_number,
music_volume_muted,
sfx_volume_text,
sfx_volume_slider,
sfx_volume_number,
sfx_volume_muted,
ambience_volume_text,
ambience_volume_slider,
ambience_volume_number,
ambience_volume_muted,
music_spacing_text,
music_spacing_slider,
music_spacing_number,
@ -116,14 +121,14 @@ impl<'a> Widget for Sound<'a> {
.set(state.ids.master_volume_text, ui);
// Master Volume Slider
if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.master_volume,
self.global_state.settings.audio.master_volume.volume,
0.0,
1.0,
self.imgs.slider_indicator,
self.imgs.slider,
)
.w_h(104.0, 22.0)
.down_from(state.ids.master_volume_text, 10.0)
.right_from(state.ids.master_volume_muted, 8.0)
.track_breadth(12.0)
.slider_length(10.0)
.pad_track((5.0, 5.0))
@ -134,13 +139,26 @@ impl<'a> Widget for Sound<'a> {
// Master Volume Number
Text::new(&format!(
"{:2.0}%",
self.global_state.settings.audio.master_volume * 100.0
self.global_state.settings.audio.master_volume.volume * 100.0
))
.right_from(state.ids.master_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.master_volume_number, ui);
// Master Volume Muted Indicator
let master_muted = ToggleButton::new(
self.global_state.settings.audio.master_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.master_volume_text, 10.0)
.press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.set(state.ids.master_volume_muted, ui);
if master_muted != self.global_state.settings.audio.master_volume.muted {
events.push(MuteMasterVolume(master_muted));
}
// Master Volume (inactive window)
Text::new(
@ -148,21 +166,25 @@ impl<'a> Widget for Sound<'a> {
.localized_strings
.get_msg("hud-settings-inactive_master_volume_perc"),
)
.down_from(state.ids.master_volume_slider, 10.0)
.down_from(state.ids.master_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.inactive_master_volume_text, ui);
// Master Volume (inactive window) Slider
if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.inactive_master_volume_perc,
self.global_state
.settings
.audio
.inactive_master_volume_perc
.volume,
0.0,
1.0,
self.imgs.slider_indicator,
self.imgs.slider,
)
.w_h(104.0, 22.0)
.down_from(state.ids.inactive_master_volume_text, 10.0)
.right_from(state.ids.inactive_master_volume_muted, 8.0)
.track_breadth(12.0)
.slider_length(10.0)
.pad_track((5.0, 5.0))
@ -173,31 +195,60 @@ impl<'a> Widget for Sound<'a> {
// Master Volume (inactive window) Number
Text::new(&format!(
"{:2.0}%",
self.global_state.settings.audio.inactive_master_volume_perc * 100.0
self.global_state
.settings
.audio
.inactive_master_volume_perc
.volume
* 100.0
))
.right_from(state.ids.inactive_master_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.inactive_master_volume_number, ui);
// Master Volume (inactive window) Muted Indicator
let inactive_master_muted = ToggleButton::new(
self.global_state
.settings
.audio
.inactive_master_volume_perc
.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.inactive_master_volume_text, 10.0)
.press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.set(state.ids.inactive_master_volume_muted, ui);
if inactive_master_muted
!= self
.global_state
.settings
.audio
.inactive_master_volume_perc
.muted
{
events.push(MuteInactiveMasterVolume(inactive_master_muted));
}
// Music Volume
Text::new(&self.localized_strings.get_msg("hud-settings-music_volume"))
.down_from(state.ids.inactive_master_volume_slider, 10.0)
.down_from(state.ids.inactive_master_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.music_volume_text, ui);
// Music Volume Slider
if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.music_volume,
self.global_state.settings.audio.music_volume.volume,
0.0,
1.0,
self.imgs.slider_indicator,
self.imgs.slider,
)
.w_h(104.0, 22.0)
.down_from(state.ids.music_volume_text, 10.0)
.right_from(state.ids.music_volume_muted, 8.0)
.track_breadth(12.0)
.slider_length(10.0)
.pad_track((5.0, 5.0))
@ -208,13 +259,26 @@ impl<'a> Widget for Sound<'a> {
// Music Volume Number
Text::new(&format!(
"{:2.0}%",
self.global_state.settings.audio.music_volume * 100.0
self.global_state.settings.audio.music_volume.volume * 100.0
))
.right_from(state.ids.music_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.music_volume_number, ui);
// Music Muted Indicator
let music_muted = ToggleButton::new(
self.global_state.settings.audio.music_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.music_volume_text, 10.0)
.press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.set(state.ids.music_volume_muted, ui);
if music_muted != self.global_state.settings.audio.music_volume.muted {
events.push(MuteMusicVolume(music_muted));
}
// SFX Volume
Text::new(
@ -222,21 +286,21 @@ impl<'a> Widget for Sound<'a> {
.localized_strings
.get_msg("hud-settings-sound_effect_volume"),
)
.down_from(state.ids.music_volume_slider, 10.0)
.down_from(state.ids.music_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.sfx_volume_text, ui);
// SFX Volume Slider
if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.sfx_volume,
self.global_state.settings.audio.sfx_volume.volume,
0.0,
1.0,
self.imgs.slider_indicator,
self.imgs.slider,
)
.w_h(104.0, 22.0)
.down_from(state.ids.sfx_volume_text, 10.0)
.right_from(state.ids.sfx_volume_muted, 8.0)
.track_breadth(12.0)
.slider_length(10.0)
.pad_track((5.0, 5.0))
@ -247,13 +311,27 @@ impl<'a> Widget for Sound<'a> {
// SFX Volume Number
Text::new(&format!(
"{:2.0}%",
self.global_state.settings.audio.sfx_volume * 100.0
self.global_state.settings.audio.sfx_volume.volume * 100.0
))
.right_from(state.ids.sfx_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.sfx_volume_number, ui);
// SFX Volume Muted Indicator
let sfx_muted = ToggleButton::new(
self.global_state.settings.audio.sfx_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.sfx_volume_text, 10.0)
.press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.set(state.ids.sfx_volume_muted, ui);
if sfx_muted != self.global_state.settings.audio.sfx_volume.muted {
events.push(MuteSfxVolume(sfx_muted));
}
// Ambience Volume
Text::new(
&self
@ -267,7 +345,7 @@ impl<'a> Widget for Sound<'a> {
.set(state.ids.ambience_volume_text, ui);
// Ambience Volume Slider
if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.ambience_volume,
self.global_state.settings.audio.ambience_volume.volume,
0.0,
1.0,
self.imgs.slider_indicator,
@ -285,13 +363,26 @@ impl<'a> Widget for Sound<'a> {
// Ambience Volume Number
Text::new(&format!(
"{:2.0}%",
self.global_state.settings.audio.ambience_volume * 100.0
self.global_state.settings.audio.ambience_volume.volume * 100.0
))
.right_from(state.ids.ambience_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.ambience_volume_number, ui);
// Ambience Volume Muted Indicator
let ambience_muted = ToggleButton::new(
self.global_state.settings.audio.ambience_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.ambience_volume_text, 10.0)
.press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.set(state.ids.ambience_volume_muted, ui);
if ambience_muted != self.global_state.settings.audio.ambience_volume.muted {
events.push(MuteAmbienceVolume(ambience_muted));
}
// Music spacing
Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing"))

View File

@ -230,10 +230,10 @@ fn main() {
// AudioOutput::Device(ref dev) => Some(dev.clone()),
};
audio.set_master_volume(settings.audio.master_volume);
audio.set_music_volume(settings.audio.music_volume);
audio.set_sfx_volume(settings.audio.sfx_volume);
audio.set_ambience_volume(settings.audio.ambience_volume);
audio.set_master_volume(settings.audio.master_volume.get_checked());
audio.set_music_volume(settings.audio.music_volume.get_checked());
audio.set_sfx_volume(settings.audio.sfx_volume.get_checked());
audio.set_ambience_volume(settings.audio.ambience_volume.get_checked());
audio.set_music_spacing(settings.audio.music_spacing);
// Load the profile.

View File

@ -89,10 +89,14 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) {
if let winit::event::WindowEvent::Focused(focused) = event {
global_state.audio.set_master_volume(if focused {
global_state.settings.audio.master_volume
global_state.settings.audio.master_volume.get_checked()
} else {
global_state.settings.audio.inactive_master_volume_perc
* global_state.settings.audio.master_volume
global_state
.settings
.audio
.inactive_master_volume_perc
.get_checked()
* global_state.settings.audio.master_volume.get_checked()
});
}

View File

@ -8,8 +8,8 @@ use crate::{
},
render::RenderMode,
settings::{
AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings, GameplaySettings,
GraphicsSettings, InterfaceSettings,
audio::AudioVolume, AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings,
GameplaySettings, GraphicsSettings, InterfaceSettings,
},
window::FullScreenSettings,
GlobalState,
@ -19,10 +19,15 @@ use i18n::{LanguageMetadata, LocalizationHandle};
#[derive(Clone)]
pub enum Audio {
AdjustMasterVolume(f32),
MuteMasterVolume(bool),
AdjustInactiveMasterVolume(f32),
MuteInactiveMasterVolume(bool),
AdjustMusicVolume(f32),
MuteMusicVolume(bool),
AdjustSfxVolume(f32),
MuteSfxVolume(bool),
AdjustAmbienceVolume(f32),
MuteAmbienceVolume(bool),
AdjustMusicSpacing(f32),
//ChangeAudioDevice(String),
ResetAudioSettings,
@ -194,31 +199,73 @@ settings_change_from!(Networking);
impl SettingsChange {
pub fn process(self, global_state: &mut GlobalState, session_state: &mut SessionState) {
let mut settings = &mut global_state.settings;
match self {
SettingsChange::Audio(audio_change) => {
fn update_volume(audio: &mut AudioVolume, volume: f32) -> f32 {
audio.volume = volume;
audio.get_checked()
}
fn update_muted(audio: &mut AudioVolume, muted: bool) -> f32 {
audio.muted = muted;
audio.get_checked()
}
match audio_change {
Audio::AdjustMasterVolume(master_volume) => {
global_state.audio.set_master_volume(master_volume);
let volume_checked =
update_volume(&mut settings.audio.master_volume, master_volume);
settings.audio.master_volume = master_volume;
global_state.audio.set_master_volume(volume_checked);
},
Audio::MuteMasterVolume(master_muted) => {
let volume_checked =
update_muted(&mut settings.audio.master_volume, master_muted);
global_state.audio.set_master_volume(volume_checked);
},
Audio::AdjustInactiveMasterVolume(inactive_master_volume_perc) => {
settings.audio.inactive_master_volume_perc = inactive_master_volume_perc;
settings.audio.inactive_master_volume_perc.volume =
inactive_master_volume_perc;
},
Audio::MuteInactiveMasterVolume(inactive_master_volume_muted) => {
settings.audio.inactive_master_volume_perc.muted =
inactive_master_volume_muted;
},
Audio::AdjustMusicVolume(music_volume) => {
global_state.audio.set_music_volume(music_volume);
let volume_checked =
update_volume(&mut settings.audio.music_volume, music_volume);
settings.audio.music_volume = music_volume;
global_state.audio.set_music_volume(volume_checked);
},
Audio::MuteMusicVolume(music_muted) => {
let volume_checked =
update_muted(&mut settings.audio.music_volume, music_muted);
global_state.audio.set_music_volume(volume_checked);
},
Audio::AdjustSfxVolume(sfx_volume) => {
global_state.audio.set_sfx_volume(sfx_volume);
let volume_checked =
update_volume(&mut settings.audio.sfx_volume, sfx_volume);
settings.audio.sfx_volume = sfx_volume;
global_state.audio.set_sfx_volume(volume_checked);
},
Audio::MuteSfxVolume(sfx_muted) => {
let volume_checked =
update_muted(&mut settings.audio.sfx_volume, sfx_muted);
global_state.audio.set_sfx_volume(volume_checked);
},
Audio::AdjustAmbienceVolume(ambience_volume) => {
global_state.audio.set_ambience_volume(ambience_volume);
settings.audio.ambience_volume = ambience_volume;
settings.audio.ambience_volume.volume = ambience_volume;
},
Audio::MuteAmbienceVolume(ambience_muted) => {
let volume_checked =
update_muted(&mut settings.audio.ambience_volume, ambience_muted);
global_state.audio.set_ambience_volume(volume_checked);
},
Audio::AdjustMusicSpacing(multiplier) => {
global_state.audio.set_music_spacing(multiplier);
@ -232,9 +279,14 @@ impl SettingsChange {
//},
Audio::ResetAudioSettings => {
settings.audio = AudioSettings::default();
let audio = &settings.audio;
global_state.audio.set_music_volume(audio.music_volume);
global_state.audio.set_sfx_volume(audio.sfx_volume);
let audio = &mut global_state.audio;
// TODO: check if updating the master volume is necessary
// (it wasn't done before)
audio.set_master_volume(settings.audio.master_volume.get_checked());
audio.set_music_volume(settings.audio.music_volume.get_checked());
audio.set_sfx_volume(settings.audio.sfx_volume.get_checked());
},
}
},

View File

@ -15,17 +15,35 @@ pub enum AudioOutput {
impl AudioOutput {
pub fn is_enabled(&self) -> bool { !matches!(self, Self::Off) }
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub struct AudioVolume {
pub volume: f32,
pub muted: bool,
}
impl AudioVolume {
pub fn new(volume: f32, muted: bool) -> Self { Self { volume, muted } }
pub fn get_checked(&self) -> f32 {
match self.muted {
true => 0.0,
false => self.volume,
}
}
}
/// `AudioSettings` controls the volume of different audio subsystems and which
/// device is used.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct AudioSettings {
pub master_volume: f32,
pub master_volume: AudioVolume,
#[serde(rename = "inactive_master_volume")]
pub inactive_master_volume_perc: f32,
pub music_volume: f32,
pub sfx_volume: f32,
pub ambience_volume: f32,
pub inactive_master_volume_perc: AudioVolume,
pub music_volume: AudioVolume,
pub sfx_volume: AudioVolume,
pub ambience_volume: AudioVolume,
pub num_sfx_channels: usize,
pub num_ui_channels: usize,
pub music_spacing: f32,
@ -37,11 +55,11 @@ pub struct AudioSettings {
impl Default for AudioSettings {
fn default() -> Self {
Self {
master_volume: 1.0,
inactive_master_volume_perc: 0.5,
music_volume: 0.25,
sfx_volume: 0.6,
ambience_volume: 0.6,
master_volume: AudioVolume::new(1.0, false),
inactive_master_volume_perc: AudioVolume::new(0.5, false),
music_volume: AudioVolume::new(0.4, false),
sfx_volume: AudioVolume::new(0.6, false),
ambience_volume: AudioVolume::new(0.6, false),
num_sfx_channels: 60,
num_ui_channels: 10,
music_spacing: 1.0,