Подпанели Total Commander

Утверждение первое. Наш глаз (и, следовательно, мозг) намного быстрее усваивает графическую информацию, нежели текстовую.
Утверждение второе. Мы привыкли к многоуровневым меню. Сейчас в мало-мальски сложной программе меню имеет минимум два уровня, организованных, разумеется, по иерархическому принципу.
Создатель Total Commander полностью согласен с первым утверждением. Иначе невозможно объяснить тот факт, что, помимо традиционного, текстового, меню, он снабдил свое детище панелью инструментов (button bar). Однако, к большому сожалению любителей панелей, второе утверждение (при учете первого) не находит в душе Кристиана Гислера своего отклика. Многоуровневое меню - пожалуйста, а вот многоуровневая панель - извините.
Для начала очень коротко рассмотрим вопрос о том, как переключаться между панелями, которые располагаются на привычном месте - под строкой меню. В диалоге "Configuration\Change Button Bar..." нажимаем кнопку ">>":



и выбираем файл *.bar, соответствующий нужной панели.

Знаете, что мне это напоминает? Меню приснопамятного Лексикона. Как, вы не знаете, что это? Искренне вам завидую! Это хит середины 80-х, первый русифицированный текстовый редактор, который, видимо, победил на конкурсе самых бездарных, неудобных и вредительских программ. Так вот, там как раз меню не было иерархическим! Вы верите? И я бы не поверил, если бы не имел несчастье учить сотрудниц предпенсионного возраста в этом Лексиконе работать. Простите, отвлекся...
Так или иначе, взаимный вызов панелей Total Commander организован по этому же, весьма неудобному, принципу. Превосходство Total Commander над Лексиконом состоит в том, что панели можно настраивать, в частности - с любой вызвать любую. Создать кнопку для вызова панели можно, нажав одну из кнопок, показанных на скриншоте:



Преимущества кнопки "Add Subbar" (синим) в том, что будет предложена маска *.bar, а вот кнопка, обведенная красным, строго говоря, предназначена совсем для другого, но все равно поможет достичь поставленной цели.
Итак, если кнопок становится слишком много, и они перестают помещаться но одной панели, мы неизбежно создаем вторую, потом третью... Разумеется, можно позволять кнопкам плодиться как кроликам, но тогда под файловые панели, то есть то, ради чего Total Commander и создавался, остается все меньше и меньше места (кстати, мне не удалось показать больше двух рядов кнопок, а вам удастся?).
В чем же неудобство? Допустим, у нас есть 6 панелей. Чтобы попасть с любой на любую, каждая из них должна иметь кнопки вызова всех остальных, то есть 5 кнопок. Легко понять, что если максимальное количество кнопок на каждой панели, исходя из размера кнопки и разрешения экрана, равно n, то максимальное количество взаимовызывающих панелей равно n - 1. Далее, нетрудно определить, что если k (k < n) - число панелей, то максимальное число всех остальных кнопок (для перехода к директориям, вызова приложений, загрузки документов и пр.) равно (n - k + 1)*k. Подставьте в эту формулу значения, соответствующие вашему компьютеру, и вы увидите, насколько это мало.
Что же делать?! Создавать многоуровневые панели инструментов, вот что. А для этого светлые умы придумывают утилиты, призванные обеспечить меню кнопок, "вываливающееся" (drop down) при нажатии кнопки на панели. Мы рассмотрим два способа организовать подпанели.
Первый способ обеспечивают специально написанные программы: TCmenu и TCToolbar. Судя по readme, созданы они одним и тем же коллективом (по косвенным данным, состоящим из одного-единственного члена), названным MGP Software Ltd.
Панель инструментов, которую вызывает утилита TCmenu, ничем не отличается от обычной панели Total Commander, за двумя исключениями. Во-первых, как это описано в документации, вызываемой панели можно передать параметры (%P, %L, и т. д.). И вот здесь нас, возможно, поджидает засада. В качестве примера я рассмотрю панель второго уровня (Irfan.BAR), которая обеспечивает работу со смотрелкой IrfanView
:



Из указанных кнопок лишь первая нуждается в списке файлов, ее параметр /slideshow=%L /closeslideshow, некоторые из остальных кнопок требуют параметров %P и %N.
Представим для начала, что кнопка "Slideshow Selected files" расположена на обычной панели (панели первого уровня). Пусть в момент нажатия кнопки позиция курсора и состояние выделения имеют следующий вид:

·Выделена группа: запуск слайдшоу всех файлов в группе;
·Ничего не выделено, курсор на файле: показ текущего файла;
·Ничего не выделено, курсор на "входе в директорию" (на ".."): запуск IrfanView с пустым окном.

Теперь рассмотрим, что же произойдет, если та же кнопка расположена на подпанели, то есть панели второго уровня, вызываемой с помощью TCmenu. В первых двух случаях реакция та же самая, а вот третий случай придется рассмотреть подробнее.
Согласно документации к TCmenu, в ее вызове перечисляются все параметры Total Commander, необходимые кнопкам на подпанели. В нашем случае TCmenu вызывается с параметром

d:\Utils\TotalCmd\Irfan.BAR -P %P -N %N -L %L

Утилита TCmenu не передает пустой параметр, а ведь именно это произойдет, если, при отсутствии выделения, курсор установлен на "..". Так что в третьем случае будет выдано сообщение об ошибке:



