diff --git a/ui/ui.go b/ui/ui.go index cb2311a..58fcfb3 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -48,6 +48,9 @@ type Model struct { currentView int wm *windowmanager.WM ctx *ctx.Ctx + + viewcache string + renderOnlyFocused bool } func NewModel(c *ctx.Ctx) Model { @@ -56,6 +59,9 @@ func NewModel(c *ctx.Ctx) Model { currentView: 0, wm: windowmanager.New(c), ctx: c, + + viewcache: "", + renderOnlyFocused: false, } m.header = header.NewModel(m.ctx) @@ -121,6 +127,8 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { ) case postcreate.WIN_ID: m.ctx.Logger.Debugln("received WinOpen") + m.viewcache = m.buildView(false) + m.renderOnlyFocused = true ccmds = m.wm.Open( msg.Target, postcreate.NewModel(m.ctx), @@ -129,6 +137,12 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { ) } m.ctx.Logger.Debugf("got back ccmds: %v\n", ccmds) + case cmd.WinClose: + switch msg.Target { + case postcreate.WIN_ID: + m.ctx.Logger.Debugln("received WinClose") + m.renderOnlyFocused = false + } default: if msg.Call < cmd.ViewFocus { m.ctx.Logger.Debugf("updating all with cmd: %v\n", msg) @@ -158,11 +172,22 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } func (m Model) View() string { - s := strings.Builder{} - s.WriteString(m.header.View() + "\n") - s.WriteString(m.views[m.currentView].View()) + return m.buildView(true) +} - return m.wm.View(s.String()) +func (m Model) buildView(cached bool) string { + s := strings.Builder{} + var tmp string = "" + + if m.viewcache != "" && m.renderOnlyFocused { + tmp = m.viewcache + } else { + s.WriteString(m.header.View() + "\n") + s.WriteString(m.views[m.currentView].View()) + tmp = s.String() + } + + return m.wm.View(tmp, m.renderOnlyFocused) } func (m Model) setSizes(winWidth int, winHeight int) { diff --git a/ui/windowmanager/windowmanager.go b/ui/windowmanager/windowmanager.go index 3fd6d82..03b1455 100644 --- a/ui/windowmanager/windowmanager.go +++ b/ui/windowmanager/windowmanager.go @@ -196,10 +196,18 @@ func (wm *WM) ResizeAll(w int, h int) []tea.Cmd { return tcmds } -func (wm *WM) View(view string) string { +func (wm *WM) View(view string, onlyFocused bool) string { var v string = view + var j int = 0 - for i := 0; i < len(wm.stack); i++ { + if onlyFocused { + j = len(wm.stack) - 1 + if j < 0 { + j = 0 + } + } + + for i := j; i < len(wm.stack); i++ { v = helpers.PlaceOverlay( wm.stack[i].XYWH[0], wm.stack[i].XYWH[1]+(wm.ctx.Screen[1]-wm.ctx.Content[1]), diff --git a/ui/windows/postcreate/postcreate.go b/ui/windows/postcreate/postcreate.go index 85bc3dc..5675d22 100644 --- a/ui/windows/postcreate/postcreate.go +++ b/ui/windows/postcreate/postcreate.go @@ -15,6 +15,7 @@ import ( "github.com/mrusme/gobbs/models/reply" "github.com/mrusme/gobbs/ui/cmd" "github.com/mrusme/gobbs/ui/ctx" + "github.com/mrusme/gobbs/ui/helpers" ) var ( @@ -151,6 +152,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if msg.Target == WIN_ID || msg.Target == "*" { m.focused = true + m.viewcache = m.buildView(false) } return m, nil case cmd.WinBlur: @@ -166,8 +168,8 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case cursor.BlinkMsg: m.ctx.Logger.Debugf("textarea is focused: %v\n", m.textarea.Focused()) - default: - m.ctx.Logger.Debugf("received unhandled msg: %v\n", msg) + // default: + // m.ctx.Logger.Debugf("received unhandled msg: %v\n", msg) } var tcmd tea.Cmd @@ -198,17 +200,17 @@ func (m Model) View() string { func (m Model) buildView(cached bool) string { var view strings.Builder = strings.Builder{} - // if cached && m.viewcache != "" { - // m.ctx.Logger.Debugln("Cached View()") - // - // m.textarea.SetWidth(m.viewcacheTextareaXY[2]) - // m.textarea.SetHeight(m.viewcacheTextareaXY[3]) - // - // return helpers.PlaceOverlay( - // m.viewcacheTextareaXY[0], m.viewcacheTextareaXY[1], - // m.textarea.View(), m.viewcache, - // false) - // } + if cached && m.viewcache != "" { + m.ctx.Logger.Debugln("Cached View()") + + m.textarea.SetWidth(m.viewcacheTextareaXY[2]) + m.textarea.SetHeight(m.viewcacheTextareaXY[3]) + + return helpers.PlaceOverlay( + m.viewcacheTextareaXY[0], m.viewcacheTextareaXY[1], + m.textarea.View(), m.viewcache, + false) + } title := "Reply" if m.replyToIdx != 0 {