Страница 1 из 2

Снятие выделения по Esc

Добавлено: Чт янв 05, 2017 09:07
Flasher
  • При использование быстрой фильтрации [ Настройка: Быстрый поиск > Буква (с диалогом поиска) ] стандартное назначение на Esc комадны cm_ClearAll не даёт возможность вернуться к нефильтрованному списку, как это происходит по умолчанию. Задавался ранее этим вопросом здесь (п. 5) и здесь.
    Поскольку запрошенная реализация в Twinkey меня не устраивает, набросал скрипт:

Код: Выделить всё

;••••••••••••••••••••••••••••••• AHK ••••••••••••••••••••••••••••••••
; Снятие/восстановление выделения с объектов в активной панели по Esc
; Условие: TC 9.0+. Запускать желательно контентным плагином Autorun.
;••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••
#NoEnv
#NoTrayIcon
ListLines, Off
#KeyHistory, 0
SetBatchLines,-1
#SingleInstance, Off
DetectHiddenWindows, On

If DupComplete() || RegExMatch(StrGet(DllCall("GetCommandLine",Ptr)), "i)\s/(restart|r|force|f)\s")
  ExitApp

DupComplete()
{ WinGet, List, List, % A_ScriptFullPath " ahk_class AutoHotkey"
  Loop % List
    If WinExist("ahk_id" List%A_Index%) != A_ScriptHwnd && R := true
      WinClose
  Return R
}

WinWaitClose, ahk_class TTOTAL_CMD
ExitApp

#IfWinActive, ahk_class TTOTAL_CMD
$Esc::
ControlGetFocus, Class, A
If !InStr(Class, "TMyListBox") || WinExist("ahk_class #32768") || MainMenuFocus()
  SendInput, {Esc}
Else
{ N := SubStr(Class, 0) = 2 ? 1 : 0 
  SendMessage, 1074, % 1006-N, 0,, A 
  Sel := % ErrorLevel 
  SendMessage, 1074, %  8 - N, 0,, A 
  ControlGetPos, x, y, w, h,, ahk_id %ErrorLevel% 
  PixelSearch,,, % x+w-5, % y, % x+w, % y+h/2, 0x333333,, Fast 
  If ErrorLevel 
    PostMessage, 0x433, 52 (Sel?4:9),,, A
  Else
    SendInPut, {Esc}
}

MainMenuFocus()
{ VarSetCapacity(MBI, size := 16 + A_PtrSize*4, 0)
  NumPut(size, MBI)
  DllCall("GetMenuBarInfo", Ptr, WinExist("A"), Int, 0xFFFFFFFD, Int, 0, Ptr, &MBI)
  Return *(&MBI + 16 + A_PtrSize*3) & 1
}
  • При повтроном вызове скрипта AHK-процесс самозавершается, тем самым давая возможность использовать его как инверсную команду-опцию (Вкл/Выкл).
    При отсутствии экземляров TC процесс завершается.

Добавлено: Чт янв 05, 2017 10:17
Avada
Flasher
Если упоминается не устраивающий тебя алгоритм TWinKey, наверное, есть смысл привести и устраивающий тебя алгоритм, реализуемый скриптом. В том числе чтобы ни у кого не было не было надобности вникать во все нюансы достаточно длинного обсуждения в теме по TWinKey. Кстати, и пояснение насчёт условия с 9.0+ тут было бы уместым.

Добавлено: Чт янв 05, 2017 10:29
Flasher
Avada
Алгоритм самый обычный, не нарушающий стандартное поведение в ТС.
Выделение снимается только не в режиме быстрой фильтрации.

Что именно нужно пояснять в отношении 9.0+?

Добавлено: Чт янв 05, 2017 10:58
Avada
Flasher
Стандартное поведение TC не предполагает снятие выделения по Esc ни до, ни после снятия фильтра, так что любой дополнительный алгоритм обработки этой клавиши обычным не будет. Это тебе всё понятно, а читающим, возможно, и нет. От более подробного расписывания того, что происходит при очередном нажатии клавиши как в условиях быстрой фильтрации, так и после закрытия фильтра, была бы только польза. Разумеется, не в шапке скрипта, а в посте, как дополнительное пояснение.
А насчёт пояснения про 9.0+ напоминаю, что в своё время нынешний (а не обратный) алгоритм обработки Esc в TWinKey при быстрой фильтрации был принят из-за невозможности обнаружить со стороны плагина этот режим. Если в новациях девятки что-то позволяет ограничение обойти, надо бы это указать явно.

Добавлено: Чт янв 05, 2017 11:24
Flasher
Avada
Стандатное - это не обязательно то, которое предполагает чистый ТС без доп. настроек, а то, которое не нарушает работу этой клавиши в имеющихся условиях. Т.к. в нефильтрованном быстрым поиском режиме никаких назначений по умолчанию нет, то нет и нарушения, как и в случае любого другого хоткея, не занятого самим ТС.

Насчёт новаций мимо. Вариант определения я предлагал в ветке TwinKey. Невозможность и нежелание автора пользоваться таким методом - разные вещи.

Добавлено: Чт янв 05, 2017 11:46
Avada
Flasher
Говоря коротко, мои предложения у тебя поддержки не получили. Что ж, дело хозяйское.

Добавлено: Чт янв 05, 2017 12:11
Flasher
Avada
Предложение добавить небольшое пояснение в первый пост я не отклоняю. Тут ещё с AutoRun ситуация, так что пока откладывается.

А ты бы лучше проверил работу при отключённых "аналогах".

