From 380a844272b64402e70534f3e04f85c5735b1bec Mon Sep 17 00:00:00 2001 From: Thinkofname Date: Thu, 21 Apr 2016 11:00:05 +0100 Subject: [PATCH] Implement a background for the option menus --- src/render/mod.rs | 14 +++--- src/screen/settings_menu.rs | 99 +++++++++++++++++++++++++++++++------ src/ui/mod.rs | 6 ++- 3 files changed, 96 insertions(+), 23 deletions(-) diff --git a/src/render/mod.rs b/src/render/mod.rs index 2f1c4a5..2d6710c 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -79,8 +79,8 @@ pub struct Renderer { trans: Option, - last_width: u32, - last_height: u32, + pub width: u32, + pub height: u32, // Light renderering pub light_level: f32, @@ -217,8 +217,8 @@ impl Renderer { element_buffer_size: 0, element_buffer_type: gl::UNSIGNED_BYTE, - last_width: 0, - last_height: 0, + width: 0, + height: 0, camera: Camera { pos: cgmath::Point3::new(0.0, 0.0, 0.0), @@ -255,9 +255,9 @@ impl Renderer { } } - if self.last_height != height || self.last_width != width { - self.last_width = width; - self.last_height = height; + if self.height != height || self.width != width { + self.width = width; + self.height = height; gl::viewport(0, 0, width as i32, height as i32); self.perspective_matrix = cgmath::Matrix4::from( diff --git a/src/screen/settings_menu.rs b/src/screen/settings_menu.rs index a3cddd0..7c0c9b8 100644 --- a/src/screen/settings_menu.rs +++ b/src/screen/settings_menu.rs @@ -41,14 +41,14 @@ macro_rules! get_matched_str { ) } -pub struct UIElement { - elements: ui::Collection - // TODO: Add background of some sort +pub struct UIElements { + elements: ui::Collection, + background: ui::ElementRef, } pub struct SettingsMenu { console: Arc>, - elements: Option, + elements: Option, show_disconnect_button: bool } @@ -66,6 +66,15 @@ impl super::Screen for SettingsMenu { fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { let mut elements = ui::Collection::new(); + let mut background = ui::Image::new( + render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid"), + 0.0, 0.0, 854.0, 480.0, + 0.0, 0.0, 1.0, 1.0, + 0, 0, 0 + ); + background.set_a(100); + let background = elements.add(ui_container.add(background)); + // From top and down let (btn_audio_settings, txt_audio_settings) = new_submenu_button("Audio settings...", renderer, ui_container, -160.0, -50.0); super::button_action(ui_container, btn_audio_settings.clone(), Some(txt_audio_settings.clone()), move |game, _| { @@ -114,8 +123,9 @@ impl super::Screen for SettingsMenu { elements.add(txt_exit_game); } - self.elements = Some(UIElement { - elements: elements + self.elements = Some(UIElements { + elements: elements, + background: background, }); } @@ -128,7 +138,20 @@ impl super::Screen for SettingsMenu { } // Called every frame the screen is active - fn tick(&mut self, _delta: f64, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) -> Option> { + fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option> { + let elements = self.elements.as_mut().unwrap(); + { + let mode = ui_container.mode; + let background = ui_container.get_mut(&elements.background); + background.set_width(match mode { + ui::Mode::Unscaled(scale) => 854.0 / scale, + ui::Mode::Scaled => renderer.width as f64, + }); + background.set_height(match mode { + ui::Mode::Unscaled(scale) => 480.0 / scale, + ui::Mode::Scaled => renderer.height as f64, + }); + } None } @@ -144,7 +167,7 @@ impl super::Screen for SettingsMenu { pub struct VideoSettingsMenu { console: Arc>, - elements: Option, + elements: Option, } impl VideoSettingsMenu { @@ -160,6 +183,15 @@ impl super::Screen for VideoSettingsMenu { fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { let mut elements = ui::Collection::new(); + let mut background = ui::Image::new( + render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid"), + 0.0, 0.0, 854.0, 480.0, + 0.0, 0.0, 1.0, 1.0, + 0, 0, 0 + ); + background.set_a(100); + let background = elements.add(ui_container.add(background)); + // Load defaults let (r_max_fps, r_fov, r_vsync) = { let console = self.console.lock().unwrap(); @@ -198,8 +230,9 @@ impl super::Screen for VideoSettingsMenu { }); elements.add(btn_done); elements.add(txt_done); - self.elements = Some(UIElement { - elements: elements + self.elements = Some(UIElements { + elements: elements, + background: background, }); } @@ -212,7 +245,20 @@ impl super::Screen for VideoSettingsMenu { } // Called every frame the screen is active - fn tick(&mut self, _delta: f64, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) -> Option> { + fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option> { + let elements = self.elements.as_mut().unwrap(); + { + let mode = ui_container.mode; + let background = ui_container.get_mut(&elements.background); + background.set_width(match mode { + ui::Mode::Unscaled(scale) => 854.0 / scale, + ui::Mode::Scaled => renderer.width as f64, + }); + background.set_height(match mode { + ui::Mode::Unscaled(scale) => 480.0 / scale, + ui::Mode::Scaled => renderer.height as f64, + }); + } None } @@ -228,7 +274,7 @@ impl super::Screen for VideoSettingsMenu { pub struct AudioSettingsMenu { console: Arc>, - elements: Option + elements: Option } impl AudioSettingsMenu { @@ -244,6 +290,15 @@ impl super::Screen for AudioSettingsMenu { fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { let mut elements = ui::Collection::new(); + let mut background = ui::Image::new( + render::Renderer::get_texture(renderer.get_textures_ref(), "steven:solid"), + 0.0, 0.0, 854.0, 480.0, + 0.0, 0.0, 1.0, 1.0, + 0, 0, 0 + ); + background.set_a(100); + let background = elements.add(ui_container.add(background)); + let master_volume = { let console = self.console.lock().unwrap(); (console.get(settings::CL_MASTER_VOLUME).clone()) @@ -260,8 +315,9 @@ impl super::Screen for AudioSettingsMenu { elements.add(btn_done); elements.add(txt_done); - self.elements = Some(UIElement { - elements: elements + self.elements = Some(UIElements { + elements: elements, + background: background, }); } @@ -274,7 +330,20 @@ impl super::Screen for AudioSettingsMenu { } // Called every frame the screen is active - fn tick(&mut self, _delta: f64, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) -> Option> { + fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option> { + let elements = self.elements.as_mut().unwrap(); + { + let mode = ui_container.mode; + let background = ui_container.get_mut(&elements.background); + background.set_width(match mode { + ui::Mode::Unscaled(scale) => 854.0 / scale, + ui::Mode::Scaled => renderer.width as f64, + }); + background.set_height(match mode { + ui::Mode::Unscaled(scale) => 480.0 / scale, + ui::Mode::Scaled => renderer.height as f64, + }); + } None } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index ab15939..a2a8d72 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -193,6 +193,7 @@ element_impl!( Button ); +#[derive(Clone, Copy, PartialEq)] pub enum Mode { Scaled, Unscaled(f64), @@ -290,6 +291,7 @@ const SCREEN: Region = Region { pub struct Container { pub mode: Mode, + last_mode: Mode, elements: HashMap, // We need the order elements_list: Vec, @@ -305,6 +307,7 @@ impl Container { pub fn new() -> Container { Container { mode: Mode::Scaled, + last_mode: Mode::Scaled, elements: HashMap::new(), elements_list: Vec::new(), version: 0xFFFF, @@ -356,11 +359,12 @@ impl Container { }; if self.last_sw != sw || self.last_sh != sh || self.last_width != width || - self.last_height != height || self.version != renderer.ui.version { + self.last_height != height || self.version != renderer.ui.version || self.last_mode != self.mode { self.last_sw = sw; self.last_sh = sh; self.last_width = width; self.last_height = height; + self.last_mode = self.mode; for (_, e) in &mut self.elements { e.set_dirty(true); if self.version != renderer.ui.version {