vcl/CustomTarget_qt5_moc.mk              |    1 
 vcl/CustomTarget_qt6_moc.mk              |    1 
 vcl/Library_vclplug_qt5.mk               |    1 
 vcl/Library_vclplug_qt6.mk               |    1 
 vcl/inc/qt5/QtInstanceBuilder.hxx        |    2 
 vcl/inc/qt5/QtInstanceScrolledWindow.hxx |   64 ++++++++++
 vcl/inc/qt5/QtInstanceWidget.hxx         |    2 
 vcl/inc/qt6/QtInstanceScrolledWindow.hxx |   12 ++
 vcl/qt5/QtInstanceBuilder.cxx            |   10 +
 vcl/qt5/QtInstanceScrolledWindow.cxx     |  182 +++++++++++++++++++++++++++++++
 vcl/qt5/QtInstanceWidget.cxx             |   18 ++-
 vcl/qt6/QtInstanceScrolledWindow.cxx     |   12 ++
 12 files changed, 298 insertions(+), 8 deletions(-)

New commits:
commit dc7e8be039d6c581686fd94c641e3a7e47d18d4e
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Dec 14 23:43:22 2024 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Mon Dec 16 07:19:05 2024 +0100

    tdf#130857 qt weld: Introduce QtInstanceScrolledWindow
    
    QtBuilder::makeObject already creates a QScrollbar
    for "GtkScrolledWindow" objects.
    
    Implement QtInstanceBuilder::weld_scrolled_window
    to return an instance of the newly added
    QtInstanceScrolledWindow class.
    
    While weld::ScrolledWindow subclasses weld::Container,
    don't let QtInstanceScrolledWindow subclass
    QtInstanceContainer, because the latter requires
    a QWidget that has a layout set, while QScrollArea
    directly manages its child widget without using
    a layout.
    
    Implement QtInstanceScrolledWindow::vadjustment_set_step_increment,
    which is the only weld::ScrolledWindow method used by
    FontFeaturesDialog and trigger an assert in all others.
    (Leave implementing them for later, e.g. when adding support for
    dialogs that actually make use of them.)
    
    Change-Id: Ie122225f70f90b9421f902fce320d414f03291f9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178496
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/CustomTarget_qt5_moc.mk b/vcl/CustomTarget_qt5_moc.mk
index f2b34a7a1c48..2c6c566fe8ac 100644
--- a/vcl/CustomTarget_qt5_moc.mk
+++ b/vcl/CustomTarget_qt5_moc.mk
@@ -32,6 +32,7 @@ $(call gb_CustomTarget_get_target,vcl/qt5) : \
        $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceNotebook.moc \
        $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceProgressBar.moc \
        $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceRadioButton.moc \
+       $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceScrolledWindow.moc \
        $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceSpinButton.moc \
        $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceTextView.moc \
        $(gb_CustomTarget_workdir)/vcl/qt5/QtInstanceTreeView.moc \
diff --git a/vcl/CustomTarget_qt6_moc.mk b/vcl/CustomTarget_qt6_moc.mk
index 319c60434421..f0f37b049eef 100644
--- a/vcl/CustomTarget_qt6_moc.mk
+++ b/vcl/CustomTarget_qt6_moc.mk
@@ -32,6 +32,7 @@ $(call gb_CustomTarget_get_target,vcl/qt6) : \
        $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceNotebook.moc \
        $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceProgressBar.moc \
        $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceRadioButton.moc \
+       $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceScrolledWindow.moc \
        $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceSpinButton.moc \
        $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceTextView.moc \
        $(gb_CustomTarget_workdir)/vcl/qt6/QtInstanceTreeView.moc \
diff --git a/vcl/Library_vclplug_qt5.mk b/vcl/Library_vclplug_qt5.mk
index e1597fe99d20..38a667c5d896 100644
--- a/vcl/Library_vclplug_qt5.mk
+++ b/vcl/Library_vclplug_qt5.mk
@@ -118,6 +118,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\
     vcl/qt5/QtInstanceNotebook \
     vcl/qt5/QtInstanceProgressBar \
     vcl/qt5/QtInstanceRadioButton \
+    vcl/qt5/QtInstanceScrolledWindow \
     vcl/qt5/QtInstanceSpinButton \
     vcl/qt5/QtInstanceTextView \
     vcl/qt5/QtInstanceTreeView \
