Remove old navigator

This commit is contained in:
Elias Projahn 2021-02-03 16:23:47 +01:00
parent ee71a905e1
commit 1b6f4ab51e
4 changed files with 0 additions and 207 deletions

View file

@ -97,8 +97,6 @@ sources = files(
'widgets/indexed_list_model.rs', 'widgets/indexed_list_model.rs',
'widgets/list.rs', 'widgets/list.rs',
'widgets/mod.rs', 'widgets/mod.rs',
'widgets/navigator.rs',
'widgets/navigator_window.rs',
'widgets/player_bar.rs', 'widgets/player_bar.rs',
'widgets/poe_list.rs', 'widgets/poe_list.rs',
'widgets/screen.rs', 'widgets/screen.rs',

View file

@ -12,12 +12,6 @@ pub use entry_row::*;
pub mod list; pub mod list;
pub use list::*; pub use list::*;
pub mod navigator;
pub use navigator::*;
pub mod navigator_window;
pub use navigator_window::*;
pub mod player_bar; pub mod player_bar;
pub use player_bar::*; pub use player_bar::*;

View file

@ -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<Navigator>);
fn get_widget(&self) -> gtk::Widget;
fn detach_navigator(&self);
}
pub struct Navigator {
pub window: gtk::Window,
pub widget: gtk::Stack,
screens: RefCell<Vec<Rc<dyn NavigatorScreen>>>,
old_screens: RefCell<Vec<Rc<dyn NavigatorScreen>>>,
back_cb: RefCell<Option<Box<dyn Fn() -> ()>>>,
}
impl Navigator {
pub fn new<W, S>(window: &W, empty_screen: &S) -> Rc<Self>
where
W: IsA<gtk::Window>,
S: IsA<gtk::Widget>,
{
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<F>(&self, cb: F)
where
F: Fn() -> () + 'static,
{
self.back_cb.replace(Some(Box::new(cb)));
}
pub fn push<S>(self: Rc<Self>, screen: Rc<S>)
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<Self>) {
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<S>(self: Rc<Self>, screen: Rc<S>)
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();
}
}

View file

@ -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<Navigator>,
}
impl NavigatorWindow {
/// Create a new navigator window showing an initial screen.
pub fn new<S: NavigatorScreen + 'static>(initial_screen: Rc<S>) -> Rc<Self> {
// 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<W: IsA<gtk::Window>>(&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();
}
}