Как поменять текст в футере пользовательского меню?

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
m8
Posts: 50
Joined: Mon 30 Apr, 2012 19:55
Has thanked: 3 times
Been thanked: 1 time

Как поменять текст в футере пользовательского меню?

Post by m8 »

В футере пользовательского меню есть список сочетаний клавиш, такой:

Code: Select all

╔════════════════ Гм (П) ═════════════════╗
║  f1  Папки                             ►║
║  f2  Программы                         ►║
║  q   g                                  ║
╚══ Ins Del F4 Alt+F4 Ctrl+Up Ctrl+Down ══╝
Ins Del F4 Alt+F4 Ctrl+Up Ctrl+Down

Как его заменить на что-то другое? С помощью макроса. Приглашаю buniak_a_h сюда.
Last edited by HaRT on Sat 05 Jun, 2021 01:18, edited 1 time in total.
Reason: Убрано спец. оформление Темы (Значок)
ты вот сказал не подумав, а алекс завтра сделает и всем нам потом с этим жить (c) zg
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

m8 wrote: Fri 04 Jun, 2021 10:10 Приглашаю buniak_a_h сюда.
Две условности: (а) новый футер задан константой (строка №3); (б) Новая ширина меню также задана константой (строка №4).
Если футер сформировать просто, то новую ширину - логику сами продумайте. Или действительно задайте константой …
  1. local F = far.Flags
  2.  
  3. ----------------
  4.  
  5. local NewFooter = 'Новый футер'
  6.  
  7. local NewWidth = 30
  8.  
  9. Event {
  10.  
  11.   id = "76149F72-5200-4219-BD91-2E8EB32497B9";
  12.  
  13.   group       = "DialogEvent";
  14.  
  15.   description = "Замена футера меню";
  16.  
  17.   condition   = function(Event, Param)
  18.  
  19.    if Area.UserMenu and Event == F.DE_DLGPROCINIT and Param.Msg == F.DN_INPUT then
  20.  
  21.     local Item = Param.hDlg:send(F.DM_GETDLGITEM, 1)
  22.  
  23.     if Item and type(Item) == 'table' and (Item[1]==F.DI_LISTBOX or Item[1]=='DI_LISTBOX') and
  24.  
  25.        (Item[12] or 0) == 0 then -- UserData
  26.  
  27.      Item[12] = 1
  28.  
  29.      Param.hDlg:send(F.DM_SETDLGITEM,1, Item)
  30.  
  31.      return true
  32.  
  33.     end
  34.  
  35.    end
  36.  
  37.  
  38.  
  39.   end; -- condition
  40.  
  41.   action      = function(Event, Param)
  42.  
  43.    local hDlg = Param.hDlg
  44.  
  45.    local ListRect = hDlg:send(F.DM_GETDLGRECT)
  46.  
  47.    local Titles = hDlg:send(F.DM_LISTGETTITLES, 1)
  48.  
  49.    Titles.Bottom = NewFooter
  50.  
  51.    hDlg:send(F.DM_LISTSETTITLES, 1, Titles) -- Новые Title и Footer
  52.  
  53.    hDlg:send(F.DM_RESIZEDIALOG, 0, {X=NewWidth, Y=ListRect.Bottom-ListRect.Top+1}) -- Изменение размеров
  54.  
  55.    hDlg:send(F.DM_MOVEDIALOG, 1, {X=-1, Y=-1}) -- Позиционирование по центру
  56.  
  57.   end;
  58.  
  59. }
  60.  
  61.  
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

m8, P/S.
Я не менял заголовок меню (не сразу сообразил, что это тоже может быть интересно) Если это надо, то добавьте перед строкой Titles.Bottom = (строка №25) строку вида Titles.Title = NewTitle
Получилось примерно так:
╔════════ Гм (П) ════════╗ ║ F1 Папки ►║ ║ F2 Программы ►║ ║ q q ║ ╚═════ Новый футер ══════╝
User avatar
m8
Posts: 50
Joined: Mon 30 Apr, 2012 19:55
Has thanked: 3 times
Been thanked: 1 time

Как поменять текст в футере пользовательского меню?

Post by m8 »

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

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

m8 wrote: Wed 02 Mar, 2022 10:55 Можно ли сделать так, чтобы сразу показывался новый текст?
Если в condition убрать проверку Area.UserMenu, то показывает сразу, НО во всех МЕНЮ (выбор диска, меню плагинов и т.д.!). Получение Area.UserMenuArea.Current тоже) оказалась очень длительной операцией. А т.к. у пользовательского МЕНЮ нет id, то это - единственный способ ограничить область действия. Так что у меня не получилось.
Last edited by buniak_a_h on Wed 02 Mar, 2022 11:44, edited 1 time in total.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как поменять текст в футере пользовательского меню?

Post by Shmuel »

buniak_a_h wrote: Wed 02 Mar, 2022 11:39 Получение Area.UserMenu (и Area.Current тоже) оказалась очень длительной операцией.
У меня эти операции выполняются менее чем за 0.1 миллисекунды.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

