use gtk::glib; use gtk::prelude::*; use super::state::{View, ViewManager}; use std::rc::Rc; use std::thread; 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); let container = gtk::Box::new(gtk::Orientation::Vertical, 0); let spinner = gtk::Spinner::builder().active(true).build(); container.pack_start(>k::Label::new(Some("Loading")), false, false, 50); container.pack_start(&spinner, false, true, 0); splash.add(&container); splash.show_all(); let (tx, rx) = glib::MainContext::channel(glib::Priority::default()); let path = uri.trim_start_matches("file://").to_string(); thread::spawn(move || { let index = Index::from_file(&path); tx.send(index).ok(); }); rx.attach(None, move |index| { vm.set_index(index); vm.set_current_view("search"); splash.close(); glib::Continue(false) }); } else { vm.set_current_view("welcome"); } }); None } } impl Load { pub fn new() -> Self { Self { vm : Rc::new(ViewManager::empty()) } } }