feat(ui): add starting state feedback to task list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Mika Kuns
2026-04-14 16:27:04 +02:00
parent 365ecba990
commit 503fd69cd1
3 changed files with 32 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ public partial class TaskItemViewModel : ViewModelBase
[ObservableProperty] private string _commitType; [ObservableProperty] private string _commitType;
[ObservableProperty] private string? _description; [ObservableProperty] private string? _description;
[ObservableProperty] private TaskStatus _status; [ObservableProperty] private TaskStatus _status;
[ObservableProperty] private bool _isStarting;
public string Id { get; } public string Id { get; }
public string ListId { get; } public string ListId { get; }
@@ -66,6 +67,7 @@ public partial class TaskItemViewModel : ViewModelBase
RunNowCommand.NotifyCanExecuteChanged(); RunNowCommand.NotifyCanExecuteChanged();
OnPropertyChanged(nameof(IsDone)); OnPropertyChanged(nameof(IsDone));
OnPropertyChanged(nameof(IsRunning)); OnPropertyChanged(nameof(IsRunning));
IsStarting = false;
OnPropertyChanged(nameof(CanToggleDone)); OnPropertyChanged(nameof(CanToggleDone));
OnPropertyChanged(nameof(TitleDecorations)); OnPropertyChanged(nameof(TitleDecorations));
OnPropertyChanged(nameof(TitleForeground)); OnPropertyChanged(nameof(TitleForeground));
@@ -73,6 +75,19 @@ public partial class TaskItemViewModel : ViewModelBase
ToggleDoneCommand.NotifyCanExecuteChanged(); ToggleDoneCommand.NotifyCanExecuteChanged();
} }
public void SetStarting()
{
IsStarting = true;
StatusText = "starting...";
RunNowCommand.NotifyCanExecuteChanged();
}
public void ClearStarting()
{
IsStarting = false;
RunNowCommand.NotifyCanExecuteChanged();
}
[RelayCommand(CanExecute = nameof(CanRunNow))] [RelayCommand(CanExecute = nameof(CanRunNow))]
private async Task RunNowAsync() private async Task RunNowAsync()
{ {
@@ -81,7 +96,7 @@ public partial class TaskItemViewModel : ViewModelBase
} }
private bool CanRunNow() => private bool CanRunNow() =>
_canRunNow() && Status != TaskStatus.Running; _canRunNow() && Status != TaskStatus.Running && !IsStarting;
[RelayCommand(CanExecute = nameof(CanToggleDone))] [RelayCommand(CanExecute = nameof(CanToggleDone))]
private async Task ToggleDone() private async Task ToggleDone()

View File

@@ -55,6 +55,18 @@ public partial class TaskListViewModel : ViewModelBase
t.RunNowCommand.NotifyCanExecuteChanged(); t.RunNowCommand.NotifyCanExecuteChanged();
}); });
}; };
worker.RunNowRequestedEvent += taskId =>
{
var item = Tasks.FirstOrDefault(t => t.Id == taskId);
item?.SetStarting();
};
worker.TaskStartedEvent += (_, taskId, _) =>
{
var item = Tasks.FirstOrDefault(t => t.Id == taskId);
item?.ClearStarting();
};
} }
public async Task LoadAsync(string? listId) public async Task LoadAsync(string? listId)

View File

@@ -70,6 +70,10 @@
Fill="{StaticResource StatusOrangeBrush}" Fill="{StaticResource StatusOrangeBrush}"
IsVisible="{Binding IsRunning}" IsVisible="{Binding IsRunning}"
HorizontalAlignment="Center" VerticalAlignment="Center"/> HorizontalAlignment="Center" VerticalAlignment="Center"/>
<!-- Starting dot -->
<Ellipse Width="8" Height="8" Fill="#FFD700"
IsVisible="{Binding IsStarting}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Panel> </Panel>
</Border> </Border>