use std::sync::Mutex; use std::rc::Rc; use gtk::prelude::*; use gtk::Application; use gtk::gdk; use self::state::View; mod state; mod welcome; mod generate; mod search; mod load; pub fn run() { let app = Application::builder() .application_id("org.n8.indexsearch") .build(); app.connect_activate(|app| { let provider = gtk::CssProvider::new(); let style = include_bytes!("style.css"); provider.load_from_data(style).expect("failed to load default style"); gtk::StyleContext::add_provider_for_screen( &gdk::Screen::default().expect("error initializing gtk css provider"), &provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION ); let window = gtk::ApplicationWindow::builder() .application(app) .default_width(800) .default_height(600) .title("Index Search") .build(); window.set_widget_name("mainwindow"); let mut vm = state::ViewManager::new(window); let welcome = Rc::new(Mutex::new(welcome::Welcome::new())); vm.add_view(welcome.clone()); let generate = Rc::new(Mutex::new(generate::Generate::new())); vm.add_view(generate.clone()); let load = Rc::new(Mutex::new(load::Load::new())); vm.add_view(load.clone()); let search = Rc::new(Mutex::new(search::Search::new())); vm.add_view(search.clone()); let vm = Rc::new(vm); welcome.lock().unwrap().set_vm(Rc::clone(&vm)); generate.lock().unwrap().set_vm(Rc::clone(&vm)); load.lock().unwrap().set_vm(Rc::clone(&vm)); search.lock().unwrap().set_vm(Rc::clone(&vm)); vm.set_current_view("welcome"); }); app.run(); }