Show tracks in recording screen

This commit is contained in:
Elias Projahn 2020-11-01 11:28:16 +01:00
parent 54e743b876
commit 4bb92a3c27
3 changed files with 148 additions and 4 deletions

View file

@ -192,7 +192,9 @@ impl From<Track> for TrackDescription {
fn from(track: Track) -> Self {
let mut work_parts = Vec::<usize>::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 {

View file

@ -9,7 +9,9 @@ use std::cell::RefCell;
use std::rc::Rc;
pub struct RecordingScreen {
backend: Rc<Backend>,
widget: gtk::Box,
stack: gtk::Stack,
navigator: RefCell<Option<Rc<Navigator>>>,
}
@ -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::<String>::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
}
}