include/vcl/builder.hxx       |   13 +------------
 include/vcl/widgetbuilder.hxx |   30 +++++++++++++++++++++++++++++-
 vcl/inc/qt5/QtBuilder.hxx     |    3 ++-
 vcl/source/window/builder.cxx |   16 ----------------
 4 files changed, 32 insertions(+), 30 deletions(-)

New commits:
commit df3483fa74baa0ee73b981df0c106d03dc964a68
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Sun Nov 10 21:02:05 2024 +0100
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Mon Nov 11 01:50:43 2024 +0100

    tdf#130857 VclBuilder: Make MenuAndId a template
    
    Move the MenuAndId struct and the `m_aMenus` member from
    VclBuilder to the WidgetBuilder base class and add two template
    parameters `MenuClass` and `MenuPtr`, which VclBuilder
    specializes with `PopupMenu` and `VclPtr<PopupMenu>`,
    effectively leaving the logic unchanged.
    
    Move VclBuilder::get_menu accordingly.
    
    For QtBuilder, use `QMenu` and `QMenu*` for
    the new template class parameters.
    This can be used to implement support for
    native Qt menus in the future.
    
    Change-Id: Ib015b1b1e6968338ed7419b1822665a521ca748d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176359
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx
index 9c26c0890e3a..5b9f2eb7e90d 100644
--- a/include/vcl/builder.hxx
+++ b/include/vcl/builder.hxx
@@ -54,7 +54,7 @@ namespace xmlreader { class XmlReader; }
 namespace com::sun::star::frame { class XFrame; }
 
 /// Creates a hierarchy of vcl::Windows (widgets) from a .ui file for dialogs, 
sidebar, etc.
-class VCL_DLLPUBLIC VclBuilder : public WidgetBuilder<vcl::Window, 
VclPtr<vcl::Window>>
+class VCL_DLLPUBLIC VclBuilder : public WidgetBuilder<vcl::Window, 
VclPtr<vcl::Window>, PopupMenu, VclPtr<PopupMenu>>
 {
 public:
     /// These functions create a new widget with parent pParent and return it 
in rRet
@@ -76,9 +76,6 @@ public:
 
     vcl::Window*    get_widget_root();
 
-    //sID may not exist
-    PopupMenu*      get_menu(std::u16string_view sID);
-
     //release ownership of pWindow, i.e. don't delete it
     void            drop_ownership(const vcl::Window *pWindow);
 
@@ -131,14 +128,6 @@ private:
     };
     std::vector<WinAndId> m_aChildren;
 
-    struct MenuAndId
-    {
-        OUString m_sID;
-        VclPtr<PopupMenu> m_pMenu;
-        MenuAndId(OUString sId, PopupMenu *pMenu);
-    };
-    std::vector<MenuAndId> m_aMenus;
-
     typedef StringPair RadioButtonGroupMap;
 
     struct ButtonImageWidgetMap
diff --git a/include/vcl/widgetbuilder.hxx b/include/vcl/widgetbuilder.hxx
index 2b6056cf9c03..50fd9ea12db2 100644
--- a/include/vcl/widgetbuilder.hxx
+++ b/include/vcl/widgetbuilder.hxx
@@ -32,15 +32,43 @@
  * and overridable methods to actually create the widgets,... (which should 
reside in
  * VclBuilder and other subclasses).
  */
-template <typename Widget, typename WidgetPtr> class WidgetBuilder : public 
BuilderBase
+template <typename Widget, typename WidgetPtr, typename MenuClass, typename 
MenuPtr>
+class WidgetBuilder : public BuilderBase
 {
 protected:
+    struct MenuAndId
+    {
+        OUString m_sID;
+        MenuPtr m_pMenu;
+        MenuAndId(OUString sId, MenuClass* pMenu)
+            : m_sID(std::move(sId))
+            , m_pMenu(pMenu)
+        {
+        }
+    };
+
     WidgetBuilder(std::u16string_view sUIDir, const OUString& rUIFile, bool 
bLegacy)
         : BuilderBase(sUIDir, rUIFile, bLegacy)
     {
     }
     virtual ~WidgetBuilder() = default;
 
+    std::vector<MenuAndId> m_aMenus;
+
+public:
+    //sID may not exist
+    MenuClass* get_menu(std::u16string_view sID)
+    {
+        for (auto const& menu : m_aMenus)
+        {
+            if (menu.m_sID == sID)
+                return menu.m_pMenu.get();
+        }
+
+        return nullptr;
+    }
+
+protected:
     void processUIFile(Widget* pParent)
     {
         try
diff --git a/vcl/inc/qt5/QtBuilder.hxx b/vcl/inc/qt5/QtBuilder.hxx
index 2bf4b67e47ac..98296abde026 100644
--- a/vcl/inc/qt5/QtBuilder.hxx
+++ b/vcl/inc/qt5/QtBuilder.hxx
@@ -16,6 +16,7 @@
 #include <QtWidgets/QDialogButtonBox>
 #include <QtWidgets/QDoubleSpinBox>
 #include <QtWidgets/QGridLayout>
+#include <QtWidgets/QMenu>
 #include <QtWidgets/QMessageBox>
 #include <QtWidgets/QPushButton>
 
@@ -23,7 +24,7 @@
 #include <unotools/resmgr.hxx>
 #include <vcl/builder.hxx>
 
-class QtBuilder : public WidgetBuilder<QObject, QObject*>
+class QtBuilder : public WidgetBuilder<QObject, QObject*, QMenu, QMenu*>
 {
 private:
     QObject* get_by_name(std::u16string_view sID);
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index f90efaf34772..e2b26ed6e960 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -3866,17 +3866,6 @@ vcl::Window *VclBuilder::get_by_name(std::u16string_view 
sID)
     return nullptr;
 }
 
-PopupMenu *VclBuilder::get_menu(std::u16string_view sID)
-{
-    for (auto const& menu : m_aMenus)
-    {
-        if (menu.m_sID == sID)
-            return menu.m_pMenu.get();
-    }
-
-    return nullptr;
-}
-
 void VclBuilder::set_response(std::u16string_view sID, short nResponse)
 {
     PushButton* pPushButton = get<PushButton>(sID);
@@ -4195,9 +4184,4 @@ VclBuilder::VclParserState::VclParserState()
     , m_nLastMenuItemId(0)
 {}
 
-VclBuilder::MenuAndId::MenuAndId(OUString aId, PopupMenu *pMenu)
-    : m_sID(std::move(aId))
-    , m_pMenu(pMenu)
-{}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to