mirror of
https://github.com/anotherhadi/ilovetui.git
synced 2026-10-05 10:58:26 +02:00
61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
package minsize
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"charm.land/lipgloss/v2"
|
|
|
|
"github.com/anotherhadi/ilovetui/style"
|
|
)
|
|
|
|
type Model struct {
|
|
MinWidth int
|
|
MinHeight int
|
|
Style lipgloss.Style
|
|
}
|
|
|
|
type Option func(*Model)
|
|
|
|
func WithStyle(s lipgloss.Style) Option {
|
|
return func(m *Model) { m.Style = s }
|
|
}
|
|
|
|
func New(minWidth, minHeight int, opts ...Option) Model {
|
|
m := Model{
|
|
MinWidth: minWidth,
|
|
MinHeight: minHeight,
|
|
Style: lipgloss.NewStyle().Foreground(style.S.Muted),
|
|
}
|
|
for _, opt := range opts {
|
|
opt(&m)
|
|
}
|
|
return m
|
|
}
|
|
|
|
func (m Model) Fits(width, height int) bool {
|
|
return width >= m.MinWidth && height >= m.MinHeight
|
|
}
|
|
|
|
func (m Model) View(width, height int) string {
|
|
msg := m.Style.Render(m.message(width, height))
|
|
if width < 1 || height < 1 {
|
|
return msg
|
|
}
|
|
return lipgloss.Place(width, height, lipgloss.Center, lipgloss.Center, msg)
|
|
}
|
|
|
|
func (m Model) message(width, height int) string {
|
|
tooNarrow := width < m.MinWidth
|
|
tooShort := height < m.MinHeight
|
|
switch {
|
|
case tooNarrow && tooShort:
|
|
return fmt.Sprintf("minimum is %dx%d", m.MinWidth, m.MinHeight)
|
|
case tooNarrow:
|
|
return fmt.Sprintf("minimum width: %d", m.MinWidth)
|
|
case tooShort:
|
|
return fmt.Sprintf("minimum height: %d", m.MinHeight)
|
|
default:
|
|
return ""
|
|
}
|
|
}
|