Implement a background for the option menus

This commit is contained in:
Thinkofname 2016-04-21 11:00:05 +01:00
parent ebc11224e7
commit 380a844272
3 changed files with 96 additions and 23 deletions

View File

@ -79,8 +79,8 @@ pub struct Renderer {
trans: Option<TransInfo>,
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(

View File

@ -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<ui::Image>,
}
pub struct SettingsMenu {
console: Arc<Mutex<console::Console>>,
elements: Option<UIElement>,
elements: Option<UIElements>,
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<Box<super::Screen>> {
fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option<Box<super::Screen>> {
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<Mutex<console::Console>>,
elements: Option<UIElement>,
elements: Option<UIElements>,
}
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<Box<super::Screen>> {
fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option<Box<super::Screen>> {
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<Mutex<console::Console>>,
elements: Option<UIElement>
elements: Option<UIElements>
}
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<Box<super::Screen>> {
fn tick(&mut self, _delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) -> Option<Box<super::Screen>> {
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
}

View File

@ -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<ElementRefInner, Element>,
// We need the order
elements_list: Vec<ElementRefInner>,
@ -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 {