Управление меню расширения из макроса

Автор Борис_С, 20 ноября 2025, 18:27

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

Всем доброго дня.
Мне нужно делать пункты меню расширения активными или неактивными в зависимости от условия.
Нашел на форуме тему Управление главным меню из макроса.
Можно ли сделать что-то аналогичное для пунктов меню расширения?
Спасибо.

economist

Все LO-расширения с богатыми настройками и историей плавно эволюционировали до собственных Диалогов. В меню всё еще сложнее. Плюс UX-дизайнеры в один голос твердят что в главном меню у пользователей слепая зона, не отличают они неактивный пункт от активного. А длинные пункты - вообще пронафталинены. 

Если б я сейчас делал прикладной софт под Либру - то диалоги бахнул бы на чем-нить современном web-нутом, ну типа flet, nicegui, kivy, remi итд (там везде Python, но он дергает ReactJS или что-то похожее). Безупречный вид, кроссплатформенность, удаленный интерфейс, модно-молодежно, вайб-кодинг готов к копипасте. Нарисовать и закодить удобный современный диалог средствами LibreOffice, кмк, невероятно сложно. Легко испортить впечатление от результата. Говорю об этом с искренним сожалением, проходил на себе.
Пить не буду коньяка - читану Питоньяка!

Борис_С

Может быть есть возможность достучаться до пункта меню? В файле addons.xcu для каждого пункта меню есть параметр <node oor:name="<имя>" oor:op="replace">
<имя> уникально для каждого пункта меню.
Может быть можно через параметр oor:name выйти на нужный пункт меню?

Борис_С

Другая идея. В файле description.xml есть параметр <platform value="windows" />
Может быть можно для пункта меню в файле addons.xcu установить platform для нужного пункта меню?

sokol92

Цитата: Борис_С от 20 ноября 2025, 18:27Мне нужно делать пункты меню расширения активными или неактивными в зависимости от условия.

Расширение после старта может само динамически дополнять меню, инструментальные линейки, горячие клавиши.

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

Борис_С


sokol92

Как обычно, первый источник примеров макросов - книги Питоньяка.

1. В книге AndrewMacro.odt есть раздел "5.44. Toolbars".
2. Посмотрите на нашем форуме и ask.libreoffice.org сообщения, содержащие "getUIConfigurationManager". Вот пример.

Владимир.

Борис_С

Если я правильно понимаю, у Питоньяка рассматривается возможность добавить свой пункт меню в Toolbar.
А есть ли возможность подключиться к уже готовому пункту меню из расширения и сделать его активным или неактивным?

sokol92

Мне не известен механизм работы с пунктами меню, добавленными при установке расширения. Эти пункты меню "не видны" в Настройке меню модуля (Calc, Writer, ...).
В качестве альтернативы можно при первом старте расширения добавить необходимые пункты в меню модуля и далее применять стандартные методы для работы с меню.
Владимир.

Ципихович Эндрю

Цитата: sokol92 от 23 ноября 2025, 20:14В книге AndrewMacro.odt есть раздел "5.44. Toolbars"
перешёл, получил:
Не удается открыть эту страницу
www.pitonyak.org отказано в подключении
есть ли у кого рабочая ссылка? спасибо

sokol92

Сайт Питоньяка, действительно, уже какое-то время в нерабочем состоянии.
Ссылка на лицензию в указанной выше книге разрешает "... раскрытие и распространение Документации в любой форме, на любых носителях..."
Так что, в учебных целях, размещаю электронную копию.
Владимир.

Ципихович Эндрю


sokol92

У меня есть пример на эту тему.
Поместите следующие макросы в любой модуль любой библиотеки MyMacros...
' Создает для Writer инструментальную линейку MyToolbar (custom_MyToolbar) и кнопку на ней "MyMacro".
' При нажатии кнопки будет вызван макрос MyMacro модуля Module1 библиотеки Standard приложения.
' Для сохранения инструментальной линейки после закрытия LibreOffice нужно раскомментировать последнюю строку макроса.
Sub CreateToolbar()
  Dim oModuleCfgMgr As Object, oTBSettings As Object, toolbarURL As String
  oModuleCfgMgr=CreateUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier").getUIConfigurationManager("com.sun.star.text.TextDocument")
  oTBSettings = oModuleCfgMgr.createSettings() 
  toolbarURL = "private:resource/toolbar/custom_MyToolbar"
  oTBSettings.insertByIndex(0, CreateProps(Array("Label", "MyMacro", "Type", 0, "Style", 8, _
    "IsVisible", True, "CommandURL", "vnd.sun.star.script:Standard.Module1.MyMacro?language=Basic&location=application")))
  oTBSettings.UIName = "MyToolbar"   '  отображаемое имя панели инструментов
 
  If ( oModuleCfgMgr.hasSettings(toolbarURL)) Then
    oModuleCfgMgr.replaceSettings(toolbarURL, oTBSettings )
  Else
    oModuleCfgMgr.insertSettings(toolbarURL, oTBSettings )
  End If
 
  'oModuleCfgMgr.store     ' сохранили изменения
End Sub

' Возвращает массив PropertyValue.
' - arr  Массив наименований и значений PropertyValue (должен иметь четное число элементов).
Function CreateProps(arr)
  Dim props(0) As New com.sun.star.beans.PropertyValue
  Dim i As Long, lb As Long
  If Ubound(arr) < Lbound(arr) Then
    CreateProps = Array()
  Else
    lb = LBound(arr)
    Redim props((Ubound(arr) - lb + 1) / 2 - 1)
    For i = 0 To UBound(props)
      props(i).Name = arr(lb + 2 * i)
      props(i).Value = arr(lb + 2 * i + 1)
    Next i
    CreateProps = props
  End If
End Function   

Поместите следующий макрос в модуль Module1 библиотеки Standard.
Sub MyMacro
  MsgBox "MyMacro here!"
End Sub
Владимир.