aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlessandro Portale <[email protected]>2025-05-22 17:44:33 +0200
committerAlessandro Portale <[email protected]>2025-05-23 10:31:08 +0000
commit60fe538a32b66f5c0e9eb6b7388939f488b6d6d9 (patch)
tree2e413096135e991f90fc51320219431dadd1f6b7
parenteaf79438d55e82a9d591e7a7548cd44c92219832 (diff)
Utils: Introduce QtcTabBarHEADmaster
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.cpp61
-rw-r--r--src/libs/utils/qtcwidgets.h11
-rw-r--r--tests/manual/widgets/components/tst_manual_widgets_components.cpp11
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;