Skip to content

Commit d3d35ce

Browse files
Add selection highlighting across all UI lists
- Composition grid: converted from ItemsControl to ListBox with accent blue border on selected cell; single-click navigates to sprite in list - Sprite strip: selected sprite gets accent blue border instead of static - OTB items list: selected item sprite thumbnail gets accent blue border - Client items list: same accent blue border on selected item thumbnail - Removed obsolete OnCompositionSpriteDoubleTapped (replaced by binding)
1 parent 3a766f6 commit d3d35ce

3 files changed

Lines changed: 110 additions & 25 deletions

File tree

src/App/MainWindow.axaml

Lines changed: 90 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -538,10 +538,19 @@
538538
<MenuItem Header="Remove Selected" x:Name="RemoveSelectedMenuItem" Foreground="#f38ba8"/>
539539
</ContextMenu>
540540
</ListBox.ContextMenu>
541+
<ListBox.Styles>
542+
<Style Selector="Border.clientSprBox">
543+
<Setter Property="BorderBrush" Value="Transparent"/>
544+
</Style>
545+
<Style Selector="ListBoxItem:selected Border.clientSprBox">
546+
<Setter Property="BorderBrush" Value="#89b4fa"/>
547+
</Style>
548+
</ListBox.Styles>
541549
<ListBox.ItemTemplate>
542550
<DataTemplate x:DataType="vm:ClientItemViewModel">
543551
<Grid ColumnDefinitions="38,*" Height="38" Margin="2,1">
544-
<Border Background="#11111b" CornerRadius="4" Width="32" Height="32"
552+
<Border Classes="clientSprBox" Background="#11111b" CornerRadius="4" Width="32" Height="32"
553+
BorderThickness="2"
545554
VerticalAlignment="Center" HorizontalAlignment="Center" ClipToBounds="True">
546555
<Image Source="{Binding Sprite}" Width="32" Height="32"
547556
RenderOptions.BitmapInterpolationMode="None" Stretch="Uniform"/>
@@ -578,28 +587,58 @@
578587
Height="{Binding CompositionPreviewHeight}"
579588
HorizontalAlignment="Center" VerticalAlignment="Center">
580589
<Border Background="{Binding CompositionGridBrush}">
581-
<ItemsControl x:Name="CompositionGrid" ItemsSource="{Binding CompositionSprites}">
582-
<ItemsControl.ItemsPanel>
590+
<ListBox x:Name="CompositionGrid" ItemsSource="{Binding CompositionSprites}"
591+
SelectedItem="{Binding SelectedCompositionSprite}"
592+
SelectionMode="Single"
593+
Background="Transparent" BorderThickness="0" Padding="0">
594+
<ListBox.ItemsPanel>
583595
<ItemsPanelTemplate><WrapPanel/></ItemsPanelTemplate>
584-
</ItemsControl.ItemsPanel>
585-
<ItemsControl.ItemTemplate>
596+
</ListBox.ItemsPanel>
597+
<ListBox.Styles>
598+
<Style Selector="ListBoxItem">
599+
<Setter Property="Padding" Value="0"/>
600+
<Setter Property="Margin" Value="0"/>
601+
<Setter Property="MinWidth" Value="0"/>
602+
<Setter Property="MinHeight" Value="0"/>
603+
<Setter Property="Background" Value="Transparent"/>
604+
</Style>
605+
<Style Selector="Border.compCell">
606+
<Setter Property="BorderBrush" Value="Transparent"/>
607+
</Style>
608+
<Style Selector="ListBoxItem:selected">
609+
<Setter Property="Background" Value="Transparent"/>
610+
</Style>
611+
<Style Selector="ListBoxItem:pointerover">
612+
<Setter Property="Background" Value="Transparent"/>
613+
</Style>
614+
<Style Selector="ListBoxItem:selected /template/ ContentPresenter">
615+
<Setter Property="Background" Value="Transparent"/>
616+
</Style>
617+
<Style Selector="ListBoxItem:pointerover /template/ ContentPresenter">
618+
<Setter Property="Background" Value="Transparent"/>
619+
</Style>
620+
<Style Selector="ListBoxItem:selected Border.compCell">
621+
<Setter Property="BorderBrush" Value="#89b4fa"/>
622+
</Style>
623+
</ListBox.Styles>
624+
<ListBox.ItemTemplate>
586625
<DataTemplate x:DataType="vm:SpriteViewModel">
587-
<Border Width="64" Height="64" Margin="1" Background="#11111b"
588-
ToolTip.Tip="{Binding SpriteId}"
589-
DoubleTapped="OnCompositionSpriteDoubleTapped">
626+
<Border Classes="compCell" Width="64" Height="64" Margin="1"
627+
Background="#11111b" BorderThickness="2"
628+
ToolTip.Tip="{Binding SpriteId}">
590629
<Border.ContextMenu>
591630
<ContextMenu>
592631
<MenuItem Header="Paste"
593-
Command="{Binding $parent[ItemsControl].((vm:MainWindowViewModel)DataContext).PasteSpriteToSlotCommand}"
632+
Command="{Binding $parent[ListBox].((vm:MainWindowViewModel)DataContext).PasteSpriteToSlotCommand}"
594633
CommandParameter="{Binding}"/>
595634
</ContextMenu>
596635
</Border.ContextMenu>
597-
<Image Source="{Binding Bitmap}" Width="64" Height="64"
636+
<Image Source="{Binding Bitmap}" Width="60" Height="60"
598637
RenderOptions.BitmapInterpolationMode="None" Stretch="Fill"/>
599638
</Border>
600639
</DataTemplate>
601-
</ItemsControl.ItemTemplate>
602-
</ItemsControl>
640+
</ListBox.ItemTemplate>
641+
</ListBox>
603642
</Border>
604643
<Rectangle IsVisible="{Binding ShowCropSize}"
605644
Width="{Binding CropOverlaySize}" Height="{Binding CropOverlaySize}"
@@ -1350,6 +1389,14 @@
13501389
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
13511390
DoubleTapped="OnOtbItemDoubleTapped"
13521391
SelectionChanged="OnOtbItemSelectionChanged">
1392+
<ListBox.Styles>
1393+
<Style Selector="Border.otbSprBox">
1394+
<Setter Property="BorderBrush" Value="Transparent"/>
1395+
</Style>
1396+
<Style Selector="ListBoxItem:selected Border.otbSprBox">
1397+
<Setter Property="BorderBrush" Value="#89b4fa"/>
1398+
</Style>
1399+
</ListBox.Styles>
13531400
<ListBox.ContextMenu>
13541401
<ContextMenu x:Name="OtbItemContextMenu" Opening="OnOtbItemContextMenuOpening">
13551402
<MenuItem Header="Remove Selected" x:Name="RemoveOtbSelectedMenuItem" Foreground="#f38ba8"/>
@@ -1358,7 +1405,8 @@
13581405
<ListBox.ItemTemplate>
13591406
<DataTemplate x:DataType="vm:ItemViewModel">
13601407
<Grid ColumnDefinitions="38,Auto,*" Height="36" Margin="3,1">
1361-
<Border Background="#11111b" CornerRadius="4" Width="30" Height="30"
1408+
<Border Classes="otbSprBox" Background="#11111b" CornerRadius="4" Width="30" Height="30"
1409+
BorderThickness="2"
13621410
VerticalAlignment="Center" HorizontalAlignment="Center" ClipToBounds="True">
13631411
<Image Source="{Binding Sprite}" Width="30" Height="30"
13641412
RenderOptions.BitmapInterpolationMode="None" Stretch="Uniform"/>
@@ -1423,10 +1471,37 @@
14231471
<StackPanel Orientation="Horizontal" Spacing="2"/>
14241472
</ItemsPanelTemplate>
14251473
</ListBox.ItemsPanel>
1474+
<ListBox.Styles>
1475+
<Style Selector="ListBoxItem">
1476+
<Setter Property="Padding" Value="0"/>
1477+
<Setter Property="Margin" Value="0"/>
1478+
<Setter Property="MinWidth" Value="0"/>
1479+
<Setter Property="MinHeight" Value="0"/>
1480+
<Setter Property="Background" Value="Transparent"/>
1481+
</Style>
1482+
<Style Selector="Border.sprCell">
1483+
<Setter Property="BorderBrush" Value="#313244"/>
1484+
</Style>
1485+
<Style Selector="ListBoxItem:selected">
1486+
<Setter Property="Background" Value="Transparent"/>
1487+
</Style>
1488+
<Style Selector="ListBoxItem:pointerover">
1489+
<Setter Property="Background" Value="Transparent"/>
1490+
</Style>
1491+
<Style Selector="ListBoxItem:selected /template/ ContentPresenter">
1492+
<Setter Property="Background" Value="Transparent"/>
1493+
</Style>
1494+
<Style Selector="ListBoxItem:pointerover /template/ ContentPresenter">
1495+
<Setter Property="Background" Value="Transparent"/>
1496+
</Style>
1497+
<Style Selector="ListBoxItem:selected Border.sprCell">
1498+
<Setter Property="BorderBrush" Value="#89b4fa"/>
1499+
</Style>
1500+
</ListBox.Styles>
14261501
<ListBox.ItemTemplate>
14271502
<DataTemplate x:DataType="vm:SpriteViewModel">
1428-
<Border Width="38" Height="46" Margin="1" Background="#11111b"
1429-
CornerRadius="3" BorderBrush="#313244" BorderThickness="1"
1503+
<Border Classes="sprCell" Width="38" Height="46" Margin="1" Background="#11111b"
1504+
CornerRadius="3" BorderThickness="2"
14301505
ToolTip.Tip="{Binding SpriteId}"
14311506
PointerPressed="OnRightSpritePointerPressed"
14321507
PointerMoved="OnRightSpritePointerMoved"

