From 4bb92a3c27bcba7256d9a822b1c3cf59934e3740 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 1 Nov 2020 11:28:16 +0100 Subject: [PATCH] Show tracks in recording screen --- res/ui/recording_screen.ui | 98 ++++++++++++++++++++++++++++++++- src/database/models.rs | 4 +- src/screens/recording_screen.rs | 50 +++++++++++++++++ 3 files changed, 148 insertions(+), 4 deletions(-) diff --git a/res/ui/recording_screen.ui b/res/ui/recording_screen.ui index b5c17c6..0916c2a 100644 --- a/res/ui/recording_screen.ui +++ b/res/ui/recording_screen.ui @@ -1,8 +1,8 @@ - - + + True False @@ -53,7 +53,99 @@ - + + True + False + + + True + False + True + + + loading + + + + + True + True + + + True + False + none + + + True + False + 18 + vertical + 18 + + + True + False + vertical + 12 + + + True + False + start + Tracks + + + + + + False + True + 0 + + + + + True + False + 0 + in + + + + + + False + True + 1 + + + + + False + True + 1 + + + + + + + + + content + 1 + + + + + + + + True + True + 1 + diff --git a/src/database/models.rs b/src/database/models.rs index e0a79d5..e9cdd6b 100644 --- a/src/database/models.rs +++ b/src/database/models.rs @@ -192,7 +192,9 @@ impl From for TrackDescription { fn from(track: Track) -> Self { let mut work_parts = Vec::::new(); for part in track.work_parts.split(",") { - work_parts.push(part.parse().unwrap()); + if !part.is_empty() { + work_parts.push(part.parse().unwrap()); + } } TrackDescription { diff --git a/src/screens/recording_screen.rs b/src/screens/recording_screen.rs index 4158a69..634716e 100644 --- a/src/screens/recording_screen.rs +++ b/src/screens/recording_screen.rs @@ -9,7 +9,9 @@ use std::cell::RefCell; use std::rc::Rc; pub struct RecordingScreen { + backend: Rc, widget: gtk::Box, + stack: gtk::Stack, navigator: RefCell>>, } @@ -22,6 +24,8 @@ impl RecordingScreen { get_widget!(builder, libhandy::HeaderBar, header); get_widget!(builder, gtk::Button, back_button); get_widget!(builder, gtk::MenuButton, menu_button); + get_widget!(builder, gtk::Stack, stack); + get_widget!(builder, gtk::Frame, frame); header.set_title(Some(&recording.work.get_title())); header.set_subtitle(Some(&recording.get_performers())); @@ -44,8 +48,45 @@ impl RecordingScreen { menu_button.set_menu_model(Some(&menu)); + let recording = Rc::new(recording); + let list = List::new( + clone!(@strong recording => move |track: &TrackDescription| { + let mut title_parts = Vec::::new(); + for part in &track.work_parts { + title_parts.push(recording.work.parts[*part].title.clone()); + } + + let title = if title_parts.is_empty() { + String::from("Unknown") + } else { + title_parts.join(", ") + }; + + let title_label = gtk::Label::new(Some(&title)); + title_label.set_ellipsize(pango::EllipsizeMode::End); + title_label.set_halign(gtk::Align::Start); + + let file_name_label = gtk::Label::new(Some(&track.file_name)); + file_name_label.set_ellipsize(pango::EllipsizeMode::End); + file_name_label.set_opacity(0.5); + file_name_label.set_halign(gtk::Align::Start); + + let vbox = gtk::Box::new(gtk::Orientation::Vertical, 0); + vbox.add(&title_label); + vbox.add(&file_name_label); + + vbox.upcast() + }), + |_| true, + "No tracks found.", + ); + + frame.add(&list.widget); + let result = Rc::new(Self { + backend, widget, + stack, navigator: RefCell::new(None), }); @@ -56,6 +97,15 @@ impl RecordingScreen { } })); + let context = glib::MainContext::default(); + let clone = result.clone(); + let id = recording.id; + context.spawn_local(async move { + let tracks = clone.backend.get_tracks(id).await.unwrap(); + list.show_items(tracks); + clone.stack.set_visible_child_name("content"); + }); + result } }