summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-04 09:19:29 +0200
committerPaul Buetow <paul@buetow.org>2026-02-04 09:19:29 +0200
commit18f0573596392c98b9567bd441e61fc35026bfc6 (patch)
tree5a89a0a5b1ec75d4916a55056a1ea5cfa0812717
parentea201d1f3d32d491b89c06bf90b90536a7dc8678 (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.go12
-rw-r--r--internal/ui/table.go24
-rw-r--r--internal/version.go2
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"