diff --git a/data/de.johrpan.musicus.gschema.xml b/data/de.johrpan.musicus.gschema.xml
index fd46ba7..97e8741 100644
--- a/data/de.johrpan.musicus.gschema.xml
+++ b/data/de.johrpan.musicus.gschema.xml
@@ -17,5 +17,20 @@
''Path to the music library
+
+
+ '{"title":"Just play some music","description":"Randomly select some music. Customize programs using the button in the top right.","design":"Program1","prefer_recently_added":0.0,"prefer_least_recently_played":0.0,"play_full_recordings":true}'
+ Default settings for program 1
+
+
+
+ '{"title":"What\'s new?","description":"Recordings that you recently added to your music library.","design":"Program2","prefer_recently_added":1.0,"prefer_least_recently_played":0.0,"play_full_recordings":true}'
+ Default settings for program 2
+
+
+
+ '{"title":"A long time ago","description":"Works that you haven\'t listend to for a long time.","design":"Program3","prefer_recently_added":-1.0,"prefer_least_recently_played":1.0,"play_full_recordings":false}'
+ Default settings for program 3
+
diff --git a/src/home_page.rs b/src/home_page.rs
index 621e542..c10567c 100644
--- a/src/home_page.rs
+++ b/src/home_page.rs
@@ -5,7 +5,8 @@ use crate::{
library::{LibraryQuery, MusicusLibrary},
player::MusicusPlayer,
playlist_item::PlaylistItem,
- program_tile::{MusicusProgramTile, Program, ProgramTileDesign},
+ program::Program,
+ program_tile::MusicusProgramTile,
recording_tile::MusicusRecordingTile,
search_entry::MusicusSearchEntry,
search_tag::Tag,
@@ -14,6 +15,7 @@ use crate::{
use adw::subclass::{navigation_page::NavigationPageImpl, prelude::*};
use gtk::{
+ gio,
glib::{self, clone, Properties},
prelude::*,
};
@@ -107,29 +109,19 @@ mod imp {
.sync_create()
.build();
- self.programs_flow_box
- .append(&MusicusProgramTile::new(Program {
- title: "Just play some music".to_string(),
- description: "Randomly select some music. Customize programs using the button in the top right."
- .to_string(),
- design: Some(ProgramTileDesign::Program1)
- },
- ));
+ let settings = gio::Settings::new("de.johrpan.musicus");
+ let program1 = Program::deserialize(&settings.string("program1")).unwrap();
+ let program2 = Program::deserialize(&settings.string("program2")).unwrap();
+ let program3 = Program::deserialize(&settings.string("program3")).unwrap();
self.programs_flow_box
- .append(&MusicusProgramTile::new(Program {
- title: "What's new?".to_string(),
- description: "Recordings that you recently added to your music library."
- .to_string(),
- design: Some(ProgramTileDesign::Program2),
- }));
+ .append(&MusicusProgramTile::new(program1));
self.programs_flow_box
- .append(&MusicusProgramTile::new(Program {
- title: "A long time ago".to_string(),
- description: "Works that you haven't listend to for a long time.".to_string(),
- design: Some(ProgramTileDesign::Program3),
- }));
+ .append(&MusicusProgramTile::new(program2));
+
+ self.programs_flow_box
+ .append(&MusicusProgramTile::new(program3));
self.obj().query(&LibraryQuery::default());
}
diff --git a/src/main.rs b/src/main.rs
index 8f416f6..6806c37 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -11,6 +11,7 @@ mod player_bar;
mod playlist_item;
mod playlist_page;
mod playlist_tile;
+mod program;
mod program_tile;
mod recording_tile;
mod search_entry;
diff --git a/src/program.rs b/src/program.rs
new file mode 100644
index 0000000..8b3555c
--- /dev/null
+++ b/src/program.rs
@@ -0,0 +1,119 @@
+use std::cell::{Cell, RefCell};
+
+use anyhow::Result;
+use gtk::{glib, glib::Properties, prelude::*, subclass::prelude::*};
+use serde::{Deserialize, Serialize};
+
+use crate::library::LibraryQuery;
+
+mod imp {
+ use super::*;
+
+ #[derive(Properties, Serialize, Deserialize, Default)]
+ #[properties(wrapper_type = super::Program)]
+ pub struct Program {
+ #[property(get, set)]
+ pub title: RefCell