Replace stack with new navigator widget

This commit is contained in:
Elias Projahn 2020-10-17 11:31:43 +02:00
parent cefd7dad95
commit 9a9a181739
8 changed files with 268 additions and 206 deletions

View file

@ -1,3 +1,4 @@
use super::*;
use crate::backend::*;
use crate::database::*;
use crate::widgets::*;
@ -9,10 +10,11 @@ use std::cell::RefCell;
use std::rc::Rc;
pub struct EnsembleScreen {
pub widget: gtk::Box,
backend: Rc<Backend>,
widget: gtk::Box,
stack: gtk::Stack,
recording_list: Rc<List<RecordingDescription>>,
back: RefCell<Option<Box<dyn Fn() -> () + 'static>>>,
navigator: RefCell<Option<Rc<Navigator>>>,
}
impl EnsembleScreen {
@ -59,10 +61,11 @@ impl EnsembleScreen {
recording_frame.add(&recording_list.widget.clone());
let result = Rc::new(Self {
backend,
widget,
stack,
recording_list,
back: RefCell::new(None),
navigator: RefCell::new(None),
});
search_entry.connect_search_changed(clone!(@strong result => move |_| {
@ -70,15 +73,26 @@ impl EnsembleScreen {
}));
back_button.connect_clicked(clone!(@strong result => move |_| {
if let Some(back) = &*result.back.borrow() {
back();
let navigator = result.navigator.borrow().clone();
if let Some(navigator) = navigator {
navigator.pop();
}
}));
result
.recording_list
.set_selected(clone!(@strong result => move |recording| {
let navigator = result.navigator.borrow().clone();
if let Some(navigator) = navigator {
navigator.push(RecordingScreen::new(result.backend.clone(), recording.clone()));
}
}));
let context = glib::MainContext::default();
let clone = result.clone();
context.spawn_local(async move {
let recordings = backend
let recordings = clone
.backend
.get_recordings_for_ensemble(ensemble.id)
.await
.unwrap();
@ -93,18 +107,18 @@ impl EnsembleScreen {
result
}
}
pub fn set_back<B>(&self, back: B)
where
B: Fn() -> () + 'static,
{
self.back.replace(Some(Box::new(back)));
impl NavigatorScreen for EnsembleScreen {
fn attach_navigator(&self, navigator: Rc<Navigator>) {
self.navigator.replace(Some(navigator));
}
pub fn set_recording_selected<S>(&self, selected: S)
where
S: Fn(&RecordingDescription) -> () + 'static,
{
self.recording_list.set_selected(selected);
fn get_widget(&self) -> gtk::Widget {
self.widget.clone().upcast()
}
fn detach_navigator(&self) {
self.navigator.replace(None);
}
}