vcl/inc/qt5/QtInstanceMenuButton.hxx     |    2 
 vcl/inc/qt5/QtInstanceScrolledWindow.hxx |    8 +--
 vcl/qt5/QtInstanceMenuButton.cxx         |   24 +++++++--
 vcl/qt5/QtInstanceScrolledWindow.cxx     |   80 ++++++++++++++++++++++++++-----
 4 files changed, 93 insertions(+), 21 deletions(-)

New commits:
commit b3076a0016b4fd33be35b61381800ce5591682b4
Author:     Michael Weghorn <[email protected]>
AuthorDate: Tue Jan 21 22:28:33 2025 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Wed Jan 22 07:49:56 2025 +0100

    tdf#130857 qt weld: Support ScrolledWindow page size
    
    IIUC, the "page size" (other than the "page increment")
    refers to the size of the widget shown in the scroll area.
    
    Therefore, get/set the width/height of the QScrollArea's widget
    when getting/setting the page size.
    
    As the QScrollArea::widgetResizable doc [1] says:
    
    > Regardless of this property, you can programmatically resize the
    > widget using widget()->resize(), and the scroll area will automatically
    > adjust itself to the new size.
    
    [1] https://doc.qt.io/qt-6/qscrollarea.html#widgetResizable-prop
    
    Change-Id: Ibe90c0228bdc3a2c1ba311a9c9c88fa83d1389b2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180564
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/vcl/inc/qt5/QtInstanceScrolledWindow.hxx 
b/vcl/inc/qt5/QtInstanceScrolledWindow.hxx
index 5cebe1a597cd..16ffe5b4c727 100644
--- a/vcl/inc/qt5/QtInstanceScrolledWindow.hxx
+++ b/vcl/inc/qt5/QtInstanceScrolledWindow.hxx
@@ -27,8 +27,8 @@ public:
     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 void hadjustment_configure(int nValue, int nLower, int nUpper, int 
nStepIncrement,
+                                       int nPageIncrement, int nPageSize) 
override;
     virtual int hadjustment_get_value() const override;
     virtual void hadjustment_set_value(int nValue) override;
     virtual int hadjustment_get_upper() const override;
@@ -40,8 +40,8 @@ public:
     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 void vadjustment_configure(int nValue, int nLower, int nUpper, int 
nStepIncrement,
+                                       int nPageIncrement, int nPageSize) 
override;
     virtual int vadjustment_get_value() const override;
     virtual void vadjustment_set_value(int nValue) override;
     virtual int vadjustment_get_upper() const override;
diff --git a/vcl/qt5/QtInstanceScrolledWindow.cxx 
b/vcl/qt5/QtInstanceScrolledWindow.cxx
index d799555d94cf..06ac3f640287 100644
--- a/vcl/qt5/QtInstanceScrolledWindow.cxx
+++ b/vcl/qt5/QtInstanceScrolledWindow.cxx
@@ -32,9 +32,25 @@ css::uno::Reference<css::awt::XWindow> 
QtInstanceScrolledWindow::CreateChildFram
 
 void QtInstanceScrolledWindow::child_grab_focus() { assert(false && "Not 
implemented yet"); }
 
-void QtInstanceScrolledWindow::hadjustment_configure(int, int, int, int, int, 
int)
+void QtInstanceScrolledWindow::hadjustment_configure(int nValue, int nLower, 
int nUpper,
+                                                     int nStepIncrement, int 
nPageIncrement,
+                                                     int nPageSize)
 {
-    assert(false && "Not implemented yet");
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        QScrollBar* pScrollBar = m_pScrollArea->horizontalScrollBar();
+        if (!pScrollBar)
+            return;
+
+        pScrollBar->setValue(nValue);
+        pScrollBar->setMinimum(nLower);
+        pScrollBar->setMaximum(nUpper);
+        pScrollBar->setSingleStep(nStepIncrement);
+        pScrollBar->setPageStep(nPageIncrement);
+        if (QWidget* pWidget = m_pScrollArea->widget())
+            pWidget->resize(nPageSize, pWidget->height());
+    });
 }
 
 int QtInstanceScrolledWindow::hadjustment_get_value() const
