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; }