style tables and add out/err highlights

improve projector open error message if an invalid monitor index is passed.
it now prints the monitor name and suggests `gobs-cli prj ls-m`

improve error message for sceneitem commands if a scene item in a group is queried without the --group flag.
This commit is contained in:
2025-06-21 06:41:12 +01:00
parent d699939298
commit 7147c3f1ca
11 changed files with 424 additions and 150 deletions

View File

@@ -5,7 +5,8 @@ import (
"slices"
"github.com/andreykaipov/goobs/api/requests/scenes"
"github.com/aquasecurity/table"
"github.com/charmbracelet/lipgloss"
"github.com/charmbracelet/lipgloss/table"
)
// SceneCmd provides commands to manage scenes in OBS Studio.
@@ -21,6 +22,7 @@ type SceneListCmd struct {
}
// Run executes the command to list all scenes.
// nolint: misspell
func (cmd *SceneListCmd) Run(ctx *context) error {
scenes, err := ctx.Client.Scenes.GetSceneList()
if err != nil {
@@ -32,15 +34,33 @@ func (cmd *SceneListCmd) Run(ctx *context) error {
return err
}
t := table.New(ctx.Out)
t.SetPadding(3)
t := table.New().Border(lipgloss.RoundedBorder()).
BorderStyle(lipgloss.NewStyle().Foreground(ctx.Style.border))
if cmd.UUID {
t.SetAlignment(table.AlignLeft, table.AlignCenter, table.AlignLeft)
t.SetHeaders("Scene Name", "Active", "UUID")
t.Headers("Scene Name", "Active", "UUID")
} else {
t.SetAlignment(table.AlignLeft, table.AlignCenter)
t.SetHeaders("Scene Name", "Active")
t.Headers("Scene Name", "Active")
}
t.StyleFunc(func(row, col int) lipgloss.Style {
style := lipgloss.NewStyle().Padding(0, 3)
switch col {
case 0:
style = style.Align(lipgloss.Left)
case 1:
style = style.Align(lipgloss.Center)
case 2:
style = style.Align(lipgloss.Left)
}
switch {
case row == table.HeaderRow:
style = style.Bold(true).Align(lipgloss.Center)
case row%2 == 0:
style = style.Foreground(ctx.Style.evenRows)
default:
style = style.Foreground(ctx.Style.oddRows)
}
return style
})
slices.Reverse(scenes.Scenes)
for _, scene := range scenes.Scenes {
@@ -49,12 +69,12 @@ func (cmd *SceneListCmd) Run(ctx *context) error {
activeMark = getEnabledMark(true)
}
if cmd.UUID {
t.AddRow(scene.SceneName, activeMark, scene.SceneUuid)
t.Row(scene.SceneName, activeMark, scene.SceneUuid)
} else {
t.AddRow(scene.SceneName, activeMark)
t.Row(scene.SceneName, activeMark)
}
}
t.Render()
fmt.Fprintln(ctx.Out, t.Render())
return nil
}
@@ -70,13 +90,13 @@ func (cmd *SceneCurrentCmd) Run(ctx *context) error {
if err != nil {
return err
}
fmt.Fprintln(ctx.Out, scene.SceneName)
fmt.Fprintf(ctx.Out, "Current preview scene: %s\n", ctx.Style.Highlight(scene.SceneName))
} else {
scene, err := ctx.Client.Scenes.GetCurrentProgramScene()
if err != nil {
return err
}
fmt.Fprintln(ctx.Out, scene.SceneName)
fmt.Fprintf(ctx.Out, "Current program scene: %s\n", ctx.Style.Highlight(scene.SceneName))
}
return nil
}
@@ -96,7 +116,7 @@ func (cmd *SceneSwitchCmd) Run(ctx *context) error {
return err
}
fmt.Fprintln(ctx.Out, "Switched to preview scene:", cmd.NewScene)
fmt.Fprintf(ctx.Out, "Switched to preview scene: %s\n", ctx.Style.Highlight(cmd.NewScene))
} else {
_, err := ctx.Client.Scenes.SetCurrentProgramScene(scenes.NewSetCurrentProgramSceneParams().
WithSceneName(cmd.NewScene))
@@ -104,7 +124,7 @@ func (cmd *SceneSwitchCmd) Run(ctx *context) error {
return err
}
fmt.Fprintln(ctx.Out, "Switched to program scene:", cmd.NewScene)
fmt.Fprintf(ctx.Out, "Switched to program scene: %s\n", ctx.Style.Highlight(cmd.NewScene))
}
return nil
}