1
0

model.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package editor
  2. import (
  3. "strings"
  4. "moose/internal/buffer"
  5. "github.com/gdamore/tcell/v3"
  6. )
  7. type Model struct {
  8. Screen tcell.Screen
  9. Style tcell.Style
  10. Mode Mode
  11. BM buffer.BufferManager
  12. Actions []Action
  13. ShouldQuit bool
  14. }
  15. type Mode int
  16. const (
  17. ModeNormal Mode = iota
  18. ModeInsert
  19. ModeCommand
  20. )
  21. func NewModel(screen tcell.Screen, style tcell.Style) Model {
  22. model := Model{
  23. Screen: screen,
  24. Style: style,
  25. Mode: ModeNormal,
  26. BM: buffer.BufferManager{
  27. Buffers: []buffer.Buffer{buffer.NewBuffer()},
  28. CurrentIdx: 0,
  29. CommandBuffer: buffer.NewBuffer(),
  30. },
  31. Actions: DefaultActions(),
  32. ShouldQuit: false,
  33. }
  34. return model
  35. }
  36. func (m *Model) Quit() {
  37. m.ShouldQuit = true
  38. }
  39. func (m *Model) Current() *buffer.Buffer {
  40. if m.Mode == ModeCommand {
  41. return &m.BM.CommandBuffer
  42. } else {
  43. return m.BM.Current()
  44. }
  45. }
  46. func (m Model) Render() {
  47. len := len(m.BM.Buffers)
  48. sWidth, _ := m.Screen.Size()
  49. width := sWidth / len
  50. for i, buf := range m.BM.Buffers {
  51. table := strings.SplitAfter(buf.String(), "\n")
  52. for j, line := range table {
  53. m.Screen.PutStrStyled(width * i, j, line, m.Style)
  54. }
  55. for _, cur := range buf.CM.Cursors {
  56. line, col := buffer.LineCol(buf.Rope, cur.Offset)
  57. m.Screen.SetContent(width * i + col, line, ' ', nil, m.Style.Reverse(true))
  58. }
  59. }
  60. }
  61. func (m *Model) HandleKeyInput(ev *tcell.EventKey) {
  62. for i := range m.Actions {
  63. action := m.Actions[i]
  64. if strings.ToLower(ev.Name()) == strings.ToLower(action.Binding) {
  65. action.Callback(m, []string{})
  66. return
  67. }
  68. }
  69. if ev.Key() == tcell.KeyRune {
  70. for _, r := range ev.Str() {
  71. m.Current().Insert(r)
  72. }
  73. }
  74. }