Skip to content

Commit 3ac4982

Browse files
Merge pull request #56 from MattEqualsCoder/unknown-msu-window
Unknown msu window
2 parents 31af6b6 + ab2bb30 commit 3ac4982

21 files changed

+328
-13
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/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>2.2.0-rc.1</Version>
9+
<Version>3.0.0-rc.1</Version>
1010
<ApplicationIcon>MSURandomizerIcon.ico</ApplicationIcon>
1111
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1212
<PackageId>MattEqualsCoder.MSURandomizer.Avalonia</PackageId>

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: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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.AbbreviatedPath = $"...{msuModel.MsuPath.Substring(msuModel.MsuPath.Length - MaxPathLength)}";
39+
}
40+
else
41+
{
42+
msuModel.AbbreviatedPath = msuModel.MsuPath;
43+
}
44+
45+
msuModel.PropertyChanged += (sender, args) =>
46+
{
47+
_model.HasBeenModified = true;
48+
};
49+
msuModels.Add(msuModel);
50+
}
51+
52+
msuModels.Last().IsNotLast = false;
53+
54+
_model.UnknownMsus = msuModels;
55+
_model.HasBeenModified = false;
56+
57+
return _model;
58+
}
59+
60+
public void Save()
61+
{
62+
foreach (var msuModel in _model.UnknownMsus.Where(x => x.Msu != null))
63+
{
64+
mapper.Map(msuModel, msuModel.Msu!.Settings);
65+
msuModel.Msu.Settings.IsUserUnknownMsu = string.IsNullOrEmpty(msuModel.MsuTypeName);
66+
userOptionsService.UpdateMsuSettings(msuModel.Msu);
67+
msuCacheService.Remove(msuModel.Msu.Path, false);
68+
}
69+
70+
userOptionsService.Save();
71+
72+
ITaskService.Run(() =>
73+
{
74+
msuLookupService.LookupMsus();
75+
});
76+
77+
}
78+
79+
public void SaveIgnore()
80+
{
81+
foreach (var msuModel in _model.UnknownMsus.Where(x => x.Msu != null))
82+
{
83+
msuModel.Msu!.Settings.IsUserUnknownMsu = true;
84+
userOptionsService.UpdateMsuSettings(msuModel.Msu);
85+
}
86+
87+
userOptionsService.Save();
88+
}
89+
}

MSURandomizer/ViewModels/MsuDetailsWindowViewModel.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ namespace MSURandomizer.ViewModels;
1010
public class MsuDetailsWindowViewModel : ViewModelBase
1111
{
1212
[Reactive] public string MsuPath { get; set; } = "";
13+
14+
[Reactive] public string AbbreviatedPath { get; set; } = "";
1315

1416
[Reactive] public string? MsuTypeName { get; set; }
1517

@@ -28,6 +30,14 @@ public class MsuDetailsWindowViewModel : ViewModelBase
2830
public List<MsuTrackViewModel> Tracks { get; set; } = new();
2931

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

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

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+
}

0 commit comments

Comments
 (0)