summaryrefslogtreecommitdiff
path: root/vcl/qt5/QtInstanceBuilder.cxx
diff options
context:
space:
mode:
authorOmkarAcharekar <omkaracharekar12@gmail.com>2024-09-25 09:48:09 +0200
committerMichael Weghorn <m.weghorn@posteo.de>2024-09-25 21:09:26 +0200
commit7282421451f4a85c06c34430e37a8e98a84f0919 (patch)
tree7adc93bf865c27e85a4476897e59afd54d1607bd /vcl/qt5/QtInstanceBuilder.cxx
parent1a1bf2b78d689a570cc71b7bcb3e0100947a2fb1 (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/qt5/QtInstanceBuilder.cxx')
-rw-r--r--vcl/qt5/QtInstanceBuilder.cxx26
1 files changed, 17 insertions, 9 deletions
diff --git a/vcl/qt5/QtInstanceBuilder.cxx b/vcl/qt5/QtInstanceBuilder.cxx
index 938be55ecfbc..68386ec6d3d2 100644
--- a/vcl/qt5/QtInstanceBuilder.cxx
+++ b/vcl/qt5/QtInstanceBuilder.cxx
@@ -11,31 +11,39 @@
#include <unordered_set>
-QtInstanceBuilder::QtInstanceBuilder(QWidget*, std::u16string_view, std::u16string_view) {}
+#include <QtBuilder.hxx>
+#include <QtInstanceMessageDialog.hxx>
+
+QtInstanceBuilder::QtInstanceBuilder(QWidget* pParent, std::u16string_view sUIRoot,
+ const OUString& rUIFile)
+ : m_xBuilder(std::make_unique<QtBuilder>(pParent, sUIRoot, rUIFile))
+{
+}
QtInstanceBuilder::~QtInstanceBuilder() {}
bool QtInstanceBuilder::IsUIFileSupported(const OUString& rUIFile)
{
- // set of supported UI files - none yet
+ // set of supported UI files
//
// The idea is to implement functionality needed for a specific UI file/dialog
// in QtInstanceBuilder, then add it to the set of supported UI files here.
// This allows looking at one .ui file at a time and only having to implement
// what is relevant for that particular one, without having to implement the full
// weld API at once.
- //
- // see demo/WIP change: https://gerrit.libreoffice.org/c/core/+/161831
- // for an example
- static std::unordered_set<OUString> aSupportedUIFiles = {};
+ static std::unordered_set<OUString> aSupportedUIFiles = {
+ u"modules/swriter/ui/inforeadonlydialog.ui"_ustr,
+ };
return aSupportedUIFiles.contains(rUIFile);
}
-std::unique_ptr<weld::MessageDialog> QtInstanceBuilder::weld_message_dialog(const OUString&)
+std::unique_ptr<weld::MessageDialog> QtInstanceBuilder::weld_message_dialog(const OUString& id)
{
- assert(false && "Not implemented yet");
- return nullptr;
+ QMessageBox* pMessageBox = m_xBuilder->get<QMessageBox>(id);
+ std::unique_ptr<weld::MessageDialog> xRet(
+ pMessageBox ? std::make_unique<QtInstanceMessageDialog>(pMessageBox) : nullptr);
+ return xRet;
}
std::unique_ptr<weld::Dialog> QtInstanceBuilder::weld_dialog(const OUString&)