Page 1 of 1

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Fri 06 May, 2016 17:21
by HaRT
Скрипт работает в разнообразных меню, в т.ч. в меню дисков; ищет в от текущей позиции, если не нашёл — от начала.
Поддерживает дублирующиеся горячие клавиши (обходит по кругу). Горячие клавиши, для ввода которых требуется нажатие Shift (например ‘#’, ‘_’), пока не поддерживаются.
  1. -- Position to menu item by Alt-Hotkey, version 2016.09.21.1
  2.  
  3. -- See http:// forum.farmanager.com/viewtopic.php?p=137572#p137572
  4.  
  5. local function searchFromPos( c, n, jumpKeys )
  6.  
  7.   local pos = Object.CheckHotkey( c, n )
  8.  
  9.   if pos > 0 then
  10.  
  11.     Keys(jumpKeys)  -- no visible harm if jumpKeys is nil
  12.  
  13.     local windowType = far.AdvControl("ACTL_GETWINDOWINFO").Type
  14.  
  15.     local horizontal = Area.MainMenu and windowType == 10  
  16.  
  17.     while Object.CurPos < pos and not Object.Eof do
  18.  
  19.       Keys( horizontal and 'Right' or 'Down' )
  20.  
  21.     end
  22.  
  23.     return true
  24.  
  25.   end
  26.  
  27.   return false
  28.  
  29. end
  30.  
  31.  
  32.  
  33. Macro {  -- TODO support characters available with Shift, e.g. '#'
  34.  
  35.   description = 'Position to character';
  36.  
  37.   area = "MainMenu Menu UserMenu Disks"; key = '/[LR]Alt./';
  38.  
  39.   action = function()
  40.  
  41.     local c = akey(1):sub(-1)
  42.  
  43.     local found = searchFromPos( c, Object.CurPos + 1 )
  44.  
  45.     if not found then    
  46.  
  47.       searchFromPos( c, 0, 'Home' )
  48.  
  49.     end
  50.  
  51.   end
  52.  
  53. }

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Sat 07 May, 2016 20:23
by John Doe
Для информации:
http://forum.farmanager.com/viewtopic.php?f=15&t=9197
Если использовать хоткей с модификатором Alt, то фильтрации не происходит, а только лишь перемещается курсор

LuaMacro — Lua как язык макросов

Posted: Wed 21 Sep, 2016 21:12
by John Doe
Меня вот эта строка настораживает

Code: Select all

Keys( Area.Current == 'MainMenu' and 'Right' or 'Down' )
MainMenu может быть как горизонтальным так и вертикальным, поэтому не уверен что этот код работает как задумано.

LuaMacro — Lua как язык макросов

Posted: Wed 21 Sep, 2016 21:16
by HaRT
John Doe wrote: Меня вот эта строка настораживает

Code: Select all

Keys( Area.Current == 'MainMenu' and 'Right' or 'Down' )
С вариантом Keys( Area.MainMenu and 'Right' or 'Down' ) эффект тот же.
А у Вас воспроизводится?

LuaMacro — Lua как язык макросов

Posted: Wed 21 Sep, 2016 21:20
by John Doe
HaRT wrote: С вариантом Keys( Area.MainMenu and 'Right' or 'Down' ) эффект тот же.
Я вообще-то имел ввиду что не понимаю как тут Right вообще может работать.
Баг в скрипте, он зацикливается.

LuaMacro — Lua как язык макросов

Posted: Wed 21 Sep, 2016 21:30
by HaRT
John Doe wrote: Баг в скрипте, он зацикливается.
Блин, и в самом деле. Оказывается, эти подменю тоже имеют Area.MainMenu. Как же мне тогда отличить горизонтальное меню от вертикального?
Обсуждение переношу к скрипту.

LuaMacro — Lua как язык макросов

Posted: Wed 21 Sep, 2016 21:31
by John Doe
В макро апи нет средств чтобы отличить вертикальное от горизонтального.
Как-то так можно:

Code: Select all

    local key = "Down"
    if Area.MainMenu and far.AdvControl("ACTL_GETWINDOWINFO").Type==0x10 then
      key = "Right"
    end

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Wed 21 Sep, 2016 21:32
by HaRT
HaRT wrote: Как же мне тогда отличить горизонтальное меню от вертикального?
Можно, конечно, по косвенным признакам, но хотелось бы прямой проверкой.

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Wed 21 Sep, 2016 21:36
by John Doe
Через апи плагинов более-менее прямо, если не считать того, что константы нет: http://bugs.farmanager.com/view.php?id=2761

Для макроапи тоже было бы неплохо, тикет давно висит http://bugs.farmanager.com/view.php?id=2760

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Wed 21 Sep, 2016 21:46
by HaRT
John Doe wrote: Как-то так можно
Спасибо!
Только либо просто 10, либо уж 0x0A. Я исправил код в шапке.

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Wed 21 Sep, 2016 21:57
by John Doe
HaRT wrote: либо просто 10, либо уж 0x0A
Перемудрил)

Позиционирование в меню по Alt-ГорячаяКлавиша

Posted: Fri 06 Oct, 2017 07:58
by John Doe
HaRT wrote: Wed 21 Sep, 2016 21:32
HaRT wrote: Как же мне тогда отличить горизонтальное меню от вертикального?
Можно, конечно, по косвенным признакам, но хотелось бы прямой проверкой.
На мантисе я просил отдельную макрообласть для HMENU, но..
По факту у меня например всего 3 макроса это использовали бы, так что не знаю как лучше.
Если не заводить отдельную макрообласть, тогда необходимо документировать, что случай, когда меню не раскрыто, можно определить, используя Object.Height.