diff options
Diffstat (limited to 'python/configs/plug')
-rw-r--r-- | python/configs/plug/far2l/pluginmanager.py | 143 |
1 files changed, 120 insertions, 23 deletions
diff --git a/python/configs/plug/far2l/pluginmanager.py b/python/configs/plug/far2l/pluginmanager.py index 35e481f4..172d7506 100644 --- a/python/configs/plug/far2l/pluginmanager.py +++ b/python/configs/plug/far2l/pluginmanager.py @@ -22,27 +22,22 @@ ffic = ffi.dlopen('c') from . import ( udialog, ucharmap, + upanel, ) class PluginManager: Info = None def __init__(self): - self.plugins = [] - self.menu2plugin = {} - self.conf2plugin = {} - self.cmd2plugin = {} self.openplugins = {} + self.plugins = [] self.AddPlugin(udialog) self.AddPlugin(ucharmap) + self.AddPlugin(upanel) def AddPlugin(self, plugin): - n = len(self.plugins) self.plugins.append(plugin) - self.menu2plugin[n] = plugin - self.conf2plugin[n] = plugin - self.cmd2plugin[n] = plugin def debugger(self): # in another window type: nc 127.0.0.1 7654 @@ -52,20 +47,72 @@ class PluginManager: #print('SetStartupInfo %08X' % Info) self.Info = ffi.cast("struct PluginStartupInfo *", Info) + def area2where(self, area): + cvt = { + 'disk': ffic.OPEN_DISKMENU, + 'plugins': ffic.OPEN_PLUGINSMENU, + 'find': ffic.OPEN_FINDLIST, + 'shortcut': ffic.OPEN_SHORTCUT, + 'shell': ffic.OPEN_COMMANDLINE, + 'editor': ffic.OPEN_EDITOR, + 'viewer': ffic.OPEN_VIEWER, + 'panel': ffic.OPEN_FILEPANEL, + 'dialog': ffic.OPEN_DIALOG, + 'analyse': ffic.OPEN_ANALYSE, + } + where = 0 + for area in area.split(): + where |= 1<<cvt[area.lower()] + return where + + def getplugin(self, hPlugin): + v = self.openplugins.get(hPlugin, None) + if v is None: + class Nop: + def __getattr__(self, name): + print('Nop.', name) + return self + def __call__(self, *args): + print('Nop(', name,')') + return None + v = Nop + return v + def GetPluginInfo(self, Info): #print('GetPluginInfo %08X' % Info) Info = ffi.cast("struct PluginInfo *", Info) + self._DiskItems = [] self._MenuItems = [] self._ConfigItems = [] - for plugin in self.plugins: - if plugin.Plugin.menu: - self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.menu)) + print('GetPluginInfo') + for plugin in sorted(self.plugins, key=lambda plugin: plugin.Plugin.label): + where = self.area2where(plugin.Plugin.area) + print(plugin.Plugin.label, '%08X'%where) + if where & 1<<ffic.OPEN_DISKMENU: + self._DiskItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) if plugin.Plugin.conf: - self._ConfigItems.append(ffi.new("wchar_t []", plugin.Plugin.conf)) + self._ConfigItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + # find + # shortcut + if where & 1<<ffic.OPEN_PLUGINSMENU: + self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + elif where & 1<<ffic.OPEN_COMMANDLINE: + self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + elif where & 1<<ffic.OPEN_EDITOR: + self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + elif where & 1<<ffic.OPEN_VIEWER: + self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + elif where & 1<<ffic.OPEN_FILEPANEL: + self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + elif where & 1<<ffic.OPEN_DIALOG: + self._MenuItems.append(ffi.new("wchar_t []", plugin.Plugin.label)) + # analyse + self.DiskItems = ffi.new("wchar_t *[]", self._DiskItems) self.MenuItems = ffi.new("wchar_t *[]", self._MenuItems) self.ConfigItems = ffi.new("wchar_t *[]", self._ConfigItems) Info.Flags = ffic.PF_EDITOR |ffic.PF_VIEWER |ffic.PF_DIALOG - Info.DiskMenuStringsNumber = 0 + Info.DiskMenuStrings = self.DiskItems + Info.DiskMenuStringsNumber = len(self._DiskItems) Info.PluginMenuStrings = self.MenuItems Info.PluginMenuStringsNumber = len(self._MenuItems) Info.PluginConfigStrings = self.ConfigItems @@ -74,58 +121,97 @@ class PluginManager: def ClosePlugin(self, hPlugin): print('ClosePlugin %08X' % hPlugin) + plugin = self.openplugins.get(hPlugin, None) + if plugin is not None: + plugin.Close() + del self.openplugins[hPlugin] def Compare(self, hPlugin, PanelItem1, PanelItem2, Mode): print('Compare', hPlugin, PanelItem1, PanelItem2, Mode) + plugin = self.getplugin(hPlugin) + return plugin.Compare(PanelItem1, PanelItem2, Mode) def Configure(self, ItemNumber): print('Configure', ItemNumber) def DeleteFiles(self, hPlugin, PanelItem, ItemsNumber, OpMode): print('DeleteFiles', hPlugin, PanelItem, ItemsNumber, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.DeleteFiles(PanelItem, ItemsNumber, OpMode) def ExitFAR(self): print('ExitFAR') def FreeFindData(self, hPlugin, PanelItem, ItemsNumber): print('FreeFindData', hPlugin, PanelItem, ItemsNumber) + plugin = self.getplugin(hPlugin) + return plugin.FreeFindData(PanelItem, ItemsNumber) def FreeVirtualFindData(self, hPlugin, PanelItem, ItemsNumber): print('FreeVirtualData', hPlugin, PanelItem, ItemsNumber) + plugin = self.getplugin(hPlugin) + return plugin.FreeVirtualFindData(PanelItem, ItemsNumber) def GetFiles(self, hPlugin, PanelItem, ItemsNumber, Move, DestPath, OpMode): print('GetFiles', hPlugin, PanelItem, ItemsNumber, Move, DestPath, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.GetFiles(PanelItem, ItemsNumber, Move, DestPath, OpMode) def GetFindData(self, hPlugin, PanelItem, ItemsNumber, OpMode): print('GetFindData', hPlugin, PanelItem, ItemsNumber, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.GetFindData(PanelItem, ItemsNumber, OpMode) def GetMinFarVersion(self): print('GetMinFarVersion') def GetOpenPluginInfo(self, hPlugin, OpenInfo): print('GetOpenPluginInfo', hPlugin, OpenInfo) + plugin = self.getplugin(hPlugin) + return plugin.GetOpenPluginInfo(OpenInfo) def GetVirtualFindData(self, hPlugin, PanelItem, ItemsNumber, Path): print('GetVirtualFindData', hPlugin, PanelItem, ItemsNumber, Path) + plugin = self.getplugin(hPlugin) + return plugin.GetVirtualFindData(PanelItem, ItemsNumber, Path) def MakeDirectory(self, hPlugin, Name, OpMode): print('MakeDirectory', hPlugin, Name, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.MakeDirectory(PanelItem, Name, OpMode) def OpenFilePlugin(self, Name, Data, DataSize, OpMode): print('OpenFilePlugin', Name, Data, DataSize, OpMode) def OpenPlugin(self, OpenFrom, Item): + print('OpenPlugin:', OpenFrom, Item) if OpenFrom == ffic.OPEN_COMMANDLINE: line = ffi.string(ffi.cast("wchar_t *", Item)) - print('OpenFrom:', OpenFrom, line) - plugin = self.cmd2plugin[0].Plugin(self, self.Info, ffi, ffic) - rc = plugin.HandleCommandLine(line) - if rc not in (-1, None): - rc = id(plugin) - self.openplugins[rc] = plugin - return rc - print('OpenPlugin', OpenFrom, Item) - plugin = self.cmd2plugin[Item].Plugin(self, self.Info, ffi, ffic) + print('cmd:', line) + return + this = None + no = 0 + for plugin in sorted(self.plugins, key=lambda plugin: plugin.Plugin.label): + where = self.area2where(plugin.Plugin.area) + print(1, plugin.Plugin.label, '|', plugin.Plugin.area, '|', '%04X'%(1<<OpenFrom), 'where:', '%04X'%where, 'mask:', (1<<OpenFrom)&where, 'no:', no, 'Item', Item) + if (1<<OpenFrom) & where: + if no == Item: + this = plugin + break + no += 1 + if this is None: + for plugin in sorted(self.plugins, key=lambda plugin: plugin.Plugin.label): + where = self.area2where(plugin.Plugin.area) + print(2, plugin.Plugin.label, '|', plugin.Plugin.area, '|', '%04X'%(1<<OpenFrom), 'where:', '%04X'%where, 'mask:', (1<<OpenFrom)&where, 'no:', no, 'Item', Item) + if where & 1<<ffic.OPEN_PLUGINSMENU: + if no == Item: + this = plugin + break + no += 1 + if not this: + print('unknown') + return + plugin = this.Plugin(self, self.Info, ffi, ffic) rc = plugin.OpenPlugin(OpenFrom) if rc not in (-1, None): rc = id(plugin) @@ -145,13 +231,18 @@ class PluginManager: def ProcessEvent(self, hPlugin, Event, Param): #print('ProcessEvent', hPlugin, Event, Param) - pass + plugin = self.getplugin(hPlugin) + return plugin.ProcessEvent(Event, Param) def ProcessHostFile(self, hPlugin, PanelItem, ItemsNumber, OpMode): print('ProcessHostFile', hPlugin, PanelItem, ItemsNumber, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.ProcessHostFile(PanelItem, ItemsNumber, OpMode) def ProcessKey(self, hPlugin, Key, ControlState): print('ProcessKey', hPlugin, Key, ControlState) + plugin = self.getplugin(hPlugin) + return plugin.ProcessKey(Key, ControlState) def ProcessSynchroEvent(self, Event, Param): #print('ProcessSynchroEvent', Event, Param) @@ -163,9 +254,15 @@ class PluginManager: def PutFiles(self, hPlugin, PanelItem, ItemsNumber, Move, SrcPath, OpMode): print('PutFiles', hPlugin, PanelItem, ItemsNumber, Move, SrcPath, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.PutFiles(PanelItem, ItemsNumber, Move, SrcPath, OpMode) def SetDirectory(self, hPlugin, Dir, OpMode): print('SetDirectory', hPlugin, Dir, OpMode) + plugin = self.getplugin(hPlugin) + return plugin.SetDirectory(Dir, OpMode) def SetFindList(self, hPlugin, PanelItem, ItemsNumber): print('SetFindList', hPlugin, PanelItem, ItemsNumber) + plugin = self.getplugin(hPlugin) + return plugin.SetFindList(PanelItem, ItemsNumber) |