diff --git a/src/backend.rs b/src/backend.rs index 61aa4ac..ffa3472 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -36,7 +36,8 @@ enum BackendAction { GetRecordingsForPerson(i64, Sender>>), GetRecordingsForEnsemble(i64, Sender>>), GetRecordingsForWork(i64, Sender>>), - AddTracks(i64, Vec, Sender>), + UpdateTracks(i64, Vec, Sender>), + DeleteTracks(i64, Sender>), GetTracks(i64, Sender>>), Stop, } @@ -231,10 +232,21 @@ impl Backend { receiver.await? } - pub async fn add_tracks(&self, recording_id: i64, tracks: Vec) -> Result<()> { + pub async fn update_tracks( + &self, + recording_id: i64, + tracks: Vec, + ) -> Result<()> { let (sender, receiver) = oneshot::channel(); self.unwrap_action_sender()? - .send(AddTracks(recording_id, tracks, sender))?; + .send(UpdateTracks(recording_id, tracks, sender))?; + receiver.await? + } + + pub async fn delete_tracks(&self, recording_id: i64) -> Result<()> { + let (sender, receiver) = oneshot::channel(); + self.unwrap_action_sender()? + .send(DeleteTracks(recording_id, sender))?; receiver.await? } @@ -408,9 +420,14 @@ impl Backend { .send(db.get_recordings_for_work(id)) .expect("Failed to send result from database thread!"); } - AddTracks(recording_id, tracks, sender) => { + UpdateTracks(recording_id, tracks, sender) => { sender - .send(db.add_tracks(recording_id, tracks)) + .send(db.update_tracks(recording_id, tracks)) + .expect("Failed to send result from database thread!"); + } + DeleteTracks(recording_id, sender) => { + sender + .send(db.delete_tracks(recording_id)) .expect("Failed to send result from database thread!"); } GetTracks(recording_id, sender) => { diff --git a/src/database/database.rs b/src/database/database.rs index 97ce3e8..42ab52a 100644 --- a/src/database/database.rs +++ b/src/database/database.rs @@ -400,7 +400,9 @@ impl Database { Ok(recordings) } - pub fn add_tracks(&self, recording_id: i64, tracks: Vec) -> Result<()> { + pub fn update_tracks(&self, recording_id: i64, tracks: Vec) -> Result<()> { + self.delete_tracks(recording_id)?; + for (index, track_description) in tracks.iter().enumerate() { let track = Track { id: rand::random(), @@ -423,6 +425,11 @@ impl Database { Ok(()) } + pub fn delete_tracks(&self, recording_id: i64) -> Result<()> { + diesel::delete(tracks::table.filter(tracks::recording.eq(recording_id))).execute(&self.c)?; + Ok(()) + } + pub fn get_tracks(&self, recording_id: i64) -> Result> { let tracks = tracks::table .filter(tracks::recording.eq(recording_id)) diff --git a/src/dialogs/tracks_editor.rs b/src/dialogs/tracks_editor.rs index 9cea80a..34663c7 100644 --- a/src/dialogs/tracks_editor.rs +++ b/src/dialogs/tracks_editor.rs @@ -17,6 +17,8 @@ impl TracksEditor { pub fn new () + 'static, P: IsA>( backend: Rc, parent: &P, + recording: Option, + tracks: Vec, callback: F, ) -> Self { let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/tracks_editor.ui"); @@ -41,8 +43,8 @@ impl TracksEditor { window.close(); })); - let recording = Rc::new(RefCell::new(None::)); - let tracks = Rc::new(RefCell::new(Vec::::new())); + let recording = Rc::new(RefCell::new(recording)); + let tracks = Rc::new(RefCell::new(tracks)); let track_list = List::new( clone!(@strong recording => move |track: &TrackDescription| { @@ -132,7 +134,7 @@ impl TracksEditor { let tracks = tracks.clone(); let callback = callback.clone(); context.spawn_local(async move { - backend.add_tracks(recording.borrow().as_ref().unwrap().id, tracks.borrow().clone()).await.unwrap(); + backend.update_tracks(recording.borrow().as_ref().unwrap().id, tracks.borrow().clone()).await.unwrap(); callback(); window.close(); }); diff --git a/src/window.rs b/src/window.rs index 0709914..aa99658 100644 --- a/src/window.rs +++ b/src/window.rs @@ -74,7 +74,7 @@ impl Window { })); add_button.connect_clicked(clone!(@strong result => move |_| { - TracksEditor::new(result.backend.clone(), &result.window, clone!(@strong result => move || { + TracksEditor::new(result.backend.clone(), &result.window, None, Vec::new(), clone!(@strong result => move || { result.reload(); })).show(); })); @@ -141,7 +141,7 @@ impl Window { result.window, "add-tracks", clone!(@strong result => move |_, _| { - TracksEditor::new(result.backend.clone(), &result.window, clone!(@strong result => move || { + TracksEditor::new(result.backend.clone(), &result.window, None, Vec::new(), clone!(@strong result => move || { result.reload(); })).show(); })