mirror of
				https://github.com/johrpan/musicus.git
				synced 2025-10-26 19:57:25 +01:00 
			
		
		
		
	Adapt medium editor to track structure changes
This commit is contained in:
		
							parent
							
								
									3702c9ad79
								
							
						
					
					
						commit
						79c86cbb57
					
				
					 1 changed files with 66 additions and 79 deletions
				
			
		|  | @ -7,7 +7,7 @@ use glib::prelude::*; | |||
| use gtk::prelude::*; | ||||
| use gtk_macros::get_widget; | ||||
| use libadwaita::prelude::*; | ||||
| use musicus_backend::db::{generate_id, Medium}; | ||||
| use musicus_backend::db::{generate_id, Medium, Track}; | ||||
| use musicus_backend::import::ImportSession; | ||||
| use std::cell::RefCell; | ||||
| use std::rc::Rc; | ||||
|  | @ -22,9 +22,8 @@ pub struct MediumEditor { | |||
|     name_entry: gtk::Entry, | ||||
|     publish_switch: gtk::Switch, | ||||
|     status_page: libadwaita::StatusPage, | ||||
|     disc_status_page: libadwaita::StatusPage, | ||||
|     track_set_list: Rc<List>, | ||||
|     // track_sets: RefCell<Vec<TrackSetData>>,
 | ||||
|     track_sets: RefCell<Vec<TrackSetData>>, | ||||
| } | ||||
| 
 | ||||
