mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-11 09:13:57 -04:00
Implement scrolling keyboard shortcuts when selection bar is showing
Also remove unused code
This commit is contained in:
parent
f6aa53e602
commit
83490b316f
@ -153,21 +153,6 @@ def reset_highlight_counter():
|
|||||||
wrapper_counter = 0
|
wrapper_counter = 0
|
||||||
|
|
||||||
|
|
||||||
def set_selection_to_highlight():
|
|
||||||
sel = window.getSelection()
|
|
||||||
if not sel or not sel.rangeCount:
|
|
||||||
return
|
|
||||||
r = sel.getRangeAt(0)
|
|
||||||
crw = None
|
|
||||||
for node in text_nodes_in_range(r):
|
|
||||||
crw = node.parentNode.dataset.calibreRangeWrapper
|
|
||||||
if crw:
|
|
||||||
break
|
|
||||||
if crw:
|
|
||||||
select_crw(crw)
|
|
||||||
return crw or None
|
|
||||||
|
|
||||||
|
|
||||||
def get_annot_id_for(node, offset, annot_id_uuid_map):
|
def get_annot_id_for(node, offset, annot_id_uuid_map):
|
||||||
|
|
||||||
if not node:
|
if not node:
|
||||||
|
@ -4,16 +4,13 @@ from __python__ import bound_methods, hash_literals
|
|||||||
|
|
||||||
import traceback
|
import traceback
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
from select import (
|
from select import selection_extents, set_selections_extents_to, word_at_point
|
||||||
extend_selection_to_limit, selection_extents, selection_extents_at_point,
|
|
||||||
set_selections_extents_to, word_at_point
|
|
||||||
)
|
|
||||||
|
|
||||||
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
|
||||||
from range_utils import (
|
from range_utils import (
|
||||||
highlight_associated_with_selection, reset_highlight_counter, select_crw,
|
highlight_associated_with_selection, reset_highlight_counter, select_crw,
|
||||||
set_selection_to_highlight, unwrap_all_crw, unwrap_crw, wrap_text_in_range
|
unwrap_all_crw, unwrap_crw, wrap_text_in_range
|
||||||
)
|
)
|
||||||
from read_book.cfi import (
|
from read_book.cfi import (
|
||||||
cfi_for_selection, range_from_cfi, scroll_to as scroll_to_cfi
|
cfi_for_selection, range_from_cfi, scroll_to as scroll_to_cfi
|
||||||
@ -711,37 +708,12 @@ class IframeBoss:
|
|||||||
end_reference_mode()
|
end_reference_mode()
|
||||||
|
|
||||||
def annotations_msg_received(self, data):
|
def annotations_msg_received(self, data):
|
||||||
in_flow_mode = current_layout_mode() is 'flow'
|
|
||||||
if data.type is 'set-selection':
|
if data.type is 'set-selection':
|
||||||
set_selections_extents_to(data.extents)
|
set_selections_extents_to(data.extents)
|
||||||
elif data.type is 'position-handles-at-point':
|
|
||||||
extents = selection_extents_at_point(data.x, data.y, in_flow_mode)
|
|
||||||
annot_id = set_selection_to_highlight()
|
|
||||||
if annot_id:
|
|
||||||
extents = selection_extents(in_flow_mode)
|
|
||||||
self.send_message(
|
|
||||||
'annotations', type='position-handles', extents=extents, existing=annot_id_uuid_map[annot_id])
|
|
||||||
elif data.type is 'drag-scroll':
|
|
||||||
if self.scroll_to_extend_annotation(data.backwards):
|
|
||||||
if data.extend_selection:
|
|
||||||
extend_selection_to_limit(data.handle is 'left', data.backwards)
|
|
||||||
extents = selection_extents(in_flow_mode)
|
|
||||||
self.send_message(
|
|
||||||
'annotations', type='scrolled',
|
|
||||||
backwards=data.backwards, handle=data.handle, extents=extents, extended=data.extend_selection
|
|
||||||
)
|
|
||||||
elif data.type is 'paged-scroll':
|
|
||||||
if self.scroll_to_extend_annotation(data.backwards, False, True):
|
|
||||||
extents = selection_extents(in_flow_mode)
|
|
||||||
self.send_message(
|
|
||||||
'annotations', type='scrolled', backwards=data.backwards, handle=None,
|
|
||||||
extents=extents, extended=False
|
|
||||||
)
|
|
||||||
elif data.type is 'perp-scroll':
|
|
||||||
if in_flow_mode and flow_annotation_scroll(data.backwards, True):
|
|
||||||
self.send_message('annotations', type='update-handles', extents=selection_extents(in_flow_mode))
|
|
||||||
elif data.type is 'set-highlight-style':
|
elif data.type is 'set-highlight-style':
|
||||||
set_selection_style(data.style)
|
set_selection_style(data.style)
|
||||||
|
elif data.type is 'trigger-shortcut':
|
||||||
|
self.on_handle_navigation_shortcut(data)
|
||||||
elif data.type is 'edit-highlight':
|
elif data.type is 'edit-highlight':
|
||||||
crw_ = {v: k for k, v in Object.entries(annot_id_uuid_map)}[data.uuid]
|
crw_ = {v: k for k, v in Object.entries(annot_id_uuid_map)}[data.uuid]
|
||||||
if crw_ and select_crw(crw_):
|
if crw_ and select_crw(crw_):
|
||||||
|
@ -12,6 +12,7 @@ from dom import clear, svgicon, unique_id
|
|||||||
from modals import error_dialog, question_dialog
|
from modals import error_dialog, question_dialog
|
||||||
from read_book.globals import runtime, ui_operations
|
from read_book.globals import runtime, ui_operations
|
||||||
from read_book.highlights import ICON_SIZE, EditNotesAndColors, HighlightStyle
|
from read_book.highlights import ICON_SIZE, EditNotesAndColors, HighlightStyle
|
||||||
|
from read_book.shortcuts import shortcut_for_key_event
|
||||||
|
|
||||||
DRAG_SCROLL_ZONE_MIN_HEIGHT = 10
|
DRAG_SCROLL_ZONE_MIN_HEIGHT = 10
|
||||||
|
|
||||||
@ -223,7 +224,8 @@ class SelectionBar:
|
|||||||
container.addEventListener('touchmove', self.touchmove_on_container, {'passive': False})
|
container.addEventListener('touchmove', self.touchmove_on_container, {'passive': False})
|
||||||
container.addEventListener('touchend', self.touchend_on_container, {'passive': False})
|
container.addEventListener('touchend', self.touchend_on_container, {'passive': False})
|
||||||
container.addEventListener('touchcancel', self.touchend_on_container, {'passive': False})
|
container.addEventListener('touchcancel', self.touchend_on_container, {'passive': False})
|
||||||
container.addEventListener('keydown', self.on_keydown, {'passive': False}) # TODO: Implement this
|
container.addEventListener('keydown', self.on_keydown, {'passive': False})
|
||||||
|
container.setAttribute('tabindex', '0')
|
||||||
|
|
||||||
self.dragging_handle = None
|
self.dragging_handle = None
|
||||||
self.position_in_handle = {'x': 0, 'y': 0}
|
self.position_in_handle = {'x': 0, 'y': 0}
|
||||||
@ -462,6 +464,17 @@ class SelectionBar:
|
|||||||
self.active_touch = None
|
self.active_touch = None
|
||||||
self.end_handle_drag()
|
self.end_handle_drag()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def on_keydown(self, ev):
|
||||||
|
ev.stopPropagation(), ev.preventDefault()
|
||||||
|
if ev.key is 'Escape':
|
||||||
|
self.clear_selection()
|
||||||
|
return
|
||||||
|
sc_name = shortcut_for_key_event(ev, self.view.keyboard_shortcut_map)
|
||||||
|
if sc_name is 'show_chrome':
|
||||||
|
self.clear_selection()
|
||||||
|
elif sc_name in ('up', 'down', 'pageup', 'pagedown', 'left', 'right'):
|
||||||
|
self.send_message('trigger-shortcut', name=sc_name)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
# drag scroll {{{
|
# drag scroll {{{
|
||||||
@ -499,6 +512,7 @@ class SelectionBar:
|
|||||||
def hide(self):
|
def hide(self):
|
||||||
self.state = HIDDEN
|
self.state = HIDDEN
|
||||||
self.container.style.display = 'none'
|
self.container.style.display = 'none'
|
||||||
|
self.view.focus_iframe()
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
sd = get_session_data()
|
sd = get_session_data()
|
||||||
@ -506,6 +520,7 @@ class SelectionBar:
|
|||||||
if sd.get('show_selection_bar'):
|
if sd.get('show_selection_bar'):
|
||||||
self.container.style.display = 'block'
|
self.container.style.display = 'block'
|
||||||
self.state = WAITING
|
self.state = WAITING
|
||||||
|
self.container.focus()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_visible(self):
|
def is_visible(self):
|
||||||
|
@ -107,23 +107,6 @@ def selection_extents(in_flow_mode, end_must_be_focus):
|
|||||||
return range_extents(start, end, in_flow_mode)
|
return range_extents(start, end, in_flow_mode)
|
||||||
|
|
||||||
|
|
||||||
def selection_extents_at_point(x, y, in_flow_mode):
|
|
||||||
r = word_at_point(x, y)
|
|
||||||
if r:
|
|
||||||
sel = window.getSelection()
|
|
||||||
sel.removeAllRanges()
|
|
||||||
sel.addRange(r)
|
|
||||||
return selection_extents(r, r)
|
|
||||||
ans = empty_range_extents()
|
|
||||||
ans.start.y = ans.end.y = y
|
|
||||||
ans.start.height = ans.end.height = parseInt(window.getComputedStyle(document.body).fontSize) + 4
|
|
||||||
ans.start.x = x
|
|
||||||
ans.end.x = x + ans.start.height * 3
|
|
||||||
ans.start.onscreen = ans.end.onscreen = True
|
|
||||||
ans.start.is_empty = ans.end.is_empty = False
|
|
||||||
return ans
|
|
||||||
|
|
||||||
|
|
||||||
def range_at_limit(invert_x, invert_y):
|
def range_at_limit(invert_x, invert_y):
|
||||||
step = 10
|
step = 10
|
||||||
for y in range(0, window.innerHeight + step, step):
|
for y in range(0, window.innerHeight + step, step):
|
||||||
@ -137,21 +120,6 @@ def range_at_limit(invert_x, invert_y):
|
|||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
def extend_selection_to_limit(left, top):
|
|
||||||
sel = window.getSelection()
|
|
||||||
if not sel or not sel.rangeCount or sel.isCollapsed:
|
|
||||||
return False
|
|
||||||
new_limit = range_at_limit(not left, not top)
|
|
||||||
if not new_limit:
|
|
||||||
return False
|
|
||||||
r = sel.getRangeAt(0)
|
|
||||||
if left:
|
|
||||||
r.setStart(new_limit.startContainer, new_limit.startOffset)
|
|
||||||
else:
|
|
||||||
r.setEnd(new_limit.startContainer, new_limit.startOffset)
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def set_selections_extents_to(extents):
|
def set_selections_extents_to(extents):
|
||||||
if extents.start.onscreen and extents.end.onscreen:
|
if extents.start.onscreen and extents.end.onscreen:
|
||||||
start = range_from_point(extents.start.x, extents.start.y)
|
start = range_from_point(extents.start.x, extents.start.y)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user