|
Название | ButtonBarTools |
Имя файла (*.txt) | ButtonBarTools-B.txt |
Описание | См. комментарии |
Автор | Вахмурка |
Параметры | Статистика, Буфер, панель-источник, панель-приемник, начальный_номер, конечный_номер |
Вызываемые плагины | vec, ini, file, clip |
Иконка | |
Версия | 1.0 |
Дата обновления | 23.06.2017 |
args Stat, ClipBoard, SourceBar, TargetBar, From, To static Buf = 0 if(ClipBoard || Shift) Buf = 1 static BB = "Buttonbar" static BC = "Buttoncount" static w = vec.createfromwords("button cmd param path menu iconic") if(not w) do messagebox("ok error", "Failure creating vector", "VEC plugin Error #4") quit endif if(arg(0) > 2) .@Batch(SourceBar, TargetBar, From, To) static Config = pprofolder ++ "scripts\ini\ButtonBarTools.ini" static Height = ini.get(Config, "General", "Height") static CR = esc(?+\r+, ?+\+) local i flag clear 1 if(Ctrl || Stat) do local Rep = pprofolder ++ "ButtonBars.ini" local fh = file.open(Rep, "w") if(fh <= 0) do messagebox("ok error", "File not created", "FILE plugin error #1") quit endif file.close(fh) local Bars, Buttons, Counter, j, Temp for each line i in ini.enum_sections(Config) if(i != "General") do .@Read(i) else .@Read() endif Counter = v.length Bars += Counter for(j = 0; j < Counter; j++) Temp = ini.get(v[j], BB, BC) ini.set(Rep, i, v[j], Temp) Buttons += Temp endfor ini.set(Rep, "Summary", "Bars", Bars) ini.set(Rep, "Summary", "Buttons", Buttons) endfor Temp = "File " ++ Rep ++ " created" ++ CR ++ CR ++ "Bars: " ++ Bars ++ CR ++ "Buttons: " ++ Buttons messagebox("ok", Temp, "ButtonBarTools script") quit endif static D = cl.Create("Dirs", 1) for each line i in ini.enum_sections(Config) if(i != "General") do D.Insert(0) D.AddLeft(0, cb("@Read", i)) D.SetLabel(0, i) endif endfor D.Insert(0) D.AddLeft(0, cb("@Read")) D.SetLabel(0, "Main Bars") if(D.Length > 1) *menu show Dirs .@GetBars() *menu show Bars quit all ;;************************************************ Function Read(Sec) local Mask = "*.bar" local Temp, Str, List, Elem, Counter, Path static v if(vec.exists(v)) v.destroy if(not Sec) do local hh = win.handle("c=TTOTAL_CMD") Path = file.folder(win.exepath(hh)) Temp = file.listfiles(Path ++ "\" ++ Mask) v = vec.createfromlines(Temp) if(v <= 0) messagebox("ok error", "Vector not created", "VEC plugin error #1") quit endif v = vec.create(1, 1) if(v <= 0) do messagebox("ok error", "Vector not created", "VEC plugin error #2") quit endif Str = ini.enum_keys(Config, Sec) for each line Temp in Str Elem = ini.get(Config, Sec, Temp) if(Sec == "Local Bars") do v[Counter] = Elem ++ "_local.bar" Counter++ else List = file.listfiles(Elem ++ Mask) for each line Elem in List v[Counter] = Elem Counter++ endfor endif endfor quit ;;************************************************ Function Left(i) if(pproflag(1)) do static Target = v[i] quit endif flag set 1 static Source = v[i] static Items = ini.get(Source, BB, BC) static B = cl.Create("Bar", 1) setstring Quote " local i, Str, Counter, TT, Param, Work, How, Menu, IconFile, Icon, Command, Temp if(not Buf) do B.Insert(0) B.AddLeft(0, cb("@Copy")) B.AddRight(0, cb("@Clip")) B.SetLabel(0, "OK") B.SetTooltip(0, "Left: Copy Buttons/Right: Put 1 Button to Clip") B.SetIcon(0, env("WINDIR") ++ "\system32\comres.dll", 8) B.SetBackColor(0, "128 255 128") B.SetHeight(0, 24) B.Insert(0) B.AddLeft(0, "*bar close Bar") B.SetLabel(0, "Cancel") B.SetIcon(0, env("WINDIR") ++ "\system32\comres.dll", 10) B.SetBackColor(0, "255 128 128") B.SetHeight(0, 24) B.SetTooltip(0, "Close Bar") endif for(i = Items; i >= 1; i--) B.Insert(0) if(ini.check_exists(Source, BB, "cmd" ++ i) == 2) do if(Buf) do B.AddLeft(0, "Format Separator") else B.SetLabel(0, "Separator") B.SetBackColor(0, 0) B.SetTextColor(0, "255 255 255") B.SetToolTip(0, "Button #" ++ i ++ "/Left: Close") B.AddLeft(0, "*bar close Bar") endif continue endif Command = ini.get(Source, BB, "cmd" ++ i) Command = .@CheckLength(Command) if(Command == -2) do Counter = 0 if(Buf) do B.AddLeft(0, "Format NewColumnLine") else B.SetLabel(0, "New Column") B.SetBackColor(0, 0) B.SetTextColor(0, "255 255 255") B.SetToolTip(0, "Button #" ++ i ++ "/Left: Close") B.AddLeft(0, "*bar close Bar") endif continue endif TT = "Button #" ++ i ++ "/Command: " ++ Command if(ini.check_exists(Source, BB, "param" ++ i) == 3) do Param = ini.get(Source, BB, "param" ++ i) Param = .@CheckLength(Param) TT ++= "/Parameters: " ++ Param else Param = "" endif if(ini.check_exists(Source, BB, "path" ++ i) == 3) do Work = ini.get(Source, BB, "path" ++ i) TT ++= "/Start path: " ++ Work else Work = "" endif if(ini.check_exists(Source, BB, "menu" ++ i) == 3) do Menu = ini.get(Source, BB, "menu" ++ i) TT ++= "/Tooltip: " ++ Menu Menu = replacechars(Menu, Quote, "''") else Menu = Command endif if(ini.check_exists(Source, BB, "iconic" ++ i) == 3) do How = ini.get(Source, BB, "iconic" ++ i) else How = "" endif B.SetToolTip(0, TT) if(Buf) do B.SetLabel(0, Menu) B.AddLeft(0, cb("@Buffer", i)) else B.SetLabel(0, "*control button autocheckbox" ++ Quote ++ Menu ++ Quote) endif if(ini.check_exists(Source, BB, "button" ++ i) == 3) do Str = ini.get(Source, BB, "button" ++ i) if(validpath(Str)) do IconFile = Str B.SetIcon(0, IconFile) Icon = "" else IconFile = nextword(Str, "Icon", ",") B.SetIcon(0, IconFile, Icon) endif endif Str = "TOTALCMD#BAR#DATA" ++ CR ++ Command ++ CR ++ Param ++ CR Str ++= IconFile ++ Icon ++ CR ++ Menu ++ CR ++ Work ++ CR ++ How B.AddRight(0, Str) if(Buf && Counter > Height) do B.Insert(0) B.AddLeft(0, "Format NewColumnLine") Counter = 0 else Counter++ endif endfor B.SetProperties("Format=barsize position: leftcaption samesize vertical iconsize: 16 tooltips") if(Buf) do *menu show Bar quit endif B.show quit ;;************************************************ Function Clip() local i for(i = 0; i < B.Length; i++) if(B.GetCtrlValue(i)) do clip.set(B.GetRightCmd(i)) B.SetCtrlValue(i, 0) break endif endfor quit ;;************************************************ Function Buffer(Num) local Str = B.GetRightCmd(Num – 1) clip.set(Str) quit all ;;************************************************ Function Copy() local i, Elem, i1, Counter, Temp, Str if(D.Length > 1) *menu show Dirs .@GetBars() *menu show Bars local Buttons = ini.get(Target, BB, BC) local Next = Buttons for(i = 0; i < B.Length; i++) if(B.GetCtrlValue(i)) do i1 = i + 1 Counter++ Next++ for each Elem in w Temp = Elem ++ i1 if(ini.check_exists(Source, BB, Temp) == 3) do Str = ini.get(Source, BB, Temp) ini.set(Target, BB, Elem ++ Next, Str) endif endfor endif endfor B.close ini.set(Target, BB, BC, Buttons + Counter) Str = Counter ++ " buttons are successfully copied from " ++ Source ++ " to " ++ Target messagebox("ok", Str, "ButtonBarTools Script") quit ;;************************************************ Function Batch(SourceBar, TargetBar, From, To) local i, Str, Counter, Temp, Elem local Buttons = ini.get(TargetBar, BB, BC) local Next = Buttons if(not validpath(TargetBar)) do Str = "Target bar file name " ++ TargetBar ++ " is wrong" messagebox ("ok", Str, "ButtonBarTools Script") quit endif if(not validpath(SourceBar)) do Str = "Source bar file name " ++ SourceBar ++ " is wrong" messagebox ("ok", Str, "ButtonBarTools Script") quit endif if(From > To) do Str = "Starting button number " ++ From ++ " is more than ending number " ++ To messagebox ("ok", Str, "ButtonBarTools Script") quit endif i = ini.get(SourceBar, BB, BC) if(i < To) do Str = "Button count in " ++ SourceBar ++ " is " ++ i ++ " and is less than ending number " ++ To messagebox ("ok", Str, "ButtonBarTools Script") quit endif for(i = From; i <= To; i++) Counter++ Next++ for each Elem in w Temp = Elem ++ i if(ini.check_exists(SourceBar, BB, Temp) == 3) do Str = ini.get(SourceBar, BB, Temp) ini.set(TargetBar, BB, Elem ++ Next, Str) endif endfor endfor ini.set(TargetBar, BB, BC, Buttons + Counter) Str = Counter ++ " buttons are successfully copied from " ++ SourceBar ++ " to " ++ TargetBar messagebox ("ok", Str, "ButtonBarTools Script") quit all ;;************************************************ Function GetBars() static Bs = cl.Create("Bars", 1) Bs.NewProperties("tooltips") local Number = v.length for(i = Number – 1; i >= 0; i--) Bs.Insert(0) Bs.AddLeft(0, cb("@Left", i)) Temp = file.name(v[i]) Bs.SetLabel(0, Temp) Temp = ini.get(v[i], BB, BC) Bs.SetTooltip(0, v[i] ++ "/" ++ Temp ++ " buttons") endfor for(i = 1; i <= Number/Height; i++) Bs.Insert(i*Height) Bs.AddLeft(i*Height, "Format NewColumnLine") endfor quit ;;************************************************ Function CheckLength(Str) static MT = B.GetMaxtext local Text if(length(Str) > MT) do Text = "String for command #" ++ i ++ " is longer than " ++ MT Text ++= " characters." ++ CR ++ "String is truncated" messagebox("ok", Text, "ButtonBarTools Script") Str = remove(Str, Temp – length(Str) – 200) endif quit(Str)
Как перенести несколько кнопок с одной панели на другую? Во-первых, можно переносить по одной через буфер: открыл одну панель, скопировал первую кнопку, открыл другую, вставил, потом еще раз, и опять... Во-вторых, можно скопировать в буфер все кнопки подряд, а потом с помощью менеджера буфера обмена (если таковой есть) вставлять по одной. В-третьих, можно присоединить одну панель к другой (с помощью, например, этого скрипта), и удалить лишнее. В-четвертых, можно открыть обе панели в текстовом редакторе и, рискуя ошибиться, вручную править номера...
Иными словами, способы есть, но все они не отличаются удобством. А поскольку у меня 2064 кнопки на 137 панелях, разбросанных по дискам, то перенос кнопок с одной на другую становится настоящей проблемой. Чтобы решить ее, я и написал этот скрипт. Сначала он назывался Button2Clip и, как ясно из названия, позволял копировать кнопку только в буфер и только одну. Но аппетит приходит во время еды, и я решил усовершенствовать скрипт и расширить его возможности.
Прежде всего ознакомимся с файлом настроек ButtonBarTools.ini. Он должен иметь путь pprofolder\scripts\inis\ButtonBarTools.ini, где pprofolder – путь к исполняемому файлу PowerPro.exe. Файл ButtonBarTools.ini имеет один обязательный раздел [General] и в нем один обязательный ключ Height, смысл которого будет раскрыт позже.
При использовании локальных панелей (локальных меню; с этим понятием можно ознакомиться здесь) раздел с обязательным именем [Local Bars] должен содержать любое число ключей вида
Произвольное_имя=путь_к_меню\
причем сами файлы должны иметь фиксированное имя _local.bar (впрочем, его легко изменить в тексте скрипта). Если локальные меню не используются, раздел следует удалить или закомментировать целиком.
Кроме того, в файле конфигурации может содержаться любое количество разделов с произвольными именами и ключами по тому же формату. Однако, в отличие от ключей раздела [Local Bars], остальные не накладывают ограничений ни на имена файлов панелей, ни на их количество: будут считаны все файлы с расширением bar, находящиеся по указанному пути.
Скрипт имеет пять функций-режимов, задаваемыми параметрами и нажатиями кнопок.
В этом режиме скрипт параметров не имеет. При запуске сначала возникнет "меню групп" и будет предложено выбрать "группу панелей". Для данного файла настроек таких групп будет три: вторая – уже упомянутые локальные панели, третья – прочие (раздел [Other Bars] конфигурации) и обязательная первая – группа "Main Bars", содержащая панели с путем %COMMANDER_PATH%. Если в конфигурации удалены все разделы, кроме [General], меню групп не предлагается.
Далее, выдается меню самих панелей в выбранной группе. Чтобы длинный список умещался на экране, можно экспериментально подобрать упомянутый параметр Height в конфигурации – он соответствует максимальному числу пунктов в колонке. Подробная информация о панели представлена во всплывающей подсказке (tooltip). После выбора одной из панелей выдается третье меню: меню кнопок. "Пустые кнопки" заменяются псевдо-кнопками "Separator", кнопки с командой "-2" – псевдо-кнопками "New Column". Оба типа разделителей выделяются черным цветом фона и белым – надписей. За счет всего этого панель, во-первых, выглядит несколько непривычно, а во-вторых, может выходить за границы видимой области.
Если это произошло и искомая кнопка находится вне пределов видимости, то можно закрыть меню щелчком по любому из разделителей. Если же и их нет или не видно, то следует при нажатой клавише Ctrl щелкнуть правой кнопкой мыши по любому месту меню и выбрать команду "Close Bar". Далее для копирования кнопок можно использовать пакетный режим (см. ниже).
Слева от имени каждой кнопки находится чекбокс, в котором можно поставить отметку. После этого нажимаем ОК левой кнопкой мыши и вновь проходим через выбор сначала группы, затем панели – именно в нее будут скопированы все кнопки, отмеченные на предыдущем этапе. Скрипт известит пользователя, что копирование завершилось успешно.
Кнопки именно копируются, а не перемещаются! Во-первых, так безопаснее, а во-вторых, бывает полезно иметь дубликаты кнопки на разных панелях.
После описанного выше появления меню кнопок можно нажать ОК не левой, а правой кнопкой мыши. Тогда в буфер будет помещен образ кнопки (первой из отмеченных). После этого можно навести курсор на свободное место панели Total Commander, нажать правую кнопку мыши и выбрать Paste. Эту операцию можно проделывать многократно, меняя панели и помещая на них разные кнопки из меню.
Для входа в этот режим надо задать второй параметр скрипта равным 1 (строго говоря, равным чему угодно, кроме "" и 0). К тому же результату приведет нажатие клавиши Shift при запуске скрипта.
Начинается все так же: меню групп, меню панелей. Но вид меню кнопок будет иным. Во-первых, пустые кнопки и новые колонки выглядят как положено. Во-вторых, кнопки имеют иконки, если это возможно. В-третьих, все кнопки панели находятся в поле видимости.
Как и во втором режиме, результатом будет образ выбранной кнопки, помещенный в буфер. Третий режим несколько нагляднее и удобнее второго, но позволяет поместить в буфер всего один образ за один запуск скрипта.
Режим может оказаться полезным в двух случаях. Либо когда нужные кнопки выходят за пределы экрана, либо когда требуется регулярно копировать определенные кнопки с панели на панель.
Параметры скрипта с третьего по шестой имеют следующий смысл:
панель-источник, панель-приемник, начальный_номер, конечный_номер
Источник и приемник удобно задавать как "%P%N", "%T%M", но можно указать имена bar-файлов в явном виде.
Что подразумевается под "номером" кнопки? (такой вопрос может возникнуть у новичков). Следует открыть панель в программе просмотра и найти первую из тех команд, которые предполагается скопировать. Это будет выглядеть примерно так:
cmd14=c:\path\myprogram.exe
param14=%P
button14=c:\path\myprogram.exe,1
menu14=Моя программа
В данном примере 14 – это и есть номер команды. Следует ориентироваться именно на ключ "cmd.." – он один является обязательным.
Нетрудно видеть, что пакетный режим, в отличие от основного, позволяет копировать только подряд идущие кнопки.
Пример: скрипт с такими параметрами
.ButtonBarTools(0, 1, ?"%P%N", "c:\some\dir\any.bar", 7, 11)
скопирует из панели под курсором в панель c:\some\dir\any.bar кнопки с номерами с 7 до 11 включительно (всего 5 штук).
Определяется первым параметром, равным 1. В директории PowerPro создается файл ButtonBars.ini, содержащий сведения о всех панелях. Информация об общем количестве панелей и кнопок, кроме того, выдается в информационном окне. Также для входа в этот режим можно нажать клавишу Ctrl при запуске скрипта.
На главную | Все о Total Commander | PowerPro | PowerPro & Total Commander |