aboutsummaryrefslogtreecommitdiff
path: root/src/gui/load.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/load.rs')
-rw-r--r--src/gui/load.rs63
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(&gtk::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()) }
+ }
+}