(m *TuiModel, str string)
| 116 | } |
| 117 | |
| 118 | func HandleFormatMovement(m *TuiModel, str string) (ret bool) { |
| 119 | lines := 0 |
| 120 | for _, v := range m.Format.EditSlices { |
| 121 | if *v != "" { |
| 122 | lines++ |
| 123 | } |
| 124 | } |
| 125 | switch str { |
| 126 | case "pgdown": |
| 127 | l := len(m.Format.Text) - 1 |
| 128 | for i := 0; i < m.Viewport.Height && m.Viewport.YOffset < l; i++ { |
| 129 | ScrollDown(m) |
| 130 | } |
| 131 | ret = true |
| 132 | break |
| 133 | case "pgup": |
| 134 | for i := 0; i < |
| 135 | m.Viewport.Height && m.Viewport.YOffset > 0; i++ { |
| 136 | ScrollUp(m) |
| 137 | } |
| 138 | ret = true |
| 139 | break |
| 140 | case "home": |
| 141 | m.Viewport.YOffset = 0 |
| 142 | m.Format.CursorX = 0 |
| 143 | m.Format.CursorY = 0 |
| 144 | ret = true |
| 145 | break |
| 146 | case "end": |
| 147 | m.Viewport.YOffset = len(m.Format.Text) - m.Viewport.Height |
| 148 | m.Format.CursorY = Min(m.Viewport.Height-FooterHeight, strings.Count(m.Data().EditTextBuffer, "\n")) |
| 149 | m.Format.CursorX = m.Format.RunningOffsets[len(m.Format.RunningOffsets)-1] |
| 150 | ret = true |
| 151 | break |
| 152 | case "right": |
| 153 | ret = true |
| 154 | m.Format.CursorX++ |
| 155 | |
| 156 | offset := GetOffsetForLineNumber(m.Format.CursorY) |
| 157 | x := m.Format.CursorX + offset + 1 // for the space at the end |
| 158 | l := len(*m.Format.EditSlices[m.Format.CursorY]) |
| 159 | maxY := lines - 1 |
| 160 | if l < x && m.Format.CursorY < maxY { |
| 161 | m.Format.CursorX = 0 |
| 162 | m.Format.CursorY++ |
| 163 | } else if l < x && m.Format.CursorY < len(m.Format.Text)-1 { |
| 164 | go Program.Send( |
| 165 | tea.KeyMsg{ |
| 166 | Type: tea.KeyDown, |
| 167 | Alt: false, |
| 168 | }, |
| 169 | ) |
| 170 | } else if m.Format.CursorY > maxY { |
| 171 | m.Format.CursorX = maxY |
| 172 | } |
| 173 | |
| 174 | break |
| 175 | case "left": |
no test coverage detected