mirror of https://github.com/buggins/dlangui.git
editline: support backspace and del
This commit is contained in:
parent
083241ce3f
commit
34e3f8ec06
|
@ -150,7 +150,18 @@ class EditableContent {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool performOperation(EditOperation op) {
|
bool performOperation(EditOperation op) {
|
||||||
if (op.action == EditAction.Insert) {
|
if (op.action == EditAction.Delete) {
|
||||||
|
TextRange rangeBefore = op.range;
|
||||||
|
dchar[] buf;
|
||||||
|
dstring srcline = _lines[op.range.start.line];
|
||||||
|
buf ~= srcline[0 .. op.range.start.pos];
|
||||||
|
buf ~= srcline[op.range.end.pos .. $];
|
||||||
|
_lines[op.range.start.line] = cast(dstring)buf;
|
||||||
|
TextRange rangeAfter = rangeBefore;
|
||||||
|
rangeAfter.end = rangeAfter.start;
|
||||||
|
handleContentChange(op, rangeBefore, rangeAfter);
|
||||||
|
return true;
|
||||||
|
} else if (op.action == EditAction.Insert) {
|
||||||
// TODO: multiline
|
// TODO: multiline
|
||||||
TextPosition pos = op.range.start;
|
TextPosition pos = op.range.start;
|
||||||
TextRange rangeBefore = TextRange(pos, pos);
|
TextRange rangeBefore = TextRange(pos, pos);
|
||||||
|
@ -185,6 +196,10 @@ enum EditorActions {
|
||||||
LineEnd,
|
LineEnd,
|
||||||
DocumentBegin,
|
DocumentBegin,
|
||||||
DocumentEnd,
|
DocumentEnd,
|
||||||
|
DelPrevChar, // backspace
|
||||||
|
DelNextChar, // del key
|
||||||
|
DelPrevWord, // ctrl + backspace
|
||||||
|
DelNextWord, // ctrl + del key
|
||||||
}
|
}
|
||||||
|
|
||||||
/// single line editor
|
/// single line editor
|
||||||
|
@ -217,6 +232,10 @@ class EditLine : Widget, EditableContentListener {
|
||||||
new Action(EditorActions.LineEnd, KeyCode.END, 0),
|
new Action(EditorActions.LineEnd, KeyCode.END, 0),
|
||||||
new Action(EditorActions.DocumentBegin, KeyCode.HOME, KeyFlag.Control),
|
new Action(EditorActions.DocumentBegin, KeyCode.HOME, KeyFlag.Control),
|
||||||
new Action(EditorActions.DocumentEnd, KeyCode.END, KeyFlag.Control),
|
new Action(EditorActions.DocumentEnd, KeyCode.END, KeyFlag.Control),
|
||||||
|
new Action(EditorActions.DelPrevChar, KeyCode.BACK, 0),
|
||||||
|
new Action(EditorActions.DelNextChar, KeyCode.DEL, 0),
|
||||||
|
new Action(EditorActions.DelPrevWord, KeyCode.BACK, KeyFlag.Control),
|
||||||
|
new Action(EditorActions.DelNextWord, KeyCode.DEL, KeyFlag.Control),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,6 +329,22 @@ class EditLine : Widget, EditableContentListener {
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
case EditorActions.DelPrevChar:
|
||||||
|
if (_caretPos.pos > 0) {
|
||||||
|
TextRange range = TextRange(_caretPos, _caretPos);
|
||||||
|
range.start.pos--;
|
||||||
|
EditOperation op = new EditOperation(EditAction.Delete, range, null);
|
||||||
|
_content.performOperation(op);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case EditorActions.DelNextChar:
|
||||||
|
if (_caretPos.pos < _measuredText.length) {
|
||||||
|
TextRange range = TextRange(_caretPos, _caretPos);
|
||||||
|
range.end.pos++;
|
||||||
|
EditOperation op = new EditOperation(EditAction.Delete, range, null);
|
||||||
|
_content.performOperation(op);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
case EditorActions.Up:
|
case EditorActions.Up:
|
||||||
break;
|
break;
|
||||||
case EditorActions.Down:
|
case EditorActions.Down:
|
||||||
|
@ -352,10 +387,13 @@ class EditLine : Widget, EditableContentListener {
|
||||||
//}
|
//}
|
||||||
} else if (event.action == KeyAction.Text && event.text.length) {
|
} else if (event.action == KeyAction.Text && event.text.length) {
|
||||||
Log.d("text entered: ", event.text);
|
Log.d("text entered: ", event.text);
|
||||||
|
dchar ch = event.text[0];
|
||||||
|
if (ch != 8) { // ignore Backspace
|
||||||
EditOperation op = new EditOperation(EditAction.Insert, _caretPos, event.text);
|
EditOperation op = new EditOperation(EditAction.Insert, _caretPos, event.text);
|
||||||
_content.performOperation(op);
|
_content.performOperation(op);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return super.onKeyEvent(event);
|
return super.onKeyEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue