Compare commits

...

3 Commits

Author SHA1 Message Date
Niels Laute
d2a1584d16 Merge branch 'main' into niels9001/deduping-bands 2026-04-08 16:49:33 +02:00
Niels Laute
63bb079a85 Merge branch 'main' into niels9001/deduping-bands 2026-04-01 10:30:25 +02:00
Niels Laute
490e489970 Deduping 2026-03-30 21:04:09 +02:00
2 changed files with 30 additions and 11 deletions

View File

@@ -499,17 +499,6 @@ public sealed class CommandProviderWrapper : ICommandProviderContext
public void PinDockBand(string commandId, IServiceProvider serviceProvider, Dock.DockPinSide side = Dock.DockPinSide.Start, bool? showTitles = null, bool? showSubtitles = null)
{
var settingsService = serviceProvider.GetRequiredService<ISettingsService>();
var settings = settingsService.Settings;
var dockSettings = settings.DockSettings;
// Prevent duplicate pins — check all sections
if (dockSettings.StartBands.Any(b => b.CommandId == commandId && b.ProviderId == this.ProviderId) ||
dockSettings.CenterBands.Any(b => b.CommandId == commandId && b.ProviderId == this.ProviderId) ||
dockSettings.EndBands.Any(b => b.CommandId == commandId && b.ProviderId == this.ProviderId))
{
Logger.LogDebug($"Dock band '{commandId}' from provider '{this.ProviderId}' is already pinned; skipping.");
return;
}
var bandSettings = new DockBandSettings
{
@@ -523,6 +512,18 @@ public sealed class CommandProviderWrapper : ICommandProviderContext
s =>
{
var dockSettings = s.DockSettings;
// Prevent duplicate pins — check inside the CAS lambda so
// the guard is re-evaluated on every retry against the
// latest snapshot.
if (dockSettings.StartBands.Any(b => b.CommandId == commandId && b.ProviderId == this.ProviderId) ||
dockSettings.CenterBands.Any(b => b.CommandId == commandId && b.ProviderId == this.ProviderId) ||
dockSettings.EndBands.Any(b => b.CommandId == commandId && b.ProviderId == this.ProviderId))
{
Logger.LogDebug($"Dock band '{commandId}' from provider '{this.ProviderId}' is already pinned; skipping.");
return s;
}
return s with
{
DockSettings = side switch
@@ -583,6 +584,14 @@ public sealed class CommandProviderWrapper : ICommandProviderContext
Logger.LogDebug($"CommandProviderWrapper.PinDockBand: {ProviderId} - {bandVm.Id}");
var bands = this.DockBandItems.ToList();
// Prevent duplicate entries in the in-memory band list
if (bands.Any(b => b.Id == bandVm.Id))
{
Logger.LogDebug($"Dock band '{bandVm.Id}' already exists in DockBandItems; skipping.");
return;
}
bands.Add(bandVm);
this.DockBandItems = bands.ToArray();
this.CommandsChanged?.Invoke(this, new ItemsChangedEventArgs());

View File

@@ -85,9 +85,19 @@ public sealed partial class DockViewModel
ObservableCollection<DockBandViewModel> target)
{
List<DockBandViewModel> newBands = new();
HashSet<string> seen = new(StringComparer.Ordinal);
foreach (var band in bands)
{
var commandId = band.CommandId;
// Skip duplicate entries that share the same provider + command id
var key = $"{band.ProviderId}\0{commandId}";
if (!seen.Add(key))
{
Logger.LogWarning($"Skipping duplicate dock band entry {commandId} for provider {band.ProviderId}");
continue;
}
var topLevelCommand = _topLevelCommandManager.LookupDockBand(commandId);
if (topLevelCommand is null)