diff --git a/src/pyj/read_book/iframe.pyj b/src/pyj/read_book/iframe.pyj index d019d372b6..e5f014f2f5 100644 --- a/src/pyj/read_book/iframe.pyj +++ b/src/pyj/read_book/iframe.pyj @@ -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_): diff --git a/src/pyj/read_book/selection_bar.pyj b/src/pyj/read_book/selection_bar.pyj index aece659dc9..8ea488023b 100644 --- a/src/pyj/read_book/selection_bar.pyj +++ b/src/pyj/read_book/selection_bar.pyj @@ -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 diff --git a/src/pyj/select.pyj b/src/pyj/select.pyj index bb83045145..6c296555aa 100644 --- a/src/pyj/select.pyj +++ b/src/pyj/select.pyj @@ -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 - r = sel.getRangeAt(0) - if extents.start.onscreen: - start = range_from_point(extents.start.x, extents.start.y) + newr = range_from_point(pos.x, pos.y) + if newr: + r = sel.getRangeAt(0) 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)