From 725bef08e65dfcd96fcbc2dbc7b3d78a62a7ef69 Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 21 Jul 2013 14:23:54 +0800 Subject: [PATCH] add multi-dictionary support --- frontend/ui/reader/readerdictionary.lua | 69 +++----- frontend/ui/reader/readerhighlight.lua | 51 +++++- frontend/ui/widget/dict.lua | 214 +++++++++++++++++++++--- 3 files changed, 258 insertions(+), 76 deletions(-) diff --git a/frontend/ui/reader/readerdictionary.lua b/frontend/ui/reader/readerdictionary.lua index 2c0dd74ce..f5d9f9954 100644 --- a/frontend/ui/reader/readerdictionary.lua +++ b/frontend/ui/reader/readerdictionary.lua @@ -4,12 +4,6 @@ require "ui/widget/dict" ReaderDictionary = EventListener:new{} function ReaderDictionary:init() - local dev_mod = Device:getModel() - if dev_mod == "KindlePaperWhite" or dev_mod == "KindleTouch" then - require("liblipclua") - DEBUG("init lipc handler com.github.koreader.dictionary") - self.lipc_handle = lipc.init("com.github.koreader.dictionary") - end JSON = require("JSON") end @@ -17,25 +11,6 @@ function ReaderDictionary:onLookupWord(word) self:stardictLookup(word) end -function ReaderDictionary:nativeDictLookup(word) - DEBUG("lookup word:", word) - --self:quickLookup() - if self.lipc_handle and word then - self.lipc_handle:set_string_property( - "com.github.koreader.kpvbooklet.dict", "lookup", word) - local results_str = self.lipc_handle:get_string_property( - "com.github.koreader.kpvbooklet.word", word) - if results_str then - --DEBUG("result str:", word, results_str) - local ok, results_tab = pcall(JSON.decode, JSON, results_str) - --DEBUG("lookup result table:", word, results_tab) - if results_tab and results_tab[1] then - self:showDict(results_tab[1]) - end - end - end -end - function ReaderDictionary:stardictLookup(word) DEBUG("lookup word:", word) if word then @@ -48,34 +23,34 @@ function ReaderDictionary:stardictLookup(word) local results_str = std_out:read("*all") if results_str then --DEBUG("result str:", word, results_str) - local ok, results_tab = pcall(JSON.decode, JSON, results_str) - --DEBUG("lookup result table:", word, results_tab) - if results_tab and results_tab[1] then - self:showDict(results_tab[1]) - end + local ok, results = pcall(JSON.decode, JSON, results_str) + --DEBUG("lookup result table:", word, results) + self:showDict(results) end end end -function ReaderDictionary:showDict(result) --- UIManager:show(DictQuickLookup:new{ --- dict = "Oxford Dictionary of English", --- definition = "coordination n. [mass noun] 1 the organization of the different elements of a \ --- complex body or activity so as to enable them to work together effectively: an important managerial \ --- task is the control and coordination of activities. cooperative effort resulting in an effective \ --- relationship: action groups work in coordination with local groups to end rainforest destruction. \ --- the ability to use different parts of the body together smoothly and efficiently: changing from \ --- one foot position to another requires coordination and balance.", --- id = "/mnt/us/documents/dictionaries/Oxford_Dictionary_of_English.azw", --- lang = "en", --- }) - if result then +function ReaderDictionary:showDict(results) + if results and results[1] then + DEBUG("showing quick lookup dictionary window") UIManager:show(DictQuickLookup:new{ ui = self.ui, - dict = result.dict, - definition = result.definition, - id = result.ID, - lang = result.lang, + dialog = self.dialog, + results = results, + dictionary = self.default_dictionary, }) end end + +function ReaderDictionary:onUpdateDefaultDict(dict) + DEBUG("make default dictionary:", dict) + self.default_dictionary = dict +end + +function ReaderDictionary:onReadSettings(config) + self.default_dictionary = config:readSetting("default_dictionary") +end + +function ReaderDictionary:onCloseDocument() + self.ui.doc_settings:saveSetting("default_dictionary", self.default_dictionary) +end diff --git a/frontend/ui/reader/readerhighlight.lua b/frontend/ui/reader/readerhighlight.lua index 95f99c71c..01299714e 100644 --- a/frontend/ui/reader/readerhighlight.lua +++ b/frontend/ui/reader/readerhighlight.lua @@ -90,7 +90,7 @@ function ReaderHighlight:onTap(arg, ges) for j = 1, #items[i].boxes do if inside_box(ges, items[i].boxes[j]) then DEBUG("Tap on hightlight") - self.edit_highlight_dialog = ButtonTable:new{ + self.edit_highlight_dialog = HighlightDialog:new{ buttons = { { { @@ -198,13 +198,59 @@ function ReaderHighlight:translate(selected_text) end end +HighlightDialog = InputContainer:new{ + buttons = nil, + tap_close_callback = nil, +} + +function HighlightDialog:init() + if Device:hasKeyboard() then + key_events = { + AnyKeyPressed = { { Input.group.Any }, + seqtext = "any key", doc = _("close dialog") } + } + else + self.ges_events.TapClose = { + GestureRange:new{ + ges = "tap", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + } + } + } + end + self[1] = CenterContainer:new{ + dimen = Screen:getSize(), + FrameContainer:new{ + ButtonTable:new{ + width = Screen:getWidth()*0.9, + buttons = self.buttons, + }, + background = 0, + bordersize = 2, + radius = 7, + padding = 2, + } + } +end + +function HighlightDialog:onTapClose() + UIManager:close(self) + if self.tap_close_callback then + self.tap_close_callback() + end + return true +end + function ReaderHighlight:onHoldRelease(arg, ges) if self.selected_word then self:lookup(self.selected_word) self.selected_word = nil elseif self.selected_text then DEBUG("show highlight dialog") - self.highlight_dialog = ButtonTable:new{ + self.highlight_dialog = HighlightDialog:new{ buttons = { { { @@ -439,3 +485,4 @@ function ReaderHighlight:getTextFromPositions(boxes, pos0, pos1) boxes = line_boxes, } end + diff --git a/frontend/ui/widget/dict.lua b/frontend/ui/widget/dict.lua index 3cd7b0c42..5551bbd73 100644 --- a/frontend/ui/widget/dict.lua +++ b/frontend/ui/widget/dict.lua @@ -1,16 +1,27 @@ require "ui/widget/container" +require "ui/widget/buttontable" --[[ Display quick lookup word definition ]] DictQuickLookup = InputContainer:new{ - dict = nil, + results = nil, + lookupword = nil, + dictionary = nil, definition = nil, - id = nil, - lang = 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() @@ -20,7 +31,7 @@ function DictQuickLookup:init() seqtext = "any key", doc = _("close dialog") } } else - self.ges_events.TapClose = { + self.ges_events.TapCloseDict = { GestureRange:new{ ges = "tap", range = Geom:new{ @@ -31,29 +42,172 @@ function DictQuickLookup:init() } } end - -- we construct the actual content here because self.text is only available now - self[1] = CenterContainer:new{ - dimen = Screen:getSize(), - FrameContainer:new{ - margin = 2, - background = 0, - VerticalGroup:new{ - align = "center", - -- title bar - TextBoxWidget:new{ - text = self.dict, - face = self.title_face, - width = Screen:getWidth() - 100, + 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, }, - VerticalSpan:new{ width = 20 }, - TextBoxWidget:new{ - text = self.definition, - face = self.content_face, - width = Screen:getWidth() - 100, - } + { + 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() @@ -62,8 +216,14 @@ function DictQuickLookup:onAnyKeyPressed() return true end -function DictQuickLookup:onTapClose() - UIManager:close(self) - self.ui:handleEvent(Event:new("Tap")) +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