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: */