mirror of
https://github.com/koreader/koreader
synced 2024-10-31 21:20:20 +00:00
CRE multipage text selection: mirror corners when inverse_reading_order (#5751)
This commit is contained in:
parent
fa765f1b00
commit
acfc8c0440
@ -598,19 +598,29 @@ function ReaderHighlight:onHoldPan(_, ges)
|
|||||||
-- With CreDocuments, allow text selection across multiple pages
|
-- With CreDocuments, allow text selection across multiple pages
|
||||||
-- by (temporarily) switching to scroll mode when panning to the
|
-- by (temporarily) switching to scroll mode when panning to the
|
||||||
-- top left or bottom right corners.
|
-- top left or bottom right corners.
|
||||||
local is_in_top_left_corner = self.holdpan_pos.y < 1/8*Screen:getHeight()
|
local mirrored_reading = BD.mirroredUILayout()
|
||||||
and self.holdpan_pos.x < 1/8*Screen:getWidth()
|
if self.ui.rolling and self.ui.rolling.inverse_reading_order then
|
||||||
local is_in_bottom_right_corner = self.holdpan_pos.y > 7/8*Screen:getHeight()
|
mirrored_reading = not mirrored_reading
|
||||||
and self.holdpan_pos.x > 7/8*Screen:getWidth()
|
end
|
||||||
if BD.mirroredUILayout() then
|
local is_in_prev_page_corner, is_in_next_page_corner
|
||||||
|
if mirrored_reading then
|
||||||
-- Note: this might not be really usable, as crengine native selection
|
-- Note: this might not be really usable, as crengine native selection
|
||||||
-- is not adapted to RTL text
|
-- is not adapted to RTL text
|
||||||
is_in_top_left_corner = self.holdpan_pos.y < 1/8*Screen:getHeight()
|
-- top right corner
|
||||||
|
is_in_prev_page_corner = self.holdpan_pos.y < 1/8*Screen:getHeight()
|
||||||
and self.holdpan_pos.x > 7/8*Screen:getWidth()
|
and self.holdpan_pos.x > 7/8*Screen:getWidth()
|
||||||
is_in_bottom_right_corner = self.holdpan_pos.y > 7/8*Screen:getHeight()
|
-- bottom left corner
|
||||||
|
is_in_next_page_corner = self.holdpan_pos.y > 7/8*Screen:getHeight()
|
||||||
and self.holdpan_pos.x < 1/8*Screen:getWidth()
|
and self.holdpan_pos.x < 1/8*Screen:getWidth()
|
||||||
|
else -- default in LTR UI with no inverse_reading_order
|
||||||
|
-- top left corner
|
||||||
|
is_in_prev_page_corner = self.holdpan_pos.y < 1/8*Screen:getHeight()
|
||||||
|
and self.holdpan_pos.x < 1/8*Screen:getWidth()
|
||||||
|
-- bottom right corner
|
||||||
|
is_in_next_page_corner = self.holdpan_pos.y > 7/8*Screen:getHeight()
|
||||||
|
and self.holdpan_pos.x > 7/8*Screen:getWidth()
|
||||||
end
|
end
|
||||||
if is_in_top_left_corner or is_in_bottom_right_corner then
|
if is_in_prev_page_corner or is_in_next_page_corner then
|
||||||
if self.was_in_some_corner then
|
if self.was_in_some_corner then
|
||||||
-- Do nothing, wait for the user to move his finger out of that corner
|
-- Do nothing, wait for the user to move his finger out of that corner
|
||||||
return true
|
return true
|
||||||
@ -631,7 +641,7 @@ function ReaderHighlight:onHoldPan(_, ges)
|
|||||||
end
|
end
|
||||||
-- (using rolling:onGotoViewRel(1/3) has some strange side effects)
|
-- (using rolling:onGotoViewRel(1/3) has some strange side effects)
|
||||||
local scroll_distance = math.floor(Screen:getHeight() * 1/3)
|
local scroll_distance = math.floor(Screen:getHeight() * 1/3)
|
||||||
local move_y = is_in_bottom_right_corner and scroll_distance or -scroll_distance
|
local move_y = is_in_next_page_corner and scroll_distance or -scroll_distance
|
||||||
self.ui.rolling:_gotoPos(self.ui.document:getCurrentPos() + move_y)
|
self.ui.rolling:_gotoPos(self.ui.document:getCurrentPos() + move_y)
|
||||||
local new_y = self.ui.document:getScreenPositionFromXPointer(self.selected_text_start_xpointer)
|
local new_y = self.ui.document:getScreenPositionFromXPointer(self.selected_text_start_xpointer)
|
||||||
self.hold_pos.y = self.hold_pos.y - orig_y + new_y
|
self.hold_pos.y = self.hold_pos.y - orig_y + new_y
|
||||||
@ -643,6 +653,10 @@ function ReaderHighlight:onHoldPan(_, ges)
|
|||||||
-- Unlike in 1-page mode, we have a limitation here: we can't adjust
|
-- Unlike in 1-page mode, we have a limitation here: we can't adjust
|
||||||
-- the selection to further than current page and prev/next one.
|
-- the selection to further than current page and prev/next one.
|
||||||
-- So don't handle another corner if we already handled one:
|
-- So don't handle another corner if we already handled one:
|
||||||
|
-- Note that this feature won't work well with the RTL UI or
|
||||||
|
-- if inverse_reading_order as crengine currently always displays
|
||||||
|
-- the first page on the left and the second on the right in
|
||||||
|
-- dual page mode.
|
||||||
if self.restore_page_mode_func then
|
if self.restore_page_mode_func then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
@ -650,9 +664,9 @@ function ReaderHighlight:onHoldPan(_, ges)
|
|||||||
-- so if we started on the right page, ignore top left corner,
|
-- so if we started on the right page, ignore top left corner,
|
||||||
-- and if we started on the left page, ignore bottom right corner.
|
-- and if we started on the left page, ignore bottom right corner.
|
||||||
local screen_half_width = math.floor(Screen:getWidth() * 1/2)
|
local screen_half_width = math.floor(Screen:getWidth() * 1/2)
|
||||||
if self.hold_pos.x >= screen_half_width and is_in_top_left_corner then
|
if self.hold_pos.x >= screen_half_width and is_in_prev_page_corner then
|
||||||
return true
|
return true
|
||||||
elseif self.hold_pos.x <= screen_half_width and is_in_bottom_right_corner then
|
elseif self.hold_pos.x <= screen_half_width and is_in_next_page_corner then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
local cur_page = self.ui.document:getCurrentPage()
|
local cur_page = self.ui.document:getCurrentPage()
|
||||||
@ -660,10 +674,10 @@ function ReaderHighlight:onHoldPan(_, ges)
|
|||||||
self.restore_page_mode_func = function()
|
self.restore_page_mode_func = function()
|
||||||
self.ui.rolling:onGotoXPointer(restore_page_mode_xpointer, self.selected_text_start_xpointer)
|
self.ui.rolling:onGotoXPointer(restore_page_mode_xpointer, self.selected_text_start_xpointer)
|
||||||
end
|
end
|
||||||
if is_in_bottom_right_corner then
|
if is_in_next_page_corner then -- bottom right corner in LTR UI
|
||||||
self.ui.rolling:_gotoPage(cur_page + 1, true) -- no odd left page enforcement
|
self.ui.rolling:_gotoPage(cur_page + 1, true) -- no odd left page enforcement
|
||||||
self.hold_pos.x = self.hold_pos.x - screen_half_width
|
self.hold_pos.x = self.hold_pos.x - screen_half_width
|
||||||
else
|
else -- top left corner in RTL UI
|
||||||
self.ui.rolling:_gotoPage(cur_page - 1, true) -- no odd left page enforcement
|
self.ui.rolling:_gotoPage(cur_page - 1, true) -- no odd left page enforcement
|
||||||
self.hold_pos.x = self.hold_pos.x + screen_half_width
|
self.hold_pos.x = self.hold_pos.x + screen_half_width
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user