Skip to content

Commit 0d75dba

Browse files
committed
Add dumping program selection finally
1 parent d38f95c commit 0d75dba

File tree

8 files changed

+185
-12
lines changed

8 files changed

+185
-12
lines changed

CHANGELIST.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- Fixed default media type when skipping type detection
1717
- Attempt sector reading for Saturn system detection
1818
- Fixed default media type when detection fails
19+
- Add option to allow users to select dumping program
1920

2021
### 1.17.1 (2020-09-14)
2122
- Shuffled some shared, internal UI variables
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using DICUI.Data;
2+
using DICUI.Utilities;
3+
4+
namespace DICUI.Avalonia
5+
{
6+
/// <summary>
7+
/// Represents a single item in the Internal Program combo box
8+
/// </summary>
9+
public class InternalProgramComboBoxItem
10+
{
11+
private object data;
12+
13+
public InternalProgramComboBoxItem(InternalProgram? internalProgram) => data = internalProgram;
14+
15+
public static implicit operator InternalProgram? (InternalProgramComboBoxItem item) => item.data as InternalProgram?;
16+
17+
public string Name
18+
{
19+
get
20+
{
21+
return (data as InternalProgram?).LongName();
22+
}
23+
}
24+
25+
public InternalProgram? Value
26+
{
27+
get { return data as InternalProgram?; }
28+
}
29+
}
30+
}

DICUI.Avalonia/MainWindow.axaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,7 @@ private async void OptionsMenuItemClick(object sender, RoutedEventArgs e)
728728
var optionsWindow = new OptionsWindow();
729729
optionsWindow.UIOptions = UIOptions;
730730
optionsWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
731+
optionsWindow.Refresh();
731732
await optionsWindow.ShowDialog(this);
732733

733734
// Set any new options

DICUI.Avalonia/OptionsWindow.axaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@
3434
<Button Name="DDPathButton" Grid.Row="2" Grid.Column="2" Height="25" Width="25" Content="..." Click="BrowseForPathClick" />
3535
-->
3636

37+
<TextBlock Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5" Text="Region" />
38+
<ComboBox Name="InternalProgramComboBox" Grid.Row="2" Grid.Column="1" Height="22" HorizontalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
39+
<ComboBox.ItemTemplate>
40+
<DataTemplate>
41+
<TextBlock Text="{Binding Path=Name}" />
42+
</DataTemplate>
43+
</ComboBox.ItemTemplate>
44+
</ComboBox>
45+
3746
<TextBlock Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5" Text="Default Output Path" />
3847
<TextBox Name="DefaultOutputPathTextBox" Grid.Row="3" Grid.Column="1" Height="25" HorizontalAlignment="Stretch"
3948
DataContext="{Binding Source={x:Static local:ViewModels.OptionsViewModel}}"

DICUI.Avalonia/OptionsWindow.axaml.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using Avalonia;
45
using Avalonia.Controls;
56
using Avalonia.Interactivity;
67
using Avalonia.Markup.Xaml;
8+
using DICUI.Data;
9+
using DICUI.Utilities;
710
using DICUI.Web;
811

912
namespace DICUI.Avalonia
@@ -17,6 +20,11 @@ public class OptionsWindow : Window
1720
/// </summary>
1821
public UIOptions UIOptions { get; set; }
1922

23+
/// <summary>
24+
/// List of available internal programs
25+
/// </summary>
26+
public List<InternalProgramComboBoxItem> InternalPrograms { get; private set; }
27+
2028
#endregion
2129

2230
public OptionsWindow()
@@ -25,6 +33,8 @@ public OptionsWindow()
2533
#if DEBUG
2634
this.AttachDevTools();
2735
#endif
36+
37+
PopulateInternalPrograms();
2838
}
2939

3040
private void InitializeComponent()
@@ -34,6 +44,34 @@ private void InitializeComponent()
3444

3545
#region Helpers
3646

