-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmarqueelabel.cpp
More file actions
77 lines (62 loc) · 1.92 KB
/
marqueelabel.cpp
File metadata and controls
77 lines (62 loc) · 1.92 KB
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
#include <QPainter>
#include <QResizeEvent>
#include "marqueelabel.h"
MarqueeLabel::MarqueeLabel(QWidget *parent)
: QLabel(parent) {
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MarqueeLabel::scrollText);
setAttribute(Qt::WA_OpaquePaintEvent, true);
QLabel::setText(QString());
}
void MarqueeLabel::setText(const QString &text) {
QLabel::setText(text);
updateMetrics();
updateMarqueeState();
update();
}
void MarqueeLabel::setMarqueeEnabled(bool enabled) {
marqueeEnabled = enabled;
updateMarqueeState();
}
void MarqueeLabel::updateMetrics() {
QFontMetrics metrics(font());
textWidth = metrics.horizontalAdvance(text());
scrollOffset = 0;
}
void MarqueeLabel::updateMarqueeState() {
if (!marqueeEnabled) {
timer->stop();
return;
}
if (textWidth > (width() - 16) && !text().isEmpty())
QTimer::singleShot(3000, this, [this]{ timer->start(50); });
else timer->stop();
}
void MarqueeLabel::resizeEvent(QResizeEvent *event) {
QLabel::resizeEvent(event);
updateMetrics();
updateMarqueeState();
}
void MarqueeLabel::scrollText() {
scrollOffset += 1;
if (scrollOffset > textWidth + 172) {
scrollOffset = 0;
timer->stop();
QTimer::singleShot(3000, this, [this]{ timer->start(50); });
}
update();
}
void MarqueeLabel::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);
QPainter painter(this);
painter.fillRect(rect(), palette().window());
painter.setClipRect(rect());
QRect textRect = rect();
if (timer->isActive()) {
textRect.setX(rect().x() - scrollOffset);
painter.drawText(textRect, alignment(), text());
QRect loopRect = textRect;
loopRect.setX(textRect.x() + textWidth + 172);
painter.drawText(loopRect, alignment(), text());
} else painter.drawText(textRect, alignment(), text());
}