diff --git a/src/screen/delete_server.rs b/src/screen/delete_server.rs new file mode 100644 index 0000000..82001b5 --- /dev/null +++ b/src/screen/delete_server.rs @@ -0,0 +1,157 @@ +// Copyright 2016 Matthew Collins +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::collections::BTreeMap; +use std_or_web::fs; + +use crate::render; +use crate::ui; + +use serde_json::{self, Value}; + +pub struct DeleteServerEntry { + elements: Option, + index: usize, + name: String, + address: String, +} + +struct UIElements { + logo: ui::logo::Logo, + + _prompt: ui::TextRef, + _confirm: ui::ButtonRef, + _cancel: ui::ButtonRef, +} + +impl DeleteServerEntry { + pub fn new(index: usize, name: &str, address: &str) -> DeleteServerEntry { + DeleteServerEntry { + elements: None, + index, + name: name.to_string(), + address: address.to_string(), + } + } + + fn delete_server(index: usize) { + let mut servers_info = match fs::File::open("servers.json") { + Ok(val) => serde_json::from_reader(val).unwrap(), + Err(_) => { + let mut info = BTreeMap::default(); + info.insert("servers".to_owned(), Value::Array(vec![])); + Value::Object(info.into_iter().collect()) + } + }; + + { + let servers = servers_info + .as_object_mut() + .unwrap() + .get_mut("servers") + .unwrap() + .as_array_mut() + .unwrap(); + servers.remove(index); + } + + let mut out = fs::File::create("servers.json").unwrap(); + serde_json::to_writer_pretty(&mut out, &servers_info).unwrap(); + } +} + +impl super::Screen for DeleteServerEntry { + fn on_active(&mut self, renderer: &mut render::Renderer, ui_container: &mut ui::Container) { + let logo = ui::logo::Logo::new(renderer.resources.clone(), ui_container); + + // Prompt + let prompt = ui::TextBuilder::new() + .text(format!( + "Are you sure you wish to delete {} {}?", + self.name, self.address + )) + .position(0.0, 40.0) + .alignment(ui::VAttach::Middle, ui::HAttach::Center) + .create(ui_container); + + // Confirm + let confirm = ui::ButtonBuilder::new() + .position(110.0, 100.0) + .size(200.0, 40.0) + .alignment(ui::VAttach::Middle, ui::HAttach::Center) + .create(ui_container); + { + let mut confirm = confirm.borrow_mut(); + let txt = ui::TextBuilder::new() + .text("Confirm") + .alignment(ui::VAttach::Middle, ui::HAttach::Center) + .attach(&mut *confirm); + confirm.add_text(txt); + let index = self.index; + confirm.add_click_func(move |_, game| { + Self::delete_server(index); + game.screen_sys + .replace_screen(Box::new(super::ServerList::new(None))); + true + }); + } + + // Cancel + let cancel = ui::ButtonBuilder::new() + .position(-110.0, 100.0) + .size(200.0, 40.0) + .alignment(ui::VAttach::Middle, ui::HAttach::Center) + .create(ui_container); + { + let mut cancel = cancel.borrow_mut(); + let txt = ui::TextBuilder::new() + .text("Cancel") + .alignment(ui::VAttach::Middle, ui::HAttach::Center) + .attach(&mut *cancel); + cancel.add_text(txt); + cancel.add_click_func(|_, game| { + game.screen_sys + .replace_screen(Box::new(super::ServerList::new(None))); + true + }); + } + + self.elements = Some(UIElements { + logo, + _prompt: prompt, + _confirm: confirm, + _cancel: cancel, + }); + } + + fn on_deactive(&mut self, _renderer: &mut render::Renderer, _ui_container: &mut ui::Container) { + // Clean up + self.elements = None + } + + fn tick( + &mut self, + _delta: f64, + renderer: &mut render::Renderer, + _ui_container: &mut ui::Container, + ) -> Option> { + let elements = self.elements.as_mut().unwrap(); + elements.logo.tick(renderer); + None + } + + fn is_closable(&self) -> bool { + true + } +} diff --git a/src/screen/mod.rs b/src/screen/mod.rs index 057e2a7..bbbb635 100644 --- a/src/screen/mod.rs +++ b/src/screen/mod.rs @@ -18,6 +18,7 @@ mod login; pub use self::login::*; pub mod connecting; +pub mod delete_server; pub mod edit_server; pub mod settings_menu; diff --git a/src/screen/server_list.rs b/src/screen/server_list.rs index c41f913..073dd4f 100644 --- a/src/screen/server_list.rs +++ b/src/screen/server_list.rs @@ -207,6 +207,15 @@ impl ServerList { .alignment(ui::VAttach::Middle, ui::HAttach::Center) .attach(&mut *btn); btn.add_text(txt); + let index = index; + let sname = name.clone(); + let saddr = address.clone(); + btn.add_click_func(move |_, game| { + game.screen_sys.replace_screen(Box::new( + super::delete_server::DeleteServerEntry::new(index, &sname, &saddr), + )); + true + }) } // Edit entry button