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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#include <QDomNode>
#include <QPaintEvent>
#include <QPainter>
#include "waveformrendererendoftrack.h"
#include "waveformwidgetrenderer.h"
#include "control/controlobject.h"
#include "control/controlproxy.h"
#include "widget/wskincolor.h"
#include "widget/wwidget.h"
#include "util/painterscope.h"
#include "util/timer.h"
namespace {
constexpr int kBlinkingPeriodMillis = 1000;
} // anonymous namespace
WaveformRendererEndOfTrack::WaveformRendererEndOfTrack(
WaveformWidgetRenderer* waveformWidgetRenderer)
: WaveformRendererAbstract(waveformWidgetRenderer),
m_pEndOfTrackControl(nullptr),
m_pTimeRemainingControl(nullptr) {
}
WaveformRendererEndOfTrack::~WaveformRendererEndOfTrack() {
delete m_pEndOfTrackControl;
delete m_pTimeRemainingControl;
}
bool WaveformRendererEndOfTrack::init() {
m_timer.restart();
m_pEndOfTrackControl = new ControlProxy(
m_waveformRenderer->getGroup(), "end_of_track");
m_pTimeRemainingControl = new ControlProxy(
m_waveformRenderer->getGroup(), "time_remaining");
return true;
}
void WaveformRendererEndOfTrack::setup(const QDomNode& node, const SkinContext& context) {
m_color = QColor(200, 25, 20);
const QString endOfTrackColorName = context.selectString(node, "EndOfTrackColor");
if (!endOfTrackColorName.isNull()) {
m_color.setNamedColor(endOfTrackColorName);
m_color = WSkinColor::getCorrectColor(m_color);
}
m_pen = QPen(QBrush(m_color), 2.5 * scaleFactor());
generateBackRects();
}
void WaveformRendererEndOfTrack::onResize() {
generateBackRects();
}
void WaveformRendererEndOfTrack::draw(QPainter* painter,
QPaintEvent* /*event*/) {
if (!m_pEndOfTrackControl->toBool()) {
return;
}
//ScopedTimer t("WaveformRendererEndOfTrack::draw");
const int elapsed = m_timer.elapsed().toIntegerMillis() % kBlinkingPeriodMillis;
const double blinkIntensity = (double)(2 * abs(elapsed - kBlinkingPeriodMillis / 2)) /
kBlinkingPeriodMillis;
const double remainingTime = m_pTimeRemainingControl->get();
const double remainingTimeTriggerSeconds = WaveformWidgetFactory::instance()->getEndOfTrackWarningTime();
const double criticalIntensity = (remainingTimeTriggerSeconds - remainingTime) /
remainingTimeTriggerSeconds;
PainterScope PainterScope(painter);
painter->resetTransform();
painter->setOpacity(0.5 * blinkIntensity);
painter->setPen(m_pen);
painter->drawRect(1, 1,
m_waveformRenderer->getWidth() - 2, m_waveformRenderer->getHeight() - 2);
painter->setOpacity(0.5 * 0.25 * criticalIntensity * blinkIntensity);
painter->setPen(QPen(Qt::transparent));
painter->setBrush(m_color);
painter->drawRects(m_backRects);
// This is significant slower
//painter->setOpacity(0.5 * criticalIntensity * blinkIntensity);
//painter->fillRect(m_waveformRenderer->getWidth()/2, 1,
// m_waveformRenderer->getWidth() - 2, m_waveformRenderer->getHeight() - 2,
// m_gradient);
}
void WaveformRendererEndOfTrack::generateBackRects() {
m_backRects.resize(4);
for (int i = 0; i < 4; i++) {
if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
m_backRects[i].setTop(m_waveformRenderer->getHeight() / 2 +
i * m_waveformRenderer->getHeight() / 8);
m_backRects[i].setBottom(m_waveformRenderer->getHeight());
m_backRects[i].setLeft(0);
m_backRects[i].setRight(m_waveformRenderer->getWidth());
} else {
m_backRects[i].setTop(0);
m_backRects[i].setBottom(m_waveformRenderer->getHeight());
m_backRects[i].setLeft(m_waveformRenderer->getWidth() / 2 +
i * m_waveformRenderer->getWidth() / 8);
m_backRects[i].setRight(m_waveformRenderer->getWidth());
}
}
// This is significant slower
//m_gradient.setStart(m_waveformRenderer->getWidth() / 2, 0);
//m_gradient.setFinalStop(m_waveformRenderer->getWidth(), 0);
//m_gradient.setColorAt(0, Qt::transparent);
//m_gradient.setColorAt(1, m_color);
}
|