Implement the refresh button

This commit is contained in:
Thinkofdeath 2015-09-25 14:48:35 +01:00
parent 3bcfc6aa4c
commit 0d3ff98ad5
5 changed files with 41 additions and 20 deletions

View File

@ -109,12 +109,12 @@ fn handle_window_event(
let (width, height) = window.get_size();
let (xpos, ypos) = window.get_cursor_pos();
let (fw, fh) = window.get_framebuffer_size();
ui_container.click_at(renderer, xpos*((fw as f64)/(width as f64)), ypos*((fh as f64)/(height as f64)), fw as f64, fh as f64)
ui_container.click_at(screen_sys, renderer, xpos*((fw as f64)/(width as f64)), ypos*((fh as f64)/(height as f64)), fw as f64, fh as f64)
},
glfw::WindowEvent::CursorPos(xpos, ypos) => {
let (width, height) = window.get_size();
let (fw, fh) = window.get_framebuffer_size();
ui_container.hover_at(renderer, xpos*((fw as f64)/(width as f64)), ypos*((fh as f64)/(height as f64)), fw as f64, fh as f64)
ui_container.hover_at(screen_sys, renderer, xpos*((fw as f64)/(width as f64)), ypos*((fh as f64)/(height as f64)), fw as f64, fh as f64)
}
_ => {}
}

View File

@ -451,6 +451,13 @@ impl TextureManager {
rel_height: 1.0,
is_rel: false,
};
let rect = atlas::Rect {
x: rect.x,
y: rect.y,
width: width,
height: height,
};
self.pending_uploads.push((atlas, rect, data));
self.textures.insert(full_name.to_owned(), t.clone());
t
}

View File

