mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-05 08:40:13 -04:00
Update selection as handles are dragged
This commit is contained in:
parent
611f609f43
commit
9323019776
@ -44,6 +44,7 @@ class CreateAnnotation:
|
|||||||
def __init__(self, view):
|
def __init__(self, view):
|
||||||
self.view = view
|
self.view = view
|
||||||
self.state = WAITING_FOR_CLICK
|
self.state = WAITING_FOR_CLICK
|
||||||
|
self.left_line_height = self.right_line_height = 8
|
||||||
container = self.container
|
container = self.container
|
||||||
self.position_in_handle = {'x': 0, 'y': 0}
|
self.position_in_handle = {'x': 0, 'y': 0}
|
||||||
|
|
||||||
@ -64,7 +65,7 @@ class CreateAnnotation:
|
|||||||
ev.stopPropagation(), ev.preventDefault()
|
ev.stopPropagation(), ev.preventDefault()
|
||||||
if self.state is WAITING_FOR_CLICK:
|
if self.state is WAITING_FOR_CLICK:
|
||||||
pt = map_to_iframe_coords({'x': ev.clientX, 'y': ev.clientY})
|
pt = map_to_iframe_coords({'x': ev.clientX, 'y': ev.clientY})
|
||||||
self.send_message(type='position-handles-at-point', x=pt.x, y=pt.y)
|
self.send_message('position-handles-at-point', x=pt.x, y=pt.y)
|
||||||
|
|
||||||
def mousedown_on_handle(self, ev):
|
def mousedown_on_handle(self, ev):
|
||||||
ev.stopPropagation(), ev.preventDefault()
|
ev.stopPropagation(), ev.preventDefault()
|
||||||
@ -94,6 +95,10 @@ class CreateAnnotation:
|
|||||||
s = handle.style
|
s = handle.style
|
||||||
s.left = (ev.clientX - self.position_in_handle.x) + 'px'
|
s.left = (ev.clientX - self.position_in_handle.x) + 'px'
|
||||||
s.top = (ev.clientY - self.position_in_handle.y) + 'px'
|
s.top = (ev.clientY - self.position_in_handle.y) + 'px'
|
||||||
|
pos = self.current_handle_position
|
||||||
|
pos.start = map_to_iframe_coords(pos.start)
|
||||||
|
pos.end = map_to_iframe_coords(pos.end)
|
||||||
|
self.send_message('set-selection', extents=pos)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def container(self):
|
def container(self):
|
||||||
@ -111,14 +116,22 @@ class CreateAnnotation:
|
|||||||
def is_visible(self):
|
def is_visible(self):
|
||||||
return self.container.style.display is not 'none'
|
return self.container.style.display is not 'none'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def current_handle_position(self):
|
||||||
|
lh, rh = self.left_handle.getBoundingClientRect(), self.right_handle.getBoundingClientRect()
|
||||||
|
return {
|
||||||
|
'start': {'x': Math.round(lh.right), 'y': Math.round(lh.bottom - self.left_line_height // 2)},
|
||||||
|
'end': {'x': Math.round(rh.left), 'y': Math.round(rh.bottom - self.right_line_height // 2)}
|
||||||
|
}
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
self.container.style.display = 'block'
|
self.container.style.display = 'block'
|
||||||
|
|
||||||
def hide(self):
|
def hide(self):
|
||||||
self.container.style.display = 'none'
|
self.container.style.display = 'none'
|
||||||
|
|
||||||
def send_message(self, **kw):
|
def send_message(self, type, **kw):
|
||||||
self.view.iframe_wrapper.send_message('annotations', **kw)
|
self.view.iframe_wrapper.send_message('annotations', type=type, **kw)
|
||||||
|
|
||||||
def handle_message(self, msg):
|
def handle_message(self, msg):
|
||||||
if msg.type is 'create-annotation':
|
if msg.type is 'create-annotation':
|
||||||
@ -160,3 +173,5 @@ class CreateAnnotation:
|
|||||||
style, width = do_it(rh, extents.end)
|
style, width = do_it(rh, extents.end)
|
||||||
style.left = extents.end.x + 'px'
|
style.left = extents.end.x + 'px'
|
||||||
self.state = WAITING_FOR_DRAG
|
self.state = WAITING_FOR_DRAG
|
||||||
|
self.left_line_height = extents.start.height
|
||||||
|
self.right_line_height = extents.end.height
|
||||||
|
@ -4,7 +4,9 @@ from __python__ import bound_methods, hash_literals
|
|||||||
|
|
||||||
import traceback
|
import traceback
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
from select import selection_extents, selection_extents_at_point
|
from select import (
|
||||||
|
selection_extents, selection_extents_at_point, set_selections_extents_to
|
||||||
|
)
|
||||||
|
|
||||||
from fs_images import fix_fullscreen_svg_images
|
from fs_images import fix_fullscreen_svg_images
|
||||||
from iframe_comm import IframeClient
|
from iframe_comm import IframeClient
|
||||||
@ -611,7 +613,9 @@ class IframeBoss:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def annotations_msg_received(self, data):
|
def annotations_msg_received(self, data):
|
||||||
if data.type is 'position-handles-at-point':
|
if data.type is 'set-selection':
|
||||||
|
set_selections_extents_to(data.extents)
|
||||||
|
elif data.type is 'position-handles-at-point':
|
||||||
self.send_message(
|
self.send_message(
|
||||||
'annotations',
|
'annotations',
|
||||||
type='position-handles',
|
type='position-handles',
|
||||||
|
@ -90,3 +90,16 @@ def selection_extents_at_point(x, y):
|
|||||||
ans.start.x = x
|
ans.start.x = x
|
||||||
ans.end.x = x + ans.start.height * 3
|
ans.end.x = x + ans.start.height * 3
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
def set_selections_extents_to(extents):
|
||||||
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user