m8, P/S.
Получилось, но (а) пер-анально и (б) привязано к языку.
Идея в следующем: анализируется заголовок меню, и если это - Local menu или Main menu…, то делать. Иначе - нет.
Ну и (в) представьте, что какой-то идиот сделал диалог, состоящий из одного МЕНЮ с таким заголовком, но не имеющий никакого отношения к пользовательскому МЕНЮ. Футер всё равно будет подменяться :-)
Итак, такой скрипт:
  1. local F = far.Flags
  2.  
  3. ----------------
  4.  
  5. local NewFooter = 'Новый футер'
  6.  
  7. local NewWidth = 30
  8.  
  9. Event {
  10.  
  11.   id = "76149F72-5200-4219-BD91-2E8EB32497B9";
  12.  
  13.   group       = "DialogEvent";
  14.  
  15.   description = "Замена футера меню";
  16.  
  17.   action      = function(Event, Param)
  18.  
  19.    local Item = Param.hDlg:send(F.DM_GETDLGITEM, 1)
  20.  
  21.    if type(Item) == 'table' and (Item[1]==F.DI_LISTBOX) and
  22.  
  23.       (Item[12] or 0) == 0 then -- UserData
  24.  
  25.     Item[12] = 1
  26.  
  27.     Param.hDlg:send(F.DM_SETDLGITEM,1, Item)
  28.  
  29.     local hDlg = Param.hDlg
  30.  
  31.     local ListRect = hDlg:send(F.DM_GETDLGRECT)
  32.  
  33.     local Titles = hDlg:send(F.DM_LISTGETTITLES, 1)
  34.  
  35.     if Titles and Titles.Title and (Titles.Title == "Local menu" or Titles.Title:sub(1,9) == "Main menu") then
  36.  
  37.       Titles.Bottom = NewFooter
  38.  
  39.       hDlg:send(F.DM_LISTSETTITLES, 1, Titles) -- Новые Title и Footer
  40.  
  41.       hDlg:send(F.DM_RESIZEDIALOG, 0, {X=NewWidth, Y=ListRect.Bottom-ListRect.Top+1}) -- Изменение размеров
  42.  
  43.       hDlg:send(F.DM_MOVEDIALOG, 1, {X=-1, Y=-1}) -- Позиционирование по центру
  44.  
  45.      end
  46.  
  47.    end
  48.  
  49.   end;
  50.  
  51. }
  52.  
  53.  
Last edited by buniak_a_h on Wed 02 Mar, 2022 20:10, edited 2 times in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

Shmuel wrote: Wed 02 Mar, 2022 11:55 У меня эти операции выполняются менее чем за 0.1 миллисекунды.
Я не придумал. Если в condition (или в action) добавить условие if Area.UserMenu, то заметно, что сначала диалог показывается со старым футером и стандартной ширины, а затем - с новыми. Влияет ТОЛЬКО проверка Area.UserMenu (ну или Area.Current=='UserMenu'). Это оказалось даже медленнее, чем проверка DM_LISTGETTITLES.Title!
Возможно, дело не в скорости самого получения этих значений, но что именно эта проверка приводит к явно видимой перерисовке МЕНЮ - за это я ручаюсь.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

Кстати! Я уже однажды просил для пользовательских МЕНЮ сделать свои GUID-ы. Просьба перешла в обсуждение, надо ли делать отдельные GUID-ы для глобального/локального меню, для меню, вызываемого из функции mf.usermenu и т.д. Увы, в результате не было сделано ничего. А здесь это могло бы помочь.
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Как поменять текст в футере пользовательского меню?

Post by HaRT »

buniak_a_h wrote: Wed 02 Mar, 2022 12:14 Я уже однажды просил для пользовательских МЕНЮ сделать свои GUID-ы. Просьба перешла в обсуждение
Ссылочкой не поделитесь (раз уж сразу не прикрепили)?
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как поменять текст в футере пользовательского меню?

Post by Shmuel »

buniak_a_h wrote: Wed 02 Mar, 2022 12:08 Я не придумал.
Поймите, я не запускал ваш скрипт и не читал его код. Мой ответ был по поводу "очень длительной операции", как вы сказали.
Я измерил макросом, оказалось, что максимальное время операции порядка 0.1 мс, типичное - порядка 0.01 мс.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

Shmuel, возможно, дело не в получении этих пропертей, а в том, что сама таблица Area становится актуальной не сразу. Я уже сталкивался с таким. Например, Dlg.Id не соответствует id диалога в DN_INITDIALOG, а в DN_INPUT - уже соответствует. Это неудобно, но проходимо (Dlg,Id можно получить другим способом: через ACTL_GETWINDOWINFO и DM_GETDIALOGINFO). Увы, Area так не обойти.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как поменять текст в футере пользовательского меню?

Post by Shmuel »

buniak_a_h wrote: Wed 02 Mar, 2022 12:25 Увы, Area так не обойти.
Попробуйте far.MacroGetArea (хотя не думаю, что это что-либо изменит).
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

Shmuel wrote: Wed 02 Mar, 2022 12:30 Попробуйте far.MacroGetArea (хотя не думаю, что это что-либо изменит).
Ну да, не изменило. Но всё равно спасибо.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Как поменять текст в футере пользовательского меню?

Post by buniak_a_h »

HaRT wrote: Wed 02 Mar, 2022 12:18 Ссылочкой не поделитесь (раз уж сразу не прикрепили)?
Уже не припомню. Помню, что поучаствовал, в частности, jd.
Post Reply

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