implement Tabs

This commit is contained in:
laserpants 2016-03-19 13:52:53 +03:00
parent cf1d873ec3
commit 754d01b3c2
2 changed files with 132 additions and 0 deletions

View File

@ -1 +1,86 @@
#include <QHBoxLayout>
#include <QPainter>
#include <QPropertyAnimation>
#include "tabs.h"
#include "tab.h"
Tabs::Tabs(QWidget *parent)
: QWidget(parent),
_tabLayout(new QHBoxLayout),
_animation(new QPropertyAnimation(this)),
_tab(0),
_tween(1)
{
_animation->setPropertyName("tween");
_animation->setEasingCurve(QEasingCurve::OutCirc);
_animation->setTargetObject(this);
_animation->setDuration(700);
setLayout(_tabLayout);
_tabLayout->setSpacing(0);
_tabLayout->setMargin(0);
}
Tabs::~Tabs()
{
}
void Tabs::addTab(Tab *tab)
{
_tabLayout->addWidget(tab);
connect(tab, SIGNAL(clicked()), this, SLOT(switchActiveTab()));
}
void Tabs::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QPainter painter(this);
painter.fillRect(_inkBarGeometry, Qt::black);
}
void Tabs::switchActiveTab()
{
Tab *tab = static_cast<Tab *>(sender());
if (tab) {
_previousGeometry = _inkBarGeometry;
_tab = _tabLayout->indexOf(tab);
_inkBarGeometry = _tabLayout->itemAt(_tab)->geometry();
_animation->stop();
_animation->setStartValue(0);
_animation->setEndValue(1);
_animation->start();
emit currentChanged(_tab);
}
}
void Tabs::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event)
updateInkBar();
}
void Tabs::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event)
updateInkBar();
}
void Tabs::updateInkBar()
{
QLayoutItem *item = _tabLayout->itemAt(_tab);
if (item) {
const QRect &r = item->geometry();
const qreal s = 1-_tween;
if (QAbstractAnimation::Running != _animation->state()) {
_inkBarGeometry = QRect(r.left(), r.bottom()-3, r.width(), 4);
} else {
const qreal left = _previousGeometry.left()*s + r.left()*_tween;
const qreal width = _previousGeometry.width()*s + r.width()*_tween;
_inkBarGeometry = QRect(left, r.bottom()-3, width, 4);
}
update();
}
}

47
tabs.h
View File

@ -0,0 +1,47 @@
#ifndef TABS_H
#define TABS_H
#include <QWidget>
class QHBoxLayout;
class QPropertyAnimation;
class Tab;
class Tabs : public QWidget
{
Q_OBJECT
Q_PROPERTY(qreal tween WRITE setTween READ tween)
public:
explicit Tabs(QWidget *parent = 0);
~Tabs();
inline void setTween(qreal tween) { _tween = tween; updateInkBar(); }
inline qreal tween() const { return _tween; }
void addTab(Tab *tab);
protected:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
void moveEvent(QMoveEvent *event) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
protected slots:
void switchActiveTab();
signals:
void currentChanged(int);
private:
void updateInkBar();
QHBoxLayout *const _tabLayout;
QPropertyAnimation *const _animation;
QRect _inkBarGeometry;
QRect _previousGeometry;
int _tab;
qreal _tween;
};
#endif // TABS_H