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
120
121
122
123
124
125
126
127
|
#include <QtDebug>
#include "skin/skincontext.h"
#include "waveform/renderers/waveformsignalcolors.h"
#include "widget/wskincolor.h"
#include "waveformmark.h"
namespace {
Qt::Alignment decodeAlignmentFlags(QString alignString, Qt::Alignment defaultFlags) {
QStringList stringFlags = alignString.toLower()
.split('|',
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
Qt::SkipEmptyParts);
#else
QString::SkipEmptyParts);
#endif
Qt::Alignment hflags;
Qt::Alignment vflags;
for (auto stringFlag : stringFlags) {
if (stringFlag == "center") {
hflags |= Qt::AlignHCenter;
vflags |= Qt::AlignVCenter;
} else if (stringFlag == "left") {
hflags |= Qt::AlignLeft;
} else if (stringFlag == "hcenter") {
hflags |= Qt::AlignHCenter;
} else if (stringFlag == "right") {
hflags |= Qt::AlignRight;
} else if (stringFlag == "top") {
vflags |= Qt::AlignTop;
} else if (stringFlag == "vcenter") {
vflags |= Qt::AlignVCenter;
} else if (stringFlag == "bottom") {
vflags |= Qt::AlignBottom;
}
}
if (hflags != Qt::AlignLeft && hflags != Qt::AlignHCenter && hflags != Qt::AlignRight) {
hflags = defaultFlags & Qt::AlignHorizontal_Mask;
}
if (vflags != Qt::AlignTop && vflags != Qt::AlignVCenter && vflags != Qt::AlignBottom) {
vflags = defaultFlags & Qt::AlignVertical_Mask;
}
return hflags | vflags;
}
} // anonymous namespace
WaveformMark::WaveformMark(const QString& group,
const QDomNode& node,
const SkinContext& context,
const WaveformSignalColors& signalColors,
int hotCue)
: m_iHotCue(hotCue) {
QString control;
if (hotCue != Cue::kNoHotCue) {
control = "hotcue_" + QString::number(hotCue + 1) + "_position";
} else {
control = context.selectString(node, "Control");
}
if (!control.isEmpty()) {
m_pPointCos = std::make_unique<ControlProxy>(group, control);
}
QString visibilityControl = context.selectString(node, "VisibilityControl");
if (!visibilityControl.isEmpty()) {
ConfigKey key = ConfigKey::parseCommaSeparated(visibilityControl);
m_pVisibleCos = std::make_unique<ControlProxy>(key);
}
QColor color(context.selectString(node, "Color"));
if (!color.isValid()) {
// As a fallback, grab the color from the parent's AxesColor
color = signalColors.getAxesColor();
qDebug() << "Didn't get mark <Color>, using parent's <AxesColor>:" << color;
} else {
color = WSkinColor::getCorrectColor(color);
}
setBaseColor(color);
m_textColor = context.selectString(node, "TextColor");
if (!m_textColor.isValid()) {
// Read the text color, otherwise use the parent's BgColor.
m_textColor = signalColors.getBgColor();
qDebug() << "Didn't get mark <TextColor>, using parent's <BgColor>:" << m_textColor;
}
QString markAlign = context.selectString(node, "Align");
m_align = decodeAlignmentFlags(markAlign, Qt::AlignBottom | Qt::AlignHCenter);
// Hotcue text is set by the cue's label in the database, not by the skin.
if (hotCue == Cue::kNoHotCue) {
m_text = context.selectString(node, "Text");
}
m_pixmapPath = context.selectString(node, "Pixmap");
if (!m_pixmapPath.isEmpty()) {
m_pixmapPath = context.makeSkinPath(m_pixmapPath);
}
}
void WaveformMark::setBaseColor(QColor baseColor) {
m_image = QImage();
m_fillColor = baseColor;
m_borderColor = Color::chooseContrastColor(baseColor);
m_labelColor = Color::chooseColorByBrightness(baseColor, QColor(255,255,255,255), QColor(0,0,0,255));
};
bool WaveformMark::contains(QPoint point, Qt::Orientation orientation) const {
// Without some padding, the user would only have a single pixel width that
// would count as hovering over the WaveformMark.
float lineHoverPadding = 5.0;
int position;
if (orientation == Qt::Horizontal) {
position = point.x();
} else {
position = point.y();
}
bool lineHovered = m_linePosition >= position - lineHoverPadding &&
m_linePosition <= position + lineHoverPadding;
return m_label.area().contains(point) || lineHovered;
}
|