Orion9

|
Posted: Tue Jan 21, 2025 14:05 Post subject: |
|
|
AkulaBig wrote: | Я все-же не пойму, зачем вы Ирфан разбираете по значкам, когда он прекрасно работает с одной строкой. |
Плюсы такого разбора очевидны: каждый значок можно индивидуально назначить. Мне, например, не нравятся некоторые "салатовые" значки IrfanView, поэтому значительная часть значков у меня берется из других библиотек, например из FSView.dll или той же ACDSee.dll. Конечно, такое сопоставление придется делать вручную, но зато на панелях ТС будут только те значки, которые вам нравятся. Более того, при простом копировании папки ТС, именно благодаря тому, что все значки и ассоциации выстроены "внутренне", всё будет работать и отображаться так, как вы привыкли, даже на чистой Windows, где нет никаких просмотрщиков и другого установленного софта.
Map-файл на FSView.dll:
 Hidden text arw=18
bmp=00
cr2=01
crw=02
dwg=14
gif=03
jpg=04
mrw=15
nef=05
orf=12
pcx=06
pef=16
png=07
psd=08
raf=13
rw2=19
srf=17
tga=09
tif=10
wmf=11
Доработал код и оформил в виде кнопки:
 Hidden text Code: | Func IconMap(lParam)
Local map, lib, cmd, idx = 0
Local cfg = %COMMANDER_PATH% & "\Ini\IconsMap.ini"
If Not FileExist(cfg) Then
ShowHint("Не найден " & cfg)
Return
Endif
If IsPressed(0x10) Then
CommandExec /CD:S %cfg%
Return
Endif
If Not IsPressed(0x11) Then
ShellExec "%cfg%"
Return
EndIf
IniRead map %cfg% "Config" "MapFile"
IniRead lib %cfg% "Config" "IconLib"
IniRead cmd %cfg% "Config" "CmdOpen"
IniRead idx %cfg% "Config" "Index" 1
If Not FileExist(map) Then
ShowHint("Не найден " & map)
Return
Endif
AssocIconsMap(map, idx, lib, cmd)
EndFunc
Func AssocIconsMap(MapFile, StartIdx, IconLib, CmdOpen)
Local out, ext, idx
ProcessExecGetOutput out %COMSPEC% '/c type "%MapFile%"'
Local aMap = List(), j
aMap.Text = out
out = ""
For j = 0 To aMap.Count - 1
ext = StrPart(aMap[j], "=", 1)
idx = StrPart(aMap[j], "=", 2)
out &= auCRLF & "Filter" & StartIdx + j & "=*." & ext
out &= auCRLF & "Filter" & StartIdx + j & ".icon=" & IconLib & ","& idx
out &= auCRLF & "Filter" & StartIdx + j & "_open=" & CmdOpen
Next
ClipPut(out)
ShowHint("Скопировано в буфер.")
EndFunc
|
 Hidden text Code: | TOTALCMD#BAR#DATA
61004
%COMMANDER_EXE%
Создание [Associations]|Ctrl - Создание новых ключей
1
-1
|
Теперь параметрами операции можно управлять через \Ini\IconsMap.ini. Файл должен существовать:
 Hidden text Code: | [Config]