С одной стороны, то есть с точки зрения кнопки "Slideshow Selected files", это логично - как запустить просмотр, если не указан ни файл, ни их группа? С другой стороны, для просмотра, скажем, всех файлов *.gif в текущей директории мы имеем право установить курсор куда угодно, в том числе и на "..". Эта логика соблюдается в случае панели первого уровня и нарушается - второго.
Фигурально говоря, если уподобить кнопки отдельным квартирам в доме (на панели первого уровня), то подпанель представляет собой квартиру коммунальную, а кнопки на ней - комнаты в коммуналке. Жильцам отдельной квартиры нет большого дела до соседей, то есть параметры одной кнопки никак не связаны с параметрами другой. В коммуналке все сложнее: кнопка "Show *.gif only" обязана считаться с запросами соседа - кнопки "Slideshow Selected files". Строка параметров утилиты TCmenu, показанная выше - что-то вроде "мест общего пользования" коммунальной квартиры, где должны учитываться интересы всех жильцов.
Итак, первое отличие между панелями первого и второго уровня состоит в том, что последние более требовательны к положению курсора. Второе отличие - на кнопку второго уровня нельзя ничего перетащить (drag-n-drop). В самом деле, при смене фокуса ввода панель второго уровня пропадает.
Из этого, в частности, следуют трудности работы с командами, требующими параметра. Рассмотрим этот вопрос. Как, например, загрузить файл в Lister, не нажимая клавишу F3 ни на клавиатуре, ни в строке функциональных кнопок? Для панели первого уровня есть два способа. Первый - создать кнопку с командой cm_List и параметром %P%N. С рассмотренными утилитами такой трюк не пройдет, и авторы об этом честно предупреждают. Второй способ - перетащить нужный файл на ту же кнопку. Как уже указывалось, перетащить на подпанель ничего не удастся.
С Lister'ом все решается легко - путем его установки как отдельного приложения. Куда более печальной оказывается невозможность использования на подпанели команд opentabs и appendtabs - эти команды требуют параметра (файл с сохраненными вкладками) по определению. Впрочем, с помощью скрипта удается решить и эту проблему.
Итак, со вторым уровнем все понятно. А как насчет третьего и более низких уровней? Можно ли на панели, вызываемой с помощью TCmenu, вновь вызвать TCmenu с еще одной панелью в качестве параметра? Можно. Для этого на панели второго уровня в поле "Command" указываем не исполняемый файл, как обычно, а панель *.bar. Если этим и ограничиться, при нажатии на данную кнопку произойдет смена подпанели. А вот если в поле "Parameters" указать слово menu, то данная кнопка на панели второго уровня откроет третий уровень - панель, чье имя указано в поле "Command".
По сравнению с TCmenu утилита TCToolbar имеет несколько дополнительных свойств, но чисто косметического характера. Для краткости приведем скриншоты той же панели при различных настройках:





Как видим, принципиальные отличия TCmenu от TCToolbar состоят, во-первых, в том, что первая "вываливает" кнопки по вертикали, вторая - по горизонтали, что отражается в названиях утилит. Лично мне удобнее вертикальная ориентация.
Второе отличие - TCToolbar выдает текстовую строку только в виде balloon tip. Это красиво, но не всегда удобно, поскольку иконки зачастую недостаточно информативны. TCmenu предоставляет как текстовое, так и графическое представление кнопки; куда хочешь - туда и смотри. По этим двум причинам я и предпочитаю TCmenu.

Второй инструмент организации многоуровневой структуры панели инструментов - PowerPro. Пусть она, в отличие от TCmenu и TCToolbar, не предназначена специально для Total Commander, но ее мощь достаточна, чтобы приспособить ее практически к чему угодно.
Вот как это может выглядеть:



Как видно, ориентация вертикальная, положение курсора произвольное, текст и иконки к вашим услугам, количество уровней не ограничено, возврат на уровень выше вопросов не вызывает. На представленном скриншоте каждая кнопка загружает на редактирование как раз-таки разные панели. Для этого вызывается скрипт LoadBar
с параметром в виде полного пути к соответствующему файлу *.bar. С тем же успехом можно запускать приложения, переходить к директориям, исполнять внутренние команды Total Commander и т. д., то есть делать все, что позволяет обычная панель (кроме drag-n-drop).
Вызвать панель PowerPro можно не только крысой, но и клавиатурой, да и "&" позволяет подчеркивать символ в названии пункта и потом быстро переходить к нему клавишей. По части всяческих красивостей PowerPro удовлетворит самому взыскательному вкусу: настраиваются шрифт, цвет шрифта и фона (на фон легко даже повесить портрет любимой девушки), и много чего еще.
Помимо косметики, можно существенно расширить функциональность такой подпанели. Например, в PowerPro существует возможность показывать/скрывать произвольные кнопки и подпанели в зависимости от любого условия. Скажем, одну группу кнопок/подпанелей можно скрывать, если окно Microsoft Word минимизировано, другую - если играется последний трек музыкального CD, третью - по понедельникам. Для более сложных условий пишем скрипт, возвращающий истину или ложь.
Передача параметров типа %P также возможна, хотя и реализуется сложнее, чем обычно - либо через буфер обмена, либо через глобальные переменные.
Завершая рассказ о PowerPro, замечу, что меню типа ShowFile, показанное выше - лишь один из видов меню, которые позволяет создавать PowerPro. Существуют, в частности, панели (bars), к которым можно даже составлять свои скины или использовать готовые, и исполнять разные команды не только левой, но и правой и даже средней кнопками крысы. Кроме того, панели PowerPro поддерживают drag-n-drop.

Разумеется, тремя описанными утилитами список средств создания подпанелей не исчерпывается. Упомяну еще о kkMenu, но писать про нее не буду - по быстродействию она на порядок уступает всем рассмотренным. К тому же, решительно никаких преимуществ kkMenu перед PowerPro я не обнаружил.

Закончить хочется пожеланием к Кристиану Гислеру все же реализовать в Total Commander встроенную поддержку многоуровневых панелей.

Вахмурка

Оригинал статьи: http://pprotcmd.narod.ru/Articles.html#Subbar