Save track queue when closing and restore at start
This commit is contained in:
@@ -106,6 +106,11 @@ impl CommandManager {
|
||||
match cmd {
|
||||
Command::Noop => Ok(None),
|
||||
Command::Quit => {
|
||||
let queue = self.queue.queue.read().expect("can't readlock queue");
|
||||
self.config.with_state_mut(move |mut s| {
|
||||
s.queue = queue.clone();
|
||||
});
|
||||
self.config.save_state();
|
||||
s.quit();
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ use std::{fs, process};
|
||||
use cursive::theme::Theme;
|
||||
use platform_dirs::AppDirs;
|
||||
|
||||
use crate::playable::Playable;
|
||||
use crate::queue;
|
||||
|
||||
pub const CLIENT_ID: &str = "d420a117a32841c2b3474932e49fb54b";
|
||||
@@ -54,6 +55,7 @@ pub struct UserState {
|
||||
pub volume: u16,
|
||||
pub shuffle: bool,
|
||||
pub repeat: queue::RepeatSetting,
|
||||
pub queue: Vec<Playable>,
|
||||
}
|
||||
|
||||
impl Default for UserState {
|
||||
@@ -62,6 +64,7 @@ impl Default for UserState {
|
||||
volume: u16::max_value(),
|
||||
shuffle: false,
|
||||
repeat: queue::RepeatSetting::None,
|
||||
queue: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,7 +87,7 @@ impl Config {
|
||||
|
||||
let userstate = {
|
||||
let path = config_path("userstate.toml");
|
||||
load_or_generate_default(path, |_| Ok(UserState::default()), false)
|
||||
load_or_generate_default(path, |_| Ok(UserState::default()), true)
|
||||
.expect("could not load user state")
|
||||
};
|
||||
|
||||
@@ -108,8 +111,11 @@ impl Config {
|
||||
{
|
||||
let state_guard = self.state.write().expect("can't writelock user state");
|
||||
cb(state_guard);
|
||||
}
|
||||
|
||||
pub fn save_state(&self) {
|
||||
let path = config_path("userstate.toml");
|
||||
debug!("saving user state to {}", path.display());
|
||||
if let Err(e) = write_content_helper(path, self.state().clone()) {
|
||||
error!("Could not save user state: {}", e);
|
||||
}
|
||||
@@ -146,7 +152,6 @@ fn proj_dirs() -> AppDirs {
|
||||
pub fn config_path(file: &str) -> PathBuf {
|
||||
let proj_dirs = proj_dirs();
|
||||
let cfg_dir = &proj_dirs.config_dir;
|
||||
trace!("{:?}", cfg_dir);
|
||||
if cfg_dir.exists() && !cfg_dir.is_dir() {
|
||||
fs::remove_file(cfg_dir).expect("unable to remove old config file");
|
||||
}
|
||||
|
||||
@@ -8,7 +8,8 @@ use crate::traits::{ListItem, ViewExt};
|
||||
use std::fmt;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[serde(tag = "type")]
|
||||
pub enum Playable {
|
||||
Track(Track),
|
||||
Episode(Episode),
|
||||
|
||||
@@ -28,8 +28,9 @@ pub struct Queue {
|
||||
|
||||
impl Queue {
|
||||
pub fn new(spotify: Arc<Spotify>, cfg: Arc<Config>) -> Queue {
|
||||
let queue = cfg.state().queue.clone();
|
||||
Queue {
|
||||
queue: Arc::new(RwLock::new(Vec::new())),
|
||||
queue: Arc::new(RwLock::new(queue)),
|
||||
spotify,
|
||||
current_track: RwLock::new(None),
|
||||
random_order: RwLock::new(None),
|
||||
|
||||
Reference in New Issue
Block a user