Store music library path

This commit is contained in:
Elias Projahn 2020-11-01 19:09:31 +01:00
parent 34546dcd8a
commit 4b88eec93f
2 changed files with 29 additions and 4 deletions

View file

@ -2,8 +2,10 @@ use super::database::*;
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use futures_channel::oneshot::Sender; use futures_channel::oneshot::Sender;
use futures_channel::{mpsc, oneshot}; use futures_channel::{mpsc, oneshot};
use gio::prelude::*;
use std::cell::RefCell; use std::cell::RefCell;
use std::path::PathBuf; use std::path::PathBuf;
use std::rc::Rc;
pub enum BackendState { pub enum BackendState {
NoMusicLibrary, NoMusicLibrary,
@ -45,6 +47,7 @@ pub struct Backend {
pub state_stream: RefCell<mpsc::Receiver<BackendState>>, pub state_stream: RefCell<mpsc::Receiver<BackendState>>,
state_sender: RefCell<mpsc::Sender<BackendState>>, state_sender: RefCell<mpsc::Sender<BackendState>>,
action_sender: RefCell<Option<std::sync::mpsc::Sender<BackendAction>>>, action_sender: RefCell<Option<std::sync::mpsc::Sender<BackendAction>>>,
settings: gio::Settings,
music_library_path: RefCell<Option<PathBuf>>, music_library_path: RefCell<Option<PathBuf>>,
} }
@ -56,10 +59,24 @@ impl Backend {
state_stream: RefCell::new(state_stream), state_stream: RefCell::new(state_stream),
state_sender: RefCell::new(state_sender), state_sender: RefCell::new(state_sender),
action_sender: RefCell::new(None), action_sender: RefCell::new(None),
settings: gio::Settings::new("de.johrpan.musicus"),
music_library_path: RefCell::new(None), music_library_path: RefCell::new(None),
} }
} }
pub fn init(self: Rc<Backend>) {
if let Some(path) = self.settings.get_string("music-library-path") {
if !path.is_empty() {
let context = glib::MainContext::default();
context.spawn_local(async move {
self.set_music_library_path_priv(PathBuf::from(path.to_string()))
.await
.unwrap();
});
}
}
}
pub async fn update_person(&self, person: Person) -> Result<()> { pub async fn update_person(&self, person: Person) -> Result<()> {
let (sender, receiver) = oneshot::channel(); let (sender, receiver) = oneshot::channel();
self.unwrap_action_sender()? self.unwrap_action_sender()?
@ -229,6 +246,16 @@ impl Backend {
} }
pub async fn set_music_library_path(&self, path: PathBuf) -> Result<()> { pub async fn set_music_library_path(&self, path: PathBuf) -> Result<()> {
self.settings
.set_string("music-library-path", path.to_str().unwrap())?;
self.set_music_library_path_priv(path).await
}
pub fn get_music_library_path(&self) -> Option<PathBuf> {
self.music_library_path.borrow().clone()
}
async fn set_music_library_path_priv(&self, path: PathBuf) -> Result<()> {
self.music_library_path.replace(Some(path.clone())); self.music_library_path.replace(Some(path.clone()));
self.set_state(BackendState::Loading); self.set_state(BackendState::Loading);
@ -247,10 +274,6 @@ impl Backend {
Ok(()) Ok(())
} }
pub fn get_music_library_path(&self) -> Option<PathBuf> {
self.music_library_path.borrow().clone()
}
fn set_state(&self, state: BackendState) { fn set_state(&self, state: BackendState) {
self.state_sender.borrow_mut().try_send(state).unwrap(); self.state_sender.borrow_mut().try_send(state).unwrap();
} }

View file

@ -33,6 +33,8 @@ impl Window {
get_widget!(builder, gtk::Box, empty_screen); get_widget!(builder, gtk::Box, empty_screen);
let backend = Rc::new(Backend::new()); let backend = Rc::new(Backend::new());
backend.clone().init();
let poe_list = PoeList::new(backend.clone()); let poe_list = PoeList::new(backend.clone());
let navigator = Navigator::new(&empty_screen); let navigator = Navigator::new(&empty_screen);