summaryrefslogtreecommitdiffstats
path: root/src/waveform/renderers
diff options
context:
space:
mode:
Diffstat (limited to 'src/waveform/renderers')
-rw-r--r--src/waveform/renderers/glslwaveformrenderersignal.cpp20
-rw-r--r--src/waveform/renderers/glslwaveformrenderersignal.h17
-rw-r--r--src/waveform/renderers/glvsynctestrenderer.cpp7
-rw-r--r--src/waveform/renderers/glvsynctestrenderer.h12
-rw-r--r--src/waveform/renderers/glwaveformrendererfilteredsignal.cpp10
-rw-r--r--src/waveform/renderers/glwaveformrendererfilteredsignal.h10
-rw-r--r--src/waveform/renderers/glwaveformrendererrgb.cpp10
-rw-r--r--src/waveform/renderers/glwaveformrendererrgb.h8
-rw-r--r--src/waveform/renderers/glwaveformrenderersimplesignal.cpp9
-rw-r--r--src/waveform/renderers/glwaveformrenderersimplesignal.h4
-rw-r--r--src/waveform/renderers/qtvsynctestrenderer.cpp68
-rw-r--r--src/waveform/renderers/qtvsynctestrenderer.h19
-rw-r--r--src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp5
-rw-r--r--src/waveform/renderers/qtwaveformrenderersimplesignal.cpp5
-rw-r--r--src/waveform/renderers/waveformmark.cpp103
-rw-r--r--src/waveform/renderers/waveformmark.h84
-rw-r--r--src/waveform/renderers/waveformmarkproperties.cpp77
-rw-r--r--src/waveform/renderers/waveformmarkproperties.h25
-rw-r--r--src/waveform/renderers/waveformmarkrange.cpp26
-rw-r--r--src/waveform/renderers/waveformmarkrange.h21
-rw-r--r--src/waveform/renderers/waveformmarkset.cpp8
-rw-r--r--src/waveform/renderers/waveformmarkset.h7
-rw-r--r--src/waveform/renderers/waveformrenderbeat.cpp6
-rw-r--r--src/waveform/renderers/waveformrendererendoftrack.cpp94
-rw-r--r--src/waveform/renderers/waveformrendererendoftrack.h6
-rw-r--r--src/waveform/renderers/waveformrendererfilteredsignal.cpp6
-rw-r--r--src/waveform/renderers/waveformrendererhsv.cpp6
-rw-r--r--src/waveform/renderers/waveformrendererpreroll.cpp6
-rw-r--r--src/waveform/renderers/waveformrendererrgb.cpp6
-rw-r--r--src/waveform/renderers/waveformrendermark.cpp111
-rw-r--r--src/waveform/renderers/waveformrendermark.h9
-rw-r--r--src/waveform/renderers/waveformrendermarkrange.cpp18
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.cpp10
-rw-r--r--src/waveform/renderers/waveformwidgetrenderer.h8
34 files changed, 467 insertions, 374 deletions
diff --git a/src/waveform/renderers/glslwaveformrenderersignal.cpp b/src/waveform/renderers/glslwaveformrenderersignal.cpp
index bc7ca730b8..6349eaa29f 100644
--- a/src/waveform/renderers/glslwaveformrenderersignal.cpp
+++ b/src/waveform/renderers/glslwaveformrenderersignal.cpp
@@ -15,6 +15,7 @@ GLSLWaveformRendererSignal::GLSLWaveformRendererSignal(WaveformWidgetRenderer* w
m_bDumpPng(false),
m_shadersValid(false),
m_rgbShader(rgbShader) {
+ initializeOpenGLFunctions();
}
GLSLWaveformRendererSignal::~GLSLWaveformRendererSignal() {
@@ -138,8 +139,6 @@ void GLSLWaveformRendererSignal::createGeometry() {
return;
}
-#ifndef __OPENGLES__
-
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -10.0, 10.0);
@@ -167,7 +166,6 @@ void GLSLWaveformRendererSignal::createGeometry() {
}
glEndList();
-#endif
}
void GLSLWaveformRendererSignal::createFrameBuffers() {
@@ -210,8 +208,10 @@ void GLSLWaveformRendererSignal::onSetup(const QDomNode& node) {
void GLSLWaveformRendererSignal::onSetTrack() {
if (m_loadedTrack) {
- disconnect(m_loadedTrack.get(), SIGNAL(waveformUpdated()),
- this, SLOT(slotWaveformUpdated()));
+ disconnect(m_loadedTrack.get(),
+ &Track::waveformUpdated,
+ this,
+ &GLSLWaveformRendererSignal::slotWaveformUpdated);
}
slotWaveformUpdated();
@@ -224,8 +224,10 @@ void GLSLWaveformRendererSignal::onSetTrack() {
// When the track's waveform has been changed (or cleared), it is necessary
// to update (or delete) the texture containing the waveform which was
// uploaded to GPU. Otherwise, previous waveform will be shown.
- connect(pTrack.get(), SIGNAL(waveformUpdated()),
- this, SLOT(slotWaveformUpdated()));
+ connect(pTrack.get(),
+ &Track::waveformUpdated,
+ this,
+ &GLSLWaveformRendererSignal::slotWaveformUpdated);
m_loadedTrack = pTrack;
}
@@ -290,8 +292,6 @@ void GLSLWaveformRendererSignal::draw(QPainter* painter, QPaintEvent* /*event*/)
//qDebug() << "GAIN" << allGain << lowGain << midGain << highGain;
-#ifndef __OPENGLES__
-
//paint into frame buffer
{
glMatrixMode(GL_PROJECTION);
@@ -446,7 +446,5 @@ void GLSLWaveformRendererSignal::draw(QPainter* painter, QPaintEvent* /*event*/)
glMatrixMode(GL_PROJECTION);
glPopMatrix();
-#endif
-
painter->endNativePainting();
}
diff --git a/src/waveform/renderers/glslwaveformrenderersignal.h b/src/waveform/renderers/glslwaveformrenderersignal.h
index 8e8887afb7..95c9b81cdb 100644
--- a/src/waveform/renderers/glslwaveformrenderersignal.h
+++ b/src/waveform/renderers/glslwaveformrenderersignal.h
@@ -4,12 +4,15 @@
#include <QGLFramebufferObject>
#include <QGLShaderProgram>
#include <QtOpenGL>
+#include <QOpenGLFunctions_2_1>
#include "track/track.h"
#include "util/memory.h"
#include "waveform/renderers/waveformrenderersignalbase.h"
-class GLSLWaveformRendererSignal : public QObject, public WaveformRendererSignalBase {
+class GLSLWaveformRendererSignal: public QObject,
+ public WaveformRendererSignalBase,
+ protected QOpenGLFunctions_2_1 {
Q_OBJECT
public:
GLSLWaveformRendererSignal(WaveformWidgetRenderer* waveformWidgetRenderer,
@@ -51,12 +54,14 @@ class GLSLWaveformRendererSignal : public QObject, public WaveformRendererSignal
std::unique_ptr<QGLShaderProgram> m_frameShaderProgram;
};
-class GLSLWaveformRendererFilteredSignal : public GLSLWaveformRendererSignal {
- public:
+class GLSLWaveformRendererFilteredSignal: public GLSLWaveformRendererSignal {
+public:
GLSLWaveformRendererFilteredSignal(
- WaveformWidgetRenderer* waveformWidgetRenderer)
- : GLSLWaveformRendererSignal(waveformWidgetRenderer, false) {}
- ~GLSLWaveformRendererFilteredSignal() override {}
+ WaveformWidgetRenderer* waveformWidgetRenderer) :
+ GLSLWaveformRendererSignal(waveformWidgetRenderer, false) {
+ }
+ ~GLSLWaveformRendererFilteredSignal() override {
+ }
};
class GLSLWaveformRendererRGBSignal : public GLSLWaveformRendererSignal {
diff --git a/src/waveform/renderers/glvsynctestrenderer.cpp b/src/waveform/renderers/glvsynctestrenderer.cpp
index 8872097195..9dce60906f 100644
--- a/src/waveform/renderers/glvsynctestrenderer.cpp
+++ b/src/waveform/renderers/glvsynctestrenderer.cpp
@@ -1,5 +1,3 @@
-#include <qgl.h>
-
#include "waveform/renderers/glvsynctestrenderer.h"
#include "waveform/renderers/waveformwidgetrenderer.h"
@@ -11,6 +9,7 @@ GLVSyncTestRenderer::GLVSyncTestRenderer(
WaveformWidgetRenderer* waveformWidgetRenderer)
: WaveformRendererSignalBase(waveformWidgetRenderer),
m_drawcount(0) {
+ initializeOpenGLFunctions();
}
GLVSyncTestRenderer::~GLVSyncTestRenderer() {
@@ -72,8 +71,6 @@ void GLVSyncTestRenderer::draw(QPainter* painter, QPaintEvent* /*event*/) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-#ifndef __OPENGLES__
-
//t7 = timer.restart(); // 5,770 ns
glMatrixMode(GL_PROJECTION);
@@ -119,8 +116,6 @@ void GLVSyncTestRenderer::draw(QPainter* painter, QPaintEvent* /*event*/) {
glMatrixMode(GL_PROJECTION);
glPopMatrix();
-#endif
-
//t12 = timer.restart(); // 22,426 ns
painter->endNativePainting();
diff --git a/src/waveform/renderers/glvsynctestrenderer.h b/src/waveform/renderers/glvsynctestrenderer.h
index 6790b8ebc1..0cb7f24387 100644
--- a/src/waveform/renderers/glvsynctestrenderer.h
+++ b/src/waveform/renderers/glvsynctestrenderer.h
@@ -1,18 +1,22 @@
#ifndef GLVSYNCTESTRENDERER_H
#define GLVSYNCTESTRENDERER_H
+#include <QOpenGLFunctions_2_1>
+
#include "waveformrenderersignalbase.h"
class ControlObject;
-class GLVSyncTestRenderer : public WaveformRendererSignalBase {
- public:
- explicit GLVSyncTestRenderer(WaveformWidgetRenderer* waveformWidgetRenderer);
+class GLVSyncTestRenderer: public WaveformRendererSignalBase,
+ protected QOpenGLFunctions_2_1 {
+public:
+ explicit GLVSyncTestRenderer(
+ WaveformWidgetRenderer* waveformWidgetRenderer);
virtual ~GLVSyncTestRenderer();
virtual void onSetup(const QDomNode &node);
virtual void draw(QPainter* painter, QPaintEvent* event);
- private:
+private:
int m_drawcount;
};
diff --git a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
index 2788bff1c5..65c13e9499 100644
--- a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
+++ b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
@@ -7,12 +7,10 @@
#include <QDomNode>
-#include <qgl.h>
-
GLWaveformRendererFilteredSignal::GLWaveformRendererFilteredSignal(
WaveformWidgetRenderer* waveformWidgetRenderer)
- : WaveformRendererSignalBase(waveformWidgetRenderer) {
-
+ : WaveformRendererSignalBase(waveformWidgetRenderer) {
+ initializeOpenGLFunctions();
}
GLWaveformRendererFilteredSignal::~GLWaveformRendererFilteredSignal() {
@@ -65,8 +63,6 @@ void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0);
getGains(&allGain, &lowGain, &midGain, &highGain);
-#ifndef __OPENGLES__
-
if (m_alignment == Qt::AlignCenter) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -225,7 +221,5 @@ void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
glMatrixMode(GL_PROJECTION);
glPopMatrix();
-#endif
-
painter->endNativePainting();
}
diff --git a/src/waveform/renderers/glwaveformrendererfilteredsignal.h b/src/waveform/renderers/glwaveformrendererfilteredsignal.h
index 9c27fec8e5..71fac48f15 100644
--- a/src/waveform/renderers/glwaveformrendererfilteredsignal.h
+++ b/src/waveform/renderers/glwaveformrendererfilteredsignal.h
@@ -1,13 +1,17 @@
#ifndef GLWAVEFROMRENDERERFILTEREDSIGNAL_H
#define GLWAVEFROMRENDERERFILTEREDSIGNAL_H
+#include <QOpenGLFunctions_2_1>
+
#include "waveformrenderersignalbase.h"
class ControlObject;
-class GLWaveformRendererFilteredSignal : public WaveformRendererSignalBase {
- public:
- explicit GLWaveformRendererFilteredSignal(WaveformWidgetRenderer* waveformWidgetRenderer);
+class GLWaveformRendererFilteredSignal: public WaveformRendererSignalBase,
+ protected QOpenGLFunctions_2_1 {
+public:
+ explicit GLWaveformRendererFilteredSignal(
+ WaveformWidgetRenderer* waveformWidgetRenderer);
virtual ~GLWaveformRendererFilteredSignal();
virtual void onSetup(const QDomNode &node);
diff --git a/src/waveform/renderers/glwaveformrendererrgb.cpp b/src/waveform/renderers/glwaveformrendererrgb.cpp
index 7a9293672f..cf70ec4077 100644
--- a/src/waveform/renderers/glwaveformrendererrgb.cpp
+++ b/src/waveform/renderers/glwaveformrendererrgb.cpp
@@ -1,5 +1,3 @@
-#include <qgl.h>
-
#include "glwaveformrendererrgb.h"
#include "waveformwidgetrenderer.h"
#include "waveform/waveform.h"
@@ -10,8 +8,8 @@
GLWaveformRendererRGB::GLWaveformRendererRGB(
WaveformWidgetRenderer* waveformWidgetRenderer)
- : WaveformRendererSignalBase(waveformWidgetRenderer) {
-
+ : WaveformRendererSignalBase(waveformWidgetRenderer) {
+ initializeOpenGLFunctions();
}
GLWaveformRendererRGB::~GLWaveformRendererRGB() {
@@ -63,8 +61,6 @@ void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) {
const float kHeightScaleFactor = 255.0 / sqrtf(255 * 255 * 3);
-#ifndef __OPENGLES__
-
if (m_alignment == Qt::AlignCenter) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -194,7 +190,5 @@ void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) {
glMatrixMode(GL_PROJECTION);
glPopMatrix();
-#endif
-
painter->endNativePainting();
}
diff --git a/src/waveform/renderers/glwaveformrendererrgb.h b/src/waveform/renderers/glwaveformrendererrgb.h
index ec6184871f..95c7ef857d 100644
--- a/src/waveform/renderers/glwaveformrendererrgb.h
+++ b/src/waveform/renderers/glwaveformrendererrgb.h
@@ -1,13 +1,17 @@
#ifndef GLWAVEFORMRENDERERRGB_H
#define GLWAVEFORMRENDERERRGB_H
+#include <QOpenGLFunctions_2_1>
+
#include "waveformrenderersignalbase.h"
class ControlObject;
-class GLWaveformRendererRGB : public WaveformRendererSignalBase {
+class GLWaveformRendererRGB: public WaveformRendererSignalBase,
+ protected QOpenGLFunctions_2_1 {
public:
- explicit GLWaveformRendererRGB(WaveformWidgetRenderer* waveformWidgetRenderer);
+ explicit GLWaveformRendererRGB(
+ WaveformWidgetRenderer* waveformWidgetRenderer);
virtual ~GLWaveformRendererRGB();
virtual void onSetup(const QDomNode& node);
diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
index 4ac046a589..e57673cf9a 100644
--- a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
+++ b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
@@ -6,12 +6,11 @@
#include "waveform/waveformwidgetfactory.h"
#include "util/math.h"
-#include <qgl.h>
GLWaveformRendererSimpleSignal::GLWaveformRendererSimpleSignal(
WaveformWidgetRenderer* waveformWidgetRenderer)
- : WaveformRendererSignalBase(waveformWidgetRenderer) {
-
+ : WaveformRendererSignalBase(waveformWidgetRenderer) {
+ initializeOpenGLFunctions();
}
GLWaveformRendererSimpleSignal::~GLWaveformRendererSimpleSignal() {
@@ -60,8 +59,6 @@ void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
// Reset device for native painting
painter->beginNativePainting();
-#ifndef __OPENGLES__
-
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -159,7 +156,5 @@ void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
glMatrixMode(GL_PROJECTION);
glPopMatrix();
-#endif
-
painter->endNativePainting();
}
diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.h b/src/waveform/renderers/glwaveformrenderersimplesignal.h
index 78c6cec64e..5cb1068cec 100644
--- a/src/waveform/renderers/glwaveformrenderersimplesignal.h
+++ b/src/waveform/renderers/glwaveformrenderersimplesignal.h
@@ -1,11 +1,13 @@
#ifndef GLWAVEFORMRENDERERSIMPLESIGNAL_H
#define GLWAVEFORMRENDERERSIMPLESIGNAL_H
+#include <QOpenGLFunctions_2_1>
+
#include "waveformrenderersignalbase.h"
class ControlObject;
-class GLWaveformRendererSimpleSignal : public WaveformRendererSignalBase {
+class GLWaveformRendererSimpleSignal : public WaveformRendererSignalBase, protected QOpenGLFunctions_2_1 {
public:
explicit GLWaveformRendererSimpleSignal(WaveformWidgetRenderer* waveformWidgetRenderer);
virtual ~GLWaveformRendererSimpleSignal();
diff --git a/src/waveform/renderers/qtvsynctestrenderer.cpp b/src/waveform/renderers/qtvsynctestrenderer.cpp
new file mode 100644
index 0000000000..8357703613
--- /dev/null
+++ b/src/waveform/renderers/qtvsynctestrenderer.cpp
@@ -0,0 +1,68 @@
+#include "waveform/renderers/qtvsynctestrenderer.h"
+
+#include "waveform/renderers/waveformwidgetrenderer.h"
+#include "waveform/waveform.h"
+#include "waveform/waveformwidgetfactory.h"
+#include "util/painterscope.h"
+#include "util/performancetimer.h"
+
+QtVSyncTestRenderer::QtVSyncTestRenderer(
+ WaveformWidgetRenderer* waveformWidgetRenderer)
+ : WaveformRendererSignalBase(waveformWidgetRenderer),
+ m_drawcount(0) {
+}
+
+QtVSyncTestRenderer::~QtVSyncTestRenderer() {
+}
+
+void QtVSyncTestRenderer::onSetup(const QDomNode& node) {
+ Q_UNUSED(node);
+}
+
+inline void setPoint(QPointF& point, qreal x, qreal y) {
+ point.setX(x);
+ point.setY(y);
+}
+
+void QtVSyncTestRenderer::draw(QPainter* pPainter, QPaintEvent* /*event*/) {
+
+ PerformanceTimer timer;
+ //mixxx::Duration t5, t6, t7, t8, t9, t10, t11, t12, t13;
+
+
+ timer.start();
+
+ TrackPointer pTrack = m_waveformRenderer->getTrackInfo();
+ if (!pTrack) {
+ return;
+ }
+
+ ConstWaveformPointer waveform = pTrack->getWaveform();
+ if (waveform.isNull()) {
+ return;
+ }
+
+ const int dataSize = waveform->getDataSize();
+ if (dataSize <= 1) {
+ return;
+ }
+
+ const WaveformData* data = waveform->data();
+ if (data == NULL) {
+ return;
+ }
+
+ PainterScope PainterScope(pPainter);
+
+ auto brush = QBrush(Qt::SolidPattern);
+ if (++m_drawcount & 1) {
+ brush.setColor(QColor(255, 255, 255));
+ } else {
+ brush.setColor(QColor(255, 0, 0));
+ }
+
+ pPainter->setBrush(brush);
+
+ pPainter->drawRect(0, 0, m_waveformRenderer->getWidth(),
+ m_waveformRenderer->getHeight());
+}
diff --git a/src/waveform/renderers/qtvsynctestrenderer.h b/src/waveform/renderers/qtvsynctestrenderer.h
new file mode 100644
index 0000000000..99386f5ffb
--- /dev/null
+++ b/src/waveform/renderers/qtvsynctestrenderer.h
@@ -0,0 +1,19 @@
+#ifndef QTVSYNCTESTRENDERER_H
+#define QTVSYNCTESTRENDERER_H
+
+#include "waveformrenderersignalbase.h"
+
+class ControlObject;
+
+class QtVSyncTestRenderer : public WaveformRendererSignalBase {
+ public:
+ explicit QtVSyncTestRenderer(WaveformWidgetRenderer* waveformWidgetRenderer);
+ virtual ~QtVSyncTestRenderer();
+
+ virtual void onSetup(const QDomNode &node);
+ virtual void draw(QPainter* painter, QPaintEvent* event);
+ private:
+ int m_drawcount;
+};
+
+#endif // QTVSYNCTESTRENDERER_H
diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
index bcd5dc2191..2552db3979 100644
--- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
+++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
@@ -6,6 +6,7 @@
#include "control/controlproxy.h"
#include "track/track.h"
#include "util/math.h"
+#include "util/painterscope.h"
#include <QLineF>
#include <QLinearGradient>
@@ -275,7 +276,7 @@ void QtWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
if (!pTrack)
return;
- painter->save();
+ PainterScope PainterScope(painter);
painter->setRenderHint(QPainter::Antialiasing);
painter->resetTransform();
@@ -335,6 +336,4 @@ void QtWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
painter->setBrush(m_highBrush);
}
painter->drawPolygon(&m_polygon[2][0], numberOfPoints);
-
- painter->restore();
}
diff --git a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
index b15f460c9f..0669422b84 100644
--- a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
+++ b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
@@ -7,6 +7,7 @@
#include "widget/wwidget.h"
#include "track/track.h"
#include "util/math.h"
+#include "util/painterscope.h"
#include <QLinearGradient>
@@ -58,7 +59,7 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
return;
}
- painter->save();
+ PainterScope PainterScope(painter);
painter->setRenderHint(QPainter::Antialiasing);
painter->resetTransform();
@@ -214,8 +215,6 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
painter->setBrush(m_brush);
painter->drawPolygon(&m_polygon[0], m_polygon.size());
-
- painter->restore();
}
void QtWaveformRendererSimpleSignal::onResize() {
diff --git a/src/waveform/renderers/waveformmark.cpp b/src/waveform/renderers/waveformmark.cpp
index 220b5b2e47..0f2db81ada 100644
--- a/src/waveform/renderers/waveformmark.cpp
+++ b/src/waveform/renderers/waveformmark.cpp
@@ -1,24 +1,49 @@
#include <QtDebug>
#include "skin/skincontext.h"
-#include "waveform/renderers/waveformmarkproperties.h"
+#include "waveform/renderers/waveformsignalcolors.h"
+#include "widget/wskincolor.h"
#include "waveformmark.h"
-WaveformMark::WaveformMark(const QString& group,
- const QDomNode& node,
- const SkinContext& context,
- const WaveformSignalColors& signalColors)
- : m_iHotCue(kNoHotCue) {
- QString item = context.selectString(node, "Control");
- if (!item.isEmpty()) {
- m_pPointCos = std::make_unique<ControlProxy>(group, item);
- if (item.startsWith("hotcue_") && item.endsWith("_position")) {
- m_iHotCue = item.mid(7, item.count() - 16).toInt() - 1;
+namespace {
+Qt::Alignment decodeAlignmentFlags(QString alignString, Qt::Alignment defaultFlags) {
+ QStringList stringFlags = alignString.toLower()
+ .split("|", QString::SkipEmptyParts);
+
+ Qt::Alignment hflags = 0L;
+ Qt::Alignment vflags = 0L;
+
+ 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;
}
}
- m_properties = WaveformMarkProperties(node, context, signalColors, m_iHotCue);
+
+ 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,
@@ -26,15 +51,55 @@ WaveformMark::WaveformMark(const QString& group,
const WaveformSignalColors& signalColors,
int hotCue)
: m_iHotCue(hotCue) {
- if (hotCue >= 0) {
- QString item = "hotcue_" + QString::number(hotCue + 1) + "_position";
- m_pPointCos = std::make_unique<ControlProxy>(group, item);
+ QString control;
+ if (hotCue != kNoHotCue) {
+ control = "hotcue_" + QString::number(hotCue + 1) + "_position";
+ } else {
+ control = context.selectString(node, "Control");
}
- m_properties = WaveformMarkProperties(node, context, signalColors, hotCue);
-}
+ 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);
-void WaveformMark::connectSamplePositionChanged(const QObject *obj, const char *slt) const {
- m_pPointCos->connectValueChanged(obj, slt, Qt::AutoConnection);
+ // Hotcue text is set by the cue's label in the database, not by the skin.
+ if (hotCue == WaveformMark::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_fillColor = baseColor;
+ m_borderColor = Color::chooseContrastColor(baseColor);
+ m_labelColor = Color::chooseColorByBrightness(baseColor, QColor(255,255,255,255), QColor(0,0,0,255));
+};
diff --git a/src/waveform/renderers/waveformmark.h b/src/waveform/renderers/waveformmark.h
index 76f99d7d05..ab11862df1 100644
--- a/src/waveform/renderers/waveformmark.h
+++ b/src/waveform/renderers/waveformmark.h
@@ -4,10 +4,10 @@
#include <QDomNode>
#include <QImage>
+#include "waveform/waveformmarklabel.h"
#include "control/controlproxy.h"
#include "util/memory.h"
-#include "waveform/renderers/waveformmarkproperties.h"
#include "control/controlobject.h"
class SkinContext;
@@ -22,44 +22,92 @@ class WaveformMark {
const QString& group,
const QDomNode& node,
const SkinContext& context,
- const WaveformSignalColors& signalColors);
-
- WaveformMark(
- const QString& group,
- const QDomNode& node,
- const SkinContext& context,
const WaveformSignalColors& signalColors,
- int hotCue);
-
+ int hotCue = kNoHotCue);
// Disable copying
WaveformMark(const WaveformMark&) = delete;
WaveformMark& operator=(const WaveformMark&) = delete;
- const WaveformMarkProperties& getProperties() const {