Merge pull request #1763 from houqp/houqp-master

support screenshot in filemanager
pull/1765/head
Huang Xin 9 years ago
commit 5ca62eb323

2
.gitignore vendored

@ -6,7 +6,6 @@ lua
lua-*
.reader.kpdfview.lua
.vimrc
git-rev
*.o
tags
test/*
@ -19,6 +18,7 @@ emu
koreader-*.zip
koreader-*.apk
koreader-*.tar.gz
koreader-*.targz
koreader-*.click
l10n/*

@ -85,6 +85,7 @@ read_globals = {
"KOBO_SCREEN_SAVER",
"KOBO_SCREEN_SAVER_LAST_BOOK",
"NETWORK_PROXY",
"DUSE_TURBO_LIB",
"cre",
"lfs",
"lipc",

@ -39,7 +39,7 @@ WIN32_DIR=$(PLATFORM_DIR)/win32
# files to link from main directory
INSTALL_FILES=reader.lua frontend resources defaults.lua datastorage.lua l10n utils \
git-rev README.md COPYING
README.md COPYING
# for gettext
DOMAIN=koreader
@ -50,8 +50,8 @@ XGETTEXT_BIN=$(KOREADER_MISC_TOOL)/gettext/lua_xgettext.py
all: $(if $(ANDROID),,$(KOR_BASE)/$(OUTPUT_DIR)/luajit)
$(MAKE) -C $(KOR_BASE)
echo $(VERSION) > git-rev
mkdir -p $(INSTALL_DIR)/koreader
install -d $(INSTALL_DIR)/koreader
rm -f $(INSTALL_DIR)/koreader/git-rev; echo $(VERSION) > $(INSTALL_DIR)/koreader/git-rev
ifneq ($(or $(EMULATE_READER),$(WIN32)),)
cp -f $(KOR_BASE)/ev_replay.py $(INSTALL_DIR)/koreader/
# create symlink instead of copying files in development mode
@ -79,11 +79,7 @@ endif
# install plugins
cp -r plugins/* $(INSTALL_DIR)/koreader/plugins/
cp -rpL resources/fonts/* $(INSTALL_DIR)/koreader/fonts/
mkdir -p $(INSTALL_DIR)/koreader/screenshots
mkdir -p $(INSTALL_DIR)/koreader/data/dict
mkdir -p $(INSTALL_DIR)/koreader/data/tessdata
mkdir -p $(INSTALL_DIR)/koreader/fonts/host
mkdir -p $(INSTALL_DIR)/koreader/ota
install -d $(INSTALL_DIR)/koreader/{screenshots,data/{dict,tessdata},fonts/host,ota}
ifeq ($(or $(EMULATE_READER),$(WIN32)),)
# clean up, remove unused files for releases
rm -rf $(INSTALL_DIR)/koreader/data/{cr3.ini,cr3skin-format.txt,desktop,devices,manual}

@ -7,14 +7,14 @@ local DataStorage = {}
function DataStorage:getDataDir()
local data_dir
if isAndroid then
data_dir = "/sdcard/koreader/"
data_dir = "/sdcard/koreader"
elseif os.getenv("UBUNTU_APPLICATION_ISOLATION") then
local app_id = os.getenv("APP_ID")
local package_name = app_id:match("^(.-)_")
-- confinded ubuntu app has write access to this dir
data_dir = os.getenv("XDG_DATA_HOME") .. "/" .. package_name
else
data_dir = "./"
data_dir = "."
end
if lfs.attributes(data_dir, "mode") ~= "directory" then
lfs.mkdir(data_dir)

@ -3,22 +3,23 @@ local InputContainer = require("ui/widget/container/inputcontainer")
local FrameContainer = require("ui/widget/container/framecontainer")
local FileManagerMenu = require("apps/filemanager/filemanagermenu")
local DocumentRegistry = require("document/documentregistry")
local TextWidget = require("ui/widget/textwidget")
local FileChooser = require("ui/widget/filechooser")
local VerticalSpan = require("ui/widget/verticalspan")
local VerticalGroup = require("ui/widget/verticalgroup")
local Screenshoter = require("ui/widget/screenshoter")
local ButtonDialog = require("ui/widget/buttondialog")
local VerticalSpan = require("ui/widget/verticalspan")
local FileChooser = require("ui/widget/filechooser")
local TextWidget = require("ui/widget/textwidget")
local Blitbuffer = require("ffi/blitbuffer")
local lfs = require("libs/libkoreader-lfs")
local UIManager = require("ui/uimanager")
local Font = require("ui/font")
local Screen = require("device").screen
local Geom = require("ui/geometry")
local Device = require("device")
local Event = require("ui/event")
local Device = require("device")
local util = require("ffi/util")
local Font = require("ui/font")
local DEBUG = require("dbg")
local _ = require("gettext")
local util = require("ffi/util")
local Blitbuffer = require("ffi/blitbuffer")
local FileManager = InputContainer:extend{
title = _("FileManager"),
@ -65,7 +66,7 @@ function FileManager:init()
}
self.file_chooser = file_chooser
function file_chooser:onFileSelect(file)
function file_chooser:onFileSelect(file) -- luacheck: ignore
local ReaderUI = require("apps/reader/readerui")
ReaderUI:showReader(file)
return true
@ -77,8 +78,7 @@ function FileManager:init()
local deleteFile = function(file) self:deleteFile(file) end
local fileManager = self
function file_chooser:onFileHold(file)
--DEBUG("hold file", file)
function file_chooser:onFileHold(file) -- luacheck: ignore
local buttons = {
{
{
@ -158,6 +158,7 @@ function FileManager:init()
self.menu = FileManagerMenu:new{
ui = self
}
table.insert(self, Screenshoter:new{ prefix = 'FileManager' })
table.insert(self, self.menu)
table.insert(self, FileManagerHistory:new{
ui = self,

@ -1,5 +1,6 @@
local InputContainer = require("ui/widget/container/inputcontainer")
local DocumentRegistry = require("document/documentregistry")
local Screenshoter = require("ui/widget/screenshoter")
local InfoMessage = require("ui/widget/infomessage")
local InputDialog = require("ui/widget/inputdialog")
local ConfirmBox = require("ui/widget/confirmbox")
@ -33,7 +34,6 @@ local ReaderKoptListener = require("apps/reader/modules/readerkoptlistener")
local ReaderCoptListener = require("apps/reader/modules/readercoptlistener")
local ReaderHinting = require("apps/reader/modules/readerhinting")
local ReaderHighlight = require("apps/reader/modules/readerhighlight")
local ReaderScreenshot = require("apps/reader/modules/readerscreenshot")
local ReaderFrontLight = require("apps/reader/modules/readerfrontlight")
local ReaderDictionary = require("apps/reader/modules/readerdictionary")
local ReaderWikipedia = require("apps/reader/modules/readerwikipedia")
@ -164,7 +164,8 @@ function ReaderUI:init()
document = self.document,
})
-- screenshot controller
self:registerModule("screenshot", ReaderScreenshot:new{
self:registerModule("screenshot", Screenshoter:new{
prefix = 'Reader',
dialog = self.dialog,
view = self.view,
ui = self
@ -328,7 +329,7 @@ function ReaderUI:showReader(file)
self:doShowReader(file)
end)
local ok, err = coroutine.resume(co)
if err ~= nil then
if err ~= nil or ok == false then
print '[!] doShowReader coroutine crashed:'
print(debug.traceback(co, err, 1))
UIManager.quit()

@ -1,9 +1,6 @@
local ffi = require("ffi")
local DEBUG = require("dbg")
local util = require("ffi/util")
local Event = require("ui/event")
local MessageQueue = require("ui/message/messagequeue")
local dummy = require("ffi/zeromq_h")
local czmq = ffi.load("libs/libczmq.so.1")
local filemq = ffi.load("libs/libfmq.so.1")

@ -6,7 +6,6 @@ local Geom = require("ui/geometry")
local util = require("ffi/util")
local DEBUG = require("dbg")
local _ = require("gettext")
local ffi = require("ffi")
local MILLION = 1000000
@ -323,8 +322,8 @@ function UIManager:_checkTasks()
local wait_until = nil
while true do
st_size = #self._task_queue
if st_size == 0 then
local nu_task = #self._task_queue
if nu_task == 0 then
-- all tasks checked
break
end

@ -4,7 +4,6 @@ local Menu = require("ui/widget/menu")
local Screen = require("device").screen
local Device = require("device")
local util = require("ffi/util")
local DEBUG = require("dbg")
local _ = require("gettext")
local ffi = require("ffi")
ffi.cdef[[

@ -58,7 +58,7 @@ function ImageWidget:_loadfile()
else
-- cache this image
DEBUG("cache", hash)
local cache = ImageCacheItem:new{
cache = ImageCacheItem:new{
bb = Mupdf.renderImageFile(self.file, self.width, self.height),
}
cache.size = cache.bb.pitch * cache.bb.h * cache.bb:getBpp() / 8

@ -46,7 +46,7 @@ function InfoMessage:init()
}
}
end
local image_widget = nil
local image_widget
if self.image then
image_widget = ImageWidget:new{
image = self.image,

@ -5,11 +5,9 @@ local FrameContainer = require("ui/widget/container/framecontainer")
local VirtualKeyboard = require("ui/widget/virtualkeyboard")
local GestureRange = require("ui/gesturerange")
local UIManager = require("ui/uimanager")
local Geom = require("ui/geometry")
local Device = require("device")
local Screen = require("device").screen
local Font = require("ui/font")
local DEBUG = require("dbg")
local util = require("ffi/util")
local Blitbuffer = require("ffi/blitbuffer")
@ -54,7 +52,6 @@ function InputText:initTextBox(text)
self:initCharlist(text)
local fgcolor = Blitbuffer.gray(self.text == "" and 0.5 or 1.0)
local text_widget = nil
local show_text = self.text
if self.text_type == "password" and show_text ~= "" then
show_text = self.text:gsub("(.-).", function() return "*" end)
@ -62,6 +59,7 @@ function InputText:initTextBox(text)
elseif show_text == "" then
show_text = self.hint
end
local text_widget
if self.scroll then
text_widget = ScrollTextWidget:new{
text = show_text,

@ -6,7 +6,6 @@ local InputText = require("ui/widget/inputtext")
local UIManager = require("ui/uimanager")
local Geom = require("ui/geometry")
local Screen = require("device").screen
local DEBUG = require("dbg")
local _ = require("gettext")
local Blitbuffer = require("ffi/blitbuffer")

@ -6,7 +6,6 @@ local FrameContainer = require("ui/widget/container/framecontainer")
local CenterContainer = require("ui/widget/container/centercontainer")
local BottomContainer = require("ui/widget/container/bottomcontainer")
local UnderlineContainer = require("ui/widget/container/underlinecontainer")
local HorizontalSpan = require("ui/widget/horizontalspan")
local FocusManager = require("ui/widget/focusmanager")
local TextWidget = require("ui/widget/textwidget")
local OverlapGroup = require("ui/widget/overlapgroup")
@ -54,7 +53,7 @@ function ItemShortCutIcon:init()
end
--@TODO calculate font size by icon size 01.05 2012 (houqp)
local sc_face = nil
local sc_face
if self.key:len() > 1 then
sc_face = Font:getFace("ffont", 14)
else
@ -167,7 +166,7 @@ function MenuItem:init()
local state_button_width = self.state_size.w or 0
local my_text = self.text and ""..self.text or ""
w = RenderText:sizeUtf8Text(0, self.dimen.w, self.face,
local w = RenderText:sizeUtf8Text(0, self.dimen.w, self.face,
""..my_text, true, self.bold).x
if w + mandatory_w + state_button_width >= self.content_width then
if Device:hasKeyboard() then
@ -245,7 +244,6 @@ function MenuItem:init()
ItemShortCutIcon:new{
dimen = shortcut_icon_dimen,
key = self.shortcut,
radius = shortcut_icon_r,
style = self.shortcut_style,
},
HorizontalSpan:new{ width = 10 },
@ -501,7 +499,7 @@ function Menu:init()
}
}
local content = nil
local content
if self.no_title then
content = OverlapGroup:new{
dimen = self.dimen:copy(),
@ -855,7 +853,7 @@ function Menu:onClose()
self:onCloseAllMenus()
else
-- back to parent menu
parent_item_table = table.remove(self.item_table_stack, table_length)
local parent_item_table = table.remove(self.item_table_stack, table_length)
self:swithItemTable(parent_item_table.title, parent_item_table)
end
return true

@ -7,11 +7,7 @@ local ImageWidget = require("ui/widget/imagewidget")
local TextBoxWidget = require("ui/widget/textboxwidget")
local HorizontalSpan = require("ui/widget/horizontalspan")
local ButtonTable = require("ui/widget/buttontable")
local GestureRange = require("ui/gesturerange")
local UIManager = require("ui/uimanager")
local Device = require("device")
local Geom = require("ui/geometry")
local Input = require("device").input
local Screen = require("device").screen
local Font = require("ui/font")
local DEBUG = require("dbg")

@ -1,18 +1,14 @@
local FrameContainer = require("ui/widget/container/framecontainer")
local CenterContainer = require("ui/widget/container/centercontainer")
local VerticalGroup = require("ui/widget/verticalgroup")
local HorizontalGroup = require("ui/widget/horizontalgroup")
local InputDialog = require("ui/widget/inputdialog")
local InputText = require("ui/widget/inputtext")
local UIManager = require("ui/uimanager")
local Geom = require("ui/geometry")
local Screen = require("device").screen
local DEBUG = require("dbg")
local _ = require("gettext")
local util = require("ffi/util")
local Blitbuffer = require("ffi/blitbuffer")
local InfoMessage = require("ui/widget/infomessage")
local input_field
local MultiInputDialog = InputDialog:extend{

@ -6,7 +6,6 @@ local Font = require("ui/font")
local Geom = require("ui/geometry")
local Device = require("device")
local UIManager = require("ui/uimanager")
local HorizontalGroup = require("ui/widget/horizontalgroup")
local Input = require("device").input
local Screen = require("device").screen
local Blitbuffer = require("ffi/blitbuffer")

@ -2,20 +2,17 @@ local MultiInputDialog = require("ui/widget/multiinputdialog")
local ButtonDialog = require("ui/widget/buttondialog")
local InfoMessage = require("ui/widget/infomessage")
local LoginDialog = require("ui/widget/logindialog")
local lfs = require("libs/libkoreader-lfs")
local OPDSParser = require("ui/opdsparser")
local NetworkMgr = require("ui/networkmgr")
local UIManager = require("ui/uimanager")
local CacheItem = require("cacheitem")
local Menu = require("ui/widget/menu")
local Screen = require("device").screen
local Device = require("device")
local url = require('socket.url')
local util = require("ffi/util")
local Cache = require("cache")
local DEBUG = require("dbg")
local _ = require("gettext")
local ffi = require("ffi")
local socket = require('socket')
local http = require('socket.http')
@ -189,7 +186,6 @@ function OPDSBrowser:genItemTableFromRoot()
})
end
local calibre_opds = G_reader_settings:readSetting("calibre_opds") or {}
local calibre_callback = nil
if not calibre_opds.host or not calibre_opds.port then
table.insert(item_table, {
text = self.calibre_name,
@ -241,7 +237,7 @@ function OPDSBrowser:getAuthorizationHeader(host)
end
function OPDSBrowser:fetchFeed(feed_url)
local headers, request, sink = {}, {}, {}
local request, sink = {}, {}
local parsed = url.parse(feed_url)
request['url'] = feed_url
request['method'] = 'GET'
@ -324,7 +320,7 @@ function OPDSBrowser:getCredential()
end
function OPDSBrowser:parseFeed(feed_url)
local feed = nil
local feed
local hash = "opds|catalog|" .. feed_url
local cache = CatalogCache:check(hash)
if cache then
@ -333,10 +329,7 @@ function OPDSBrowser:parseFeed(feed_url)
DEBUG("cache", hash)
feed = self:fetchFeed(feed_url)
if feed then
local cache = CatalogCacheItem:new{
feed = feed
}
CatalogCache:insert(hash, cache)
CatalogCache:insert(hash, CatalogCacheItem:new{ feed = feed })
end
end
if feed then
@ -417,7 +410,6 @@ function OPDSBrowser:genItemTableFromCatalog(catalog, item_url)
end
end
local title = "Unknown"
local title_type = type(entry.title)
if type(entry.title) == "string" then
title = entry.title
elseif type(entry.title) == "table" then
@ -445,8 +437,8 @@ function OPDSBrowser:genItemTableFromCatalog(catalog, item_url)
return item_table
end
function OPDSBrowser:updateCatalog(url)
local menu_table = self:genItemTableFromURL(url)
function OPDSBrowser:updateCatalog(item_table_url)
local menu_table = self:genItemTableFromURL(item_table_url)
if #menu_table > 0 then
--DEBUG("menu table", menu_table)
self:swithItemTable(nil, menu_table)
@ -457,8 +449,8 @@ function OPDSBrowser:updateCatalog(url)
end
end
function OPDSBrowser:appendCatalog(url)
local new_table = self:genItemTableFromURL(url)
function OPDSBrowser:appendCatalog(item_table_url)
local new_table = self:genItemTableFromURL(item_table_url)
for i, item in ipairs(new_table) do
table.insert(self.item_table, item)
end

@ -2,7 +2,6 @@ local ButtonDialog = require("ui/widget/buttondialog")
local FileChooser = require("ui/widget/filechooser")
local UIManager = require("ui/uimanager")
local util = require("ffi/util")
local DEBUG = require("dbg")
local _ = require("gettext")
local PathChooser = FileChooser:extend{

@ -3,19 +3,18 @@ local InfoMessage = require("ui/widget/infomessage")
local GestureRange = require("ui/gesturerange")
local DataStorage = require("datastorage")
local UIManager = require("ui/uimanager")
local Device = require("device")
local Screen = require("device").screen
local DEBUG = require("dbg")
local T = require("ffi/util").template
local _ = require("gettext")
local screenshots_dir = DataStorage:getDataDir() .. "/screenshots/"
local ReaderScreenshot = InputContainer:new{
datetime_name = screenshots_dir .. "Screenshot_%Y-%b-%d_%H%M%S.png",
local Screenshoter = InputContainer:new{
prefix = 'Screenshot',
}
function ReaderScreenshot:init()
function Screenshoter:init()
local screenshots_dir = DataStorage:getDataDir() .. "/screenshots/"
self.screenshot_fn_fmt = screenshots_dir .. self.prefix .. "_%Y-%b-%d_%H%M%S.png"
local diagonal = math.sqrt(
math.pow(Screen:getWidth(), 2) +
math.pow(Screen:getHeight(), 2)
@ -38,11 +37,11 @@ function ReaderScreenshot:init()
}
end
function ReaderScreenshot:onScreenshot(filename)
local screenshot_name = filename or os.date(self.datetime_name)
function Screenshoter:onScreenshot(filename)
local screenshot_name = filename or os.date(self.screenshot_fn_fmt)
UIManager:show(InfoMessage:new{
text = T( _("Saving screenshot to %1."), screenshot_name),
timeout = 2,
timeout = 3,
})
Screen:shot(screenshot_name)
-- trigger full refresh
@ -50,12 +49,12 @@ function ReaderScreenshot:onScreenshot(filename)
return true
end
function ReaderScreenshot:onTapDiagonal()
function Screenshoter:onTapDiagonal()
return self:onScreenshot()
end
function ReaderScreenshot:onSwipeDiagonal()
function Screenshoter:onSwipeDiagonal()
return self:onScreenshot()
end
return ReaderScreenshot
return Screenshoter

@ -1,10 +1,6 @@
local InputContainer = require("ui/widget/container/inputcontainer")
local Blitbuffer = require("ffi/blitbuffer")
local Widget = require("ui/widget/widget")
local GestureRange = require("ui/gesturerange")
local RenderText = require("ui/rendertext")
local UIManager = require("ui/uimanager")
local Device = require("device")
local Screen = require("device").screen
local Geom = require("ui/geometry")
local util = require("util")
@ -29,7 +25,7 @@ local TextBoxWidget = Widget:new{
}
function TextBoxWidget:init()
local v_list = nil
local v_list
if self.height then
v_list = self:_getCurrentVerticalList()
else
@ -81,7 +77,6 @@ function TextBoxWidget:_getVerticalList(alg)
end
-- build horizontal list
local h_list = {}
local line_count = 0
for line in util.gsplit(self.text, "\n", true) do
for words in line:gmatch("[\32-\127\192-\255]+[\128-\191]*") do
for word in util.gsplit(words, "%s+", true) do
@ -179,12 +174,11 @@ function TextBoxWidget:_render(v_list)
self.rendering_vlist = v_list
local font_height = self.face.size
local line_height_px = self.line_height * font_height
local space_w = RenderText:sizeUtf8Text(0, Screen:getWidth(), self.face, " ", true).x
local h = (font_height + line_height_px) * #v_list
self._bb = Blitbuffer.new(self.width, h)
self._bb:fill(Blitbuffer.COLOR_WHITE)
local y = font_height
local pen_x = 0
local pen_x
for _,l in ipairs(v_list) do
pen_x = 0
for _,w in ipairs(l) do

@ -10,7 +10,6 @@ local UIManager = require("ui/uimanager")
local Screen = require("device").screen
local Device = require("device")
local GestureRange = require("ui/gesturerange")
local DEBUG = require("dbg")
local Blitbuffer = require("ffi/blitbuffer")
local _ = require("gettext")
@ -130,7 +129,6 @@ function ToggleSwitch:onTapSelect(arg, gev)
local position = math.ceil(
(gev.pos.x - self.dimen.x) / self.dimen.w * self.n_pos
)
--DEBUG("toggle position:", position)
self:togglePosition(position)
--[[
if self.values then

@ -18,7 +18,6 @@ local Screen = require("device").screen
local Geom = require("ui/geometry")
local Font = require("ui/font")
local util = require("ffi/util")
local DEBUG = require("dbg")
local _ = require("gettext")
local Blitbuffer = require("ffi/blitbuffer")

@ -48,7 +48,7 @@ end
--https://gist.github.com/jesseadams/791673
function util.secondsToClock(seconds, withoutSeconds)
local seconds = tonumber(seconds)
seconds = tonumber(seconds)
if seconds == 0 or seconds ~= seconds then
if withoutSeconds then
return "00:00";

Loading…
Cancel
Save