feat(ui): polish worktrees overview modal
- Restyle to match ListSettingsModalView: custom title bar, DeepBrush toolbar, LineBrush footer, SurfaceBrush outer border, no system chrome - Add column header row (TASK / BRANCH / STATE / DIFF / AGE) with TextFaintBrush + MonoFont + LetterSpacing, separator line below - Replace wt-row style with task-row-equivalent: transparent bg, CornerRadius 8, 1px border, :pointerover + .selected transitions - Add IsSelected to WorktreeOverviewRowViewModel; SelectRow() helper on modal VM clears previous selection before setting new one - Wire OnRowTapped in code-behind for click-to-select - Wire ShowDiff: VM takes Func<WorktreeModalViewModel> factory, builds diffVm and delegates window creation to both call sites (MainWindow and ListsIslandView); register Func<WorktreeModalViewModel> in DI Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -24,6 +24,7 @@ public sealed partial class WorktreeOverviewRowViewModel : ViewModelBase
|
||||
[ObservableProperty] private string? _diffStat;
|
||||
[ObservableProperty] private DateTime _createdAt;
|
||||
[ObservableProperty] private bool _pathExistsOnDisk;
|
||||
[ObservableProperty] private bool _isSelected;
|
||||
|
||||
public string AgeText => FormatAge(DateTime.UtcNow - CreatedAt);
|
||||
public bool IsActive => State == WorktreeState.Active;
|
||||
@@ -48,24 +49,34 @@ public sealed partial class WorktreesGroupViewModel : ViewModelBase
|
||||
public sealed partial class WorktreesOverviewModalViewModel : ViewModelBase
|
||||
{
|
||||
private readonly WorkerClient _worker;
|
||||
private readonly Func<WorktreeModalViewModel> _diffVmFactory;
|
||||
|
||||
[ObservableProperty] private string? _listIdFilter;
|
||||
[ObservableProperty] private string _title = "Worktrees";
|
||||
[ObservableProperty] private bool _isGlobal;
|
||||
[ObservableProperty] private bool _isBusy;
|
||||
[ObservableProperty] private string? _statusMessage;
|
||||
[ObservableProperty] private WorktreeOverviewRowViewModel? _selectedRow;
|
||||
|
||||
public ObservableCollection<WorktreeOverviewRowViewModel> Rows { get; } = new();
|
||||
public ObservableCollection<WorktreesGroupViewModel> Groups { get; } = new();
|
||||
|
||||
public Action? CloseAction { get; set; }
|
||||
public Action<WorktreeOverviewRowViewModel>? ShowDiffAction { get; set; }
|
||||
public Action<WorktreeModalViewModel>? ShowDiffAction { get; set; }
|
||||
public Action<string, string>? JumpToTaskAction { get; set; }
|
||||
public Func<string, Task<bool>>? ConfirmAction { get; set; }
|
||||
|
||||
public WorktreesOverviewModalViewModel(WorkerClient worker)
|
||||
public WorktreesOverviewModalViewModel(WorkerClient worker, Func<WorktreeModalViewModel> diffVmFactory)
|
||||
{
|
||||
_worker = worker;
|
||||
_diffVmFactory = diffVmFactory;
|
||||
}
|
||||
|
||||
public void SelectRow(WorktreeOverviewRowViewModel row)
|
||||
{
|
||||
if (SelectedRow is not null) SelectedRow.IsSelected = false;
|
||||
SelectedRow = row;
|
||||
row.IsSelected = true;
|
||||
}
|
||||
|
||||
public void Configure(string? listId, string? listName)
|
||||
@@ -136,7 +147,9 @@ public sealed partial class WorktreesOverviewModalViewModel : ViewModelBase
|
||||
private void ShowDiff(WorktreeOverviewRowViewModel? row)
|
||||
{
|
||||
if (row is null) return;
|
||||
ShowDiffAction?.Invoke(row);
|
||||
var diffVm = _diffVmFactory();
|
||||
diffVm.WorktreePath = row.Path;
|
||||
ShowDiffAction?.Invoke(diffVm);
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
|
||||
Reference in New Issue
Block a user