diff --git a/src/meson.build b/src/meson.build index e4179f0..22731f4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -97,8 +97,6 @@ sources = files( 'widgets/indexed_list_model.rs', 'widgets/list.rs', 'widgets/mod.rs', - 'widgets/navigator.rs', - 'widgets/navigator_window.rs', 'widgets/player_bar.rs', 'widgets/poe_list.rs', 'widgets/screen.rs', diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs index 5a0626a..e1f8135 100644 --- a/src/widgets/mod.rs +++ b/src/widgets/mod.rs @@ -12,12 +12,6 @@ pub use entry_row::*; pub mod list; pub use list::*; -pub mod navigator; -pub use navigator::*; - -pub mod navigator_window; -pub use navigator_window::*; - pub mod player_bar; pub use player_bar::*; diff --git a/src/widgets/navigator.rs b/src/widgets/navigator.rs deleted file mode 100644 index f9a4a9f..0000000 --- a/src/widgets/navigator.rs +++ /dev/null @@ -1,151 +0,0 @@ -use glib::clone; -use gtk::prelude::*; -use std::cell::RefCell; -use std::rc::Rc; - -pub trait NavigatorScreen { - fn attach_navigator(&self, navigator: Rc); - fn get_widget(&self) -> gtk::Widget; - fn detach_navigator(&self); -} - -pub struct Navigator { - pub window: gtk::Window, - pub widget: gtk::Stack, - screens: RefCell>>, - old_screens: RefCell>>, - back_cb: RefCell ()>>>, -} - -impl Navigator { - pub fn new(window: &W, empty_screen: &S) -> Rc - where - W: IsA, - S: IsA, - { - let widget = gtk::Stack::new(); - widget.set_hhomogeneous(false); - widget.set_vhomogeneous(false); - widget.set_interpolate_size(true); - widget.set_transition_type(gtk::StackTransitionType::Crossfade); - widget.set_hexpand(true); - widget.add_named(empty_screen, Some("empty_screen")); - widget.show(); - - let result = Rc::new(Self { - window: window.clone().upcast(), - widget, - screens: RefCell::new(Vec::new()), - old_screens: RefCell::new(Vec::new()), - back_cb: RefCell::new(None), - }); - - unsafe { - result.widget.connect_notify_unsafe( - Some("transition-running"), - clone!(@strong result => move |_, _| { - if !result.widget.get_transition_running() { - result.clear_old_screens(); - } - }), - ); - } - - result - } - - pub fn set_back_cb(&self, cb: F) - where - F: Fn() -> () + 'static, - { - self.back_cb.replace(Some(Box::new(cb))); - } - - pub fn push(self: Rc, screen: Rc) - where - S: NavigatorScreen + 'static, - { - if let Some(screen) = self.screens.borrow().last() { - screen.detach_navigator(); - } - - let widget = screen.get_widget(); - self.widget.add_child(&widget); - self.widget.set_visible_child(&widget); - - screen.attach_navigator(self.clone()); - self.screens.borrow_mut().push(screen); - } - - pub fn pop(self: Rc) { - let popped = if let Some(screen) = self.screens.borrow_mut().pop() { - screen.detach_navigator(); - self.old_screens.borrow_mut().push(screen); - - true - } else { - false - }; - - if popped { - if let Some(screen) = self.screens.borrow().last() { - let widget = screen.get_widget(); - self.widget.set_visible_child(&widget); - - screen.attach_navigator(self.clone()); - } else { - self.widget.set_visible_child_name("empty_screen"); - if let Some(cb) = &*self.back_cb.borrow() { - cb() - } - } - - if !self.widget.get_transition_running() { - self.clear_old_screens(); - } - } - } - - pub fn replace(self: Rc, screen: Rc) - where - S: NavigatorScreen + 'static, - { - for screen in self.screens.replace(Vec::new()) { - screen.detach_navigator(); - self.old_screens.borrow_mut().push(screen); - } - - let widget = screen.get_widget(); - self.widget.add_child(&widget); - self.widget.set_visible_child(&widget); - - screen.attach_navigator(self.clone()); - self.screens.borrow_mut().push(screen); - - if !self.widget.get_transition_running() { - self.clear_old_screens(); - } - } - - pub fn reset(&self) { - self.widget.set_visible_child_name("empty_screen"); - - for screen in self.screens.replace(Vec::new()) { - screen.detach_navigator(); - self.old_screens.borrow_mut().push(screen); - } - - if !self.widget.get_transition_running() { - self.clear_old_screens(); - } - } - - fn clear_old_screens(&self) { - for screen in self.old_screens.borrow().iter() { - self.widget.remove(&screen.get_widget()); - } - - self.old_screens.borrow_mut().clear(); - } -} - diff --git a/src/widgets/navigator_window.rs b/src/widgets/navigator_window.rs deleted file mode 100644 index d077740..0000000 --- a/src/widgets/navigator_window.rs +++ /dev/null @@ -1,48 +0,0 @@ -use crate::widgets::{Navigator, NavigatorScreen}; -use glib::clone; -use gtk::prelude::*; -use std::rc::Rc; - -/// A window hosting a navigator. -pub struct NavigatorWindow { - window: libadwaita::Window, - navigator: Rc, -} - -impl NavigatorWindow { - /// Create a new navigator window showing an initial screen. - pub fn new(initial_screen: Rc) -> Rc { - // Create UI - - let window = libadwaita::Window::new(); - window.set_default_size(600, 424); - let placeholder = gtk::Label::new(None); - let navigator = Navigator::new(&window, &placeholder); - libadwaita::WindowExt::set_child(&window, Some(&navigator.widget)); - - let this = Rc::new(Self { window, navigator }); - - // Connect signals and callbacks - - this.navigator.set_back_cb(clone!(@strong this => move || { - this.window.close(); - })); - - // Initialize - - this.navigator.clone().replace(initial_screen); - - this - } - - /// Make the wrapped window transient. This will make the window modal. - pub fn set_transient_for>(&self, window: &W) { - self.window.set_modal(true); - self.window.set_transient_for(Some(window)); - } - - /// Show the navigator window. - pub fn show(&self) { - self.window.show(); - } -}