Перемещение по списку на примере ConEmu Panel Views

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Wed 04 Oct, 2017 23:37

Задача: переключаться циклически между разными режимами отображения панели (обычный, эскизы, плитка) плагина ConEmu (F11 -> ConEmu Panel Views) по нажатию CtrlAltRight/CtrlAltLeft.
Список из трёх пунктов: эскизы, плитка, отключить. На каком-то из пунктов может стоять галка.

Задача вроде несложная, но документации из macroapi_manual.ru.chm оказалось недостаточно для такого простого действия.
Попытался реализовать и даже заработало, но выглядит коряво и наверняка можно улучшить:
  1. Macro {
  2.   description = "conemu cycle panel modes";
  3.   area = "Shell";
  4.   key = "/.Ctrl.Alt(Right|Left)/"; -- CtrlAltLeft - движемся вверх циклически, CtrlAltRight - движемся вниз циклически
  5.   action = function()
  6.     local moveup = akey(1):sub(-2)=="ft"; -- нажатие оканчивается на "ft" - значит было нажато CtrlAltLeft - направление движения
  7.     Keys("F11 p Home"); -- F11 -> ConEmu Panel Views -> В начало списка из трёх пунктов
  8.     local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id;
  9.     local list = far.GetDlgItem(hDlg,1)[6]; -- первый (и единственный) элемент диалога - список, 6 - это запрашиваем ListItems
  10.     local sel1 = bit64.band(bit64.rshift(list[1].Flags,16),2)==2; -- есть ли галка на первом пункте
  11.     local sel2 = bit64.band(bit64.rshift(list[2].Flags,16),2)==2; -- есть ли галка на втором пункте
  12.     local cur=3; -- если нет галок, то текущим будет третий пункт - "отключить"
  13.     if sel1 then cur=1 end; -- если галка на первом - то текущим будет первый пункт - "режим эскизов"
  14.     if sel2 then cur=2 end; -- если галка на втором - то текущим будет второй пункт - "режим плитки"
  15.     if moveup then
  16.         cur = mf.mod(cur+1,3)+1 -- перемещаемся вверх (1,2,3 -> 3,1,2)
  17.     else
  18.         cur = mf.mod(cur,3)+1 -- перемещаемся вниз (1,2,3 -> 2,3,1)
  19.     end;
  20.     while cur>1 do Keys("Down");cur=cur-1; end; -- раз нельзя указать какой пункт выбрать, то сделаем несколько нажатий Down
  21.     Keys("Enter"); -- подтверждаем
  22.   end;
  23. }
Столкнулся с такими трудностями:
1. В документации было про menu.ItemStatus([Pos]) для узнавания, есть ли галка у пункта меню под номером Pos, но на деле никакого menu нет. Вместо этого слова строчки 8-9.
2. У списка (list) никакого ItemStatus() нет, зато у элемента списка (list[ i ]) есть .Text - жаль, не нужен. Перепробовал Checked/Status/Selected - таких нет. Оказалось есть .Flags, которых нет в macroapi_manual.ru.chm. В этих .Flags младшие 16 бит нули, а в 17 и 18 есть полезная информация (строки 10-11).
3. Согласно macroapi_manual.ru.chm выставить в списке текущим элемент по номеру (как и 10 лет назад) не представляется возможным. Поэтому нужно в цикле нажимать Down несколько раз (строки 20-21). Или можно уже?
Last edited by Alexey Lubkin on Wed 04 Oct, 2017 23:44, edited 1 time in total.

Shmuel
Posts: 5234
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 152 times

Перемещение по списку на примере ConEmu Panel Views

Post by Shmuel » Thu 05 Oct, 2017 00:47

