mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 19:57:25 +01:00
Add methods to update and delete tracks
This commit is contained in:
parent
e95129a44f
commit
c12d8b01bd
4 changed files with 37 additions and 11 deletions
|
|
@ -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) => {
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue