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

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

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

Post by mi3antrop » Thu 31 Jan, 2013 14:32

В аттаче макрос для фильтрации в панелях по мере ввода в строке быстрого поиска.
Если кому из знатоков не лень, как можно добавить поддержку PanelTabs?
Attachments
AutoFilter.zip
(1.8 KiB) Downloaded 159 times

gotar
Posts: 316
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times

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

Post by gotar » Wed 06 Feb, 2013 08:43

Я уже видел у нескольких людей, что lua функции оформляются в виде макросов. Зачем? Чем хуже вызов функции по сравнению выглядящем ужасно eval? Откуда это идет? Неужели причина только в том, что в прошлом языке не было функций?

mi3antrop
Posts: 49
Joined: Tue 15 Nov, 2005 18:31
Contact:

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

Post by mi3antrop » Wed 06 Feb, 2013 09:07

Неужели причина только в том, что в прошлом языке не было функций?
Этот макрос начинался ещё в 1.7, потом просто по-быстрому актуализировался. Табами я раньше не пользовался, в документации ничего подходящего не нашёл.
Если макрос не нравится - переделайте, чтоб было красиво.

Shmuel
Posts: 5897
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 218 times

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

Post by Shmuel » Wed 06 Feb, 2013 14:23

gotar wrote:Чем хуже вызов функции по сравнению выглядящем ужасно eval? Откуда это идет? Неужели причина только в том, что в прошлом языке не было функций?
Скорее всего, причина именно в этом. Привычка.

User avatar
SUSim
Posts: 1531
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 9 times

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

Post by SUSim » Wed 06 Feb, 2013 19:00

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

сорри за офтоп?
SimSU ··· ·· -- ··· ··-

gotar
Posts: 316
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times

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

Post by gotar » Wed 06 Feb, 2013 19:15

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

Чтобы не захламлять глобальную область можно создать отдельную таблицу, в которую поместить данные и функции работы с этими данными. Модули не обязательно использовать. В данном случае, на мой взгляд, таблицы удобнее.
Last edited by gotar on Wed 06 Feb, 2013 19:23, edited 4 times in total.

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

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

Post by John Doe » Wed 06 Feb, 2013 19:17

SUSim wrote:2) (имхо, самое главное) локальные переменные для макроса доступны из другого макроса (кстати, объявленная фича)
Что за фича? Пример кода можно?

User avatar
SUSim
Posts: 1531
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 9 times

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

Post by SUSim » Wed 06 Feb, 2013 19:40

gotar, я сделую одну таблицу в _G, ты другую, и все остальные по одной и... в глобальной области 1000 лишних операторов....
в макрофайле.
SimSU ··· ·· -- ··· ··-

User avatar
SUSim
Posts: 1531
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 5 times
Been thanked: 9 times

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

Post by SUSim » Wed 06 Feb, 2013 19:54

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

Смысл в следующем если в макрофайле сделать переменную то она для всех макросов из этого файла будет как глобальная, а засорять глобальную область не будет!!!
Раньше чтобы передать из макроса в макрос переменную я пользовался _G., а сейчас не использую для своих глобальных переменных переменную описанную в начале файла она доступна для макросов из одного файла в течении сессии, смотри мои макросы например, SimSU.Common.RememberPositionF11.lua
SimSU ··· ·· -- ··· ··-

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

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

Post by Max Rusov » Wed 06 Feb, 2013 20:16

SUSim wrote:в глобальной области 1000 лишних операторов....
И что?

gotar
Posts: 316
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 9 times

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

Post by gotar » Thu 07 Feb, 2013 07:17

Мне, как пользователю Ваших макросов, удобнее таблицы. При аккуратном добавлении данных в таблицу _G. я не предвижу негативных последствий. В сегодняшней ситуации я просто копирую код из Ваших макросов в свои, что неудобно при обновлении Ваших макросов.

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

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

