mirror of https://github.com/buggins/dlangui.git
triple mouse click support; select whole line on mouse triple click - close #193
This commit is contained in:
parent
543259fe88
commit
f68cce12b1
|
|
@ -722,6 +722,8 @@ __gshared long DOUBLE_CLICK_THRESHOLD_MS = 400;
|
|||
|
||||
/// Mouse button state details for MouseEvent
|
||||
struct ButtonDetails {
|
||||
/// Clock.currStdTime() for down event of this button (0 if button is up) set after double click to time when first click occured.
|
||||
protected long _prevDownTs;
|
||||
/// Clock.currStdTime() for down event of this button (0 if button is up).
|
||||
protected long _downTs;
|
||||
/// Clock.currStdTime() for up event of this button (0 if button is still down).
|
||||
|
|
@ -734,12 +736,19 @@ struct ButtonDetails {
|
|||
protected ushort _downFlags;
|
||||
/// true if button is made down shortly after up - valid if button is down
|
||||
protected bool _doubleClick;
|
||||
/// true if button is made down twice shortly after up - valid if button is down
|
||||
protected bool _tripleClick;
|
||||
|
||||
/// Returns true if button is made down shortly after up
|
||||
@property bool doubleClick() {
|
||||
return _doubleClick;
|
||||
}
|
||||
|
||||
/// Returns true if button is made down twice shortly after up
|
||||
@property bool tripleClick() {
|
||||
return _tripleClick;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void reset() {
|
||||
|
|
@ -759,14 +768,18 @@ struct ButtonDetails {
|
|||
_upTs = 0;
|
||||
_downTs = std.datetime.Clock.currStdTime;
|
||||
long downIntervalMs = (_downTs - oldDownTs) / 10000;
|
||||
long prevDownIntervalMs = (_downTs - _prevDownTs) / 10000;
|
||||
//Log.d("Button down ", x, ",", y, " _downTs=", _downTs, " _upTs=", _upTs, " downInterval=", downIntervalMs);
|
||||
_doubleClick = (oldDownTs && downIntervalMs < DOUBLE_CLICK_THRESHOLD_MS);
|
||||
_tripleClick = (prevDownIntervalMs && prevDownIntervalMs < DOUBLE_CLICK_THRESHOLD_MS * 2);
|
||||
_doubleClick = !_tripleClick && (oldDownTs && downIntervalMs < DOUBLE_CLICK_THRESHOLD_MS);
|
||||
_prevDownTs = _doubleClick ? oldDownTs : 0;
|
||||
}
|
||||
/// update for button up
|
||||
void up(short x, short y, ushort flags) {
|
||||
static import std.datetime;
|
||||
//Log.d("Button up ", x, ",", y, " _downTs=", _downTs, " _upTs=", _upTs);
|
||||
_doubleClick = false;
|
||||
_tripleClick = false;
|
||||
_upTs = std.datetime.Clock.currStdTime;
|
||||
}
|
||||
/// returns true if button is currently pressed
|
||||
|
|
@ -860,6 +873,13 @@ class MouseEvent {
|
|||
return buttonDetails.doubleClick;
|
||||
}
|
||||
|
||||
/// Returns true for ButtonDown event when button is pressed third time in short interval after pressing first time
|
||||
@property bool tripleClick() {
|
||||
if (_action != MouseAction.ButtonDown)
|
||||
return false;
|
||||
return buttonDetails.tripleClick;
|
||||
}
|
||||
|
||||
/// get event tracking widget to override
|
||||
@property Widget trackingWidget() { return _trackingWidget; }
|
||||
/// returns mouse button tracking flag
|
||||
|
|
|
|||
|
|
@ -1116,6 +1116,23 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
|
|||
}
|
||||
}
|
||||
|
||||
protected void selectLineByMouse(int x, int y, bool onSameLineOnly = true) {
|
||||
TextPosition oldCaretPos = _caretPos;
|
||||
TextPosition newPos = clientToTextPos(Point(x,y));
|
||||
if (onSameLineOnly && newPos.line != oldCaretPos.line)
|
||||
return; // different lines
|
||||
TextRange r = content.lineRange(newPos.line);
|
||||
if (r.start < r.end) {
|
||||
_selectionRange = r;
|
||||
_caretPos = r.end;
|
||||
invalidate();
|
||||
requestActionsUpdate();
|
||||
} else {
|
||||
_caretPos = newPos;
|
||||
updateSelectionAfterCursorMovement(oldCaretPos, false);
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateCaretPositionByMouse(int x, int y, bool selecting) {
|
||||
TextPosition oldCaretPos = _caretPos;
|
||||
TextPosition newPos = clientToTextPos(Point(x,y));
|
||||
|
|
@ -1709,7 +1726,9 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction
|
|||
setFocus();
|
||||
startCaretBlinking();
|
||||
cancelHoverTimer();
|
||||
if (event.doubleClick) {
|
||||
if (event.tripleClick) {
|
||||
selectLineByMouse(event.x - _clientRect.left, event.y - _clientRect.top);
|
||||
} else if (event.doubleClick) {
|
||||
selectWordByMouse(event.x - _clientRect.left, event.y - _clientRect.top);
|
||||
} else {
|
||||
auto doSelect = cast(bool)(event.keyFlags & MouseFlag.Shift);
|
||||
|
|
|
|||
Loading…
Reference in New Issue