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

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post 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. }
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Версия 2016.09.21.1: исправлено зацикливание в главных меню
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Для информации:
http://forum.farmanager.com/viewtopic.php?f=15&t=9197
Если использовать хоткей с модификатором Alt, то фильтрации не происходит, а только лишь перемещается курсор
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Меня вот эта строка настораживает

Code: Select all

Keys( Area.Current == 'MainMenu' and 'Right' or 'Down' )
MainMenu может быть как горизонтальным так и вертикальным, поэтому не уверен что этот код работает как задумано.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

John Doe wrote: Меня вот эта строка настораживает

Code: Select all

Keys( Area.Current == 'MainMenu' and 'Right' or 'Down' )
С вариантом Keys( Area.MainMenu and 'Right' or 'Down' ) эффект тот же.
А у Вас воспроизводится?
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Добавлена ссылка на обсуждение падения
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

HaRT wrote: С вариантом Keys( Area.MainMenu and 'Right' or 'Down' ) эффект тот же.
Я вообще-то имел ввиду что не понимаю как тут Right вообще может работать.
Баг в скрипте, он зацикливается.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

John Doe wrote: Баг в скрипте, он зацикливается.
Блин, и в самом деле. Оказывается, эти подменю тоже имеют Area.MainMenu. Как же мне тогда отличить горизонтальное меню от вертикального?
Обсуждение переношу к скрипту.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

В макро апи нет средств чтобы отличить вертикальное от горизонтального.
Как-то так можно:

Code: Select all

    local key = "Down"
    if Area.MainMenu and far.AdvControl("ACTL_GETWINDOWINFO").Type==0x10 then
      key = "Right"
    end
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

HaRT wrote: Как же мне тогда отличить горизонтальное меню от вертикального?
Можно, конечно, по косвенным признакам, но хотелось бы прямой проверкой.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

Для макроапи тоже было бы неплохо, тикет давно висит http://bugs.farmanager.com/view.php?id=2760
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

John Doe wrote: Как-то так можно
Спасибо!
Только либо просто 10, либо уж 0x0A. Я исправил код в шапке.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

HaRT wrote: либо просто 10, либо уж 0x0A
Перемудрил)
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

Return to “Обсуждение макросов”