Add color highlight menu (#11044)

This commit is contained in:
Rowan Decker
2024-08-30 13:10:43 -07:00
committed by GitHub
parent 89fdb5516b
commit 60e0e3ef45
10 changed files with 303 additions and 37 deletions

View File

@@ -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")
@@ -23,7 +24,20 @@ local N_ = _.ngettext
local T = ffiUtil.template
local Screen = Device.screen
local ReaderHighlight = InputContainer:extend{}
local ReaderHighlight = InputContainer:extend{
-- Matches what is available in BlitBuffer.HIGHLIGHT_COLORS
highlight_colors = {
{_("Red"), "red"},
{_("Orange"), "orange"},
{_("Yellow"), "yellow"},
{_("Green"), "green"},
{_("Olive"), "olive"},
{_("Cyan"), "cyan"},
{_("Blue"), "blue"},
{_("Purple"), "purple"},
{_("Gray"), "gray"},
}
}
local function inside_box(pos, box)
if pos then
@@ -56,6 +70,8 @@ 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()}
-- NOTE: Unfortunately, yellow tends to look like absolute ass on Kaleido panels...
self._fallback_color = Screen:isColorEnabled() and "yellow" or "gray"
self:registerKeyEvents()
@@ -413,7 +429,58 @@ function ReaderHighlight:addToMainMenu(menu_items)
end
table.insert(menu_items.highlight_options.sub_item_table, {
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(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")
if touchmenu_instance then touchmenu_instance:updateItems() end
end,
-- This ensures the waveform mode will be upgraded to a Kaleido wfm on compatible devices
colorful = true,
dithered = true,
})
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"
@@ -430,8 +497,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
@@ -483,6 +550,32 @@ 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 update all highlights?"),
icon = "texture-box",
ok_callback = function()
local count = 0
for _, item in ipairs(self.ui.annotation.annotations) do
if item.drawer then
count = count + 1
item.drawer = self.view.highlight.saved_drawer
item.color = self.view.highlight.saved_color
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.ui.paging then
menu_items.panel_zoom_options = {
text = _("Panel zoom (manga/comic)"),
@@ -1069,7 +1162,7 @@ function ReaderHighlight:onShowHighlightDialog(index)
self.edit_highlight_dialog = nil
end,
},
}
},
}
if self.ui.rolling then
@@ -1791,7 +1884,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]),
})
@@ -1838,6 +1930,7 @@ function ReaderHighlight:saveHighlight(extend_to_sentence)
pos1 = self.selected_text.pos1,
text = cleanupSelectedText(self.selected_text.text),
drawer = self.view.highlight.saved_drawer,
color = self.view.highlight.saved_color,
chapter = self.ui.toc:getTocTitleByPage(pg_or_xp),
}
if self.ui.paging then
@@ -1962,10 +2055,27 @@ function ReaderHighlight:editHighlightStyle(index)
UIManager:setDirty(self.dialog, "ui")
self.ui:handleEvent(Event:new("AnnotationsModified", { item }))
end
self:showHighlightStyleDialog(apply_drawer, item.drawer)
self:showHighlightStyleDialog(apply_drawer, item.drawer, index)
end
function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer)
function ReaderHighlight:editHighlightColor(index)
local item = self.ui.annotation.annotations[index]
local apply_color = function(color)
self:writePdfAnnotation("delete", item)
item.color = color
if self.ui.paging then
self:writePdfAnnotation("save", item)
if item.note then
self:writePdfAnnotation("content", item, item.note)
end
end
UIManager:setDirty(self.dialog, "ui")
self.ui:handleEvent(Event:new("AnnotationsModified", { item }))
end
self:showHighlightColorDialog(apply_color, item.color)
end
function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer, index)
local default_drawer, keep_shown_on_apply
if item_drawer then -- called from ReaderHighlight:editHighlightStyle()
default_drawer = self.view.highlight.saved_drawer or
@@ -1982,7 +2092,7 @@ function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer)
},
})
end
UIManager:show(RadioButtonWidget:new{
local ctor = {
title_text = _("Highlight style"),
width_factor = 0.5,
keep_shown_on_apply = keep_shown_on_apply,
@@ -1991,6 +2101,53 @@ function ReaderHighlight:showHighlightStyleDialog(caller_callback, item_drawer)
callback = function(radio)
caller_callback(radio.provider)
end,
}
if index then
-- called from editHighlightStyle
ctor.extra_text = _("Highlight color")
ctor.extra_callback = function(this)
local item = self.ui.annotation.annotations[index]
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(index)
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
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,
colorful = true,
dithered = true,
})
end
@@ -2137,6 +2294,7 @@ function ReaderHighlight:getSavedExtendedHighlightPage(highlight, page, index)
local item = {
datetime = highlight.datetime,
drawer = highlight.drawer,
color = highlight.color or self.highlight.saved_color,
text = highlight.text,
note = highlight.note,
page = highlight.page,
@@ -2155,6 +2313,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:readSetting("default_highlight_action") == "nothing"
self.allow_corner_scroll = G_reader_settings:nilOrTrue("highlight_corner_scroll")
@@ -2183,6 +2343,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