Тормоза после прятанья разделителей по датам в истории полей диалогов

Здесь можно сообщить о найденных багах в Far.
Post Reply
СтереоТип
Posts: 3
Joined: Thu 17 May, 2018 11:55

Тормоза после прятанья разделителей по датам в истории полей диалогов

Post by СтереоТип »

До последнего времени успешно использовал такой макрос, чтобы избавиться от разделителей по датам в истории полей диалоговых окон:

Code: Select all

local HideOnly = true --hide or remove
local F = far.Flags
Event {
  description="Remove date separators from history lists";
  group="DialogEvent";
  uid="95525607-A291-48C2-8110-FA9150AF7A7E";
  condition=function(Event,param)
   return Event==F.DE_DLGPROCINIT
           and F.DN_INITDIALOG
end;
  action=function(Event,param)
    local hDlg = param.hDlg
    local Item = hDlg:send(F.DM_GETDLGITEM,1)
    if Item and Item[1]==F.DI_LISTBOX then
      local list = Item[6]
      for i=#list,1,-1 do
        local v = list[i]
        if bit64.band(v.Flags,F.LIF_SEPARATOR)~=0 then
          if HideOnly then
            v.Index = i
            v.Flags = bit64.bor(v.Flags,F.LIF_HIDDEN)
            hDlg:send(F.DM_LISTUPDATE,1,v)
          else --Remove
            hDlg:send(F.DM_LISTDELETE,1,{StartIndex=i,Count=1})
          end
        end
      end
    end
  end
}
После апдейта с билда 4949 на 5200 обнаружил сильные тормоза при перемещении курсора по элементам выпадающей из полей диалоговых окон истории. Причем чем больше элементов в выпадающем списке, тем сильнее тормоза. После локализации виновника и эксперементов над ним стало ясно, что тормозит прятанье разделителей по датам в списках. Если их удалять, а не прятать, то тормозов нет. Пока перешел на удаление, вроде побочных эффектов нет. В скрипте какая-то проблема или в FAR manager?
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Тормоза после прятанья разделителей по датам в истории полей диалогов

Post by zg »

СтереоТип wrote: Thu 17 May, 2018 13:17

Code: Select all

  condition=function(Event,param)
   return Event==F.DE_DLGPROCINIT
           and F.DN_INITDIALOG
end;

этот код что по вашему делает?
СтереоТип
Posts: 3
Joined: Thu 17 May, 2018 11:55

Тормоза после прятанья разделителей по датам в истории полей диалогов

Post by СтереоТип »

Авторство макроса не мое - он был нарыт на форуме пару лет назад. Не помню, дорабатывал ли его сам, но первая версия была только для окна поиска по Alt+F7 и выглядела так:

Code: Select all

local HideOnly = true --hide or remove

local FindFileId = "8C9EAD29-910F-4B24-A669-EDAFBA6ED964"
local F = far.Flags
Event {
  description="Remove date separators from history list";
  group="DialogEvent";
  uid="95525607-A291-48C2-8110-FA9150AF7A7E";
  condition=function(Event,param)
   return Event==F.DE_DLGPROCINIT
           and F.DN_INITDIALOG
           and Dlg_Id==FindFileId
end;
  action=function(Event,param)
    local hDlg = param.hDlg
    local Item = hDlg:send(F.DM_GETDLGITEM,1)
    if Item and Item[1]==F.DI_LISTBOX then
      local list = Item[6]
      for i=#list,1,-1 do
        local v = list[i]
        if bit64.band(v.Flags,F.LIF_SEPARATOR)~=0 then
          if HideOnly then
            v.Index = i
            v.Flags = bit64.bor(v.Flags,F.LIF_HIDDEN)
            hDlg:send(F.DM_LISTUPDATE,1,v)
          else --Remove
            hDlg:send(F.DM_LISTDELETE,1,{StartIndex=i,Count=1})
          end
        end
      end
    end
  end
}
Потом убрал проверку на FindFileId, чтобы избавиться от разделителей во всех историях. Возможно, что остаток условия лишний, но он не влияет на описываемую проблему.

P.S. "Dlg_Id" в коде необходимо писать через точку, но форум не пропускает
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Тормоза после прятанья разделителей по датам в истории полей диалогов

Post by zg »

СтереоТип wrote: Thu 17 May, 2018 15:51Авторство макроса не мое - он был нарыт на форуме пару лет назад.
а вас самого ничего не смущает? and F.DN_INITDIALOG — бессмысленный код, не влияющий ни на что и у вас ваше удаление/скрытие вызывается на каждое сообщение, посылаемое диалогу. удаление не тормозит, потому что первый раз всё удаляется. а в condition конечно имелось ввиду and param.Msg==F.DN_INITDIALOG
СтереоТип
Posts: 3
Joined: Thu 17 May, 2018 11:55

Тормоза после прятанья разделителей по датам в истории полей диалогов

Post by СтереоТип »

Благодарю, недоглядел. Странно, что на старой версии это не проявлялось никак, иначе бы сразу разобрался.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Тормоза после прятанья разделителей по датам в истории полей диалогов

Post by John Doe »

СтереоТип wrote: Thu 17 May, 2018 15:51 Авторство макроса не мое - он был нарыт на форуме пару лет назад.
http://forum.farmanager.com/viewtopic.p ... 47#p129347
Плохо скопипастили
Post Reply

Return to “Глюки и баги”