Skip to content

Commit d75af88

Browse files
Added unknown MSU window
1 parent 31af6b6 commit d75af88

19 files changed

+318
-11
lines changed

.idea/.idea.MSURandomizer/.idea/avalonia.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

MSURandomizer/Program.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Avalonia;
22
using Avalonia.ReactiveUI;
33
using System;
4-
using System.Linq;
54
using System.Threading;
65
using System.Threading.Tasks;
76
using Avalonia.Threading;

MSURandomizer/Services/MsuDetailsService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public MsuDetailsWindowViewModel InitilizeModel(MsuViewModel model)
2828
_parentModel.Msu.MsuType?.Tracks.OrderBy(x => x.Number)
2929
.Select(t => new MsuTrackViewModel(t, _parentModel.Msu.Tracks)).ToList() ??
3030
[];
31+
Model.TrackCount = Model.Tracks.Count;
3132
Model.MsuTypeNames = [""];
3233
Model.MsuTypeNames.AddRange(msuTypeService.MsuTypes.Select(x => x.DisplayName).OrderBy(x => x));
3334
Model.HasBeenModified = false;
@@ -38,6 +39,7 @@ public void Save()
3839
{
3940
if (Model.Msu == null) return;
4041
mapper.Map(Model, Model.Msu.Settings);
42+
Model.Msu.Settings.IsUserUnknownMsu = string.IsNullOrEmpty(Model.MsuTypeName);
4143
userOptionsService.SaveMsuSettings(Model.Msu);
4244
_parentModel.MsuName = Model.Msu?.DisplayName;
4345
_parentModel.MsuCreator = Model.Msu?.DisplayCreator;

MSURandomizer/Services/MsuListService.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@ public class MsuListService(AppInitializationService appInitializationService,
2222
{
2323
IsLoading = true
2424
};
25+
26+
public event EventHandler? OnDisplayUnknownMsuWindowRequest;
2527

2628
public MsuListViewModel InitializeModel()
2729
{
28-
msuMonitorService.MsuMonitorStarted += (sender, args) =>
30+
msuMonitorService.MsuMonitorStarted += (_, _) =>
2931
{
3032
Model.IsMsuMonitorActive = true;
3133
};
3234

33-
msuMonitorService.MsuMonitorStopped += (sender, args) =>
35+
msuMonitorService.MsuMonitorStopped += (_, _) =>
3436
{
3537
Model.IsMsuMonitorActive = false;
3638
};
@@ -70,7 +72,7 @@ public void FilterMSUs(MsuType msuType, MsuFilter msuFilter)
7072
var useAbsolutePath = string.IsNullOrWhiteSpace(rootPath);
7173
var filteredMsus = Model.MsuViewModels
7274
.Where(x => x.Msu.MatchesFilter(msuFilter, msuType, msuTypePath) &&
73-
x.Msu.NumUniqueTracks > x.Msu.MsuType?.RequiredTrackNumbers.Count / 5)
75+
(x.Msu.NumUniqueTracks > x.Msu.MsuType?.RequiredTrackNumbers.Count / 5 || x.Msu.NumUniqueTracks > 10))
7476
.OrderBy(x => x.MsuName)
7577
.ToList();
7678
foreach (var filteredMsu in filteredMsus)
@@ -155,6 +157,14 @@ public void PopulateMsuViewModels(List<Msu>? msus)
155157
FilterMSUs(filterMsuType, userOptions.MsuUserOptions.Filter);
156158
Model.SelectedMsus = Model.FilteredMsus
157159
.Where(x => userOptions.MsuUserOptions.SelectedMsus?.Contains(x.MsuPath) == true).ToList();
160+
161+
Model.DisplayUnknownMsuWindow =
162+
Model.Msus.Any(x => x.MsuType == null && x is { NumUniqueTracks: > 15, IgnoreUnknown: false, IsHardwareMsu: false } && string.IsNullOrEmpty(x.Settings.MsuTypeName) );
163+
164+
if (Model.DisplayUnknownMsuWindow)
165+
{
166+
OnDisplayUnknownMsuWindowRequest?.Invoke(this, EventArgs.Empty);
167+
}
158168
}
159169

160170
private string? GetMsuTypeBasePath(MsuType? msuType)

MSURandomizer/Services/MsuWindowService.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,15 @@ public void FinishInitialization()
130130

131131
public void FilterMsuList(MsuList msuList)
132132
{
133+
if (string.IsNullOrEmpty(Model.SelectedMsuType))
134+
{
135+
return;
136+
}
137+
133138
var msuType = msuTypeService.GetMsuType(Model.SelectedMsuType);
134139
if (msuType == null)
135140
{
136-
logger.LogWarning("Invalid MSU type");
141+
logger.LogWarning("Invalid MSU type selected: {Selection}", Model.SelectedMsuType);
137142
return;
138143
}
139144
msuList.FilterMSUs(msuType, Model.Filter);
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using AutoMapper;
4+
using AvaloniaControls.ControlServices;
5+
using AvaloniaControls.Services;
6+
using MSURandomizer.ViewModels;
7+
using MSURandomizerLibrary.Services;
8+
9+
namespace MSURandomizer.Services;
10+
11+
public class UnknownMsuWindowService(
12+
IMsuUserOptionsService userOptionsService,
13+
IMapper mapper,
14+
IMsuTypeService msuTypeService,
15+
IMsuCacheService msuCacheService,
16+
IMsuLookupService msuLookupService) : ControlService
17+
{
18+
private UnknownMsuWindowViewModel _model = new();
19+
private const int MaxPathLength = 50;
20+
21+
public UnknownMsuWindowViewModel InitilizeModel()
22+
{
23+
List<string> msuTypes = [""];
24+
msuTypes.AddRange(msuTypeService.MsuTypes.Select(x => x.DisplayName).OrderBy(x => x));
25+
26+
List<MsuDetailsWindowViewModel> msuModels = [];
27+
28+
foreach (var msu in msuLookupService.Msus.Where(x => x is { IgnoreUnknown: false, MsuType: null, NumUniqueTracks: >= 15 } && string.IsNullOrEmpty(x.Settings.MsuTypeName) ))
29+
{
30+
var msuModel = mapper.Map<MsuDetailsWindowViewModel>(msu.Settings);
31+
msuModel.Msu = msu;
32+
msuModel.TrackCount = msu.NumUniqueTracks;
33+
msuModel.MsuTypeNames = msuTypes;
34+
msuModel.HasBeenModified = false;
35+
36+
if (msuModel.MsuPath.Length > MaxPathLength)
37+
{
38+
msuModel.MsuPath = $"...{msuModel.MsuPath.Substring(msuModel.MsuPath.Length - MaxPathLength)}";
39+
}
40+
41+
msuModel.PropertyChanged += (sender, args) =>
42+
{
43+
_model.HasBeenModified = true;
44+
};
45+
msuModels.Add(msuModel);
46+
}
47+
48+
msuModels.Last().IsNotLast = false;
49+
50+
_model.UnknownMsus = msuModels;
51+
_model.HasBeenModified = false;
52+
53+
return _model;
54+
}
55+
56+
public void Save()
57+
{
58+
foreach (var msuModel in _model.UnknownMsus.Where(x => x.Msu != null))
59+
{
60+
mapper.Map(msuModel, msuModel.Msu!.Settings);
61+
msuModel.Msu.Settings.MsuPath = msuModel.Msu.Path;
62+
msuModel.Msu.Settings.IsUserUnknownMsu = string.IsNullOrEmpty(msuModel.MsuTypeName);
63+
userOptionsService.UpdateMsuSettings(msuModel.Msu);
64+
msuCacheService.Remove(msuModel.Msu.Path, false);
65+
}
66+
67+
userOptionsService.Save();
68+
69+
ITaskService.Run(() =>
70+
{
71+
msuLookupService.LookupMsus();
72+
});
73+
74+
}
75+
76+
public void SaveIgnore()
77+
{
78+
foreach (var msuModel in _model.UnknownMsus.Where(x => x.Msu != null))
79+
{
80+
msuModel.Msu!.Settings.IsUserUnknownMsu = true;
81+
userOptionsService.UpdateMsuSettings(msuModel.Msu);
82+
}
83+
84+
userOptionsService.Save();
85+
}
86+
}

MSURandomizer/ViewModels/MsuDetailsWindowViewModel.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ public class MsuDetailsWindowViewModel : ViewModelBase
2828
public List<MsuTrackViewModel> Tracks { get; set; } = new();
2929

3030
public List<string> MsuTypeNames { get; set; } = new();
31+
32+
public int TrackCount { get; set; }
33+
34+
public string TrackCountString => $"{TrackCount} Tracks";
35+
36+
public bool CanEditDetails => Msu?.HasDetails != true && Msu?.IsHardwareMsu != true;
37+
38+
public bool CanEditMsuType => Msu?.IsHardwareMsu != true;
3139

32-
public bool CanEditDetails => Msu?.HasDetails != true;
40+
public bool IsNotLast { get; set; } = true;
3341
}

MSURandomizer/ViewModels/MsuListViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using Avalonia.Controls;
34
using AvaloniaControls.Models;
@@ -32,6 +33,8 @@ public class MsuListViewModel : ViewModelBase
3233
[ReactiveLinkedProperties(nameof(SelectionMode))]
3334
public bool IsSingleSelectionMode { get; set; }
3435

36+
public bool DisplayUnknownMsuWindow { get; set; }
37+
3538
public SelectionMode SelectionMode =>
3639
IsSingleSelectionMode ? SelectionMode.Single : SelectionMode.Multiple | SelectionMode.Toggle;
3740
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using System.Collections.Generic;
2+
3+
namespace MSURandomizer.ViewModels;
4+
5+
public class UnknownMsuWindowViewModel : ViewModelBase
6+
{
7+
public List<MsuDetailsWindowViewModel> UnknownMsus { get; set; } = [];
8+
}

MSURandomizer/Views/MsuDetailsWindow.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,14 @@
4141
<controls:LabeledControl Text="MSU Type Override:">
4242
<ComboBox ItemsSource="{Binding MsuTypeNames}"
4343
SelectedItem="{Binding MsuTypeName}"
44+
IsEnabled="{Binding CanEditMsuType}"
4445
></ComboBox>
4546
</controls:LabeledControl>
4647
<controls:LabeledControl Text="Alt Track Shuffling:">
4748
<controls:EnumComboBox
4849
EnumType="{Binding AltOption, Converter={StaticResource TypeConverter}}"
4950
Value="{Binding AltOption, Mode=TwoWay}"
51+
IsEnabled="{Binding CanEditMsuType}"
5052
></controls:EnumComboBox>
5153
</controls:LabeledControl>
5254
<controls:LabeledControl Text="MSU Path:">

0 commit comments

Comments
 (0)