src/App/MainWindow.axaml.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -286,16 +286,6 @@ private void OnMinimapColorPicked(object? sender, PointerPressedEventArgs e)
286286
}
287287
}
288288

289-
private void OnCompositionSpriteDoubleTapped(object? sender, TappedEventArgs e)
290-
{
291-
if (sender is Border border
292-
&& border.DataContext is SpriteViewModel svm
293-
&& DataContext is MainWindowViewModel vm)
294-
{
295-
vm.NavigateRightSpriteToIdCommand.Execute(svm.SpriteId);
296-
}
297-
}
298-
299289
// ── Sprite drag-drop: drag from sprite list → drop on composition cell ──
300290

301291
private SpriteViewModel? _dragSprite;

src/App/ViewModels/MainWindowViewModel.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,7 +1153,20 @@ private void SelectInspectorItem(TileItemInfo? item)
11531153
InspectorDetailSections.Clear();
11541154
if (item == null) return;
11551155

1156+
// Auto-select the corresponding OTB item in the items list
11561157
ushort serverId = item.ServerId;
1158+
var otbIdx = _otbPanelFilteredItems.FindIndex(v => v.ServerId == serverId);
1159+
if (otbIdx >= 0)
1160+
{
1161+
int page = otbIdx / OtbPanelItemsPerPage + 1;
1162+
if (page != OtbPanelCurrentPage)
1163+
{
1164+
OtbPanelCurrentPage = page;
1165+
LoadOtbPanelPage();
1166+
}
1167+
SelectedItem = _otbPanelFilteredItems[otbIdx];
1168+
}
1169+
11571170
var otbItem = _otbData?.Items.FirstOrDefault(o => o.ServerId == serverId);
11581171
ushort clientId = otbItem?.ClientId ?? 0;
11591172
DatThingType? datType = null;
@@ -1879,6 +1892,13 @@ private void BuildFilmstrip()
18791892
[ObservableProperty] private int _compositionPatternY;
18801893
[ObservableProperty] private int _compositionPatternZ;
18811894
public ObservableCollection<SpriteViewModel> CompositionSprites { get; } = [];
1895+
[ObservableProperty] private SpriteViewModel? _selectedCompositionSprite;
1896+
1897+
partial void OnSelectedCompositionSpriteChanged(SpriteViewModel? value)
1898+
{
1899+
if (value != null && value.SpriteId > 0)
1900+
NavigateRightSpriteToId(value.SpriteId);
1901+
}
18821902

18831903
// ── Category visibility helpers (for conditional controls like OB) ──
18841904
public bool IsItemSelected => SelectedClientItem?.ThingType.Category == ThingCategory.Item;

0 commit comments

Comments
 (0)