include/vcl/builder.hxx       |    2 +-
 include/vcl/builderbase.hxx   |    2 +-
 vcl/inc/qt5/QtBuilder.hxx     |   23 ++++++-----------------
 vcl/qt5/QtBuilder.cxx         |   16 +++++++---------
 vcl/qt5/QtInstanceBuilder.cxx |    2 +-
 vcl/source/window/builder.cxx |    4 ++--
 6 files changed, 18 insertions(+), 31 deletions(-)

New commits:
commit 2b04f943428c1c29c3a6a596c129f75ae9753f70
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Sun Mar 9 23:10:44 2025 -0700
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Mon Mar 10 21:03:41 2025 +0100

    tdf#130857 qt weld: Use map instead of vector for ID -> widget mapping
    
    Instead of using a std::vector of a custom WinAndId struct
    and iterating over all entries in QtBuilder::get_by_name,
    use a std::unordered_map instead to map between the OUString ID
    and the QWidget.
    
    This requires switching a few method params from std::u16string_view
    to const OUString&, which is consistent with other WidgetBuilder
    methods.
    
    Change-Id: I597315811f5842238f355f369c694ce0bb59de9d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182710
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx
index b93a6da1607c..bfe0ea781701 100644
--- a/include/vcl/builder.hxx
+++ b/include/vcl/builder.hxx
@@ -278,7 +278,7 @@ private:
     static vcl::Window* prepareWidgetOwnScrolling(vcl::Window *pParent, 
WinBits &rWinStyle);
     void        cleanupWidgetOwnScrolling(vcl::Window *pScrollParent, 
vcl::Window *pWindow, stringmap &rMap);
 
-    void set_response(std::u16string_view sID, int nResponse) override;
+    void set_response(const OUString& rId, int nResponse) override;
 
     OUString        get_by_window(const vcl::Window *pWindow) const;
     void            delete_by_window(vcl::Window *pWindow);
diff --git a/include/vcl/builderbase.hxx b/include/vcl/builderbase.hxx
index 78db3d4b556b..181f9461a68f 100644
--- a/include/vcl/builderbase.hxx
+++ b/include/vcl/builderbase.hxx
@@ -137,7 +137,7 @@ protected:
 
     const ListStore* get_model_by_name(const OUString& sID) const;
 
-    virtual void set_response(std::u16string_view sID, int nResponse) = 0;
+    virtual void set_response(const OUString& rId, int nResponse) = 0;
 
     void handleSizeGroup(xmlreader::XmlReader& reader);
 
diff --git a/vcl/inc/qt5/QtBuilder.hxx b/vcl/inc/qt5/QtBuilder.hxx
index c06235686820..f95fe31b5869 100644
--- a/vcl/inc/qt5/QtBuilder.hxx
+++ b/vcl/inc/qt5/QtBuilder.hxx
@@ -30,19 +30,8 @@
 class QtBuilder : public WidgetBuilder<QObject, QObject*, QMenu, QMenu*>
 {
 private:
-    QWidget* get_by_name(std::u16string_view sID);
-    struct WinAndId
-    {
-        OUString m_sID;
-        QWidget* m_pWidget;
-        WinAndId(OUString sId, QWidget* pWidget)
-            : m_sID(std::move(sId))
-            , m_pWidget(pWidget)
-        {
-        }
-    };
-
-    std::vector<WinAndId> m_aChildren;
+    QWidget* get_by_name(const OUString& rId);
+    std::unordered_map<OUString, QWidget*> m_aWidgets;
 
     // vector of pairs, each containing:
     // * a widget to remove from the widget hierarchy and delete (first item)
@@ -53,7 +42,7 @@ public:
     QtBuilder(QObject* pParent, std::u16string_view sUIRoot, const OUString& 
rUIFile);
     virtual ~QtBuilder();
 
-    template <typename T = QObject> T* get(std::u16string_view sID);
+    template <typename T = QObject> T* get(const OUString& rId);
 
     QObject* makeObject(QObject* pParent, std::u16string_view sName, 
std::string_view sType,
                         const OUString& sID, stringmap& rMap);
@@ -91,7 +80,7 @@ public:
                                   const OUString& rID, stringmap& rProps, 
stringmap& rAtkProps,
                                   accelmap& rAccels) override;
 
-    virtual void set_response(std::u16string_view sID, int nResponse) override;
+    virtual void set_response(const OUString& rId, int nResponse) override;
 
 private:
     static void deleteObject(QObject* pObject);
@@ -113,9 +102,9 @@ private:
                                            const stringmap& 
rPackingProperties);
 };
 