Добавлено: Чт янв 05, 2017 12:33
Avada
Flasher
Проверил. Да, работает. Но, запустивши скрипт, потом этот режим выделения, если захочется, отключить оказывается не так-то просто. А при использовании TWinKey при такой последовательности действий приходится ещё и файловые группы отключать, иначе при снятии фильтра выделено окажется совсем не то, что следует. К тому же я привык, что по Esc можно и восстанавливать выделение. Так что ничего против не имею, но эта методика, скорее всего, не для меня.

Добавлено: Чт янв 05, 2017 13:09
Flasher
Avada писал(а):Но, запустивши скрипт, потом этот режим выделения, если захочется, отключить оказывается не так-то просто.
Что ты имеешь в виду?
Avada писал(а):А при использовании TWinKey при такой последовательности действий приходится ещё и файловые группы отключать, иначе при снятии фильтра выделено окажется совсем не то, что следует.
Снятие фильтра здесь - это тот же Esc, что и в ТС по умолчанию. Если TwinKey с ним себя ведёт неоднозначно, то считай, что это его баг.
Avada писал(а):К тому же я привык, что по Esc можно и восстанавливать выделение.
Я давно уже отвык, т.к. ранее заменял на упрощённый вариант, отключив опцию, надоел костыль с двух/трёхкратным нажатием. Впрочем, восстановление добавить не проблема, если мой вариант станет более приемлем. Ты, полагаю, сам видел в обсуждении, как много я писал о том, чтобы добиться более качественного поведения.

И да. А в чём плюс восстановления выделения? Да в том, что выделенные объекты можно увидеть без фильтрации (т.е. с уже иным расположением). В моём же случае это уже есть, так как выделение не сбрасывается в момент сроса фильтрации. По мне это ещё удобней.

Добавлено: Чт янв 05, 2017 13:28
Avada
Flasher писал(а):Что ты имеешь в виду?
Активный неубитый процесс, естественно. То ли AHK закрывать приходится, то ли скомпилированный экзешник, смотря по тому, в каком виде скрипт использовать.
Flasher писал(а):Снятие фильтра здесь - это тот же Esc, что и в ТС по умолчанию. Если TwinKey с ним себя ведёт неоднозначно, то считай, что это его баг.
А вот это я специально проверял. Если выделение по ESC в TWinKey не включено и скрипт не используется, то выделение, сделанное в режиме фильтрации, нормально сохраняется при включённой групповой сортировке и при стандартном выходе из фильтрации. А при выходе со скриптом, мягко говоря, есть проблемы.
Flasher писал(а):Впрочем, восстановление добавить не проблема, если мой вариант станет более приемлем. Ты, полагаю, сам видел в обсуждении, как много я писал о том, чтобы добиться долее качественного поведения.
Да, видел. А если можно добавить восстановление выделения (пусть и опционально) — попробуй. Но, скажем, отключать групповую сортировку я не намерен, а с ней в нынешнем виде сохранение выделения вне фильтрации просто теряет смысл. Мне лучше жать два/три раза, чем наблюдать вот это.

А плюс восстановления выделения по ESC в том, что эта методика применяется далеко не только при выходе из режима фильтрации.

И почему всё-таки только девятка, а не более ранние версии TC?

Добавлено: Чт янв 05, 2017 14:27
Flasher
Avada писал(а):Активный неубитый процесс, естественно. То ли AHK закрывать приходится, то ли скомпилированный экзешник, смотря по тому, в каком виде скрипт использовать.
А, ну я их убиваю через Autorun (пример снизу). Можно, конечно, любой хоткей на закрытие прописать, например, 3 сек. удержание Esc. Или сделать, чтобы завершался с повторого запуска. Как лучше?

С групповой сортировкой позже попробую разобраться. Пока не проверял.
Avada писал(а):А плюс восстановления выделения по ESC в том, что эта методика применяется далеко не только при выходе из режима фильтрации.
Это понятно, но, ИМХО, в TwinKey оно делалось из указанных мной соображений.
Avada писал(а):И почему всё-таки только девятка, а не более ранние версии TC?
C новыми WM_USER+50 цель достигается куда более коротким путём в отличии от WM_CopyData.

Добавлено: Чт янв 05, 2017 14:35
Skif_off
Avada писал(а):И почему всё-таки только девятка, а не более ранние версии TC?
Используются эти фичи. В принципе, их можно заменить, работая непосредственно с окном ТС и ListBox, тогда заработает и с более ранними.

Зачем PixelSearch? И почему только TMyListBox?

Добавлено: Чт янв 05, 2017 15:48
Avada
Flasher писал(а):Или сделать, чтобы завершался с повторого запуска. Как лучше?
Чисто теоретически мне кажется удобнее повторный запуск.
Flasher писал(а):но, ИМХО, в TwinKey оно делалось из указанных мной соображений.
В том числе, но не только.

Про девятку понял, спасибо.

Добавлено: Пт янв 06, 2017 10:38
Flasher
Avada писал(а):Если выделение по ESC в TWinKey не включено и скрипт не используется, то выделение, сделанное в режиме фильтрации, нормально сохраняется при включённой групповой сортировке и при стандартном выходе из фильтрации.
А что с прикреплёнными объектами? С ними у меня всё время выделение меняется c дефолтным Esc.

Добавлено: Пт янв 06, 2017 10:51
Avada
Flasher
Да, с этим были и есть вполне предсказуемые проблемы, не только при быстрой фильтрации. Выделение и прикрепление объектов в некоторых моментах не очень дружат. Но при использовании ESC по методике TwinKey с последующим восстановлением выделения проблем нет.