Skip to content

Commit

Permalink
No commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
Eun committed Mar 10, 2023
1 parent 800c225 commit 7f2d745
Show file tree
Hide file tree
Showing 37 changed files with 2,977 additions and 34 deletions.
12 changes: 11 additions & 1 deletion button/button.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@ import (

var _ bubbleviews.View = &View{}

type OnResponseFunc func(response *Response) tea.Cmd

type View struct {
OnResponse func(response *Response) tea.Cmd
onResponse OnResponseFunc

style lipgloss.Style
focusStyle lipgloss.Style
Expand Down Expand Up @@ -91,6 +93,14 @@ func (m *View) FocusStyle() lipgloss.Style {
return m.focusStyle
}

func (m *View) SetOnResponse(fn OnResponseFunc) {
m.onResponse = fn
}

func (m *View) OnResponse() OnResponseFunc {
return m.onResponse
}

func (m *View) respond(err error) func() tea.Msg {
return func() tea.Msg {
return &Response{
Expand Down
4 changes: 2 additions & 2 deletions button/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ func (r *Response) View() bubbleviews.View {

func (r *Response) OnResponse(msg bubbleviews.ResponseMessage) tea.Cmd {
response, ok := msg.(*Response)
if !ok || r.view.OnResponse == nil {
if !ok || r.view.onResponse == nil {
return nil
}
return r.view.OnResponse(response)
return r.view.onResponse(response)
}
12 changes: 11 additions & 1 deletion entry/entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import (

var _ bubbleviews.View = &View{}

type OnResponseFunc func(response *Response) tea.Cmd

type View struct {
OnResponse func(response *Response) tea.Cmd
onResponse OnResponseFunc

ext.PrefixExt
ext.SuffixExt
Expand Down Expand Up @@ -47,6 +49,14 @@ func (m *View) View() string {
return m.RenderPrefix(m.TextInput.Width) + m.TextInput.View() + m.RenderSuffix(m.TextInput.Width)
}

func (m *View) SetOnResponse(fn OnResponseFunc) {
m.onResponse = fn
}

func (m *View) OnResponse() OnResponseFunc {
return m.onResponse
}

func (m *View) respond(text *string, err error) func() tea.Msg {
return func() tea.Msg {
return &Response{
Expand Down
4 changes: 2 additions & 2 deletions entry/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ func (r *Response) View() bubbleviews.View {

func (r *Response) OnResponse(msg bubbleviews.ResponseMessage) tea.Cmd {
response, ok := msg.(*Response)
if !ok || r.view.OnResponse == nil {
if !ok || r.view.onResponse == nil {
return nil
}
return r.view.OnResponse(response)
return r.view.onResponse(response)
}
49 changes: 36 additions & 13 deletions example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/Eun/bubbleviews/button"
"github.com/Eun/bubbleviews/entry"
"github.com/Eun/bubbleviews/example/views/selectview"
"github.com/Eun/bubbleviews/listv"
"github.com/Eun/bubbleviews/loginform"
"github.com/Eun/bubbleviews/message"
"github.com/Eun/bubbleviews/spinnerv"
Expand Down Expand Up @@ -94,9 +95,9 @@ func (tui *TUI) handleResponse(response interface{}) tea.Cmd {

msg.SetSuffixStyle(escStyle)
msg.SetSuffix("(esc to go back)")
msg.OnResponse = func(response *message.Response) tea.Cmd {
msg.SetOnResponse(func(response *message.Response) tea.Cmd {
return tui.showView(tui.rootView())
}
})
return tui.showView(msg)
}

Expand All @@ -110,25 +111,25 @@ func (tui *TUI) rootView() bubbleviews.View {
msgView.SetPrefixStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("170")))
msgView.SetSuffix("(esc to go back)")
msgView.SetSuffixStyle(escStyle)
msgView.OnResponse = func(response *message.Response) tea.Cmd {
msgView.SetOnResponse(func(response *message.Response) tea.Cmd {
return tui.handleResponse(response)
}
})

// button view
buttonView := button.New("Hello World")
buttonView.OnResponse = func(response *button.Response) tea.Cmd {
buttonView.SetOnResponse(func(response *button.Response) tea.Cmd {
return tui.handleResponse(response)
}
})

// entry view
entryView := entry.New()
entryView.SetPrefix("Enter some Text")
entryView.SetPrefixStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("170")))
entryView.SetSuffix("(esc to go back)")
entryView.SetSuffixStyle(escStyle)
entryView.OnResponse = func(response *entry.Response) tea.Cmd {
entryView.SetOnResponse(func(response *entry.Response) tea.Cmd {
return tui.handleResponse(response)
}
})

// login view
loginFormView := loginform.New()
Expand All @@ -140,9 +141,9 @@ func (tui *TUI) rootView() bubbleviews.View {
loginFormView.SetPrefixStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("170")))
loginFormView.SetSuffix("(esc to go back)")
loginFormView.SetSuffixStyle(escStyle)
loginFormView.OnResponse = func(response *loginform.Response) tea.Cmd {
loginFormView.SetOnResponse(func(response *loginform.Response) tea.Cmd {
return tui.handleResponse(response)
}
})

// spinner view
spinnerView := spinnerv.New(" Loading...", func(ctx context.Context, spinner *spinnerv.View) error {
Expand All @@ -163,23 +164,45 @@ func (tui *TUI) rootView() bubbleviews.View {
spinnerView.SetSuffixStyle(escStyle)
spinnerView.SetSpinnerStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("170")))
spinnerView.SetAllowEscapeKey(true)
spinnerView.OnResponse = func(response *spinnerv.Response) tea.Cmd {
spinnerView.SetOnResponse(func(response *spinnerv.Response) tea.Cmd {
return tui.handleResponse(response)
})

items := []listv.ListItem{
listv.NewSimpleListItem("opt1", "Option 1", ""),
listv.NewSimpleListItem("opt2", "Option 2", ""),
listv.NewSimpleListItem("opr3", "Option 3", ""),
}
// list view
listView := listv.New(items,
listv.NewSimpleListItemDelegate(
lipgloss.NewStyle().PaddingLeft(2),
"> ",
lipgloss.NewStyle().Foreground(lipgloss.Color("170")),
),
)
listView.SetPrefix("Please be Patient")
listView.SetPrefixStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("170")))
listView.SetSuffix("(esc to go back)")
listView.SetSuffixStyle(escStyle)
listView.SetOnResponse(func(response *listv.Response) tea.Cmd {
return tui.handleResponse(response)
})

rootView := selectview.New(
msgView,
buttonView,
entryView,
loginFormView,
spinnerView,
listView,
)
rootView.OnResponse = func(response *selectview.Response) tea.Cmd {
rootView.SetOnResponse(func(response *selectview.Response) tea.Cmd {
if response.SelectedView == nil {
return nil
}
return tui.showView(response.SelectedView)
}
})
return rootView
}

Expand Down
8 changes: 4 additions & 4 deletions example/views/selectview/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ import (
)

type Response struct {
model *View
view *View
SelectedView bubbleviews.View
}

func (r *Response) View() bubbleviews.View {
return r.model
return r.view
}

func (r *Response) OnResponse(msg bubbleviews.ResponseMessage) tea.Cmd {
response, ok := msg.(*Response)
if !ok || r.model.OnResponse == nil {
if !ok || r.view.onResponse == nil {
return nil
}
return r.model.OnResponse(response)
return r.view.onResponse(response)
}
14 changes: 12 additions & 2 deletions example/views/selectview/selected_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import (

var _ bubbleviews.View = &View{}

type OnResponseFunc func(response *Response) tea.Cmd

type View struct {
OnResponse func(response *Response) tea.Cmd
onResponse OnResponseFunc

list list.Model
}
Expand Down Expand Up @@ -41,10 +43,18 @@ func (m *View) View() string {
return m.list.View()
}

func (m *View) SetOnResponse(fn OnResponseFunc) {
m.onResponse = fn
}

func (m *View) OnResponse() OnResponseFunc {
return m.onResponse
}

func (m *View) respond(selectedView bubbleviews.View) func() tea.Msg {
return func() tea.Msg {
return &Response{
model: m,
view: m,
SelectedView: selectedView,
}
}
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ require (
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/termenv v0.14.0 // indirect
github.com/rivo/uniseg v0.4.3 // indirect
github.com/sahilm/fuzzy v0.1.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.4.0 // indirect
golang.org/x/term v0.4.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ github.com/charmbracelet/lipgloss v0.5.0 h1:lulQHuVeodSgDez+3rGiuxlPVXSnhth442DA
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=
Expand Down Expand Up @@ -42,6 +43,7 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw=
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI=
github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand Down
39 changes: 39 additions & 0 deletions listv/delegate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package listv

import (
"io"

"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)

type listItemDelegate struct {
itemStyle lipgloss.Style
selectedItemStyle lipgloss.Style
selectedItemPrefix string
}

func (d *listItemDelegate) Height() int { return 1 }
func (d *listItemDelegate) Spacing() int { return 0 }
func (d *listItemDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd { return nil }
func (d *listItemDelegate) Render(w io.Writer, m list.Model, index int, item list.Item) {
i, ok := item.(ListItem)
if !ok {
return
}

if index == m.Index() {
_, _ = io.WriteString(w, d.selectedItemStyle.MaxWidth(m.Width()).Render(d.selectedItemPrefix+i.Title()))
return
}
_, _ = io.WriteString(w, d.itemStyle.MaxWidth(m.Width()).Render(i.Title()))
}

func NewSimpleListItemDelegate(itemStyle lipgloss.Style, selectedItemPrefix string, selectedItemStyle lipgloss.Style) list.ItemDelegate {
return &listItemDelegate{
itemStyle: itemStyle,
selectedItemStyle: selectedItemStyle,
selectedItemPrefix: selectedItemPrefix,
}
}
31 changes: 31 additions & 0 deletions listv/listitem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package listv

type ListItem interface {
Id() string
Title() string
FilterValue() string
}

var _ ListItem = &simpleListItem{}

type simpleListItem struct {
id string
title string
filterValue string
}

func (s *simpleListItem) Id() string {
return s.id
}

func (s *simpleListItem) Title() string {
return s.title
}

func (s *simpleListItem) FilterValue() string {
return s.filterValue
}

func NewSimpleListItem(id, title, filterValue string) ListItem {
return &simpleListItem{id: id, title: title, filterValue: filterValue}
}
Loading

0 comments on commit 7f2d745

Please sign in to comment.