Page 1 of 1
Позиционирование в меню по Alt-ГорячаяКлавиша
Posted: Fri 06 May, 2016 17:21
by HaRT
Скрипт работает в разнообразных меню, в т.ч. в меню дисков; ищет в от текущей позиции, если не нашёл — от начала.
Поддерживает дублирующиеся горячие клавиши (обходит по кругу). Горячие клавиши, для ввода которых требуется нажатие Shift (например ‘#’, ‘_’), пока не поддерживаются.
-- Position to menu item by Alt-Hotkey, version 2016.09.21.1
-- See http:// forum.farmanager.com/viewtopic.php?p=137572#p137572
local function searchFromPos( c, n, jumpKeys )
local pos = Object.CheckHotkey( c, n )
if pos > 0 then
Keys(jumpKeys) -- no visible harm if jumpKeys is nil
local windowType = far.AdvControl("ACTL_GETWINDOWINFO").Type
local horizontal = Area.MainMenu and windowType == 10
while Object.CurPos < pos and not Object.Eof do
Keys( horizontal and 'Right' or 'Down' )
end
return true
end
return false
end
Macro { -- TODO support characters available with Shift, e.g. '#'
description = 'Position to character';
area = "MainMenu Menu UserMenu Disks"; key = '/[LR]Alt./';
action = function()
local c = akey(1):sub(-1)
local found = searchFromPos( c, Object.CurPos + 1 )
if not found then
searchFromPos( c, 0, 'Home' )
end
end
}
Позиционирование в меню по 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:32HaRT wrote: Как же мне тогда отличить горизонтальное меню от вертикального?
Можно, конечно, по косвенным признакам, но хотелось бы прямой проверкой.
На
мантисе я просил отдельную макрообласть для HMENU, но..
По факту у меня например всего 3 макроса это использовали бы, так что не знаю как лучше.
Если не заводить отдельную макрообласть, тогда необходимо документировать, что случай, когда меню не раскрыто, можно определить, используя Object.Height.