diff --git a/src/ClaudeDo.Ui/ViewModels/TaskItemViewModel.cs b/src/ClaudeDo.Ui/ViewModels/TaskItemViewModel.cs index e95e6b2..a834084 100644 --- a/src/ClaudeDo.Ui/ViewModels/TaskItemViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/TaskItemViewModel.cs @@ -14,6 +14,7 @@ public partial class TaskItemViewModel : ViewModelBase [ObservableProperty] private string _commitType; [ObservableProperty] private string? _description; [ObservableProperty] private TaskStatus _status; + [ObservableProperty] private bool _isStarting; public string Id { get; } public string ListId { get; } @@ -66,6 +67,7 @@ public partial class TaskItemViewModel : ViewModelBase RunNowCommand.NotifyCanExecuteChanged(); OnPropertyChanged(nameof(IsDone)); OnPropertyChanged(nameof(IsRunning)); + IsStarting = false; OnPropertyChanged(nameof(CanToggleDone)); OnPropertyChanged(nameof(TitleDecorations)); OnPropertyChanged(nameof(TitleForeground)); @@ -73,6 +75,19 @@ public partial class TaskItemViewModel : ViewModelBase ToggleDoneCommand.NotifyCanExecuteChanged(); } + public void SetStarting() + { + IsStarting = true; + StatusText = "starting..."; + RunNowCommand.NotifyCanExecuteChanged(); + } + + public void ClearStarting() + { + IsStarting = false; + RunNowCommand.NotifyCanExecuteChanged(); + } + [RelayCommand(CanExecute = nameof(CanRunNow))] private async Task RunNowAsync() { @@ -81,7 +96,7 @@ public partial class TaskItemViewModel : ViewModelBase } private bool CanRunNow() => - _canRunNow() && Status != TaskStatus.Running; + _canRunNow() && Status != TaskStatus.Running && !IsStarting; [RelayCommand(CanExecute = nameof(CanToggleDone))] private async Task ToggleDone() diff --git a/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs b/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs index baf25f7..1e9fc78 100644 --- a/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/TaskListViewModel.cs @@ -55,6 +55,18 @@ public partial class TaskListViewModel : ViewModelBase 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) diff --git a/src/ClaudeDo.Ui/Views/TaskListView.axaml b/src/ClaudeDo.Ui/Views/TaskListView.axaml index 063bc06..8115794 100644 --- a/src/ClaudeDo.Ui/Views/TaskListView.axaml +++ b/src/ClaudeDo.Ui/Views/TaskListView.axaml @@ -70,6 +70,10 @@ Fill="{StaticResource StatusOrangeBrush}" IsVisible="{Binding IsRunning}" HorizontalAlignment="Center" VerticalAlignment="Center"/> + +