diff --git a/res/skins/Deere/deck_overview_row.xml b/res/skins/Deere/deck_overview_row.xml
index 05157876ea40..d84db544e67e 100644
--- a/res/skins/Deere/deck_overview_row.xml
+++ b/res/skins/Deere/deck_overview_row.xml
@@ -27,7 +27,7 @@
#00FF00
- bottom
+ bottom|right
#00FF00
#FFFFFF
%1
@@ -41,7 +41,7 @@
cue_point
- top
+ top|right
#FF001C
#FFFFFF
C
diff --git a/res/skins/LateNight/deck_row_5.xml b/res/skins/LateNight/deck_row_5.xml
index ee199ec85233..07d57ed4bf00 100644
--- a/res/skins/LateNight/deck_row_5.xml
+++ b/res/skins/LateNight/deck_row_5.xml
@@ -22,7 +22,7 @@
#00FF00
#EA0000
- bottom
+ bottom|right
#00FF00
#FFFFFF
%1
@@ -37,7 +37,7 @@
cue_point
C
- top
+ top|right
#FF001C
#FFFFFF
diff --git a/res/skins/Shade/deck.xml b/res/skins/Shade/deck.xml
index 974a77d53963..21c535e4850f 100644
--- a/res/skins/Shade/deck.xml
+++ b/res/skins/Shade/deck.xml
@@ -223,7 +223,7 @@
#00FF00
#EA0000
- bottom
+ bottom|right
#FD0564
#FFFFFF
%1
@@ -238,7 +238,7 @@
cue_point
C
- top
+ top|right
#FF001C
#FFFFFF
diff --git a/src/waveform/renderers/glslwaveformrenderersignal.cpp b/src/waveform/renderers/glslwaveformrenderersignal.cpp
index 0fd058b4ce26..88cadbde7d7f 100644
--- a/src/waveform/renderers/glslwaveformrenderersignal.cpp
+++ b/src/waveform/renderers/glslwaveformrenderersignal.cpp
@@ -285,6 +285,10 @@ void GLSLWaveformRendererSignal::draw(QPainter* painter, QPaintEvent* /*event*/)
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
glOrtho(firstVisualIndex, lastVisualIndex, -1.0, 1.0, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
diff --git a/src/waveform/renderers/glvsynctestrenderer.cpp b/src/waveform/renderers/glvsynctestrenderer.cpp
index 972ea49742d5..887209719571 100644
--- a/src/waveform/renderers/glvsynctestrenderer.cpp
+++ b/src/waveform/renderers/glvsynctestrenderer.cpp
@@ -79,6 +79,10 @@ void GLVSyncTestRenderer::draw(QPainter* painter, QPaintEvent* /*event*/) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
//t8 = timer.restart(); // 2,611 ns
diff --git a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
index 758654dfd2b2..cac0d987e172 100644
--- a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
+++ b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
@@ -75,6 +75,10 @@ void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
@@ -136,7 +140,11 @@ void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
- if (m_alignment == Qt::AlignBottom)
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
+ if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight)
glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0);
else
glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0);
diff --git a/src/waveform/renderers/glwaveformrendererrgb.cpp b/src/waveform/renderers/glwaveformrendererrgb.cpp
index ac7954c4ce90..397ca86648fe 100644
--- a/src/waveform/renderers/glwaveformrendererrgb.cpp
+++ b/src/waveform/renderers/glwaveformrendererrgb.cpp
@@ -68,6 +68,10 @@ void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
@@ -139,7 +143,11 @@ void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) {
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
- if (m_alignment == Qt::AlignBottom) {
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
+ if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) {
glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0);
} else {
glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0);
diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
index ea93b2a8ecab..35805de2b933 100644
--- a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
+++ b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
@@ -73,6 +73,10 @@ void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
@@ -119,7 +123,11 @@ void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
- if (m_alignment == Qt::AlignBottom)
+ if (m_orientation == Qt::Vertical) {
+ glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ glScalef(-1.0f, 1.0f, 1.0f);
+ }
+ if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight)
glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0);
else
glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0);
diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
index 8e9a193cee90..bcd5dc219100 100644
--- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
+++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
@@ -83,9 +83,9 @@ void QtWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) {
}
void QtWaveformRendererFilteredSignal::onResize() {
- m_polygon[0].resize(2*m_waveformRenderer->getWidth()+2);
- m_polygon[1].resize(2*m_waveformRenderer->getWidth()+2);
- m_polygon[2].resize(2*m_waveformRenderer->getWidth()+2);
+ m_polygon[0].resize(2 * m_waveformRenderer->getLength() + 2);
+ m_polygon[1].resize(2 * m_waveformRenderer->getLength() + 2);
+ m_polygon[2].resize(2 * m_waveformRenderer->getLength() + 2);
}
inline void setPoint(QPointF& point, qreal x, qreal y) {
@@ -123,9 +123,9 @@ int QtWaveformRendererFilteredSignal::buildPolygon() {
m_polygon[1].clear();
m_polygon[2].clear();
- m_polygon[0].reserve(2 * m_waveformRenderer->getWidth() + 2);
- m_polygon[1].reserve(2 * m_waveformRenderer->getWidth() + 2);
- m_polygon[2].reserve(2 * m_waveformRenderer->getWidth() + 2);
+ m_polygon[0].reserve(2 * m_waveformRenderer->getLength() + 2);
+ m_polygon[1].reserve(2 * m_waveformRenderer->getLength() + 2);
+ m_polygon[2].reserve(2 * m_waveformRenderer->getLength() + 2);
QPointF point(0.0, 0.0);
m_polygon[0].append(point);
@@ -136,7 +136,7 @@ int QtWaveformRendererFilteredSignal::buildPolygon() {
// Represents the # of waveform data points per horizontal pixel.
const double gain = (lastVisualIndex - firstVisualIndex) /
- (double)m_waveformRenderer->getWidth();
+ (double)m_waveformRenderer->getLength();
float lowGain(1.0), midGain(1.0), highGain(1.0);
getGains(NULL, &lowGain, &midGain, &highGain);
@@ -149,22 +149,22 @@ int QtWaveformRendererFilteredSignal::buildPolygon() {
for (int channel = 0; channel < channelSeparation; ++channel) {
int startPixel = 0;
- int endPixel = m_waveformRenderer->getWidth() - 1;
+ int endPixel = m_waveformRenderer->getLength() - 1;
int delta = 1;
double direction = 1.0;
- //Reverse display for merged bottom channel
- if (m_alignment == Qt::AlignBottom)
+ // Reverse display for merged bottom/left channel
+ if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignLeft)
direction = -1.0;
if (channel == 1) {
- startPixel = m_waveformRenderer->getWidth() - 1;
+ startPixel = m_waveformRenderer->getLength() - 1;
endPixel = 0;
delta = -1;
direction = -1.0;
// After preparing the first channel, insert the pivot point.
- point = QPointF(m_waveformRenderer->getWidth(), 0.0);
+ point = QPointF(m_waveformRenderer->getLength(), 0.0);
m_polygon[0].append(point);
m_polygon[1].append(point);
m_polygon[2].append(point);
@@ -179,9 +179,9 @@ int QtWaveformRendererFilteredSignal::buildPolygon() {
// back since adding locking, but I'm leaving this so that we can
// get some info about it before crashing. (The crash usually
// corrupts a lot of the stack).
- if (m_polygon[0].size() > 2 * m_waveformRenderer->getWidth() + 2) {
+ if (m_polygon[0].size() > 2 * m_waveformRenderer->getLength() + 2) {
qDebug() << "OUT OF CONTROL"
- << 2 * m_waveformRenderer->getWidth() + 2
+ << 2 * m_waveformRenderer->getLength() + 2
<< dataSize
<< channel << m_polygon[0].size() << x;
}
@@ -261,7 +261,7 @@ int QtWaveformRendererFilteredSignal::buildPolygon() {
//If channel are not displayed separately we need to close the loop properly
if (channelSeparation == 1) {
- point = QPointF(m_waveformRenderer->getWidth(), 0.0);
+ point = QPointF(m_waveformRenderer->getLength(), 0.0);
m_polygon[0].append(point);
m_polygon[1].append(point);
m_polygon[2].append(point);
@@ -280,26 +280,31 @@ void QtWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev
painter->setRenderHint(QPainter::Antialiasing);
painter->resetTransform();
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, -1, 0, m_waveformRenderer->getWidth(), 0));
+ }
+
//visual gain
float allGain(1.0);
getGains(&allGain, NULL, NULL, NULL);
- double heightGain = allGain * (double)m_waveformRenderer->getHeight()/255.0;
- if (m_alignment == Qt::AlignTop) {
+ double heightGain = allGain * (double)m_waveformRenderer->getBreadth() / 255.0;
+ if (m_alignment == Qt::AlignTop || m_alignment == Qt::AlignRight) {
painter->translate(0.0, 0.0);
painter->scale(1.0, heightGain);
- } else if (m_alignment == Qt::AlignBottom) {
- painter->translate(0.0, m_waveformRenderer->getHeight());
+ } else if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignLeft) {
+ painter->translate(0.0, m_waveformRenderer->getBreadth());
painter->scale(1.0, heightGain);
} else {
- painter->translate(0.0, m_waveformRenderer->getHeight()/2.0);
+ painter->translate(0.0, m_waveformRenderer->getBreadth()/2.0);
painter->scale(1.0, 0.5*heightGain);
}
//draw reference line
if (m_alignment == Qt::AlignCenter) {
painter->setPen(m_pColors->getAxesColor());
- painter->drawLine(0,0,m_waveformRenderer->getWidth(),0);
+ painter->drawLine(0, 0, m_waveformRenderer->getLength(), 0);
}
int numberOfPoints = buildPolygon();
diff --git a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
index fa4e1f8c4d42..47f97a55d403 100644
--- a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
+++ b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
@@ -63,38 +63,43 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
painter->setRenderHint(QPainter::Antialiasing);
painter->resetTransform();
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, -1, 0, m_waveformRenderer->getWidth(), 0));
+ }
+
float allGain(1.0);
getGains(&allGain, NULL, NULL, NULL);
- double heightGain = allGain * (double)m_waveformRenderer->getHeight()/255.0;
- if (m_alignment == Qt::AlignTop) {
+ double heightGain = allGain * (double)m_waveformRenderer->getBreadth()/255.0;
+ if (m_alignment == Qt::AlignTop || m_alignment == Qt::AlignRight) {
painter->translate(0.0, 0.0);
painter->scale(1.0, heightGain);
- } else if (m_alignment == Qt::AlignBottom) {
- painter->translate(0.0, m_waveformRenderer->getHeight());
+ } else if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignLeft) {
+ painter->translate(0.0, m_waveformRenderer->getBreadth());
painter->scale(1.0, heightGain);
} else {
- painter->translate(0.0, m_waveformRenderer->getHeight()/2.0);
+ painter->translate(0.0, m_waveformRenderer->getBreadth()/2.0);
painter->scale(1.0, 0.5*heightGain);
}
//draw reference line
if (m_alignment == Qt::AlignCenter) {
painter->setPen(m_pColors->getAxesColor());
- painter->drawLine(0,0,m_waveformRenderer->getWidth(),0);
+ painter->drawLine(0,0,m_waveformRenderer->getLength(),0);
}
const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
m_polygon.clear();
- m_polygon.reserve(2 * m_waveformRenderer->getWidth() + 2);
+ m_polygon.reserve(2 * m_waveformRenderer->getLength() + 2);
m_polygon.append(QPointF(0.0, 0.0));
const double offset = firstVisualIndex;
// Represents the # of waveform data points per horizontal pixel.
const double gain = (lastVisualIndex - firstVisualIndex) /
- (double)m_waveformRenderer->getWidth();
+ (double)m_waveformRenderer->getLength();
//NOTE(vrince) Please help me find a better name for "channelSeparation"
//this variable stand for merged channel ... 1 = merged & 2 = separated
@@ -104,22 +109,22 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
for (int channel = 0; channel < channelSeparation; ++channel) {
int startPixel = 0;
- int endPixel = m_waveformRenderer->getWidth() - 1;
+ int endPixel = m_waveformRenderer->getLength() - 1;
int delta = 1;
double direction = 1.0;
- //Reverse display for merged bottom channel
- if (m_alignment == Qt::AlignBottom)
+ // Reverse display for merged bottom/left channel
+ if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignLeft)
direction = -1.0;
if (channel == 1) {
- startPixel = m_waveformRenderer->getWidth() - 1;
+ startPixel = m_waveformRenderer->getLength() - 1;
endPixel = 0;
delta = -1;
direction = -1.0;
// After preparing the first channel, insert the pivot point.
- m_polygon.append(QPointF(m_waveformRenderer->getWidth(), 0.0));
+ m_polygon.append(QPointF(m_waveformRenderer->getLength(), 0.0));
}
for (int x = startPixel;
@@ -131,9 +136,9 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
// back since adding locking, but I'm leaving this so that we can
// get some info about it before crashing. (The crash usually
// corrupts a lot of the stack).
- if (m_polygon.size() > 2 * m_waveformRenderer->getWidth() + 2) {
+ if (m_polygon.size() > 2 * m_waveformRenderer->getLength() + 2) {
qDebug() << "OUT OF CONTROL"
- << 2 * m_waveformRenderer->getWidth() + 2
+ << 2 * m_waveformRenderer->getLength() + 2
<< dataSize
<< channel << m_polygon.size() << x;
}
@@ -176,7 +181,7 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
int visualIndexStart = visualFrameStart * 2 + channel;
int visualIndexStop = visualFrameStop * 2 + channel;
- // if (x == m_waveformRenderer->getWidth() / 2) {
+ // if (x == m_waveformRenderer->getLength() / 2) {
// qDebug() << "audioVisualRatio" << waveform->getAudioVisualRatio();
// qDebug() << "visualSampleRate" << waveform->getVisualSampleRate();
// qDebug() << "audioSamplesPerVisualPixel" << waveform->getAudioSamplesPerVisualSample();
@@ -202,7 +207,7 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
//If channel are not displayed separatly we nne to close the loop properly
if (channelSeparation == 1) {
- m_polygon.append(QPointF(m_waveformRenderer->getWidth(), 0.0));
+ m_polygon.append(QPointF(m_waveformRenderer->getLength(), 0.0));
}
painter->setPen(m_borderPen);
@@ -214,5 +219,5 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even
}
void QtWaveformRendererSimpleSignal::onResize() {
- m_polygon.resize(2*m_waveformRenderer->getWidth()+2);
+ m_polygon.resize(2*m_waveformRenderer->getLength()+2);
}
diff --git a/src/waveform/renderers/waveformmarkproperties.cpp b/src/waveform/renderers/waveformmarkproperties.cpp
index 4c05a5dfd9e2..a843a8b2a99d 100644
--- a/src/waveform/renderers/waveformmarkproperties.cpp
+++ b/src/waveform/renderers/waveformmarkproperties.cpp
@@ -4,6 +4,43 @@
#include "waveform/renderers/waveformmarkproperties.h"
+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;
+ }
+ }
+
+ 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;
+}
+
WaveformMarkProperties::WaveformMarkProperties(const QDomNode& node,
const SkinContext& context,
const WaveformSignalColors& signalColors) {
@@ -24,11 +61,7 @@ WaveformMarkProperties::WaveformMarkProperties(const QDomNode& node,
}
QString markAlign = context.selectString(node, "Align");
- if (markAlign.contains("bottom", Qt::CaseInsensitive)) {
- m_align = Qt::AlignBottom;
- } else {
- m_align = Qt::AlignTop; // Default
- }
+ m_align = decodeAlignmentFlags(markAlign, Qt::AlignBottom | Qt::AlignHCenter);
m_text = context.selectString(node, "Text");
m_pixmapPath = context.selectString(node, "Pixmap");
diff --git a/src/waveform/renderers/waveformrenderbeat.cpp b/src/waveform/renderers/waveformrenderbeat.cpp
index 17b9310bc29d..143b6c3533b9 100644
--- a/src/waveform/renderers/waveformrenderbeat.cpp
+++ b/src/waveform/renderers/waveformrenderbeat.cpp
@@ -64,6 +64,8 @@ void WaveformRenderBeat::draw(QPainter* painter, QPaintEvent* /*event*/) {
beatPen.setWidthF(1);
painter->setPen(beatPen);
+ const Qt::Orientation orientation = m_waveformRenderer->getOrientation();
+ const float rendererWidth = m_waveformRenderer->getWidth();
const float rendererHeight = m_waveformRenderer->getHeight();
int beatCount = 0;
@@ -79,7 +81,11 @@ void WaveformRenderBeat::draw(QPainter* painter, QPaintEvent* /*event*/) {
m_beats.resize(m_beats.size() * 2);
}
- m_beats[beatCount++].setLine(xBeatPoint, 0.0f, xBeatPoint, rendererHeight);
+ if (orientation == Qt::Horizontal) {
+ m_beats[beatCount++].setLine(xBeatPoint, 0.0f, xBeatPoint, rendererHeight);
+ } else {
+ m_beats[beatCount++].setLine(0.0f, xBeatPoint, rendererWidth, xBeatPoint);
+ }
}
// Make sure to use constData to prevent detaches!
diff --git a/src/waveform/renderers/waveformrendererendoftrack.cpp b/src/waveform/renderers/waveformrendererendoftrack.cpp
index 7504310c63e9..a84bfc70491f 100644
--- a/src/waveform/renderers/waveformrendererendoftrack.cpp
+++ b/src/waveform/renderers/waveformrendererendoftrack.cpp
@@ -58,22 +58,11 @@ void WaveformRendererEndOfTrack::setup(const QDomNode& node, const SkinContext&
m_color = WSkinColor::getCorrectColor(m_color);
}
m_pen = QPen(QBrush(m_color), 2.5);
+ generateBackRects();
}
void WaveformRendererEndOfTrack::onResize() {
- m_backRects.resize(4);
- for (int i = 0; i < 4; i++) {
- 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);
+ generateBackRects();
}
void WaveformRendererEndOfTrack::draw(QPainter* painter,
@@ -152,3 +141,27 @@ void WaveformRendererEndOfTrack::draw(QPainter* painter,
// m_gradient);
painter->restore();
}
+
+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);
+}
diff --git a/src/waveform/renderers/waveformrendererendoftrack.h b/src/waveform/renderers/waveformrendererendoftrack.h
index 745e369316e6..e01ac792e1b0 100644
--- a/src/waveform/renderers/waveformrendererendoftrack.h
+++ b/src/waveform/renderers/waveformrendererendoftrack.h
@@ -27,6 +27,8 @@ class WaveformRendererEndOfTrack : public WaveformRendererAbstract {
virtual void draw(QPainter* painter, QPaintEvent* event);
private:
+ void generateBackRects();
+
ControlProxy* m_pEndOfTrackControl;
bool m_endOfTrackEnabled;
ControlProxy* m_pTrackSampleRate;
diff --git a/src/waveform/renderers/waveformrendererfilteredsignal.cpp b/src/waveform/renderers/waveformrendererfilteredsignal.cpp
index 243983561c55..2952c9e88386 100644
--- a/src/waveform/renderers/waveformrendererfilteredsignal.cpp
+++ b/src/waveform/renderers/waveformrendererfilteredsignal.cpp
@@ -18,9 +18,9 @@ WaveformRendererFilteredSignal::~WaveformRendererFilteredSignal() {
}
void WaveformRendererFilteredSignal::onResize() {
- m_lowLines.resize(m_waveformRenderer->getWidth());
- m_midLines.resize(m_waveformRenderer->getWidth());
- m_highLines.resize(m_waveformRenderer->getWidth());
+ m_lowLines.resize(m_waveformRenderer->getLength());
+ m_midLines.resize(m_waveformRenderer->getLength());
+ m_highLines.resize(m_waveformRenderer->getLength());
}
void WaveformRendererFilteredSignal::onSetup(const QDomNode& node) {
@@ -56,34 +56,40 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter,
painter->setWorldMatrixEnabled(false);
painter->resetTransform();
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, 1, 0, 0, 0));
+ }
+
const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
// Represents the # of waveform data points per horizontal pixel.
const double gain = (lastVisualIndex - firstVisualIndex) /
- (double)m_waveformRenderer->getWidth();
+ (double)m_waveformRenderer->getLength();
// Per-band gain from the EQ knobs.
float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0);
getGains(&allGain, &lowGain, &midGain, &highGain);
- const float halfHeight = (float)m_waveformRenderer->getHeight()/2.0;
+ const float breadth = m_waveformRenderer->getBreadth();
+ const float halfBreadth = breadth / 2.0;
const float heightFactor = m_alignment == Qt::AlignCenter
- ? allGain*halfHeight/255.0
- : allGain*m_waveformRenderer->getHeight()/255.0;
+ ? allGain*halfBreadth/255.0
+ : allGain*m_waveformRenderer->getBreadth()/255.0;
//draw reference line
if (m_alignment == Qt::AlignCenter) {
painter->setPen(m_pColors->getAxesColor());
- painter->drawLine(0,halfHeight,m_waveformRenderer->getWidth(),halfHeight);
+ painter->drawLine(0, halfBreadth, m_waveformRenderer->getLength(), halfBreadth);
}
int actualLowLineNumber = 0;
int actualMidLineNumber = 0;
int actualHighLineNumber = 0;
- for (int x = 0; x < m_waveformRenderer->getWidth(); ++x) {
+ for (int x = 0; x < m_waveformRenderer->getLength(); ++x) {
// Width of the x position in visual indices.
const double xSampleWidth = gain * x;
@@ -120,7 +126,7 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter,
int visualIndexStart = visualFrameStart * 2;
int visualIndexStop = visualFrameStop * 2;
- // if (x == m_waveformRenderer->getWidth() / 2) {
+ // if (x == m_waveformRenderer->getLength() / 2) {
// qDebug() << "audioVisualRatio" << waveform->getAudioVisualRatio();
// qDebug() << "visualSampleRate" << waveform->getVisualSampleRate();
// qDebug() << "audioSamplesPerVisualPixel" << waveform->getAudioSamplesPerVisualSample();
@@ -150,19 +156,21 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter,
if (maxLow[0] && maxLow[1]) {
switch (m_alignment) {
case Qt::AlignBottom :
+ case Qt::AlignRight :
m_lowLines[actualLowLineNumber].setLine(
- x, m_waveformRenderer->getHeight(),
- x, m_waveformRenderer->getHeight() - (int)(heightFactor*lowGain*(float)math_max(maxLow[0],maxLow[1])));
+ x, breadth,
+ x, breadth - (int)(heightFactor*lowGain*(float)math_max(maxLow[0],maxLow[1])));
break;
case Qt::AlignTop :
+ case Qt::AlignLeft :
m_lowLines[actualLowLineNumber].setLine(
x, 0,
x, (int)(heightFactor*lowGain*(float)math_max(maxLow[0],maxLow[1])));
break;
default :
m_lowLines[actualLowLineNumber].setLine(
- x, (int)(halfHeight-heightFactor*(float)maxLow[0]*lowGain),
- x, (int)(halfHeight+heightFactor*(float)maxLow[1]*lowGain));
+ x, (int)(halfBreadth-heightFactor*(float)maxLow[0]*lowGain),
+ x, (int)(halfBreadth+heightFactor*(float)maxLow[1]*lowGain));
break;
}
actualLowLineNumber++;
@@ -170,19 +178,21 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter,
if (maxMid[0] && maxMid[1]) {
switch (m_alignment) {
case Qt::AlignBottom :
+ case Qt::AlignRight :
m_midLines[actualMidLineNumber].setLine(
- x, m_waveformRenderer->getHeight(),
- x, m_waveformRenderer->getHeight() - (int)(heightFactor*midGain*(float)math_max(maxMid[0],maxMid[1])));
+ x, breadth,
+ x, breadth - (int)(heightFactor*midGain*(float)math_max(maxMid[0],maxMid[1])));
break;
case Qt::AlignTop :
+ case Qt::AlignLeft :
m_midLines[actualMidLineNumber].setLine(
x, 0,
x, (int)(heightFactor*midGain*(float)math_max(maxMid[0],maxMid[1])));
break;
default :
m_midLines[actualMidLineNumber].setLine(
- x, (int)(halfHeight-heightFactor*(float)maxMid[0]*midGain),
- x, (int)(halfHeight+heightFactor*(float)maxMid[1]*midGain));
+ x, (int)(halfBreadth-heightFactor*(float)maxMid[0]*midGain),
+ x, (int)(halfBreadth+heightFactor*(float)maxMid[1]*midGain));
break;
}
actualMidLineNumber++;
@@ -190,19 +200,21 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter,
if (maxHigh[0] && maxHigh[1]) {
switch (m_alignment) {
case Qt::AlignBottom :
+ case Qt::AlignRight :
m_highLines[actualHighLineNumber].setLine(
- x, m_waveformRenderer->getHeight(),
- x, m_waveformRenderer->getHeight() - (int)(heightFactor*highGain*(float)math_max(maxHigh[0],maxHigh[1])));
+ x, breadth,
+ x, breadth - (int)(heightFactor*highGain*(float)math_max(maxHigh[0],maxHigh[1])));
break;
case Qt::AlignTop :
+ case Qt::AlignLeft :
m_highLines[actualHighLineNumber].setLine(
x, 0,
x, (int)(heightFactor*highGain*(float)math_max(maxHigh[0],maxHigh[1])));
break;
default :
m_highLines[actualHighLineNumber].setLine(
- x, (int)(halfHeight-heightFactor*(float)maxHigh[0]*highGain),
- x, (int)(halfHeight+heightFactor*(float)maxHigh[1]*highGain));
+ x, (int)(halfBreadth-heightFactor*(float)maxHigh[0]*highGain),
+ x, (int)(halfBreadth+heightFactor*(float)maxHigh[1]*highGain));
break;
}
actualHighLineNumber++;
diff --git a/src/waveform/renderers/waveformrendererhsv.cpp b/src/waveform/renderers/waveformrendererhsv.cpp
index 1ac1279a503e..7589952dcafb 100644
--- a/src/waveform/renderers/waveformrendererhsv.cpp
+++ b/src/waveform/renderers/waveformrendererhsv.cpp
@@ -50,6 +50,11 @@ void WaveformRendererHSV::draw(QPainter* painter,
painter->setWorldMatrixEnabled(false);
painter->resetTransform();
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, 1, 0, 0, 0));
+ }
+
const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
@@ -57,7 +62,7 @@ void WaveformRendererHSV::draw(QPainter* painter,
// Represents the # of waveform data points per horizontal pixel.
const double gain = (lastVisualIndex - firstVisualIndex) /
- (double)m_waveformRenderer->getWidth();
+ (double)m_waveformRenderer->getLength();
float allGain(1.0);
getGains(&allGain, NULL, NULL, NULL);
@@ -73,15 +78,16 @@ void WaveformRendererHSV::draw(QPainter* painter,
QColor color;
float lo, hi, total;
- const float halfHeight = (float)m_waveformRenderer->getHeight()/2.0;
+ const int breadth = m_waveformRenderer->getBreadth();
+ const float halfBreadth = (float)breadth / 2.0;
- const float heightFactor = allGain*halfHeight/255.0;
+ const float heightFactor = allGain * halfBreadth / 255.0;
//draw reference line
painter->setPen(m_pColors->getAxesColor());
- painter->drawLine(0,halfHeight,m_waveformRenderer->getWidth(),halfHeight);
+ painter->drawLine(0, halfBreadth, m_waveformRenderer->getLength(), halfBreadth);
- for (int x = 0; x < m_waveformRenderer->getWidth(); ++x) {
+ for (int x = 0; x < m_waveformRenderer->getLength(); ++x) {
// Width of the x position in visual indices.
const double xSampleWidth = gain * x;
@@ -152,19 +158,21 @@ void WaveformRendererHSV::draw(QPainter* painter,
painter->setPen(color);
switch (m_alignment) {
case Qt::AlignBottom :
+ case Qt::AlignRight :
painter->drawLine(
- x, m_waveformRenderer->getHeight(),
- x, m_waveformRenderer->getHeight() - (int)(heightFactor*(float)math_max(maxAll[0],maxAll[1])));
+ x, breadth,
+ x, breadth - (int)(heightFactor * (float)math_max(maxAll[0],maxAll[1])));
break;
case Qt::AlignTop :
+ case Qt::AlignLeft :
painter->drawLine(
x, 0,
- x, (int)(heightFactor*(float)math_max(maxAll[0],maxAll[1])));
+ x, (int)(heightFactor * (float)math_max(maxAll[0],maxAll[1])));
break;
default :
painter->drawLine(
- x, (int)(halfHeight-heightFactor*(float)maxAll[0]),
- x, (int)(halfHeight+heightFactor*(float)maxAll[1]));
+ x, (int)(halfBreadth - heightFactor * (float)maxAll[0]),
+ x, (int)(halfBreadth + heightFactor * (float)maxAll[1]));
}
}
}
diff --git a/src/waveform/renderers/waveformrendererpreroll.cpp b/src/waveform/renderers/waveformrendererpreroll.cpp
index d45b9769ab5a..ae045523d047 100644
--- a/src/waveform/renderers/waveformrendererpreroll.cpp
+++ b/src/waveform/renderers/waveformrendererpreroll.cpp
@@ -28,8 +28,9 @@ void WaveformRendererPreroll::draw(QPainter* painter, QPaintEvent* event) {
if (!track) {
return;
}
+
double samplesPerPixel = m_waveformRenderer->getVisualSamplePerPixel();
- double numberOfSamples = m_waveformRenderer->getWidth() * samplesPerPixel;
+ double numberOfSamples = m_waveformRenderer->getLength() * samplesPerPixel;
int currentPosition = m_waveformRenderer->getPlayPosVSample();
//qDebug() << "currentPosition" << currentPosition
@@ -40,9 +41,9 @@ void WaveformRendererPreroll::draw(QPainter* painter, QPaintEvent* event) {
// where the pre-roll is located.
if (currentPosition < numberOfSamples / 2.0) {
int index = static_cast(numberOfSamples / 2.0 - currentPosition);
- const int polyWidth = static_cast(40.0 / samplesPerPixel);
- const float halfHeight = m_waveformRenderer->getHeight()/2.0;
- const float halfPolyHeight = m_waveformRenderer->getHeight()/5.0;
+ const int polyLength = static_cast(40.0 / samplesPerPixel);
+ const float halfBreadth = m_waveformRenderer->getBreadth()/2.0;
+ const float halfPolyBreadth = m_waveformRenderer->getBreadth()/5.0;
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
@@ -50,24 +51,31 @@ void WaveformRendererPreroll::draw(QPainter* painter, QPaintEvent* event) {
//painter->setBackgroundMode(Qt::TransparentMode);
painter->setWorldMatrixEnabled(false);
painter->setPen(QPen(QBrush(m_color), 1));
+
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, 1, 0, 0, 0));
+ }
+
QPolygonF polygon;
- polygon << QPointF(0, halfHeight)
- << QPointF(-polyWidth, halfHeight - halfPolyHeight)
- << QPointF(-polyWidth, halfHeight + halfPolyHeight);
+ polygon << QPointF(0, halfBreadth)
+ << QPointF(-polyLength, halfBreadth - halfPolyBreadth)
+ << QPointF(-polyLength, halfBreadth + halfPolyBreadth);
// Draw at most one not or halve visible polygon at the widget borders
- if (index > (numberOfSamples + ((polyWidth + 1) * samplesPerPixel))) {
+ if (index > (numberOfSamples + ((polyLength + 1) * samplesPerPixel))) {
int rest = index - numberOfSamples;
- rest %= (int)((polyWidth + 1) * samplesPerPixel);
+ rest %= (int)((polyLength + 1) * samplesPerPixel);
index = numberOfSamples + rest;
}
polygon.translate(((qreal)index) / samplesPerPixel, 0);
while (index > 0) {
painter->drawPolygon(polygon);
- polygon.translate(-(polyWidth + 1), 0);
- index -= (polyWidth + 1) * samplesPerPixel;
+ polygon.translate(-(polyLength + 1), 0);
+ index -= (polyLength + 1) * samplesPerPixel;
}
+
painter->restore();
}
}
diff --git a/src/waveform/renderers/waveformrendererrgb.cpp b/src/waveform/renderers/waveformrendererrgb.cpp
index be58580d08c4..c7507ef19329 100644
--- a/src/waveform/renderers/waveformrendererrgb.cpp
+++ b/src/waveform/renderers/waveformrendererrgb.cpp
@@ -49,6 +49,11 @@ void WaveformRendererRGB::draw(QPainter* painter,
painter->setWorldMatrixEnabled(false);
painter->resetTransform();
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, 1, 0, 0, 0));
+ }
+
const double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize;
const double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize;
@@ -56,7 +61,7 @@ void WaveformRendererRGB::draw(QPainter* painter,
// Represents the # of waveform data points per horizontal pixel.
const double gain = (lastVisualIndex - firstVisualIndex) /
- (double)m_waveformRenderer->getWidth();
+ (double)m_waveformRenderer->getLength();
// Per-band gain from the EQ knobs.
float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0);
@@ -64,15 +69,16 @@ void WaveformRendererRGB::draw(QPainter* painter,
QColor color;
- const float halfHeight = (float)m_waveformRenderer->getHeight()/2.0;
+ const int breadth = m_waveformRenderer->getBreadth();
+ const float halfBreadth = (float)breadth / 2.0;
- const float heightFactor = allGain*halfHeight/255.0;
+ const float heightFactor = allGain * halfBreadth / 255.0;
// Draw reference line
painter->setPen(m_pColors->getAxesColor());
- painter->drawLine(0,halfHeight,m_waveformRenderer->getWidth(),halfHeight);
+ painter->drawLine(0, halfBreadth, m_waveformRenderer->getLength(), halfBreadth);
- for (int x = 0; x < m_waveformRenderer->getWidth(); ++x) {
+ for (int x = 0; x < m_waveformRenderer->getLength(); ++x) {
// Width of the x position in visual indices.
const double xSampleWidth = gain * x;
@@ -140,19 +146,21 @@ void WaveformRendererRGB::draw(QPainter* painter,
painter->setPen(color);
switch (m_alignment) {
case Qt::AlignBottom :
+ case Qt::AlignRight :
painter->drawLine(
- x, m_waveformRenderer->getHeight(),
- x, m_waveformRenderer->getHeight() - (int)(heightFactor*(float)math_max(maxAllA,maxAllB)));
+ x, breadth,
+ x, breadth - (int)(heightFactor * (float)math_max(maxAllA, maxAllB)));
break;
case Qt::AlignTop :
+ case Qt::AlignLeft :
painter->drawLine(
x, 0,
- x, (int)(heightFactor*(float)math_max(maxAllA,maxAllB)));
+ x, (int)(heightFactor * (float)math_max(maxAllA, maxAllB)));
break;
default :
painter->drawLine(
- x, (int)(halfHeight-heightFactor*(float)maxAllA),
- x, (int)(halfHeight+heightFactor*(float)maxAllB));
+ x, (int)(halfBreadth - heightFactor * (float)maxAllA),
+ x, (int)(halfBreadth + heightFactor * (float)maxAllB));
}
}
}
diff --git a/src/waveform/renderers/waveformrenderersignalbase.cpp b/src/waveform/renderers/waveformrenderersignalbase.cpp
index 2acdc68292ad..f14d7edcec33 100644
--- a/src/waveform/renderers/waveformrenderersignalbase.cpp
+++ b/src/waveform/renderers/waveformrenderersignalbase.cpp
@@ -20,6 +20,7 @@ WaveformRendererSignalBase::WaveformRendererSignalBase(
m_pMidKillControlObject(NULL),
m_pHighKillControlObject(NULL),
m_alignment(Qt::AlignCenter),
+ m_orientation(Qt::Horizontal),
m_pColors(NULL),
m_axesColor_r(0),
m_axesColor_g(0),
@@ -93,13 +94,30 @@ bool WaveformRendererSignalBase::init() {
void WaveformRendererSignalBase::setup(const QDomNode& node,
const SkinContext& context) {
+ QString orientationString = context.selectString(node, "Orientation").toLower();
+ if (orientationString == "vertical") {
+ m_orientation = Qt::Vertical;
+ } else {
+ m_orientation = Qt::Horizontal;
+ }
+
QString alignString = context.selectString(node, "Align").toLower();
- if (alignString == "bottom") {
- m_alignment = Qt::AlignBottom;
- } else if (alignString == "top") {
- m_alignment = Qt::AlignTop;
+ if (m_orientation == Qt::Horizontal) {
+ if (alignString == "bottom") {
+ m_alignment = Qt::AlignBottom;
+ } else if (alignString == "top") {
+ m_alignment = Qt::AlignTop;
+ } else {
+ m_alignment = Qt::AlignCenter;
+ }
} else {
- m_alignment = Qt::AlignCenter;
+ if (alignString == "left") {
+ m_alignment = Qt::AlignLeft;
+ } else if (alignString == "right") {
+ m_alignment = Qt::AlignRight;
+ } else {
+ m_alignment = Qt::AlignCenter;
+ }
}
m_pColors = m_waveformRenderer->getWaveformSignalColors();
diff --git a/src/waveform/renderers/waveformrenderersignalbase.h b/src/waveform/renderers/waveformrenderersignalbase.h
index d6c15a552b98..ab47b753d94e 100644
--- a/src/waveform/renderers/waveformrenderersignalbase.h
+++ b/src/waveform/renderers/waveformrenderersignalbase.h
@@ -35,6 +35,7 @@ class WaveformRendererSignalBase : public WaveformRendererAbstract {
ControlProxy* m_pHighKillControlObject;
Qt::Alignment m_alignment;
+ Qt::Orientation m_orientation;
const WaveformSignalColors* m_pColors;
qreal m_axesColor_r, m_axesColor_g, m_axesColor_b, m_axesColor_a;
diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp
index 79b8d6cc7366..92e30d8a3a66 100644
--- a/src/waveform/renderers/waveformrendermark.cpp
+++ b/src/waveform/renderers/waveformrendermark.cpp
@@ -54,19 +54,35 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) {
if (samplePosition > 0.0) {
double currentMarkPoint = m_waveformRenderer->transformSampleIndexInRendererWorld(samplePosition);
- // NOTE: vRince I guess image width is odd to display the center on the exact line !
- //external image should respect that ...
- const int markHalfWidth = mark->m_image.width() / 2.0;
-
- //check if the current point need to be displayed
- if (currentMarkPoint > -markHalfWidth && currentMarkPoint < m_waveformRenderer->getWidth() + markHalfWidth) {
- painter->drawImage(QPoint(currentMarkPoint-markHalfWidth,0), mark->m_image);
+ if (m_waveformRenderer->getOrientation() == Qt::Horizontal) {
+ // NOTE: vRince I guess image width is odd to display the center on the exact line !
+ // external image should respect that ...
+ const int markHalfWidth = mark->m_image.width() / 2.0;
+
+ // Check if the current point need to be displayed
+ if (currentMarkPoint > -markHalfWidth && currentMarkPoint < m_waveformRenderer->getWidth() + markHalfWidth) {
+ painter->drawImage(QPoint(currentMarkPoint - markHalfWidth,0), mark->m_image);
+ }
+ } else {
+ const int markHalfHeight = mark->m_image.height() / 2.0;
+
+ if (currentMarkPoint > -markHalfHeight && currentMarkPoint < m_waveformRenderer->getHeight() + markHalfHeight) {
+ painter->drawImage(QPoint(0,currentMarkPoint - markHalfHeight), mark->m_image);
+ }
}
}
}
+
painter->restore();
}
+void WaveformRenderMark::onResize() {
+ // Delete all marks' images. New images will be created on next paint.
+ for (int i = 0; i < m_marks.size(); i++) {
+ m_marks[i]->m_image = QImage();
+ }
+}
+
void WaveformRenderMark::onSetTrack() {
slotCuesUpdated();
@@ -126,9 +142,6 @@ void WaveformRenderMark::generateMarkImage(WaveformMark* pMark) {
QPainter painter;
- int labelRectWidth = 0;
- int labelRectHeight = 0;
-
// If no text is provided, leave m_markImage as a null image
if (!markProperties.m_text.isNull()) {
// Determine mark text.
@@ -158,21 +171,42 @@ void WaveformRenderMark::generateMarkImage(WaveformMark* pMark) {
const int marginY = 1;
wordRect.moveTop(marginX + 1);
wordRect.moveLeft(marginY + 1);
+ wordRect.setHeight(wordRect.height() + (wordRect.height()%2));
wordRect.setWidth(wordRect.width() + (wordRect.width())%2);
//even wordrect to have an even Image >> draw the line in the middle !
- labelRectWidth = wordRect.width() + 2*marginX + 4;
- labelRectHeight = wordRect.height() + 2*marginY + 4 ;
+ int labelRectWidth = wordRect.width() + 2 * marginX + 4;
+ int labelRectHeight = wordRect.height() + 2 * marginY + 4 ;
QRectF labelRect(0, 0,
(float)labelRectWidth, (float)labelRectHeight);
- pMark->m_image = QImage(labelRectWidth+1,
- m_waveformRenderer->getHeight(),
- QImage::Format_ARGB32_Premultiplied);
+ int width;
+ int height;
+
+ if (m_waveformRenderer->getOrientation() == Qt::Horizontal) {
+ width = 2 * labelRectWidth + 1;
+ height = m_waveformRenderer->getHeight();
+ } else {
+ width = m_waveformRenderer->getWidth();
+ height = 2 * labelRectHeight + 1;
+ }
+
+ pMark->m_image = QImage(width, height, QImage::Format_ARGB32_Premultiplied);
+
+ Qt::Alignment markAlignH = markProperties.m_align & Qt::AlignHorizontal_Mask;
+ Qt::Alignment markAlignV = markProperties.m_align & Qt::AlignVertical_Mask;
- if (markProperties.m_align == Qt::AlignBottom) {
- labelRect.moveBottom(pMark->m_image.height()-1);
+ if (markAlignH == Qt::AlignHCenter) {
+ labelRect.moveLeft((width - labelRectWidth) / 2);
+ } else if (markAlignH == Qt::AlignRight) {
+ labelRect.moveRight(width - 1);
+ }
+
+ if (markAlignV == Qt::AlignVCenter) {
+ labelRect.moveTop((height - labelRectHeight) / 2);
+ } else if (markAlignV == Qt::AlignBottom) {
+ labelRect.moveBottom(height - 1);
}
// Fill with transparent pixels
@@ -183,49 +217,100 @@ void WaveformRenderMark::generateMarkImage(WaveformMark* pMark) {
painter.setWorldMatrixEnabled(false);
- //draw the label rect
+ // Prepare colors for drawing of marker lines
+ QColor lineColor = markProperties.m_color;
+ lineColor.setAlpha(200);
+ QColor contrastLineColor(0,0,0,120);
+
+ // Draw marker lines
+ if (m_waveformRenderer->getOrientation() == Qt::Horizontal) {
+ int middle = width / 2;
+ if (markAlignH == Qt::AlignHCenter) {
+ if (labelRect.top() > 0) {
+ painter.setPen(lineColor);
+ painter.drawLine(middle, 0, middle, labelRect.top());
+
+ painter.setPen(contrastLineColor);
+ painter.drawLine(middle - 1, 0, middle - 1, labelRect.top());
+ painter.drawLine(middle + 1, 0, middle + 1, labelRect.top());
+ }
+
+ if (labelRect.bottom() < height) {
+ painter.setPen(lineColor);
+ painter.drawLine(middle, labelRect.bottom(), middle, height);
+
+ painter.setPen(contrastLineColor);
+ painter.drawLine(middle - 1, labelRect.bottom(), middle - 1, height);
+ painter.drawLine(middle + 1, labelRect.bottom(), middle + 1, height);
+ }
+ } else { // AlignLeft || AlignRight
+ painter.setPen(lineColor);
+ painter.drawLine(middle, 0, middle, height);
+
+ painter.setPen(contrastLineColor);
+ painter.drawLine(middle - 1, 0, middle - 1, height);
+ painter.drawLine(middle + 1, 0, middle + 1, height);
+ }
+ } else { // Vertical
+ int middle = height / 2;
+ if (markAlignV == Qt::AlignVCenter) {
+ if (labelRect.left() > 0) {
+ painter.setPen(lineColor);
+ painter.drawLine(0, middle, labelRect.left(), middle);
+
+ painter.setPen(contrastLineColor);
+ painter.drawLine(0, middle - 1, labelRect.left(), middle - 1);
+ painter.drawLine(0, middle + 1, labelRect.left(), middle + 1);
+ }
+
+ if (labelRect.right() < width) {
+ painter.setPen(lineColor);
+ painter.drawLine(labelRect.right(), middle, width, middle);
+
+ painter.setPen(contrastLineColor);
+ painter.drawLine(labelRect.right(), middle - 1, width, middle - 1);
+ painter.drawLine(labelRect.right(), middle + 1, width, middle + 1);
+ }
+ } else { // AlignTop || AlignBottom
+ painter.setPen(lineColor);
+ painter.drawLine(0, middle, width, middle);
+
+ painter.setPen(contrastLineColor);
+ painter.drawLine(0, middle - 1, width, middle - 1);
+ painter.drawLine(0, middle + 1, width, middle + 1);
+ }
+ }
+
+ // Draw the label rect
QColor rectColor = markProperties.m_color;
- rectColor.setAlpha(150);
+ rectColor.setAlpha(200);
painter.setPen(markProperties.m_color);
painter.setBrush(QBrush(rectColor));
painter.drawRoundedRect(labelRect, 2.0, 2.0);
- //painter.drawRect(labelRect);
- //draw text
+ // Draw text
painter.setBrush(QBrush(QColor(0,0,0,0)));
painter.setFont(font);
painter.setPen(markProperties.m_textColor);
painter.drawText(labelRect, Qt::AlignCenter, label);
-
- //draw line
- QColor lineColor = markProperties.m_color;
- lineColor.setAlpha(200);
- painter.setPen(lineColor);
-
- float middle = pMark->m_image.width() / 2.0;
- //Default line align top
- float lineTop = labelRectHeight + 1;
- float lineBottom = pMark->m_image.height();
-
- if (markProperties.m_align == Qt::AlignBottom) {
- lineTop = 0.0;
- lineBottom = pMark->m_image.height() - labelRectHeight - 1;
- }
-
- painter.drawLine(middle, lineTop, middle, lineBottom);
-
- //other lines to increase contrast
- painter.setPen(QColor(0,0,0,120));
- painter.drawLine(middle - 1, lineTop, middle - 1, lineBottom);
- painter.drawLine(middle + 1, lineTop, middle + 1, lineBottom);
-
}
else //no text draw triangle
{
float triangleSize = 9.0;
- pMark->m_image = QImage(labelRectWidth+1,
- m_waveformRenderer->getHeight(),
- QImage::Format_ARGB32_Premultiplied);
+ float markLength = triangleSize + 1.0;
+ float markBreadth = m_waveformRenderer->getBreadth();
+
+ int width, height;
+
+ if (m_waveformRenderer->getOrientation() == Qt::Horizontal) {
+ width = markLength;
+ height = markBreadth;
+ } else {
+ width = markBreadth;
+ height = markLength;
+ }
+
+ pMark->m_image = QImage(width, height, QImage::Format_ARGB32_Premultiplied);
pMark->m_image.fill(QColor(0,0,0,0).rgba());
painter.begin(&pMark->m_image);
@@ -233,6 +318,11 @@ void WaveformRenderMark::generateMarkImage(WaveformMark* pMark) {
painter.setWorldMatrixEnabled(false);
+ // Rotate if drawing vertical waveforms
+ if (m_waveformRenderer->getOrientation() == Qt::Vertical) {
+ painter.setTransform(QTransform(0, 1, 1, 0, 0, 0));
+ }
+
QColor triangleColor = markProperties.m_color;
triangleColor.setAlpha(140);
painter.setPen(QColor(0,0,0,0));
@@ -249,9 +339,9 @@ void WaveformRenderMark::generateMarkImage(WaveformMark* pMark) {
painter.drawPolygon(triangle);
triangle.clear();
- triangle.append(QPointF(0.0,pMark->m_image.height()));
- triangle.append(QPointF(triangleSize+0.5,pMark->m_image.height()));
- triangle.append(QPointF(triangleSize*0.5 + 0.1, pMark->m_image.height() - triangleSize*0.5 - 2.1));
+ triangle.append(QPointF(0.0,markBreadth));
+ triangle.append(QPointF(triangleSize+0.5,markBreadth));
+ triangle.append(QPointF(triangleSize*0.5 + 0.1, markBreadth - triangleSize*0.5 - 2.1));
painter.drawPolygon(triangle);
@@ -260,10 +350,11 @@ void WaveformRenderMark::generateMarkImage(WaveformMark* pMark) {
QColor lineColor = markProperties.m_color;
lineColor.setAlpha(140);
painter.setPen(lineColor);
- float middle = pMark->m_image.width() / 2.0;
+
+ float middle = markLength / 2.0;
float lineTop = triangleSize * 0.5 + 1;
- float lineBottom = pMark->m_image.height() - triangleSize * 0.5 - 1;
+ float lineBottom = markBreadth - triangleSize * 0.5 - 1;
painter.drawLine(middle, lineTop, middle, lineBottom);
diff --git a/src/waveform/renderers/waveformrendermark.h b/src/waveform/renderers/waveformrendermark.h
index 1ab006b6bce8..fd515478b5b5 100644
--- a/src/waveform/renderers/waveformrendermark.h
+++ b/src/waveform/renderers/waveformrendermark.h
@@ -18,6 +18,8 @@ class WaveformRenderMark : public QObject, public WaveformRendererAbstract {
virtual void setup(const QDomNode& node, const SkinContext& context);
virtual void draw(QPainter* painter, QPaintEvent* event);
+ virtual void onResize() override;
+
// Called when a new track is loaded.
virtual void onSetTrack();
diff --git a/src/waveform/renderers/waveformrendermarkrange.cpp b/src/waveform/renderers/waveformrendermarkrange.cpp
index ea15928fa777..7b2e8a2b6adc 100644
--- a/src/waveform/renderers/waveformrendermarkrange.cpp
+++ b/src/waveform/renderers/waveformrendermarkrange.cpp
@@ -62,7 +62,7 @@ void WaveformRenderMarkRange::draw(QPainter *painter, QPaintEvent * /*event*/) {
double endPosition = m_waveformRenderer->transformSampleIndexInRendererWorld(endSample);
//range not in the current display
- if (startPosition > m_waveformRenderer->getWidth() || endPosition < 0)
+ if (startPosition > m_waveformRenderer->getLength() || endPosition < 0)
continue;
QImage* selectedImage = NULL;
@@ -71,7 +71,12 @@ void WaveformRenderMarkRange::draw(QPainter *painter, QPaintEvent * /*event*/) {
// draw the corresponding portion of the selected image
// this shouldn't involve *any* scaling it should be fast even in software mode
- QRect rect(startPosition,0,endPosition-startPosition,m_waveformRenderer->getHeight());
+ QRect rect;
+ if (m_waveformRenderer->getOrientation() == Qt::Horizontal) {
+ rect.setRect(startPosition, 0, endPosition - startPosition, m_waveformRenderer->getHeight());
+ } else {
+ rect.setRect(0, startPosition, m_waveformRenderer->getWidth(), endPosition - startPosition);
+ }
painter->drawImage(rect, *selectedImage, rect);
}
diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp
index a158e588bc2d..cb8aefc7a6c6 100644
--- a/src/waveform/renderers/waveformwidgetrenderer.cpp
+++ b/src/waveform/renderers/waveformwidgetrenderer.cpp
@@ -138,9 +138,9 @@ void WaveformWidgetRenderer::onPreRender(VSyncThread* vsyncThread) {
// Track length in pixels.
m_trackPixelCount = static_cast(m_trackSamples) / 2.0 / m_audioSamplePerPixel;
- // Ratio of half the width of the renderer to the track length in
+ // Ratio of half the length of the renderer to the track length in
// pixels. Percent of the track shown in half the waveform widget.
- double displayedLengthHalf = static_cast(m_width) / m_trackPixelCount / 2.0;
+ double displayedLengthHalf = static_cast(getLength()) / m_trackPixelCount / 2.0;
// Avoid pixel jitter in play position by rounding to the nearest track
// pixel.
m_playPos = round(truePlayPos * m_trackPixelCount) / m_trackPixelCount; // Avoid pixel jitter in play position
@@ -188,11 +188,20 @@ void WaveformWidgetRenderer::draw(QPainter* painter, QPaintEvent* event) {
}
painter->setPen(m_colors.getPlayPosColor());
- painter->drawLine(m_width/2,0,m_width/2,m_height);
+ if (m_orientation == Qt::Horizontal) {
+ painter->drawLine(m_width / 2, 0, m_width / 2, m_height);
+ } else {
+ painter->drawLine(0, m_height / 2, m_width, m_height / 2);
+ }
painter->setOpacity(0.5);
painter->setPen(m_colors.getBgColor());
- painter->drawLine(m_width/2 + 1,0,m_width/2 + 1,m_height);
- painter->drawLine(m_width/2 - 1,0,m_width/2 - 1,m_height);
+ if (m_orientation == Qt::Horizontal) {
+ painter->drawLine(m_width / 2 + 1, 0, m_width / 2 + 1, m_height);
+ painter->drawLine(m_width / 2 - 1, 0, m_width / 2 - 1, m_height);
+ } else {
+ painter->drawLine(0, m_height / 2 + 1, m_width, m_height / 2 + 1);
+ painter->drawLine(0, m_height / 2 - 1, m_width, m_height / 2 - 1);
+ }
}
#ifdef WAVEFORMWIDGETRENDERER_DEBUG
@@ -241,6 +250,13 @@ void WaveformWidgetRenderer::resize(int width, int height) {
}
void WaveformWidgetRenderer::setup(const QDomNode& node, const SkinContext& context) {
+ QString orientationString = context.selectString(node, "Orientation").toLower();
+ if (orientationString == "vertical") {
+ m_orientation = Qt::Vertical;
+ } else {
+ m_orientation = Qt::Horizontal;
+ }
+
m_colors.setup(node, context);
for (int i = 0; i < m_rendererStack.size(); ++i) {
m_rendererStack[i]->setup(node, context);
diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h
index 058e3c65ab2b..f1f104fff2fe 100644
--- a/src/waveform/renderers/waveformwidgetrenderer.h
+++ b/src/waveform/renderers/waveformwidgetrenderer.h
@@ -73,6 +73,9 @@ class WaveformWidgetRenderer {
void resize(int width, int height);
int getHeight() const { return m_height;}
int getWidth() const { return m_width;}
+ int getLength() const { return m_orientation == Qt::Horizontal ? m_width : m_height;}
+ int getBreadth() const { return m_orientation == Qt::Horizontal ? m_height : m_width;}
+ Qt::Orientation getOrientation() const { return m_orientation;}
const WaveformSignalColors* getWaveformSignalColors() const { return &m_colors; };
template< class T_Renderer>
@@ -88,6 +91,7 @@ class WaveformWidgetRenderer {
const char* m_group;
TrackPointer m_pTrack;
QList m_rendererStack;
+ Qt::Orientation m_orientation;
int m_height;
int m_width;
WaveformSignalColors m_colors;
diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp
index 5e8c8c558f94..db6379b27661 100644
--- a/src/widget/woverview.cpp
+++ b/src/widget/woverview.cpp
@@ -123,6 +123,13 @@ void WOverview::setup(const QDomNode& node, const SkinContext& context) {
child = child.nextSibling();
}
+ QString orientationString = context.selectString(node, "Orientation").toLower();
+ if (orientationString == "vertical") {
+ m_orientation = Qt::Vertical;
+ } else {
+ m_orientation = Qt::Horizontal;
+ }
+
//qDebug() << "WOverview : m_marks" << m_marks.size();
//qDebug() << "WOverview : m_markRanges" << m_markRanges.size();
if (!m_connections.isEmpty()) {
@@ -249,7 +256,11 @@ void WOverview::onMarkRangeChange(double /*v*/) {
}
void WOverview::mouseMoveEvent(QMouseEvent* e) {
- m_iPos = math_clamp(e->x(), 0, width() - 1);
+ if (m_orientation == Qt::Horizontal) {
+ m_iPos = math_clamp(e->x(), 0, width() - 1);
+ } else {
+ m_iPos = math_clamp(e->y(), 0, height() - 1);
+ }
//qDebug() << "WOverview::mouseMoveEvent" << e->pos() << m_iPos;
update();
}
@@ -294,7 +305,11 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
// Draw Axis
painter.setPen(QPen(m_signalColors.getAxesColor(), 1));
- painter.drawLine(0, height()/2, width(), height()/2);
+ if (m_orientation == Qt::Horizontal) {
+ painter.drawLine(0, height() / 2, width(), height() / 2);
+ } else {
+ painter.drawLine(width() / 2 , 0, width() / 2, height());
+ }
// Draw waveform pixmap
WaveformWidgetFactory* widgetFactory = WaveformWidgetFactory::instance();
@@ -311,8 +326,13 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
if (m_diffGain != diffGain || m_waveformImageScaled.isNull()) {
QRect sourceRect(0, diffGain, m_pWaveformSourceImage->width(),
m_pWaveformSourceImage->height() - 2 * diffGain);
- m_waveformImageScaled = m_pWaveformSourceImage->copy(
- sourceRect).scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ QImage croppedImage = m_pWaveformSourceImage->copy(sourceRect);
+ if (m_orientation == Qt::Vertical) {
+ // Rotate pixmap
+ croppedImage = croppedImage.transformed(QTransform(0, 1, 1, 0, 0, 0));
+ }
+ m_waveformImageScaled = croppedImage.scaled(size(), Qt::IgnoreAspectRatio,
+ Qt::SmoothTransformation);
m_diffGain = diffGain;
}
@@ -322,8 +342,13 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
if (m_dAnalyzerProgress < 1.0) {
// Paint analyzer Progress
painter.setPen(QPen(m_signalColors.getAxesColor(), 3));
- painter.drawLine(m_dAnalyzerProgress * width(), height() / 2,
- width(), height() / 2);
+ if (m_orientation == Qt::Horizontal) {
+ painter.drawLine(m_dAnalyzerProgress * width(), height() / 2,
+ width(), height() / 2);
+ } else {
+ painter.drawLine(width() / 2 , m_dAnalyzerProgress * height(),
+ width() / 2, height());
+ }
}
if (m_dAnalyzerProgress <= 0.5) { // remove text after progress by wf is recognizable
@@ -343,7 +368,7 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
if (m_trackLoaded && trackSamples > 0) {
//qDebug() << "WOverview::paintEvent trackSamples > 0";
const float offset = 1.0f;
- const float gain = static_cast(width()-2) / trackSamples;
+ const float gain = static_cast(length() - 2) / trackSamples;
// Draw range (loop)
for (auto&& currentMarkRange : m_markRanges) {
@@ -375,8 +400,13 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
}
// let top and bottom of the rect out of the widget
- painter.drawRect(QRectF(QPointF(startPosition, -2.0),
- QPointF(endPosition,height() + 1.0)));
+ if (m_orientation == Qt::Horizontal) {
+ painter.drawRect(QRectF(QPointF(startPosition, -2.0),
+ QPointF(endPosition, height() + 1.0)));
+ } else {
+ painter.drawRect(QRectF(QPointF(-2.0, startPosition),
+ QPointF(width() + 1.0, endPosition)));
+ }
}
// Draw markers (Cue & hotcues)
@@ -399,7 +429,12 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
// (currentMark.m_pointControl->get() / (float)m_trackSamplesControl->get()) * (float)(width()-2);
const float markPosition = offset + currentMark->m_pPointCos->get() * gain;
- const QLineF line(markPosition, 0.0, markPosition, static_cast(height()));
+ QLineF line;
+ if (m_orientation == Qt::Horizontal) {
+ line.setLine(markPosition, 0.0, markPosition, static_cast(height()));
+ } else {
+ line.setLine(0.0, markPosition, static_cast(width()), markPosition);
+ }
painter.setPen(shadowPen);
painter.drawLine(line);
@@ -407,14 +442,43 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
painter.drawLine(line);
if (!markProperties.m_text.isEmpty()) {
+ Qt::Alignment halign = markProperties.m_align & Qt::AlignHorizontal_Mask;
+ Qt::Alignment valign = markProperties.m_align & Qt::AlignVertical_Mask;
+ QFontMetricsF metric(markerFont);
+ QRectF textRect = metric.tightBoundingRect(markProperties.m_text);
QPointF textPoint;
- textPoint.setX(markPosition + 0.5f);
-
- if (markProperties.m_align == Qt::AlignTop) {
- QFontMetricsF metric(markerFont);
- textPoint.setY(metric.tightBoundingRect(markProperties.m_text).height()+0.5f);
- } else {
- textPoint.setY(float(height())-0.5f);
+ if (m_orientation == Qt::Horizontal) {
+ if (halign == Qt::AlignLeft) {
+ textPoint.setX(markPosition - textRect.width());
+ } else if (halign == Qt::AlignHCenter) {
+ textPoint.setX(markPosition - textRect.width() / 2);
+ } else { // AlignRight
+ textPoint.setX(markPosition + 0.5f);
+ }
+
+ if (valign == Qt::AlignTop) {
+ textPoint.setY(textRect.height() + 0.5f);
+ } else if (valign == Qt::AlignVCenter) {
+ textPoint.setY((textRect.height() + height()) / 2);
+ } else { // AlignBottom
+ textPoint.setY(float(height()) - 0.5f);
+ }
+ } else { // Vertical
+ if (halign == Qt::AlignLeft) {
+ textPoint.setX(1.0f);
+ } else if (halign == Qt::AlignHCenter) {
+ textPoint.setX((width() - textRect.width()) / 2);
+ } else { // AlignRight
+ textPoint.setX(width() - textRect.width());
+ }
+
+ if (valign == Qt::AlignTop) {
+ textPoint.setY(markPosition - 1.0f);
+ } else if (valign == Qt::AlignVCenter) {
+ textPoint.setY(markPosition + textRect.height() / 2);
+ } else { // AlignBottom
+ textPoint.setY(markPosition + metric.ascent());
+ }
}
painter.setPen(shadowPen);
@@ -428,23 +492,27 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) {
}
}
+ if (m_orientation == Qt::Vertical) {
+ painter.setTransform(QTransform(0, 1, 1, 0, 0, 0));
+ }
+
// draw current position
painter.setPen(QPen(QBrush(m_qColorBackground),1));
painter.setOpacity(0.5);
- painter.drawLine(m_iPos + 1, 0, m_iPos + 1, height());
- painter.drawLine(m_iPos - 1, 0, m_iPos - 1, height());
+ painter.drawLine(m_iPos + 1, 0, m_iPos + 1, breadth());
+ painter.drawLine(m_iPos - 1, 0, m_iPos - 1, breadth());
painter.setPen(QPen(m_signalColors.getPlayPosColor(),1));
painter.setOpacity(1.0);
- painter.drawLine(m_iPos, 0, m_iPos, height());
+ painter.drawLine(m_iPos, 0, m_iPos, breadth());
painter.drawLine(m_iPos - 2, 0, m_iPos, 2);
painter.drawLine(m_iPos, 2, m_iPos + 2, 0);
painter.drawLine(m_iPos - 2, 0, m_iPos + 2, 0);
- painter.drawLine(m_iPos - 2, height() - 1, m_iPos, height() - 3);
- painter.drawLine(m_iPos, height() - 3, m_iPos + 2, height() - 1);
- painter.drawLine(m_iPos - 2, height() - 1, m_iPos + 2, height() - 1);
+ painter.drawLine(m_iPos - 2, breadth() - 1, m_iPos, breadth() - 3);
+ painter.drawLine(m_iPos, breadth() - 3, m_iPos + 2, breadth() - 1);
+ painter.drawLine(m_iPos - 2, breadth() - 1, m_iPos + 2, breadth() - 1);
}
}
painter.end();
@@ -458,16 +526,20 @@ void WOverview::paintText(const QString &text, QPainter *painter) {
QFont font = painter->font();
QFontMetrics fm(font);
int textWidth = fm.width(text);
- if (textWidth > width()) {
+ if (textWidth > length()) {
qreal pointSize = font.pointSizeF();
- pointSize = pointSize * (width() - 5) / textWidth;
+ pointSize = pointSize * (length() - 5) / textWidth;
if (pointSize < 6) {
pointSize = 6;
}
font.setPointSizeF(pointSize);
painter->setFont(font);
}
+ if (m_orientation == Qt::Vertical) {
+ painter->setTransform(QTransform(0, 1, -1, 0, width(), 0));
+ }
painter->drawText(10, 12, text);
+ painter->resetTransform();
}
void WOverview::resizeEvent(QResizeEvent * /*unused*/) {
@@ -482,7 +554,7 @@ void WOverview::resizeEvent(QResizeEvent * /*unused*/) {
// These coeficients convert between widget space and normalized value
// space.
- m_a = (width() - 1) / (one - zero);
+ m_a = (length() - 1) / (one - zero);
m_b = zero * m_a;
m_waveformImageScaled = QImage();
diff --git a/src/widget/woverview.h b/src/widget/woverview.h
index bf594cdb103d..db3c8ae46efc 100644
--- a/src/widget/woverview.h
+++ b/src/widget/woverview.h
@@ -55,6 +55,14 @@ class WOverview : public WWidget {
void dragEnterEvent(QDragEnterEvent* event) override;
void dropEvent(QDropEvent* event) override;
+ inline int length() {
+ return m_orientation == Qt::Horizontal ? width() : height();
+ }
+
+ inline int breadth() {
+ return m_orientation == Qt::Horizontal ? height() : width();
+ }
+
ConstWaveformPointer getWaveform() const {
return m_pWaveform;
}
@@ -108,6 +116,8 @@ class WOverview : public WWidget {
// Internal storage of slider position in pixels
int m_iPos;
+ Qt::Orientation m_orientation;
+
QPixmap m_backgroundPixmap;
QString m_backgroundPixmapPath;
QColor m_qColorBackground;
diff --git a/src/widget/woverviewhsv.cpp b/src/widget/woverviewhsv.cpp
index 601bd6f0b394..10198a965d27 100644
--- a/src/widget/woverviewhsv.cpp
+++ b/src/widget/woverviewhsv.cpp
@@ -43,7 +43,7 @@ bool WOverviewHSV::drawNextPixmapPart() {
// Test if there is some new to draw (at least of pixel width)
const int completionIncrement = waveformCompletion - m_actualCompletion;
- int visiblePixelIncrement = completionIncrement * width() / dataSize;
+ int visiblePixelIncrement = completionIncrement * length() / dataSize;
if (completionIncrement < 2 || visiblePixelIncrement == 0) {
return false;
}
diff --git a/src/widget/woverviewlmh.cpp b/src/widget/woverviewlmh.cpp
index 700b420dafbf..2f93d5f8eae2 100644
--- a/src/widget/woverviewlmh.cpp
+++ b/src/widget/woverviewlmh.cpp
@@ -45,7 +45,7 @@ bool WOverviewLMH::drawNextPixmapPart() {
// Test if there is some new to draw (at least of pixel width)
const int completionIncrement = waveformCompletion - m_actualCompletion;
- int visiblePixelIncrement = completionIncrement * width() / dataSize;
+ int visiblePixelIncrement = completionIncrement * length() / dataSize;
if (completionIncrement < 2 || visiblePixelIncrement == 0) {
return false;
}
diff --git a/src/widget/woverviewrgb.cpp b/src/widget/woverviewrgb.cpp
index 9710e2ae0e89..d7696b320d98 100644
--- a/src/widget/woverviewrgb.cpp
+++ b/src/widget/woverviewrgb.cpp
@@ -42,7 +42,7 @@ bool WOverviewRGB::drawNextPixmapPart() {
// Test if there is some new to draw (at least of pixel width)
const int completionIncrement = waveformCompletion - m_actualCompletion;
- int visiblePixelIncrement = completionIncrement * width() / dataSize;
+ int visiblePixelIncrement = completionIncrement * length() / dataSize;
if (completionIncrement < 2 || visiblePixelIncrement == 0) {
return false;
}
diff --git a/src/widget/wwaveformviewer.cpp b/src/widget/wwaveformviewer.cpp
index 0e70defb7ac1..818e4b215a05 100644
--- a/src/widget/wwaveformviewer.cpp
+++ b/src/widget/wwaveformviewer.cpp
@@ -57,9 +57,13 @@ void WWaveformViewer::resizeEvent(QResizeEvent* /*event*/) {
}
void WWaveformViewer::mousePressEvent(QMouseEvent* event) {
+ if (!m_waveformWidget) {
+ return;
+ }
+
m_mouseAnchor = event->pos();
- if (event->button() == Qt::LeftButton && m_waveformWidget) {
+ if (event->button() == Qt::LeftButton) {
// If we are pitch-bending then disable and reset because the two
// shouldn't be used at once.
if (m_bBending) {
@@ -67,8 +71,10 @@ void WWaveformViewer::mousePressEvent(QMouseEvent* event) {
m_bBending = false;
}
m_bScratching = true;
+ int eventPosValue = m_waveformWidget->getOrientation() == Qt::Horizontal ?
+ event->pos().x() : event->pos().y();
double audioSamplePerPixel = m_waveformWidget->getAudioSamplePerPixel();
- double targetPosition = -1.0 * event->pos().x() * audioSamplePerPixel * 2;
+ double targetPosition = -1.0 * eventPosValue * audioSamplePerPixel * 2;
m_pScratchPosition->set(targetPosition);
m_pScratchPositionEnable->slotSet(1.0);
} else if (event->button() == Qt::RightButton) {
@@ -87,15 +93,23 @@ void WWaveformViewer::mousePressEvent(QMouseEvent* event) {
}
void WWaveformViewer::mouseMoveEvent(QMouseEvent* event) {
+ if (!m_waveformWidget) {
+ return;
+ }
+
// Only send signals for mouse moving if the left button is pressed
- if (m_bScratching && m_waveformWidget) {
+ if (m_bScratching) {
+ int eventPosValue = m_waveformWidget->getOrientation() == Qt::Horizontal ?
+ event->pos().x() : event->pos().y();
// Adjusts for one-to-one movement.
double audioSamplePerPixel = m_waveformWidget->getAudioSamplePerPixel();
- double targetPosition = -1.0 * event->pos().x() * audioSamplePerPixel * 2;
+ double targetPosition = -1.0 * eventPosValue * audioSamplePerPixel * 2;
//qDebug() << "Target:" << targetPosition;
m_pScratchPosition->set(targetPosition);
} else if (m_bBending) {
QPoint diff = event->pos() - m_mouseAnchor;
+ int diffValue = m_waveformWidget->getOrientation() == Qt::Horizontal ?
+ diff.x() : diff.y();
// Start at the middle of [0.0, 1.0], and emit values based on how far
// the mouse has traveled horizontally. Note, for legacy (MIDI) reasons,
// this is tuned to 127.
@@ -103,7 +117,7 @@ void WWaveformViewer::mouseMoveEvent(QMouseEvent* event) {
// control since we manually connect it in LegacySkinParser regardless
// of whether the skin specifies it. See ControlTTRotaryBehavior to see
// where this value is handled.
- double v = 0.5 + (diff.x() / 1270.0);
+ double v = 0.5 + (diffValue / 1270.0);
// clamp to [0.0, 1.0]
v = math_clamp(v, 0.0, 1.0);
m_pWheel->setParameter(v);