ConEmu у меня нет, поэтому данный ответ будет "теоретическим".
Вы всё ссылаетесь на macroapi_manual.ru.chm, в то время как половина вашего кода использует API из luafar_manual.chm. Эти документы описывают две разные библиотеки. Пользоваться можно обеими в одном скрипте, но нужно осознавать, которой пользуешься в данном месте кода, и смотреть в соответствующей документации.
Alexey Lubkin wrote:
Wed 04 Oct, 2017 23:37
1. В документации было про menu.ItemStatus([Pos]) для узнавания, есть ли галка у пункта меню под номером Pos, но на деле никакого menu нет.
menu нет, есть Menu.
Alexey Lubkin wrote:
Wed 04 Oct, 2017 23:37
2. У списка (list) никакого ItemStatus() нет
Потому что Menu.ItemStatus - это функция из macro-API, а list[n] - это элемент списка, полученного посредством LuaFAR-API. Смешались в кучу кони, люди.
Alexey Lubkin wrote:
Wed 04 Oct, 2017 23:37
3. Согласно macroapi_manual.ru.chm выставить в списке текущим элемент по номеру (как и 10 лет назад) не представляется возможным.
Попробуйте через hDlg:send("DM_LISTSETCURPOS").
Last edited by Shmuel on Thu 05 Oct, 2017 01:13, edited 3 times in total.

Alexey Lubkin
Posts: 106
Joined: Sun 23 Oct, 2005 10:02
Location: Томск
Has thanked: 1 time
Contact:

Перемещение по списку на примере ConEmu Panel Views

Post by Alexey Lubkin » Thu 05 Oct, 2017 11:08

С Menu.ItemStatus заработало. Сбили с толку маленькие буквы в документации:
menu.png
menu.png (14.42 KiB) Viewed 983 times
Получился такой код:
  1. Macro {
  2.   description = "conemu cycle panel modes";
  3.   area = "Shell";
  4.   key = "/.Ctrl.Alt(Right|Left)/"; -- CtrlAltLeft - движемся вверх циклически, CtrlAltRight - движемся вниз циклически
  5.   action = function()
  6.     Plugin.Menu("BD454D48-448E-46CC-909D-B6CF789C2D65","128414A5-68A2-44D2-B092-C9C5225324E1");
  7.     local moveup = (akey(1):sub(-2)=="ft") and 1 or 0; -- нажатие оканчивается на "ft" - значит было нажато CtrlAltLeft - направление движения
  8.     local cur=3; -- если нет галок, то текущим будет третий пункт - "отключить"
  9.     if bit64.band(Menu.ItemStatus(1),2)==2 then cur=1 end; -- если галка на первом - то текущим будет первый пункт - "режим эскизов"
  10.     if bit64.band(Menu.ItemStatus(2),2)==2 then cur=2 end; -- если галка на втором - то текущим будет второй пункт - "режим плитки"
  11.     cur = mf.mod(cur+moveup,3)+1 -- перемещаемся вверх (1,2,3 -> 3,1,2) или вниз вниз (1,2,3 -> 2,3,1)
  12.     far.AdvControl("ACTL_GETWINDOWINFO").Id:send("DM_LISTSETCURPOS", 1, {SelectPos=cur}); -- выбираем пункт номер cur
  13.     Keys("Enter"); -- подтверждаем
  14.   end;
  15. }
Странный этот LUA:
Привычные и логичные and и or тут непривычные и нелогичные:
0 and 0 ==> 0
0 and 1 ==> 1
0 and 2 ==> 2
0 and 3 ==> 3
1 and 0 ==> 0
1 and 1 ==> 1
1 and 2 ==> 2
1 and 3 ==> 3
Last edited by Alexey Lubkin on Thu 05 Oct, 2017 11:48, edited 2 times in total.

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

Перемещение по списку на примере ConEmu Panel Views

Post by HaRT » Fri 06 Oct, 2017 13:12

 ! Message from: HaRT
Alexey Lubkin wrote:
Thu 05 Oct, 2017 11:08
Странный этот LUA
Обсуждение отделено.
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

Перемещение по списку на примере ConEmu Panel Views

Post by John Doe » Sun 08 Oct, 2017 14:34

В комплекте Conemu есть скрипт ConEmu.Thumbnails.lua (ConEmu: Switch Thumbnails/Tiles view on active panel).
Подозреваю он должен быть в тему.

Переключение осуществляется нарямую (Plugin.Call), без хождений по менюшкам.

Post Reply

Return to “Нужна помощь”