diff --git a/musicus/res/ui/medium_preview.ui b/musicus/res/ui/medium_preview.ui
index 5f25d3f..adf95e4 100644
--- a/musicus/res/ui/medium_preview.ui
+++ b/musicus/res/ui/medium_preview.ui
@@ -53,6 +53,11 @@
+
+
+
@@ -61,7 +66,7 @@
diff --git a/musicus/src/import/import_screen.rs b/musicus/src/import/import_screen.rs
index e77841d..4b998a5 100644
--- a/musicus/src/import/import_screen.rs
+++ b/musicus/src/import/import_screen.rs
@@ -153,7 +153,7 @@ impl Screen, ()> for ImportScreen {
add_button.connect_clicked(clone!(@weak this => move |_| {
spawn!(@clone this, async move {
- if let Some(medium) = push!(this.handle, MediumEditor, Arc::clone(&this.session)).await {
+ if let Some(medium) = push!(this.handle, MediumEditor, (Arc::clone(&this.session), None)).await {
this.select_medium(medium);
}
});
diff --git a/musicus/src/import/medium_editor.rs b/musicus/src/import/medium_editor.rs
index ce37254..46483f6 100644
--- a/musicus/src/import/medium_editor.rs
+++ b/musicus/src/import/medium_editor.rs
@@ -1,4 +1,4 @@
-use super::track_set_editor::{TrackSetData, TrackSetEditor};
+use super::track_set_editor::{TrackData, TrackSetData, TrackSetEditor};
use crate::navigator::{NavigationHandle, Screen};
use crate::widgets::{List, Widget};
use anyhow::Result;
@@ -26,9 +26,9 @@ pub struct MediumEditor {
track_sets: RefCell>,
}
-impl Screen, Medium> for MediumEditor {
+impl Screen<(Arc, Option), Medium> for MediumEditor {
/// Create a new medium editor.
- fn new(session: Arc, handle: NavigationHandle) -> Rc {
+ fn new((session, medium): (Arc, Option), handle: NavigationHandle) -> Rc {
// Create UI
let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/medium_editor.ui");
@@ -126,6 +126,37 @@ impl Screen, Medium> for MediumEditor {
this.handle.pop(None);
}));
+ // Initialize, if necessary.
+
+ if let Some(medium) = medium {
+ this.name_entry.set_text(&medium.name);
+
+ let mut track_sets: Vec = Vec::new();
+
+ for track in medium.tracks {
+ let track_data = TrackData {
+ track_source: track.source_index,
+ work_parts: track.work_parts,
+ };
+
+ if let Some(track_set) = track_sets.last_mut() {
+ if track.recording.id == track_set.recording.id {
+ track_set.tracks.push(track_data);
+ continue;
+ }
+ }
+
+ track_sets.push(TrackSetData {
+ recording: track.recording,
+ tracks: vec![track_data],
+ });
+ }
+
+ let length = track_sets.len();
+ this.track_sets.replace(track_sets);
+ this.track_set_list.update(length);
+ }
+
this
}
}
diff --git a/musicus/src/import/medium_preview.rs b/musicus/src/import/medium_preview.rs
index 829ab69..d945c7d 100644
--- a/musicus/src/import/medium_preview.rs
+++ b/musicus/src/import/medium_preview.rs
@@ -1,12 +1,14 @@
+use super::medium_editor::MediumEditor;
use crate::navigator::{NavigationHandle, Screen};
use crate::widgets::Widget;
-use anyhow::Result;
+use anyhow::{anyhow, Result};
use gettextrs::gettext;
use glib::clone;
use gtk::prelude::*;
use gtk_macros::get_widget;
use musicus_backend::db::Medium;
use musicus_backend::import::{ImportSession, State};
+use std::cell::RefCell;
use std::path::PathBuf;
use std::rc::Rc;
use std::sync::Arc;
@@ -15,10 +17,12 @@ use std::sync::Arc;
pub struct MediumPreview {
handle: NavigationHandle<()>,
session: Arc,
- medium: Medium,
+ medium: RefCell