|
|
|||||||||||||||||||||||||||||
|
Удобная навигация в Windows Explorer и Total CommanderИсточник: habrahabrru
Вы никогда не задумывались над тем, что навигация в Windows могла бы быть намного удобней? Почему бы не добавить возможность, аналогичную навигации по классам во многих современных IDE, когда в выпадающем списке, вызываемом сочетанием клавиш, отображаются папки с нужным именем, вот так:
Однажды задумавшись, я написал небольшое приложение под названием "Navigation Assistant", изображенное выше. Зачем это нужно? Вот недостатки навигации в Windows Explorer и Total Commander, которые, уверен, у многих вызывают фрустрацию:
Поэтому и была написана "Navigation Assistant", работа которого аналогична навигации по классам или файлам многих современных IDE: сочетания Ctrl-N и Ctrl-Shift-N в продуктах JetBrains (ReSharper, IDEA, PhpStorm, WebStorm), Ctrl-Shift-T в Eclipse. Бонусом, получаемым при использовании этой программы, является лучшая структура каталогов. Многие разработчики, особенно прочитавшие Code Complete, в курсе того, что мозг хорошо справляется с 7 ± 2 объектами в рабочей памяти; поэтому так же, как полезно ограничивать число полей и методов в классе, полезно ограничивать число подкаталогов в данном каталоге. При текущем положении вещей этого можно достигнуть лишь ценой неудобной навигации. При использовании Navigation Assistant более не придется опасаться большой вложенности каталогов. Как этим пользоваться? Пока поддерживается лишь быстрая навигация по папкам, но не по файлам. Чтобы быстро попасть в нужную вам папку, в окне Windows Explorer или Total Commander (либо в любом другом, но тогда для навигации будет инстанциирован новый Windows Explorer) нажмите специальное сочетание клавиш (по умолчанию Ctrl-Shift-M, но его можно изменить в настройках). Появится основное окошко приложения: Начните набирать имя папки, до которой вы хотели бы добраться. Killer feature: необязательно набирать имя папки целиком; например, чтоб попасть в Documents and Settings, можно набрать лишь "documents and". Более того, необязательно набирать слово "documents" целиком, хватит и "doc and" (привет, JetBrains!); также необязательно набирать имя папки с первого слова: подойдет и "and settings". Специально для разработчиков поддерживается pascal/camel case: к строке поиска "nav assist" будет отнесена и папка "NavigationAssistant". В результате этих манипуляций на экране появится список подходящих каталогов: Вам остается либо выбрать нужный элемент мышкой, либо воспользоваться клавишами вверх/вниз и кликнуть Enter (фокус ввода может оставаться в текстовом поле в это время). Если окошко чем-либо не угодило, его можно быстро свернуть в трей клавишей Escape. Если же вызвать программу не в Windows Explorer и не в Total Commander, то откроется новое окно Windows Explorer (с необходимой папкой); в настройках же можно изменить навигатор по умолчанию на Total Commander. Что в нем есть еще? Еще имеется окно настроек, в котором можно изменить:
Для всех опций есть в наличии всплывающие подсказки. Чтоб добраться до настроек, просто кликните правой кнопкой по иконке в трее. Как это сделано
В коде присутствует несколько нетривиальных моментов: Реакция на глобальные нажатие клавиш Чтоб вовремя показать окно Navigation Assistant, необходимо слушать нажатие комбинации клавиш глобально (то есть во всех приложениях). .Net не позволяет этого "из коробки". Посему я воспользовался кодом отсюда (хотя есть несколько других решений, стоит лишь погуглить фразы global hooks/ global hotkeys). Установка фокуса на неактивное приложение После того, как мы обнаружили, что в каком-то окне была нажата заветная комбинация клавиш, необходимо показать Navigation Assistant, а также установить в него фокус (сделать активным, то бишь). Да, в WPF имеется метод Window.Activate, который вызывает WinApi функцию SetForegroundWindow, и, следовательно, обладает всеми ее ограничениями. А именно, если ваше приложение неактивно при вызове метода, окно не будет сделано рабочим, то есть фокус останется в старом окне. Вообще-то, это правильно, чтоб не давать злонамеренным программам внезапно изменять текущий фокус и всячески препятствовать работе юзера. Но в нашем случае хочется обойти это ограничение. Помогло решение вот отсюда, хотя есть несколько других (раз, два), но они работали не так хорошо. Интеграция с Windows Explorer Для того, чтоб получать список открытых окон Windows Explorer, был позаимствован вот этот код. Имея обертку над COM-объектом, можно легко менять текущий путь в данном окне explorera. Интеграция с Total Commander Интеграция с Total Commander осуществляется с помощью опций командной строки, в первую очередь /O, которая устанавливает передаваемый вместе с ней путь не в новом экземпляре Total Commander, а в уже открытом (если таковой имеется). Архитектура Используется стандартная многоуровневая архитектура (отличный обзор есть в "Domain Driven Design Quickly Online" за авторством Avram и Marinescu) Вначале я пытался использовать шаблон Model-View-View Model, но потом перешел к Таким образом, сейчас используется Model-View-Presenter, а UI и данные связываются через View Models (WPF Binding), притом View Models Основная функциональность покрыта тестами (используются nUnit и Moq). Проблемы Наверняка в приложении есть еще ненайденные баги. Кроме того, я не большой специалист по рисованию иконок, поэтому иконка в системном трее на белом фоне выглядит угловатой, как будто без антиалиасинга; во всех остальных случаях иконки выглядят, для меня, по крайней мере, приемлемо (но я не откажусь от любой помощи или советов). При первом запуске какое-то время будет происходить поиск всех папок на пользовательском компьютере, поэтому придется подождать несколько минут. Если Navigation Assistant был закрыт не при последнем выключении компьютера, или не был запущен автоматически при запуске системы, то невозможно сказать, актуален ли текущий кэш каталогов; поэтому этот кэш будет обновляться в дополнительном потоке, а до завершения этого процесса будет использоваться последний сохраненный кэш каталогов (который может не полностью соответствовать настоящей файловой системе). Да, .Net вообще и WPF медленные и ресурсоемкие, но с этим приходится мириться. Ссылки по теме
|
|