|
Title | ButtonBarTools |
File Name | ButtonBarTools.txt |
Description | See comments |
Author | Vochomurka |
Parameters |
[Mode] [[SourceBar, TargetBar], From, To]
(see comments) |
Plugins Called | vec, ini, file, clip, win, miscplugin, unicode |
Icon | |
Version | 2.3 |
Updated on | 28.06.2022 |
args Param static Mode = Param if(arg(0) > 1) do .@Batch(arg(1), arg(2), arg(3), arg(4)) quit all endif static BB = "Buttonbar" static BC = "Buttoncount" static hh = win.handle("c=TTOTAL_CMD") static Path = file.folder(win.exepath(hh)) static ButtonCount = 0 static G = "General" static Config = pprofolder ++ "scripts\ini\ButtonBarTools.ini" static Height = ini.get(Config, G, "Height") - 2 local MainBar, Cur static E = cl.Create("Bars", 1) local Sex = ini.enum_sections(Config) static FSS = "Format StartSubmenu" static FES = "Format EndSubmenu" static FNCL = "Format NewColumnLine" static Mask = "*.bar" static CR = esc(?+\r+, ?+\+) static CR2 = esc(?+\r\r+, ?+\+) static Tab = esc(?+\t+, ?+\+) static BBTS = "ButtonBarTools Script" static FCV = "Failure creating vector" static Target = Path ++ "\BBT" ++ ifelse(ini.get(Config, G, "SameNameResult"), "", date ++ time) ++ ".bar" static TTS = ini.get(Config, G, "Separator") E.SetTooltipSeparator(TTS) static w = vec.createfromwords("button cmd param path menu iconic") if(not w) do messagebox("ok error", FCV, "VEC plugin Error #4") quit endif static KeyWords = w.length static S = vec.create(6) if(not S) do messagebox("ok error", FCV, "VEC plugin Error #2") quit endif S[1] = 0 S[3] = 0 S[5] = 0 E.Insert(0) E.AddLeft(0, FSS) E.SetLabel(0, "Main Bars") .@Read() Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FES) for each line MainBar in Sex if(MainBar != G) do Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FSS) E.SetLabel(Cur, MainBar) .@Read(MainBar) Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FES) endif endfor E.SetProperties("Format=samesize vertical iconsize: 16 tooltips") if(Mode == "s" || Shift) do static Ba = "Bars" static Bu = "Buttons" Cur = S[1] + S[3] + S[5] MainBar = S[0] + S[2] + S[4] Sex = "Main:" ++ CR ++ Ba ++ Tab ++ S[0] ++ CR ++ Bu ++ Tab ++ S[1] ++ CR2 Sex ++= "Local:" ++ CR ++ Ba ++ Tab ++ S[2] ++ CR ++ Bu ++ Tab ++ S[3] ++ CR2 Sex ++= "Other:" ++ CR ++ Ba ++ Tab ++ S[4] ++ CR ++ Bu ++ Tab ++ S[5] ++ CR2 Sex ++= "Total:" ++ CR ++ Ba ++ Tab ++ MainBar ++ CR ++ Bu ++ Tab ++ Cur messagebox("ok information", Sex, BBTS) else E.ShowMenu("centerscreen") endif if(!ini.get(Config, G, "KeepResult") || Alt) file.delete(Target) if(Mode == "b") do Cur = E.GetLastMenuSel() if(Cur) quit(E.GetId(Cur)) endif quit all ;;************************************************ Function Read(Sec) local Str, List, Elem, Counter, j, Cur, Pan, Temp ;;, Item static i = "information" static B1 = " bars" static B2 = " buttons" static T = "timeout=5" static FolderIcon = env("WINDIR") ++ "\system32\shell32.dll" switch (Sec) case "Local Bars" Str = ini.enum_keys(Config, Sec) Pan = line(Str, 0) miscplugin.BalloonTip(1, i, "Local: " ++ Pan ++ B1, T) S[2] = Pan for each line Temp in Str Elem = ini.get(Config, Sec, Temp) j = Elem ++ "_local.bar" Cur = E.length with E.Insert(Cur) .SetLabel(j) .SetIcon(FolderIcon, 4) .SetTooltip(ini.get(j, BB, BC) ++ B2) .SetId(j) endwith if(Mode != "b") do E.AddLeft(Cur, FSS) S[3] += .@Bur(j) Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FES) endif if(Counter > Height) do E.Insert(Cur + 1) E.AddLeft(Cur + 1, FNCL) Counter = 0 else Counter++ endif endfor break case "Other Bars" Str = ini.enum_keys(Config, Sec) for each line Pan in Str Elem = ini.get(Config, Sec, Pan) List = file.listfiles(Elem ++ Mask) S[4] += line(List, 0) miscplugin.BalloonTip(1, i, "Other: " ++ S[4] ++ B1, T) for each line j in List Cur = E.length with E.Insert(Cur) .SetLabel(j) .SetIcon(FolderIcon, 4) .SetTooltip(ini.get(j, BB, BC) ++ B2) .SetId(j) endwith if(Mode != "b") do E.AddLeft(Cur, FSS) S[5] += .@Bur(j) Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FES) endif if(Counter > Height) do E.Insert(Cur + 1) E.AddLeft(Cur + 1, FNCL) Counter = 0 else Counter++ endif endfor endfor break case else Temp = file.listfiles(Path ++ "\*.bar") Pan = line(Temp, 0) S[0] = Pan miscplugin.BalloonTip(1, i, " Main: " ++ Pan ++ B1, T) for each line j in Temp Elem = file.name(j) Cur = E.length with E.Insert(Cur) .SetLabel(Elem) .SetIcon(FolderIcon, 4) .SetTooltip(j ++ TTS ++ ini.get(j, BB, BC) ++ B2) .SetId(j) endwith if(Mode != "b") do E.AddLeft(Cur, FSS) S[1] += .@Bur(j) Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FES) endif if(Counter > Height) do E.Insert(Cur + 1) E.AddLeft(Cur + 1, FNCL) Counter = 0 else Counter++ endif endfor ;; quit endswitch quit ;;************************************************ Function Bur(Name) local Name local Buttons = ini.get(Name, BB, BC) local BarNum = E.length - 1 local j, Temp, Cur, TT, Counter, Item, cmds, TTL for(j = 1; j <= Buttons; j++) Temp = w[1] ++ j if(ini.check_exists(Name, BB, Temp) == 2) do Cur = E.length E.Insert(Cur) E.AddLeft(Cur, "Format Separator") continue endif if(ini.get(Name, BB, Temp) == -2) do Cur = E.length E.Insert(Cur) E.AddLeft(Cur, FNCL) continue endif Cur = E.length Item = E.Insert(Cur) cmds++ with Item if(ini.check_exists(Name, BB, w[4] ++ j) == 3) .SetLabel(ini.get(Name, BB, w[4] ++ j)) if(ini.check_exists(Name, BB, w[0] ++ j) == 3) .SetIcon(ini.get(Name, BB, w[0] ++ j)) TT = "Command: " ++ ini.get(Name, BB, Temp) if(ini.check_exists(Name, BB, w[2] ++ j) == 3) TT ++= TTS ++ "Parameters: " ++ ini.get(Name, BB, w[2] ++ j) if(ini.check_exists(Name, BB, w[3] ++ j) == 3) TT ++= TTS ++ "Path: " ++ ini.get(Name, BB, w[3] ++ j) Temp = E.GetMaxtext TTL = length(TT) if(TTL > Temp) TT = remove(TT, Temp - TTL - 20) ++ "/...truncated" .SetTooltip(TT) .AddLeft(cb("@Mark", Cur, BarNum, j)) .AddRight(cb("@BInsert", BarNum, j)) endwith if(Counter > Height) do E.Insert(Cur + 1) E.AddLeft(Cur + 1, FNCL) Counter = 0 else Counter++ endif endfor quit(cmds) ;;************************************************ Function Mark(Num, BarNum, Button) local k, Key, Value local Source = E.GetId(BarNum) static ButtonColor = ini.get(Config, G, "MarkButton") static BurColor = ini.get(Config, G, "MarkBar") E.SetBackColor(Num, ButtonColor) E.SetBackColor(BarNum, BurColor) ButtonCount++ ini.error_dialog_off() for(k = 0; k < KeyWords; k++) Temp = w[k] Key = Temp ++ Button if(ini.check_exists(Source, BB, Key) == 3) do Value = ini.get(Source, BB, Key) ini.set(Target, BB, Temp ++ ButtonCount, Value) ini.set(Target, BB, BC, ButtonCount) endif endfor E.ShowMenu("centerscreen") quit ;;************************************************ Function BInsert(BarNum, Button) local Source = E.GetId(BarNum) if(Ctrl || Mode == "c") do .@Buffer(Source, Button) quit all endif local Keys = ini.get(Source, BB, BC) local k, m, Temp, Value, Key, Shift for(k = Keys; k > Button; k--) Shift = k + ButtonCount for(m = 0; m < KeyWords; m++) Temp = w[m] Key = Temp ++ k if(ini.check_exists(Source, BB, Key) == 3) do Value = ini.get(Source, BB, Key) Temp = w[m] ++ Shift ini.set(Source, BB, Temp, Value) ini.delete_key(Source, BB, Key) endif endfor endfor for(k = 1; k <= ButtonCount; k++) Shift = k + Button for(m = 0; m < KeyWords; m++) Temp = w[m] Key = Temp ++ k if(ini.check_exists(Target, BB, Key) == 3) do Value = ini.get(Target, BB, Key) Temp = w[m] ++ Shift ini.set(Source, BB, Temp, Value) endif endfor endfor messagebox("ok information", ButtonCount ++ " buttons copied to " ++ Source, BBTS) ini.set(Source, BB, BC, Keys + ButtonCount) quit ;;************************************************ Function Batch(SourceBar, TargetBar, From, To) local j, 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, BBTS) quit endif if(not validpath(SourceBar)) do Str = "Source bar file name " ++ SourceBar ++ " is wrong" messagebox ("ok", Str, BBTS) quit endif if(From > To) do Str = "Starting button number " ++ From ++ " is more than ending number " ++ To messagebox ("ok", Str, BBTS) quit endif Temp = ini.get(SourceBar, BB, BC) if(Temp < To) do Str = "Button count in " ++ SourceBar ++ " is " ++ Temp ++ " and is less than ending number " ++ To messagebox ("ok", Str, BBTS) quit endif if(!From && !To) do From = 1 To = Temp endif for(j = From; j <= To; j++) Counter++ Next++ for each Elem in w Temp = Elem ++ j 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, BBTS) quit ;;************************************************ Function Buffer(Source, Button) local k, Value, Key local x = vec.create(KeyWords) local Temp = "TOTALCMD#BAR#DATA" ++ CR if(not x) do messagebox("ok error", FCV, "VEC plugin Error #3") quit all endif for(k = 0; k < KeyWords; k++) Value = w[k] Key = Value ++ Button x[k] = ifelse(ini.check_exists(Source, BB, Key) == 3, ini.get(Source, BB, Key), "") endfor Temp ++= x[1] ++ CR ++ x[2] ++ CR ++ x[0] ++ CR ++ x[4] ++ CR ++ x[3] ++ CR ++ x[5] unicode.clip_set(Temp) quit all
Script to work with button bars has four implementations.
Button2Clip. As the name says, it allows to put only one button only to the clipboard;
Version 1.0, or B-version. Both PowerPro bars and menus are used;
Version 2.0, or M-version. Only PowerPro menu is used.
The [General] section of the configuration file ButtonBarTools.ini contains key Separator. Its value is a character to replace the slash "/" in PowerPro tooltips. For example, if
Separator=\
then tooltip "First/Second/Third" looks as is. But if
Separator=/
what means no slash replacement, then the tooltip gets
First
Second
Third
Finally, the 2.1 version, or S-version – the actual one. It should be run under PowerPro version not older than 5.3.35s while the "s" letter matters.
In the Total Commander buttons there are many slashes, especially in the Parameters field. Meanwhile in PowerPro bars slashes are tooltip separators. In the GUI bar/menu setup the separating character can be easily changed, but not in scripts. So, satisfying my request, Bruce Switzer introduced two new functions: SetTooltipSeparator and GetTooltipSeparator in the 5.3.35s version of PowerPro.
Therefore, in the 2.1 script version the Separator gets another meaning: its value should be some character not containing in the tooltip text. In the above example, if we want each word to be on a separate line, we should set "First`Second`Third"
Separator=`
which is the default.
The Separator key meaning is the only difference between versions 2.0 and 2.1.
So, how to transfer buttons from one button bar to another? First, we can use the clipboard: open source bar, copy one button to the clipboard, open target bar, paste button, open source bar again, etc. Second, we can copy all buttons to the clipboard and then paste them one by one using a clipboard manager, if any. Third, we can merge bars (using, for example, this script), and then delete excessive buttons. Fourth, we can open both bars in text editor and carefully change numbers...
So, existing ways are not handy. On my computer there are 2064 buttons on 137 bars in various directories, so the button transition from one bar to another is a problem. This script is used to solve it. Its early edition was called Button2Clip and allowed to copy only one button and only to the clipboard. The present edition has more functions.
First of all let's have a look at the configuration file ButtonBarTools.ini. Its path has to be pprofolder\scripts\inis\ButtonBarTools.ini, where pprofolder is the path PowerPro is installed in. ButtonBarTools.ini has one obligatory section [General] with some obligatory keys.
For example, the Height key value is a maximum number of rows of all menus, and is taken experimentally.
To use local bars (or local menus; they are described here) section with obligatory name [Local Bars] must contain strings like
Any_name=path_to_local_menu\
Local menus must have names _local.bar. If local menus are not used, the [Local Bars] section must be completely deleted or commented.
Further, the configuration file can contain other sections with any names each with any numbers of keys with the same format. Unlike the [Local Bars] section, other ones have no restrictions to both button bar file names and their quantity: all *.bar files with indicated path will be considered.
The script has six modes whose execution is provided by parameters or button presses. But anyway the multi-level menu is displayed. First level contains at least one item "Main Bars" and, for the present configuration, "Local Bars" and "Other Bars" items. "Main Bars" submenu contains all *.bar files with path %COMMANDER_PATH%. Second level of menu concerns button bars, the third one – buttons. Useful information is containing in tooltips discussed above. Buttons have icons if available.
Script has no parameters. Button to be copied to another bar is pressed by left mouse button. The background colors of both button and its bar are changed to colors described by values of MarkButton and MarkBar keys, respectively. The color is set according to PowerPro rules – see manual about the SetTextColor keyword.
Picking different buttons can be done as many times as necessary. After all buttons are marked, the place to copy all these buttons to is indicated by right mouse button click. Finally, the script informs user about total number of buttons and the target bar.
Note that buttons are copied rather than moved! First, it is safely, second, it is sometimes useful to have the same buttons on different bars.
Along with marking buttons they are copied to new button bar file. Its path is %COMMANDER_PATH%, its name is set by the SameNameResult key value: if it is 1, then the file has name BBT.bar, otherwise – a unique name with current date and time.
The KeepResult key with the 1 value keeps the button bar after script terminates. It could be useful if to rename and use this button bar with buttons created before.
The button bar file irrespective of the above key value is deleted if to keep the Alt button pressed at the script termination.
It can be done by three ways. First, run the script with the "c" parameter. Second, run the script without parameters, but press the Ctrl key while left-clicking the button to be copied. Third, in the parameter-free mode the button is right-clicked, but no other button is marked.
Anyway, after the second mode execution, the button image is put to the clipboard. Then the user can point an empty place on any button bar, press right mouse button, and pick "Paste...".
Script is run with the "s" parameter, or without any, but with Shift pressed. Dialog window is displayed with common information about button bars of all three types.
Script parameters are
source_bar, target_bar, starting_button_number, ending_button_number
Both bars can be Total Commander parameters like %P%N, or explicit full paths.
Unlike the main mode, the batch one allows to copy only sequential buttons.
Example: script call
.ButtonBarTools(?"%P%N", "c:\some\dir\any.bar", 7, 11)
copies 5 buttons with numbers 7-11 from bar under cursor to bar c:\some\dir\any.bar.
MergeBars script has the similar function. Fifth mode is a specific instance of the fourth one. If in the above example script has 2 parameters rather than 4, that is
.ButtonBarTools(?"%P%N", "c:\some\dir\any.bar")
then all buttons from the button bar file under cursor will be copied to any.bar.
If this script is called from another script with the "b" parameter, then only two menu levels are shown. After clicking a bar name script returns this bar full path
All Scripts | Total Commander | TotalCmd.net | PowerPro |