@@ -85,13 +101,25 @@ void QtInstanceScrolledWindow::hadjustment_set_upper(int 
nUpper)
 
 int QtInstanceScrolledWindow::hadjustment_get_page_size() const
 {
-    assert(false && "Not implemented yet");
-    return 0;
+    SolarMutexGuard g;
+
+    int nPageSize = 0;
+    GetQtInstance().RunInMainThread([&] {
+        if (QWidget* pWidget = m_pScrollArea->widget())
+            nPageSize = pWidget->width();
+    });
+
+    return nPageSize;
 }
 
-void QtInstanceScrolledWindow::hadjustment_set_page_size(int)
+void QtInstanceScrolledWindow::hadjustment_set_page_size(int nSize)
 {
-    assert(false && "Not implemented yet");
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        if (QWidget* pWidget = m_pScrollArea->widget())
+            pWidget->resize(nSize, pWidget->height());
+    });
 }
 
 void QtInstanceScrolledWindow::hadjustment_set_page_increment(int nSize)
@@ -133,9 +161,25 @@ VclPolicyType QtInstanceScrolledWindow::get_hpolicy() const
     return ePolicy;
 }
 
-void QtInstanceScrolledWindow::vadjustment_configure(int, int, int, int, int, 
int)
+void QtInstanceScrolledWindow::vadjustment_configure(int nValue, int nLower, 
int nUpper,
+                                                     int nStepIncrement, int 
nPageIncrement,
+                                                     int nPageSize)
 {
-    assert(false && "Not implemented yet");
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        QScrollBar* pScrollBar = m_pScrollArea->verticalScrollBar();
+        if (!pScrollBar)
+            return;
+
+        pScrollBar->setValue(nValue);
+        pScrollBar->setMinimum(nLower);
+        pScrollBar->setMaximum(nUpper);
+        pScrollBar->setSingleStep(nStepIncrement);
+        pScrollBar->setPageStep(nPageIncrement);
+        if (QWidget* pWidget = m_pScrollArea->widget())
+            pWidget->resize(pWidget->width(), nPageSize);
+    });
 }
 
 int QtInstanceScrolledWindow::vadjustment_get_value() const
@@ -186,13 +230,25 @@ void QtInstanceScrolledWindow::vadjustment_set_upper(int 
nUpper)
 
 int QtInstanceScrolledWindow::vadjustment_get_page_size() const
 {
-    assert(false && "Not implemented yet");
-    return 0;
+    SolarMutexGuard g;
+
+    int nPageSize = 0;
+    GetQtInstance().RunInMainThread([&] {
+        if (QWidget* pWidget = m_pScrollArea->widget())
+            nPageSize = pWidget->height();
+    });
+
+    return nPageSize;
 }
 
-void QtInstanceScrolledWindow::vadjustment_set_page_size(int)
+void QtInstanceScrolledWindow::vadjustment_set_page_size(int nSize)
 {
-    assert(false && "Not implemented yet");
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        if (QWidget* pWidget = m_pScrollArea->widget())
+            pWidget->resize(pWidget->width(), nSize);
+    });
 }
 
 void QtInstanceScrolledWindow::vadjustment_set_page_increment(int nSize)
