Раскраска строк DI_LISTBOX-а Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

Здравствуйте.
Есть ли возможность как-то просто (без far.Text, вызываемого для DN_DRAWDLGITEMDONE) задать цвет строк списка DI_LISTBOX? И без DI_USERCONTROL… Что-то я не нашёл, хотя довольно много буковок на тему "допилить листбокс до ума)…
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by John Doe »

А чем вот это не подходит viewtopic.php?f=15&t=10522&p=141462#p141462
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

John Doe, я так понял, что это - эмуляция листбокса DI_USERCONTROL-ем. Вы с ним знакомы? Меня интересуют две вещи: поддерживает ли он стандартную фильтрацию и позволяет ли скрывать-показывать строки установкой LIF_HIDDEN? Если знаете и ответите - сэкономите мне некоторое время …
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by John Doe »

Не сэкономлю.
Подозреваю что стандартную фильтрацию не поддерживает, а скрывать элементы умеет, но апи собственное, поэтому немного не так.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

John Doe, Фильтрацию я проверил - действительно не поддерживает.
Очень не хотелось писать DI_USERCONTROL…
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by John Doe »

Добавить фильтрацию в lualistboxex попроще будет.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

John Doe wrote: Tue 04 May, 2021 20:02 Добавить фильтрацию в lualistboxex попроще будет.
1. Moonscript - не моё. От слова совсем.
2. "Попроще" - чем что? Там и так DI_USERCONTROL, чего я и хотел избежать.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by John Doe »

1. Извините что предлагаю так навязчиво. Но может быть вы забыли что мунскрипт в луа компилируется.
2. Да хоть черт с рогами, если он уже написан за вас.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

John Doe wrote: Wed 05 May, 2021 06:41 Извините что предлагаю так навязчиво
Это ещё не навязчиво :-)
John Doe wrote: Wed 05 May, 2021 06:41 Да хоть черт с рогами, если он уже написан за вас.
Увы, видимо не до конца написан. Допиливать я не особо люблю. Тем более без комментариев.
Не, я сделаю проще. Уже попробовал повесить far.Text на DN_DRAWDLGITEMDONE и DN_LISTCHANGEDN_DRAGGED, хотя это - лишнее).
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Раскраска строк DI_LISTBOX-а

Post by citRiks »

buniak_a_h wrote: Tue 04 May, 2021 19:51 John Doe, Фильтрацию я проверил - действительно не поддерживает.
Очень не хотелось писать DI_USERCONTROL…
а тоже не люблю USERCONTROL в качестве замены обычным нормальным диалогам.
переизобретение велосипеда.
Если уж допиливать что-то такое,
то лучше уж залезть в С++ и допилить там что нужно.
Для многого другого ЮзерКонтрол - полезная весчь,
но думаю что не в качестве что начать заменят все диалоги в ФАРе на ЮзерКонтролы.
Идеологически правильнее добавить обычным контролам extensibility,
а не заменять их на черти что.
Добавить extensibility на уровне кода ФАРа, или же допиливать код ФАРа напрямую.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

Виш на мантисе я видел.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

