Автофильтр в панелях

Здесь обсуждается всё, что касается макросов.
mi3antrop
Posts: 49
Joined: Tue 15 Nov, 2005 18:31
Contact:

Автофильтр в панелях

Post by mi3antrop »

В аттаче макрос для фильтрации в панелях по мере ввода в строке быстрого поиска.
Если кому из знатоков не лень, как можно добавить поддержку PanelTabs?
Attachments
AutoFilter.zip
(1.8 KiB) Downloaded 210 times
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Автофильтр в панелях

Post by gotar »

Я уже видел у нескольких людей, что lua функции оформляются в виде макросов. Зачем? Чем хуже вызов функции по сравнению выглядящем ужасно eval? Откуда это идет? Неужели причина только в том, что в прошлом языке не было функций?
mi3antrop
Posts: 49
Joined: Tue 15 Nov, 2005 18:31
Contact:

Re: Автофильтр в панелях

Post by mi3antrop »

Неужели причина только в том, что в прошлом языке не было функций?
Этот макрос начинался ещё в 1.7, потом просто по-быстрому актуализировался. Табами я раньше не пользовался, в документации ничего подходящего не нашёл.
Если макрос не нравится - переделайте, чтоб было красиво.
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Автофильтр в панелях

Post by Shmuel »

gotar wrote:Чем хуже вызов функции по сравнению выглядящем ужасно eval? Откуда это идет? Неужели причина только в том, что в прошлом языке не было функций?
Скорее всего, причина именно в этом. Привычка.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Автофильтр в панелях

Post by SUSim »

не только в этом, evale удобнее тем, что:
1) можно вызвать из другого файла(макроса) - не городя модули...
2) (имхо, самое главное) локальные переменные для макроса доступны из другого макроса (кстати, объявленная фича) - не захламляя глобальную область...

сорри за офтоп?
SimSU ··· ·· -- ··· ··-
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Автофильтр в панелях

Post by gotar »

Так и _G. функции и переменные доступны из любого файла.

Чтобы не захламлять глобальную область можно создать отдельную таблицу, в которую поместить данные и функции работы с этими данными. Модули не обязательно использовать. В данном случае, на мой взгляд, таблицы удобнее.
Last edited by gotar on Wed 06 Feb, 2013 19:23, edited 4 times in total.
User avatar
John Doe
Бюрократ
Posts: 13860
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Автофильтр в панелях

Post by John Doe »

SUSim wrote:2) (имхо, самое главное) локальные переменные для макроса доступны из другого макроса (кстати, объявленная фича)
Что за фича? Пример кода можно?
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Автофильтр в панелях

Post by SUSim »

gotar, я сделую одну таблицу в _G, ты другую, и все остальные по одной и... в глобальной области 1000 лишних операторов....
в макрофайле.
SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: Автофильтр в панелях

Post by SUSim »

