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));
+        }
     }
 };
 

Reply via email to