MapFile=%COMMANDER_PATH%\Icons\PotPlayer.map
IconLib=%COMMANDER_PATH%\Icons\PotPlayer.dll
;MapFile=%COMMANDER_PATH%\Icons\IrfanView.map
;IconLib=%COMMANDER_PATH%\Icons\IrfanView.dll
Index=80
;CmdOpen=""%COMMANDER_VIEWER%" "%1""
CmdOpen=""%COMMANDER_PATH%\Plugins\wlx\TCIrfanView\IrfanView\i_view32.exe" "%1"" |
AkulaBig wrote: | А в моей сборке PotPlayer никогда не будет...а иметь портабельную сборку хочется. |
Именно потому, что раньше в ТС не было своего плеера, я прикручивал к нему PotPlayer. Но и сейчас отказываться от этого не буду - уже привык, что он на борту и со всеми внутренними связями и значками. Кстати, у PotPlayer три библиотеки значков. Связав ассоциации, как на примере выше, можно добиться очень интересного эффекта: простым переименованием или заменой PotPlayer.dll - меняются все значки сразу. Помимо этого, интересного эффекта можно добится, если не указывать прямого пути к плееру, а сделать ассоциацию с переменной окружения, например %COMMANDER_VIDEO%. Теперь достаточно в Autorun менять содержимое этой переменной на лету (или только при запуске), чтобы указывать, кто должен открывать эти типы файлов.
Еще один шикарный эффект. Из справочника по ключам:
Russian.cedf wrote: | Команда ***имя_внутренней_команды позволяет выполнить для файла указанного типа заданную встроенную или пользовательскую команду TC, в т.ч. с параметрами (в последнем случае указывается не только имя команды, но и соответствующий параметр или их набор, причём параметры, содержащие запятую, должны быть взяты в двойные кавычки). Внутренние команды, не начинающиеся с префикса cm_ или em, не требуют при назначении начальных звёздочек (примеры: OPENTABS %1% для TAB-файла, OPENBARMENU %1% для BAR-файла), также для них поддерживаются во внутренних ассоциациях шаблоны-параметры наподобие %P%N.
|
Раньше у меня была такая ассоциация:
Code: | Filter14=*.dll;*.ocx;*.ax
Filter14_open=""%COMMANDER_EXE%" /S=L:Piclview "%1""
Filter14.icon=* |
Но оказывается можно запросто вызывать функцию Autorun по коду:
Code: | Filter14_open=***61005 |
Это открывает некоторые возможности. Например, можно вызывать действие с клавишей-модификатором:
Code: | RegisterCommand 61005 "AssocDllOpenCmd"
Func AssocDllOpenCmd(lParam)
If IsPressed(0x5B) Then
ShowHint("Win")
Return
EndIf
If IsPressed(0x10) Then
IconsPanel()
Else
#SendCommand cm_List
p = RequestCopyDataInfo("SP")
n = RequestCopyDataInfo("SN")
f = p & n
ShellExec %COMMANDER_EXE% '/S=L:Piclview "%f%""'
EndIf
EndFunc
|
Здесь с зажатым Shift вызывается функция IconsPanel, которая загружает иконки на главную панель, а простой вызов запускает Листер, предподчительно с просмотром иконок, если он есть. Функция IconsPanel:
 Hidden text Code: | RegisterCommand 62005 "IconsPanel"
Func IconsPanel(Silent = 0)
Local p, n, f, hint, icons
p = RequestCopyDataInfo("SP")
n = RequestCopyDataInfo("SN")
f = p & n
If Not FileExist(f) Then
ShowHint("Файл не существует " & f)
Return
Endif
If StrPos(FileGetAttr(f), "D") Then
ShowHint("Каталог")
Return
Endif
obj = Plugin("IconLibrary")
If ERROR = 0 then
obj.FileName = f
icons = obj.GetValue(0)
If icons > 0 then
hint = "Иконок: " & icons
CreateIconsBar(f, icons)
Else
hint = "Нет иконок"
Endif
hint &= & auCRLF & "Файл " & f
Free(obj)
Else
hint = "Plugin Error " & ERROR
Endif
If icons = 0 Then ShowHint(hint)
EndFunc
Func CreateIconsBar(FileName, Icons)
Local p = BarsPath
Local n = "Auto_icons"
Local bar = p & n & ".bar", i = 0
ShowDarkHint("Загрузка иконок", 0)
If Not CreateNewBar(p, n) Then
ShowDarkHint("Отмена операции", 0)
Return
EndIf
For i = 2 to Icons+1
IniWrite %bar% "Buttonbar" %"'Cmd' & %i%" "100000"
IniWrite %bar% "Buttonbar" %"'Menu' & %i%" %"%i%-2"
IniWrite %bar% "Buttonbar" %"'Button' & %i%" %"%FileName% & ','& %i%-2"
Next
IniWrite %bar% "Buttonbar" "Buttoncount" %"%Icons%+1"
ShowDarkHint("Панель." & auCRLF & i-1 & " кнопок создано.", 0)
CommandExec("em_open_icons_panel")
EndFunc |
AkulaBig wrote: | Но именно для ПП, лежащей снаружи сборки. |
Ну, мне-то проще: не нужно заботится о том, чтобы панель никуда не "уплыла"  |
|