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

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Fri 06 May, 2016 17:21

Скрипт работает в разнообразных меню, в т.ч. в меню дисков; ищет в от текущей позиции, если не нашёл — от начала.
Поддерживает дублирующиеся горячие клавиши (обходит по кругу). Горячие клавиши, для ввода которых требуется нажатие Shift (например ‘#’, ‘_’), пока не поддерживаются.
  1. -- Position to menu item by Alt-Hotkey, version 2016.09.21.1
  2. -- See http:// forum.farmanager.com/viewtopic.php?p=137572#p137572
  3. local function searchFromPos( c, n, jumpKeys )
  4.   local pos = Object.CheckHotkey( c, n )
  5.   if pos > 0 then
  6.     Keys(jumpKeys)  -- no visible harm if jumpKeys is nil
  7.     local windowType = far.AdvControl("ACTL_GETWINDOWINFO").Type
  8.     local horizontal = Area.MainMenu and windowType == 10  
  9.     while Object.CurPos < pos and not Object.Eof do
  10.       Keys( horizontal and 'Right' or 'Down' )
  11.     end
  12.     return true
  13.   end
  14.   return false
  15. end
  16.  
  17. Macro {  -- TODO support characters available with Shift, e.g. '#'
  18.   description = 'Position to character';
  19.   area = "MainMenu Menu UserMenu Disks"; key = '/[LR]Alt./';
  20.   action = function()
  21.     local c = akey(1):sub(-1)
  22.     local found = searchFromPos( c, Object.CurPos + 1 )
  23.     if not found then    
  24.       searchFromPos( c, 0, 'Home' )
  25.     end
  26.   end
  27. }
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: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Sat 07 May, 2016 20:23

Для информации:
viewtopic.php?f=15&t=9197
Если использовать хоткей с модификатором Alt, то фильтрации не происходит, а только лишь перемещается курсор

User avatar
John Doe
Бюрократ
Posts: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Wed 21 Sep, 2016 21:12

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

Code: Select all

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

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Wed 21 Sep, 2016 21:16

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: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Wed 21 Sep, 2016 21:20

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

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Wed 21 Sep, 2016 21:30

John Doe wrote: Баг в скрипте, он зацикливается.
Блин, и в самом деле. Оказывается, эти подменю тоже имеют Area.MainMenu. Как же мне тогда отличить горизонтальное меню от вертикального?
Обсуждение переношу к скрипту.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Wed 21 Sep, 2016 21:31

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

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: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Wed 21 Sep, 2016 21:32

HaRT wrote: Как же мне тогда отличить горизонтальное меню от вертикального?
Можно, конечно, по косвенным признакам, но хотелось бы прямой проверкой.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Wed 21 Sep, 2016 21:36

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

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

User avatar
HaRT
Moderator
Posts: 8109
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 times

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

Post by HaRT » Wed 21 Sep, 2016 21:46

John Doe wrote: Как-то так можно
Спасибо!
Только либо просто 10, либо уж 0x0A. Я исправил код в шапке.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Wed 21 Sep, 2016 21:57

HaRT wrote: либо просто 10, либо уж 0x0A
Перемудрил)

User avatar
John Doe
Бюрократ
Posts: 11395
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 17 times
Been thanked: 101 times

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

Post by John Doe » Fri 06 Oct, 2017 07:58

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

Post Reply

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