Skip to content

Commit 47a7ece

Browse files
Merge pull request #61 from MattEqualsCoder/hardware-msu-settings
Hardware msu settings
2 parents 32213c4 + d3b5c1f commit 47a7ece

18 files changed

+213
-32
lines changed

MSURandomizer/MSURandomizer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
77
<ApplicationManifest>app.manifest</ApplicationManifest>
88
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
9-
<Version>3.0.0-rc.1</Version>
9+
<Version>3.0.0-rc.2</Version>
1010
<ApplicationIcon>MSURandomizerIcon.ico</ApplicationIcon>
1111
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1212
<PackageId>MattEqualsCoder.MSURandomizer.Avalonia</PackageId>

MSURandomizer/Services/MsuDetailsService.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public class MsuDetailsService(
1212
IMapper mapper,
1313
IMsuTypeService msuTypeService,
1414
IMsuCacheService msuCacheService,
15-
IMsuLookupService msuLookupService) : ControlService
15+
IMsuLookupService msuLookupService,
16+
IMsuHardwareService msuHardwareService) : ControlService
1617
{
1718
private MsuViewModel _parentModel = new();
1819
public MsuDetailsWindowViewModel Model { get; set; } = new();
@@ -31,6 +32,7 @@ public MsuDetailsWindowViewModel InitilizeModel(MsuViewModel model)
3132
Model.TrackCount = Model.Tracks.Count;
3233
Model.MsuTypeNames = [""];
3334
Model.MsuTypeNames.AddRange(msuTypeService.MsuTypes.Select(x => x.DisplayName).OrderBy(x => x));
35+
Model.MsuPath = _parentModel.MsuPath;
3436
Model.HasBeenModified = false;
3537
return Model;
3638
}
@@ -39,18 +41,29 @@ public void Save()
3941
{
4042
if (Model.Msu == null) return;
4143
mapper.Map(Model, Model.Msu.Settings);
44+
Model.Msu.Settings.MsuType = msuTypeService.GetMsuType(Model.MsuTypeName);
4245
Model.Msu.Settings.IsUserUnknownMsu = string.IsNullOrEmpty(Model.MsuTypeName);
4346
userOptionsService.SaveMsuSettings(Model.Msu);
4447
_parentModel.MsuName = Model.Msu?.DisplayName;
4548
_parentModel.MsuCreator = Model.Msu?.DisplayCreator;
4649

4750
if (_originalMsuTypeName != Model.MsuTypeName)
4851
{
49-
msuCacheService.Remove(Model.MsuPath, false);
50-
ITaskService.Run(() =>
52+
if (Model.Msu?.IsHardwareMsu != true)
5153
{
52-
msuLookupService.LookupMsus();
53-
});
54+
msuCacheService.Remove(Model.MsuPath, false);
55+
ITaskService.Run(() =>
56+
{
57+
msuLookupService.LookupMsus();
58+
});
59+
}
60+
else
61+
{
62+
ITaskService.Run(() =>
63+
{
64+
msuHardwareService.RefreshMsu(Model.MsuPath);
65+
});
66+
}
5467
}
5568

5669
}