@ -147,10 +147,10 @@ pub fn new_button_text(renderer: &mut render::Renderer, val: &str, x: f64, y: f6
pub fn button_action(ui_container: &mut ui::Container,
btn: ui::ElementRef<ui::Batch>, txt: Option<ui::ElementRef<ui::Text>>,
click: Option<Rc<Fn(&mut render::Renderer, &mut ui::Container)>>
click: Option<ui::ClickFunc>
) {
let batch = ui_container.get_mut(&btn);
batch.add_hover_func(Rc::new(move |over, renderer, ui_container| {
batch.add_hover_func(Rc::new(move |over, screen_sys, renderer, ui_container| {
let texture = render::Renderer::get_texture(renderer.get_textures_ref(), "gui/widgets").relative(
0.0, (if over { 86.0 } else { 66.0 }) / 256.0, 200.0 / 256.0, 20.0 / 256.0
);

View File

@ -3,6 +3,7 @@ use std::fs;
use std::thread;
use std::sync::mpsc;
use std::rc::Rc;
use std::cell::RefCell;
use ui;
use render;
@ -20,6 +21,8 @@ use rand::{Rng};
pub struct ServerList {
elements: Option<UIElements>,
disconnect_reason: Option<Component>,
needs_reload: Rc<RefCell<bool>>,
}
struct UIElements {
@ -72,11 +75,13 @@ impl ServerList {
ServerList {
elements: None,
disconnect_reason: disconnect_reason,
needs_reload: Rc::new(RefCell::new(false)),
}
}
fn reload_server_list(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
let elements = self.elements.as_mut().unwrap();
*self.needs_reload.borrow_mut() = false;
{
let mut tex = renderer.get_textures_ref().write().unwrap();
for server in &mut elements.servers {
@ -133,12 +138,12 @@ impl ServerList {
let back = ui_container.get_mut(&server.back);
let back_ref = server.back.clone();
let address = address.clone();
back.add_hover_func(Rc::new(move |over, renderer, ui_container| {
back.add_hover_func(Rc::new(move |over, screen_sys, renderer, ui_container| {
let back = ui_container.get_mut(&back_ref);
back.set_a(if over { 200 } else { 100 });
}));
back.add_click_func(Rc::new(move |renderer, ui_container| {
back.add_click_func(Rc::new(move |screen_sys, renderer, ui_container| {
println!("Connecting to {}", address);
}));
}
@ -255,7 +260,10 @@ impl super::Screen for ServerList {
let re = ui_container.add(refresh);
txt.set_parent(&re);
let tre = ui_container.add(txt);
super::button_action(ui_container, re.clone(), Some(tre.clone()), None);
let nr = self.needs_reload.clone();
super::button_action(ui_container, re.clone(), Some(tre.clone()), Some(Rc::new(move |screen_sys, renderer, ui_container| {
*nr.borrow_mut() = true;
})));
elements.add(re);
elements.add(tre);
@ -265,9 +273,7 @@ impl super::Screen for ServerList {
let re = ui_container.add(add);
txt.set_parent(&re);
let tre = ui_container.add(txt);
super::button_action(ui_container, re.clone(), Some(tre.clone()), Some(Rc::new(|renderer, ui_container| {
})));
super::button_action(ui_container, re.clone(), Some(tre.clone()), None);
elements.add(re);
elements.add(tre);
@ -328,7 +334,11 @@ impl super::Screen for ServerList {
}
fn tick(&mut self, delta: f64, renderer: &mut render::Renderer, ui_container: &mut ui::Container) {
if *self.needs_reload.borrow() {
self.reload_server_list(renderer, ui_container);
}
let elements = self.elements.as_mut().unwrap();
elements.logo.tick(renderer, ui_container);
for s in &mut elements.servers {

View File

@ -20,6 +20,7 @@ use std::rc::Rc;
use rand;
use render;
use format;
use screen;
const SCALED_WIDTH: f64 = 854.0;
const SCALED_HEIGHT: f64 = 480.0;
@ -32,10 +33,13 @@ pub enum Element {
None,
}
pub type ClickFunc = Rc<Fn(&mut screen::ScreenSystem, &mut render::Renderer, &mut Container)>;
pub type HoverFunc = Rc<Fn(bool, &mut screen::ScreenSystem, &mut render::Renderer, &mut Container)>;
macro_rules! element_impl {
($($name:ident),+) => (
impl Element {
fn get_click_funcs(&self) -> Vec<Rc<Fn(&mut render::Renderer, &mut Container)>> {
fn get_click_funcs(&self) -> Vec<ClickFunc> {
match self {
$(
&Element::$name(ref val) => val.click_funcs.clone(),
@ -44,7 +48,7 @@ impl Element {
}
}
fn get_hover_funcs(&self) -> Vec<Rc<Fn(bool, &mut render::Renderer, &mut Container)>> {
fn get_hover_funcs(&self) -> Vec<HoverFunc> {
match self {
$(
&Element::$name(ref val) => val.hover_funcs.clone(),
@ -368,7 +372,7 @@ impl Container {
map
}
pub fn click_at(&mut self, renderer: &mut render::Renderer, x: f64, y: f64, width: f64, height: f64) {
pub fn click_at(&mut self, screen_sys: &mut screen::ScreenSystem, renderer: &mut render::Renderer, x: f64, y: f64, width: f64, height: f64) {
let (sw, sh) = match self.mode {
Mode::Scaled => (SCALED_WIDTH / width, SCALED_HEIGHT / height),
Mode::Unscaled(scale) => (scale, scale),
@ -389,12 +393,12 @@ impl Container {
}
if let Some(click) = click {
for c in &click {
c(renderer, self);
c(screen_sys, renderer, self);
}
}
}
pub fn hover_at(&mut self, renderer: &mut render::Renderer, x: f64, y: f64, width: f64, height: f64) {
pub fn hover_at(&mut self, screen_sys: &mut screen::ScreenSystem, renderer: &mut render::Renderer, x: f64, y: f64, width: f64, height: f64) {
let (sw, sh) = match self.mode {
Mode::Scaled => (SCALED_WIDTH / width, SCALED_HEIGHT / height),
Mode::Unscaled(scale) => (scale, scale),
@ -417,7 +421,7 @@ impl Container {
};
if call {
for f in &hover.1 {
f(hover.2, renderer, self);
f(hover.2, screen_sys, renderer, self);
}
}
}
@ -493,8 +497,8 @@ macro_rules! ui_element {
y: f64,
v_attach: VAttach,
h_attach: HAttach,
click_funcs: Vec<Rc<Fn(&mut render::Renderer, &mut Container)>>,
hover_funcs: Vec<Rc<Fn(bool, &mut render::Renderer, &mut Container)>>,
click_funcs: Vec<ClickFunc>,
hover_funcs: Vec<HoverFunc>,
hovered: bool,
$(
$field: $field_ty
@ -510,11 +514,11 @@ macro_rules! base_impl {
self.dirty = true;
}
pub fn add_click_func(&mut self, f: Rc<Fn(&mut render::Renderer, &mut Container)>) {
pub fn add_click_func(&mut self, f: ClickFunc) {
self.click_funcs.push(f);
}
pub fn add_hover_func(&mut self, f: Rc<Fn(bool, &mut render::Renderer, &mut Container)>) {
pub fn add_hover_func(&mut self, f: HoverFunc) {
self.hover_funcs.push(f);
}