Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add color highlight menu #11044

Draft
wants to merge 28 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5e4a437
Add color highlight menu
smasher816 Oct 26, 2023
a6c6b49
LuaCheck'ed
NiLuJe Jan 21, 2024
45cc8b6
Honor the ligthen_factor with colors
NiLuJe Jan 21, 2024
bc3aeab
Random 7AM idea is random
NiLuJe Jan 21, 2024
a022915
More random musings
NiLuJe Jan 21, 2024
9bf0e4e
I can word good now!
NiLuJe Jan 21, 2024
d971a14
This moved to base
NiLuJe Jan 21, 2024
2d9e734
As we effectiuvely only have a single call site for those,
NiLuJe Jan 21, 2024
6e6e9fc
Finally took the opportunity to fix a 10 year old TODO about the
NiLuJe Jan 21, 2024
a158148
Mkay, i'm going to assume the MUL vs. OVER comes from MuPDF...
NiLuJe Jan 21, 2024
0e403a1
Unbreak darkenRect
NiLuJe Jan 22, 2024
bf56868
Drop redudant saveSetting calls
NiLuJe Jan 22, 2024
1d9fd2f
Slightly less awful color highlights in sw nm
NiLuJe Jan 22, 2024
bbb2d9d
Hmm, pretty colors.
NiLuJe Jan 22, 2024
c7a6cf5
Restore colorful bg support in textBoxWidget
NiLuJe Jan 22, 2024
c84de40
Cache the type check
NiLuJe Jan 22, 2024
ed6859d
Add cyan, and make blue actually blue.
NiLuJe Jan 22, 2024
fbde4ed
More logical color order
NiLuJe Jan 22, 2024
8e1a97a
This is always set, no need for a runtime fallback
NiLuJe Jan 22, 2024
32f3fbe
TextBoxWidget: Eh, handle color fgs, too.
NiLuJe Jan 22, 2024
7ba3226
Make Gray our actual legacy grayscale highlights (i.e., it'll follow the
NiLuJe Jan 22, 2024
d314c12
Move the Highlight color menu inside the Highlight Stule dialog
NiLuJe Jan 22, 2024
21d435f
Don't allow changin colors if drawer is invert
NiLuJe Jan 22, 2024
447c92b
Revert "Don't allow changin colors if drawer is invert"
NiLuJe Jan 22, 2024
9d7f70b
Less clunky and more user-friendly warning when you try to modify colors
NiLuJe Jan 22, 2024
e136c07
Might want to drop the bg on actual eInk screens, will have to test
NiLuJe Jan 22, 2024
0c6a453
Don't default to yellow HLs on grayscale screens
NiLuJe Jan 23, 2024
117d18d
Fancy bgcolor in the *other* popup, too
NiLuJe Jan 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 173 additions & 10 deletions frontend/apps/reader/modules/readerhighlight.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local BD = require("ui/bidi")
local BlitBuffer = require("ffi/blitbuffer")
local ButtonDialog = require("ui/widget/buttondialog")
local ConfirmBox = require("ui/widget/confirmbox")
local Device = require("device")
Expand All @@ -18,10 +19,22 @@ local ffiUtil = require("ffi/util")
local time = require("ui/time")
local _ = require("gettext")
local C_ = _.pgettext
local N_ = _.ngettext
local T = ffiUtil.template
local Screen = Device.screen

local ReaderHighlight = InputContainer:extend{}
local ReaderHighlight = InputContainer:extend{
highlight_colors = {
{_("Red"), "red"},
{_("Orange"), "orange"},
{_("Yellow"), "yellow"},
{_("Green"), "green"},
{_("Cyan"), "cyan"},
{_("Blue"), "blue"},
{_("Purple"), "purple"},
{_("Gray"), "gray"},
}
}

local function inside_box(pos, box)
if pos then
Expand Down Expand Up @@ -54,6 +67,7 @@ function ReaderHighlight:init()
self._current_indicator_pos = nil
self._previous_indicator_pos = nil
self._last_indicator_move_args = {dx = 0, dy = 0, distance = 0, time = time:now()}
self._fallback_color = Screen:isColorEnabled() and "yellow" or "gray"

self:registerKeyEvents()

Expand Down Expand Up @@ -405,7 +419,55 @@ function ReaderHighlight:addToMainMenu(menu_items)
end
table.insert(menu_items.highlight_options.sub_item_table, {
smasher816 marked this conversation as resolved.
Show resolved Hide resolved
smasher816 marked this conversation as resolved.
Show resolved Hide resolved
text_func = function()
return T(_("Highlight opacity: %1"), G_reader_settings:readSetting("highlight_lighten_factor", 0.2))
local saved_color = self.view.highlight.saved_color or self._fallback_color
for __, v in ipairs(self.highlight_colors) do
if v[2] == saved_color then
return T(_("Highlight color: %1"), string.lower(v[1]))
end
end
return T(_("Highlight color: %1"), saved_color)
end,
enabled_func = function()
return self.view.highlight.saved_drawer ~= "invert"
end,
callback = function(touchmenu_instance)
local default_color = G_reader_settings:readSetting("highlight_color", self._fallback_color)
local saved_color = self.view.highlight.saved_color or self._fallback_color
local radio_buttons = {}
for _, v in ipairs(self.highlight_colors) do
table.insert(radio_buttons, {
{
text = v[1],
checked = v[2] == saved_color,
bgcolor = BlitBuffer.colorFromName(v[2]) or BlitBuffer.Color8(bit.bxor(0xFF * self.view.highlight.lighten_factor, 0xFF)),
provider = v[2],
},
})
end
UIManager:show(require("ui/widget/radiobuttonwidget"):new{
title_text = _("Highlight color"),
width_factor = 0.5,
keep_shown_on_apply = false,
radio_buttons = radio_buttons,
default_provider = default_color,
callback = function(radio)
self.view.highlight.saved_color = radio.provider
UIManager:setDirty(self.dialog, "ui")
smasher816 marked this conversation as resolved.
Show resolved Hide resolved
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
})
end,
hold_callback = function(touchmenu_instance)
G_reader_settings:saveSetting("highlight_color", self.view.highlight.saved_color)
UIManager:show(Notification:new{
text = T(_("Default highlight color changed to '%1'."), self.view.highlight.saved_color),
})
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
})
table.insert(menu_items.highlight_options.sub_item_table, {
text_func = function()
return T(_("Gray highlight opacity: %1"), G_reader_settings:readSetting("highlight_lighten_factor", 0.2))
end,
enabled_func = function()
return self.view.highlight.saved_drawer == "lighten"
Expand All @@ -422,8 +484,8 @@ function ReaderHighlight:addToMainMenu(menu_items)
value_hold_step = 0.25,
default_value = 0.2,
keep_shown_on_apply = true,
title_text = _("Highlight opacity"),
info_text = _("The higher the value, the darker the highlight."),
title_text = _("Gray highlight opacity"),
info_text = _("The higher the value, the darker the gray."),
callback = function(spin)
G_reader_settings:saveSetting("highlight_lighten_factor", spin.value)
self.view.highlight.lighten_factor = spin.value
Expand Down Expand Up @@ -475,6 +537,35 @@ function ReaderHighlight:addToMainMenu(menu_items)
})
end,
})
table.insert(menu_items.highlight_options.sub_item_table, {
text = _("Apply default style to all highlights"),
callback = function(touchmenu_instance)
UIManager:show(ConfirmBox:new{
text = _("Are you sure you want to edit all highlights."),
icon = "texture-box",
ok_callback = function()
local count = 0
for _, items in pairs(self.view.highlight.saved) do
if items then
count = count + #items
for i = 1, #items do
local item = items[i]
item.drawer = self.view.highlight.saved_drawer
item.color = self.view.highlight.saved_color
end
end
end
if count > 0 then
UIManager:setDirty(self.dialog, "ui")
UIManager:show(Notification:new{
text = T(N_("Applied default style to 1 highlight",
"Applied default style to %1 highlights", count), count),
})
end
end
})
end,
})
if self.document.info.has_pages then
menu_items.panel_zoom_options = {
text = _("Panel zoom (manga/comic)"),
Expand Down Expand Up @@ -1012,7 +1103,7 @@ function ReaderHighlight:onShowHighlightDialog(page, index, is_auto_text)
self.edit_highlight_dialog = nil
end,
},
}
},
}

