Skip to content

Commit 4a1b680

Browse files
authored
Merge pull request #15 from fumeapp/disable-ui
🎨 1st attempt at disabling the ui
2 parents 89e6c59 + d2b6b47 commit 4a1b680

File tree

7 files changed

+107
-11
lines changed

7 files changed

+107
-11
lines changed

config.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import (
77
)
88

99
type Config struct {
10-
Options ConfigOptions
11-
Spinner spinner.Spinner
1210
Colors ConfigColors
13-
ProgressOptions []progress.Option
1411
Chars ConfigChars
12+
Spinner spinner.Spinner
13+
Options ConfigOptions
14+
ProgressOptions []progress.Option
15+
DisableUI bool // Disable animations and spinners
1516
}
1617

1718
type ConfigOptions struct {

config_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,33 @@ func TestConfig(t *testing.T) {
5858
t.Errorf("Expected ExitOnFailure to be 'true', got '%v'", config.Options.ExitOnFailure)
5959
}
6060
}
61+
62+
func TestDisableUI(t *testing.T) {
63+
tasks := Tasks{
64+
{
65+
Title: "Test task",
66+
Task: func(task *Task) error {
67+
task.Title = "Test task completed"
68+
return nil
69+
},
70+
},
71+
}
72+
73+
// Test with UI disabled
74+
cfg := Defaults
75+
cfg.DisableUI = true
76+
77+
runners := New(tasks, cfg)
78+
79+
// Verify that spinners are not initialized when UI is disabled
80+
for _, runner := range runners {
81+
if runner.Spinner != nil {
82+
t.Error("Expected spinner to be nil when DisableUI is true")
83+
}
84+
}
85+
86+
err := runners.Run()
87+
if err != nil {
88+
t.Fatalf("Expected no error, got: %v", err)
89+
}
90+
}

examples/disable-ui/main.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
7+
"github.com/fumeapp/taskin"
8+
)
9+
10+
func main() {
11+
tasks := taskin.Tasks{
12+
{
13+
Title: "Task with UI disabled",
14+
Task: func(t *taskin.Task) error {
15+
for i := 0; i < 3; i++ {
16+
t.Title = fmt.Sprintf("Task with UI disabled: [%d/3] processing", i+1)
17+
time.Sleep(500 * time.Millisecond)
18+
}
19+
return nil
20+
},
21+
},
22+
{
23+
Title: "Parent task with children",
24+
Tasks: taskin.Tasks{
25+
{
26+
Title: "Child task 1",
27+
Task: func(t *taskin.Task) error {
28+
for i := 0; i < 2; i++ {
29+
t.Title = fmt.Sprintf("Child task 1: [%d/2] working", i+1)
30+
time.Sleep(300 * time.Millisecond)
31+
}
32+
return nil
33+
},
34+
},
35+
{
36+
Title: "Child task 2",
37+
Task: func(t *taskin.Task) error {
38+
for i := 0; i < 2; i++ {
39+
t.Title = fmt.Sprintf("Child task 2: [%d/2] working", i+1)
40+
time.Sleep(300 * time.Millisecond)
41+
}
42+
return nil
43+
},
44+
},
45+
},
46+
},
47+
}
48+
49+
// Create configuration with UI disabled
50+
cfg := taskin.Defaults
51+
cfg.DisableUI = true
52+
53+
runners := taskin.New(tasks, cfg)
54+
err := runners.Run()
55+
if err != nil {
56+
panic(err)
57+
}
58+
}

examples/too-much-to-do/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func main() {
1616
libraries := generateLibraries(20)
1717
runners := NewLibraryDownloader(libraries)
1818

19-
runners.Run()
19+
runners.Run() //nolint:errcheck // Example code
2020
}
2121

2222
func generateLibraries(count int) []Library {

mvc.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
4646
var spinnerCmds []tea.Cmd
4747

4848
if runner.State == Running || runner.State == NotStarted {
49-
if !IsCI() && runner.Spinner != nil {
49+
if !IsCI() && !runner.Config.DisableUI && runner.Spinner != nil {
5050
newSpinner, cmd := runner.Spinner.Update(msg)
5151
runner.Spinner = &newSpinner
5252
spinnerCmds = append(spinnerCmds, cmd)
@@ -105,8 +105,8 @@ func (m *Model) View() string {
105105
}
106106
}
107107

108-
// Handle CI mode
109-
if IsCI() {
108+
// Handle CI mode or UI disabled mode
109+
if IsCI() || (len(m.Runners) > 0 && m.Runners[0].Config.DisableUI) {
110110
allDone, anyFailed := m.checkTasksState()
111111
if !allDone && !anyFailed {
112112
return ""
@@ -142,14 +142,14 @@ func renderTask(runner Runner, indent string) string {
142142
status = Color(runner.Config.Colors.Failure, runner.Config.Chars.Failure) + " " + runner.Task.Title
143143
}
144144

145-
if IsCI() {
145+
if IsCI() || runner.Config.DisableUI {
146146
view = indent + status + "\n"
147147
} else {
148148
view = indent + lipgloss.NewStyle().Render(status) + "\n"
149149
}
150150

151151
// Recursively render children
152-
if len(runner.Children) > 0 && (runner.State == Running || IsCI()) {
152+
if len(runner.Children) > 0 && (runner.State == Running || IsCI() || runner.Config.DisableUI) {
153153
for _, child := range runner.Children {
154154
view += renderTask(child, indent+" ")
155155
}

readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ https://github.com/fumeapp/taskin/blob/3cd766c21e5eaba5edb33f38d3781d6cf814f9f9/
5656

5757

5858

59+
Disable UI animations and spinners
60+
61+
https://github.com/fumeapp/taskin/blob/main/examples/disable-ui/main.go#L32-L42
62+
63+
This is useful when you want plain text output without animations, similar to CI mode but controllable via configuration.
64+
5965
Nest tasks inside tasks
6066

6167
https://github.com/fumeapp/taskin/blob/3cd766c21e5eaba5edb33f38d3781d6cf814f9f9/examples/multi/main.go#L23-L34

taskin.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func NewRunner(task Task, cfg Config) Runner {
1919

2020
var spinr *spinner.Model
2121

22-
if !IsCI() {
22+
if !IsCI() && !cfg.DisableUI {
2323
spinnerModel := spinner.New(spinner.WithSpinner(cfg.Spinner)) // Initialize with a spinner model
2424
spinnerModel.Style = lipgloss.NewStyle().Foreground(cfg.Colors.Spinner) // Styling spinner
2525
spinr = &spinnerModel
@@ -73,7 +73,8 @@ func (r *Runners) Run() error {
7373
m := &Model{Runners: *r, Shutdown: false, ShutdownError: nil}
7474

7575
var out io.Writer = os.Stdout
76-
if IsCI() {
76+
// Check if we need to disable UI features or are in CI mode
77+
if IsCI() || (len(*r) > 0 && (*r)[0].Config.DisableUI) {
7778
out = &ansiEscapeCodeFilter{writer: out}
7879
}
7980

0 commit comments

Comments
 (0)