Add methods to update and delete tracks

This commit is contained in:
Elias Projahn 2020-11-05 08:11:04 +01:00
parent e95129a44f
commit c12d8b01bd
4 changed files with 37 additions and 11 deletions

View file

@ -36,7 +36,8 @@ enum BackendAction {
GetRecordingsForPerson(i64, Sender<Result<Vec<RecordingDescription>>>), GetRecordingsForPerson(i64, Sender<Result<Vec<RecordingDescription>>>),
GetRecordingsForEnsemble(i64, Sender<Result<Vec<RecordingDescription>>>), GetRecordingsForEnsemble(i64, Sender<Result<Vec<RecordingDescription>>>),
GetRecordingsForWork(i64, Sender<Result<Vec<RecordingDescription>>>), GetRecordingsForWork(i64, Sender<Result<Vec<RecordingDescription>>>),
AddTracks(i64, Vec<TrackDescription>, Sender<Result<()>>), UpdateTracks(i64, Vec<TrackDescription>, Sender<Result<()>>),
DeleteTracks(i64, Sender<Result<()>>),
GetTracks(i64, Sender<Result<Vec<TrackDescription>>>), GetTracks(i64, Sender<Result<Vec<TrackDescription>>>),
Stop, Stop,
} }
@ -231,10 +232,21 @@ impl Backend {
receiver.await? receiver.await?
} }
pub async fn add_tracks(&self, recording_id: i64, tracks: Vec<TrackDescription>) -> Result<()> { pub async fn update_tracks(
&self,
recording_id: i64,
tracks: Vec<TrackDescription>,
) -> Result<()> {
let (sender, receiver) = oneshot::channel(); let (sender, receiver) = oneshot::channel();
self.unwrap_action_sender()? 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? receiver.await?
} }
@ -408,9 +420,14 @@ impl Backend {
.send(db.get_recordings_for_work(id)) .send(db.get_recordings_for_work(id))
.expect("Failed to send result from database thread!"); .expect("Failed to send result from database thread!");
} }
AddTracks(recording_id, tracks, sender) => { UpdateTracks(recording_id, tracks, sender) => {
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!"); .expect("Failed to send result from database thread!");
} }
GetTracks(recording_id, sender) => { GetTracks(recording_id, sender) => {

View file

@ -400,7 +400,9 @@ impl Database {
Ok(recordings) Ok(recordings)
} }
pub fn add_tracks(&self, recording_id: i64, tracks: Vec<TrackDescription>) -> Result<()> { pub fn update_tracks(&self, recording_id: i64, tracks: Vec<TrackDescription>) -> Result<()> {
self.delete_tracks(recording_id)?;
for (index, track_description) in tracks.iter().enumerate() { for (index, track_description) in tracks.iter().enumerate() {
let track = Track { let track = Track {
id: rand::random(), id: rand::random(),
@ -423,6 +425,11 @@ impl Database {
Ok(()) 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<Vec<TrackDescription>> { pub fn get_tracks(&self, recording_id: i64) -> Result<Vec<TrackDescription>> {
let tracks = tracks::table let tracks = tracks::table
.filter(tracks::recording.eq(recording_id)) .filter(tracks::recording.eq(recording_id))

View file

@ -17,6 +17,8 @@ impl TracksEditor {
pub fn new<F: Fn() -> () + 'static, P: IsA<gtk::Window>>( pub fn new<F: Fn() -> () + 'static, P: IsA<gtk::Window>>(
backend: Rc<Backend>, backend: Rc<Backend>,
parent: &P, parent: &P,
recording: Option<RecordingDescription>,
tracks: Vec<TrackDescription>,
callback: F, callback: F,
) -> Self { ) -> Self {
let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/tracks_editor.ui"); let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/tracks_editor.ui");
@ -41,8 +43,8 @@ impl TracksEditor {
window.close(); window.close();
})); }));
let recording = Rc::new(RefCell::new(None::<RecordingDescription>)); let recording = Rc::new(RefCell::new(recording));
let tracks = Rc::new(RefCell::new(Vec::<TrackDescription>::new())); let tracks = Rc::new(RefCell::new(tracks));
let track_list = List::new( let track_list = List::new(
clone!(@strong recording => move |track: &TrackDescription| { clone!(@strong recording => move |track: &TrackDescription| {
@ -132,7 +134,7 @@ impl TracksEditor {
let tracks = tracks.clone(); let tracks = tracks.clone();
let callback = callback.clone(); let callback = callback.clone();
context.spawn_local(async move { 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(); callback();
window.close(); window.close();
}); });

View file

@ -74,7 +74,7 @@ impl Window {
})); }));
add_button.connect_clicked(clone!(@strong result => move |_| { 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(); result.reload();
})).show(); })).show();
})); }));
@ -141,7 +141,7 @@ impl Window {
result.window, result.window,
"add-tracks", "add-tracks",
clone!(@strong result => move |_, _| { 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(); result.reload();
})).show(); })).show();
}) })