Skip to content

Instantly share code, notes, and snippets.

@meowgorithm
Last active August 31, 2022 20:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save meowgorithm/adee9aa8341aac0096b642c518aae949 to your computer and use it in GitHub Desktop.
Save meowgorithm/adee9aa8341aac0096b642c518aae949 to your computer and use it in GitHub Desktop.
Viewport Sizing Demo
package main
import (
"fmt"
"os"
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
const (
viewportMaxWidth = 40
viewportMaxHeight = 18
viewportContent = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla non felis non dui euismod luctus. Curabitur tincidunt, dui ac molestie interdum, orci tellus efficitur diam, a dignissim est sem sed lorem. Morbi convallis enim ut lorem euismod vestibulum. Donec nisl diam, dignissim vitae congue eget, ultricies faucibus nulla. Cras tristique pharetra augue. Maecenas fringilla tellus eu urna varius dictum. Nam ante leo, tincidunt eget diam et, placerat ornare est. Sed ut metus malesuada, venenatis enim laoreet, molestie ipsum. Suspendisse id posuere lectus. Pellentesque efficitur dapibus sem. Nam in metus tempus, tincidunt diam eu, porta urna. Nullam a lorem scelerisque, varius nulla in, pulvinar diam. Donec fermentum elementum nunc, sed gravida lorem cursus ac. Vestibulum mollis faucibus lacinia. Etiam maximus massa a tellus pellentesque, quis tempor tortor ornare. Nunc ac ullamcorper nibh.
Curabitur blandit, augue sed iaculis lobortis, mauris massa tincidunt nibh, in congue tellus purus nec enim. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi a ullamcorper nulla. Vestibulum posuere accumsan libero ut posuere. Mauris eget odio vel sem dictum feugiat quis ac risus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean in est eget erat semper blandit nec in neque. Sed mattis augue sit amet nisi varius, quis tempor urna molestie. In at nisi vitae est mollis pharetra. Pellentesque ullamcorper venenatis magna, ut porttitor tellus tincidunt ac. Cras maximus odio vel est gravida, et suscipit nisl placerat.`
)
type model struct {
vp viewport.Model
}
func (m model) Init() tea.Cmd {
return nil
}
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "ctrl+c", "q", "esc":
return m, tea.Quit
}
case tea.WindowSizeMsg:
w := clamp(msg.Width, 0, viewportMaxWidth)
m.vp.Width = w
m.vp.Height = clamp(msg.Height, 0, viewportMaxHeight)
m.vp.SetContent(lipgloss.NewStyle().Width(w).Render(viewportContent))
}
var cmd tea.Cmd
m.vp, cmd = m.vp.Update(msg)
return m, cmd
}
func (m model) View() string {
return m.vp.View() + "\n"
}
func main() {
m := model{
vp: viewport.New(0, 0),
}
m.vp.Style = lipgloss.NewStyle().
BorderStyle(lipgloss.RoundedBorder()).
Padding(1, 3)
if err := tea.NewProgram(m).Start(); err != nil {
fmt.Println("Uh oh:", err)
os.Exit(1)
}
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func clamp(v, low, high int) int {
if high < low {
low, high = high, low
}
return min(high, max(low, v))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment