Имеется панельный модуль (панель с флагом OPIF_REALNAMES, т.е. отражает реальные файлы).
На пассивной панели открыт быстрый просмотр (Quick View).
Требуется отобразить текущий файл на панели быстрого просмотра.
Можно, конечно, открывать файл через
viewer.Viewer
? но:а. Насколько я понимаю, это будет образование нового окна.
б. Для позднейшего закрытия просмотрщика потребуется его ID, но, в отличие от editor.Editor, viewer.Viewer не возвращает ID вновь образованного просмотрщика. И как определить? Перед viewer.Viewer запомнить список окон, а после получить его снова и сравнить? Некузяво как-то…
в. Есть ещё задача на QView-панели отражать "левый" файл (как это делают, например, плагины ArcLite, MultiArc и Observer).
Судя по тому, что ситуация распространённая, есть какой-то простой способ. Никак не могу найти…
- local F = far.Flags
- local sTitle ="WordWrap panel"
- local sTtl = 'SmpPan:'
- local sLabel = "WordWrapPanel"
- local BAX_GetMsg = require("BAX.GetMsg")
- local function SysGetMsg(...) return BAX_GetMsg([[%FarHome%\far*.lng]], ...) end
- --------------------------------------------------
- local function Config()
- local sPred = mf.mload('BAX', sLabel) or '… '
- sPred = far.InputBox(win.Uuid'6155276F-99A4-4B1C-90C8-809FFF9BF14B', sTitle, 'Введите префикс для строк продолжений', sLabel, sPred, nil,nil, bor(F.FIB_ENABLEEMPTY,F.FIB_BUTTONS,F.FIB_NOAMPERSAND) )
- if sPred then
- mf.msave('BAX', sLabel, sPred)
- end
- end -- Config
- --------------------------------------------------
- local Info = package.loaded.regscript or function(...) return ... end
- local nfo = Info {_filename or ...,
- name = sLabel;
- description = "Файловая панель с разрывом длинных имён файлов";
- version = "1.0.4"; --http://semver.org/lang/ru/
- author = "BAX";
- url = "https://forum.farmanager.com/viewtopic.php?f=4&t=12544&start=15";
- id = "DD51A0BD-CC5A-456B-BC96-79EF1F73DF19";
- history = [[
- 18.07.2021 v1.0.1 - стартовая версия
- 19.07.2021 v1.0.2:
- 1. Оформление скрипта.
- 2. Добавлена настройка на отступ и строку-признак продолжения.
- 19.07.2021 v1.0.3
- 1. Пропуск строк-продолжений при перемещении клавишами.
- 2. Возврат к стандартным панелям по F10.
- 3. Реализовано начальное позиционирование на текущий файл панели.
- 20.07.2021 v1.0.4
- 1. Исправлен мелкий недочёт в процедуре пропуска строк-продолжений. Проявлялся при
- попытке перейти с последнего файла к следующему.
- 2. Реализован выход в обычную панель с позиционированием на текущем файле (CtrlPgUp).
- 3. Автоматическое переформатирование строк-продолжений при изменении ширины столбца.
- Работает только если панель модуля активна, либо после её активации.
- ]];
- --parent_id = "";
- --minfarversion = {3,0,0,4744,0};
- --files = "*.cfg;*.ru.lng";
- config = function(nfo,name) Config() end;
- --help = function(nfo,name) end;
- --execute = function(nfo,name) end;
- --disabled = false;
- --options = {};
- }
- if not nfo then return end
- --local O = nfo.options
- --------------------------------------------------
- local mod = {}
- mod.Info = {
- Guid = win.Uuid("CEDE62F0-1BFF-43A7-8ABA-EBBF85FBE3EA")
- }
- local function AClone(tb)
- local res = {}
- local i,v = next(tb)
- while i do
- res[i] = v
- i,v = next(tb, i)
- end
- return res
- end -- AClone
- local function FileToObject(RetPath, CurrFile)
- local obj = {
- HostFile=APanel.HostFile;
- List={};
- Title=Object.Title;
- RetPath=panel.GetPanelDirectory(nil, 1);
- CurrFile = CurrFile;
- CurDir = RetPath.Name;
- }
- for i=1, APanel.ItemCount do
- local item = panel.GetPanelItem(nil, 1, i)
- if item.FileName ~= '..' then
- table.insert( obj.List, item)
- end
- end
- return obj
- end -- FileToObject
- local function NWidth()
- local cw, ct = panel.GetColumnWidths(nil,1), panel.GetColumnTypes(nil,1)
- local nI = 0
- for w in ct:gmatch"[^,]+" do
- nI = nI + 1
- if w == 'C0' or w:sub(1,1) == 'N' then break end
- end
- for w in cw:gmatch"[^,]+" do
- nI = nI - 1
- if nI == 0 then return tonumber(w) or 0 end
- end
- return 0
- end -- NWidth
- -----------------------------------------------------------
- local function SetPlugPos(handle, object)
- Panel.SetPos(panel.IsActivePanel(handle) and 0 or 1, object.CurrFile)
- object.CurrFile = nil
- end -- SetPlugPos
- function mod.GetFindData(object, handle, OpMode)
- local items = {}
- -----------------------------------------------------------
- local nWidth = NWidth()
- object.NWidth = nWidth
- for id,v in ipairs(object.List) do
- if v.FileName == '..' then
- table.insert(items, v)
- else
- local virt = false
- local FName = v.FileName
- local nPred, sPred = 0, mf.mload('BAX', sLabel) or '… '
- while FName ~= '' do
- local New = AClone(v)
- New.CustomColumnData = {sPred:sub(1,nPred) .. FName:sub(1, nWidth)}
- if virt then
- New.FileAttributes = (New.FileAttributes:match"d" or '') .. 'v'
- New.UserData = {}
- New.UserData.Tail = true
- else
- virt = true
- end
- table.insert(items, New)
- FName = FName:sub(nWidth - nPred+1)
- nPred = sPred:len()
- end
- end
- end
- --if panel.GetPanelInfo(nil, 0).PanelType == F.PTYPE_QVIEWPANEL and
- -- object.CurrFile ~= viewer.GetFileName(nil) then
- --end
- if object.CurrFile then
- mf.postmacro(SetPlugPos, handle, object)
- end
- return items
- end -- mod.GetFindData
- local PanelModesArray = {
- {ColumnTypes='C0,SC,D', ColumnWidths='0,10,0', ColumnTitles={'Name',SysGetMsg('MColumnSize'),SysGetMsg('MColumnDate')},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_ALIGNEXTENSIONS}; -- Alternamive full
- {ColumnTypes='C0,C0,C0', ColumnWidths='0,0,0', ColumnTitles={'Name','Name','Name'},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_ALIGNEXTENSIONS}; -- Brief
- {ColumnTypes='C0,C0', ColumnWidths='0,0', ColumnTitles={'Name','Name'},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_NONE}; -- Medium
- {ColumnTypes='C0,S,D,T', ColumnWidths='0,6,0,5', ColumnTitles={'Name',SysGetMsg('MColumnSize'),SysGetMsg('MColumnDate'),SysGetMsg('MColumnTime')},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_ALIGNEXTENSIONS}; -- Full
- {ColumnTypes='C0,S', ColumnWidths='0,6', ColumnTitles={'Name',SysGetMsg('MColumnSize')},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_NONE}; -- Wide
- {ColumnTypes='C0,S,P,DM,DC,DA,A', ColumnWidths='0,6,6,14,14,14,0', ColumnTitles={'Name',SysGetMsg('MColumnSize'),SysGetMsg('MColumnAlocatedSize'),SysGetMsg('MColumnWrited'),SysGetMsg('MColumnCreated'),SysGetMsg('MColumnAccessed'),SysGetMsg('MColumnAttr')},StatusColumnTypes='',StatusColumnWidths='', Flags=bor(F.PMFLAGS_ALIGNEXTENSIONS, F.PMFLAGS_FULLSCREEN)}; -- Detailed
- {ColumnTypes='C0,Z', ColumnWidths='40%,0', ColumnTitles={'Name',SysGetMsg('MColumnDescription')},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_ALIGNEXTENSIONS}; -- Descriptions
- {ColumnTypes='C0,S,Z', ColumnWidths='0,6,70%', ColumnTitles={'Name',SysGetMsg('MColumnSize'),SysGetMsg('MColumnDescription')},StatusColumnTypes='',StatusColumnWidths='', Flags=bor(F.PMFLAGS_ALIGNEXTENSIONS,F.PMFLAGS_FULLSCREEN)}; -- Long descriptions
- {ColumnTypes='C0,S,O', ColumnWidths='0,6,15', ColumnTitles={'Name',SysGetMsg('MColumnSize'),SysGetMsg('MColumnOwner')},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_ALIGNEXTENSIONS}; -- File owners
- {ColumnTypes='C0,S,LN', ColumnWidths='0,6,3', ColumnTitles={'Name',SysGetMsg('MColumnSize'),SysGetMsg('MColumnMumLinks')},StatusColumnTypes='',StatusColumnWidths='', Flags=F.PMFLAGS_ALIGNEXTENSIONS}; -- File links
- };
- function mod.GetOpenPanelInfo(object, handle)
- local PanelInfo = {
- Flags = bit64.bor(F.OPIF_NONE, F.OPIF_ADDDOTS, F.OPIF_REALNAMES);
- HostFile = object.HostFile;
- --CurDir = object.CurDir;
- Format = nil;
- PanelTitle = sTtl .. object.Title;
- InfoLines = nil;
- InfoLinesNumber = nil;
- DescrFiles = nil;
- PanelModesArray = PanelModesArray;
- PanelModesNumber = 10;
- StartSortMode = F.SM_UNSORTED;
- StartSortOrder = 0;
- KeyBar = nil;
- ShortcutData = "";
- FreeSize = nil;
- }
- return PanelInfo
- end -- mod.GetOpenPanelInfo
- local function ToFile(handle, OldFName)
- local whatpanel = panel.IsActivePanel(handle) and 1 or 0
- local WhatPanel = whatpanel==1 and 0 or 1
- local oPan = panel.IsActivePanel(handle) and APanel or PPanel
- local iPos = oPan.CurPos
- local Item = panel.GetCurrentPanelItem(handle, whatpanel)
- if Item.FileName == OldFName then
- -- Имя как у исходного - значит смещение вниз к следующему файлу
- for i=iPos+1, oPan.ItemCount do
- Item = panel.GetPanelItem(handle, whatpanel, i)
- if Item.FileName ~= OldFName then
- Panel.SetPosIdx(WhatPanel, i)
- return
- end
- end
- -- Сюда попадаю, если следующего файла нет. Поднимаюсь до первой строки файла.
- for i=iPos, 1, -1 do
- Item = panel.GetPanelItem(handle, whatpanel, i)
- if not (Item.UserData or {}).Tail then
- Panel.SetPosIdx(WhatPanel, i)
- return
- end
- end
- return
- end
- if (Item.UserData or {}).Tail then
- for i=iPos-1,1,-1 do
- Item = panel.GetPanelItem(handle, whatpanel, i)
- if not Item.UserData or not Item.UserData.Tail then
- Panel.SetPosIdx(WhatPanel, i)
- return
- end
- end
- end
- end -- ToFile
- function mod.ProcessPanelInput(object, handle, rec) -- export.ProcessPanelInput
- local nWidth = NWidth()
- if nWidth ~= object.NWidth then
- panel.UpdatePanel(handle,0)
- object.NWidth = nWidth
- end
- if panel.GetPanelInfo(nil, 0).PanelType == F.PTYPE_QVIEWPANEL
- --and object.CurrFile ~= viewer.GetFileName(nil)
- then
- --[[*D*]]win.OutputDebugString('BAX.PnMod.219: viewer.FileName='..tostring(viewer.GetFileName(nil)))
- local FName = panel.GetCurrentPanelItem(handle, 1).FileName
- --[[*D*]]win.OutputDebugString('BAX.PnMod.221: FName='..tostring(FName))
- --viewer.Viewer(object.CurrFile
- end
- if rec.EventType == F.KEY_EVENT then
- local key = far.InputRecordToName(rec)
- if key then
- if key == 'F10' or key == 'CtrlPgUp' then
- if true or key == 'CtrlPgUp' then
- local FName = (panel.IsActivePanel(handle) and APanel or PPanel).Current
- if FName ~= '..' then
- mf.postmacro(Panel.SetPos, panel.IsActivePanel(handle) and 0 or 1, FName)
- end
- end
- panel.ClosePanel(handle, object.CurDir)
- return true
- elseif (' Up Down PgUp PgDn End Home '):match(' ' .. key .. ' ') then
- local OldFName = (panel.IsActivePanel(handle) and APanel or PPanel).Current
- mf.postmacro(ToFile, handle, OldFName)
- --elseif key == 'CtrlPgDn' then
- end
- end
- end
- end -- mod.ProcessPanelInput
- ---------------------------------------------------------------------
- MenuItem {
- description = sTitle;
- menu = "Disks";
- area = "Shell";
- guid = "99FA139D-9523-40E9-AB6D-7363CB5D718E";
- text = sTitle;
- action = function(OpenFrom, Item)
- local NeedSw = (OpenFrom == F.OPEN_LEFTDISKMENU and PPanel.Left) or
- (OpenFrom == F.OPEN_RIGHTDISKMENU and not PPanel.Left)
- local ret1, ret2
- if NeedSw then panel.SetActivePanel(nil, 0) end
- ret1, ret2 = mod, FileToObject(panel.GetPanelDirectory(nil, 1), APanel.Current)
- if NeedSw then panel.SetActivePanel(nil, 0) end
- return ret1, ret2
- end;
- }
- ---------------------------------------------------------------------
- MenuItem {
- description = sTitle;
- menu = "Config";
- area = "Common";
- guid = "4B80D5A1-BD0A-4297-8B54-541F5EF888BD";
- text = sTitle;
- action = function(OpenFrom, Item)
- Config()
- end;
- }
- ---------------------------------------------------------------------
- PanelModule(mod)
GeSHi © Codebox Plus Extension