forked from zonyitoo/doubanfm-qt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
horizontalslider.cpp
105 lines (89 loc) · 2.82 KB
/
horizontalslider.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "horizontalslider.h"
#include <QRect>
#include <QPropertyAnimation>
#include <QDebug>
HorizontalSlider::HorizontalSlider(QWidget *parent) :
QWidget(parent), hbox(nullptr)
{
container = new QWidget(this);
container->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
curIndex = 0;
}
HorizontalSlider::~HorizontalSlider() {
delete container;
}
void HorizontalSlider::clear() {
if (hbox != nullptr) {
container->setLayout(nullptr);
delete hbox;
}
hbox = new QHBoxLayout(container);
hbox->setMargin(0);
hbox->setSpacing(0);
hbox->setContentsMargins(0, 0, 0, 0);
container->setLayout(hbox);
}
void HorizontalSlider::setChildren(const QList<QWidget *>& list) {
clear();
items = list;
int accu = 0;
for (QWidget *object : list) {
object->setParent(container);
hbox->addWidget(object);
widths.append(object->width());
accu += object->width();
}
container->setMaximumWidth(accu);
container->setMinimumWidth(accu);
container->setMaximumHeight(this->height());
container->setMinimumHeight(this->height());
curIndex = 0;
container->move(QPoint(this->width() / 2 - widths[0] / 2, 0));
refresh();
}
void HorizontalSlider::addChild(QWidget *widget) {
hbox->addWidget(widget);
widths.append(widget->width());
auto orig_width = container->maximumWidth();
container->setMaximumWidth(orig_width + widget->width());
container->setMinimumWidth(orig_width + widget->width());
}
void HorizontalSlider::scrollToIndex(int index) {
if (index == curIndex) return;
if (index > numberOfChildren() - 1) return;
this->curIndex = index;
QPropertyAnimation *anim = new QPropertyAnimation(container, "geometry");
anim->setDuration(300);
anim->setStartValue(container->geometry());
int accuwidth = 0;
for (int i = 0; i < index; ++ i) accuwidth += widths[i];
accuwidth += widths[index] / 2 - this->width() / 2;
QRect endval(-accuwidth,
container->geometry().y(),
container->geometry().width(),
container->geometry().height()
);
anim->setEndValue(endval);
anim->setEasingCurve(QEasingCurve::OutCubic);
connect(anim, &QPropertyAnimation::finished, [=] () {
emit scrollFinished();
});
anim->start(QAbstractAnimation::DeleteWhenStopped);
}
int HorizontalSlider::numberOfChildren() {
return items.size();
}
int HorizontalSlider::currentIndex() {
return curIndex;
}
void HorizontalSlider::refresh() {
}
QWidget *HorizontalSlider::currentObject() const {
return items[curIndex];
}
QWidget *HorizontalSlider::preObject() const {
return items[curIndex - 1];
}
QWidget *HorizontalSlider::nextObject() const {
return items[curIndex + 1];
}