diff --git a/vcl/Library_vclplug_qt6.mk b/vcl/Library_vclplug_qt6.mk
index 5c5d49cdc5eb..e6d8c893387f 100644
--- a/vcl/Library_vclplug_qt6.mk
+++ b/vcl/Library_vclplug_qt6.mk
@@ -117,6 +117,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt6,\
     vcl/qt6/QtInstanceNotebook \
     vcl/qt6/QtInstanceProgressBar \
     vcl/qt6/QtInstanceRadioButton \
+    vcl/qt6/QtInstanceScrolledWindow \
     vcl/qt6/QtInstanceSpinButton \
     vcl/qt6/QtInstanceTextView \
     vcl/qt6/QtInstanceTreeView \
diff --git a/vcl/inc/qt5/QtInstanceBuilder.hxx 
b/vcl/inc/qt5/QtInstanceBuilder.hxx
index 0749eaee1e4c..fe200913dfdd 100644
--- a/vcl/inc/qt5/QtInstanceBuilder.hxx
+++ b/vcl/inc/qt5/QtInstanceBuilder.hxx
@@ -39,7 +39,7 @@ public:
     virtual std::unique_ptr<weld::Paned> weld_paned(const OUString&) override;
     virtual std::unique_ptr<weld::Frame> weld_frame(const OUString& rId) 
override;
     virtual std::unique_ptr<weld::ScrolledWindow>
-    weld_scrolled_window(const OUString&, bool bUserManagedScrolling = false) 
override;
+    weld_scrolled_window(const OUString& rId, bool bUserManagedScrolling = 
false) override;
     virtual std::unique_ptr<weld::Notebook> weld_notebook(const OUString& rId) 
override;
     virtual std::unique_ptr<weld::Button> weld_button(const OUString& rId) 
override;
     virtual std::unique_ptr<weld::MenuButton> weld_menu_button(const 
OUString&) override;
diff --git a/vcl/inc/qt5/QtInstanceScrolledWindow.hxx 
b/vcl/inc/qt5/QtInstanceScrolledWindow.hxx
new file mode 100644
index 000000000000..548e7fbf4033
--- /dev/null
+++ b/vcl/inc/qt5/QtInstanceScrolledWindow.hxx
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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 "QtInstanceWidget.hxx"
+
+#include <QtWidgets/QScrollArea>
+
+class QtInstanceScrolledWindow : public QtInstanceWidget, public virtual 
weld::ScrolledWindow
+{
+    Q_OBJECT
+
+    QScrollArea* m_pScrollArea;
+
+public:
+    QtInstanceScrolledWindow(QScrollArea* pScrollArea);
+
+public:
+    virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) 
override;
+    virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() override;
+    virtual void child_grab_focus() override;
+
+    virtual void hadjustment_configure(int value, int lower, int upper, int 
step_increment,
+                                       int page_increment, int page_size) 
override;
+    virtual int hadjustment_get_value() const override;
+    virtual void hadjustment_set_value(int value) override;
+    virtual int hadjustment_get_upper() const override;
+    virtual void hadjustment_set_upper(int upper) override;
+    virtual int hadjustment_get_page_size() const override;
+    virtual void hadjustment_set_page_size(int size) override;
+    virtual void hadjustment_set_page_increment(int size) override;
+    virtual void hadjustment_set_step_increment(int size) override;
+    virtual void set_hpolicy(VclPolicyType eHPolicy) override;
+    virtual VclPolicyType get_hpolicy() const override;
+
+    virtual void vadjustment_configure(int value, int lower, int upper, int 
step_increment,
+                                       int page_increment, int page_size) 
override;
+    virtual int vadjustment_get_value() const override;
+    virtual void vadjustment_set_value(int value) override;
+    virtual int vadjustment_get_upper() const override;
+    virtual void vadjustment_set_upper(int upper) override;
+    virtual int vadjustment_get_page_size() const override;
+    virtual void vadjustment_set_page_size(int size) override;
+    virtual void vadjustment_set_page_increment(int size) override;
+    virtual void vadjustment_set_step_increment(int nSize) override;
+    virtual int vadjustment_get_lower() const override;
+    virtual void vadjustment_set_lower(int upper) override;
+    virtual void set_vpolicy(VclPolicyType eVPolicy) override;
+    virtual VclPolicyType get_vpolicy() const override;
+    virtual int get_scroll_thickness() const override;
+    virtual void set_scroll_thickness(int nThickness) override;
+
+    virtual void customize_scrollbars(const Color& rBackgroundColor, const 
Color& rShadowColor,
+                                      const Color& rFaceColor) override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/vcl/inc/qt6/QtInstanceScrolledWindow.hxx 
b/vcl/inc/qt6/QtInstanceScrolledWindow.hxx
new file mode 100644
index 000000000000..9523b6346863
--- /dev/null
+++ b/vcl/inc/qt6/QtInstanceScrolledWindow.hxx
@@ -0,0 +1,12 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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/QtInstanceScrolledWindow.hxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/vcl/qt5/QtInstanceBuilder.cxx b/vcl/qt5/QtInstanceBuilder.cxx
index c1e86ac7018a..66561985ee94 100644
--- a/vcl/qt5/QtInstanceBuilder.cxx
+++ b/vcl/qt5/QtInstanceBuilder.cxx
@@ -27,6 +27,7 @@
 #include <QtInstanceNotebook.hxx>
 #include <QtInstanceProgressBar.hxx>
 #include <QtInstanceRadioButton.hxx>
