Добавление пунктов в меню плагинов

Здесь обсуждается всё, что касается макросов.
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 »

Code: Select all

shmuel 05.07.2014 16:58:08 +0200 - build 389

2. Добавление пунктов в меню плагинов/дисков/конфигурации плагинов из макрофайлов. Подробности - в мануале.
Добавление пунктов в меню плагинов wrote:[*]Поле menu содержит перечисление меню Far Manager, в которые нужно добавить данный пункт меню. Допустимые значения элементов: "Plugins", "Disks" и "Config".
[*]Поле action – функция, вызываемая при активации добавленного пункта меню. Получает те же аргументы, что и функция export.Open (см. luafar_manual.chm), за исключением Guid. При вызове из меню конфигурации, значения обоих аргументов – nil. Возвращаемое значение игнорируется.
Может быть логичнее config сделать отдельным полем таблицы, ведь в LuaFAR для этого отдельная функция?
[...]Получает те же аргументы, что и функция export.Open (см. luafar_manual.chm), за исключением Guid.
ret = export.Open (OpenFrom, Guid, Item)
Неясно зачем параметр Item, в случае вызова ведь он всегда 0 (кроме OpenFrom ==OPEN_DIALOG).
[*]Поле title – функция, возвращающая строку – текст данного пункта меню. Если функция не возвратит величину типа string, пункт меню не будет добавлен. Функция получает 1 аргумент – тип окна (см. WINDOWINFO_TYPE), дающий некоторую информацию о том, которое меню будет вызвано.
Может быть стоит дать возможность задавать title строкой?
И добавить привычную функцию condition?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Для menu="Disks" не имеет смысла поле area.
И ведь есть макрообласть "Disks", может пусть это будет возможным значением area?

Для Config тоже не имеет значение area.
И пункт в меню конфигурации должен быть доступен всегда, независимо от того, что вернёт title.
Это ещё один аргумент в пользу того, чтобы Config был не частным случаем action, а отдельным полем таблицы.

Без Disks и Config поле menu будет уже не нужным, что к лучшему.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Ещё неувязки.

Даже если в menu не указано "Config", при открытии меню плагинов зачем-то вызывается функция title.

В функции title нет возможности определить, вызвана ли она из Config/Disks или Plugins
Параметр wtype доступен в title, логично передавать его и в action.
Имхо будет лучше если title/condition будут принимать одинаковые параметры.
(о том, что можно было бы использовать привычное поле condition я уже писал)
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Добавление пунктов в меню плагинов

Post by Shmuel »

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

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Жаль, что общение получается односторонним.
Но раз так, то я хотя бы подведу итоги сказанному.
Вот что может получится:
  1. MenuItem {
  2.  
  3.   description = "Menu item";                       -- string (опциональное поле)
  4.  
  5.   menu   = "Plugins Disks Config";                 -- string
  6.  
  7.   area   = "Shell Editor Viewer Dialog Menu";      -- string (опциональное поле)
  8.  
  9.   guid   = "A435D567-AD64-4DD1-8C61-28CB90358817"; -- string
  10.  
  11.   text  = "Item text"                              -- string
  12.  
  13.   condition = function(OpenFrom, Item) ...... end; -- function (опциональное поле)
  14.  
  15.   action = function(OpenFrom, Item) ...... end;    -- function
  16.  
  17. }
Функция condition может вернуть true/false или текст, который будет использован вместо поля text.
wtype можно передавать параметром condition/action, но можно получить при необходимости и в самом скрипте.
Имхо правильнее было бы откорректировать Area.Current
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Добавление пунктов в меню плагинов

Post by Shmuel »

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

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Мне известно о проблемах MCTL_GETAREA, но ведь это вы зачем-то ввели поле area.
И я прекрасно понимаю зачем: это логично с точки зрения интерфейса, и это хорошо согласуется с другими разделами документации.

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

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Прототип утилиты для управления пунктами меню, добавленными в скриптах.
Отображает список всех пунктов, позволяет посмотреть свойства каждого, перейти в редактор или к файлу на панели.
(Список доступных клавиш в нижнем заголовке списка)

Когда вся эта функциональность устаканится добавлю в MacroBrowser alt.
Полагаю нечто подобное должно быть и в mbrowser.lua
Attachments
MenuItems.7z
(1.51 KiB) Downloaded 132 times
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Добавление пунктов в меню плагинов

Post by John Doe »

[*]Поле action – функция, вызываемая при активации добавленного пункта меню. Получает те же аргументы, что и функция export.Open (см. luafar_manual.chm), за исключением Guid. При вызове из меню конфигурации, значения обоих аргументов – nil. Возвращаемое значение игнорируется.
Предлагаю поле Guid тоже передавать.
Это позволит даже для разных пунктов с разными гуидами использовать одну и ту же процедуру.

Не то чтобы это было чрезвычайно полезно, но применить можно. Да и зачем искуственное отличие от export.Open?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Добавление пунктов в меню плагинов

Post by Shmuel »

John Doe wrote:Предлагаю поле Guid тоже передавать.
Были колебания по этому поводу.
А для разных пунктов с разными гуидами, что сейчас мешает использовать одну и ту же процедуру? Если есть функция, написанная вне тела таблицы-аргумента, то её лучше вызывать с какими-то осмысленными параметрами, а не с гуидом, не?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Добавление пунктов в меню плагинов

Post by John Doe »

А для разных пунктов с разными гуидами, что сейчас мешает использовать одну и ту же процедуру?
Ничто не мешает, просто action придётся завернуть в лишний function() ... end.
Если есть функция, написанная вне тела таблицы-аргумента, то её лучше вызывать с какими-то осмысленными параметрами, а не с гуидом, не?
Аргументы будут достаточно осмысленными константами.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Изучил исходники, и хочу вернуться к таким моментам:
  • В функции text не хватает важной информации: откуда она вызвана (Disks/Plugins/Config).
    Можно решить, вызывая её из export.GetPluginInfo трижды.
    (Кстати wtype имеет смысл только при вызове из Plugins)
  • Из функции action невозможно получить текущую макрообласть, но можно было бы передавать в параметрах wtype.
Без всего этого можно конечно обойтись, разделив на несколько MenuItem {}
Но не покидает ощущение недоделанности.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Добавление пунктов в меню плагинов

Post by Shmuel »

John Doe wrote:Но не покидает ощущение недоделанности.
Блин, как вы мне надоели.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Добавление пунктов в меню плагинов

Post by John Doe »

Меня упрекнули в недопонимании некоторых моментов, пришлось исправляться.

P.S.
Планируется ли помещать AddedMenuItems в общую таблицу, элементы которой возвращаются по mf.GetMacroCopy?
(я ничего не предлагаю, только интересуюсь, с точки зрения добавления в MacroBrowser)
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 »

Обнаружились особенности.

Code: Select all

MenuItem {
  menu="Plugins";  area="Common";
  guid="F4264DA3-56A7-428E-96DA-CD89A818F5B5";
  text=function() return "----" end;
  action=function()
    far.Show(mf.waitkey())
  end;
}
Macro{
  key="F1";
  area="Common";
  action=far.Show;
}
1. waitkey не ловит нажатие F1, вместо этого исполняется макрос на F1
2. Меню, выведенное макросом - невидимо, пока не нажмёшь Esc

Оба эффекта можно устранить, запуская action через mf.postmacro.

Так может быть имеет смысл сделать это прямо в luamacro?
Заодно уйдут ограничения, типа невозможности использовать print (кстати в мануале не описано).
Post Reply

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