mirror of
https://github.com/aaru-dps/RedBookPlayer.git
synced 2025-12-16 19:24:41 +00:00
Add new settings
- Play data tracks like audio - Generate missing TOC
This commit is contained in:
@@ -6,18 +6,55 @@ namespace RedBookPlayer
|
|||||||
{
|
{
|
||||||
public class Settings
|
public class Settings
|
||||||
{
|
{
|
||||||
string filePath;
|
/// <summary>
|
||||||
|
/// Indicates if discs should start playing on load
|
||||||
|
/// </summary>
|
||||||
|
public bool AutoPlay { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if an index change can trigger a track change
|
||||||
|
/// </summary>
|
||||||
|
public bool IndexButtonChangeTrack { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if the index 0 of track 1 is treated like a hidden track
|
||||||
|
/// </summary>
|
||||||
|
public bool AllowSkipHiddenTrack { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if data tracks should be played like old, non-compliant players
|
||||||
|
/// </summary>
|
||||||
|
public bool PlayDataTracks { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generate a TOC if the disc is missing one
|
||||||
|
/// </summary>
|
||||||
|
public bool GenerateMissingTOC { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates the default playback volume
|
||||||
|
/// </summary>
|
||||||
|
public int Volume { get; set; } = 100;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates the currently selected theme
|
||||||
|
/// </summary>
|
||||||
|
public string SelectedTheme { get; set; } = "default";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Path to the settings file
|
||||||
|
/// </summary>
|
||||||
|
private string _filePath;
|
||||||
|
|
||||||
public Settings() {}
|
public Settings() {}
|
||||||
|
|
||||||
public Settings(string filePath) => this.filePath = filePath;
|
public Settings(string filePath) => _filePath = filePath;
|
||||||
|
|
||||||
public bool AutoPlay { get; set; }
|
|
||||||
public bool IndexButtonChangeTrack { get; set; }
|
|
||||||
public bool AllowSkipHiddenTrack { get; set; }
|
|
||||||
public int Volume { get; set; } = 100;
|
|
||||||
public string SelectedTheme { get; set; } = "default";
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load settings from a file
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filePath">Path to the settings JSON file</param>
|
||||||
|
/// <returns>Settings derived from the input file, if possible</returns>
|
||||||
public static Settings Load(string filePath)
|
public static Settings Load(string filePath)
|
||||||
{
|
{
|
||||||
if(File.Exists(filePath))
|
if(File.Exists(filePath))
|
||||||
@@ -25,7 +62,7 @@ namespace RedBookPlayer
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Settings settings = JsonSerializer.Deserialize<Settings>(File.ReadAllText(filePath));
|
Settings settings = JsonSerializer.Deserialize<Settings>(File.ReadAllText(filePath));
|
||||||
settings.filePath = filePath;
|
settings._filePath = filePath;
|
||||||
|
|
||||||
MainWindow.ApplyTheme(settings.SelectedTheme);
|
MainWindow.ApplyTheme(settings.SelectedTheme);
|
||||||
|
|
||||||
@@ -42,6 +79,9 @@ namespace RedBookPlayer
|
|||||||
return new Settings(filePath);
|
return new Settings(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save settings to a file
|
||||||
|
/// </summary>
|
||||||
public void Save()
|
public void Save()
|
||||||
{
|
{
|
||||||
var options = new JsonSerializerOptions
|
var options = new JsonSerializerOptions
|
||||||
@@ -50,7 +90,7 @@ namespace RedBookPlayer
|
|||||||
};
|
};
|
||||||
|
|
||||||
string json = JsonSerializer.Serialize(this, options);
|
string json = JsonSerializer.Serialize(this, options);
|
||||||
File.WriteAllText(filePath, json);
|
File.WriteAllText(_filePath, json);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,14 @@
|
|||||||
<CheckBox IsChecked="{Binding AllowSkipHiddenTrack}" Margin="0,0,8,0" />
|
<CheckBox IsChecked="{Binding AllowSkipHiddenTrack}" Margin="0,0,8,0" />
|
||||||
<TextBlock VerticalAlignment="Center">Treat index 0 of track 1 as track 0 (hidden track)</TextBlock>
|
<TextBlock VerticalAlignment="Center">Treat index 0 of track 1 as track 0 (hidden track)</TextBlock>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
|
<WrapPanel Margin="0,0,0,16">
|
||||||
|
<CheckBox IsChecked="{Binding PlayDataTracks}" Margin="0,0,8,0"/>
|
||||||
|
<TextBlock VerticalAlignment="Center">Play data tracks like old, non-compliant players</TextBlock>
|
||||||
|
</WrapPanel>
|
||||||
|
<WrapPanel Margin="0,0,0,16">
|
||||||
|
<CheckBox IsChecked="{Binding GenerateMissingTOC}" Margin="0,0,8,0"/>
|
||||||
|
<TextBlock VerticalAlignment="Center">Generate a TOC if the disc is missing one</TextBlock>
|
||||||
|
</WrapPanel>
|
||||||
<DockPanel Margin="0,0,0,16">
|
<DockPanel Margin="0,0,0,16">
|
||||||
<TextBlock VerticalAlignment="Center" Margin="0,0,8,0" DockPanel.Dock="Left">Volume</TextBlock>
|
<TextBlock VerticalAlignment="Center" Margin="0,0,8,0" DockPanel.Dock="Left">Volume</TextBlock>
|
||||||
<TextBlock VerticalAlignment="Center" DockPanel.Dock="Right" Text="%" />
|
<TextBlock VerticalAlignment="Center" DockPanel.Dock="Right" Text="%" />
|
||||||
|
|||||||
@@ -8,49 +8,47 @@ namespace RedBookPlayer
|
|||||||
{
|
{
|
||||||
public class SettingsWindow : Window
|
public class SettingsWindow : Window
|
||||||
{
|
{
|
||||||
readonly Settings settings;
|
private readonly Settings _settings;
|
||||||
string selectedTheme;
|
private string _selectedTheme;
|
||||||
ListBox themeList;
|
private ListBox _themeList;
|
||||||
|
|
||||||
public SettingsWindow() {}
|
public SettingsWindow() {}
|
||||||
|
|
||||||
public SettingsWindow(Settings settings)
|
public SettingsWindow(Settings settings)
|
||||||
{
|
{
|
||||||
DataContext = this.settings = settings;
|
DataContext = _settings = settings;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ThemeList_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
public void ThemeList_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
if(e.AddedItems.Count == 0)
|
if (e.AddedItems.Count == 0)
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
selectedTheme = (string)e.AddedItems[0];
|
_selectedTheme = (string)e.AddedItems[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ApplySettings(object sender, RoutedEventArgs e)
|
public void ApplySettings(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if((selectedTheme ?? "") != "")
|
if (!string.IsNullOrWhiteSpace(_selectedTheme))
|
||||||
{
|
{
|
||||||
settings.SelectedTheme = selectedTheme;
|
_settings.SelectedTheme = _selectedTheme;
|
||||||
MainWindow.ApplyTheme(selectedTheme);
|
MainWindow.ApplyTheme(_selectedTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerView.Player.Volume = settings.Volume;
|
PlayerView.Player.Volume = _settings.Volume;
|
||||||
|
|
||||||
settings.Save();
|
_settings.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateView() => this.FindControl<TextBlock>("VolumeLabel").Text = settings.Volume.ToString();
|
public void UpdateView() => this.FindControl<TextBlock>("VolumeLabel").Text = _settings.Volume.ToString();
|
||||||
|
|
||||||
void InitializeComponent()
|
void InitializeComponent()
|
||||||
{
|
{
|
||||||
AvaloniaXamlLoader.Load(this);
|
AvaloniaXamlLoader.Load(this);
|
||||||
|
|
||||||
themeList = this.FindControl<ListBox>("ThemeList");
|
_themeList = this.FindControl<ListBox>("ThemeList");
|
||||||
themeList.SelectionChanged += ThemeList_SelectionChanged;
|
_themeList.SelectionChanged += ThemeList_SelectionChanged;
|
||||||
|
|
||||||
List<string> items = new List<string>();
|
List<string> items = new List<string>();
|
||||||
items.Add("default");
|
items.Add("default");
|
||||||
@@ -61,16 +59,14 @@ namespace RedBookPlayer
|
|||||||
{
|
{
|
||||||
string themeName = dir.Split('/')[1];
|
string themeName = dir.Split('/')[1];
|
||||||
|
|
||||||
if(!File.Exists($"themes/{themeName}/view.xaml"))
|
if (!File.Exists($"themes/{themeName}/view.xaml"))
|
||||||
{
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
items.Add(themeName);
|
items.Add(themeName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
themeList.Items = items;
|
_themeList.Items = items;
|
||||||
|
|
||||||
this.FindControl<Button>("ApplyButton").Click += ApplySettings;
|
this.FindControl<Button>("ApplyButton").Click += ApplySettings;
|
||||||
this.FindControl<Slider>("VolumeSlider").PropertyChanged += (s, e) => UpdateView();
|
this.FindControl<Slider>("VolumeSlider").PropertyChanged += (s, e) => UpdateView();
|
||||||
|
|||||||
Reference in New Issue
Block a user