commit 4108d5ff7b1e1ce00a96ced566f9afb5c4fa27eb
Author:     Michael Weghorn <[email protected]>
AuthorDate: Tue Jan 21 21:50:10 2025 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Wed Jan 22 07:49:49 2025 +0100

    tdf#130857 qt weld: Support custom MenuButton popover
    
    Like GtkMenuButton [1], weld::MenuButton doesn't
    only support showing a menu, but also a custom
    popover/widget.
    
    This widget can be set via weld::MenuButton::set_popover.
    Implement that for QtInstanceMenuButton and adjust the
    logic to use either that popover (if set) or a menu
    set for the underlying QToolButton.
    
    Manually trigger either showing the popover or the menu
    in a slot connected to the QToolButton::clicked signal.
    
    One dialog using menu buttons with custom popovers
    is the one that can be triggered in Writer via "Format" -> "Theme",
    then clicking the "Add" button in that dialog.
    (That dialog isn't supported by QtInstanceBuilder yet,
    however, just seen that while experimenting.)
    
    Change-Id: I9a5924a5ed8c5b8b39050849fe609188559c479c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180561
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/vcl/inc/qt5/QtInstanceMenuButton.hxx 
b/vcl/inc/qt5/QtInstanceMenuButton.hxx
index 5e472b24d183..84959df71852 100644
--- a/vcl/inc/qt5/QtInstanceMenuButton.hxx
+++ b/vcl/inc/qt5/QtInstanceMenuButton.hxx
@@ -18,6 +18,7 @@ class QtInstanceMenuButton : public QtInstanceToggleButton, 
public virtual weld:
     Q_OBJECT
 
     QToolButton* m_pToolButton;
+    QWidget* m_pPopover;
 
 public:
     QtInstanceMenuButton(QToolButton* pButton);
@@ -42,6 +43,7 @@ private:
     QAction* getAction(const OUString& rIdent) const;
 
 private Q_SLOTS:
+    void handleButtonClicked();
     void handleMenuItemTriggered(QAction* pAction);
 };
 
diff --git a/vcl/qt5/QtInstanceMenuButton.cxx b/vcl/qt5/QtInstanceMenuButton.cxx
index f6432abdc77d..e68a7f656c90 100644
--- a/vcl/qt5/QtInstanceMenuButton.cxx
+++ b/vcl/qt5/QtInstanceMenuButton.cxx
@@ -19,13 +19,15 @@
 QtInstanceMenuButton::QtInstanceMenuButton(QToolButton* pButton)
     : QtInstanceToggleButton(pButton)
     , m_pToolButton(pButton)
+    , m_pPopover(nullptr)
 {
     assert(m_pToolButton);
-    m_pToolButton->setPopupMode(QToolButton::InstantPopup);
 
-    assert(m_pToolButton->menu());
-    connect(m_pToolButton->menu(), &QMenu::triggered, this,
-            &QtInstanceMenuButton::handleMenuItemTriggered);
+    if (m_pToolButton->menu())
+        connect(m_pToolButton->menu(), &QMenu::triggered, this,
+                &QtInstanceMenuButton::handleMenuItemTriggered);
+
+    connect(m_pToolButton, &QToolButton::clicked, this, 
&QtInstanceMenuButton::handleButtonClicked);
 }
 
 void QtInstanceMenuButton::insert_item(int nPos, const OUString& rId, const 
OUString& rStr,
@@ -126,7 +128,11 @@ void QtInstanceMenuButton::set_item_visible(const 
OUString& rIdent, bool bVisibl
     });
 }
 
-void QtInstanceMenuButton::set_popover(weld::Widget*) { assert(false && "Not 
implemented yet"); }
+void QtInstanceMenuButton::set_popover(weld::Widget* pPopover)
+{
+    QtInstanceWidget* pPopoverWidget = 
dynamic_cast<QtInstanceWidget*>(pPopover);
+    m_pPopover = pPopoverWidget ? pPopoverWidget->getQWidget() : nullptr;
+}
 
 QMenu& QtInstanceMenuButton::getMenu() const
 {
@@ -147,6 +153,14 @@ QAction* QtInstanceMenuButton::getAction(const OUString& 
rIdent) const
     return nullptr;
 }
 
+void QtInstanceMenuButton::handleButtonClicked()
+{
+    if (m_pPopover)
+        m_pPopover->show();
+    else
+        m_pToolButton->showMenu();
+}
+
 void QtInstanceMenuButton::handleMenuItemTriggered(QAction* pAction)
 {
     SolarMutexGuard g;

Reply via email to