1
0

model.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package tui
  2. import (
  3. "moose/internal/buffer"
  4. "charm.land/bubbles/v2/key"
  5. "charm.land/bubbles/v2/viewport"
  6. tea "charm.land/bubbletea/v2"
  7. )
  8. type Keymap = struct {
  9. left, right, up, down, tab, backtab, newline, delete, quit key.Binding
  10. }
  11. type EditorModel struct {
  12. Buffer buffer.Buffer
  13. Viewport viewport.Model
  14. Keymap Keymap
  15. Width int
  16. Height int
  17. }
  18. func NewEditorModel() EditorModel {
  19. initialBuf := buffer.Buffer{
  20. Rope: nil,
  21. CM: buffer.CursorManager{
  22. Cursors: []buffer.Cursor{{Offset: 0}},
  23. PrimaryIdx: 0,
  24. },
  25. }
  26. vp := viewport.New()
  27. vp.SetContent(initialBuf.String())
  28. return EditorModel{
  29. Buffer: initialBuf,
  30. Viewport: vp,
  31. Keymap: Keymap{
  32. left: key.NewBinding(
  33. key.WithKeys("left"),
  34. ),
  35. right: key.NewBinding(
  36. key.WithKeys("right"),
  37. ),
  38. up: key.NewBinding(
  39. key.WithKeys("up"),
  40. ),
  41. down: key.NewBinding(
  42. key.WithKeys("down"),
  43. ),
  44. tab: key.NewBinding(
  45. key.WithKeys("tab"),
  46. ),
  47. backtab: key.NewBinding(
  48. key.WithKeys("shift+tab"),
  49. ),
  50. delete: key.NewBinding(
  51. key.WithKeys("backspace"),
  52. ),
  53. newline: key.NewBinding(
  54. key.WithKeys("enter"),
  55. ),
  56. quit: key.NewBinding(
  57. key.WithKeys("ctrl+c"),
  58. ),
  59. },
  60. }
  61. }
  62. func (m EditorModel) Init() tea.Cmd {
  63. return nil
  64. }
  65. func (m EditorModel) View() tea.View {
  66. v := tea.NewView(m.Viewport.View())
  67. v.AltScreen = true
  68. return v
  69. }