„Магнитные“ поля ввода в диалогах
„Магнитные“ поля ввода в диалогах
Почитал вот эту ветку о возможности включения особого поведения диалога поиска в просмотрщике и подумал: а нельзя ли это дело обобщить?
Предлагаю добавить в диалоги свойство "магнитное поле ввода" (название придумал только сейчас, но оно, по-моему, довольно точно описывает суть происходящего; раньше такого нигде не видел; в сети не искал). Это свойство диалога может быть либо не установлено, либо указывать на какое-то одно конкретное поле текстового ввода, либо быть установлено в значение "все текстовые поля".
Если оно установлено (т.е. указывает на поле текстового ввода), то, если фокус ввода находится в этом поле и пользователь мышью или горячей клавишей выбирает какой-то другой нетекстовый элемент, то этот элемент "отрабатывается" (например, меняется состояние чек-бокса), после чего фокус автоматически возвращается в поле текстового ввода.
Если свойство установлено на "все текстовые поля", то такое поведение действует для всех текстовых полей диалога, а не только для одного конкретного.
Я только не уверен, стоит ли так делать и при нажатии мыши (т.е. при выборе нетекстового элемента мышью, а не горячей клавишей).
Цель -- сделать работу с помощью клавиатуры более быстрой и "беспрепятственной".
В диалоге поиска файлов (Alt+F7) значение "все текстовые поля", по-моему, не помешало бы.
Естественно, что это свойство должно быть устанавливаемо через АПИ, т.е. и из макро.
Предлагаю добавить в диалоги свойство "магнитное поле ввода" (название придумал только сейчас, но оно, по-моему, довольно точно описывает суть происходящего; раньше такого нигде не видел; в сети не искал). Это свойство диалога может быть либо не установлено, либо указывать на какое-то одно конкретное поле текстового ввода, либо быть установлено в значение "все текстовые поля".
Если оно установлено (т.е. указывает на поле текстового ввода), то, если фокус ввода находится в этом поле и пользователь мышью или горячей клавишей выбирает какой-то другой нетекстовый элемент, то этот элемент "отрабатывается" (например, меняется состояние чек-бокса), после чего фокус автоматически возвращается в поле текстового ввода.
Если свойство установлено на "все текстовые поля", то такое поведение действует для всех текстовых полей диалога, а не только для одного конкретного.
Я только не уверен, стоит ли так делать и при нажатии мыши (т.е. при выборе нетекстового элемента мышью, а не горячей клавишей).
Цель -- сделать работу с помощью клавиатуры более быстрой и "беспрепятственной".
В диалоге поиска файлов (Alt+F7) значение "все текстовые поля", по-моему, не помешало бы.
Естественно, что это свойство должно быть устанавливаемо через АПИ, т.е. и из макро.
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
„Магнитные“ поля ввода в диалогах
IMHO, логичнее сделать наоборот: у элементов диалога типа Кнопка/CheckBox/RadiButton добавить флаг "Захватывать фокус". В framework'е, который я лабаю по работе так и сделано. Очень облегчает программирование форм в некоторых случаях...
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
„Магнитные“ поля ввода в диалогах
Если оно не установлено, то фокус на элемент не переходит при нажатии мышки или горячей клавиши, очевидно. Ну, для совместимости, наверное лучше обратный флаг - не захватывать фокус.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
„Магнитные“ поля ввода в диалогах
Это немного не то.
На примера диалога поиска во вьювере: допустим курсор стоит в блоке радиокнопок, и мы мышью кликаем по чекбоксу, куда должен перейти фокус?
1.По вашей предложению должен оставаться на месте.
2.Согласно первого поста должен перейти на чекбокс
3.Сейчас возвращается в поле ввода
Даже не знаю как лучше, но имхо всё-таки логичнее то, что в первом посте
Да.
„Магнитные“ поля ввода в диалогах
Мне кажется, это "отрицательное" мышление ("кому фокус не нужен/положен"). Я же пытался думать "положительно", т.е. "что мне надо". Ведь цель заключается в том, чтобы вводить текст в поля ввода и при этом иметь возможность менять какие-то другие опции, не теряя контекст ввода. Т.е. я рассуждаю с позиции "где я хочу остаться (если я уже там)", а не "куда я не хочу попасть".
Аспект обработки событий (получение/потеря фокуса) мною не рассматривался (т.е. не приведет ли это к каким-то нежелательным последовательностям и т.д.).
Если можно сделать такой макрос, который бы позволял "прицеплять" такое поведение к любому диалогу, то, понятное дело, сам Фар менять, может, и не нужно. Т.е. загружается некий скрипт, который как бы расширяет АПИ. Таким образом, что можно сказать:
setMagneticFieldс(DialogID, name1, name2, ...)
(я пока не очень понимаю, как лучше задавать поля -- ID, именами, индексами?)Я бы такое поведение с удовольствием прицепил бы к диалогу поиска файлов. Да и к некоторым другим тоже.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
„Магнитные“ поля ввода в диалогах
не вижу никаких препятствий.fml2 wrote:Если можно сделать такой макрос, который бы позволял "прицеплять" такое поведение к любому диалогу, то, понятное дело, сам Фар менять, может, и не нужно.
- John Doe
- Бюрократ
- Posts: 13851
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
„Магнитные“ поля ввода в диалогах
Всё чуть проще:
Code: Select all
local F = far.Flags
Macro { description="Sticky focus";
area="Dialog"; key="/([RL]Alt.)|MsLClick/";
uid="FEDB9B2C-7D29-4A78-8B0B-12D99CE32511";
condition=function() return Dlg.ItemType==F.DI_EDIT end;
action=function()
Keys"AKey"
if Area.Dialog and (Dlg.ItemType==F.DI_CHECKBOX or Dlg.ItemType==F.DI_RADIOBUTTON) then
Dlg.SetFocus(Dlg.PrevPos)
end
end;
}
„Магнитные“ поля ввода в диалогах
Поставил у себя -- замечательно работает! Намереваюсь пока не ставить никаких ограничений по диалогам, пусть всюду будет одинаковое поведение.
Думаю, можно еще вставить проверку, открыт ли после срабатывания горячей клваиши тот же самый диалог, что и до. Но это уже для каких-то крайних случаев.
С этим макро можно ведь и спевиальную опцию из просмотрщика убрать, так ведь?
Вот мой текст:
Думаю, можно еще вставить проверку, открыт ли после срабатывания горячей клваиши тот же самый диалог, что и до. Но это уже для каких-то крайних случаев.
С этим макро можно ведь и спевиальную опцию из просмотрщика убрать, так ведь?
Вот мой текст: