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;