+#include <QtInstanceScrolledWindow.hxx>
 #include <QtInstanceSpinButton.hxx>
 #include <QtInstanceTextView.hxx>
 #include <QtInstanceTreeView.hxx>
@@ -166,10 +167,13 @@ std::unique_ptr<weld::Frame> 
QtInstanceBuilder::weld_frame(const OUString& rId)
     return xRet;
 }
 
-std::unique_ptr<weld::ScrolledWindow> 
QtInstanceBuilder::weld_scrolled_window(const OUString&, bool)
+std::unique_ptr<weld::ScrolledWindow> 
QtInstanceBuilder::weld_scrolled_window(const OUString& rId,
+                                                                              
bool)
 {
-    assert(false && "Not implemented yet");
-    return nullptr;
+    QScrollArea* pScrollArea = m_xBuilder->get<QScrollArea>(rId);
+    std::unique_ptr<weld::ScrolledWindow> xRet(
+        pScrollArea ? std::make_unique<QtInstanceScrolledWindow>(pScrollArea) 
: nullptr);
+    return xRet;
 }
 
 std::unique_ptr<weld::Notebook> QtInstanceBuilder::weld_notebook(const 
OUString& rId)
diff --git a/vcl/qt5/QtInstanceScrolledWindow.cxx 
b/vcl/qt5/QtInstanceScrolledWindow.cxx
new file mode 100644
index 000000000000..da71b13fa73b
--- /dev/null
+++ b/vcl/qt5/QtInstanceScrolledWindow.cxx
@@ -0,0 +1,182 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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 <QtInstanceScrolledWindow.hxx>
+#include <QtInstanceScrolledWindow.moc>
+
+#include <QtWidgets/QScrollBar>
+
+QtInstanceScrolledWindow::QtInstanceScrolledWindow(QScrollArea* pScrollArea)
+    : QtInstanceWidget(pScrollArea)
+    , m_pScrollArea(pScrollArea)
+{
+    assert(m_pScrollArea);
+}
+
+void QtInstanceScrolledWindow::move(weld::Widget*, weld::Container*)
+{
+    assert(false && "Not implemented yet");
+}
+
+css::uno::Reference<css::awt::XWindow> 
QtInstanceScrolledWindow::CreateChildFrame()
+{
+    assert(false && "Not implemented yet");
+    return nullptr;
+}
+
+void QtInstanceScrolledWindow::child_grab_focus() { assert(false && "Not 
implemented yet"); }
+
+void QtInstanceScrolledWindow::hadjustment_configure(int, int, int, int, int, 
int)
+{
+    assert(false && "Not implemented yet");
+}
+
+int QtInstanceScrolledWindow::hadjustment_get_value() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::hadjustment_set_value(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+int QtInstanceScrolledWindow::hadjustment_get_upper() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::hadjustment_set_upper(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+int QtInstanceScrolledWindow::hadjustment_get_page_size() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::hadjustment_set_page_size(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceScrolledWindow::hadjustment_set_page_increment(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceScrolledWindow::hadjustment_set_step_increment(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceScrolledWindow::set_hpolicy(VclPolicyType)
+{
+    assert(false && "Not implemented yet");
+}
+
+VclPolicyType QtInstanceScrolledWindow::get_hpolicy() const
+{
+    assert(false && "Not implemented yet");
+    return VclPolicyType::ALWAYS;
+}
+
+void QtInstanceScrolledWindow::vadjustment_configure(int, int, int, int, int, 
int)
+{
+    assert(false && "Not implemented yet");
+}
+
+int QtInstanceScrolledWindow::vadjustment_get_value() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::vadjustment_set_value(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+int QtInstanceScrolledWindow::vadjustment_get_upper() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::vadjustment_set_upper(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+int QtInstanceScrolledWindow::vadjustment_get_page_size() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::vadjustment_set_page_size(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceScrolledWindow::vadjustment_set_page_increment(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceScrolledWindow::vadjustment_set_step_increment(int nSize)
+{
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        if (QScrollBar* pScrollBar = m_pScrollArea->verticalScrollBar())
+            pScrollBar->setSingleStep(nSize);
+    });
+}
+
+int QtInstanceScrolledWindow::vadjustment_get_lower() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::vadjustment_set_lower(int)
+{
+    assert(false && "Not implemented yet");
+}
+
+void QtInstanceScrolledWindow::set_vpolicy(VclPolicyType)
+{
+    assert(false && "Not implemented yet");
+}
+
+VclPolicyType QtInstanceScrolledWindow::get_vpolicy() const
+{
+    assert(false && "Not implemented yet");
+    return VclPolicyType::ALWAYS;
+}
+
+int QtInstanceScrolledWindow::get_scroll_thickness() const
+{
+    assert(false && "Not implemented yet");
+    return 0;
+}
+
+void QtInstanceScrolledWindow::set_scroll_thickness(int) { assert(false && 
"Not implemented yet"); }
+
+void QtInstanceScrolledWindow::customize_scrollbars(const Color&, const 
Color&, const Color&)
+{
+    assert(false && "Not implemented yet");
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/vcl/qt6/QtInstanceScrolledWindow.cxx 
b/vcl/qt6/QtInstanceScrolledWindow.cxx
new file mode 100644
index 000000000000..57d6788bd8ed
--- /dev/null
+++ b/vcl/qt6/QtInstanceScrolledWindow.cxx
@@ -0,0 +1,12 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * 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/QtInstanceScrolledWindow.cxx"
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
commit f161a066133e7cadcf109adba578460f9628dfae
Author:     Michael Weghorn <[email protected]>
AuthorDate: Sat Dec 14 22:46:25 2024 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Mon Dec 16 07:18:58 2024 +0100

    tdf#130857 qt weld: Implement QtInstanceWidget::{g,s}et_direction
    
    Change-Id: If9e8ce40bd162e6ef79c20c6f13032d6fed8ea5a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178495
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/inc/qt5/QtInstanceWidget.hxx b/vcl/inc/qt5/QtInstanceWidget.hxx
index 470473626866..891e49d4f6f0 100644
--- a/vcl/inc/qt5/QtInstanceWidget.hxx
+++ b/vcl/inc/qt5/QtInstanceWidget.hxx
@@ -137,7 +137,7 @@ public:
 
     virtual bool get_direction() const override;
 
-    virtual void set_direction(bool) override;
+    virtual void set_direction(bool bRTL) override;
 
     virtual void freeze() override;
 
diff --git a/vcl/qt5/QtInstanceWidget.cxx b/vcl/qt5/QtInstanceWidget.cxx
index 8316f1aa6254..d5aeb2b80754 100644
--- a/vcl/qt5/QtInstanceWidget.cxx
+++ b/vcl/qt5/QtInstanceWidget.cxx
@@ -491,11 +491,23 @@ bool QtInstanceWidget::get_extents_relative_to(const 
Widget& rRelative, int& rX,
 
 bool QtInstanceWidget::get_direction() const
 {
-    assert(false && "Not implemented yet");
-    return false;
+    SolarMutexGuard g;
+
+    bool bRTL = false;
+    GetQtInstance().RunInMainThread(
+        [&] { bRTL = m_pWidget->layoutDirection() == 
Qt::LayoutDirection::RightToLeft; });
+    return bRTL;
 }
 
-void QtInstanceWidget::set_direction(bool) { assert(false && "Not implemented 
yet"); }
+void QtInstanceWidget::set_direction(bool bRTL)
+{
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        m_pWidget->setLayoutDirection(bRTL ? Qt::LayoutDirection::RightToLeft
+                                           : Qt::LayoutDirection::LeftToRight);
+    });
+}
 
 void QtInstanceWidget::freeze(){};
 

Reply via email to