-template <typename T> inline T* QtBuilder::get(std::u16string_view sID)
+template <typename T> inline T* QtBuilder::get(const OUString& rId)
 {
-    QObject* w = get_by_name(sID);
+    QObject* w = get_by_name(rId);
     return static_cast<T*>(w);
 }
 
diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx
index 87a2b048f222..97694fde30ac 100644
--- a/vcl/qt5/QtBuilder.cxx
+++ b/vcl/qt5/QtBuilder.cxx
@@ -65,13 +65,11 @@ QtBuilder::QtBuilder(QObject* pParent, std::u16string_view 
sUIRoot, const OUStri
 
 QtBuilder::~QtBuilder() {}
 
-QWidget* QtBuilder::get_by_name(std::u16string_view sID)
+QWidget* QtBuilder::get_by_name(const OUString& rID)
 {
-    for (auto const& child : m_aChildren)
-    {
-        if (child.m_sID == sID)
-            return child.m_pWidget;
-    }
+    auto aIt = m_aWidgets.find(rID);
+    if (aIt != m_aWidgets.end())
+        return aIt->second;
 
     return nullptr;
 }
@@ -459,7 +457,7 @@ QObject* QtBuilder::makeObject(QObject* pParent, 
std::u16string_view sName, std:
     }
 
     if (pWidget)
-        m_aChildren.emplace_back(sID, pWidget);
+        m_aWidgets[sID] = pWidget;
 
     return pObject;
 }
@@ -714,9 +712,9 @@ void QtBuilder::applyTabChildProperties(QObject* pParent, 
const std::vector<OUSt
                                          rProperties.at(u"label"_ustr));
 }
 
-void QtBuilder::set_response(std::u16string_view sID, int nResponse)
+void QtBuilder::set_response(const OUString& rId, int nResponse)
 {
-    QPushButton* pPushButton = get<QPushButton>(sID);
+    QPushButton* pPushButton = get<QPushButton>(rId);
     assert(pPushButton);
     
pPushButton->setProperty(QtInstanceMessageDialog::PROPERTY_VCL_RESPONSE_CODE, 
nResponse);
 }
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 97df7bd8d9df..0817f527d739 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -3618,9 +3618,9 @@ vcl::Window *VclBuilder::get_by_name(std::u16string_view 
sID)
     return nullptr;
 }
 
-void VclBuilder::set_response(std::u16string_view sID, int nResponse)
+void VclBuilder::set_response(const OUString& rId, int nResponse)
 {
-    PushButton* pPushButton = get<PushButton>(sID);
+    PushButton* pPushButton = get<PushButton>(rId);
     assert(pPushButton);
     Dialog* pDialog = pPushButton->GetParentDialog();
     assert(pDialog);
commit 5c660dee650edd029db296ea21e3bc4ad88d63a5
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Sun Mar 9 22:48:44 2025 -0700
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Mon Mar 10 21:03:32 2025 +0100

    tdf#130857 qt weld: Look up menu in vector that has it
    
    Other than the widgets created directly in QtBuilder::makeObject,
    menus (QMenu) are created via WidgetBuilder::handleMenu and
    inserted into WidgetBuilder::m_aMenus.
    
    Therefore, use WidgetBuilder::get_menu in order to retrieve
    the QMenu from there.
    
    This also matches what the VCL implementation does, see
    SalInstanceBuilder::weld_menu.
    
    (QtBuilder::get<QMenu> was seen to return nullptr here in
    a branch experimenting with adding support for
    "sfx/ui/tabbarcontents.ui".)
    
    Change-Id: I3106882c0135d3358c160fa0e19e7c13d1e81b64
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182709
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>
    Tested-by: Jenkins

diff --git a/vcl/qt5/QtInstanceBuilder.cxx b/vcl/qt5/QtInstanceBuilder.cxx
index b1ca405766a6..443eb851b87f 100644
--- a/vcl/qt5/QtInstanceBuilder.cxx
+++ b/vcl/qt5/QtInstanceBuilder.cxx
@@ -436,7 +436,7 @@ QtInstanceBuilder::weld_drawing_area(const OUString& rId, 
const a11yref&, Factor
 
 std::unique_ptr<weld::Menu> QtInstanceBuilder::weld_menu(const OUString& rId)
 {
-    QMenu* pMenu = m_xBuilder->get<QMenu>(rId);
+    QMenu* pMenu = m_xBuilder->get_menu(rId);
     std::unique_ptr<weld::Menu> xRet(pMenu ? 
std::make_unique<QtInstanceMenu>(pMenu) : nullptr);
     return xRet;
 }

Reply via email to