diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-04 09:19:29 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-04 09:19:29 +0200 |
| commit | 18f0573596392c98b9567bd441e61fc35026bfc6 (patch) | |
| tree | 5a89a0a5b1ec75d4916a55056a1ea5cfa0812717 | |
| parent | ea201d1f3d32d491b89c06bf90b90536a7dc8678 (diff) | |
feat: add toggle for task completion blinking feedbackv0.11.0
- Add 'B' hotkey to toggle blinking on/off when tasks are marked done
- When disabled, tasks complete immediately without visual distraction
- When enabled, provides visual feedback with blinking animation
- Show status message indicating toggle state
- Bump version to 0.11.0
| -rw-r--r-- | internal/ui/keyhandlers.go | 12 | ||||
| -rw-r--r-- | internal/ui/table.go | 24 | ||||
| -rw-r--r-- | internal/version.go | 2 |
3 files changed, 36 insertions, 2 deletions
diff --git a/internal/ui/keyhandlers.go b/internal/ui/keyhandlers.go index 027d5db..4262b22 100644 --- a/internal/ui/keyhandlers.go +++ b/internal/ui/keyhandlers.go @@ -96,6 +96,8 @@ func (m *Model) handleNormalMode(msg tea.KeyMsg) (tea.Model, tea.Cmd) { return m.handleResetTheme() case "x": return m.handleToggleDisco() + case "B": + return m.handleToggleBlink() case " ": return m.handleRefresh() case "/", "?": @@ -501,6 +503,16 @@ func (m *Model) handleToggleDisco() (tea.Model, tea.Cmd) { return m, nil } +func (m *Model) handleToggleBlink() (tea.Model, tea.Cmd) { + m.blinkEnabled = !m.blinkEnabled + if m.blinkEnabled { + m.statusMsg = "Blinking enabled" + } else { + m.statusMsg = "Blinking disabled" + } + return m, nil +} + func (m *Model) handleRefresh() (tea.Model, tea.Cmd) { m.reload() return m, nil diff --git a/internal/ui/table.go b/internal/ui/table.go index 65837a6..aa4ed38 100644 --- a/internal/ui/table.go +++ b/internal/ui/table.go @@ -103,6 +103,7 @@ type Model struct { blinkOn bool blinkCount int blinkMarkDone bool + blinkEnabled bool cellExpanded bool @@ -245,6 +246,27 @@ func (m *Model) startDetailBlink(fieldIndex int) tea.Cmd { func (m *Model) startBlink(id int, markDone bool) tea.Cmd { m.blinkID = id m.blinkMarkDone = markDone + + if !m.blinkEnabled { + // If blinking is disabled, still complete the task immediately + // by simulating the end of the blink cycle + if markDone { + for _, tsk := range m.tasks { + if tsk.ID == id { + m.undoStack = append(m.undoStack, tsk.UUID) + break + } + } + if err := task.Done(id); err != nil { + m.showError(err) + } + } + m.blinkID = 0 + m.blinkMarkDone = false + m.reload() + return nil + } + m.blinkRow = -1 for i, tsk := range m.tasks { if tsk.ID == id { @@ -267,7 +289,7 @@ func (m *Model) startBlink(id int, markDone bool) tea.Cmd { // New creates a new UI model with the provided rows. func New(filters []string, browserCmd string) (Model, error) { - m := Model{filters: filters, browserCmd: browserCmd} + m := Model{filters: filters, browserCmd: browserCmd, blinkEnabled: true} m.annotateInput = textinput.New() m.annotateInput.Prompt = "annotation: " m.descInput = textinput.New() diff --git a/internal/version.go b/internal/version.go index 4829ec5..2cdc207 100644 --- a/internal/version.go +++ b/internal/version.go @@ -1,4 +1,4 @@ package internal // Version is the current version of Task Samurai. -const Version = "0.10.0" +const Version = "0.11.0" |
