use gtk::glib; use gtk::prelude::*; use super::state::{View, ViewManager}; use std::rc::Rc; pub struct Welcome { vm : Rc } impl View for Welcome { fn name(&self) -> &str { "welcome" } fn set_vm(&mut self, vm : Rc) { self.vm = vm } fn make_current(&self) -> Option { let splash = gtk::Window::new(gtk::WindowType::Popup); splash.set_type_hint(gtk::gdk::WindowTypeHint::Splashscreen); splash.set_decorated(false); splash.set_position(gtk::WindowPosition::Center); splash.set_resizable(false); splash.set_size_request(300, 200); let center = gtk::Box::new(gtk::Orientation::Vertical, 10); let main = gtk::Box::new(gtk::Orientation::Horizontal, 10); let gen_button = gtk::Button::with_label("Generate"); let load_button = gtk::Button::with_label("Load"); main.pack_start(&gen_button, true, true, 0); main.pack_start(&load_button, true, true, 0); main.set_height_request(50); main.set_homogeneous(true); let bt = include_bytes!("icon.svg"); let loader = gtk::gdk_pixbuf::PixbufLoader::new(); loader.write(bt).ok(); loader.set_size(100, 100); loader.close().ok(); let pixbuf = loader.pixbuf().unwrap(); let image = gtk::Image::from_pixbuf(Some(&pixbuf)); center.pack_start(&image, true, true, 0); center.pack_start(&main, true, false, 0); self.vm.get_window().set_type_hint(gtk::gdk::WindowTypeHint::Splashscreen); let vm = Rc::clone(&self.vm); gen_button.connect_clicked(glib::clone!(@weak splash => move |_| { vm.set_current_view("generate"); splash.close(); })); let vm = Rc::clone(&self.vm); load_button.connect_clicked(glib::clone!(@weak splash => move |_| { vm.set_current_view("load"); splash.close(); })); let vm = Rc::clone(&self.vm); splash.connect_hide(move |_| { if vm.get_current_view() == "welcome" { vm.get_window().application().unwrap().quit(); } }); center.set_margin(10); splash.add(¢er); splash.show_all(); None } } impl Welcome { pub fn new() -> Self { Self { vm : Rc::new(ViewManager::empty()) } } }