From b3b0844f3414b2ea8170377dd1e33265896af4ba Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 18 Jan 2014 23:15:44 +0800 Subject: [PATCH] basic functionality on file copy/paste/cut/delete in filemanager There file operations will popup when holding on file entries in filemanager. This should implement #244. --- frontend/apps/filemanager/filemanager.lua | 133 +++++++++++++++++++++- frontend/ui/widget/filechooser.lua | 10 ++ frontend/ui/widget/menu.lua | 25 ++++ 3 files changed, 164 insertions(+), 4 deletions(-) diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index d91853664..ce5c25bb0 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -1,19 +1,70 @@ +local FileManagerHistory = require("apps/filemanager/filemanagerhistory") local InputContainer = require("ui/widget/container/inputcontainer") local FrameContainer = require("ui/widget/container/framecontainer") +local CenterContainer = require("ui/widget/container/centercontainer") +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 ButtonTable = require("ui/widget/buttontable") +local UIManager = require("ui/uimanager") +local Input = require("ui/input") local Font = require("ui/font") local Screen = require("ui/screen") local Geom = require("ui/geometry") -local UIManager = require("ui/uimanager") +local Device = require("ui/device") local Event = require("ui/event") -local DocumentRegistry = require("document/documentregistry") -local FileManagerMenu = require("apps/filemanager/filemanagermenu") -local FileManagerHistory = require("apps/filemanager/filemanagerhistory") +local DEBUG = require("dbg") local _ = require("gettext") +local FileDialog = InputContainer:new{ + buttons = nil, + tap_close_callback = nil, +} + +function FileDialog:init() + if Device:hasKeyboard() then + self.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 FileDialog:onTapClose() + UIManager:close(self) + if self.tap_close_callback then + self.tap_close_callback() + end + return true +end + local FileManager = InputContainer:extend{ title = _("FileManager"), width = Screen:getWidth(), @@ -66,6 +117,58 @@ function FileManager:init() showReaderUI(file) return true end + + local copyFile = function(file) self:copyFile(file) end + local pasteHere = function(file) self:pasteHere(file) end + local cutFile = function(file) self:cutFile(file) end + local deleteFile = function(file) self:deleteFile(file) end + local fileManager = self + + function file_chooser:onFileHold(file) + --DEBUG("hold file", file) + self.file_dialog = FileDialog:new{ + buttons = { + { + { + text = _("Copy"), + callback = function() + copyFile(file) + UIManager:close(self.file_dialog) + end, + }, + { + text = _("Paste"), + enabled = fileManager.clipboard and true or false, + callback = function() + pasteHere(file) + self:changeToPath(util.realpath(file):match("(.*/)")) + UIManager:close(self.file_dialog) + end, + }, + }, + { + { + text = _("Cut"), + callback = function() + cutFile(file) + UIManager:close(self.file_dialog) + end, + }, + { + text = _("Delete"), + callback = function() + local path = util.realpath(file) + deleteFile(file) + self:changeToPath(path:match("(.*/)")) + UIManager:close(self.file_dialog) + end, + }, + }, + }, + } + UIManager:show(self.file_dialog) + return true + end self.layout = VerticalGroup:new{ self.banner, @@ -106,4 +209,26 @@ function FileManager:onClose() return true end +function FileManager:copyFile(file) + self.cutfile = false + self.clipboard = file +end + +function FileManager:cutFile(file) + self.cutfile = true + self.clipboard = file +end + +function FileManager:pasteHere(file) + if self.clipboard then + local program = self.cutfile and "mv " or "cp -r " + os.execute(program..util.realpath(self.clipboard).." "..util.realpath(file):match("(.*/)")) + end +end + +function FileManager:deleteFile(file) + local program = "rm -r " + os.execute(program..util.realpath(file)) +end + return FileManager diff --git a/frontend/ui/widget/filechooser.lua b/frontend/ui/widget/filechooser.lua index 12dfa681f..8cd17a57f 100644 --- a/frontend/ui/widget/filechooser.lua +++ b/frontend/ui/widget/filechooser.lua @@ -1,6 +1,7 @@ local Menu = require("ui/widget/menu") local Screen = require("ui/screen") local UIManager = require("ui/uimanager") +local DEBUG = require("dbg") -- lfs local FileChooser = Menu:extend{ @@ -79,9 +80,18 @@ function FileChooser:onMenuSelect(item) return true end +function FileChooser:onMenuHold(item) + self:onFileHold(item.path) + return true +end + function FileChooser:onFileSelect(file) UIManager:close(self) return true end +function FileChooser:onFileHold(file) + return true +end + return FileChooser diff --git a/frontend/ui/widget/menu.lua b/frontend/ui/widget/menu.lua index e2e00863e..17706dc43 100644 --- a/frontend/ui/widget/menu.lua +++ b/frontend/ui/widget/menu.lua @@ -143,6 +143,13 @@ function MenuItem:init() }, doc = "Select Menu Item", }, + HoldSelect = { + GestureRange:new{ + ges = "hold", + range = self.dimen, + }, + doc = "Hold Menu Item", + }, } end if Device:hasKeyboard() then @@ -246,6 +253,17 @@ function MenuItem:onTapSelect() return true end +function MenuItem:onHoldSelect() + self[1].invert = true + UIManager:setDirty(self.show_parent, "partial") + UIManager:scheduleIn(0.1, function() + self[1].invert = false + UIManager:setDirty(self.show_parent, "partial") + self.menu:onMenuHold(self.table) + end) + return true +end + --[[ Widget that displays menu --]] @@ -586,6 +604,13 @@ function Menu:onMenuChoice(item) return true end +--[[ +override this function to process the item hold in a different manner +]]-- +function Menu:onMenuHold(item) + return true +end + function Menu:onNextPage() if self.page < self.page_num then self.page = self.page + 1