summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-10-11 11:36:33 +0100
committerCaolán McNamara <caolanm@redhat.com>2018-10-11 14:37:46 +0200
commit117e8ff822f04dbb639ceafffa3f1786bba870ed (patch)
tree7a8b2fada1e3a300cca627efd2f9b2f950d3d787
parent53d900fb334b2ce08ff19de0f765108e8c91a36f (diff)
Related: tdf#120371 relax tabs on left
Allow on-top if tabs would fit, even when > 6. Some themes have much smaller tabs where more can fit comfortably. Change-Id: Ia9de9059bd5af4de0e6d6a8b8817f87226e2066a Reviewed-on: https://gerrit.libreoffice.org/61661 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx52
1 files changed, 43 insertions, 9 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index e480fdccbf8d..970e53b0cbb4 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -2772,7 +2772,8 @@ class GtkInstanceNotebook : public GtkInstanceContainer, public virtual weld::No
{
private:
GtkNotebook* m_pNotebook;
- gulong m_nSignalId;
+ gulong m_nSwitchPageSignalId;
+ gulong m_nSizeAllocateSignalId;
mutable std::vector<std::unique_ptr<GtkInstanceContainer>> m_aPages;
static void signalSwitchPage(GtkNotebook*, GtkWidget*, guint nNewPage, gpointer widget)
@@ -2814,21 +2815,52 @@ private:
return -1;
}
+ // tdf#120371
// https://developer.gnome.org/hig-book/unstable/controls-notebooks.html.en#controls-too-many-tabs
- // tdf#120371 If you have more than about six tabs in a notebook ... place
- // the list control on the left-hand side of the window
+ // If you have more than about six tabs in a notebook ... place the list
+ // control on the left-hand side of the window
+
+ // if number of pages drops to 6 or less, definitely place tabs on top
void update_tab_pos()
{
- gtk_notebook_set_tab_pos(m_pNotebook, get_n_pages() > 6 ? GTK_POS_LEFT : GTK_POS_TOP);
+ if (get_n_pages() <= 6)
+ gtk_notebook_set_tab_pos(m_pNotebook, GTK_POS_TOP);
+ }
+
+ // if > 6, but only if the notebook would auto-scroll, then flip tabs
+ // to left which allows themes like Ambience under Ubuntu 16.04 to keep
+ // tabs on top when they would fit
+ void signal_size_allocate()
+ {
+ gint nPages = gtk_notebook_get_n_pages(m_pNotebook);
+ if (nPages > 6 && gtk_notebook_get_tab_pos(m_pNotebook) == GTK_POS_TOP)
+ {
+ for (gint i = 0; i < nPages; ++i)
+ {
+ GtkWidget* pTabWidget = gtk_notebook_get_tab_label(m_pNotebook, gtk_notebook_get_nth_page(m_pNotebook, i));
+ if (!gtk_widget_get_child_visible(pTabWidget))
+ {
+ gtk_notebook_set_tab_pos(m_pNotebook, GTK_POS_LEFT);
+ break;
+ }
+ }
+ }
+ }
+
+ static void signalSizeAllocate(GtkWidget*, GdkRectangle*, gpointer widget)
+ {
+ GtkInstanceNotebook* pThis = static_cast<GtkInstanceNotebook*>(widget);
+ pThis->signal_size_allocate();
}
public:
GtkInstanceNotebook(GtkNotebook* pNotebook, bool bTakeOwnership)
: GtkInstanceContainer(GTK_CONTAINER(pNotebook), bTakeOwnership)
, m_pNotebook(pNotebook)
- , m_nSignalId(g_signal_connect(pNotebook, "switch-page", G_CALLBACK(signalSwitchPage), this))
+ , m_nSwitchPageSignalId(g_signal_connect(pNotebook, "switch-page", G_CALLBACK(signalSwitchPage), this))
{
- update_tab_pos();
+ if (get_n_pages() > 6)
+ m_nSizeAllocateSignalId = g_signal_connect(pNotebook, "size-allocate", G_CALLBACK(signalSizeAllocate), this);
}
virtual int get_current_page() const override
@@ -2880,14 +2912,14 @@ public:
virtual void disable_notify_events() override
{
- g_signal_handler_block(m_pNotebook, m_nSignalId);
+ g_signal_handler_block(m_pNotebook, m_nSwitchPageSignalId);
GtkInstanceContainer::disable_notify_events();
}
virtual void enable_notify_events() override
{
GtkInstanceContainer::enable_notify_events();
- g_signal_handler_unblock(m_pNotebook, m_nSignalId);
+ g_signal_handler_unblock(m_pNotebook, m_nSwitchPageSignalId);
}
virtual void remove_page(const OString& rIdent) override
@@ -2900,7 +2932,9 @@ public:
virtual ~GtkInstanceNotebook() override
{
- g_signal_handler_disconnect(m_pNotebook, m_nSignalId);
+ g_signal_handler_disconnect(m_pNotebook, m_nSwitchPageSignalId);
+ if (m_nSizeAllocateSignalId)
+ g_signal_handler_disconnect(m_pNotebook, m_nSizeAllocateSignalId);
}
};