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(){};
