summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-08-07 19:39:17 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-08-07 22:51:48 +0200
commita56705efdbe9ceb0f5bb92d1d8bb2cefbc03f3ac (patch)
treec4aa901f89e77b06bded47cc0519c848c3836900 /vcl
parent70015759e2d0ccf3fab0629bbea5c5d44a3975be (diff)
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 <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/app/salvtables.cxx15
-rw-r--r--vcl/unx/gtk3/gtkinst.cxx38
2 files changed, 53 insertions, 0 deletions
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));
+ }
}
};