diff options
author | OmkarAcharekar <omkaracharekar12@gmail.com> | 2024-09-25 09:48:09 +0200 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2024-09-25 21:09:26 +0200 |
commit | 7282421451f4a85c06c34430e37a8e98a84f0919 (patch) | |
tree | 7adc93bf865c27e85a4476897e59afd54d1607bd /vcl/inc | |
parent | 1a1bf2b78d689a570cc71b7bcb3e0100947a2fb1 (diff) |
tdf#130857 qt weld: Implement QtBuilder + use it for first msg dialog
This implements an initial QtBuilder, which is used by
QtInstanceBuilder to create weld::Widget instances
using native Qt widgets.
This tries to be close to the VCL implementation (VclBuilder).
The selected approach is based on Caolán's suggestion in [1] to
rework VclBuilder to have overridable methods for widgets creation.
This way, we can have common code for the UI parser but the
function for widget creation is different.
Qt equivalents for Gtk's widget classes in the .ui files:
* GtkMessageDialog -> QMessageBox
* GtkBox -> QLayout (can be QVBoxLayout/QHBoxLayout based on
property in .ui file)
* GtkButtonBox -> QDialogButtonBox
* GtkButton -> QPushButton
As QMessageBox already comes with a layout and
a QDialogButtonBox, don't create new ones, but
return the existing ones in QtBuilder::makeObject.
This commit implements initial support for the
above-mentioned widget types and adds the first
message dialog to the list of supported .ui files
in QtInstanceBuilder::IsUIFileSupported,
so a native QMessageBox is used for it now, unless
environment variable SAL_VCL_QT_NO_WELDED_WIDGETS
is set when starting LibreOffice.
The dialog ("modules/swriter/ui/inforeadonlydialog.ui")
gets shown when taking the following steps:
* start Writer
* type "hello world"
* select text
* "Insert" -> "Section"
* tick the "Protect" checkbox in the "Write Protection" section
* close dialog via "Insert" button
* try to type in the protected section
The dialog can be dismissed using the default "OK" button.
(Handling for response codes for buttons is not implemented
yet, which will be needed when welding dialogs that have multiple
buttons resulting in different behavior depending on what button
gets clicked.)
This change was originally submitted as a WIP change as part of
Omkar Acharekar's Outreachy project "Implement Qt/KDE Frameworks
theming using native Qt widgets" (see [2]), then further refined
by Michael Weghorn.
[1] https://lists.freedesktop.org/archives/libreoffice/2023-December/091288.html
[2] https://lists.freedesktop.org/archives/libreoffice/2023-December/091281.html
Co-authored-by: Michael Weghorn <m.weghorn@posteo.de>
Change-Id: I6dd010a2138c245dc1e6d83dd08123898e9d9048
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161831
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Diffstat (limited to 'vcl/inc')
-rw-r--r-- | vcl/inc/qt5/QtBuilder.hxx | 82 | ||||
-rw-r--r-- | vcl/inc/qt5/QtInstanceBuilder.hxx | 8 | ||||
-rw-r--r-- | vcl/inc/qt6/QtBuilder.hxx | 12 |
3 files changed, 100 insertions, 2 deletions
diff --git a/vcl/inc/qt5/QtBuilder.hxx b/vcl/inc/qt5/QtBuilder.hxx new file mode 100644 index 000000000000..3617f45f57fd --- /dev/null +++ b/vcl/inc/qt5/QtBuilder.hxx @@ -0,0 +1,82 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <vector> + +#include <QtCore/QObject> +#include <QtWidgets/QDialog> +#include <QtWidgets/QDialogButtonBox> +#include <QtWidgets/QMessageBox> +#include <QtWidgets/QPushButton> + +#include <rtl/ustring.hxx> +#include <unotools/resmgr.hxx> +#include <vcl/builder.hxx> + +class QtBuilder : public WidgetBuilder<QObject, QObject*> +{ +private: + QObject* get_by_name(std::u16string_view sID); + struct WinAndId + { + OUString m_sID; + QObject* m_pWindow; + WinAndId(OUString sId, QObject* pWindow) + : m_sID(std::move(sId)) + , m_pWindow(pWindow) + { + } + }; + + std::vector<WinAndId> m_aChildren; + +public: + QtBuilder(QObject* pParent, std::u16string_view sUIRoot, const OUString& rUIFile); + virtual ~QtBuilder(); + + template <typename T = QObject> T* get(std::u16string_view sID); + + QObject* makeObject(QObject* pParent, std::u16string_view sName, const OUString& sID, + stringmap& rMap); + + virtual void applyAtkProperties(QObject* pObject, const stringmap& rProperties, + bool bToolbarItem) override; + virtual void applyPackingProperties(QObject* pCurrentChild, QObject* pParent, + const stringmap& rPackingProperties) override; + virtual void insertComboBoxOrListBoxItems(QObject* pObject, stringmap& rMap, + const std::vector<ComboBoxTextItem>& rItems) override; + + virtual QObject* insertObject(QObject* pParent, const OUString& rClass, const OUString& rID, + stringmap& rProps, stringmap& rPangoAttributes, + stringmap& rAtkProps) override; + + void tweakInsertedChild(QObject* pParent, QObject* pCurrentChild, std::string_view sType, + std::string_view sInternalChild) override; + + virtual void setPriority(QObject* pObject, int nPriority) override; + virtual void setContext(QObject* pObject, + std::vector<vcl::EnumContext::Context>&& aContext) override; + + virtual void set_response(std::u16string_view sID, short nResponse) override; + +private: + static void setProperties(QObject* obj, stringmap& rProps); + static QWidget* windowForObject(QObject* pObject); + static QDialogButtonBox* findButtonBox(QMessageBox* pMessageBox); +}; + +template <typename T> inline T* QtBuilder::get(std::u16string_view sID) +{ + QObject* w = get_by_name(sID); + return static_cast<T*>(w); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/qt5/QtInstanceBuilder.hxx b/vcl/inc/qt5/QtInstanceBuilder.hxx index 747582d6f69c..3c9fec8b1189 100644 --- a/vcl/inc/qt5/QtInstanceBuilder.hxx +++ b/vcl/inc/qt5/QtInstanceBuilder.hxx @@ -9,6 +9,8 @@ #pragma once +#include "QtBuilder.hxx" + #include <string_view> #include <QtWidgets/QWidget> @@ -18,9 +20,11 @@ class QtInstanceBuilder : public weld::Builder { +private: + std::unique_ptr<QtBuilder> m_xBuilder; + public: - QtInstanceBuilder(QWidget* pParent, std::u16string_view sUIRoot, - const std::u16string_view sUIFile); + QtInstanceBuilder(QWidget* pParent, std::u16string_view sUIRoot, const OUString& rUIFile); ~QtInstanceBuilder(); static bool IsUIFileSupported(const OUString& rUIFile); diff --git a/vcl/inc/qt6/QtBuilder.hxx b/vcl/inc/qt6/QtBuilder.hxx new file mode 100644 index 000000000000..99895979bb14 --- /dev/null +++ b/vcl/inc/qt6/QtBuilder.hxx @@ -0,0 +1,12 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "../qt5/QtBuilder.hxx" + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |