needs some more work, very basic progress-screens and dialogs
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 28 Jun 2009 11:03:29 +0000 (11:03 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 28 Jun 2009 11:03:29 +0000 (11:03 +0000)
Makefile.am
configure.ac
filebrowser/CONTROL/control [new file with mode: 0644]
filebrowser/Makefile.am [new file with mode: 0644]
filebrowser/src/LICENSE [new file with mode: 0644]
filebrowser/src/Makefile.am [new file with mode: 0644]
filebrowser/src/__init__.py [new file with mode: 0644]
filebrowser/src/plugin.py [new file with mode: 0644]

index 92dcac7..8e74506 100644 (file)
@@ -9,6 +9,7 @@ SUBDIRS = \
        emailclient \
        epgrefresh \
        epgsearch \
+       filebrowser \
        fritzcall \
        googlemaps \
        httpproxy \
index 63edb7a..29b08e4 100644 (file)
@@ -219,4 +219,7 @@ mytube/src/Makefile
 orfat/Makefile
 orfat/src/Makefile
 
+filebrowser/Makefile
+filebrowser/src/Makefile
+
 ])
diff --git a/filebrowser/CONTROL/control b/filebrowser/CONTROL/control
new file mode 100644 (file)
index 0000000..a9ea8ce
--- /dev/null
@@ -0,0 +1,10 @@
+Package: enigma2-plugin-extensions-filebrowser\r
+Version: 1.0\r
+Description: manage local Files\r
+Architecture: mipsel\r
+Section: extra\r
+Priority: optional\r
+Maintainer: 3c5x9 <3c5x9@gmx.net>\r
+Homepage: http://www.i-have-a-dreambox.com\r
+Depends: enigma2(>1.0cvs20090601)\r
+Source: http://enigma2-plugins.schwerkraft.elitedvb.net/\r
diff --git a/filebrowser/Makefile.am b/filebrowser/Makefile.am
new file mode 100644 (file)
index 0000000..308a09c
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS = src\r
diff --git a/filebrowser/src/LICENSE b/filebrowser/src/LICENSE
new file mode 100644 (file)
index 0000000..f208542
--- /dev/null
@@ -0,0 +1,14 @@
+Author: Rico Schulte, 3c5x9
+
+All Files of this Software are licensed under the Creative Commons
+Attribution-NonCommercial-ShareAlike 3.0 Unported
+License if not stated otherwise in a Files Head. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+Alternatively, this plugin may be distributed and executed on hardware which
+is licensed by Dream Multimedia GmbH.
+
+This plugin is NOT free software. It is open source, you are allowed to
+modify it (if you keep the license), but it may not be commercially
+distributed other than under the conditions noted above.
diff --git a/filebrowser/src/Makefile.am b/filebrowser/src/Makefile.am
new file mode 100644 (file)
index 0000000..6af9b1e
--- /dev/null
@@ -0,0 +1,4 @@
+installdir = /usr/lib/enigma2/python/Plugins/Extensions/Filebrowser\r
+\r
+install_PYTHON = __init__.py plugin.py\r
+install_DATA = LICENSE\r
diff --git a/filebrowser/src/__init__.py b/filebrowser/src/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/filebrowser/src/plugin.py b/filebrowser/src/plugin.py
new file mode 100644 (file)
index 0000000..971aa25
--- /dev/null
@@ -0,0 +1,311 @@
+from Plugins.Plugin import PluginDescriptor
+from Components.config import config, ConfigSubList, ConfigSubsection, ConfigInteger, ConfigYesNo, ConfigText, getConfigListEntry
+from Components.FileList import FileList
+from Components.ConfigList import ConfigListScreen
+from Screens.Console import Console
+from Screens.ChoiceBox import ChoiceBox
+from Screens.InputBox import InputBox
+from Screens.MessageBox import MessageBox
+from Components.Label import Label
+from Screens.Screen import Screen
+from Components.ActionMap import ActionMap
+from Components.Scanner import openFile
+from os.path import isdir as os_path_isdir
+from mimetypes import guess_type
+
+##################################
+pname = _("Filebrowser")
+pdesc = _("manage local Files")
+
+config.plugins.filebrowser = ConfigSubsection()
+config.plugins.filebrowser.savedirs = ConfigYesNo(default = True)
+config.plugins.filebrowser.add_mainmenu_entry = ConfigYesNo(default = True)
+config.plugins.filebrowser.add_extensionmenu_entry = ConfigYesNo(default = True)
+config.plugins.filebrowser.path_left = ConfigText(default = "/")
+config.plugins.filebrowser.path_right = ConfigText(default = "/")
+
+
+##################################
+class FilebrowserConfigScreen(ConfigListScreen,Screen):
+    skin = """
+        <screen position="100,100" size="550,400" title="" >
+            <widget name="config" position="0,0" size="550,360" scrollbarMode="showOnDemand" />
+            <widget name="buttonred" position="10,360" size="100,40" valign="center" halign="center" zPosition="1"  transparent="1" foregroundColor="white" font="Regular;18"/>
+            <widget name="buttongreen" position="120,360" size="100,40" valign="center" halign="center" zPosition="1"  transparent="1" foregroundColor="white" font="Regular;18"/>
+            <ePixmap name="pred" position="10,360" size="100,40" zPosition="0" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on"/>
+            <ePixmap name="pgreen" position="120,360" size="100,40" zPosition="0" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on"/>
+        </screen>"""
+    def __init__(self, session):
+        self.session = session
+        Screen.__init__(self, session)
+        self.list = []
+        self.list.append(getConfigListEntry(_("add Plugin to Mainmenu"), config.plugins.filebrowser.add_mainmenu_entry))
+        self.list.append(getConfigListEntry(_("add Plugin to Extensionmenu"), config.plugins.filebrowser.add_extensionmenu_entry))
+        self.list.append(getConfigListEntry(_("save Filesystemposition on exit"), config.plugins.filebrowser.savedirs))
+        self.list.append(getConfigListEntry(_("Filesystemposition list left"), config.plugins.filebrowser.path_left))
+        self.list.append(getConfigListEntry(_("Filesystemposition list right"), config.plugins.filebrowser.path_right))
+
+        ConfigListScreen.__init__(self, self.list)
+        self["buttonred"] = Label(_("cancel"))
+        self["buttongreen"] = Label(_("ok"))
+        self["setupActions"] = ActionMap(["SetupActions"],
+        {
+            "green": self.save,
+            "red": self.cancel,
+            "save": self.save,
+            "cancel": self.cancel,
+            "ok": self.save,
+        }, -2)
+        self.onLayoutFinish.append(self.onLayout)
+
+    def onLayout(self):
+        self.setTitle(pname+" "+_("Settings"))
+
+    def save(self):
+        print "saving"
+        for x in self["config"].list:
+            x[1].save()
+        self.close(True)
+
+    def cancel(self):
+        print "cancel"
+        for x in self["config"].list:
+            x[1].cancel()
+        self.close(False)
+
+
+##################################
+class FilebrowserScreen(Screen):
+    skin = """
+        <screen position="110,83" size="530,430" title="">
+            <widget name="list_left" position="0,0" size="265,380" scrollbarMode="showOnDemand" />
+            <widget name="list_right" position="265,0" size="265,380" scrollbarMode="showOnDemand" />
+
+            <widget name="red" position="10,390" size="120,30" valign="center" halign="center" zPosition="1" transparent="1" foregroundColor="white" font="Regular;18"/>
+            <widget name="green" position="140,390" size="120,30" valign="center" halign="center" zPosition="1" transparent="1" foregroundColor="white" font="Regular;18"/>
+            <widget name="yellow" position="270,390" size="120,30" valign="center" halign="center" zPosition="1" transparent="1" foregroundColor="white" font="Regular;18"/>
+            <widget name="blue" position="400,390" size="120,30" valign="center" halign="center" zPosition="1" transparent="1" foregroundColor="white" font="Regular;18"/>
+
+            <ePixmap name="pred" position="10,390" size="120,30" zPosition="0" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on"/>
+            <ePixmap name="pgreen" position="140,390" size="120,30" zPosition="0" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on"/>
+            <ePixmap name="pyellow" position="270,390" size="120,30" zPosition="0" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on"/>
+            <ePixmap name="pblue" position="400,390" size="120,30" zPosition="0" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on"/>
+        </screen>
+        """
+    def __init__(self, session,path_left=None):
+        if path_left is None:
+            if os_path_isdir(config.plugins.filebrowser.path_left.value) and config.plugins.filebrowser.savedirs.value:
+                path_left = config.plugins.filebrowser.path_left.value
+            else:
+                path_left = "/"
+
+        if os_path_isdir(config.plugins.filebrowser.path_right.value) and config.plugins.filebrowser.savedirs.value:
+            path_right = config.plugins.filebrowser.path_right.value
+        else:
+            path_right = "/"
+
+        self.session = session
+        Screen.__init__(self, session)
+
+        self["list_left"] = FileList(path_left, matchingPattern = "^.*")
+        self["list_right"] = FileList(path_right, matchingPattern = "^.*")
+        self["red"] = Label(_("delete"))
+        self["green"] = Label(_("move"))
+        self["yellow"] = Label(_("copy"))
+        self["blue"] = Label(_("rename"))
+
+
+        self["actions"] = ActionMap(["ChannelSelectBaseActions","WizardActions", "DirectionActions","MenuActions","NumberActions","ColorActions"],
+            {
+             "ok":      self.ok,
+             "back":    self.exit,
+             "menu":    self.goMenu,
+             "nextMarker": self.listRight,
+             "prevMarker": self.listLeft,
+             "up": self.goUp,
+             "down": self.goDown,
+             "left": self.goLeft,
+             "right": self.goRight,
+             "red": self.goRed,
+             "green": self.goGreen,
+             "yellow": self.goYellow,
+             "blue": self.goBlue,
+             "0": self.doRefresh,
+             }, -1)
+        self.onLayoutFinish.append(self.listLeft)
+
+    def exit(self):
+        if self["list_left"].getCurrentDirectory() and config.plugins.filebrowser.savedirs.value:
+            config.plugins.filebrowser.path_left.value = self["list_left"].getCurrentDirectory()
+            config.plugins.filebrowser.path_left.save()
+
+        if self["list_right"].getCurrentDirectory() and config.plugins.filebrowser.savedirs.value:
+            config.plugins.filebrowser.path_right.value = self["list_right"].getCurrentDirectory()
+            config.plugins.filebrowser.path_right.save()
+
+        self.close()
+
+    def ok(self):
+        if self.SOURCELIST.canDescent(): # isDir
+            self.SOURCELIST.descent()
+            if self.SOURCELIST.getCurrentDirectory(): #??? when is it none
+                self.setTitle(self.SOURCELIST.getCurrentDirectory())
+        else:
+            self.onFileAction()
+
+    def goMenu(self):
+        self.session.open(FilebrowserConfigScreen)
+
+    def goLeft(self):
+        self.SOURCELIST.pageUp()
+
+    def goRight(self):
+        self.SOURCELIST.pageDown()
+
+    def goUp(self):
+        self.SOURCELIST.up()
+
+    def goDown(self):
+        self.SOURCELIST.down()
+
+    # copy ###################
+    def goYellow(self):
+        filename = self.SOURCELIST.getFilename()
+        sourceDir = self.SOURCELIST.getCurrentDirectory()
+        targetDir = self.TARGETLIST.getCurrentDirectory()
+        self.session.openWithCallback(self.doCopy,ChoiceBox, title = _("copy file")+"?\n%s\nfrom\n%s\n%s"%(filename,sourceDir,targetDir),list=[(_("yes"), True ),(_("no"), False )])
+
+    def doCopy(self,result):
+        if result is not None:
+            if result[1]:
+                filename = self.SOURCELIST.getFilename()
+                sourceDir = self.SOURCELIST.getCurrentDirectory()
+                targetDir = self.TARGETLIST.getCurrentDirectory()
+                self.session.openWithCallback(self.doCopyCB,Console, title = _("copying file ..."), cmdlist = ["cp \""+sourceDir+filename+"\" \""+targetDir+"\""])
+
+    def doCopyCB(self):
+        self.doRefresh()
+
+    # delete ###################
+    def goRed(self):
+        filename = self.SOURCELIST.getFilename()
+        sourceDir = self.SOURCELIST.getCurrentDirectory()
+        self.session.openWithCallback(self.doDelete,ChoiceBox, title = _("delete file")+"?\n%s\nfrom dir\n%s"%(filename,sourceDir),list=[(_("yes"), True ),(_("no"), False )])
+
+    def doDelete(self,result):
+        if result is not None:
+            if result[1]:
+                filename = self.SOURCELIST.getFilename()
+                sourceDir = self.SOURCELIST.getCurrentDirectory()
+                self.session.openWithCallback(self.doDeleteCB,Console, title = _("deleting file ..."), cmdlist = ["rm \""+sourceDir+filename+"\""])
+
+    def doDeleteCB(self):
+        self.doRefresh()
+
+    # move ###################
+    def goGreen(self):
+        filename = self.SOURCELIST.getFilename()
+        sourceDir = self.SOURCELIST.getCurrentDirectory()
+        targetDir = self.TARGETLIST.getCurrentDirectory()
+        self.session.openWithCallback(self.doMove,ChoiceBox, title = _("move file")+"?\n%s\nfrom dir\n%s\nto dir\n%s"%(filename,sourceDir,targetDir),list=[(_("yes"), True ),(_("no"), False )])
+
+    def doMove(self,result):
+        if result is not None:
+            if result[1]:
+                filename = self.SOURCELIST.getFilename()
+                sourceDir = self.SOURCELIST.getCurrentDirectory()
+                targetDir = self.TARGETLIST.getCurrentDirectory()
+                self.session.openWithCallback(self.doMoveCB,Console, title = _("moving file ..."), cmdlist = ["mv \""+sourceDir+filename+"\" \""+targetDir+"\""])
+
+    def doMoveCB(self):
+        self.doRefresh()
+
+    # move ###################
+    def goBlue(self):
+        filename = self.SOURCELIST.getFilename()
+        sourceDir = self.SOURCELIST.getCurrentDirectory()
+        self.session.openWithCallback(self.doRename,InputBox,text=filename, title = filename, windowTitle=_("rename file"))
+
+    def doRename(self,newname):
+        if newname:
+            filename = self.SOURCELIST.getFilename()
+            sourceDir = self.SOURCELIST.getCurrentDirectory()
+            self.session.openWithCallback(self.doRenameCB,Console, title = _("renaming file ..."), cmdlist = ["mv \""+sourceDir+filename+"\" \""+sourceDir+newname+"\""])
+
+    def doRenameCB(self):
+        self.doRefresh()
+
+    #############
+    def doRefresh(self):
+        self.SOURCELIST.refresh()
+        self.TARGETLIST.refresh()
+
+    def listRight(self):
+        self["list_left"].selectionEnabled(0)
+        self["list_right"].selectionEnabled(1)
+        self.SOURCELIST = self["list_right"]
+        self.TARGETLIST = self["list_left"]
+        self.setTitle(self.SOURCELIST.getCurrentDirectory())
+
+    def listLeft(self):
+        self["list_left"].selectionEnabled(1)
+        self["list_right"].selectionEnabled(0)
+        self.SOURCELIST = self["list_left"]
+        self.TARGETLIST = self["list_right"]
+        self.setTitle(self.SOURCELIST.getCurrentDirectory())
+
+    def onFileAction(self):
+        try:
+            x = openFile(self.session,guess_type(self.SOURCELIST.getFilename())[0],self.SOURCELIST.getCurrentDirectory()+self.SOURCELIST.getFilename())
+            print "RESULT OPEN FILE",x
+        except TypeError,e:
+            # catching error
+            #  File "/home/tmbinc/opendreambox/1.5/dm8000/experimental/build/tmp/work/enigma2-2.6git20090627-r1/image/usr/lib/enigma2/python/Components/Scanner.py", line 43, in handleFile
+            #  TypeError: 'in <string>' requires string as left operand
+            self.session.open(MessageBox,_("no Viewer installed for this mimetype!"), type = MessageBox.TYPE_ERROR, timeout = 5, close_on_any_key = True)
+
+
+
+##################################
+
+def filescan_open(list, session, **kwargs):
+    path = "/".join(list[0].path.split("/")[:-1])+"/"
+    session.open(FilebrowserScreen,path_left=path)
+
+def start_from_filescan(**kwargs):
+    from Components.Scanner import Scanner, ScanPath
+    return \
+        Scanner(mimetypes=None,
+            paths_to_scan =
+                [
+                    ScanPath(path = "", with_subdirs = False),
+                ],
+            name = pname,
+            description = pdesc,
+            openfnc = filescan_open,
+        )
+
+def start_from_mainmenu(menuid, **kwargs):
+    #starting from main menu
+    if menuid == "mainmenu":
+        return [(pname, start_from_pluginmenu, "filecommand", 46)]
+    return []
+
+def start_from_pluginmenu(session,**kwargs):
+    session.open(FilebrowserScreen)
+
+def Plugins(path,**kwargs):
+    desc_mainmenu  = PluginDescriptor(name=pname, description=pdesc,  where = PluginDescriptor.WHERE_MENU, fnc = start_from_mainmenu)
+    desc_pluginmenu = PluginDescriptor(name=pname, description=pdesc,  where = PluginDescriptor.WHERE_PLUGINMENU, fnc = start_from_pluginmenu)
+    desc_extensionmenu = PluginDescriptor(name=pname, description=pdesc, where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc = start_from_pluginmenu)
+    desc_filescan = PluginDescriptor(name=pname, where = PluginDescriptor.WHERE_FILESCAN, fnc = start_from_filescan)
+    list = []
+    list.append(desc_pluginmenu)
+    #buggie list.append(desc_filescan)
+    if config.plugins.filebrowser.add_extensionmenu_entry.value:
+        list.append(desc_extensionmenu)
+    if config.plugins.filebrowser.add_mainmenu_entry.value:
+        list.append(desc_mainmenu)
+    return list
+
+