Post by John Doe » Mon 07 Apr, 2014 14:09

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

Вот что вышло:
  1. --http://forum.farmanager.com/viewtopic.php?p=117974#p117974
  2. local PanelAutoFilter = {Left="*",Right="*"}
  3. local function Side()
  4.   return APanel.Left and "Left" or "Right"
  5. end;
  6.  
  7. local IsOn = true
  8. local function FilterIsOn(state)
  9.   if state=="Toggle" then IsOn = not IsOn end
  10.   return IsOn
  11. end
  12.  
  13. local filtername = "_panelfilter_"
  14.  
  15. local FiltersMenuId = "5B87B32E-494A-4982-AF55-DAFFCD251383"
  16. local function FiltersMenu()
  17.   Keys"CtrlI"; assert(Menu.Id==FiltersMenuId)
  18. end
  19.  
  20. local function setSearch(str)
  21.   Keys"Alt,"; assert(Area.Search)
  22.   if str then mf.print(str) end
  23. end
  24.  
  25. local function setFilter(side,str)
  26.   FiltersMenu()
  27.   if Menu.Select(filtername..side,1)>0 then
  28.     Keys"F4"
  29.   else
  30.     Keys"Ins"
  31.     mf.print("&"..filtername..side)
  32.   end
  33.   PanelAutoFilter[side] = str
  34.   Keys"Tab Tab CtrlY"
  35.   mf.print(str.."*")
  36.   Dlg.SetFocus(36) --[?] Directory
  37.   for i=1,(2-Dlg.GetValue(36,0)) do Keys"Space" end
  38.   Keys"Enter"
  39.   if band(Menu.ItemStatus(),0x2)==0 then Keys"Add" end
  40.   Keys"Enter"
  41.   setSearch(str)
  42. end
  43.  
  44. Macro { description="Panel filter: Add char"; --Добавление символа в автофильтр
  45.   area="Search";
  46.   key=[[/[A-Z0-9,<ю>;:\'\"\[{\\\]}`~_!@#$%^&*()]/]];
  47.   condition=FilterIsOn;
  48.   action=function()
  49.     local side = Side()
  50.     setFilter(side,PanelAutoFilter[side]..mf.akey(1))
  51.   end;
  52. }
  53.  
  54. Macro { description="Panel filter: Clear"; --Очистка автофильтр панели
  55.   area="Search"; key="Del";
  56.   condition=FilterIsOn;
  57.   action=function()
  58.     local side = Side()
  59.     FiltersMenu()
  60.     while Menu.Select(filtername..side,1)>0 do
  61.       Keys"Del Enter"
  62.     end
  63.     PanelAutoFilter[side] = "*"
  64.     Keys"Enter"
  65.   end;
  66. }
  67.  
  68. Macro { description="Panel filter: BS"; --Удалить символ из автофильтра
  69.   area="Search"; key="BS";
  70.   condition=FilterIsOn;
  71.   action=function()
  72.     local side = Side()
  73.     local str = PanelAutoFilter[side]:sub(1,-2)
  74.     if str=="*" then
  75.       FiltersMenu()
  76.       if Menu.Select(filtername..side,1)>0 then
  77.         Keys"Del Enter"
  78.       end
  79.       Keys"Esc"
  80.       setSearch(str)
  81.     else
  82.       setFilter(side,str)
  83.     end
  84.   end;
  85. }
  86.  
  87. local function clearFilters() --Очистка всех автофильтров
  88.   FiltersMenu()
  89.   local NeedUpdate = PPanel.Filter and PPanel.Visible
  90.   while Menu.Select(filtername,1)>0 do
  91.     Keys"Del Enter"
  92.   end
  93.   Keys"Enter"
  94.   if NeedUpdate then Keys"Tab CtrlI Enter Tab" end --Update passive panel
  95.   PanelAutoFilter.Left = "*";
  96.   PanelAutoFilter.Right = "*";
  97. end;
  98.  
  99. Macro { description="Panel filter: Clear all";
  100.   area="Search"; key="CtrlShiftDel";
  101.   condition=FilterIsOn;
  102.   action=clearFilters
  103. }
  104.  
  105. local function MessagePopup(msg,title,flags,delay)
  106.   local s = far.SaveScreen()
  107.   far.Message(msg,title or "","",flags)
  108.   win.Sleep(delay or 500); far.RestoreScreen(s)
  109. end
  110.  
  111. NoMacro { description="Panel filter: on/off"; --Вкл/выкл автофильтрацию панели при изменении поля быстрого поиска
  112.   area="Shell Search"; key="CtrlAltF";
  113.   action=function()
  114.     if not FilterIsOn"Toggle" then clearFilters() end
  115.     MessagePopup(FilterIsOn() and "On" or "Off","Panel filter")
  116.   end;
  117. }
  118. Macro { description="Panel filter: on/off"; --Вкл/выкл автофильтрацию панели при изменении поля быстрого поиска
  119.   area="Shell Search"; key="CtrlAltF";
  120.   action=function()
  121.     local str
  122.     if Area.Search then
  123.       mf.clip(5); Keys"CtrlIns"
  124.       str = mf.clip()
  125.     end
  126.  
  127.     if FilterIsOn"Toggle" then
  128.       if str then
  129.         setFilter(Side(),str)
  130.       else
  131.         setSearch"*"
  132.       end
  133.     else
  134.       clearFilters()
  135.       if str then setSearch(str) end
  136.     end
  137.     MessagePopup(FilterIsOn() and "On" or "Off","Panel filter")
  138.   end;
  139. }
  140.  
  141. Macro { description="Panel filter: Show autofilter in the searchbox";
  142.   area="Shell"; key="Alt";
  143.   condition=FilterIsOn;
  144.   action=function()
  145.     setSearch(PanelAutoFilter[Side()])
  146.   end;
  147. }
  148.  
  149. Macro { description="Panel filter: Change panel in quick search";
  150.   area="Search"; key="Tab ShiftTab";
  151.   condition=function() return PPanel.FilePanel end;
  152.   action=function()
  153.     Keys"Esc Tab"
  154.     setSearch(FilterIsOn() and PanelAutoFilter[Side()] or "*")
  155.   end;
  156. }
  157.  
  158. Macro { description="Panel filter: Change panel in filter menu";
  159.   area="Search Menu"; key="Tab ShiftTab";
  160.   condition=function()
  161.     return Menu.Id==FiltersMenuId and PPanel.FilePanel
  162.   end;
  163.   action=function()
  164.     Keys"Esc Tab CtrlI"
  165.   end;
  166. }
Дело давнее, и не совсем готовое, но по большей части работает.

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

Update 2
Продолжение: http://forum.farmanager.com/viewtopic.p ... 46#p126876

User avatar
LanKing
Posts: 180
Joined: Thu 31 Aug, 2006 20:39

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

Post by LanKing » Sun 21 Dec, 2014 03:50

У меня кстати не работает. Но переписывать и разбираться буду гораздо позже.

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

Post by John Doe » Sun 21 Dec, 2014 10:29

Если бы не работал, то я бы не выкладывал.

User avatar
LanKing
Posts: 180
Joined: Thu 31 Aug, 2006 20:39

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

Post by LanKing » Sun 21 Dec, 2014 14:44

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

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

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

Post by John Doe » Sun 21 Dec, 2014 15:32

Таки да, я добрался до компьютера и убедился что действительно не работает.
Надо исправить регэксп key=[[/[A-Z0-9,<ю>;:\'\"\[{\\]}`~_!@#$%^&*()]/]]; на key=[[/[A-Z0-9,<ю>;:\'\"\[{\\\]}`~_!@#$%^&*()]/]];

Странно, но раньше работало.

Locked

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