0
0
mirror of https://github.com/mrusme/neonmodem.git synced 2025-06-30 22:18:39 -04:00

Implemented first draft of create post UI

This commit is contained in:
マリウス 2023-01-05 19:44:14 -05:00
parent c15ba4e10e
commit 520686204e
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F
5 changed files with 130 additions and 22 deletions

View File

@ -11,6 +11,7 @@ import (
"github.com/mrusme/gobbs/models/post" "github.com/mrusme/gobbs/models/post"
"github.com/mrusme/gobbs/ui/cmd" "github.com/mrusme/gobbs/ui/cmd"
"github.com/mrusme/gobbs/ui/ctx" "github.com/mrusme/gobbs/ui/ctx"
"github.com/mrusme/gobbs/ui/windows/postcreate"
"github.com/mrusme/gobbs/ui/windows/postshow" "github.com/mrusme/gobbs/ui/windows/postshow"
) )
@ -20,6 +21,7 @@ var (
type KeyMap struct { type KeyMap struct {
Refresh key.Binding Refresh key.Binding
NewPost key.Binding
Select key.Binding Select key.Binding
} }
@ -28,6 +30,10 @@ var DefaultKeyMap = KeyMap{
key.WithKeys("ctrl+r"), key.WithKeys("ctrl+r"),
key.WithHelp("ctrl+r", "refresh"), key.WithHelp("ctrl+r", "refresh"),
), ),
NewPost: key.NewBinding(
key.WithKeys("n"),
key.WithHelp("n", "new post"),
),
Select: key.NewBinding( Select: key.NewBinding(
key.WithKeys("r", "enter"), key.WithKeys("r", "enter"),
key.WithHelp("r/enter", "read"), key.WithHelp("r/enter", "read"),
@ -100,6 +106,25 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}) })
cmds = append(cmds, cmd.Tea()) cmds = append(cmds, cmd.Tea())
} }
case key.Matches(msg, m.keymap.NewPost):
i, ok := m.list.SelectedItem().(post.Post)
if ok {
m.viewcache = m.buildView(false)
cmd := cmd.New(
cmd.WinOpen,
postcreate.WIN_ID,
cmd.Arg{
Name: "action",
Value: "post",
},
cmd.Arg{
Name: "post",
Value: &i,
},
)
cmds = append(cmds, cmd.Tea())
}
} }
case tea.WindowSizeMsg: case tea.WindowSizeMsg:

View File

