diff --git a/src/ClaudeDo.Localization/locales/de.json b/src/ClaudeDo.Localization/locales/de.json index 8e0bb45..cf35ead 100644 --- a/src/ClaudeDo.Localization/locales/de.json +++ b/src/ClaudeDo.Localization/locales/de.json @@ -192,6 +192,11 @@ "overLimitError": "Konnte {0} nicht hinzufügen: {1}", "invalidNameError": "Konnte {0} nicht hinzufügen: {1}", "selectIdleTask": "Zuerst eine inaktive Aufgabe auswählen" + }, + "sections": { + "description": "Beschreibung", + "steps": "Schritte", + "files": "Dateien" } }, "agent": { diff --git a/src/ClaudeDo.Localization/locales/en.json b/src/ClaudeDo.Localization/locales/en.json index 16f16c0..1786344 100644 --- a/src/ClaudeDo.Localization/locales/en.json +++ b/src/ClaudeDo.Localization/locales/en.json @@ -192,6 +192,11 @@ "overLimitError": "Could not add {0}: {1}", "invalidNameError": "Could not add {0}: {1}", "selectIdleTask": "Select an idle task first" + }, + "sections": { + "description": "Description", + "steps": "Steps", + "files": "Files" } }, "agent": { diff --git a/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs index 6a1e613..2fac4db 100644 --- a/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Islands/DetailsIslandViewModel.cs @@ -117,23 +117,30 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase, IDisposable [RelayCommand] private void ToggleDescriptionExpanded() => IsDescriptionExpanded = !IsDescriptionExpanded; - [ObservableProperty] private bool _isStepsExpanded; + // Which section of the details card is shown (header acts as a segment switcher). + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsDescriptionSection))] + [NotifyPropertyChangedFor(nameof(IsStepsSection))] + [NotifyPropertyChangedFor(nameof(IsFilesSection))] + private string _detailSection = "description"; + + public bool IsDescriptionSection => DetailSection == "description"; + public bool IsStepsSection => DetailSection == "steps"; + public bool IsFilesSection => DetailSection == "files"; [RelayCommand] - private void ToggleStepsExpanded() => IsStepsExpanded = !IsStepsExpanded; + private void SelectDetailSection(string? section) => DetailSection = section ?? "description"; public int TotalStepCount => Subtasks.Count; - public int OpenStepCount => Subtasks.Count(s => !s.Done); - public string StepsSummary => - TotalStepCount == 0 ? "no steps yet" - : OpenStepCount == 0 ? $"all done · {TotalStepCount} total" - : $"{OpenStepCount} open · {TotalStepCount} total"; + public int DoneStepCount => Subtasks.Count(s => s.Done); + public string StepsBadge => TotalStepCount > 0 ? $"{DoneStepCount}/{TotalStepCount}" : ""; + public string FilesBadge => Attachments.Count > 0 ? Attachments.Count.ToString() : ""; private void NotifyStepsChanged() { OnPropertyChanged(nameof(TotalStepCount)); - OnPropertyChanged(nameof(OpenStepCount)); - OnPropertyChanged(nameof(StepsSummary)); + OnPropertyChanged(nameof(DoneStepCount)); + OnPropertyChanged(nameof(StepsBadge)); OnPropertyChanged(nameof(ComposedPreview)); } @@ -425,6 +432,7 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase, IDisposable Notes = new NotesEditorViewModel(_notesApi); Subtasks.CollectionChanged += (_, _) => NotifyStepsChanged(); Subtasks.CollectionChanged += (_, _) => Merge.SyncChildOutcomes(HasChildOutcomes, Subtasks.Count); + Attachments.CollectionChanged += (_, _) => OnPropertyChanged(nameof(FilesBadge)); AgentSettings.PropertyChanged += (_, e) => { @@ -1233,6 +1241,7 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase, IDisposable public async System.Threading.Tasks.Task AddFilesAsync(IReadOnlyList<(string FileName, Stream Content)> files) { + DetailSection = "files"; if (Task is null || Task.IsRunning) { DropStatus = Loc.T("details.attachments.selectIdleTask"); diff --git a/src/ClaudeDo.Ui/Views/Islands/Detail/DescriptionStepsCard.axaml b/src/ClaudeDo.Ui/Views/Islands/Detail/DescriptionStepsCard.axaml index 78bc9d1..16d4c07 100644 --- a/src/ClaudeDo.Ui/Views/Islands/Detail/DescriptionStepsCard.axaml +++ b/src/ClaudeDo.Ui/Views/Islands/Detail/DescriptionStepsCard.axaml @@ -6,17 +6,70 @@ x:Class="ClaudeDo.Ui.Views.Islands.Detail.DescriptionStepsCard" x:DataType="vm:DetailsIslandViewModel"> + + + + + + + + - + - + + + + - + + + + + + + - - - - - - - + + - - - - - - - - - - - - - + + + - - - - - - + LostFocus="OnSubtaskEditLostFocus"> + + + + + - - - - - - + + + + + - - - - - - + + @@ -211,9 +234,8 @@ Foreground="{DynamicResource TextMuteBrush}" TextWrapping="Wrap"/> - - +