use gtk::glib; use gtk::prelude::*; use super::state::{View, ViewManager}; use std::rc::Rc; use crate::index::Index; pub struct Load { vm : Rc } impl View for Load { fn name(&self) -> &str { "load" } fn set_vm(&mut self, vm : Rc) { self.vm = vm } fn make_current(&self) -> Option { let vm = Rc::clone(&self.vm); glib::MainContext::default().spawn_local(async move { let dialog = gtk::FileChooserDialog::builder() .action(gtk::FileChooserAction::Open) .transient_for(vm.get_window()) .title("Open Index File") .build(); dialog.add_button("Choose", gtk::ResponseType::Accept); let _ = dialog.run_future().await; dialog.close(); dialog.hide(); if let Some(uri) = dialog.uri() { 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); splash.add(>k::Label::new(Some("Loading"))); splash.show_all(); let path = uri.trim_start_matches("file://").to_string(); let index = Index::from_file(&path); vm.set_index(index); vm.set_current_view("search"); splash.close(); } else { vm.set_current_view("welcome"); } }); None } } impl Load { pub fn new() -> Self { Self { vm : Rc::new(ViewManager::empty()) } } }