| impl Screen<Arc<ImportSession>, Medium> for MediumEditor { | ||||
|  | @ -43,7 +42,6 @@ impl Screen<Arc<ImportSession>, Medium> for MediumEditor { | |||
|         get_widget!(builder, gtk::Frame, frame); | ||||
|         get_widget!(builder, libadwaita::StatusPage, status_page); | ||||
|         get_widget!(builder, gtk::Button, try_again_button); | ||||
|         get_widget!(builder, libadwaita::StatusPage, disc_status_page); | ||||
|         get_widget!(builder, gtk::Button, cancel_button); | ||||
| 
 | ||||
|         let list = List::new(); | ||||
|  | @ -57,9 +55,8 @@ impl Screen<Arc<ImportSession>, Medium> for MediumEditor { | |||
|             name_entry, | ||||
|             publish_switch, | ||||
|             status_page, | ||||
|             disc_status_page, | ||||
|             track_set_list: list, | ||||
|             // track_sets: RefCell::new(Vec::new()),
 | ||||
|             track_sets: RefCell::new(Vec::new()), | ||||
|         }); | ||||
| 
 | ||||
|         // Connect signals and callbacks
 | ||||
|  | @ -83,43 +80,43 @@ impl Screen<Arc<ImportSession>, Medium> for MediumEditor { | |||
| 
 | ||||
|         add_button.connect_clicked(clone!(@weak this => move |_| { | ||||
|             spawn!(@clone this, async move { | ||||
|                 // if let Some(track_set) = push!(this.handle, TrackSetEditor, Arc::clone(&this.session)).await {
 | ||||
|                 //     let length = {
 | ||||
|                 //         let mut track_sets = this.track_sets.borrow_mut();
 | ||||
|                 //         track_sets.push(track_set);
 | ||||
|                 //         track_sets.len()
 | ||||
|                 //     };
 | ||||
|                 if let Some(track_set) = push!(this.handle, TrackSetEditor, Arc::clone(&this.session)).await { | ||||
|                     let length = { | ||||
|                         let mut track_sets = this.track_sets.borrow_mut(); | ||||
|                         track_sets.push(track_set); | ||||
|                         track_sets.len() | ||||
|                     }; | ||||
| 
 | ||||
|                 //     this.track_set_list.update(length);
 | ||||
|                 // }
 | ||||
|                     this.track_set_list.update(length); | ||||
|                 } | ||||
|             }); | ||||
|         })); | ||||
| 
 | ||||
|         // this.track_set_list.set_make_widget_cb(clone!(@weak this => move |index| {
 | ||||
|         //     let track_set = &this.track_sets.borrow()[index];
 | ||||
|         this.track_set_list.set_make_widget_cb(clone!(@weak this => move |index| { | ||||
|             let track_set = &this.track_sets.borrow()[index]; | ||||
| 
 | ||||
|         //     let title = track_set.recording.work.get_title();
 | ||||
|         //     let subtitle = track_set.recording.get_performers();
 | ||||
|             let title = track_set.recording.work.get_title(); | ||||
|             let subtitle = track_set.recording.get_performers(); | ||||
| 
 | ||||
|         //     let edit_image = gtk::Image::from_icon_name(Some("document-edit-symbolic"));
 | ||||
|         //     let edit_button = gtk::Button::new();
 | ||||
|         //     edit_button.set_has_frame(false);
 | ||||
|         //     edit_button.set_valign(gtk::Align::Center);
 | ||||
|         //     edit_button.set_child(Some(&edit_image));
 | ||||
|             let edit_image = gtk::Image::from_icon_name(Some("document-edit-symbolic")); | ||||
|             let edit_button = gtk::Button::new(); | ||||
|             edit_button.set_has_frame(false); | ||||
|             edit_button.set_valign(gtk::Align::Center); | ||||
|             edit_button.set_child(Some(&edit_image)); | ||||
| 
 | ||||
|         //     let row = libadwaita::ActionRow::new();
 | ||||
|         //     row.set_activatable(true);
 | ||||
|         //     row.set_title(Some(&title));
 | ||||
|         //     row.set_subtitle(Some(&subtitle));
 | ||||
|         //     row.add_suffix(&edit_button);
 | ||||
|         //     row.set_activatable_widget(Some(&edit_button));
 | ||||
|             let row = libadwaita::ActionRow::new(); | ||||
|             row.set_activatable(true); | ||||
|             row.set_title(Some(&title)); | ||||
|             row.set_subtitle(Some(&subtitle)); | ||||
|             row.add_suffix(&edit_button); | ||||
|             row.set_activatable_widget(Some(&edit_button)); | ||||
| 
 | ||||
|         //     edit_button.connect_clicked(clone!(@weak this => move |_| {
 | ||||
|             edit_button.connect_clicked(clone!(@weak this => move |_| { | ||||
|                 // TODO: Implement editing.
 | ||||
|         //     }));
 | ||||
|             })); | ||||
| 
 | ||||
|         //     row.upcast()
 | ||||
|         // }));
 | ||||
|             row.upcast() | ||||
|         })); | ||||
| 
 | ||||
|         try_again_button.connect_clicked(clone!(@weak this => move |_| { | ||||
|             this.widget.set_visible_child_name("content"); | ||||
|  | @ -136,72 +133,62 @@ impl Screen<Arc<ImportSession>, Medium> for MediumEditor { | |||
| impl MediumEditor { | ||||
|     /// Save the medium and possibly upload it to the server.
 | ||||
|     async fn save(&self) -> Result<Medium> { | ||||
|         // let name = self.name_entry.get_text().to_string();
 | ||||
|         let name = self.name_entry.get_text().to_string(); | ||||
| 
 | ||||
|         // Create a new directory in the music library path for the imported medium.
 | ||||
| 
 | ||||
|         // let mut path = self.handle.backend.get_music_library_path().unwrap().clone();
 | ||||
|         // path.push(&name);
 | ||||
|         // std::fs::create_dir(&path)?;
 | ||||
|         let mut path = self.handle.backend.get_music_library_path().unwrap().clone(); | ||||
|         path.push(&name); | ||||
|         std::fs::create_dir(&path)?; | ||||
| 
 | ||||
|         // Convert the track set data to real track sets.
 | ||||
| 
 | ||||
|         // let mut track_sets = Vec::new();
 | ||||
|         // let import_tracks = self.session.tracks();
 | ||||
|         let mut tracks = Vec::new(); | ||||
|         let import_tracks = self.session.tracks(); | ||||
| 
 | ||||
|         // for track_set_data in &*self.track_sets.borrow() {
 | ||||
|         //     let mut tracks = Vec::new();
 | ||||
| 
 | ||||
|         //     for track_data in &track_set_data.tracks {
 | ||||
|         for track_set_data in &*self.track_sets.borrow() { | ||||
|             for track_data in &track_set_data.tracks { | ||||
|                 // Copy the corresponding audio file to the music library.
 | ||||
| 
 | ||||
|         //         let import_track = &import_tracks[track_data.track_source];
 | ||||
|                 let import_track = &import_tracks[track_data.track_source]; | ||||
| 
 | ||||
|         //         let mut track_path = path.clone();
 | ||||
|         //         track_path.push(import_track.path.file_name().unwrap());
 | ||||
|                 let mut track_path = path.clone(); | ||||
|                 track_path.push(import_track.path.file_name().unwrap()); | ||||
| 
 | ||||
|         //         std::fs::copy(&import_track.path, &track_path)?;
 | ||||
|                 std::fs::copy(&import_track.path, &track_path)?; | ||||
| 
 | ||||
|                 // Create the real track.
 | ||||
| 
 | ||||
|         //         let track = Track {
 | ||||
|         //             work_parts: track_data.work_parts.clone(),
 | ||||
|         //             path: track_path.to_str().unwrap().to_owned(),
 | ||||
|         //         };
 | ||||
|                 let track = Track { | ||||
|                     recording: track_set_data.recording.clone(), | ||||
|                     work_parts: track_data.work_parts.clone(), | ||||
|                     path: track_path.to_str().unwrap().to_owned(), | ||||
|                 }; | ||||
| 
 | ||||
|         //         tracks.push(track);
 | ||||
|         //     }
 | ||||
|                 tracks.push(track); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //     let track_set = TrackSet {
 | ||||
|         //         recording: track_set_data.recording.clone(),
 | ||||
|         //         tracks,
 | ||||
|         //     };
 | ||||
|         let medium = Medium { | ||||
|             id: generate_id(), | ||||
|             name: self.name_entry.get_text().to_string(), | ||||
|             discid: Some(self.session.source_id().to_owned()), | ||||
|             tracks: tracks, | ||||
|         }; | ||||
| 
 | ||||
|         //     track_sets.push(track_set);
 | ||||
|         // }
 | ||||
|         let upload = self.publish_switch.get_active(); | ||||
|         if upload { | ||||
|             self.handle.backend.cl().post_medium(&medium).await?; | ||||
|         } | ||||
| 
 | ||||
|         // let medium = Medium {
 | ||||
|         //     id: generate_id(),
 | ||||
|         //     name: self.name_entry.get_text().to_string(),
 | ||||
|         //     discid: Some(self.session.source_id().to_owned()),
 | ||||
|         //     tracks: track_sets,
 | ||||
|         // };
 | ||||
|         self.handle.backend | ||||
|             .db() | ||||
|             .update_medium(medium.clone()) | ||||
|             .await?; | ||||
| 
 | ||||
|         // let upload = self.publish_switch.get_active();
 | ||||
|         // if upload {
 | ||||
|         //     self.handle.backend.cl().post_medium(&medium).await?;
 | ||||
|         // }
 | ||||
|         self.handle.backend.library_changed(); | ||||
| 
 | ||||
|         // self.handle.backend
 | ||||
|         //     .db()
 | ||||
|         //     .update_medium(medium.clone())
 | ||||
|         //     .await?;
 | ||||
| 
 | ||||
|         // self.handle.backend.library_changed();
 | ||||
| 
 | ||||
|         // Ok(medium)
 | ||||
| 
 | ||||
|         todo!(); | ||||
|         Ok(medium) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Elias Projahn
						Elias Projahn