Кому интересно: сделал раскраскуDI_LISTBOX-а. Функция оформлена в виде модуля, вызывать её надо из хендлера диалога.
Модуль:
  1. local F = far.Flags
  2.  
  3. local function ListBoxFDlg(hDlg, Msg, Param1, Param2, ColorFunc, list, iList)
  4.  
  5.   local nStrNo = nil
  6.  
  7.   local function StrNo()
  8.  
  9.    if nStrNo == nil then
  10.  
  11.     nStrNo = hDlg:send(F.DM_LISTGETCURPOS, iList).SelectPos
  12.  
  13.    end
  14.  
  15.    return nStrNo
  16.  
  17.   end -- StrNo
  18.  
  19.   local bNeed = false
  20.  
  21.   if false
  22.  
  23.      or (Msg == F.DN_DRAWDLGITEMDONE and Param1 == iList)
  24.  
  25.      or Msg == F.DN_DRAWDIALOGDONE
  26.  
  27.      or (Msg == F.DN_CTLCOLORDLGLIST and Param1 == iList)
  28.  
  29.   then
  30.  
  31.    bNeed = true
  32.  
  33.   elseif Msg == F.DN_DRAGGED and Param1 == 1 then
  34.  
  35.    far.AdvControl(F.ACTL_REDRAWALL)
  36.  
  37.    bNeed = true
  38.  
  39.   elseif Msg == F.DN_CLOSE then
  40.  
  41.    far.AdvControl(F.ACTL_REDRAWALL)
  42.  
  43.   elseif Msg == F.DN_ENTERIDLE and (StrNo() == 1 or StrNo() == #list) then
  44.  
  45.    bNeed = true
  46.  
  47.   end
  48.  
  49.   if bNeed then
  50.  
  51.    local DlgRect, ListRect = hDlg:send(F.DM_GETDLGRECT), hDlg:send(F.DM_GETITEMPOSITION, iList)
  52.  
  53.    local iStr, yStr = hDlg:send(F.DM_LISTGETCURPOS, iList).TopPos, 0
  54.  
  55.    while list[iStr] do
  56.  
  57.     -- Цикл по элементам списка
  58.  
  59.     local item = hDlg:send(F.DM_LISTGETITEM, iList, iStr)
  60.  
  61.     if band(item.Flags, bor(F.LIF_HIDDEN,0x800000) ) == 0 then
  62.  
  63.      -- элемент не скрыт и не отфильтрован
  64.  
  65.      yStr = yStr + 1 -- Его Y-координата
  66.  
  67.      if yStr < ListRect.Bottom - ListRect.Top then
  68.  
  69.       ColorFunc(hDlg, DlgRect, ListRect, iList, iStr, yStr, list[iStr].Text, band(item.Flags, F.LIF_SELECTED) == F.LIF_SELECTED)
  70.  
  71.      end
  72.  
  73.     end
  74.  
  75.     iStr = iStr + 1
  76.  
  77.    end -- while list[iStr]
  78.  
  79.   end -- if bNeed
  80.  
  81. end -- ListBoxFDlg
  82.  
  83. return ListBoxFDlg
Пример вызова (раскрашивает "чересполосицу" - строки попеременно):
  1. local F = far.Flags
  2.  
  3. local ListBox = require"BAX.ListBox"
  4.  
  5.  
  6.  
  7. -- Функция вывода диалога с ListBox-ом
  8.  
  9. local function Show(list, ColorFunc)
  10.  
  11.  local w,h=50,15
  12.  
  13.  local aDlg = {
  14.  
  15.    {'DI_DOUBLEBOX',0,0,w-1,h-1,0,0,0,0,'Listbox'};
  16.  
  17.    {'DI_LISTBOX', 1,1,w-2,h-3, list; 0,0, 'DIF_LISTNOCLOSE', nil};
  18.  
  19.    {'DI_BUTTON', 0,h-2,0,0,0, 0,0,F.DIF_CENTERGROUP,'Ok'};
  20.  
  21.  }
  22.  
  23.  local iList = 2
  24.  
  25.  
  26.  
  27.  local function fDlg(hDlg, Msg, Param1, Param2)
  28.  
  29.   ListBox(hDlg, Msg, Param1, Param2, ColorFunc, list, iList)
  30.  
  31.  end
  32.  
  33.  far.Dialog('',-1,-1,w,h,nil,aDlg,nil,fDlg)
  34.  
  35. end
  36.  
  37.  
  38.  
  39. local list={}
  40.  
  41. -- Формирование тестового массива
  42.  
  43. for _=1,10 do
  44.  
  45.  for i=1,20 do
  46.  
  47.   local j = #list+1
  48.  
  49.   list[j] = {Text=('%.3d | N%.2d qqqq wwww eeee rrrr tttt yyyy zzzz'):format(j, i); Index=j}
  50.  
  51.  end
  52.  
  53. end
  54.  
  55. -- Функция раскраски
  56.  
  57. local function ColorIt(hDlg, DlgRect, ListRect, iList, iStr, yStr, sText, Selected)
  58.  
  59.  -- hDlg              - Диалог
  60.  
  61.  -- DlgRect, ListRect - координаты диалога и списка
  62.  
  63.  -- iList             - номер DI_LISTBOX-а
  64.  
  65.  -- iStr              - номер элемента-строки в списке
  66.  
  67.  -- yStr              - номер строки в области LiasBox-а с учётом видимости
  68.  
  69.  -- sText             - текст строки
  70.  
  71.  -- Selected          - является ли строка текущей.
  72.  
  73.  local aColor
  74.  
  75.  if yStr % 2 == 0 then
  76.  
  77.   if Selected and Dlg.CurPos == iList then
  78.  
  79.    aColor = {ForegroundColor = 15, BackgroundColor=1, Flags=F.FCF_4BITMASK}
  80.  
  81.   else
  82.  
  83.    aColor = {ForegroundColor = 1, BackgroundColor=15, Flags=F.FCF_4BITMASK}
  84.  
  85.   end
  86.  
  87.  else
  88.  
  89.   if Selected and Dlg.CurPos == iList then
  90.  
  91.    aColor = {ForegroundColor = 15, BackgroundColor=0, Flags=F.FCF_4BITMASK}
  92.  
  93.   else
  94.  
  95.    aColor = {ForegroundColor = 0, BackgroundColor=7, Flags=F.FCF_4BITMASK}
  96.  
  97.   end
  98.  
  99.  end
  100.  
  101.  far.Text(DlgRect.Left + ListRect.Left+1, DlgRect.Top + ListRect.Top + yStr, aColor, '  ' .. sText:sub(1, ListRect.Right-ListRect.Left-3))
  102.  
  103. end
  104.  
  105. Show(list, ColorIt)

User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Раскраска строк DI_LISTBOX-а

Post by HaRT »

buniak_a_h wrote: Wed 05 May, 2021 17:54 раскрашивает "чересполосицу" - строки попеременно
Раскрашивает до фильтрации или после? Т.е. если применить фильтр, то будет по-прежнему «зебра»?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

HaRT wrote: Wed 05 May, 2021 17:58 Раскрашивает до фильтрации или после? Т.е. если применить фильтр, то будет по-прежнему «зебра»?
1. Фильтрация обрабатывается корректно.
2. Нашёл-таки две ситуации, когда не рнаскрашивается:
2.1. Если стоим на первой строке и пытаемся выйти вверх либо на последней и уйти вниз
2.2. Клик мышкой.
Ситуацию 2.1 я поборол перерисовкой на DN_ENTERIDLE .
Ситуацию 2.2 я побороть не смог (точнее, смог тупо инициировав перерисовку по всё тому же DN_ENTERIDLE, но это очень затратно).
Почему-то в этих двух случаях не приходит события, которое я мог бы обработать (во клику приходит, но такое ощущение, что после него делается ReDraw, а событие по окончании отрисовки (DN_DRAWDLGITEMDONE и DN_DRAWDIALOGDONE) не приходят.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Раскраска строк DI_LISTBOX-а

Post by buniak_a_h »

HaRT, почему-то в Вашем сообщении нет кнопки "Цитировать". Это - глюк форума? Или Ваша настройка?
Поправка. Начиная с Вашего сообщения эта кнопка пропала и на моих тоже …
То появится, то пропадёт …
Last edited by buniak_a_h on Wed 05 May, 2021 18:17, edited 2 times in total.
Post Reply

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