diff options
Diffstat (limited to 'src/gui/load.rs')
| -rw-r--r-- | src/gui/load.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/gui/load.rs b/src/gui/load.rs new file mode 100644 index 0000000..e075d0f --- /dev/null +++ b/src/gui/load.rs @@ -0,0 +1,63 @@ +use gtk::glib; +use gtk::prelude::*; +use super::state::{View, ViewManager}; +use std::rc::Rc; + +use crate::index::Index; + +pub struct Load { + vm : Rc<ViewManager> +} + +impl View for Load { + fn name(&self) -> &str { + "load" + } + + fn set_vm(&mut self, vm : Rc<ViewManager>) { + self.vm = vm + } + + fn make_current(&self) -> Option<gtk::Box> { + 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()) } + } +} |