package editor import ( "git.gophernest.net/azpect/TextEditor/internal/core" "git.gophernest.net/azpect/TextEditor/internal/motion" tea "github.com/charmbracelet/bubbletea" ) // Model.Update: Handles BubbleTea messages including window resizes and key // presses. Routes input to the handler and adjusts scroll after updates. func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch msg := msg.(type) { case tea.WindowSizeMsg: m.termHeight = msg.Height m.termWidth = msg.Width // TODO: Implement a layout method that handles this // // func (m *Model) layoutWindows() { // if len(m.windows) == 0 { // return // } // // if len(m.windows) == 1 { // // Single window - full screen // m.windows[0].Width = m.termWidth // m.windows[0].Height = m.termHeight // return // } // // // Multiple windows - distribute space // // This is where you'd implement split layout logic // // For example, horizontal split: // halfHeight := m.termHeight / 2 // for i, win := range m.windows { // win.Width = m.termWidth // if i < len(m.windows)-1 { // win.Height = halfHeight // } else { // // Last window gets remainder // win.Height = m.termHeight - (halfHeight * (len(m.windows) - 1)) // } // } // } for i := range m.windows { m.windows[i].Height = msg.Height m.windows[i].Width = msg.Width m.windows[i].AdjustScroll() } // TODO: This is not great, totally temporary. But I don't like vim's handling, so this is up to me case tea.MouseMsg: switch msg.Button { case tea.MouseButtonWheelUp: scrollAction := motion.ScrollUpPage{Divisor: 4} // Quarter page cmd = scrollAction.Execute(m) case tea.MouseButtonWheelDown: scrollAction := motion.ScrollDownPage{Divisor: 4} // Quarter page cmd = scrollAction.Execute(m) } if len(m.windows) > 0 { m.ActiveWindow().AdjustScroll() } case tea.KeyMsg: // TODO: This needs to be removed, but for now its required for the tests. // Ctrl+C always quits regardless of mode if msg.Type == tea.KeyCtrlC { return m, tea.Quit } // TODO: This is not great // TODO: Any vim action should exit also // Simple override for command output mode for now if m.Mode() == core.CommandOutputMode { // TODO: Implement g/G/d/u switch msg.String() { case "enter": m.SetMode(core.NormalMode) m.SetCommandOutput(&core.CommandOutput{}) case "j": m.CommandOutput().ScrollDown(m.termHeight) case "k": m.CommandOutput().ScrollUp() } } else { cmd = m.HandleKey(msg.String()) } } return m, cmd }