include/svtools/scrolladaptor.hxx | 2 + include/vcl/weld.hxx | 3 ++ svtools/source/control/scrolladaptor.cxx | 2 + vcl/source/app/salvtables.cxx | 15 ++++++++++++ vcl/unx/gtk3/gtkinst.cxx | 38 +++++++++++++++++++++++++++++++ 5 files changed, 60 insertions(+)
New commits: commit a56705efdbe9ceb0f5bb92d1d8bb2cefbc03f3ac Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sun Aug 7 19:39:17 2022 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Sun Aug 7 22:51:48 2022 +0200 add set_scroll_thickness to provide a way to "zoom" the scrollbar Change-Id: I551112fb097a6ac2b442cd37d1a16bd2b34ecc54 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137932 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/svtools/scrolladaptor.hxx b/include/svtools/scrolladaptor.hxx index f6a2cefc4d24..d321091ac4de 100644 --- a/include/svtools/scrolladaptor.hxx +++ b/include/svtools/scrolladaptor.hxx @@ -68,6 +68,8 @@ public: bool HasGrab() const { return m_xScrollBar->has_grab(); } + void SetThickness(int nThickness); + ScrollAdaptor(vcl::Window* pParent, bool bHori); virtual void dispose() override; }; diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index c886ba2af075..1ffa2d877408 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -2517,6 +2517,9 @@ public: virtual int adjustment_get_lower() const = 0; virtual void adjustment_set_lower(int upper) = 0; + virtual int get_scroll_thickness() const = 0; + virtual void set_scroll_thickness(int nThickness) = 0; + virtual ScrollType get_scroll_type() const = 0; void connect_adjustment_changed(const Link<Scrollbar&, void>& rLink) { m_aChangeHdl = rLink; } diff --git a/svtools/source/control/scrolladaptor.cxx b/svtools/source/control/scrolladaptor.cxx index d6805f2b86b3..14480f0c7d2d 100644 --- a/svtools/source/control/scrolladaptor.cxx +++ b/svtools/source/control/scrolladaptor.cxx @@ -114,4 +114,6 @@ tools::Long ScrollAdaptor::DoScroll(tools::Long nNewPos) return m_xScrollBar->adjustment_get_value() - nOrig; } +void ScrollAdaptor::SetThickness(int nThickness) { m_xScrollBar->set_scroll_thickness(nThickness); } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 02394ac9176c..673c2ea4dbec 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -2554,6 +2554,21 @@ public: } virtual ScrollType get_scroll_type() const override { return m_xScrollBar->GetType(); } + + virtual int get_scroll_thickness() const override + { + if (m_xScrollBar->GetStyle() & WB_HORZ) + return m_xScrollBar->get_preferred_size().Height(); + return m_xScrollBar->get_preferred_size().Width(); + } + + virtual void set_scroll_thickness(int nThickness) override + { + if (m_xScrollBar->GetStyle() & WB_HORZ) + m_xScrollBar->set_height_request(nThickness); + else + m_xScrollBar->set_width_request(nThickness); + } }; } diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 158bc84c002b..cd26d1f5c3b3 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -8411,6 +8411,7 @@ class GtkInstanceScrollbar final : public GtkInstanceWidget, public virtual weld private: GtkScrollbar* m_pScrollbar; GtkAdjustment* m_pAdjustment; + GtkCssProvider* m_pThicknessCssProvider; gulong m_nAdjustChangedSignalId; static void signalAdjustValueChanged(GtkAdjustment*, gpointer widget) @@ -8456,6 +8457,7 @@ public: #else , m_pAdjustment(gtk_range_get_adjustment(GTK_RANGE(m_pScrollbar))) #endif + , m_pThicknessCssProvider(nullptr) , m_nAdjustChangedSignalId(g_signal_connect(m_pAdjustment, "value-changed", G_CALLBACK(signalAdjustValueChanged), this)) { #if GTK_CHECK_VERSION(4, 0, 0) @@ -8560,9 +8562,45 @@ public: return ScrollType::Drag; } + virtual int get_scroll_thickness() const override + { + if (gtk_orientable_get_orientation(GTK_ORIENTABLE(m_pScrollbar)) == GTK_ORIENTATION_HORIZONTAL) + return gtk_widget_get_allocated_height(GTK_WIDGET(m_pScrollbar)); + return gtk_widget_get_allocated_width(GTK_WIDGET(m_pScrollbar)); + } + + virtual void set_scroll_thickness(int nThickness) override + { + GtkStyleContext *pStyleContext = gtk_widget_get_style_context(GTK_WIDGET(m_pScrollbar)); + + if (m_pThicknessCssProvider) + { + gtk_style_context_remove_provider(pStyleContext, GTK_STYLE_PROVIDER(m_pThicknessCssProvider)); + m_pThicknessCssProvider = nullptr; + } + + m_pThicknessCssProvider = gtk_css_provider_new(); + int nSlider = nThickness > 6 ? nThickness - 6 : 1; + const OString sData = "slider { min-height: " + OString::number(nSlider) + "px;" + " min-width: " + OString::number(nSlider) + "px; }"; + css_provider_load_from_data(m_pThicknessCssProvider, sData.getStr(), sData.getLength()); + gtk_style_context_add_provider(pStyleContext, GTK_STYLE_PROVIDER(m_pThicknessCssProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + + if (gtk_orientable_get_orientation(GTK_ORIENTABLE(m_pScrollbar)) == GTK_ORIENTATION_HORIZONTAL) + gtk_widget_set_size_request(GTK_WIDGET(m_pScrollbar), -1, nThickness); + else + gtk_widget_set_size_request(GTK_WIDGET(m_pScrollbar), nThickness, -1); + } + virtual ~GtkInstanceScrollbar() override { g_signal_handler_disconnect(m_pAdjustment, m_nAdjustChangedSignalId); + if (m_pThicknessCssProvider) + { + GtkStyleContext *pStyleContext = gtk_widget_get_style_context(GTK_WIDGET(m_pScrollbar)); + gtk_style_context_remove_provider(pStyleContext, GTK_STYLE_PROVIDER(m_pThicknessCssProvider)); + } } };