MSURandomizer/Services/MsuListService.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public class MsuListService(AppInitializationService appInitializationService,
1616
IMsuUserOptionsService userOptions,
1717
IMsuTypeService msuTypeService,
1818
IMsuAppSettingsService appSettingsService,
19-
IMsuMonitorService msuMonitorService) : ControlService
19+
IMsuMonitorService msuMonitorService,
20+
IMsuHardwareService msuHardwareService) : ControlService
2021
{
2122
public MsuListViewModel Model { get; set; } = new()
2223
{
@@ -40,11 +41,17 @@ public MsuListViewModel InitializeModel()
4041
appInitializationService.InitializationComplete += InitializationServiceOnInitializationComplete;
4142
msuLookupService.OnMsuLookupComplete += MsuLookupServiceOnOnMsuLookupComplete;
4243
msuLookupService.OnMsuLookupStarted += MsuLookupServiceOnOnMsuLookupStarted;
44+
msuHardwareService.HardwareMsusChanged += MsuHardwareServiceOnHardwareMsusChanged;
4345
Model.IsMsuMonitorDisabled = appSettingsService.MsuAppSettings.DisableMsuMonitorWindow == true;
4446
CheckIfLoading();
4547
return Model;
4648
}
4749

50+
private void MsuHardwareServiceOnHardwareMsusChanged(object? sender, MsuListEventArgs e)
51+
{
52+
PopulateMsuViewModels(e.Msus.ToList());
53+
}
54+
4855
private void MsuLookupServiceOnOnMsuLookupStarted(object? sender, EventArgs e)
4956
{
5057
CheckIfLoading();
@@ -70,8 +77,24 @@ public void FilterMSUs(MsuType msuType, MsuFilter msuFilter)
7077
userOptions.MsuUserOptions.DefaultMsuPath;
7178
var rootPath = Model.HardwareMode ? "" : GetMsuTypeBasePath(msuType);
7279
var useAbsolutePath = string.IsNullOrWhiteSpace(rootPath);
80+
81+
// Hardware MSUs are more limited in compatibility
82+
List<string>? compatibleMsuNames = null;
83+
if (Model.HardwareMode)
84+
{
85+
if (appSettingsService.MsuAppSettings.HardwareCompatibleMsuTypes.TryGetValue(msuType.DisplayName,
86+
out compatibleMsuNames))
87+
{
88+
compatibleMsuNames.Add(msuType.DisplayName);
89+
}
90+
else
91+
{
92+
compatibleMsuNames = [msuType.DisplayName];
93+
}
94+
}
95+
7396
var filteredMsus = Model.MsuViewModels
74-
.Where(x => x.Msu.MatchesFilter(msuFilter, msuType, msuTypePath) &&
97+
.Where(x => x.Msu.MatchesFilter(msuFilter, msuType, msuTypePath, compatibleMsuNames) &&
7598
(x.Msu.NumUniqueTracks > x.Msu.MsuType?.RequiredTrackNumbers.Count / 5 || x.Msu.NumUniqueTracks > 10))
7699
.OrderBy(x => x.MsuName)
77100
.ToList();
@@ -159,7 +182,7 @@ public void PopulateMsuViewModels(List<Msu>? msus)
159182
.Where(x => userOptions.MsuUserOptions.SelectedMsus?.Contains(x.MsuPath) == true).ToList();
160183

161184
Model.DisplayUnknownMsuWindow =
162-
Model.Msus.Any(x => x.MsuType == null && x is { NumUniqueTracks: > 15, IgnoreUnknown: false, IsHardwareMsu: false } && string.IsNullOrEmpty(x.Settings.MsuTypeName) );
185+
Model.Msus.Any(x => x.MsuType == null && x is { NumUniqueTracks: > 15, IgnoreUnknown: false } && string.IsNullOrEmpty(x.Settings.MsuTypeName) );
163186

164187
if (Model.DisplayUnknownMsuWindow)
165188
{

MSURandomizer/Services/MsuWindowService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ public void UpdateSelectedMsus(ICollection<MsuViewModel>? msus)
152152

153153
public void UpdateHardwareMode(MsuList msuList, List<Msu>? msus)
154154
{
155+
Model.Filter = MsuFilter.Compatible;
155156
Model.IsHardwareModeEnabled = msus?.Count > 0;
156157
msuList.ToggleHardwareMode(Model.IsHardwareModeEnabled);
157158
msuList.PopulateMsuViewModels(msus);

MSURandomizer/Services/UnknownMsuWindowService.cs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,28 @@ public class UnknownMsuWindowService(
1313
IMapper mapper,
1414
IMsuTypeService msuTypeService,
1515
IMsuCacheService msuCacheService,
16-
IMsuLookupService msuLookupService) : ControlService
16+
IMsuLookupService msuLookupService,
17+
IMsuHardwareService msuHardwareService) : ControlService
1718
{
1819
private UnknownMsuWindowViewModel _model = new();
1920
private const int MaxPathLength = 50;
21+
private bool _isHardwareMode;
2022

21-
public UnknownMsuWindowViewModel InitilizeModel()
23+
public UnknownMsuWindowViewModel InitilizeModel(bool isHardwareMode)
2224
{
25+
_isHardwareMode = isHardwareMode;
26+
2327
List<string> msuTypes = [""];
2428
msuTypes.AddRange(msuTypeService.MsuTypes.Select(x => x.DisplayName).OrderBy(x => x));
2529

2630
List<MsuDetailsWindowViewModel> msuModels = [];
31+
32+
var msuList = isHardwareMode ? msuHardwareService.Msus : msuLookupService.Msus;
33+
var msus = msuList.Where(x =>
34+
x is { IgnoreUnknown: false, MsuType: null, NumUniqueTracks: >= 15 } &&
35+
string.IsNullOrEmpty(x.Settings.MsuTypeName));
2736

28-
foreach (var msu in msuLookupService.Msus.Where(x => x is { IgnoreUnknown: false, MsuType: null, NumUniqueTracks: >= 15 } && string.IsNullOrEmpty(x.Settings.MsuTypeName) ))
37+
foreach (var msu in msus)
2938
{
3039
var msuModel = mapper.Map<MsuDetailsWindowViewModel>(msu.Settings);
3140
msuModel.Msu = msu;
@@ -46,6 +55,7 @@ public UnknownMsuWindowViewModel InitilizeModel()
4655
{
4756
_model.HasBeenModified = true;
4857
};
58+
4959
msuModels.Add(msuModel);
5060
}
5161

@@ -62,18 +72,29 @@ public void Save()
6272
foreach (var msuModel in _model.UnknownMsus.Where(x => x.Msu != null))
6373
{
6474
mapper.Map(msuModel, msuModel.Msu!.Settings);
75+
msuModel.Msu.MsuType = msuTypeService.GetMsuType(msuModel.MsuTypeName);
6576
msuModel.Msu.Settings.IsUserUnknownMsu = string.IsNullOrEmpty(msuModel.MsuTypeName);
6677
userOptionsService.UpdateMsuSettings(msuModel.Msu);
67-
msuCacheService.Remove(msuModel.Msu.Path, false);
78+
79+
if (_isHardwareMode && !string.IsNullOrEmpty(msuModel.MsuTypeName))
80+
{
81+
msuHardwareService.RefreshMsu(msuModel.MsuPath);
82+
}
83+
else if (!_isHardwareMode)
84+
{
85+
msuCacheService.Remove(msuModel.Msu.Path, false);
86+
}
6887
}
6988

7089
userOptionsService.Save();
71-
72-
ITaskService.Run(() =>
90+
91+
if (!_isHardwareMode)
7392
{
74-
msuLookupService.LookupMsus();
75-
});
76-
93+
ITaskService.Run(() =>
94+
{
95+
msuLookupService.LookupMsus();
96+
});
97+
}
7798
}
7899

79100
public void SaveIgnore()

MSURandomizer/ViewModels/MsuDetailsWindowViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public class MsuDetailsWindowViewModel : ViewModelBase
3535

3636
public string TrackCountString => $"{TrackCount} Tracks";
3737

38-
public bool CanEditDetails => Msu?.HasDetails != true && Msu?.IsHardwareMsu != true;
38+
public bool CanEditDetails => Msu?.HasDetails != true;
3939

40-
public bool CanEditMsuType => Msu?.IsHardwareMsu != true;
40+
public bool CanEditMsuType => true;
4141

4242
public bool IsNotLast { get; set; } = true;
4343
}

MSURandomizer/ViewModels/MsuViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public MsuViewModel(Msu msu)
2828
IsFavorite = msu.Settings.IsFavorite;
2929
ShuffleFrequency = msu.Settings.ShuffleFrequency;
3030
IsHardwareMsu = msu.IsHardwareMsu;
31+
ShowShuffleFrequency = !IsHardwareMsu;
3132
}
3233

3334
[Reactive] public Msu Msu { get; init; }
@@ -64,6 +65,8 @@ public MsuViewModel(Msu msu)
6465
[Reactive]
6566
[ReactiveLinkedProperties(nameof(ShuffleFrequencyIcon), nameof(ShuffleFrequencyColor))]
6667
public ShuffleFrequency ShuffleFrequency { get; set; }
68+
69+
[Reactive] public bool ShowShuffleFrequency { get; set; } = true;
6770

6871
public string ListText => string.IsNullOrEmpty(MsuCreator) ? MsuName ?? "" : $"{MsuName} by {MsuCreator}";
6972

MSURandomizer/Views/MsuList.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
<controls:ImageButton Grid.Column="0" Name="FavoriteButton" Margin="2" Tag="{Binding}" Click="FavoriteButton_OnClick">
3434
<avalonia:MaterialIcon Kind="Star" Width="20" Height="20" Foreground="{Binding FavoriteIconColor}" Background="Transparent" />
3535
</controls:ImageButton>
36-
<controls:ImageButton Grid.Column="1" Name="ShuffleFrequencyButton" Margin="2 2 5 2" Click="ShuffleFrequencyButton_OnClick">
36+
<controls:ImageButton Grid.Column="1" Name="ShuffleFrequencyButton" Margin="2 2 5 2" Click="ShuffleFrequencyButton_OnClick" IsVisible="{Binding ShowShuffleFrequency}">
3737
<Button.ContextMenu>
3838
<ContextMenu>
3939
<MenuItem Header="Shuffle the default amount"

MSURandomizer/Views/MsuList.axaml.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Avalonia.Interactivity;
66
using Avalonia.Threading;
77
using AvaloniaControls.Extensions;
8-
using AvaloniaControls.Services;
98
using MSURandomizer.Services;
109
using MSURandomizer.ViewModels;
1110
using MSURandomizerLibrary;
@@ -42,11 +41,11 @@ public MsuList()
4241
else
4342
{
4443
_service = this.GetControlService<MsuListService>();
44+
DataContext = _model = _service!.InitializeModel();
4545
_service!.OnDisplayUnknownMsuWindowRequest += (sender, args) =>
4646
{
4747
OpenUnknownMsuWindow();
4848
};
49-
DataContext = _model = _service!.InitializeModel();
5049
}
5150
}
5251

@@ -108,7 +107,7 @@ public void OpenUnknownMsuWindow()
108107
Dispatcher.UIThread.Invoke(() =>
109108
{
110109
var parentWindow = TopLevel.GetTopLevel(this) as Window;
111-
var unknownMsuWindow = new UnknownMsuWindow();
110+
var unknownMsuWindow = new UnknownMsuWindow(_service?.Model.HardwareMode == true);
112111
unknownMsuWindow.ShowDialog(parentWindow!);
113112
});
114113
}

MSURandomizer/Views/UnknownMsuWindow.axaml.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ public partial class UnknownMsuWindow : ScalableWindow
1212
{
1313
private readonly UnknownMsuWindowService? _service;
1414
private bool _pressedSave;
15-
16-
public UnknownMsuWindow()
15+
16+
public UnknownMsuWindow() : this(false) { }
17+
18+
public UnknownMsuWindow(bool isHardwareMode)
1719
{
1820
InitializeComponent();
1921

@@ -54,7 +56,7 @@ public UnknownMsuWindow()
5456
}
5557

5658
_service = this.GetControlService<UnknownMsuWindowService>();
57-
DataContext = _service!.InitilizeModel();
59+
DataContext = _service!.InitilizeModel(isHardwareMode);
5860
}
5961

6062
private void SaveButton_OnClick(object? sender, RoutedEventArgs e)

0 commit comments

Comments
 (0)