if self.ui.rolling then
Expand Down Expand Up @@ -1723,7 +1814,6 @@ function ReaderHighlight:onCycleHighlightStyle()
next_style_num = 1
end
self.view.highlight.saved_drawer = highlight_style[next_style_num][2]
self.ui.doc_settings:saveSetting("highlight_drawer", self.view.highlight.saved_drawer)
UIManager:show(Notification:new{
text = T(_("Default highlight style changed to '%1'."), highlight_style[next_style_num][1]),
})
Expand Down Expand Up @@ -1852,6 +1942,7 @@ function ReaderHighlight:saveHighlight(extend_to_sentence)
pboxes = self.selected_text.pboxes,
ext = self.selected_text.ext,
drawer = self.view.highlight.saved_drawer,
color = self.view.highlight.saved_color,
chapter = chapter_name,
}
table.insert(self.view.highlight.saved[page], hl_item)
Expand Down Expand Up @@ -2002,10 +2093,32 @@ function ReaderHighlight:editHighlightStyle(page, i)
datetime = item.datetime,
})))
end
self:showHighlightStyleDialog(apply_drawer, item.drawer)
self:showHighlightStyleDialog(apply_drawer, item.drawer, page, i)
end

function ReaderHighlight:editHighlightColor(page, i)
local item = self.view.highlight.saved[page][i]
local apply_color = function(color)
self:writePdfAnnotation("delete", page, item)
smasher816 marked this conversation as resolved.
Show resolved Hide resolved
item.color = color
if self.ui.paging then
self:writePdfAnnotation("save", page, item)
smasher816 marked this conversation as resolved.
Show resolved Hide resolved
local bm_note = self.ui.bookmark:getBookmarkNote(item)
if bm_note then
self:writePdfAnnotation("content", page, item, bm_note)
end
end
UIManager:setDirty(self.dialog, "ui")
self.ui:handleEvent(Event:new("BookmarkUpdated",
self.ui.bookmark:getBookmarkForHighlight({
page = self.ui.paging and page or item.pos0,
datetime = item.datetime,
})))
end
self:showHighlightColorDialog(apply_color, item.color)
end

