Merge pull request #680 from jminor/mouse_selection_snapping
Fixed regression in mouse selection behavior
This commit is contained in:
commit
b2940d6dc0
|
@ -82,13 +82,13 @@ local function split_cursor(direction)
|
||||||
core.blink_reset()
|
core.blink_reset()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function set_cursor(x, y, type)
|
local function set_cursor(x, y, snap_type)
|
||||||
local line, col = dv():resolve_screen_position(x, y)
|
local line, col = dv():resolve_screen_position(x, y)
|
||||||
doc():set_selection(line, col, line, col)
|
doc():set_selection(line, col, line, col)
|
||||||
if type == "word" or type == "lines" then
|
if snap_type == "word" or snap_type == "lines" then
|
||||||
command.perform("doc:select-" .. type)
|
command.perform("doc:select-" .. snap_type)
|
||||||
end
|
end
|
||||||
dv().mouse_selecting = { line, col }
|
dv().mouse_selecting = { line, col, snap_type }
|
||||||
core.blink_reset()
|
core.blink_reset()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -402,7 +402,7 @@ local commands = {
|
||||||
["doc:select-to-cursor"] = function(x, y, clicks)
|
["doc:select-to-cursor"] = function(x, y, clicks)
|
||||||
local line1, col1 = select(3, doc():get_selection())
|
local line1, col1 = select(3, doc():get_selection())
|
||||||
local line2, col2 = dv():resolve_screen_position(x, y)
|
local line2, col2 = dv():resolve_screen_position(x, y)
|
||||||
dv().mouse_selecting = { line1, col1 }
|
dv().mouse_selecting = { line1, col1, nil }
|
||||||
doc():set_selection(line2, col2, line1, col1)
|
doc():set_selection(line2, col2, line1, col1)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,7 @@ function DocView:scroll_to_make_visible(line, col)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function DocView:on_mouse_moved(x, y, ...)
|
function DocView:on_mouse_moved(x, y, ...)
|
||||||
DocView.super.on_mouse_moved(self, x, y, ...)
|
DocView.super.on_mouse_moved(self, x, y, ...)
|
||||||
|
|
||||||
|
@ -235,7 +236,7 @@ function DocView:on_mouse_moved(x, y, ...)
|
||||||
|
|
||||||
if self.mouse_selecting then
|
if self.mouse_selecting then
|
||||||
local l1, c1 = self:resolve_screen_position(x, y)
|
local l1, c1 = self:resolve_screen_position(x, y)
|
||||||
local l2, c2 = table.unpack(self.mouse_selecting)
|
local l2, c2, snap_type = table.unpack(self.mouse_selecting)
|
||||||
if keymap.modkeys["ctrl"] then
|
if keymap.modkeys["ctrl"] then
|
||||||
if l1 > l2 then l1, l2 = l2, l1 end
|
if l1 > l2 then l1, l2 = l2, l1 end
|
||||||
self.doc.selections = { }
|
self.doc.selections = { }
|
||||||
|
@ -243,12 +244,33 @@ function DocView:on_mouse_moved(x, y, ...)
|
||||||
self.doc:set_selections(i - l1 + 1, i, math.min(c1, #self.doc.lines[i]), i, math.min(c2, #self.doc.lines[i]))
|
self.doc:set_selections(i - l1 + 1, i, math.min(c1, #self.doc.lines[i]), i, math.min(c2, #self.doc.lines[i]))
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
if snap_type then
|
||||||
|
l1, c1, l2, c2 = self:mouse_selection(self.doc, snap_type, l1, c1, l2, c2)
|
||||||
|
end
|
||||||
self.doc:set_selection(l1, c1, l2, c2)
|
self.doc:set_selection(l1, c1, l2, c2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function DocView:mouse_selection(doc, snap_type, line1, col1, line2, col2)
|
||||||
|
local swap = line2 < line1 or line2 == line1 and col2 <= col1
|
||||||
|
if swap then
|
||||||
|
line1, col1, line2, col2 = line2, col2, line1, col1
|
||||||
|
end
|
||||||
|
if snap_type == "word" then
|
||||||
|
line1, col1 = translate.start_of_word(doc, line1, col1)
|
||||||
|
line2, col2 = translate.end_of_word(doc, line2, col2)
|
||||||
|
elseif snap_type == "lines" then
|
||||||
|
col1, col2 = 1, math.huge
|
||||||
|
end
|
||||||
|
if swap then
|
||||||
|
return line2, col2, line1, col1
|
||||||
|
end
|
||||||
|
return line1, col1, line2, col2
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
function DocView:on_mouse_released(button)
|
function DocView:on_mouse_released(button)
|
||||||
DocView.super.on_mouse_released(self, button)
|
DocView.super.on_mouse_released(self, button)
|
||||||
self.mouse_selecting = nil
|
self.mouse_selecting = nil
|
||||||
|
|
Loading…
Reference in New Issue