mirror of https://github.com/buggins/dlangui.git
implement caret blinking - issue #40
This commit is contained in:
parent
7dca400e4c
commit
e7f1e2201f
|
@ -614,6 +614,53 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
|
||||||
|
|
||||||
abstract protected Point measureVisibleText();
|
abstract protected Point measureVisibleText();
|
||||||
|
|
||||||
|
protected int _caretBlingingInterval = 1000;
|
||||||
|
protected ulong _caretTimerId;
|
||||||
|
protected bool _caretBlinkingPhase;
|
||||||
|
protected long _lastBlinkStartTs;
|
||||||
|
protected void startCaretBlinking() {
|
||||||
|
if (window) {
|
||||||
|
long ts = currentTimeMillis;
|
||||||
|
if (_caretTimerId) {
|
||||||
|
if (_lastBlinkStartTs + _caretBlingingInterval / 4 > ts)
|
||||||
|
return; // don't update timer too frequently
|
||||||
|
cancelTimer(_caretTimerId);
|
||||||
|
}
|
||||||
|
_caretTimerId = setTimer(_caretBlingingInterval / 2);
|
||||||
|
_lastBlinkStartTs = ts;
|
||||||
|
_caretBlinkingPhase = false;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void stopCaretBlinking() {
|
||||||
|
if (window) {
|
||||||
|
if (_caretTimerId) {
|
||||||
|
cancelTimer(_caretTimerId);
|
||||||
|
_caretTimerId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// handle timer; return true to repeat timer event after next interval, false cancel timer
|
||||||
|
override bool onTimer(ulong id) {
|
||||||
|
if (id == _caretTimerId) {
|
||||||
|
_caretBlinkingPhase = !_caretBlinkingPhase;
|
||||||
|
if (!_caretBlinkingPhase)
|
||||||
|
_lastBlinkStartTs = currentTimeMillis;
|
||||||
|
invalidate();
|
||||||
|
return focused;
|
||||||
|
}
|
||||||
|
return super.onTimer(id);
|
||||||
|
}
|
||||||
|
/// override to handle focus changes
|
||||||
|
override protected void handleFocusChange(bool focused) {
|
||||||
|
if (focused)
|
||||||
|
startCaretBlinking();
|
||||||
|
else
|
||||||
|
stopCaretBlinking();
|
||||||
|
super.handleFocusChange(focused);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// returns cursor rectangle
|
/// returns cursor rectangle
|
||||||
protected Rect caretRect() {
|
protected Rect caretRect() {
|
||||||
Rect caretRc = textPosToClient(_caretPos);
|
Rect caretRc = textPosToClient(_caretPos);
|
||||||
|
@ -635,6 +682,9 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
|
||||||
/// draws caret
|
/// draws caret
|
||||||
protected void drawCaret(DrawBuf buf) {
|
protected void drawCaret(DrawBuf buf) {
|
||||||
if (focused) {
|
if (focused) {
|
||||||
|
if (_caretBlinkingPhase) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// draw caret
|
// draw caret
|
||||||
Rect caretRc = caretRect();
|
Rect caretRc = caretRect();
|
||||||
if (caretRc.intersects(_clientRect)) {
|
if (caretRc.intersects(_clientRect)) {
|
||||||
|
@ -1137,6 +1187,7 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
|
||||||
|
|
||||||
/// handle keys
|
/// handle keys
|
||||||
override bool onKeyEvent(KeyEvent event) {
|
override bool onKeyEvent(KeyEvent event) {
|
||||||
|
if (focused) startCaretBlinking();
|
||||||
if (event.action == KeyAction.Text && event.text.length && !(event.flags & (KeyFlag.Control | KeyFlag.Alt))) {
|
if (event.action == KeyAction.Text && event.text.length && !(event.flags & (KeyFlag.Control | KeyFlag.Alt))) {
|
||||||
Log.d("text entered: ", event.text);
|
Log.d("text entered: ", event.text);
|
||||||
if (readOnly)
|
if (readOnly)
|
||||||
|
@ -1163,6 +1214,7 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
|
||||||
// support onClick
|
// support onClick
|
||||||
if (event.action == MouseAction.ButtonDown && event.button == MouseButton.Left) {
|
if (event.action == MouseAction.ButtonDown && event.button == MouseButton.Left) {
|
||||||
setFocus();
|
setFocus();
|
||||||
|
startCaretBlinking();
|
||||||
updateCaretPositionByMouse(event.x - _clientRect.left, event.y - _clientRect.top, false);
|
updateCaretPositionByMouse(event.x - _clientRect.left, event.y - _clientRect.top, false);
|
||||||
invalidate();
|
invalidate();
|
||||||
return true;
|
return true;
|
||||||
|
@ -1813,30 +1865,18 @@ class EditBox : EditWidgetBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
case EditorActions.ZoomOut:
|
||||||
case EditorActions.ZoomIn:
|
case EditorActions.ZoomIn:
|
||||||
{
|
{
|
||||||
if (_minFontSize < _maxFontSize && _minFontSize >= 7 && _maxFontSize >= 7) {
|
int dir = a.id == EditorActions.ZoomIn ? 1 : -1;
|
||||||
int currentFontSize = fontSize;
|
if (_minFontSize < _maxFontSize && _minFontSize > 0 && _maxFontSize > 0) {
|
||||||
int increment = currentFontSize >= 40 ? 2 : 1;
|
|
||||||
int newFontSize = currentFontSize + increment; //* 110 / 100;
|
|
||||||
if (currentFontSize != newFontSize && newFontSize <= _maxFontSize && newFontSize >= _minFontSize) {
|
|
||||||
Log.i("Font size in editor ", id, " zoomed to ", newFontSize);
|
|
||||||
fontSize = cast(ushort)newFontSize;
|
|
||||||
updateFontProps();
|
|
||||||
measureVisibleText();
|
|
||||||
updateScrollBars();
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case EditorActions.ZoomOut:
|
|
||||||
{
|
|
||||||
if (_minFontSize < _maxFontSize && _minFontSize >= 9 && _maxFontSize >= 9) {
|
|
||||||
int currentFontSize = fontSize;
|
int currentFontSize = fontSize;
|
||||||
int increment = currentFontSize >= 30 ? 2 : 1;
|
int increment = currentFontSize >= 30 ? 2 : 1;
|
||||||
int newFontSize = currentFontSize - increment; //* 100 / 110;
|
int newFontSize = currentFontSize + increment * dir; //* 110 / 100;
|
||||||
if (currentFontSize != newFontSize && newFontSize >= _minFontSize) {
|
if (newFontSize > 30)
|
||||||
|
newFontSize &= 0xFFFE;
|
||||||
|
if (currentFontSize != newFontSize && newFontSize <= _maxFontSize && newFontSize >= _minFontSize) {
|
||||||
|
Log.i("Font size in editor ", id, " zoomed to ", newFontSize);
|
||||||
fontSize = cast(ushort)newFontSize;
|
fontSize = cast(ushort)newFontSize;
|
||||||
updateFontProps();
|
updateFontProps();
|
||||||
measureVisibleText();
|
measureVisibleText();
|
||||||
|
|
Loading…
Reference in New Issue