47+
/// <summary>
48+
/// Get a complete list of internal programs and fill the combo box
49+
/// </summary>
50+
private void PopulateInternalPrograms()
51+
{
52+
// We only support certain programs for dumping
53+
var internalPrograms = new List<InternalProgram> { InternalProgram.DiscImageCreator, InternalProgram.Aaru, InternalProgram.DD };
54+
ViewModels.LoggerViewModel.VerboseLogLn("Populating internal programs, {0} internal programs found.", internalPrograms.Count);
55+
56+
InternalPrograms = new List<InternalProgramComboBoxItem>();
57+
foreach (var internalProgram in internalPrograms)
58+
{
59+
InternalPrograms.Add(new InternalProgramComboBoxItem(internalProgram));
60+
}
61+
62+
this.Find<ComboBox>("InternalProgramComboBox").Items = InternalPrograms;
63+
this.Find<ComboBox>("InternalProgramComboBox").SelectedIndex = 0;
64+
}
65+
66+
/// <summary>
67+
/// Refresh any options-related elements
68+
/// </summary>
69+
public void Refresh()
70+
{
71+
// Handle non-bindable fields
72+
this.Find<ComboBox>("InternalProgramComboBox").SelectedIndex = InternalPrograms.FindIndex(r => r == Converters.ToInternalProgram(UIOptions.Options.InternalProgram));
73+
}
74+
3775
/// <summary>
3876
/// Find a TextBox by setting name
3977
/// </summary>
@@ -95,6 +133,9 @@ private async void BrowseForPathClick(object sender, RoutedEventArgs e)
95133
/// </summary>
96134
private void OnAcceptClick(object sender, RoutedEventArgs e)
97135
{
136+
// Handle non-bindable fields
137+
UIOptions.Options.InternalProgram = (this.Find<ComboBox>("InternalProgramComboBox").SelectedItem as InternalProgramComboBoxItem)?.Name ?? InternalProgram.DiscImageCreator.ToString();
138+
98139
UIOptions.Save();
99140
Hide();
100141
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using DICUI.Data;
2+
using DICUI.Utilities;
3+
4+
namespace DICUI
5+
{
6+
/// <summary>
7+
/// Represents a single item in the Internal Program combo box
8+
/// </summary>
9+
public class InternalProgramComboBoxItem
10+
{
11+
private object data;
12+
13+
public InternalProgramComboBoxItem(InternalProgram? internalProgram) => data = internalProgram;
14+
15+
public static implicit operator InternalProgram? (InternalProgramComboBoxItem item) => item.data as InternalProgram?;
16+
17+
public string Name
18+
{
19+
get
20+
{
21+
return (data as InternalProgram?).LongName();
22+
}
23+
}
24+
25+
public InternalProgram? Value
26+
{
27+
get { return data as InternalProgram?; }
28+
}
29+
}
30+
}

DICUI/Windows/OptionsWindow.xaml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,16 @@
5151
Text="{Binding Path=DDPath}" />
5252
<Button x:Name="DDPathButton" Grid.Row="2" Grid.Column="2" Height="22" Width="22" Content="..." Click="BrowseForPathClick" />
5353
-->
54-
54+
55+
<Label Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Content="Dumping Program" />
56+
<ComboBox x:Name="InternalProgramComboBox" Grid.Row="2" Grid.Column="1" Height="22" HorizontalAlignment="Stretch" >
57+
<ComboBox.ItemTemplate>
58+
<DataTemplate>
59+
<TextBlock Text="{Binding Path=Name}" />
60+
</DataTemplate>
61+
</ComboBox.ItemTemplate>
62+
</ComboBox>
63+
5564
<Label Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Content="Default Output Path" />
5665
<TextBox x:Name="DefaultOutputPathTextBox" Grid.Row="3" Grid.Column="1" Height="22" HorizontalAlignment="Stretch"
5766
DataContext="{Binding Source={x:Static local:ViewModels.OptionsViewModel}}"

DICUI/Windows/OptionsWindow.xaml.cs

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using System.Windows;
45
using System.Windows.Forms;
6+
using DICUI.Data;
7+
using DICUI.Utilities;
58
using DICUI.Web;
69
using Button = System.Windows.Controls.Button;
710
using TextBox = System.Windows.Controls.TextBox;
@@ -20,11 +23,26 @@ public partial class OptionsWindow : Window
2023
/// </summary>
2124
public UIOptions UIOptions { get; set; }
2225

26+
/// <summary>
27+
/// List of available internal programs
28+
/// </summary>
29+
public List<InternalProgramComboBoxItem> InternalPrograms { get; private set; }
30+
2331
#endregion
2432

2533
public OptionsWindow()
2634
{
2735
InitializeComponent();
36+
37+
PopulateInternalPrograms();
38+
}
39+
40+
#region Helpers
41+
42+
private FolderBrowserDialog CreateFolderBrowserDialog()
43+
{
44+
FolderBrowserDialog dialog = new FolderBrowserDialog();
45+
return dialog;
2846
}
2947

3048
private OpenFileDialog CreateOpenFileDialog()
@@ -39,17 +57,52 @@ private OpenFileDialog CreateOpenFileDialog()
3957
return dialog;
4058
}
4159

42-
private FolderBrowserDialog CreateFolderBrowserDialog()
60+
/// <summary>
61+
/// Get a complete list of internal programs and fill the combo box
62+
/// </summary>
63+
private void PopulateInternalPrograms()
4364
{
44-
FolderBrowserDialog dialog = new FolderBrowserDialog();
45-
return dialog;
65+
// We only support certain programs for dumping
66+
var internalPrograms = new List<InternalProgram> { InternalProgram.DiscImageCreator, InternalProgram.Aaru, InternalProgram.DD };
67+
ViewModels.LoggerViewModel.VerboseLogLn("Populating internal programs, {0} internal programs found.", internalPrograms.Count);
68+
69+
InternalPrograms = new List<InternalProgramComboBoxItem>();
70+
foreach (var internalProgram in internalPrograms)
71+
{
72+
InternalPrograms.Add(new InternalProgramComboBoxItem(internalProgram));
73+
}
74+
75+
InternalProgramComboBox.ItemsSource = InternalPrograms;
76+
InternalProgramComboBox.SelectedIndex = 0;
77+
}
78+
79+
/// <summary>
80+
/// Refresh any options-related elements
81+
/// </summary>
82+
public void Refresh()
83+
{
84+
// Handle non-bindable fields
85+
InternalProgramComboBox.SelectedIndex = InternalPrograms.FindIndex(r => r == Converters.ToInternalProgram(UIOptions.Options.InternalProgram));
86+
RedumpPasswordBox.Password = UIOptions.Options.Password;
4687
}
4788

89+
/// <summary>
90+
/// Find a TextBox by setting name
91+
/// </summary>
92+
/// <param name="name">Setting name to find</param>
93+
/// <returns>TextBox for that setting</returns>
4894
private TextBox TextBoxForPathSetting(string name)
4995
{
5096
return FindName(name + "TextBox") as TextBox;
5197
}
5298

99+
#endregion
100+
101+
#region Event Handlers
102+
103+
/// <summary>
104+
/// Handler for generic Click event
105+
/// </summary>
53106
private void BrowseForPathClick(object sender, EventArgs e)
54107
{
55108
Button button = sender as Button;
@@ -97,17 +150,13 @@ private void BrowseForPathClick(object sender, EventArgs e)
97150
}
98151
}
99152

100-
public void Refresh()
101-
{
102-
// Handle non-bindable fields
103-
RedumpPasswordBox.Password = UIOptions.Options.Password;
104-
}
105-
106-
#region Event Handlers
107-
153+
/// <summary>
154+
/// Handler for AcceptButton Click event
155+
/// </summary>
108156
private void OnAcceptClick(object sender, EventArgs e)
109157
{
110158
// Handle non-bindable fields
159+
UIOptions.Options.InternalProgram = (InternalProgramComboBox.SelectedItem as InternalProgramComboBoxItem)?.Name ?? InternalProgram.DiscImageCreator.ToString();
111160
UIOptions.Options.Password = RedumpPasswordBox.Password;
112161

113162
UIOptions.Save();
@@ -116,6 +165,9 @@ private void OnAcceptClick(object sender, EventArgs e)
116165
(Owner as MainWindow).OnOptionsUpdated();
117166
}
118167

168+
/// <summary>
169+
/// Handler for CancelButton Click event
170+
/// </summary>
119171
private void OnCancelClick(object sender, EventArgs e)
120172
{
121173
// just hide the window and don't care

0 commit comments

Comments
 (0)