Simply adjusting selection on handle move

Also re-enable drag scrollign with handles though it does not really
work yet
This commit is contained in:
Kovid Goyal 2020-08-08 22:48:00 +05:30
parent 1e24b66dad
commit 1911ec41b4
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 22 additions and 30 deletions

View File

@ -4,7 +4,7 @@ from __python__ import bound_methods, hash_literals
import traceback
from gettext import gettext as _
from select import selection_extents, set_selections_extents_to, word_at_point
from select import selection_extents, move_end_of_selection, word_at_point
from fs_images import fix_fullscreen_svg_images
from iframe_comm import IframeClient
@ -722,8 +722,8 @@ class IframeBoss:
end_reference_mode()
def annotations_msg_received(self, data):
if data.type is 'set-selection':
set_selections_extents_to(data.extents)
if data.type is 'move-end-of-selection':
move_end_of_selection(data.pos, data.start)
elif data.type is 'set-highlight-style':
set_selection_style(data.style)
elif data.type is 'trigger-shortcut':
@ -734,6 +734,8 @@ class IframeBoss:
end_node, end_offset = sel.focusNode, sel.focusOffset
sel.modify('extend', 'backward', 'paragraphboundary')
sel.setBaseAndExtent(sel.focusNode, sel.focusOffset, end_node, end_offset)
elif data.type is 'drag-scroll':
self.scroll_to_extend_annotation(data.backwards)
elif data.type is 'edit-highlight':
crw_ = {v: k for k, v in Object.entries(annot_id_uuid_map)}[data.uuid]
if crw_ and select_crw(crw_):

View File

@ -418,7 +418,7 @@ class SelectionBar:
if self.state is not DRAGGING:
return
ev.stopPropagation(), ev.preventDefault()
self.handle_moved(ev)
self.move_handle(ev)
def touchmove_on_container(self, ev):
if self.state is not DRAGGING:
@ -426,19 +426,23 @@ class SelectionBar:
ev.stopPropagation(), ev.preventDefault()
for touch in ev.changedTouches:
if touch.identifier is self.active_touch:
self.handle_moved(touch)
self.move_handle(touch)
return
def handle_moved(self, ev):
def move_handle(self, ev):
handle = document.getElementById(self.dragging_handle)
s = handle.style
s.left = (ev.clientX - self.position_in_handle.x) + 'px'
s.top = (ev.clientY - self.position_in_handle.y) + 'px'
margins = get_margins()
pos = self.current_handle_position
pos.start = map_to_iframe_coords(pos.start, margins)
pos.end = map_to_iframe_coords(pos.end, margins)
self.send_message('set-selection', extents=pos)
if self.dragging_handle is self.left_handle_id:
start = True
position = map_to_iframe_coords(pos.start, margins)
else:
start = False
position = map_to_iframe_coords(pos.end, margins)
self.send_message('move-end-of-selection', start=start, pos=position)
c = self.container
rect = c.getBoundingClientRect()
t = document.getElementById('book-top-margin').offsetHeight

View File

@ -114,28 +114,14 @@ def range_at_limit(invert_x, invert_y):
return r
def set_selections_extents_to(extents):
if extents.start.onscreen and extents.end.onscreen:
start = range_from_point(extents.start.x, extents.start.y)
if start:
end = range_from_point(extents.end.x, extents.end.y)
if end:
r = document.createRange()
r.setStart(start.startContainer, start.startOffset)
r.setEnd(end.startContainer, end.startOffset)
sel = window.getSelection()
sel.removeAllRanges()
sel.addRange(r)
return
def move_end_of_selection(pos, start):
sel = window.getSelection()
if not sel.rangeCount:
return
newr = range_from_point(pos.x, pos.y)
if newr:
r = sel.getRangeAt(0)
if extents.start.onscreen:
start = range_from_point(extents.start.x, extents.start.y)
if start:
r.setStart(start.startContainer, start.startOffset)
if extents.end.onscreen:
end = range_from_point(extents.end.x, extents.end.y)
if end:
r.setEnd(end.startContainer, end.startOffset)
r.setStart(newr.startContainer, newr.startOffset)
else:
r.setEnd(newr.endContainer, newr.endOffset)