diff --git a/README.md b/README.md index e51bfb7..9edf487 100644 --- a/README.md +++ b/README.md @@ -127,10 +127,14 @@ prism-tui stores its settings in a TOML config file: ```toml default_sort = "Last Played" sort_ascending = true -data_dir = "~/Games/PrismLauncher" # optional, overrides auto-detection +data_dir = "~/Games/PrismLauncher" # optional, overrides auto-detection +instances_dir = "/mnt/ssd/mc-instances" # optional, overrides instances path ``` -Sort and sort-direction preferences are saved automatically. The `data_dir` option supports `~` tilde expansion. +Sort and sort-direction preferences are saved automatically. Both `data_dir` and `instances_dir` support `~` tilde expansion. + +- `data_dir` overrides the root PrismLauncher directory (affects accounts, logs, launcher config, and instances). +- `instances_dir` overrides only the instances path, useful when instances live on a separate drive or non-standard location. When unset, defaults to `/instances`. ## Architecture diff --git a/src/data/app_config.rs b/src/data/app_config.rs index ddca2c5..827cebf 100644 --- a/src/data/app_config.rs +++ b/src/data/app_config.rs @@ -11,6 +11,8 @@ pub struct AppConfig { pub sort_ascending: bool, #[serde(default, skip_serializing_if = "Option::is_none")] pub data_dir: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub instances_dir: Option, } fn default_true() -> bool { @@ -27,6 +29,7 @@ impl Default for AppConfig { default_sort: default_sort(), sort_ascending: true, data_dir: None, + instances_dir: None, } } } @@ -72,6 +75,10 @@ impl AppConfig { self.data_dir.as_ref().map(|p| expand_tilde(p)) } + pub fn resolved_instances_dir(&self) -> Option { + self.instances_dir.as_ref().map(|p| expand_tilde(p)) + } + pub fn default_sort_mode(&self) -> SortMode { match self.default_sort.as_str() { "Name" => SortMode::Name, diff --git a/src/data/config.rs b/src/data/config.rs index a6951e0..dfc2477 100644 --- a/src/data/config.rs +++ b/src/data/config.rs @@ -5,12 +5,22 @@ use std::path::{Path, PathBuf}; pub struct PrismConfig { pub data_dir: PathBuf, + instances_dir_override: Option, #[allow(dead_code)] pub selected_instance: Option, } impl PrismConfig { - pub fn load(data_dir: &Path) -> Result { + pub fn load(data_dir: &Path, instances_dir_override: Option) -> Result { + if let Some(ref dir) = instances_dir_override + && !dir.exists() + { + return Err(PrismError::Config(format!( + "Configured instances_dir does not exist: {}", + dir.display() + ))); + } + let config_path = data_dir.join("prismlauncher.cfg"); let mut config = Ini::new(); @@ -25,12 +35,17 @@ impl PrismConfig { Ok(Self { data_dir: data_dir.to_path_buf(), + instances_dir_override, selected_instance, }) } pub fn instances_dir(&self) -> PathBuf { - self.data_dir.join("instances") + if let Some(ref dir) = self.instances_dir_override { + dir.clone() + } else { + self.data_dir.join("instances") + } } pub fn accounts_path(&self) -> PathBuf { diff --git a/src/main.rs b/src/main.rs index a9bf142..4c50e20 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ async fn main() -> Result<()> { let app_config = AppConfig::load(); let data_dir = find_prism_data_dir(app_config.resolved_data_dir())?; - let config = PrismConfig::load(&data_dir)?; + let config = PrismConfig::load(&data_dir, app_config.resolved_instances_dir())?; let mut app = App::new(config, app_config)?; let mut terminal = Terminal::new()?; let mut events = EventStream::new(Duration::from_millis(250));