function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer)
function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer, page, i)
local default_drawer, keep_shown_on_apply
if item_drawer then -- called from editHighlightStyle
default_drawer = self.view.highlight.saved_drawer or
Expand All @@ -2023,7 +2136,7 @@ function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer)
})
end
local RadioButtonWidget = require("ui/widget/radiobuttonwidget")
UIManager:show(RadioButtonWidget:new{
local ctor = {
title_text = _("Highlight style"),
width_factor = 0.5,
keep_shown_on_apply = keep_shown_on_apply,
Expand All @@ -2032,6 +2145,52 @@ function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer)
callback = function(radio)
caller_callback(radio.provider)
end,
}
if page and i then
-- called from editHighlightStyle
ctor.extra_text = _("Highlight color")
ctor.extra_callback = function(this)
local item = self.view.highlight.saved[page][i]
if item.drawer == "invert" then
UIManager:show(InfoMessage:new{ text = _("Colors unavailable when highlight style is set to 'Invert'") })
else
-- Close the style dialog before showing the color dialog
this:onClose()
self:editHighlightColor(page, i)
end
end
end
UIManager:show(RadioButtonWidget:new(ctor))
end

function ReaderHighlight:showHighlightColorDialog(caller_callback, item_color)
local default_color, keep_shown_on_apply
if item_color then -- called from editHighlightColor
default_color = self.view.highlight.saved_color or
G_reader_settings:readSetting("highlight_color", self._fallback_color)
keep_shown_on_apply = true
end
local radio_buttons = {}
for _, v in ipairs(self.highlight_colors) do
table.insert(radio_buttons, {
{
text = v[1],
checked = item_color == v[2],
bgcolor = BlitBuffer.colorFromName(v[2]) or BlitBuffer.Color8(bit.bxor(0xFF * self.view.highlight.lighten_factor, 0xFF)),
provider = v[2],
},
})
end
local RadioButtonWidget = require("ui/widget/radiobuttonwidget")
UIManager:show(RadioButtonWidget:new{
title_text = _("Highlight color"),
width_factor = 0.5,
keep_shown_on_apply = keep_shown_on_apply,
radio_buttons = radio_buttons,
default_provider = default_color,
callback = function(radio)
caller_callback(radio.provider)
end,
})
end

Expand Down Expand Up @@ -2160,7 +2319,8 @@ function ReaderHighlight:getSavedExtendedHighlightPage(hl_or_bm, page, index)
end
local item = {}
item.datetime = highlight.datetime
item.drawer = highlight.drawer
item.drawer = highlight.drawer or self.highlight.saved_drawer
item.color = highlight.color or self.highlight.saved_color
item.pos0 = highlight.ext[page].pos0
item.pos0.zoom = highlight.pos0.zoom
item.pos0.rotation = highlight.pos0.rotation
Expand All @@ -2175,6 +2335,8 @@ end
function ReaderHighlight:onReadSettings(config)
self.view.highlight.saved_drawer = config:readSetting("highlight_drawer")
or G_reader_settings:readSetting("highlight_drawing_style") or self.view.highlight.saved_drawer
self.view.highlight.saved_color = config:readSetting("highlight_color")
or G_reader_settings:readSetting("highlight_color") or self.view.highlight.saved_color
self.view.highlight.disabled = G_reader_settings:has("default_highlight_action")
and G_reader_settings:readSetting("default_highlight_action") == "nothing"

Expand Down Expand Up @@ -2204,6 +2366,7 @@ end

function ReaderHighlight:onSaveSettings()
self.ui.doc_settings:saveSetting("highlight_drawer", self.view.highlight.saved_drawer)
self.ui.doc_settings:saveSetting("highlight_color", self.view.highlight.saved_color)
self.ui.doc_settings:saveSetting("panel_zoom_enabled", self.panel_zoom_enabled)
end

Expand Down
Loading