,
+}
+
+impl RecordingSelector {
+ pub fn new(backend: Rc, parent: &P, callback: F) -> Rc
+ where
+ P: IsA,
+ F: Fn(RecordingDescription) -> () + 'static,
+ {
+ let builder =
+ gtk::Builder::from_resource("/de/johrpan/musicus_editor/ui/recording_selector.ui");
+
+ get_widget!(builder, gtk::Window, window);
+ get_widget!(builder, libhandy::Leaflet, leaflet);
+ get_widget!(builder, gtk::Button, add_button);
+ get_widget!(builder, gtk::Box, sidebar_box);
+ get_widget!(builder, gtk::Box, empty_screen);
+
+ let person_list = PersonList::new(backend.clone());
+ sidebar_box.pack_start(&person_list.widget, true, true, 0);
+
+ let navigator = Navigator::new(&empty_screen);
+ leaflet.add(&navigator.widget);
+
+ let result = Rc::new(Self {
+ backend: backend,
+ window: window,
+ callback: Box::new(callback),
+ leaflet: leaflet,
+ navigator: navigator,
+ });
+
+ add_button.connect_clicked(clone!(@strong result => move |_| {
+ let editor = RecordingEditor::new(
+ result.backend.clone(),
+ &result.window,
+ None,
+ clone!(@strong result => move |recording| {
+ result.select(recording);
+ }),
+ );
+
+ editor.show();
+ }));
+
+ person_list.set_selected(clone!(@strong result => move |person| {
+ result.navigator.clone().replace(RecordingSelectorPersonScreen::new(result.backend.clone(), result.clone(), person.clone()));
+ result.leaflet.set_visible_child(&result.navigator.widget);
+ }));
+
+ result.window.set_transient_for(Some(parent));
+
+ result
+ }
+
+ pub fn show(&self) {
+ self.window.show();
+ }
+
+ pub fn select(&self, recording: RecordingDescription) {
+ self.window.close();
+ (self.callback)(recording);
+ }
+}
+
+struct RecordingSelectorPersonScreen {
+ backend: Rc,
+ selector: Rc,
+ widget: gtk::Box,
+ stack: gtk::Stack,
+ work_list: Rc>,
+ navigator: RefCell