mirror of
				https://github.com/johrpan/musicus.git
				synced 2025-10-26 11:47:25 +01:00 
			
		
		
		
	Add edit and delete function to detail screens
This commit is contained in:
		
							parent
							
								
									026880739c
								
							
						
					
					
						commit
						0c16f6f4c6
					
				
					 6 changed files with 185 additions and 0 deletions
				
			
		|  | @ -13,12 +13,16 @@ enum BackendAction { | ||||||
|     DeleteInstrument(i64, Sender<Result<()>>), |     DeleteInstrument(i64, Sender<Result<()>>), | ||||||
|     GetInstruments(Sender<Result<Vec<Instrument>>>), |     GetInstruments(Sender<Result<Vec<Instrument>>>), | ||||||
|     UpdateWork(WorkInsertion, Sender<Result<()>>), |     UpdateWork(WorkInsertion, Sender<Result<()>>), | ||||||
|  |     GetWorkDescription(i64, Sender<Result<WorkDescription>>), | ||||||
|  |     DeleteWork(i64, Sender<Result<()>>), | ||||||
|     GetWorkDescriptions(i64, Sender<Result<Vec<WorkDescription>>>), |     GetWorkDescriptions(i64, Sender<Result<Vec<WorkDescription>>>), | ||||||
|     UpdateEnsemble(Ensemble, Sender<Result<()>>), |     UpdateEnsemble(Ensemble, Sender<Result<()>>), | ||||||
|     GetEnsemble(i64, Sender<Result<Ensemble>>), |     GetEnsemble(i64, Sender<Result<Ensemble>>), | ||||||
|     DeleteEnsemble(i64, Sender<Result<()>>), |     DeleteEnsemble(i64, Sender<Result<()>>), | ||||||
|     GetEnsembles(Sender<Result<Vec<Ensemble>>>), |     GetEnsembles(Sender<Result<Vec<Ensemble>>>), | ||||||
|     UpdateRecording(RecordingInsertion, Sender<Result<()>>), |     UpdateRecording(RecordingInsertion, Sender<Result<()>>), | ||||||
|  |     GetRecordingDescription(i64, Sender<Result<RecordingDescription>>), | ||||||
|  |     DeleteRecording(i64, Sender<Result<()>>), | ||||||
|     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>>>), | ||||||
|  | @ -86,6 +90,16 @@ impl Backend { | ||||||
|                             .send(db.update_work(work)) |                             .send(db.update_work(work)) | ||||||
|                             .expect("Failed to send result from database thread!"); |                             .expect("Failed to send result from database thread!"); | ||||||
|                     } |                     } | ||||||
|  |                     GetWorkDescription(id, sender) => { | ||||||
|  |                         sender | ||||||
|  |                             .send(db.get_work_description(id)) | ||||||
|  |                             .expect("Failed to send result from database thread!"); | ||||||
|  |                     } | ||||||
|  |                     DeleteWork(id, sender) => { | ||||||
|  |                         sender | ||||||
|  |                             .send(db.delete_work(id)) | ||||||
|  |                             .expect("Failed to send result from database thread!"); | ||||||
|  |                     } | ||||||
|                     GetWorkDescriptions(id, sender) => { |                     GetWorkDescriptions(id, sender) => { | ||||||
|                         sender |                         sender | ||||||
|                             .send(db.get_work_descriptions(id)) |                             .send(db.get_work_descriptions(id)) | ||||||
|  | @ -116,6 +130,16 @@ impl Backend { | ||||||
|                             .send(db.update_recording(recording)) |                             .send(db.update_recording(recording)) | ||||||
|                             .expect("Failed to send result from database thread!"); |                             .expect("Failed to send result from database thread!"); | ||||||
|                     } |                     } | ||||||
|  |                     GetRecordingDescription(id, sender) => { | ||||||
|  |                         sender | ||||||
|  |                             .send(db.get_recording_description(id)) | ||||||
|  |                             .expect("Failed to send result from database thread!"); | ||||||
|  |                     } | ||||||
|  |                     DeleteRecording(id, sender) => { | ||||||
|  |                         sender | ||||||
|  |                             .send(db.delete_recording(id)) | ||||||
|  |                             .expect("Failed to send result from database thread!"); | ||||||
|  |                     } | ||||||
|                     GetRecordingsForPerson(id, sender) => { |                     GetRecordingsForPerson(id, sender) => { | ||||||
|                         sender |                         sender | ||||||
|                             .send(db.get_recordings_for_person(id)) |                             .send(db.get_recordings_for_person(id)) | ||||||
|  | @ -196,6 +220,18 @@ impl Backend { | ||||||
|         receiver.await? |         receiver.await? | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub async fn get_work_description(&self, id: i64) -> Result<WorkDescription> { | ||||||
|  |         let (sender, receiver) = oneshot::channel(); | ||||||
|  |         self.action_sender.send(GetWorkDescription(id, sender))?; | ||||||
|  |         receiver.await? | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub async fn delete_work(&self, id: i64) -> Result<()> { | ||||||
|  |         let (sender, receiver) = oneshot::channel(); | ||||||
|  |         self.action_sender.send(DeleteWork(id, sender))?; | ||||||
|  |         receiver.await? | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub async fn get_work_descriptions(&self, person_id: i64) -> Result<Vec<WorkDescription>> { |     pub async fn get_work_descriptions(&self, person_id: i64) -> Result<Vec<WorkDescription>> { | ||||||
|         let (sender, receiver) = oneshot::channel(); |         let (sender, receiver) = oneshot::channel(); | ||||||
|         self.action_sender |         self.action_sender | ||||||
|  | @ -234,6 +270,19 @@ impl Backend { | ||||||
|         receiver.await? |         receiver.await? | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub async fn get_recording_description(&self, id: i64) -> Result<RecordingDescription> { | ||||||
|  |         let (sender, receiver) = oneshot::channel(); | ||||||
|  |         self.action_sender | ||||||
|  |             .send(GetRecordingDescription(id, sender))?; | ||||||
|  |         receiver.await? | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub async fn delete_recording(&self, id: i64) -> Result<()> { | ||||||
|  |         let (sender, receiver) = oneshot::channel(); | ||||||
|  |         self.action_sender.send(DeleteRecording(id, sender))?; | ||||||
|  |         receiver.await? | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub async fn get_recordings_for_person( |     pub async fn get_recordings_for_person( | ||||||
|         &self, |         &self, | ||||||
|         person_id: i64, |         person_id: i64, | ||||||
|  |  | ||||||
|  | @ -32,6 +32,24 @@ impl EnsembleScreen { | ||||||
| 
 | 
 | ||||||
|         header.set_title(Some(&ensemble.name)); |         header.set_title(Some(&ensemble.name)); | ||||||
| 
 | 
 | ||||||
|  |         let edit_menu_item = gio::MenuItem::new(Some("Edit ensemble"), None); | ||||||
|  |         edit_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.edit-ensemble"), | ||||||
|  |             Some(&glib::Variant::from(ensemble.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let delete_menu_item = gio::MenuItem::new(Some("Delete ensemble"), None); | ||||||
|  |         delete_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.delete-ensemble"), | ||||||
|  |             Some(&glib::Variant::from(ensemble.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let menu = gio::Menu::new(); | ||||||
|  |         menu.append_item(&edit_menu_item); | ||||||
|  |         menu.append_item(&delete_menu_item); | ||||||
|  | 
 | ||||||
|  |         menu_button.set_menu_model(Some(&menu)); | ||||||
|  | 
 | ||||||
|         let recording_list = List::new( |         let recording_list = List::new( | ||||||
|             |recording: &RecordingDescription| { |             |recording: &RecordingDescription| { | ||||||
|                 let work_label = gtk::Label::new(Some(&recording.work.get_title())); |                 let work_label = gtk::Label::new(Some(&recording.work.get_title())); | ||||||
|  |  | ||||||
|  | @ -35,6 +35,24 @@ impl PersonScreen { | ||||||
| 
 | 
 | ||||||
|         header.set_title(Some(&person.name_fl())); |         header.set_title(Some(&person.name_fl())); | ||||||
| 
 | 
 | ||||||
|  |         let edit_menu_item = gio::MenuItem::new(Some("Edit person"), None); | ||||||
|  |         edit_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.edit-person"), | ||||||
|  |             Some(&glib::Variant::from(person.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let delete_menu_item = gio::MenuItem::new(Some("Delete person"), None); | ||||||
|  |         delete_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.delete-person"), | ||||||
|  |             Some(&glib::Variant::from(person.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let menu = gio::Menu::new(); | ||||||
|  |         menu.append_item(&edit_menu_item); | ||||||
|  |         menu.append_item(&delete_menu_item); | ||||||
|  | 
 | ||||||
|  |         menu_button.set_menu_model(Some(&menu)); | ||||||
|  | 
 | ||||||
|         let work_list = List::new( |         let work_list = List::new( | ||||||
|             |work: &WorkDescription| { |             |work: &WorkDescription| { | ||||||
|                 let label = gtk::Label::new(Some(&work.title)); |                 let label = gtk::Label::new(Some(&work.title)); | ||||||
|  |  | ||||||
|  | @ -26,6 +26,24 @@ impl RecordingScreen { | ||||||
|         header.set_title(Some(&recording.work.get_title())); |         header.set_title(Some(&recording.work.get_title())); | ||||||
|         header.set_subtitle(Some(&recording.get_performers())); |         header.set_subtitle(Some(&recording.get_performers())); | ||||||
| 
 | 
 | ||||||
|  |         let edit_menu_item = gio::MenuItem::new(Some("Edit recording"), None); | ||||||
|  |         edit_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.edit-recording"), | ||||||
|  |             Some(&glib::Variant::from(recording.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let delete_menu_item = gio::MenuItem::new(Some("Delete recording"), None); | ||||||
|  |         delete_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.delete-recording"), | ||||||
|  |             Some(&glib::Variant::from(recording.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let menu = gio::Menu::new(); | ||||||
|  |         menu.append_item(&edit_menu_item); | ||||||
|  |         menu.append_item(&delete_menu_item); | ||||||
|  | 
 | ||||||
|  |         menu_button.set_menu_model(Some(&menu)); | ||||||
|  | 
 | ||||||
|         let result = Rc::new(Self { |         let result = Rc::new(Self { | ||||||
|             widget, |             widget, | ||||||
|             navigator: RefCell::new(None), |             navigator: RefCell::new(None), | ||||||
|  |  | ||||||
|  | @ -32,6 +32,24 @@ impl WorkScreen { | ||||||
|         header.set_title(Some(&work.title)); |         header.set_title(Some(&work.title)); | ||||||
|         header.set_subtitle(Some(&work.composer.name_fl())); |         header.set_subtitle(Some(&work.composer.name_fl())); | ||||||
| 
 | 
 | ||||||
|  |         let edit_menu_item = gio::MenuItem::new(Some("Edit work"), None); | ||||||
|  |         edit_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.edit-work"), | ||||||
|  |             Some(&glib::Variant::from(work.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let delete_menu_item = gio::MenuItem::new(Some("Delete work"), None); | ||||||
|  |         delete_menu_item.set_action_and_target_value( | ||||||
|  |             Some("win.delete-work"), | ||||||
|  |             Some(&glib::Variant::from(work.id)), | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         let menu = gio::Menu::new(); | ||||||
|  |         menu.append_item(&edit_menu_item); | ||||||
|  |         menu.append_item(&delete_menu_item); | ||||||
|  | 
 | ||||||
|  |         menu_button.set_menu_model(Some(&menu)); | ||||||
|  | 
 | ||||||
|         let recording_list = List::new( |         let recording_list = List::new( | ||||||
|             |recording: &RecordingDescription| { |             |recording: &RecordingDescription| { | ||||||
|                 let work_label = gtk::Label::new(Some(&recording.work.get_title())); |                 let work_label = gtk::Label::new(Some(&recording.work.get_title())); | ||||||
|  |  | ||||||
|  | @ -174,6 +174,70 @@ impl Window { | ||||||
|             }) |             }) | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|  |         action!( | ||||||
|  |             result.window, | ||||||
|  |             "edit-work", | ||||||
|  |             Some(glib::VariantTy::new("x").unwrap()), | ||||||
|  |             clone!(@strong result => move |_, id| { | ||||||
|  |                 let id = id.unwrap().get().unwrap(); | ||||||
|  |                 let result = result.clone(); | ||||||
|  |                 let c = glib::MainContext::default(); | ||||||
|  |                 c.spawn_local(async move { | ||||||
|  |                     let work = result.backend.get_work_description(id).await.unwrap(); | ||||||
|  |                     WorkEditor::new(result.backend.clone(), &result.window, Some(work), clone!(@strong result => move |_| { | ||||||
|  |                         result.reload(); | ||||||
|  |                     })).show(); | ||||||
|  |                 }); | ||||||
|  |             }) | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         action!( | ||||||
|  |             result.window, | ||||||
|  |             "delete-work", | ||||||
|  |             Some(glib::VariantTy::new("x").unwrap()), | ||||||
|  |             clone!(@strong result => move |_, id| { | ||||||
|  |                 let id = id.unwrap().get().unwrap(); | ||||||
|  |                 let result = result.clone(); | ||||||
|  |                 let c = glib::MainContext::default(); | ||||||
|  |                 c.spawn_local(async move { | ||||||
|  |                     result.backend.delete_work(id).await.unwrap(); | ||||||
|  |                     result.reload(); | ||||||
|  |                 }); | ||||||
|  |             }) | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         action!( | ||||||
|  |             result.window, | ||||||
|  |             "edit-recording", | ||||||
|  |             Some(glib::VariantTy::new("x").unwrap()), | ||||||
|  |             clone!(@strong result => move |_, id| { | ||||||
|  |                 let id = id.unwrap().get().unwrap(); | ||||||
|  |                 let result = result.clone(); | ||||||
|  |                 let c = glib::MainContext::default(); | ||||||
|  |                 c.spawn_local(async move { | ||||||
|  |                     let recording = result.backend.get_recording_description(id).await.unwrap(); | ||||||
|  |                     RecordingEditor::new(result.backend.clone(), &result.window, Some(recording), clone!(@strong result => move |_| { | ||||||
|  |                         result.reload(); | ||||||
|  |                     })).show(); | ||||||
|  |                 }); | ||||||
|  |             }) | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         action!( | ||||||
|  |             result.window, | ||||||
|  |             "delete-recording", | ||||||
|  |             Some(glib::VariantTy::new("x").unwrap()), | ||||||
|  |             clone!(@strong result => move |_, id| { | ||||||
|  |                 let id = id.unwrap().get().unwrap(); | ||||||
|  |                 let result = result.clone(); | ||||||
|  |                 let c = glib::MainContext::default(); | ||||||
|  |                 c.spawn_local(async move { | ||||||
|  |                     result.backend.delete_recording(id).await.unwrap(); | ||||||
|  |                     result.reload(); | ||||||
|  |                 }); | ||||||
|  |             }) | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|         result |         result | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Elias Projahn
						Elias Projahn