File: upanel.py

package info (click to toggle)
far2l 2.7.0~beta%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,304 kB
  • sloc: cpp: 263,566; ansic: 53,886; python: 7,048; sh: 1,516; perl: 410; javascript: 279; xml: 145; makefile: 31
file content (126 lines) | stat: -rw-r--r-- 4,451 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import os
import logging
from far2l.plugin import PluginVFS


log = logging.getLogger(__name__)


class Screen:
    def __init__(self, parent):
        self.parent = parent
        self.hScreen = None

    def __enter__(self):
        self.hScreen = self.parent.info.SaveScreen(0, 0, -1, -1)

    def __exit__(self, *args):
        self.parent.info.RestoreScreen(self.hScreen)


class Plugin(PluginVFS):
    label = "Python upanel"
    openFrom = ["PLUGINSMENU", "DISKMENU"]

    def OpenPlugin(self, OpenFrom):
        self.Root = "PythonPanel"
        self.names = []
        self.Items = []
        return True

    def GetOpenPluginInfo(self, OpenInfo):
        # dangeling refs
        self._Root = self.s2f(self.Root)
        self._label = self.s2f(self.label)
        # /dangeling refs
        Info = self.ffi.cast("struct OpenPluginInfo *", OpenInfo)
        Info.Flags = (
            self.ffic.OPIF_USEFILTER
            | self.ffic.OPIF_USESORTGROUPS
            | self.ffic.OPIF_USEHIGHLIGHTING
            | self.ffic.OPIF_ADDDOTS
            | self.ffic.OPIF_SHOWNAMESONLY
        )
        Info.HostFile = self.ffi.NULL
        Info.CurDir = self._Root
        Info.Format = self._label
        Info.PanelTitle = self._label

    def GetFindData(self, PanelItem, ItemsNumber, OpMode):
        log.debug(
            "VFS.GetFindData({0}, {1}, {2})".format(PanelItem, ItemsNumber, OpMode)
        )
        PanelItem = self.ffi.cast("struct PluginPanelItem **", PanelItem)
        ItemsNumber = self.ffi.cast("int *", ItemsNumber)
        n = len(self.Items)
        p = self.ffi.NULL if n == 0 else self.Items
        PanelItem[0] = p
        ItemsNumber[0] = n
        return 1

    def SetDirectory(self, Dir, OpMode):
        if OpMode & self.ffic.OPM_FIND:
            return 0
        self.info.Control(self.hplugin, self.ffic.FCTL_CLOSEPLUGIN, 0, 0)
        return 1

    def PutFiles(self, PanelItem, ItemsNumber, Move, SrcPath, OpMode):
        PanelItem = self.ffi.cast("struct PluginPanelItem *", PanelItem)
        SrcPath = self.f2s(SrcPath)
        for i in range(ItemsNumber):
            self.PutFile(PanelItem[i], Move, SrcPath, OpMode)
        return 1

    def PutFile(self, PanelItem, Move, SrcPath, OpMode):
        fqname = os.path.join(SrcPath, self.f2s(PanelItem.FindData.lpwszFileName))
        # increase C array
        items = self.ffi.new("struct PluginPanelItem []", len(self.Items) + 1)
        for i in range(len(self.Items)):
            items[i] = self.Items[i]
        self.Items = items
        # append element
        self.names.append(self.s2f(fqname))
        i = len(self.Items) - 1
        items[i].FindData = PanelItem.FindData
        items[i].FindData.lpwszFileName = self.names[i]

    def DeleteFiles(self, PanelItem, ItemsNumber, OpMode):
        item = self.ffi.cast("struct PluginPanelItem *", PanelItem)
        snames = []
        for i in range(ItemsNumber):
            snames.append(self.f2s(item[i].FindData.lpwszFileName))
        found = []
        for i in range(len(self.names)):
            if self.f2s(self.names[i]) in snames:
                found.append(i)
        if len(found) == 0:
            return 0
        # new array
        items = self.ffi.new("struct PluginPanelItem []", len(self.Items) - len(found))
        j = 0
        for i in range(len(self.Items)):
            if i not in found:
                items[j] = self.Items[i]
                j += 1
        # delete
        for i in sorted(found, reverse=True):
            del self.names[i]
        self.Items = items
        self.info.Control(self.hplugin, self.ffic.FCTL_UPDATEPANEL, 0, 0)
        self.info.Control(self.hplugin, self.ffic.FCTL_REDRAWPANEL, 0, 0)
        return 0

    def GetFiles(self, PanelItem, ItemsNumber, Move, DestPath, OpMode):
        if ItemsNumber == 0 or Move:
            return 0
        item = self.ffi.cast("struct PluginPanelItem *", PanelItem)
        DestPath = self.ffi.cast("wchar_t **", DestPath)
        dpath = self.ffi.string(DestPath[0])
        for i in range(ItemsNumber):
            sqname = self.f2s(item[i].FindData.lpwszFileName)
            dqname = os.path.join(dpath, sqname.split("/")[-1])
            # log.debug('GetFiles OpMode={} source={} destination={}'.format(OpMode, sqname, dqname))
            # just copy file, local filesystem only
            data = open(sqname, "rb").read()
            open(dqname, "wb").write(data)
        return 1