You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koreader/frontend/ui/widget/dict.lua

230 lines
5.0 KiB
Lua

require "ui/widget/container"
require "ui/widget/buttontable"
--[[
Display quick lookup word definition
]]
DictQuickLookup = InputContainer:new{
results = nil,
lookupword = nil,
dictionary = nil,
definition = nil,
dict_index = 1,
title_face = Font:getFace("tfont", 20),
word_face = Font:getFace("tfont", 18),
content_face = Font:getFace("cfont", 18),
width = Screen:getWidth() - scaleByDPI(100),
title_padding = scaleByDPI(5),
title_margin = scaleByDPI(2),
word_padding = scaleByDPI(5),
word_margin = scaleByDPI(2),
definition_padding = scaleByDPI(5),
definition_margin = scaleByDPI(2),
button_padding = scaleByDPI(14),
}
function DictQuickLookup:init()
if Device:hasKeyboard() then
key_events = {
AnyKeyPressed = { { Input.group.Any },
seqtext = "any key", doc = _("close dialog") }
}
else
self.ges_events.TapCloseDict = {
GestureRange:new{
ges = "tap",
range = Geom:new{
x = 0, y = 0,
w = Screen:getWidth(),
h = Screen:getHeight(),
}
}
}
end
self:changeToDefaultDict()
end
function DictQuickLookup:update()
-- dictionary title
self.dict_title = FrameContainer:new{
padding = self.title_padding,
margin = self.title_margin,
bordersize = 0,
TextWidget:new{
text = self.dictionary,
face = self.title_face,
width = self.width,
}
}
-- lookup word
local lookup_word = FrameContainer:new{
padding = self.word_padding,
margin = self.word_margin,
bordersize = 0,
TextBoxWidget:new{
text = self.lookupword,
face = self.word_face,
width = self.width,
},
}
-- word definition
local definition = FrameContainer:new{
padding = self.definition_padding,
margin = self.definition_margin,
bordersize = 0,
TextBoxWidget:new{
text = self.definition,
face = self.content_face,
width = self.width,
},
}
local button_table = ButtonTable:new{
width = math.max(self.width, definition:getSize().w),
buttons = {
{
{
text = _("<<"),
enabled = self:isPrevDictAvaiable(),
callback = function()
self:changeToPrevDict()
end,
},
{
text = _(">>"),
enabled = self:isNextDictAvaiable(),
callback = function()
self:changeToNextDict()
end,
},
},
{
{
text = _("Highlight"),
enabled = false,
callback = function()
self.ui:handleEvent(Event:new("Highlight"))
end,
},
{
text = _("Add Note"),
enabled = false,
callback = function()
self.ui:handleEvent(Event:new("AddNote"))
end,
},
},
},
zero_sep = true,
}
local title_bar = LineWidget:new{
--background = 8,
dimen = Geom:new{
w = button_table:getSize().w + self.button_padding,
h = scaleByDPI(2),
}
}
self.dict_frame = FrameContainer:new{
radius = scaleByDPI(8),
bordersize = scaleByDPI(3),
padding = 0,
margin = 0,
background = 0,
VerticalGroup:new{
align = "left",
self.dict_title,
title_bar,
-- word
lookup_word,
-- definition
definition,
-- buttons
CenterContainer:new{
dimen = Geom:new{
w = title_bar:getSize().w,
h = button_table:getSize().h,
},
button_table,
}
}
}
self[1] = CenterContainer:new{
dimen = Screen:getSize(),
self.dict_frame,
}
end
function DictQuickLookup:isPrevDictAvaiable()
return self.dict_index > 1
end
function DictQuickLookup:isNextDictAvaiable()
return self.dict_index < #self.results
end
function DictQuickLookup:changeToPrevDict()
self:changeDictionary(self.dict_index - 1)
end
function DictQuickLookup:changeToNextDict()
self:changeDictionary(self.dict_index + 1)
end
function DictQuickLookup:changeDictionary(index)
self.dict_index = index
self.dictionary = self.results[index].dict
self.lookupword = self.results[index].word
self.definition = self.results[index].definition
self:update()
UIManager.repaint_all = true
end
function DictQuickLookup:changeToDefaultDict()
if self.dictionary then
-- dictionaries that have definition of the first word(accurate word)
-- excluding Fuzzy queries.
local n_accurate_dicts = nil
local default_word = self.results[1].word
for i=1, #self.results do
if self.results[i].word == default_word then
n_accurate_dicts = i
else
break
end
end
-- change to dictionary specified by self.dictionary
for i=1, n_accurate_dicts do
if self.results[i].dict == self.dictionary then
self:changeDictionary(i)
break
end
-- cannot find definition in default dictionary
if i == n_accurate_dicts then
self:changeDictionary(1)
end
end
else
self:changeDictionary(1)
end
end
function DictQuickLookup:onAnyKeyPressed()
-- triggered by our defined key events
UIManager:close(self)
return true
end
function DictQuickLookup:onTapCloseDict(arg, ges_ev)
if ges_ev.pos:notIntersectWith(self.dict_frame.dimen) then
UIManager:close(self)
self.ui:handleEvent(Event:new("Tap"))
return true
elseif not ges_ev.pos:notIntersectWith(self.dict_title.dimen) then
self.ui:handleEvent(Event:new("UpdateDefaultDict", self.dictionary))
return true
end
return true
end