„Магнитные“ поля ввода в диалогах

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
Post Reply
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

„Магнитные“ поля ввода в диалогах

Post by fml2 »

Почитал вот эту ветку о возможности включения особого поведения диалога поиска в просмотрщике и подумал: а нельзя ли это дело обобщить?

Предлагаю добавить в диалоги свойство "магнитное поле ввода" (название придумал только сейчас, но оно, по-моему, довольно точно описывает суть происходящего; раньше такого нигде не видел; в сети не искал). Это свойство диалога может быть либо не установлено, либо указывать на какое-то одно конкретное поле текстового ввода, либо быть установлено в значение "все текстовые поля".

Если оно установлено (т.е. указывает на поле текстового ввода), то, если фокус ввода находится в этом поле и пользователь мышью или горячей клавишей выбирает какой-то другой нетекстовый элемент, то этот элемент "отрабатывается" (например, меняется состояние чек-бокса), после чего фокус автоматически возвращается в поле текстового ввода.

Если свойство установлено на "все текстовые поля", то такое поведение действует для всех текстовых полей диалога, а не только для одного конкретного.

Я только не уверен, стоит ли так делать и при нажатии мыши (т.е. при выборе нетекстового элемента мышью, а не горячей клавишей).

Цель -- сделать работу с помощью клавиатуры более быстрой и "беспрепятственной".

В диалоге поиска файлов (Alt+F7) значение "все текстовые поля", по-моему, не помешало бы.

Естественно, что это свойство должно быть устанавливаемо через АПИ, т.е. и из макро.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

„Магнитные“ поля ввода в диалогах

Post by Max Rusov »

IMHO, логичнее сделать наоборот: у элементов диалога типа Кнопка/CheckBox/RadiButton добавить флаг "Захватывать фокус". В framework'е, который я лабаю по работе так и сделано. Очень облегчает программирование форм в некоторых случаях...
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

„Магнитные“ поля ввода в диалогах

Post by John Doe »

Max Rusov wrote: у элементов диалога типа Кнопка/CheckBox/RadiButton добавить флаг "Захватывать фокус"
И как это должно работать?
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

„Магнитные“ поля ввода в диалогах

Post by Max Rusov »

Если оно не установлено, то фокус на элемент не переходит при нажатии мышки или горячей клавиши, очевидно. Ну, для совместимости, наверное лучше обратный флаг - не захватывать фокус.
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

„Магнитные“ поля ввода в диалогах

Post by zg »

макросом реализуется, не?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

„Магнитные“ поля ввода в диалогах

Post by John Doe »

Max Rusov wrote: не захватывать фокус.
Это немного не то.
На примера диалога поиска во вьювере: допустим курсор стоит в блоке радиокнопок, и мы мышью кликаем по чекбоксу, куда должен перейти фокус?

1.По вашей предложению должен оставаться на месте.
2.Согласно первого поста должен перейти на чекбокс
3.Сейчас возвращается в поле ввода
Даже не знаю как лучше, но имхо всё-таки логичнее то, что в первом посте
zg wrote: макросом реализуется, не?
Да.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

„Магнитные“ поля ввода в диалогах

Post by fml2 »

Max Rusov wrote: IMHO, логичнее сделать наоборот: у элементов диалога типа Кнопка/CheckBox/RadiButton добавить флаг "Захватывать фокус"
Мне кажется, это "отрицательное" мышление ("кому фокус не нужен/положен"). Я же пытался думать "положительно", т.е. "что мне надо". Ведь цель заключается в том, чтобы вводить текст в поля ввода и при этом иметь возможность менять какие-то другие опции, не теряя контекст ввода. Т.е. я рассуждаю с позиции "где я хочу остаться (если я уже там)", а не "куда я не хочу попасть".

Аспект обработки событий (получение/потеря фокуса) мною не рассматривался (т.е. не приведет ли это к каким-то нежелательным последовательностям и т.д.).
zg wrote: макросом реализуется, не?
Если можно сделать такой макрос, который бы позволял "прицеплять" такое поведение к любому диалогу, то, понятное дело, сам Фар менять, может, и не нужно. Т.е. загружается некий скрипт, который как бы расширяет АПИ. Таким образом, что можно сказать: setMagneticFieldс(DialogID, name1, name2, ...) (я пока не очень понимаю, как лучше задавать поля -- ID, именами, индексами?)

Я бы такое поведение с удовольствием прицепил бы к диалогу поиска файлов. Да и к некоторым другим тоже.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

„Магнитные“ поля ввода в диалогах

Post by John Doe »

fml2 wrote: Да и к некоторым другим тоже.
Например?
User avatar
zg
zero-gravity
Posts: 6035
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

„Магнитные“ поля ввода в диалогах

Post by zg »

fml2 wrote:Если можно сделать такой макрос, который бы позволял "прицеплять" такое поведение к любому диалогу, то, понятное дело, сам Фар менять, может, и не нужно.
не вижу никаких препятствий.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

„Магнитные“ поля ввода в диалогах

Post by John Doe »

fml2 wrote:Т.е. загружается некий скрипт, который как бы расширяет АПИ. Таким образом, что можно сказать: setMagneticFieldс(DialogID, name1, name2, ...)
Всё чуть проще:

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;
}
(Это только сырая идея, диалоги надо ловить избирательно)
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

„Магнитные“ поля ввода в диалогах

Post by fml2 »

Поставил у себя -- замечательно работает! Намереваюсь пока не ставить никаких ограничений по диалогам, пусть всюду будет одинаковое поведение.

Думаю, можно еще вставить проверку, открыт ли после срабатывания горячей клваиши тот же самый диалог, что и до. Но это уже для каких-то крайних случаев.

С этим макро можно ведь и спевиальную опцию из просмотрщика убрать, так ведь?

Вот мой текст:
  1. -- The effect of the following macro is: In the dialogs, if the user activates
  2.  
  3. -- a non text element (e.g. a check box or a radio button) using a hot key or
  4.  
  5. -- mouse, and the previous element was a text element, then the focus is
  6.  
  7. -- returned to the text element (after the hot key has done its work).
  8.  
  9. --
  10.  
  11. -- Author: John Doe (http://forum.farmanager.com/viewtopic.php?p=127885#p127885)
  12.  
  13.  
  14.  
  15. local F = far.Flags
  16.  
  17. Macro {
  18.  
  19.   description="Sticky focus";
  20.  
  21.   area="Dialog";
  22.  
  23.   key="/[RL]Alt.|MsLClick/";
  24.  
  25.   uid="FEDB9B2C-7D29-4A78-8B0B-12D99CE32511";
  26.  
  27.   condition=function()
  28.  
  29.     return Dlg.ItemType==F.DI_EDIT
  30.  
  31.   end;
  32.  
  33.   action=function()
  34.  
  35.     Keys"AKey"
  36.  
  37.     if Area.Dialog and (Dlg.ItemType==F.DI_CHECKBOX or Dlg.ItemType==F.DI_RADIOBUTTON) then
  38.  
  39.       Dlg.SetFocus(Dlg.PrevPos)
  40.  
  41.     end
  42.  
  43.   end;
  44.  
  45. }
Post Reply

Return to “Предложения и идеи”