widget: add some rudimentary exported editing methods

Editor.Delete
Editor.Move
Editor.Insert

Move the Editor.command method up above all the functions it calls.

Signed-off-by: Larry Clapp <larry@theclapp.org>
This commit is contained in:
Larry Clapp
2019-12-16 08:27:29 -05:00
committed by Elias Naur
parent 8a4d0007f3
commit 2b4e9ad426
2 changed files with 65 additions and 66 deletions
+21 -22
View File
@@ -35,20 +35,19 @@ func (e *editBuffer) Changed() bool {
return c return c
} }
func (e *editBuffer) deleteRuneForward() { func (e *editBuffer) deleteRunes(runes int) {
e.moveGap(0) e.moveGap(0)
_, s := utf8.DecodeRune(e.text[e.gapend:]) for ; runes < 0 && e.gapstart > 0; runes++ {
e.gapend += s _, s := utf8.DecodeLastRune(e.text[:e.gapstart])
e.changed = e.changed || s > 0 e.gapstart -= s
e.dump() e.caret -= s
} e.changed = e.changed || s > 0
}
func (e *editBuffer) deleteRune() { for ; runes > 0 && e.gapend < len(e.text); runes-- {
e.moveGap(0) _, s := utf8.DecodeRune(e.text[e.gapend:])
_, s := utf8.DecodeLastRune(e.text[:e.gapstart]) e.gapend += s
e.gapstart -= s e.changed = e.changed || s > 0
e.caret -= s }
e.changed = e.changed || s > 0
e.dump() e.dump()
} }
@@ -141,15 +140,15 @@ func (e *editBuffer) dump() {
} }
} }
func (e *editBuffer) moveLeft() { func (e *editBuffer) move(runes int) {
_, s := e.runeBefore(e.caret) for ; runes < 0 && e.caret > 0; runes++ {
e.caret -= s _, s := e.runeBefore(e.caret)
e.dump() e.caret -= s
} }
for ; runes > 0 && e.caret < len(e.text); runes-- {
func (e *editBuffer) moveRight() { _, s := e.runeAt(e.caret)
_, s := e.runeAt(e.caret) e.caret += s
e.caret += s }
e.dump() e.dump()
} }
+44 -44
View File
@@ -175,6 +175,38 @@ func (e *Editor) processKey(gtx *layout.Context) {
} }
} }
func (e *Editor) command(k key.Event) bool {
switch k.Name {
case key.NameReturn, key.NameEnter:
e.append("\n")
case key.NameDeleteBackward:
e.Delete(-1)
case key.NameDeleteForward:
e.Delete(1)
case key.NameUpArrow:
line, _, carX, _ := e.layoutCaret()
e.carXOff = e.moveToLine(carX+e.carXOff, line-1)
case key.NameDownArrow:
line, _, carX, _ := e.layoutCaret()
e.carXOff = e.moveToLine(carX+e.carXOff, line+1)
case key.NameLeftArrow:
e.Move(-1)
case key.NameRightArrow:
e.Move(1)
case key.NamePageUp:
e.movePages(-1)
case key.NamePageDown:
e.movePages(+1)
case key.NameHome:
e.moveStart()
case key.NameEnd:
e.moveEnd()
default:
return false
}
return true
}
// Focus requests the input focus for the Editor. // Focus requests the input focus for the Editor.
func (e *Editor) Focus() { func (e *Editor) Focus() {
e.requestFocus = true e.requestFocus = true
@@ -451,15 +483,18 @@ func (e *Editor) invalidate() {
e.valid = false e.valid = false
} }
func (e *Editor) deleteRune() { // Delete runes from the caret position. The sign of runes specifies the
e.rr.deleteRune() // direction to delete: positive is forward, negative is backward.
func (e *Editor) Delete(runes int) {
e.rr.deleteRunes(runes)
e.carXOff = 0 e.carXOff = 0
e.invalidate() e.invalidate()
} }
func (e *Editor) deleteRuneForward() { // Insert inserts text at the caret, moving the caret forward.
e.rr.deleteRuneForward() func (e *Editor) Insert(s string) {
e.carXOff = 0 e.append(s)
e.caretScroll = true
e.invalidate() e.invalidate()
} }
@@ -549,13 +584,10 @@ func (e *Editor) moveToLine(carX fixed.Int26_6, carLine2 int) fixed.Int26_6 {
return carX - carX2 return carX - carX2
} }
func (e *Editor) moveLeft() { // Move the caret: positive distance moves forward, negative distance moves
e.rr.moveLeft() // backward.
e.carXOff = 0 func (e *Editor) Move(distance int) {
} e.rr.move(distance)
func (e *Editor) moveRight() {
e.rr.moveRight()
e.carXOff = 0 e.carXOff = 0
} }
@@ -612,37 +644,5 @@ func (e *Editor) scrollToCaret() {
} }
} }
func (e *Editor) command(k key.Event) bool {
switch k.Name {
case key.NameReturn, key.NameEnter:
e.append("\n")
case key.NameDeleteBackward:
e.deleteRune()
case key.NameDeleteForward:
e.deleteRuneForward()
case key.NameUpArrow:
line, _, carX, _ := e.layoutCaret()
e.carXOff = e.moveToLine(carX+e.carXOff, line-1)
case key.NameDownArrow:
line, _, carX, _ := e.layoutCaret()
e.carXOff = e.moveToLine(carX+e.carXOff, line+1)
case key.NameLeftArrow:
e.moveLeft()
case key.NameRightArrow:
e.moveRight()
case key.NamePageUp:
e.movePages(-1)
case key.NamePageDown:
e.movePages(+1)
case key.NameHome:
e.moveStart()
case key.NameEnd:
e.moveEnd()
default:
return false
}
return true
}
func (s ChangeEvent) isEditorEvent() {} func (s ChangeEvent) isEditorEvent() {}
func (s SubmitEvent) isEditorEvent() {} func (s SubmitEvent) isEditorEvent() {}