diff options
author | Alessandro Portale <[email protected]> | 2025-05-22 17:44:33 +0200 |
---|---|---|
committer | Alessandro Portale <[email protected]> | 2025-05-23 10:31:08 +0000 |
commit | 60fe538a32b66f5c0e9eb6b7388939f488b6d6d9 (patch) | |
tree | 2e413096135e991f90fc51320219431dadd1f6b7 | |
parent | eaf79438d55e82a9d591e7a7548cd44c92219832 (diff) |
This adds a designed QTabBar to the list of QtcWidgets. A QtcTabBar
instance can be assigned to a derived QTabWidget via
QTabWidget::setTabBar.
Change-Id: I9676fcf790d3696c6ce2078cb7cb6f492b9ad00d
Reviewed-by: hjk <[email protected]>
-rw-r--r-- | src/libs/utils/qtcwidgets.cpp | 61 | ||||
-rw-r--r-- | src/libs/utils/qtcwidgets.h | 11 | ||||
-rw-r--r-- | tests/manual/widgets/components/tst_manual_widgets_components.cpp | 11 |
3 files changed, 83 insertions, 0 deletions
diff --git a/src/libs/utils/qtcwidgets.cpp b/src/libs/utils/qtcwidgets.cpp index aba8c258c7a..fcf47f1f064 100644 --- a/src/libs/utils/qtcwidgets.cpp +++ b/src/libs/utils/qtcwidgets.cpp @@ -828,6 +828,67 @@ void QtcImage::setPixmap(const QPixmap &px) update(); } +constexpr TextFormat TabBarTf + {Theme::Token_Text_Muted, StyleHelper::UiElementLabelMedium}; +constexpr TextFormat TabBarTfActive + {Theme::Token_Text_Default, TabBarTf.uiElement}; + +QtcTabBar::QtcTabBar(QWidget *parent) + : QTabBar(parent) +{ + setExpanding(false); + setMouseTracking(true); +} + +void QtcTabBar::paintEvent([[maybe_unused]] QPaintEvent *event) +{ + // +------------+------------+------------+ + // | |(VPaddingXs)| | + // | +------------+ | + // |(HPaddingXs)| <text> |(HPaddingXs)| + // | +------------+ | + // | |(VPaddingXs)| | + // +------------+------------+------------+ + + QPainter p(this); + p.setFont(TabBarTf.font()); + for (int tabIndex = 0; tabIndex < count(); tabIndex++) { + QStyleOptionTab opt; + initStyleOption(&opt, tabIndex); + const bool selected = opt.state & QStyle::State_Selected; + if (selected) { + QRect rect = opt.rect; + rect.moveTop(rect.height() - 2); // Same height as the active mode highlight marker + const QColor color = creatorColor(isEnabled() ? Theme::Token_Accent_Default + : Theme::Token_Foreground_Subtle); + p.fillRect(rect, color); + } else if (opt.rect.contains(mapFromGlobal(QCursor::pos()))) { + p.fillRect(opt.rect, creatorColor(Theme::Token_Foreground_Muted)); + } + const QColor textColor = isEnabled() ? (selected ? TabBarTfActive : TabBarTf).color() + : creatorColor(Theme::Token_Text_Subtle); + p.setPen(textColor); + p.drawText(opt.rect, Qt::AlignCenter, opt.text); + } +} + +bool QtcTabBar::event(QEvent *event) +{ + if (event->type() == QEvent::MouseMove || event->type() == QEvent::Leave) + repaint(); + return QTabBar::event(event); +} + +QSize QtcTabBar::minimumTabSizeHint(int index) const +{ + const QString text = tabText(index); + const QFontMetrics fm(TabBarTf.font()); + const int textWidth = fm.boundingRect(text).width(); + + return {ExPaddingGapL + textWidth + textWidth, + VPaddingXxs + TabBarTf.lineHeight() + VPaddingXxs}; +} + namespace QtcWidgets { Button::Button() diff --git a/src/libs/utils/qtcwidgets.h b/src/libs/utils/qtcwidgets.h index 75e3d655211..26fe3ef0d85 100644 --- a/src/libs/utils/qtcwidgets.h +++ b/src/libs/utils/qtcwidgets.h @@ -185,6 +185,17 @@ private: int m_radius = 0; }; +class QTCREATOR_UTILS_EXPORT QtcTabBar : public QTabBar +{ +public: + QtcTabBar(QWidget *parent = nullptr); + +protected: + void paintEvent(QPaintEvent *event) override; + bool event(QEvent *event) override; + QSize minimumTabSizeHint(int index) const override; +}; + namespace QtcWidgets { diff --git a/tests/manual/widgets/components/tst_manual_widgets_components.cpp b/tests/manual/widgets/components/tst_manual_widgets_components.cpp index 2c0ec9dd250..00e665b6e6e 100644 --- a/tests/manual/widgets/components/tst_manual_widgets_components.cpp +++ b/tests/manual/widgets/components/tst_manual_widgets_components.cpp @@ -23,6 +23,11 @@ QWidget *widgets() auto switchOff = new QtcSwitch("Qt::LeftToRight"); switchOff->setLayoutDirection(Qt::LeftToRight); + auto tabBar = new QtcTabBar; + tabBar->addTab("Tab number 1"); + tabBar->addTab("2"); + tabBar->addTab("3"); + using namespace Layouting; Column { Group { @@ -65,6 +70,12 @@ QWidget *widgets() switchOff, }, }, + Group { + title("TabBar"), + Row { + tabBar, + }, + }, }.attachTo(widget); return widget; |