53 Q_DECLARE_PUBLIC(QTabBar)
56 : layoutDirty(
false), drawBase(
true), elideModeSetByUser(
false), useScrollButtons(
false),
57 useScrollButtonsSetByUser(
false), expanding(
true), closeButtonOnTabs(
false),
58 paintWithOffsets(
true), movable(
false), dragInProgress(
false), documentMode(
false),
59 autoHide(
false), changeCurrentOnDrag(
false)
67 QPoint dragStartPosition;
68 QPoint mousePosition = {-1, -1};
69#if QT_CONFIG(wheelevent)
70 QPoint accumulatedAngleDelta;
73 QToolButton* rightB =
nullptr;
74 QToolButton* leftB =
nullptr;
75 QMovableTabWidget *movingTab =
nullptr;
77 int switchTabCurrentIndex = -1;
78 QBasicTimer switchTabTimer;
79 Qt::TextElideMode elideMode = Qt::ElideNone;
80 QTabBar::SelectionBehavior selectionBehaviorOnRemove = QTabBar::SelectRightTab;
81 QTabBar::Shape shape = QTabBar::RoundedNorth;
82 Qt::MouseButtons mouseButtons = Qt::NoButton;
84 int currentIndex = -1;
85 int pressedIndex = -1;
92 bool elideModeSetByUser : 1;
93 bool useScrollButtons : 1;
94 bool useScrollButtonsSetByUser : 1;
96 bool closeButtonOnTabs : 1;
97 bool paintWithOffsets : 1;
99 bool dragInProgress : 1;
100 bool documentMode : 1;
102 bool changeCurrentOnDrag : 1;
105 inline Tab(
const QIcon &ico,
const QString &txt)
106 : text(txt), icon(ico), enabled(
true), visible(
true), measuringMinimum(
false)
110
111
112
113 Q_DISABLE_COPY_MOVE(Tab);
116#if QT_CONFIG(tooltip)
119#if QT_CONFIG(whatsthis)
122#if QT_CONFIG(accessibility)
123 QString accessibleName;
132 QWidget *leftWidget =
nullptr;
133 QWidget *rightWidget =
nullptr;
139 uint measuringMinimum : 1;
141#if QT_CONFIG(animation)
142 struct TabBarAnimation :
public QVariantAnimation {
143 TabBarAnimation(Tab *t, QTabBarPrivate *_priv) : tab(t), priv(_priv)
144 { setEasingCurve(QEasingCurve::InOutQuad); }
146 void updateCurrentValue(
const QVariant ¤t) override;
148 void updateState(State newState, State) override;
152 QTabBarPrivate *priv;
154 std::unique_ptr<TabBarAnimation> animation;
156 void startAnimation(QTabBarPrivate *priv,
int duration) {
157 if (!priv->isAnimated()) {
158 priv->moveTabFinished(priv->tabList.indexOf(
this));
162 animation = std::make_unique<TabBarAnimation>(
this, priv);
163 animation->setStartValue(dragOffset);
164 animation->setEndValue(0);
165 animation->setDuration(duration);
169 void startAnimation(QTabBarPrivate *priv,
int duration)
170 { Q_UNUSED(duration); priv->moveTabFinished(priv->tabList.indexOf(
this)); }
174 mutable QHash<QString, QSize> textSizes;
176 void calculateFirstLastVisible(
int index,
bool visible,
bool remove);
177 int selectNewCurrentIndexFrom(
int currentIndex);
178 int calculateNewPosition(
int from,
int to,
int index)
const;
179 void slide(
int from,
int to);
182 inline Tab *at(
int index) {
return tabList.value(index,
nullptr); }
183 inline const Tab *at(
int index)
const {
return tabList.value(index,
nullptr); }
185 int indexAtPos(
const QPoint &p)
const;
187 inline bool isAnimated()
const { Q_Q(
const QTabBar);
return q->style()->styleHint(QStyle::SH_Widget_Animation_Duration,
nullptr, q) > 0; }
188 inline bool validIndex(
int index)
const {
return index >= 0 && index < tabList.size(); }
189 void setCurrentNextEnabledIndex(
int offset);
193 void moveTab(
int index,
int offset);
194 void moveTabFinished(
int index);
198 void layoutWidgets(
int start = 0);
199 void layoutTab(
int index);
200 void updateMacBorderMetrics();
201 bool isTabInMacUnifiedToolbarArea()
const;
202 void setupMovableTab();
204 QRect normalizedScrollRect(
int index = -1);
205 int hoveredTabIndex()
const;
207 void initBasicStyleOption(QStyleOptionTab *option,
int tabIndex)
const;
209 void makeVisible(
int index);
212 static void initStyleBaseOption(QStyleOptionTabBarBase *optTabBase, QTabBar *tabbar, QSize size)
214 QStyleOptionTab tabOverlap;
215 tabOverlap.shape = tabbar->shape();
216 int overlap = tabbar->style()->pixelMetric(QStyle::PM_TabBarBaseOverlap, &tabOverlap, tabbar);
217 QWidget *theParent = tabbar->parentWidget();
218 optTabBase->initFrom(tabbar);
219 optTabBase->shape = tabbar->shape();
220 optTabBase->documentMode = tabbar->documentMode();
221 if (theParent && overlap > 0) {
223 switch (tabOverlap.shape) {
224 case QTabBar::RoundedNorth:
225 case QTabBar::TriangularNorth:
226 rect.setRect(0, size.height()-overlap, size.width(), overlap);
228 case QTabBar::RoundedSouth:
229 case QTabBar::TriangularSouth:
230 rect.setRect(0, 0, size.width(), overlap);
232 case QTabBar::RoundedEast:
233 case QTabBar::TriangularEast:
234 rect.setRect(0, 0, overlap, size.height());
236 case QTabBar::RoundedWest:
237 case QTabBar::TriangularWest:
238 rect.setRect(size.width() - overlap, 0, overlap, size.height());
241 optTabBase->rect = rect;
245 void killSwitchTabTimer();