Skip to content

Commit

Permalink
feat: use the new renderer interface
Browse files Browse the repository at this point in the history
  • Loading branch information
aymanbagabas committed Sep 12, 2024
1 parent 73773e8 commit 0fe006d
Show file tree
Hide file tree
Showing 11 changed files with 274 additions and 356 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.18

require (
github.com/charmbracelet/lipgloss v0.13.0
github.com/charmbracelet/x/ansi v0.2.3
github.com/charmbracelet/x/ansi v0.3.0
github.com/charmbracelet/x/term v0.2.0
github.com/charmbracelet/x/windows v0.2.0
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA
github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY=
github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY=
github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
github.com/charmbracelet/x/ansi v0.3.0 h1:CCsscv7vKC/DNYUYFQNNIOWzrpTUbLXL3d4fdFIQ0WE=
github.com/charmbracelet/x/ansi v0.3.0/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0=
github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0=
github.com/charmbracelet/x/windows v0.2.0 h1:ilXA1GJjTNkgOm94CLPeSz7rar54jtFatdmoiONPuEw=
Expand Down
39 changes: 11 additions & 28 deletions nil_renderer.go
Original file line number Diff line number Diff line change
@@ -1,39 +1,22 @@
package tea

import "io"

// NilRenderer is a no-op renderer. It implements the Renderer interface but
// doesn't render anything to the terminal.
type NilRenderer struct{}

var _ Renderer = NilRenderer{}

// SetOutput implements the Renderer interface.
func (NilRenderer) SetOutput(io.Writer) {}

// Flush implements the Renderer interface.
func (NilRenderer) Flush() error { return nil }

// Close implements the Renderer interface.
func (NilRenderer) Close() error { return nil }

// Render implements the Renderer interface.
func (NilRenderer) Render(string) {}

// Repaint implements the Renderer interface.
func (NilRenderer) Repaint() {}
var _ renderer = NilRenderer{}

// ClearScreen implements the Renderer interface.
func (NilRenderer) ClearScreen() {}
// flush implements the Renderer interface.
func (NilRenderer) flush() error { return nil }

// InsertAbove implements the Renderer interface.
func (NilRenderer) InsertAbove(string) error { return nil }
// close implements the Renderer interface.
func (NilRenderer) close() error { return nil }

// Resize implements the Renderer interface.
func (NilRenderer) Resize(int, int) {}
// render implements the Renderer interface.
func (NilRenderer) render(string) {}

// SetMode implements the Renderer interface.
func (NilRenderer) SetMode(int, bool) {}
// reset implements the Renderer interface.
func (NilRenderer) reset() {}

// Mode implements the Renderer interface.
func (NilRenderer) Mode(int) bool { return false }
// update implements the Renderer interface.
func (NilRenderer) update(Msg) Cmd { return nil }
16 changes: 0 additions & 16 deletions nil_renderer_test.go

This file was deleted.

12 changes: 0 additions & 12 deletions options.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,6 @@ func WithMouseAllMotion() ProgramOption {
}
}

// WithRenderer sets a custom renderer. This is useful if you want to use a
// custom renderer to process the output of the program differently.
func WithRenderer(renderer Renderer) ProgramOption {
return func(p *Program) {
p.renderer = renderer
}
}

// WithoutRenderer disables the renderer. When this is set output and log
// statements will be plainly sent to stdout (or another output if one is set)
// without any rendering and redrawing logic. In other words, printing and
Expand All @@ -184,9 +176,6 @@ func WithRenderer(renderer Renderer) ProgramOption {
// application, or to provide an additional non-TUI mode to your Bubble Tea
// programs. For example, your program could behave like a daemon if output is
// not a TTY.
//
// Deprecated: This option is deprecated and will be removed in a future
// version of this package. Use [NilRenderer] with [WithRenderer] instead.
func WithoutRenderer() ProgramOption {
return func(p *Program) {
p.renderer = &NilRenderer{}
Expand Down Expand Up @@ -330,7 +319,6 @@ func WithModifyOtherKeys(mode int) ProgramOption {
func WithWindowsInputMode() ProgramOption { //nolint:unused
return func(p *Program) {
p.startupOptions |= withWindowsInputMode
p.win32Input = true
}
}

Expand Down
64 changes: 22 additions & 42 deletions renderer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,33 @@ package tea

import "io"

// Renderer is the interface for Bubble Tea renderers.
type Renderer interface {
// Close closes the renderer and flushes any remaining data.
Close() error

// Render renders a frame to the output.
Render(string)

// SetOutput sets the output for the renderer.
SetOutput(io.Writer)

// Flush flushes the renderer's buffer to the output.
Flush() error

// InsertAbove inserts lines above the current frame. This only works in
// inline mode.
InsertAbove(string) error

// Resize sets the size of the terminal.
Resize(w int, h int)

// Request a full re-render. Note that this will not trigger a render
// immediately. Rather, this method causes the next render to be a full
// Repaint. Because of this, it's safe to call this method multiple times
// in succession.
Repaint()

// ClearScreen clear the terminal screen. This should always have the same
// behavior as the "clear" command which is equivalent to `CSI 2 J` and
// `CSI H`.
ClearScreen()

// SetMode toggles a terminal mode such as bracketed paste, the altscreen,
// and so on.
//
// The mode argument is an int consisting of the mode identifier. For
// example, to set alt-screen mode, you would call SetMode(1049, true).
SetMode(mode int, on bool)

// Mode returns whether the render has a mode enabled. For example, to
// check if alt-screen mode is enabled, you would call Mode(1049).
Mode(mode int) bool
// renderer is the interface for Bubble Tea renderers.
type renderer interface {
// close closes the renderer and flushes any remaining data.
close() error

// render renders a frame to the output.
render(string)

// flush flushes the renderer's buffer to the output.
flush() error

// reset resets the renderer's state to its initial state.
reset()

// update updates the renderer's state with the given message. It returns a
// [tea.Cmd] that can be used to send messages back to the program.
update(Msg) Cmd
}

// repaintMsg forces a full repaint.
type repaintMsg struct{}

// rendererWriter is an internal message used to set the output of the renderer.
type rendererWriter struct {
io.Writer
}

// Terminal modes used by SetMode and Mode in Bubble Tea.
const (
graphemeClustering = 2027
Expand Down
Loading

0 comments on commit 0fe006d

Please sign in to comment.