@ -7,6 +7,27 @@ import (
"github.com/mrusme/gobbs/ui/cmd" "github.com/mrusme/gobbs/ui/cmd"
) )
func handleTab(mi interface{}) (bool, []tea.Cmd) {
var m *Model = mi.(*Model)
var cmds []tea.Cmd
if m.action == "reply" {
return false, cmds
}
if m.inputFocused == 0 {
m.inputFocused = 1
m.textinput.Blur()
cmds = append(cmds, m.textarea.Focus())
} else {
m.inputFocused = 0
m.textarea.Blur()
cmds = append(cmds, m.textinput.Focus())
}
return true, cmds
}
func handleSubmit(mi interface{}) (bool, []tea.Cmd) { func handleSubmit(mi interface{}) (bool, []tea.Cmd) {
var m *Model = mi.(*Model) var m *Model = mi.(*Model)
var cmds []tea.Cmd var cmds []tea.Cmd
@ -15,7 +36,7 @@ func handleSubmit(mi interface{}) (bool, []tea.Cmd) {
if m.replyToIdx == 0 { if m.replyToIdx == 0 {
// No numbers were typed before hitting `r` so we're replying to the actual // No numbers were typed before hitting `r` so we're replying to the actual
// Post // Post
x := m.replyToIface.(post.Post) x := m.iface.(post.Post)
r = reply.Reply{ r = reply.Reply{
ID: x.ID, ID: x.ID,
InReplyTo: "", InReplyTo: "",
@ -25,7 +46,7 @@ func handleSubmit(mi interface{}) (bool, []tea.Cmd) {
} else { } else {
// Numbers were typed before hitting `r`, so we're taking the actual reply // Numbers were typed before hitting `r`, so we're taking the actual reply
// here // here
r = m.replyToIface.(reply.Reply) r = m.iface.(reply.Reply)
} }
r.Body = m.textarea.Value() r.Body = m.textarea.Value()
@ -53,10 +74,21 @@ func handleWinOpenCmd(mi interface{}, c cmd.Command) (bool, []tea.Cmd) {
if c.Target == WIN_ID { if c.Target == WIN_ID {
m.xywh = c.GetArg("xywh").([4]int) m.xywh = c.GetArg("xywh").([4]int)
m.replyToIdx = c.GetArg("replyToIdx").(int)
m.replyTo = c.GetArg("replyTo").(string) m.action = c.GetArg("action").(string)
m.replyToIface = c.GetArg(m.replyTo)
cmds = append(cmds, m.textarea.Focus()) if m.action == "post" {
m.iface = c.GetArg("post").(*post.Post)
m.inputFocused = 0
cmds = append(cmds, m.textinput.Focus())
} else if m.action == "reply" {
m.replyToIdx = c.GetArg("replyToIdx").(int)
m.replyTo = c.GetArg("replyTo").(string)
m.iface = c.GetArg(m.replyTo)
m.inputFocused = 1
cmds = append(cmds, m.textarea.Focus())
}
return true, cmds return true, cmds
} }

View File

@ -2,6 +2,7 @@ package postcreate
import ( import (
"github.com/charmbracelet/bubbles/textarea" "github.com/charmbracelet/bubbles/textarea"
"github.com/charmbracelet/bubbles/textinput"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/mrusme/gobbs/aggregator" "github.com/mrusme/gobbs/aggregator"
"github.com/mrusme/gobbs/ui/ctx" "github.com/mrusme/gobbs/ui/ctx"
@ -18,13 +19,16 @@ type Model struct {
xywh [4]int xywh [4]int
textarea textarea.Model textinput textinput.Model
textarea textarea.Model
inputFocused int
a *aggregator.Aggregator a *aggregator.Aggregator
replyToIdx int action string
replyTo string iface interface{}
replyToIface interface{} replyToIdx int
replyTo string
viewcache string viewcache string
viewcacheTextareaXY []int viewcacheTextareaXY []int
@ -44,18 +48,26 @@ func NewModel(c *ctx.Ctx) Model {
), ),
xywh: [4]int{0, 0, 0, 0}, xywh: [4]int{0, 0, 0, 0},
replyToIdx: 0, inputFocused: 0,
replyTo: "",
replyToIface: nil, action: "",
iface: nil,
replyToIdx: 0,
replyTo: "",
viewcache: "", viewcache: "",
viewcacheTextareaXY: []int{0, 0, 0, 0}, viewcacheTextareaXY: []int{0, 0, 0, 0},
} }
m.textinput = textinput.New()
m.textinput.Placeholder = "Subject goes here"
m.textinput.Prompt = ""
m.textarea = textarea.New() m.textarea = textarea.New()
m.textarea.Placeholder = "Type in your reply ..." m.textarea.Placeholder = "Type in your post ..."
m.textarea.Prompt = "" m.textarea.Prompt = ""
m.tk.KeymapAdd("tab", "tab", "tab") // TODO CONTINUE HERE
m.tk.KeymapAdd("submit", "submit", "ctrl+s") m.tk.KeymapAdd("submit", "submit", "ctrl+s")
m.a, _ = aggregator.New(m.ctx) m.a, _ = aggregator.New(m.ctx)
@ -63,6 +75,10 @@ func NewModel(c *ctx.Ctx) Model {
m.tk.SetViewFunc(buildView) m.tk.SetViewFunc(buildView)
m.tk.SetMsgHandling(toolkit.MsgHandling{ m.tk.SetMsgHandling(toolkit.MsgHandling{
OnKeymapKey: []toolkit.MsgHandlingKeymapKey{ OnKeymapKey: []toolkit.MsgHandlingKeymapKey{
{
ID: "tab",
Handler: handleTab,
},
{ {
ID: "submit", ID: "submit",
Handler: handleSubmit, Handler: handleSubmit,
@ -85,10 +101,21 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var tcmd tea.Cmd var tcmd tea.Cmd
if !m.textarea.Focused() { switch m.inputFocused {
cmds = append(cmds, m.textarea.Focus())
case 0:
if !m.textinput.Focused() {
cmds = append(cmds, m.textinput.Focus())
}
m.textinput, tcmd = m.textinput.Update(msg)
case 1:
if !m.textarea.Focused() {
cmds = append(cmds, m.textarea.Focus())
}
m.textarea, tcmd = m.textarea.Update(msg)
} }
m.textarea, tcmd = m.textarea.Update(msg)
cmds = append(cmds, tcmd) cmds = append(cmds, tcmd)
return m, tea.Batch(cmds...) return m, tea.Batch(cmds...)

View File

@ -3,6 +3,8 @@ package postcreate
import ( import (
"fmt" "fmt"
"github.com/charmbracelet/lipgloss"
"github.com/mrusme/gobbs/models/post"
"github.com/mrusme/gobbs/ui/helpers" "github.com/mrusme/gobbs/ui/helpers"
) )
@ -25,11 +27,20 @@ func buildView(mi interface{}, cached bool) string {
false) false)
} }
title := "Reply" title := ""
if m.replyToIdx != 0 {
title += fmt.Sprintf(" to reply #%d", m.replyToIdx) if m.action == "reply" {
title = "Reply"
if m.replyToIdx != 0 {
title += fmt.Sprintf(" to reply #%d", m.replyToIdx)
}
} else if m.action == "post" {
title = fmt.Sprintf("New Post in %s", m.iface.(*post.Post).Forum.Name)
} }
// textinputWidth := m.tk.ViewWidth() - 2
// m.textinput.SetWidth(textinputWidth)
textareaWidth := m.tk.ViewWidth() - 2 textareaWidth := m.tk.ViewWidth() - 2
textareaHeight := 6 textareaHeight := 6
m.textarea.SetWidth(textareaWidth) m.textarea.SetWidth(textareaWidth)
@ -43,9 +54,21 @@ func buildView(mi interface{}, cached bool) string {
m.ctx.Logger.Debugln("View()") m.ctx.Logger.Debugln("View()")
m.ctx.Logger.Debugf("IsFocused: %v\n", m.tk.IsFocused()) m.ctx.Logger.Debugf("IsFocused: %v\n", m.tk.IsFocused())
var tmp string = ""
if m.action == "post" {
tmp = lipgloss.JoinVertical(
lipgloss.Left,
m.textinput.View(),
"",
m.textarea.View(),
)
} else if m.action == "reply" {
tmp = m.textarea.View()
}
return m.tk.Dialog( return m.tk.Dialog(
title, title,
m.textarea.View(), tmp,
true, true,
) )

View File

@ -65,6 +65,7 @@ func handleReply(mi interface{}) (bool, []tea.Cmd) {
} }
m.ctx.Logger.Debugf("replyToIdx: %d", replyToIdx) m.ctx.Logger.Debugf("replyToIdx: %d", replyToIdx)
var ract cmd.Arg = cmd.Arg{Name: "action", Value: "reply"}
var rtype cmd.Arg = cmd.Arg{Name: "replyTo"} var rtype cmd.Arg = cmd.Arg{Name: "replyTo"}
var rarg cmd.Arg var rarg cmd.Arg
var ridx cmd.Arg = cmd.Arg{Name: "replyToIdx", Value: replyToIdx} var ridx cmd.Arg = cmd.Arg{Name: "replyToIdx", Value: replyToIdx}
@ -79,7 +80,7 @@ func handleReply(mi interface{}) (bool, []tea.Cmd) {
rarg.Value = *m.allReplies[(replyToIdx - 1)] rarg.Value = *m.allReplies[(replyToIdx - 1)]
} }
cmd := cmd.New(cmd.WinOpen, postcreate.WIN_ID, rtype, rarg, ridx) cmd := cmd.New(cmd.WinOpen, postcreate.WIN_ID, ract, rtype, rarg, ridx)
cmds = append(cmds, cmd.Tea()) cmds = append(cmds, cmd.Tea())
m.ctx.Logger.Debugln("caching view") m.ctx.Logger.Debugln("caching view")