mirror of
https://github.com/zyedidia/micro.git
synced 2026-03-29 22:27:13 +09:00
Detect double and triple clicks
This commit is contained in:
@@ -90,6 +90,25 @@ func (c *Cursor) GetSelection() string {
|
|||||||
return string([]rune(c.v.buf.text)[c.selectionStart : c.selectionEnd+1])
|
return string([]rune(c.v.buf.text)[c.selectionStart : c.selectionEnd+1])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SelectLine selects the current line
|
||||||
|
func (c *Cursor) SelectLine() {
|
||||||
|
c.Start()
|
||||||
|
c.selectionStart = c.Loc()
|
||||||
|
c.End()
|
||||||
|
c.selectionEnd = c.Loc()
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddLineToSelection adds the current line to the selection
|
||||||
|
func (c *Cursor) AddLineToSelection() {
|
||||||
|
if c.loc < c.selectionStart {
|
||||||
|
c.Start()
|
||||||
|
c.selectionStart = c.Loc()
|
||||||
|
} else if c.loc > c.selectionEnd {
|
||||||
|
c.End()
|
||||||
|
c.selectionEnd = c.Loc()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// RuneUnder returns the rune under the cursor
|
// RuneUnder returns the rune under the cursor
|
||||||
func (c *Cursor) RuneUnder() rune {
|
func (c *Cursor) RuneUnder() rune {
|
||||||
line := c.v.buf.lines[c.y]
|
line := c.v.buf.lines[c.y]
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
synLinesUp = 75 // How many lines up to look to do syntax highlighting
|
synLinesUp = 75 // How many lines up to look to do syntax highlighting
|
||||||
synLinesDown = 75 // How many lines down to look to do syntax highlighting
|
synLinesDown = 75 // How many lines down to look to do syntax highlighting
|
||||||
|
doubleClickThreshold = 400 // How many milliseconds to wait before a second click is not a double click
|
||||||
)
|
)
|
||||||
|
|
||||||
// The main screen
|
// The main screen
|
||||||
|
|||||||
52
src/view.go
52
src/view.go
@@ -6,6 +6,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// The View struct stores information about a view into a buffer.
|
// The View struct stores information about a view into a buffer.
|
||||||
@@ -44,6 +45,17 @@ type View struct {
|
|||||||
// mouse release events
|
// mouse release events
|
||||||
mouseReleased bool
|
mouseReleased bool
|
||||||
|
|
||||||
|
// This stores when the last click was
|
||||||
|
// This is useful for detecting double and triple clicks
|
||||||
|
lastClickTime time.Time
|
||||||
|
|
||||||
|
// Was the last mouse event actually a double click?
|
||||||
|
// Useful for detecting triple clicks -- if a double click is detected
|
||||||
|
// but the last mouse event was actually a double click, it's a triple click
|
||||||
|
doubleClick bool
|
||||||
|
// Same here, just to keep track for mouse move events
|
||||||
|
tripleClick bool
|
||||||
|
|
||||||
// Syntax highlighting matches
|
// Syntax highlighting matches
|
||||||
matches SyntaxMatches
|
matches SyntaxMatches
|
||||||
// The matches from the last frame
|
// The matches from the last frame
|
||||||
@@ -90,6 +102,7 @@ func NewViewWidthHeight(buf *Buffer, w, h int) *View {
|
|||||||
// Set mouseReleased to true because we assume the mouse is not being pressed when
|
// Set mouseReleased to true because we assume the mouse is not being pressed when
|
||||||
// the editor is opened
|
// the editor is opened
|
||||||
v.mouseReleased = true
|
v.mouseReleased = true
|
||||||
|
v.lastClickTime = time.Time{}
|
||||||
|
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
@@ -432,14 +445,47 @@ func (v *View) HandleEvent(event tcell.Event) {
|
|||||||
switch button {
|
switch button {
|
||||||
case tcell.Button1:
|
case tcell.Button1:
|
||||||
// Left click
|
// Left click
|
||||||
|
origX, origY := v.cursor.x, v.cursor.y
|
||||||
v.MoveToMouseClick(x, y)
|
v.MoveToMouseClick(x, y)
|
||||||
|
|
||||||
loc := v.cursor.Loc()
|
|
||||||
if v.mouseReleased {
|
if v.mouseReleased {
|
||||||
v.cursor.selectionStart = loc
|
if (time.Since(v.lastClickTime)/time.Millisecond < doubleClickThreshold) &&
|
||||||
|
(origX == v.cursor.x && origY == v.cursor.y) {
|
||||||
|
if v.doubleClick {
|
||||||
|
// Triple click
|
||||||
|
v.lastClickTime = time.Now()
|
||||||
|
v.tripleClick = true
|
||||||
|
v.doubleClick = false
|
||||||
|
messenger.Error("Triple click")
|
||||||
|
v.cursor.SelectLine()
|
||||||
|
} else {
|
||||||
|
// Double click
|
||||||
|
v.doubleClick = true
|
||||||
|
v.tripleClick = false
|
||||||
|
v.lastClickTime = time.Now()
|
||||||
|
messenger.Error("Double click")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
messenger.Error("Single click")
|
||||||
|
v.doubleClick = false
|
||||||
|
v.tripleClick = false
|
||||||
|
v.lastClickTime = time.Now()
|
||||||
|
|
||||||
|
loc := v.cursor.Loc()
|
||||||
|
v.cursor.selectionStart = loc
|
||||||
|
v.cursor.selectionEnd = loc
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if v.tripleClick {
|
||||||
|
v.cursor.AddLineToSelection()
|
||||||
|
} else if v.doubleClick {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
v.cursor.selectionEnd = v.cursor.Loc()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
v.cursor.selectionEnd = loc
|
|
||||||
v.mouseReleased = false
|
v.mouseReleased = false
|
||||||
|
|
||||||
case tcell.ButtonNone:
|
case tcell.ButtonNone:
|
||||||
// Mouse event with no click
|
// Mouse event with no click
|
||||||
if !v.mouseReleased {
|
if !v.mouseReleased {
|
||||||
|
|||||||
Reference in New Issue
Block a user