Documentation
¶
Index ¶
- Variables
- func OptionGroup[V comparable](t *Timui, name string, selected *V, f func(*OptionGroupElement[V]))
- func WriteClipboardLocal(text string) error
- type Backend
- type BorderStyle
- type Draggable
- type Grid
- type GridCell
- type Input
- type Key
- type KeyEvent
- type ModMask
- type MouseInput
- type OptionGroupElement
- type Panel
- type RGBAColor
- type RGBColor
- type ScrollBarTheme
- type ScrollState
- type SelectionTheme
- type SplitOptions
- type Theme
- type Timui
- func (t *Timui) Border(style [6]rune, fg, bg RGBColor)
- func (g *Timui) Button(name string) bool
- func (g *Timui) Checkbox(name string, checked *bool) bool
- func (t *Timui) ClipContains(pos mathi.Vec2) bool
- func (g *Timui) Columns(opts *SplitOptions, cells ...func())
- func (t *Timui) CurrentArea() *mathi.Box2
- func (t *Timui) Dialog(title string, visible *bool, content func())
- func (t *Timui) Draggable(id string, area mathi.Box2, size mathi.Vec2, pos *mathi.Vec2) (bool, bool)
- func (g *Timui) Dropdown(id string, elements int, selected *int, paint func(i int, s bool))
- func (t *Timui) Finish()
- func (t *Timui) GetMousePosition() mathi.Vec2
- func (t *Timui) Grid(body func(grid *Grid))
- func (t *Timui) HLine(style [3]rune, fg, bg RGBColor)
- func (t *Timui) KeyPressed(key Key) bool
- func (t *Timui) Keys() []KeyEvent
- func (t *Timui) Label(name string)
- func (t *Timui) Mods() ModMask
- func (t *Timui) MouseInput(id string) *MouseInput
- func (t *Timui) MouseInputForArea(id string, area mathi.Box2) *MouseInput
- func (t *Timui) MouseInputForSize(id string, size mathi.Vec2) *MouseInput
- func (t *Timui) Pad(top, right, bottom, left int, body func())
- func (t *Timui) Panel(body func(p *Panel))
- func (g *Timui) PeekClip() mathi.Box2
- func (t *Timui) PeekCopyRect() mathi.Box2
- func (t *Timui) PopArea()
- func (g *Timui) PopClip()
- func (t *Timui) PopCopyRect()
- func (t *Timui) PushArea(area mathi.Box2)
- func (t *Timui) PushAreaTranslation(dir mathi.Vec2)
- func (g *Timui) PushClip(area mathi.Box2)
- func (t *Timui) PushCopyRect(area mathi.Box2)
- func (g *Timui) Rows(opts *SplitOptions, cells ...func())
- func (t *Timui) RunePressed(r rune) bool
- func (g *Timui) ScrollAreaV(id string, body func())
- func (g *Timui) ScrollListV(id string, state *ScrollState, count int, row func(i int))
- func (t *Timui) Set(pos mathi.Vec2, char rune, fg, bg RGBColor)
- func (t *Timui) SetAlpha(pos mathi.Vec2, char rune, fg, bg RGBAColor)
- func (t *Timui) SetArea(char rune, fg, bg RGBColor)
- func (t *Timui) SetAreaAlpha(char rune, fg, bg RGBAColor)
- func (t *Timui) SetBorder(pos mathi.Vec2, char rune, fg, bg RGBColor)
- func (t *Timui) Size() mathi.Vec2
- func (t *Timui) Text(name string, pos mathi.Vec2, fg, bg RGBAColor)
- func (t *Timui) VLine(style [3]rune, fg, bg RGBColor)
- func (t *Timui) WithArea(area mathi.Box2, body func())
- func (t *Timui) WithAreaTranslation(dir mathi.Vec2, body func())
- func (g *Timui) WithClip(area mathi.Box2, body func())
- func (t *Timui) WithCopyRect(area mathi.Box2, body func())
- func (t *Timui) WithID(id string, body func())
- type WidgetTheme
Constants ¶
This section is empty.
Variables ¶
var ( Transparent = RGBA(0, 0, 0, 0) White = RGBA(0xff, 0xff, 0xff, 0xff) Black = RGBA(0x0, 0x0, 0x0, 0xff) )
var BorderBasic = BorderStyle{ Rect: [6]rune{'-', '|', '/', '\\', '\\', '/'}, Vertical: [3]rune{'+', '|', '+'}, Horizontal: [3]rune{'+', '-', '+'}, }
var BorderDouble = BorderStyle{ Rect: [6]rune{'═', '║', '╔', '╗', '╚', '╝'}, Vertical: [3]rune{'╦', '║', '╩'}, Horizontal: [3]rune{'╠', '═', '╣'}, }
var BorderNone = BorderStyle{ Rect: [6]rune{' ', ' ', ' ', ' ', ' ', ' '}, Vertical: [3]rune{' ', ' ', ' '}, Horizontal: [3]rune{' ', ' ', ' '}, }
var BorderRoundSingle = BorderStyle{ Rect: [6]rune{'─', '│', '╭', '╮', '╰', '╯'}, Vertical: [3]rune{'┬', '│', '┴'}, Horizontal: [3]rune{'├', '─', '┤'}, }
var BorderSingle = BorderStyle{ Rect: [6]rune{'─', '│', '┌', '┐', '└', '┘'}, Vertical: [3]rune{'┬', '│', '┴'}, Horizontal: [3]rune{'├', '─', '┤'}, }
var DefaultTheme = Theme{ BG: MustRGBS("#000"), Text: MustRGBS("#f33"), BorderLine: MustRGBS("#3ff"), BorderBG: MustRGBS("#000"), Widget: WidgetTheme{ BG: MustRGBS("#004"), Text: MustRGBS("#bbb"), Line: MustRGBS("#a0a"), HoverBG: MustRGBS("#22a"), InteractBG: MustRGBS("#008"), FocusLine: MustRGBS("#ffa"), }, ScrollBar: ScrollBarTheme{ Text: MustRGBS("#bbb"), BG: MustRGBS("#013"), ArrowBG: MustRGBS("#135"), Knob: MustRGBS("#46f"), KnobBG: MustRGBS("#00a"), }, Selection: SelectionTheme{ Text: MustRGBS("#000"), BG: MustRGBS("#5af"), }, BorderStyle: BorderDouble, }
Functions ¶
func OptionGroup ¶
func OptionGroup[V comparable](t *Timui, name string, selected *V, f func(*OptionGroupElement[V]))
func WriteClipboardLocal ¶ added in v0.0.5
WriteClipboardLocal tries local clipboard tools (wl-copy, then xclip/xsel) in turn. It exists because OSC 52 - the primary mechanism backends use, since it also works over SSH - is a silent no-op on VTE-based terminals (GNOME Terminal, Guake, Tilix, ...), which don't implement OSC 52 copy at all. This only reaches a local X11/Wayland session, so backends call it as a fallback alongside OSC 52, not instead of it.
It only runs at all when VTE_VERSION is set (every VTE-based terminal exports it), since xclip/xsel have to hold a hidden window open to keep owning the X11 CLIPBOARD selection, and creating that window steals focus for an instant - harmless on most terminals, but enough to trip a drop-down terminal's "hide on lost focus" setting (Guake, and likely others). Terminals where OSC 52 already works don't need this fallback, so they don't pay for that risk at all.
Types ¶
type Backend ¶
type Backend interface {
Size() mathi.Vec2
MousePosition() mathi.Vec2
MousePressed(key Key) bool
// TakeInput returns the wheel movement and key presses collected since the
// previous call and clears them, so nothing is delivered twice. The modifier
// state it carries is not cleared, it is the currently held state.
TakeInput() Input
Set(pos mathi.Vec2, char rune, fg, bg uint32)
Render()
// WriteClipboard pushes text to the system clipboard, typically via an OSC 52
// escape sequence so it also works over SSH without a helper binary on the
// remote end.
WriteClipboard(text string)
}
type BorderStyle ¶
type Grid ¶
type Grid struct {
// contains filtered or unexported fields
}
func (*Grid) Columns ¶
func (g *Grid) Columns(opts *SplitOptions, cells ...func(cell *GridCell))
func (*Grid) Rows ¶
func (g *Grid) Rows(opts *SplitOptions, cells ...func(cell *GridCell))
type GridCell ¶
type GridCell struct {
// contains filtered or unexported fields
}
GridCell is the context of one grid cell. Its area is the complete cell including the border lines around it, so nested splits overlap the parent's lines and their divider glyphs merge into junctions.
func (*GridCell) Columns ¶
func (c *GridCell) Columns(opts *SplitOptions, cells ...func(cell *GridCell))
func (*GridCell) Rows ¶
func (c *GridCell) Rows(opts *SplitOptions, cells ...func(cell *GridCell))
type Input ¶
type Input struct {
// Wheel is the accumulated wheel movement, Y positive when scrolling down.
Wheel mathi.Vec2
// Keys are the presses in the order they arrived.
Keys []KeyEvent
// Mods are the modifiers currently held. It is a state and not an event, so
// it survives being read.
Mods ModMask
}
Input is everything that reached the backend since it was last read.
type KeyEvent ¶
KeyEvent is a single key press. For printable characters Key is KeyRune and Rune holds the character, for everything else Key names the key and Rune is zero.
type ModMask ¶ added in v0.0.3
type ModMask int
ModMask is a set of modifier keys. Backends track the currently held state: the vaxis backend sees a modifier pressed or let go on its own through the kitty keyboard protocol. On a backend that can't report those (tcell), the modifiers only change when the mouse moves or a key is typed.
type MouseInput ¶
type MouseInput struct {
// contains filtered or unexported fields
}
func (*MouseInput) Hovered ¶
func (m *MouseInput) Hovered() int
func (*MouseInput) LeftPressed ¶
func (m *MouseInput) LeftPressed() int
func (*MouseInput) LeftReleased ¶
func (m *MouseInput) LeftReleased() bool
func (*MouseInput) Wheel ¶
func (m *MouseInput) Wheel() mathi.Vec2
Wheel is the wheel movement that happened over this area since the previous frame. Y is positive when scrolling down.
type OptionGroupElement ¶
type OptionGroupElement[V comparable] struct { // contains filtered or unexported fields }
func (OptionGroupElement[V]) Option ¶
func (o OptionGroupElement[V]) Option(name string, value V) bool
type RGBAColor ¶
type RGBAColor uint32
type ScrollBarTheme ¶
type ScrollState ¶
type ScrollState struct {
// Offset is the index of the first visible row.
Offset int
// Follow pins the view to the last row while rows are appended. It is cleared
// when the user scrolls away from the bottom and set again when they return to
// it, so a log tails by default but stays put once it is read.
Follow bool
// ViewHeight is how many rows fit, written on every render so the caller can
// page by a screenful.
ViewHeight int
}
ScrollState is the caller owned position of a scroll list.
func (*ScrollState) Bottom ¶
func (s *ScrollState) Bottom()
Bottom jumps to the last row and follows from there.
func (*ScrollState) PageDown ¶
func (s *ScrollState) PageDown()
PageDown moves the view down by a screenful.
func (*ScrollState) PageUp ¶
func (s *ScrollState) PageUp()
PageUp moves the view up by a screenful and stops following.
func (*ScrollState) Scroll ¶
func (s *ScrollState) Scroll(rows int)
Scroll moves the view by rows. The next render clamps the offset and decides whether the view ended up at the bottom again.
type SelectionTheme ¶ added in v0.0.4
type SplitOptions ¶
type SplitOptions struct {
// contains filtered or unexported fields
}
func Split ¶
func Split() *SplitOptions
func (*SplitOptions) Add ¶
func (s *SplitOptions) Add(factor float32, fixed int) *SplitOptions
func (*SplitOptions) Factor ¶
func (s *SplitOptions) Factor(factors ...float32) *SplitOptions
func (*SplitOptions) Fixed ¶
func (s *SplitOptions) Fixed(fixed ...int) *SplitOptions
func (*SplitOptions) Pad ¶
func (s *SplitOptions) Pad(padding int) *SplitOptions
type Theme ¶
type Theme struct {
BG RGBColor
Text RGBColor
BorderLine RGBColor
BorderBG RGBColor
Widget WidgetTheme
ScrollBar ScrollBarTheme
Selection SelectionTheme
BorderStyle BorderStyle
}
func (*Theme) WithBorder ¶
func (t *Theme) WithBorder(b BorderStyle, content func())
type Timui ¶
type Timui struct {
Theme Theme
// contains filtered or unexported fields
}
func (*Timui) Columns ¶
func (g *Timui) Columns(opts *SplitOptions, cells ...func())
Columns splits the current area horizontally and runs one cell func per split entry, each inside its column area. Afterwards the parent cursor is advanced to the bottom of the tallest column. Panics if the cell count does not match the split count.
func (*Timui) CurrentArea ¶
func (*Timui) GetMousePosition ¶
func (*Timui) Grid ¶
Grid draws a bordered container and runs body inside its padded area. Rows and Columns on the grid subdivide it with divider lines that join the surrounding border.
func (*Timui) KeyPressed ¶
KeyPressed reports whether the given key was pressed this frame.
func (*Timui) Keys ¶
Keys returns the keys pressed since the previous frame. There is no focus, so every widget sees all of them and decides for itself whether a key means anything to it.
func (*Timui) MouseInput ¶
func (t *Timui) MouseInput(id string) *MouseInput
MouseInput creates a mouse area for the current cursor area
func (*Timui) MouseInputForArea ¶
func (t *Timui) MouseInputForArea(id string, area mathi.Box2) *MouseInput
MouseInputForArea creates a mouse area from given area relative to the current cursor area
func (*Timui) MouseInputForSize ¶
func (t *Timui) MouseInputForSize(id string, size mathi.Vec2) *MouseInput
MouseInputForSize creates a mouse area from given size relative to the current cursor area
func (*Timui) PeekCopyRect ¶ added in v0.0.4
func (*Timui) PopCopyRect ¶ added in v0.0.4
func (t *Timui) PopCopyRect()
func (*Timui) PushAreaTranslation ¶
func (*Timui) PushCopyRect ¶ added in v0.0.4
PushCopyRect scopes text selection to area: a drag started inside it can only select within it. Grid/Rows/Columns cells, ScrollAreaV, ScrollListV and Dialog each push one around their content, so a selection can't run into a neighboring cell or off-screen content clipped away.
func (*Timui) Rows ¶
func (g *Timui) Rows(opts *SplitOptions, cells ...func())
Rows splits the current area vertically and runs one cell func per split entry, each inside its row area. Panics if the cell count does not match the split count.
func (*Timui) RunePressed ¶
RunePressed reports whether the given character was typed this frame.
func (*Timui) ScrollAreaV ¶
func (*Timui) ScrollListV ¶
func (g *Timui) ScrollListV(id string, state *ScrollState, count int, row func(i int))
ScrollListV renders count rows of height one and calls row only for the visible ones. Unlike ScrollAreaV, which draws all of its content and clips it away, the cost of a list does not grow with the number of rows.
func (*Timui) SetAreaAlpha ¶
func (*Timui) WithAreaTranslation ¶
WithAreaTranslation runs body with the current area translated by dir.
func (*Timui) WithCopyRect ¶ added in v0.0.4
WithCopyRect runs body with the selection scoped to area.
