Перемещение по списку на примере 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 »

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

Задача вроде несложная, но документации из macroapi_manual.ru.chm оказалось недостаточно для такого простого действия.
Попытался реализовать и даже заработало, но выглядит коряво и наверняка можно улучшить:
  1. Macro {
  2.  
  3.   description = "conemu cycle panel modes";
  4.  
  5.   area = "Shell";
  6.  
  7.   key = "/.Ctrl.Alt(Right|Left)/"; -- CtrlAltLeft - движемся вверх циклически, CtrlAltRight - движемся вниз циклически
  8.  
  9.   action = function()
  10.  
  11.     local moveup = akey(1):sub(-2)=="ft"; -- нажатие оканчивается на "ft" - значит было нажато CtrlAltLeft - направление движения
  12.  
  13.     Keys("F11 p Home"); -- F11 -> ConEmu Panel Views -> В начало списка из трёх пунктов
  14.  
  15.     local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id;
  16.  
  17.     local list = far.GetDlgItem(hDlg,1)[6]; -- первый (и единственный) элемент диалога - список, 6 - это запрашиваем ListItems
  18.  
  19.     local sel1 = bit64.band(bit64.rshift(list[1].Flags,16),2)==2; -- есть ли галка на первом пункте
  20.  
  21.     local sel2 = bit64.band(bit64.rshift(list[2].Flags,16),2)==2; -- есть ли галка на втором пункте
  22.  
  23.     local cur=3; -- если нет галок, то текущим будет третий пункт - "отключить"
  24.  
  25.     if sel1 then cur=1 end; -- если галка на первом - то текущим будет первый пункт - "режим эскизов"
  26.  
  27.     if sel2 then cur=2 end; -- если галка на втором - то текущим будет второй пункт - "режим плитки"
  28.  
  29.     if moveup then
  30.  
  31.         cur = mf.mod(cur+1,3)+1 -- перемещаемся вверх (1,2,3 -> 3,1,2)
  32.  
  33.     else
  34.  
  35.         cur = mf.mod(cur,3)+1 -- перемещаемся вниз (1,2,3 -> 2,3,1)
  36.  
  37.     end;
  38.  
  39.     while cur>1 do Keys("Down");cur=cur-1; end; -- раз нельзя указать какой пункт выбрать, то сделаем несколько нажатий Down
  40.  
  41.     Keys("Enter"); -- подтверждаем
  42.  
  43.   end;
  44.  
  45. }
Столкнулся с такими трудностями:
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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

ConEmu у меня нет, поэтому данный ответ будет "теоретическим".
Вы всё ссылаетесь на macroapi_manual.ru.chm, в то время как половина вашего кода использует API из luafar_manual.chm. Эти документы описывают две разные библиотеки. Пользоваться можно обеими в одном скрипте, но нужно осознавать, которой пользуешься в данном месте кода, и смотреть в соответствующей документации.
Alexey Lubkin wrote: Wed 04 Oct, 2017 23:371. В документации было про menu.ItemStatus([Pos]) для узнавания, есть ли галка у пункта меню под номером Pos, но на деле никакого menu нет.
menu нет, есть Menu.
Alexey Lubkin wrote: Wed 04 Oct, 2017 23:372. У списка (list) никакого ItemStatus() нет
Потому что Menu.ItemStatus - это функция из macro-API, а list[n] - это элемент списка, полученного посредством LuaFAR-API. Смешались в кучу кони, люди.
Alexey Lubkin wrote: Wed 04 Oct, 2017 23:373. Согласно 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 »

С Menu.ItemStatus заработало. Сбили с толку маленькие буквы в документации:
menu.png
menu.png (14.42 KiB) Viewed 9524 times
Получился такой код:
  1. Macro {
  2.  
  3.   description = "conemu cycle panel modes";
  4.  
  5.   area = "Shell";
  6.  
  7.   key = "/.Ctrl.Alt(Right|Left)/"; -- CtrlAltLeft - движемся вверх циклически, CtrlAltRight - движемся вниз циклически
  8.  
  9.   action = function()
  10.  
  11.     Plugin.Menu("BD454D48-448E-46CC-909D-B6CF789C2D65","128414A5-68A2-44D2-B092-C9C5225324E1");
  12.  
  13.     local moveup = (akey(1):sub(-2)=="ft") and 1 or 0; -- нажатие оканчивается на "ft" - значит было нажато CtrlAltLeft - направление движения
  14.  
  15.     local cur=3; -- если нет галок, то текущим будет третий пункт - "отключить"
  16.  
  17.     if bit64.band(Menu.ItemStatus(1),2)==2 then cur=1 end; -- если галка на первом - то текущим будет первый пункт - "режим эскизов"
  18.  
  19.     if bit64.band(Menu.ItemStatus(2),2)==2 then cur=2 end; -- если галка на втором - то текущим будет второй пункт - "режим плитки"
  20.  
  21.     cur = mf.mod(cur+moveup,3)+1 -- перемещаемся вверх (1,2,3 -> 3,1,2) или вниз вниз (1,2,3 -> 2,3,1)
  22.  
  23.     far.AdvControl("ACTL_GETWINDOWINFO").Id:send("DM_LISTSETCURPOS", 1, {SelectPos=cur}); -- выбираем пункт номер cur
  24.  
  25.     Keys("Enter"); -- подтверждаем
  26.  
  27.   end;
  28.  
  29. }
Странный этот 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: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

 ! Message from: HaRT
Alexey Lubkin wrote: Thu 05 Oct, 2017 11:08Странный этот LUA
Обсуждение отделено.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

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

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