John Doe что-то не могу найти официальную ссылку :((( было же где то.... сорри, :oops:

Смысл в следующем если в макрофайле сделать переменную то она для всех макросов из этого файла будет как глобальная, а засорять глобальную область не будет!!!
Раньше чтобы передать из макроса в макрос переменную я пользовался _G., а сейчас не использую для своих глобальных переменных переменную описанную в начале файла она доступна для макросов из одного файла в течении сессии, смотри мои макросы например, SimSU.Common.RememberPositionF11.lua
SimSU ··· ·· -- ··· ··-
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: Автофильтр в панелях

Post by Max Rusov »

SUSim wrote:в глобальной области 1000 лишних операторов....
И что?
gotar
Posts: 420
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Автофильтр в панелях

Post by gotar »

Мне, как пользователю Ваших макросов, удобнее таблицы. При аккуратном добавлении данных в таблицу _G. я не предвижу негативных последствий. В сегодняшней ситуации я просто копирую код из Ваших макросов в свои, что неудобно при обновлении Ваших макросов.
User avatar
John Doe
Бюрократ
Posts: 13860
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Автофильтр в панелях

Post by John Doe »

Когда-то скачал этот макрос, ничего не понял в коде, и попытался расшифровать/избавить от мусора/улучшить.
(Проще наверно с нуля написать было, но в то время я только начал осваивать lua)

Вот что вышло:
  1. --http://forum.farmanager.com/viewtopic.php?p=117974#p117974
  2.  
  3. local PanelAutoFilter = {Left="*",Right="*"}
  4.  
  5. local function Side()
  6.  
  7.   return APanel.Left and "Left" or "Right"
  8.  
  9. end;
  10.  
  11.  
  12.  
  13. local IsOn = true
  14.  
  15. local function FilterIsOn(state)
  16.  
  17.   if state=="Toggle" then IsOn = not IsOn end
  18.  
  19.   return IsOn
  20.  
  21. end
  22.  
  23.  
  24.  
  25. local filtername = "_panelfilter_"
  26.  
  27.  
  28.  
  29. local FiltersMenuId = "5B87B32E-494A-4982-AF55-DAFFCD251383"
  30.  
  31. local function FiltersMenu()
  32.  
  33.   Keys"CtrlI"; assert(Menu.Id==FiltersMenuId)
  34.  
  35. end
  36.  
  37.  
  38.  
  39. local function setSearch(str)
  40.  
  41.   Keys"Alt,"; assert(Area.Search)
  42.  
  43.   if str then mf.print(str) end
  44.  
  45. end
  46.  
  47.  
  48.  
  49. local function setFilter(side,str)
  50.  
  51.   FiltersMenu()
  52.  
  53.   if Menu.Select(filtername..side,1)>0 then
  54.  
  55.     Keys"F4"
  56.  
  57.   else
  58.  
  59.     Keys"Ins"
  60.  
  61.     mf.print("&"..filtername..side)
  62.  
  63.   end
  64.  
  65.   PanelAutoFilter[side] = str
  66.  
  67.   Keys"Tab Tab CtrlY"
  68.  
  69.   mf.print(str.."*")
  70.  
  71.   Dlg.SetFocus(36) --[?] Directory
  72.  
  73.   for i=1,(2-Dlg.GetValue(36,0)) do Keys"Space" end
  74.  
  75.   Keys"Enter"
  76.  
  77.   if band(Menu.ItemStatus(),0x2)==0 then Keys"Add" end
  78.  
  79.   Keys"Enter"
  80.  
  81.   setSearch(str)
  82.  
  83. end
  84.  
  85.  
  86.  
  87. Macro { description="Panel filter: Add char"; --Добавление символа в автофильтр
  88.  
  89.   area="Search";
  90.  
  91.   key=[[/[A-Z0-9,<ю>;:\'\"\[{\\\]}`~_!@#$%^&*()]/]];
  92.  
  93.   condition=FilterIsOn;
  94.  
  95.   action=function()
  96.  
  97.     local side = Side()
  98.  
  99.     setFilter(side,PanelAutoFilter[side]..mf.akey(1))
  100.  
  101.   end;
  102.  
  103. }
  104.  
  105.  
  106.  
  107. Macro { description="Panel filter: Clear"; --Очистка автофильтр панели
  108.  
  109.   area="Search"; key="Del";
  110.  
  111.   condition=FilterIsOn;
  112.  
  113.   action=function()
  114.  
  115.     local side = Side()
  116.  
  117.     FiltersMenu()
  118.  
  119.     while Menu.Select(filtername..side,1)>0 do
  120.  
  121.       Keys"Del Enter"
  122.  
  123.     end
  124.  
  125.     PanelAutoFilter[side] = "*"
  126.  
  127.     Keys"Enter"
  128.  
  129.   end;
  130.  
  131. }
  132.  
  133.  
  134.  
  135. Macro { description="Panel filter: BS"; --Удалить символ из автофильтра
  136.  
  137.   area="Search"; key="BS";
  138.  
  139.   condition=FilterIsOn;
  140.  
  141.   action=function()
  142.  
  143.     local side = Side()
  144.  
  145.     local str = PanelAutoFilter[side]:sub(1,-2)
  146.  
  147.     if str=="*" then
  148.  
  149.       FiltersMenu()
  150.  
  151.       if Menu.Select(filtername..side,1)>0 then
  152.  
  153.         Keys"Del Enter"
  154.  
  155.       end
  156.  
  157.       Keys"Esc"
  158.  
  159.       setSearch(str)
  160.  
  161.     else
  162.  
  163.       setFilter(side,str)
  164.  
  165.     end
  166.  
  167.   end;
  168.  
  169. }
  170.  
  171.  
  172.  
  173. local function clearFilters() --Очистка всех автофильтров
  174.  
  175.   FiltersMenu()
  176.  
  177.   local NeedUpdate = PPanel.Filter and PPanel.Visible
  178.  
  179.   while Menu.Select(filtername,1)>0 do
  180.  
  181.     Keys"Del Enter"
  182.  
  183.   end
  184.  
  185.   Keys"Enter"
  186.  
  187.   if NeedUpdate then Keys"Tab CtrlI Enter Tab" end --Update passive panel
  188.  
  189.   PanelAutoFilter.Left = "*";
  190.  
  191.   PanelAutoFilter.Right = "*";
  192.  
  193. end;
  194.  
  195.  
  196.  
  197. Macro { description="Panel filter: Clear all";
  198.  
  199.   area="Search"; key="CtrlShiftDel";
  200.  
  201.   condition=FilterIsOn;
  202.  
  203.   action=clearFilters
  204.  
  205. }
  206.  
  207.  
  208.  
  209. local function MessagePopup(msg,title,flags,delay)
  210.  
  211.   local s = far.SaveScreen()
  212.  
  213.   far.Message(msg,title or "","",flags)
  214.  
  215.   win.Sleep(delay or 500); far.RestoreScreen(s)
  216.  
  217. end
  218.  
  219.  
  220.  
  221. NoMacro { description="Panel filter: on/off"; --Вкл/выкл автофильтрацию панели при изменении поля быстрого поиска
  222.  
  223.   area="Shell Search"; key="CtrlAltF";
  224.  
  225.   action=function()
  226.  
  227.     if not FilterIsOn"Toggle" then clearFilters() end
  228.  
  229.     MessagePopup(FilterIsOn() and "On" or "Off","Panel filter")
  230.  
  231.   end;
  232.  
  233. }
  234.  
  235. Macro { description="Panel filter: on/off"; --Вкл/выкл автофильтрацию панели при изменении поля быстрого поиска
  236.  
  237.   area="Shell Search"; key="CtrlAltF";
  238.  
  239.   action=function()
  240.  
  241.     local str
  242.  
  243.     if Area.Search then
  244.  
  245.       mf.clip(5); Keys"CtrlIns"
  246.  
  247.       str = mf.clip()
  248.  
  249.     end
  250.  
  251.  
  252.  
  253.     if FilterIsOn"Toggle" then
  254.  
  255.       if str then
  256.  
  257.         setFilter(Side(),str)
  258.  
  259.       else
  260.  
  261.         setSearch"*"
  262.  
  263.       end
  264.  
  265.     else
  266.  
  267.       clearFilters()
  268.  
  269.       if str then setSearch(str) end
  270.  
  271.     end
  272.  
  273.     MessagePopup(FilterIsOn() and "On" or "Off","Panel filter")
  274.  
  275.   end;
  276.  
  277. }
  278.  
  279.  
  280.  
  281. Macro { description="Panel filter: Show autofilter in the searchbox";
  282.  
  283.   area="Shell"; key="Alt";
  284.  
  285.   condition=FilterIsOn;
  286.  
  287.   action=function()
  288.  
  289.     setSearch(PanelAutoFilter[Side()])
  290.  
  291.   end;
  292.  
  293. }
  294.  
  295.  
  296.  
  297. Macro { description="Panel filter: Change panel in quick search";
  298.  
  299.   area="Search"; key="Tab ShiftTab";
  300.  
  301.   condition=function() return PPanel.FilePanel end;
  302.  
  303.   action=function()
  304.  
  305.     Keys"Esc Tab"
  306.  
  307.     setSearch(FilterIsOn() and PanelAutoFilter[Side()] or "*")
  308.  
  309.   end;
  310.  
  311. }
  312.  
  313.  
  314.  
  315. Macro { description="Panel filter: Change panel in filter menu";
  316.  
  317.   area="Search Menu"; key="Tab ShiftTab";
  318.  
  319.   condition=function()
  320.  
  321.     return Menu.Id==FiltersMenuId and PPanel.FilePanel
  322.  
  323.   end;
  324.  
  325.   action=function()
  326.  
  327.     Keys"Esc Tab CtrlI"
  328.  
  329.   end;
  330.  
  331. }
Дело давнее, и не совсем готовое, но по большей части работает.

Update
Привёл к актуальному состоянию.

Update 2
Продолжение: http://forum.farmanager.com/viewtopic.p ... 46#p126876
User avatar
LanKing
Posts: 180
Joined: Thu 31 Aug, 2006 20:39
Been thanked: 2 times

Автофильтр в панелях

Post by LanKing »

У меня кстати не работает. Но переписывать и разбираться буду гораздо позже.
User avatar
John Doe
Бюрократ
Posts: 13860
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Post by John Doe »

Если бы не работал, то я бы не выкладывал.
User avatar
LanKing
Posts: 180
Joined: Thu 31 Aug, 2006 20:39
Been thanked: 2 times

Автофильтр в панелях

Post by LanKing »

Тем не менее, у меня не работает.
Locked

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