diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index 83edc8f..12a39d0 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -1,6 +1,7 @@ package chat import ( + "log" "strconv" "strings" "time" @@ -337,20 +338,55 @@ func (m *Model) sendMessage() tea.Cmd { // } func (m *Model) SetReceiver(receiverIndex int) { - if m.receiverIndex == nil || *m.receiverIndex != receiverIndex { - m.index = -1 + if m.receiverIndex != nil && *m.receiverIndex == receiverIndex { + return } + m.ResetBeforeSwitch() m.receiverIndex = &receiverIndex m.frequencyIndex = nil + m.RestoreAfterSwitch() } func (m *Model) SetFrequency(networkIndex, frequencyIndex int) { - if m.frequencyIndex == nil || *m.frequencyIndex != frequencyIndex { - m.index = -1 + if m.frequencyIndex != nil && *m.frequencyIndex == frequencyIndex { + return } + m.ResetBeforeSwitch() m.receiverIndex = nil m.frequencyIndex = &frequencyIndex m.networkIndex = networkIndex + m.RestoreAfterSwitch() +} + +func (m *Model) ResetBeforeSwitch() { + source := m.frequencyIndex + if source == nil { + source = m.receiverIndex + } + if source == nil { + return + } + + log.Println("Resetting", source) + state.State.IncompleteMessages[snowflake.ID(*source)] = m.vi.String() + m.vi.Reset() + m.index = -1 +} + +func (m *Model) RestoreAfterSwitch() { + source := m.frequencyIndex + if source == nil { + source = m.receiverIndex + } + if source == nil { + return + } + + log.Println("Restoring", source) + msgs := state.State.IncompleteMessages + if val, ok := msgs[snowflake.ID(*source)]; ok { + m.vi.SetString(val) + } } func (m *Model) renderMessage(message data.Message, builder *strings.Builder, header bool) int { diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go index ed5ca85..285658f 100644 --- a/internal/client/ui/core/state/state.go +++ b/internal/client/ui/core/state/state.go @@ -8,11 +8,15 @@ import ( ) type state struct { + // Key is either a frequency or receiver + IncompleteMessages map[snowflake.ID]string + Messages map[snowflake.ID]*btree.BTreeG[data.Message] - Networks []packet.FullNetwork + Networks []packet.FullNetwork } var State state = state{ - Networks: []packet.FullNetwork{}, - Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{}, + Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{}, + Networks: []packet.FullNetwork{}, + IncompleteMessages: map[snowflake.ID]string{}, } diff --git a/internal/client/ui/viminput/viminput.go b/internal/client/ui/viminput/viminput.go index 4e2a079..5017344 100644 --- a/internal/client/ui/viminput/viminput.go +++ b/internal/client/ui/viminput/viminput.go @@ -341,14 +341,6 @@ func (m *Model) Blur() { m.focus = false } -func (m *Model) SetLines(lines ...[]rune) { - m.lines = lines -} - -func (m *Model) Lines() [][]rune { - return m.lines -} - func (m *Model) SetCursorColumn(col int) { if len(m.lines[m.cursorLine]) == 0 { m.cursorColumn = 0 @@ -2021,6 +2013,18 @@ func (m *Model) String() string { return message } +func (m *Model) SetString(s string) { + m.lines = [][]rune{[]rune("")} + i := 0 + for _, c := range s { + if c == '\n' { + m.lines = append(m.lines, []rune("")) + } else { + m.lines[i] = append(m.lines[i], c) + } + } +} + func (m *Model) Reset() { m.lines = [][]rune{[]rune("")} m.undoStack = []State{{[][]rune{[]rune("")}, 0, 0}}