action.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package editor
  2. import(
  3. "strings"
  4. )
  5. type ActionManager = struct {
  6. Common []Action
  7. Normal []Action
  8. Insert []Action
  9. Palette []Action
  10. }
  11. type Action = struct {
  12. Binding string
  13. Command string
  14. HasArgs bool
  15. Callback func(*Model, []string)
  16. }
  17. func DefaultActionManager() ActionManager {
  18. return ActionManager{
  19. Common: []Action{
  20. Action{
  21. Binding: "f12",
  22. Callback: func(m *Model, args []string) {
  23. m.Mode = ModeNormal
  24. },
  25. },
  26. Action{
  27. Binding: "left",
  28. Callback: func(m *Model, args []string) {
  29. m.BM.Current().MoveHoriz(-1)
  30. },
  31. },
  32. Action{
  33. Binding: "right",
  34. Callback: func(m *Model, args []string) {
  35. m.BM.Current().MoveHoriz(1)
  36. },
  37. },
  38. Action{
  39. Binding: "shift+ctrl+Rune[v]",
  40. Command: "paste",
  41. HasArgs: false,
  42. Callback: func(m *Model, args []string) {
  43. m.Screen.GetClipboard()
  44. },
  45. },
  46. Action{
  47. Binding: "ctrl+c",
  48. Command: "q",
  49. HasArgs: true,
  50. Callback: func(m *Model, args []string) {
  51. m.Quit()
  52. },
  53. },
  54. },
  55. Normal: []Action{
  56. Action{
  57. Binding: "Rune[i]",
  58. Callback: func(m *Model, args []string) {
  59. m.Mode = ModeInsert
  60. },
  61. },
  62. Action{
  63. Binding: "Rune[q]",
  64. Callback: func(m *Model, args []string) {
  65. m.Mode = ModePalette
  66. m.BM.PaletteBuffer.Clear()
  67. m.BM.PaletteBuffer.Insert('/')
  68. },
  69. },
  70. },
  71. Insert: []Action{
  72. Action{
  73. Binding: "up",
  74. Callback: func(m *Model, args []string) {
  75. m.BM.Current().MoveVert(-1)
  76. },
  77. },
  78. Action{
  79. Binding: "down",
  80. Callback: func(m *Model, args []string) {
  81. m.BM.Current().MoveVert(1)
  82. },
  83. },
  84. Action{
  85. Binding: "shift+up",
  86. Command: "TODO:",
  87. HasArgs: false,
  88. Callback: func(m *Model, args []string) {
  89. m.BM.Current().AddCursorVert(-1)
  90. },
  91. },
  92. Action{
  93. Binding: "shift+down",
  94. Command: "TODO:",
  95. HasArgs: false,
  96. Callback: func(m *Model, args []string) {
  97. m.BM.Current().AddCursorVert(1)
  98. },
  99. },
  100. Action{
  101. Binding: "esc",
  102. Command: "TODO:",
  103. HasArgs: false,
  104. Callback: func(m *Model, args []string) {
  105. m.BM.Current().ClearCursors()
  106. },
  107. },
  108. Action{
  109. Binding: "tab",
  110. Command: "TODO:",
  111. HasArgs: false,
  112. Callback: func(m *Model, args []string) {
  113. for _ = range 4 {
  114. m.BM.Current().Insert(' ')
  115. }
  116. },
  117. },
  118. Action{
  119. Binding: "shift+tab",
  120. Command: "TODO:",
  121. HasArgs: false,
  122. Callback: func(m *Model, args []string) {
  123. // TODO: implement m.BM.Current().remove...
  124. },
  125. },
  126. Action{
  127. Binding: "backspace",
  128. Callback: func(m *Model, args []string) {
  129. m.BM.Current().Delete()
  130. },
  131. },
  132. Action{
  133. Binding: "enter",
  134. Callback: func(m *Model, args []string) {
  135. m.BM.Current().Insert('\n')
  136. },
  137. },
  138. },
  139. Palette: []Action{
  140. Action{
  141. Binding: "backspace",
  142. Callback: func(m *Model, args []string) {
  143. m.BM.PaletteBuffer.Delete()
  144. },
  145. },
  146. Action{
  147. Binding: "enter",
  148. Callback: func(m *Model, _ []string) {
  149. input := m.BM.PaletteBuffer.String()
  150. args := strings.Split(input, " ")
  151. if args[0] == "" {
  152. m.Mode = ModeNormal
  153. return
  154. }
  155. cmd := string([]rune(args[0])[1:])
  156. if strings.HasPrefix(args[0], "/") {
  157. for _, action := range append(m.AM.Common, append(m.AM.Normal, m.AM.Insert...)...) {
  158. if action.Command != "" && cmd == action.Command {
  159. m.Mode = ModeNormal
  160. action.Callback(m, args[1:])
  161. return
  162. }
  163. }
  164. m.Mode = ModeNormal
  165. m.BM.PaletteBuffer.Clear()
  166. m.BM.PaletteBuffer.Paste("moose.error:Unknown command \"" + cmd + "\"")
  167. } else {
  168. m.Mode = ModeNormal
  169. m.BM.PaletteBuffer.Clear()
  170. m.BM.PaletteBuffer.Paste("moose.error:Unknown palette input \"" + cmd + "\"")
  171. }
  172. },
  173. },
  174. },
  175. }
  176. }