From cabd6e6e9db021dd100f3c2e16adaa7b07271ae5 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 31 Oct 2020 14:05:06 +0100 Subject: [PATCH] Override QStyle::subElementRect in fancy tabbar to fix style problems Something is causing the contents of the tabbar to be stretched from top to bottom with space between icons and text. You can see this on the default Fedora (Gnome) installation. Also fixes the tabbar on macOS where the content was in the middle instead of the top. --- src/widgets/fancytabwidget.cpp | 30 +++++++++++- src/widgets/fancytabwidget.h | 87 +++++++++++++++++----------------- 2 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/widgets/fancytabwidget.cpp b/src/widgets/fancytabwidget.cpp index d95174b32..c97ad3cc5 100644 --- a/src/widgets/fancytabwidget.cpp +++ b/src/widgets/fancytabwidget.cpp @@ -52,6 +52,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "fancytabwidget.h" #include "core/stylehelper.h" @@ -406,7 +411,25 @@ void FancyTabWidget::currentTabChanged(const int idx) { } -FancyTabWidget::FancyTabWidget(QWidget* parent) : QTabWidget(parent), +// Override subElementRect() and use QCommonStyle to fix a problem with certain styles. +// Something is causing the contents of the tabbar to be stretched from top to bottom with space between icons and text. +// You can see this on the default Fedora (Gnome) installation. +// Also fixes the tabbar on macOS where the content was in the middle. + +class FancyTabWidgetProxyStyle : public QProxyStyle { + public: + explicit FancyTabWidgetProxyStyle(QStyle *style) : QProxyStyle(style), common_style_(new QCommonStyle()) {} + ~FancyTabWidgetProxyStyle() override { common_style_->deleteLater(); } + + QRect subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget = nullptr) const override { + return common_style_->subElementRect(element, option, widget); + } + + private: + QCommonStyle *common_style_; +}; + +FancyTabWidget::FancyTabWidget(QWidget *parent) : QTabWidget(parent), menu_(nullptr), mode_(Mode_None), bottom_widget_(nullptr), @@ -422,11 +445,16 @@ FancyTabWidget::FancyTabWidget(QWidget* parent) : QTabWidget(parent), setMovable(true); setElideMode(Qt::ElideNone); setUsesScrollButtons(true); + setStyle(new FancyTabWidgetProxyStyle(style())); connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); } +FancyTabWidget::~FancyTabWidget() { + style()->deleteLater(); +} + void FancyTabWidget::Load(const QString &kSettingsGroup) { QSettings s; diff --git a/src/widgets/fancytabwidget.h b/src/widgets/fancytabwidget.h index 74d9a4860..27ddd170f 100644 --- a/src/widgets/fancytabwidget.h +++ b/src/widgets/fancytabwidget.h @@ -47,20 +47,21 @@ class FancyTabWidget : public QTabWidget { public: explicit FancyTabWidget(QWidget *parent = nullptr); + ~FancyTabWidget() override; - void AddTab(QWidget *widget_view, const QString &name, const QIcon &icon, const QString &label); - bool EnableTab(QWidget *widget_view); - bool DisableTab(QWidget *widget_view); - int insertTab(const int idx, QWidget *page, const QIcon &icon, const QString &label); - void addBottomWidget(QWidget* widget_view); - int IndexOfTab(QWidget *widget); + void AddTab(QWidget *widget_view, const QString &name, const QIcon &icon, const QString &label); + bool EnableTab(QWidget *widget_view); + bool DisableTab(QWidget *widget_view); + int insertTab(const int idx, QWidget *page, const QIcon &icon, const QString &label); + void addBottomWidget(QWidget* widget_view); + int IndexOfTab(QWidget *widget); - void setBackgroundPixmap(const QPixmap& pixmap); - void addSpacer(); + void setBackgroundPixmap(const QPixmap& pixmap); + void addSpacer(); - void Load(const QString &kSettingsGroup); - void SaveSettings(const QString &kSettingsGroup); - void ReloadSettings(); + void Load(const QString &kSettingsGroup); + void SaveSettings(const QString &kSettingsGroup); + void ReloadSettings(); // Values are persisted - only add to the end enum Mode { @@ -72,47 +73,47 @@ class FancyTabWidget : public QTabWidget { Mode_PlainSidebar, }; - static const int TabSize_LargeSidebarMinWidth; - static const int IconSize_LargeSidebar; - static const int IconSize_SmallSidebar; + static const int TabSize_LargeSidebarMinWidth; + static const int IconSize_LargeSidebar; + static const int IconSize_SmallSidebar; - Mode mode() const { return mode_; } - int iconsize_smallsidebar() const { return iconsize_smallsidebar_; } - int iconsize_largesidebar() const { return iconsize_largesidebar_; } + Mode mode() const { return mode_; } + int iconsize_smallsidebar() const { return iconsize_smallsidebar_; } + int iconsize_largesidebar() const { return iconsize_largesidebar_; } - signals: - void ModeChanged(FancyTabWidget::Mode mode); - void CurrentChanged(int); + signals: + void ModeChanged(FancyTabWidget::Mode mode); + void CurrentChanged(int); - public slots: - void setCurrentIndex(int idx); - void SetMode(Mode mode); - // Mapper mapped signal needs this convenience function - void SetMode(int mode) { SetMode(Mode(mode)); } + public slots: + void setCurrentIndex(int idx); + void SetMode(Mode mode); + // Mapper mapped signal needs this convenience function + void SetMode(int mode) { SetMode(Mode(mode)); } - private slots: - void tabBarUpdateGeometry(); - void currentTabChanged(int); + private slots: + void tabBarUpdateGeometry(); + void currentTabChanged(int); - protected: - void paintEvent(QPaintEvent*) override; - void contextMenuEvent(QContextMenuEvent* e) override; + protected: + void paintEvent(QPaintEvent*) override; + void contextMenuEvent(QContextMenuEvent* e) override; - private: - void addMenuItem(QActionGroup* group, const QString& text, Mode mode); + private: + void addMenuItem(QActionGroup* group, const QString& text, Mode mode); - QPixmap background_pixmap_; - QMenu *menu_; - Mode mode_; - QWidget *bottom_widget_; + QPixmap background_pixmap_; + QMenu *menu_; + Mode mode_; + QWidget *bottom_widget_; - QMap tabs_; + QMap tabs_; - bool bg_color_system_; - bool bg_gradient_; - QColor bg_color_; - int iconsize_smallsidebar_; - int iconsize_largesidebar_; + bool bg_color_system_; + bool bg_gradient_; + QColor bg_color_; + int iconsize_smallsidebar_; + int iconsize_largesidebar_; };