Created
October 16, 2022 05:57
-
-
Save SamWolfs/5d37c47966a445c8d334d25055a04056 to your computer and use it in GitHub Desktop.
Bubbles list: no full screen if secondary state
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// prs/delegate.go | |
package prs | |
import ( | |
"github.com/charmbracelet/bubbles/key" | |
"github.com/charmbracelet/bubbles/list" | |
tea "github.com/charmbracelet/bubbletea" | |
) | |
func newItemDelegate(keys *delegateKeyMap) list.DefaultDelegate { | |
d := list.NewDefaultDelegate() | |
d.UpdateFunc = func(msg tea.Msg, m *list.Model) tea.Cmd { | |
switch msg := msg.(type) { | |
case tea.KeyMsg: | |
switch { | |
case key.Matches(msg, keys.open): | |
return nil | |
} | |
} | |
return nil | |
} | |
help := []key.Binding{keys.open} | |
d.ShortHelpFunc = func() []key.Binding { | |
return help | |
} | |
d.FullHelpFunc = func() [][]key.Binding { | |
return [][]key.Binding{help} | |
} | |
return d | |
} | |
type delegateKeyMap struct { | |
open key.Binding | |
} | |
func (d delegateKeyMap) ShortHelp() []key.Binding { | |
return []key.Binding{ | |
d.open, | |
} | |
} | |
func (d delegateKeyMap) FullHelp() [][]key.Binding { | |
return [][]key.Binding{ | |
{ | |
d.open, | |
}, | |
} | |
} | |
func newDelegateKeyMap() *delegateKeyMap { | |
return &delegateKeyMap{ | |
open: key.NewBinding( | |
key.WithKeys("o"), | |
key.WithHelp("o", "open"), | |
), | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module gh | |
go 1.19 | |
require ( | |
github.com/charmbracelet/bubbles v0.14.0 | |
github.com/charmbracelet/bubbletea v0.22.1 | |
) | |
require ( | |
github.com/atotto/clipboard v0.1.4 // indirect | |
github.com/charmbracelet/lipgloss v0.5.0 // indirect | |
github.com/containerd/console v1.0.3 // indirect | |
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect | |
github.com/mattn/go-isatty v0.0.16 // indirect | |
github.com/mattn/go-localereader v0.0.1 // indirect | |
github.com/mattn/go-runewidth v0.0.13 // indirect | |
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect | |
github.com/muesli/cancelreader v0.2.2 // indirect | |
github.com/muesli/reflow v0.3.0 // indirect | |
github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 // indirect | |
github.com/rivo/uniseg v0.2.0 // indirect | |
github.com/sahilm/fuzzy v0.1.0 // indirect | |
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect | |
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect | |
golang.org/x/text v0.3.7 // indirect | |
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= | |
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= | |
github.com/charmbracelet/bubbles v0.14.0 h1:DJfCwnARfWjZLvMglhSQzo76UZ2gucuHPy9jLWX45Og= | |
github.com/charmbracelet/bubbles v0.14.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc= | |
github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4= | |
github.com/charmbracelet/bubbletea v0.22.1 h1:z66q0LWdJNOWEH9zadiAIXp2GN1AWrwNXU8obVY9X24= | |
github.com/charmbracelet/bubbletea v0.22.1/go.mod h1:8/7hVvbPN6ZZPkczLiB8YpLkLJ0n7DMho5Wvfd2X1C0= | |
github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= | |
github.com/charmbracelet/lipgloss v0.5.0 h1:lulQHuVeodSgDez+3rGiuxlPVXSnhth442DATR2/8t8= | |
github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= | |
github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= | |
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= | |
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= | |
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | |
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= | |
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= | |
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | |
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= | |
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= | |
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= | |
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= | |
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= | |
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= | |
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= | |
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= | |
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= | |
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= | |
github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= | |
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= | |
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= | |
github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= | |
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= | |
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= | |
github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= | |
github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 h1:QANkGiGr39l1EESqrE0gZw0/AJNYzIvoGLhIoVYtluI= | |
github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= | |
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | |
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= | |
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= | |
github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= | |
github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= | |
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= | |
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= | |
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | |
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= | |
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | |
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"gh/prs" | |
"github.com/charmbracelet/bubbles/key" | |
tea "github.com/charmbracelet/bubbletea" | |
"os" | |
) | |
type state int | |
const ( | |
stateInitializing state = iota | |
statePullRequests | |
) | |
type keyMap struct { | |
PullRequests key.Binding | |
Quit key.Binding | |
} | |
type model struct { | |
keys keyMap | |
pullRequests prs.Model | |
state state | |
} | |
var keys = keyMap{ | |
PullRequests: key.NewBinding( | |
key.WithKeys("p"), | |
key.WithHelp("p", "Pull Requests"), | |
), | |
Quit: key.NewBinding( | |
key.WithKeys("q"), | |
key.WithHelp("q", "Quit"), | |
), | |
} | |
func (m model) Init() tea.Cmd { | |
return tea.EnterAltScreen | |
} | |
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { | |
var cmd tea.Cmd | |
switch msg := msg.(type) { | |
case tea.KeyMsg: | |
switch { | |
case key.Matches(msg, m.keys.PullRequests): | |
m.state = statePullRequests | |
return m, nil | |
case key.Matches(msg, m.keys.Quit): | |
return m, tea.Quit | |
} | |
} | |
m, cmd = updateChildren(m, msg) | |
return m, cmd | |
} | |
func updateChildren(m model, msg tea.Msg) (model, tea.Cmd) { | |
var cmd tea.Cmd | |
switch m.state { | |
case statePullRequests: | |
m.pullRequests, cmd = m.pullRequests.Update(msg) | |
} | |
return m, cmd | |
} | |
func (m model) View() string { | |
switch m.state { | |
case stateInitializing: | |
return "Press 'p' to look at pull requests" | |
case statePullRequests: | |
return m.pullRequests.View() | |
default: | |
return "Oops something went terribly wrong!" | |
} | |
} | |
func New() model { | |
return model{ | |
keys: keys, | |
pullRequests: prs.New(), | |
state: stateInitializing, | |
} | |
} | |
func main() { | |
program := tea.NewProgram(New()) | |
if err := program.Start(); err != nil { | |
os.Exit(1) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// prs/prs.go | |
package prs | |
import ( | |
"github.com/charmbracelet/bubbles/key" | |
"github.com/charmbracelet/bubbles/list" | |
tea "github.com/charmbracelet/bubbletea" | |
) | |
type keyMap struct { | |
Quit key.Binding | |
} | |
type Model struct { | |
keys keyMap | |
list list.Model | |
} | |
type item struct { | |
id string | |
repository string | |
title string | |
} | |
var keys = keyMap{ | |
Quit: key.NewBinding( | |
key.WithKeys("q"), | |
key.WithHelp("q", "Quit"), | |
), | |
} | |
func (i item) Title() string { return i.title } | |
func (i item) Description() string { return i.repository + " #" + i.id } | |
func (i item) FilterValue() string { return i.title } | |
func (m Model) Init() tea.Cmd { | |
return nil | |
} | |
func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { | |
var ( | |
cmd tea.Cmd | |
cmds []tea.Cmd | |
) | |
switch msg := msg.(type) { | |
case tea.WindowSizeMsg: | |
m.list.SetSize(msg.Width, msg.Height) | |
case tea.KeyMsg: | |
switch { | |
case key.Matches(msg, m.keys.Quit): | |
return m, tea.Quit | |
} | |
} | |
m.list, cmd = m.list.Update(msg) | |
if cmd != nil { | |
cmds = append(cmds, cmd) | |
} | |
return m, tea.Batch(cmds...) | |
} | |
func (m Model) View() string { | |
return m.list.View() | |
} | |
func New() Model { | |
items := []list.Item{ | |
item{id: "1", repository: "hello_world", title: "Initial commit"}, | |
item{id: "2", repository: "hello_world", title: "Bye world!"}, | |
item{id: "15", repository: "hello_mars", title: "We're in the future!"}, | |
} | |
delegateKeys := newDelegateKeyMap() | |
delegate := newItemDelegate(delegateKeys) | |
newList := list.New(items, delegate, 0, 0) | |
newList.Title = "Pull Requests" | |
return Model{ | |
keys: keys, | |
list: newList, | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment