diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f1f15c4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.yaml +spacetea diff --git a/go.mod b/go.mod index d3119d6..eededdf 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,24 @@ module git.saintnet.tech/stryan/spacetea -go 1.17 +go 1.18 + +require ( + github.com/charmbracelet/bubbles v0.10.3 + github.com/charmbracelet/bubbletea v0.20.0 +) require ( github.com/atotto/clipboard v0.1.4 // indirect - github.com/charmbracelet/bubbles v0.10.3 // indirect - github.com/charmbracelet/bubbletea v0.20.0 // indirect - github.com/charmbracelet/lipgloss v0.5.0 // indirect + github.com/charmbracelet/lipgloss v0.4.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.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect + github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // 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 - golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e // indirect - golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect + github.com/sahilm/fuzzy v0.1.0 // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/term v0.0.0-20210422114643-f5beecf764ed // indirect ) diff --git a/go.sum b/go.sum index cc70fa9..b16df48 100644 --- a/go.sum +++ b/go.sum @@ -6,12 +6,12 @@ github.com/charmbracelet/bubbletea v0.19.3/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFA github.com/charmbracelet/bubbletea v0.20.0 h1:/b8LEPgCbNr7WWZ2LuE/BV1/r4t5PyYJtDb+J3vpwxc= github.com/charmbracelet/bubbletea v0.20.0/go.mod h1:zpkze1Rioo4rJELjRyGlm9T2YNou1Fm4LIJQSa5QMEM= github.com/charmbracelet/harmonica v0.1.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= +github.com/charmbracelet/lipgloss v0.4.0 h1:768h64EFkGUr8V5yAKV7/Ta0NiVceiPaV+PphaW1K9g= github.com/charmbracelet/lipgloss v0.4.0/go.mod h1:vmdkHvce7UzX6xkyf4cca8WlwdQ5RQr8fzta+xl7BOM= -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.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= 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= @@ -24,19 +24,17 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4 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/ansi v0.0.0-20211031195517-c9f0611b6c70 h1:kMlmsLSbjkikxQJ1IPwaM+7LJ9ltFu/fi8CRzvSnQmA= -github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= 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.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw= -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/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -44,9 +42,5 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e h1:w36l2Uw3dRan1K3TyXriXvY+6T56GNmlKGcqiQUJDfM= -golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210422114643-f5beecf764ed h1:Ei4bQjjpYUsS4efOUz+5Nz++IVkHk87n2zBA0NxBWc0= golang.org/x/term v0.0.0-20210422114643-f5beecf764ed/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/main.go b/main.go index 0339bf4..84f1f31 100644 --- a/main.go +++ b/main.go @@ -19,12 +19,13 @@ var style = lipgloss.NewStyle(). BorderForeground(lipgloss.Color("63")) type model struct { - s *sim.Simulator - input textinput.Model - window int + s *sim.Simulator + input textinput.Model } type beat struct{} +var simulator *sim.Simulator + func heartbeat() tea.Cmd { return tea.Tick(time.Second, func(time.Time) tea.Msg { return beat{} @@ -37,13 +38,11 @@ func initialModel() model { ti.Width = 20 return model{ - s: sim.NewSimulator(), - input: ti, - window: 1, + s: simulator, + input: ti, } } func (m model) Init() tea.Cmd { - m.s.Start() return tea.Batch(textinput.Blink, heartbeat()) } @@ -56,14 +55,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.s.Stop() return m, tea.Quit case tea.KeyEnter: - if m.window == 1 && m.input.Focused() { - m.s.Input(m.input.Value()) - m.input.Reset() - return m, nil - } else if m.window == 2 { - //place item - return m, nil - } + m.s.Input(m.input.Value()) + m.input.Reset() + return m, nil case tea.KeyRight: m.s.Input("right") return m, nil @@ -89,10 +83,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case "g": m.s.Input("get") case "p": - if m.window == 1 { - m.window = 2 + var res []string + for k, _ := range m.s.Player.Resources { + res = append(res, strconv.Itoa(k)) } - return m, nil + return newPlaceModel(res, nil), nil } return m, nil } @@ -108,14 +103,15 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { func (m model) View() string { var render string - if m.window == 1 { - display := lipgloss.JoinHorizontal(0, style.Render(m.s.Place.String()), style.Render(fmt.Sprintf("Player\n%v", m.s.Player.String()))) - render = fmt.Sprintf("%v\n%v\n%v\n", style.Render(fmt.Sprintf("Current Time: %v", strconv.Itoa(m.s.Time))), display, style.Render(m.input.View())) - } + display := lipgloss.JoinHorizontal(0, style.Render(m.s.Place.String()), style.Render(fmt.Sprintf("Player\n%v", m.s.Player.String()))) + render = fmt.Sprintf("%v\n%v\n%v\n", style.Render(fmt.Sprintf("Current Time: %v", strconv.Itoa(m.s.Time))), display, style.Render(m.input.View())) return render } func main() { + simulator = sim.NewSimulator() + simulator.Start() + if err := tea.NewProgram(initialModel(), tea.WithAltScreen()).Start(); err != nil { fmt.Printf("Uh oh, there was an error: %v\n", err) os.Exit(1) diff --git a/place.go b/place.go new file mode 100644 index 0000000..ba44478 --- /dev/null +++ b/place.go @@ -0,0 +1,70 @@ +package main + +import ( + "log" + + "github.com/charmbracelet/bubbles/list" + tea "github.com/charmbracelet/bubbletea" +) + +type item struct { + title, desc string +} + +func (i item) Title() string { return i.title } +func (i item) Description() string { return i.desc } +func (i item) FilterValue() string { return i.title } + +type placeModel struct { + list list.Model +} + +func newPlaceModel(entries []string, m tea.Model) placeModel { + var p placeModel + items := []list.Item{} + for _, v := range entries { + items = append(items, item{v, v}) + } + //w,h + p.list = list.New(items, list.NewDefaultDelegate(), 0, 0) + p.list.Title = "What do you want to place?" + p.list.DisableQuitKeybindings() + return p +} + +// Init is the first function that will be called. It returns an optional +// initial command. To not perform an initial command return nil. +func (p placeModel) Init() tea.Cmd { + return tea.EnterAltScreen +} + +// Update is called when a message is received. Use it to inspect messages +// and, in response, update the model and/or send a command. +func (p placeModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.WindowSizeMsg: + p.list.SetWidth(msg.Width) + return p, nil + case tea.KeyMsg: + switch keypress := msg.String(); keypress { + case "ctrl-c": + return p, tea.Quit + case "esc": + return initialModel(), nil + case "enter": + cur := p.list.SelectedItem() + log.Println(cur.FilterValue()) + return initialModel(), nil + } + } + + var cmd tea.Cmd + p.list, cmd = p.list.Update(msg) + return p, cmd +} + +// View renders the program's UI, which is just a string. The view is +// rendered after every Update. +func (p placeModel) View() string { + return p.list.View() +}