From 239a2264d382fe2b4805bbf07514ef28f295b2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nino=20Mi=C5=A1ki=C4=87-Pletenac?= Date: Tue, 26 Jul 2016 01:30:00 +0200 Subject: [PATCH 1/5] Add support for vertical waveforms and overviews --- .../renderers/glslwaveformrenderersignal.cpp | 4 + .../renderers/glvsynctestrenderer.cpp | 4 + .../glwaveformrendererfilteredsignal.cpp | 8 ++ .../renderers/glwaveformrendererrgb.cpp | 8 ++ .../glwaveformrenderersimplesignal.cpp | 8 ++ .../qtwaveformrendererfilteredsignal.cpp | 39 ++++--- .../qtwaveformrenderersimplesignal.cpp | 33 +++--- src/waveform/renderers/waveformrenderbeat.cpp | 8 +- .../renderers/waveformrendererendoftrack.cpp | 39 ++++--- .../renderers/waveformrendererendoftrack.h | 2 + .../waveformrendererfilteredsignal.cpp | 50 +++++---- .../renderers/waveformrendererhsv.cpp | 26 +++-- .../renderers/waveformrendererpreroll.cpp | 30 +++-- .../renderers/waveformrendererrgb.cpp | 26 +++-- .../renderers/waveformrenderersignalbase.cpp | 8 ++ .../renderers/waveformrenderersignalbase.h | 1 + src/waveform/renderers/waveformrendermark.cpp | 103 ++++++++++++------ .../renderers/waveformrendermarkrange.cpp | 9 +- .../renderers/waveformwidgetrenderer.cpp | 26 ++++- .../renderers/waveformwidgetrenderer.h | 4 + src/widget/woverview.cpp | 74 ++++++++++--- src/widget/woverview.h | 8 ++ src/widget/wwaveformviewer.cpp | 24 +++- 23 files changed, 383 insertions(+), 159 deletions(-) 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..fd288d65e684 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,6 +140,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); + } if (m_alignment == Qt::AlignBottom) glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0); else diff --git a/src/waveform/renderers/glwaveformrendererrgb.cpp b/src/waveform/renderers/glwaveformrendererrgb.cpp index ac7954c4ce90..b0e77c6b89be 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,6 +143,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); + } if (m_alignment == Qt::AlignBottom) { glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0); } else { diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp index ea93b2a8ecab..13f289a007d3 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,6 +123,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); + } if (m_alignment == Qt::AlignBottom) glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0); else diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp index 8e9a193cee90..cfcdd0fc7dc6 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,7 +149,7 @@ 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; @@ -158,13 +158,13 @@ int QtWaveformRendererFilteredSignal::buildPolygon() { 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; + double heightGain = allGain * (double)m_waveformRenderer->getBreadth() / 255.0; if (m_alignment == Qt::AlignTop) { painter->translate(0.0, 0.0); painter->scale(1.0, heightGain); } else if (m_alignment == Qt::AlignBottom) { - painter->translate(0.0, m_waveformRenderer->getHeight()); + 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..bc72f1c84721 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; + double heightGain = allGain * (double)m_waveformRenderer->getBreadth()/255.0; if (m_alignment == Qt::AlignTop) { painter->translate(0.0, 0.0); painter->scale(1.0, heightGain); } else if (m_alignment == Qt::AlignBottom) { - painter->translate(0.0, m_waveformRenderer->getHeight()); + 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,7 +109,7 @@ 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; @@ -113,13 +118,13 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even 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/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..c56c140e28cc 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(); @@ -151,8 +157,8 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, switch (m_alignment) { case Qt::AlignBottom : 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 : m_lowLines[actualLowLineNumber].setLine( @@ -161,8 +167,8 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, 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++; @@ -171,8 +177,8 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, switch (m_alignment) { case Qt::AlignBottom : 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 : m_midLines[actualMidLineNumber].setLine( @@ -181,8 +187,8 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, 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++; @@ -191,8 +197,8 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, switch (m_alignment) { case Qt::AlignBottom : 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 : m_highLines[actualHighLineNumber].setLine( @@ -201,8 +207,8 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, 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..cc5af5f8a997 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; @@ -153,18 +159,18 @@ void WaveformRendererHSV::draw(QPainter* painter, switch (m_alignment) { case Qt::AlignBottom : 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 : 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..105836de26f8 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; @@ -141,18 +147,18 @@ void WaveformRendererRGB::draw(QPainter* painter, switch (m_alignment) { case Qt::AlignBottom : 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 : 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..2deaf612d993 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), @@ -102,6 +103,13 @@ void WaveformRendererSignalBase::setup(const QDomNode& node, m_alignment = Qt::AlignCenter; } + QString orientationString = context.selectString(node, "Orientation").toLower(); + if (orientationString == "vertical") { + m_orientation = Qt::Vertical; + } else { + m_orientation = Qt::Horizontal; + } + m_pColors = m_waveformRenderer->getWaveformSignalColors(); const QColor& l = m_pColors->getLowColor(); 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 5a1abfd3dedd..96b9d1e422df 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -50,16 +50,25 @@ 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(); } @@ -107,9 +116,16 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { QRectF labelRect(0, 0, (float)labelRectWidth, (float)labelRectHeight); - mark.m_image = QImage(labelRectWidth+1, - m_waveformRenderer->getHeight(), - QImage::Format_ARGB32_Premultiplied); + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { + mark.m_image = QImage(labelRectWidth + 1, + m_waveformRenderer->getHeight(), + QImage::Format_ARGB32_Premultiplied); + } else { + mark.m_image = QImage(m_waveformRenderer->getWidth(), + 2 * labelRectHeight + 1, + QImage::Format_ARGB32_Premultiplied); + labelRect.moveLeft((m_waveformRenderer->getWidth() - labelRectWidth) / 2); + } if (mark.m_align == Qt::AlignBottom) { labelRect.moveBottom(mark.m_image.height()-1); @@ -143,30 +159,50 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { lineColor.setAlpha(200); painter.setPen(lineColor); - float middle = mark.m_image.width() / 2.0; - //Default line align top - float lineTop = labelRectHeight + 1; - float lineBottom = mark.m_image.height(); + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { + float middle = mark.m_image.width() / 2.0; + //Default line align top + float lineTop = labelRectHeight + 1; + float lineBottom = mark.m_image.height(); - if (mark.m_align == Qt::AlignBottom) { - lineTop = 0.0; - lineBottom = mark.m_image.height() - labelRectHeight - 1; - } + if (mark.m_align == Qt::AlignBottom) { + lineTop = 0.0; + lineBottom = mark.m_image.height() - labelRectHeight - 1; + } - painter.drawLine(middle, lineTop, middle, lineBottom); + 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); + //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 { + float middle = mark.m_image.height() / 2.0; + float lineLeft = 0.0; + float lineRight = mark.m_image.width(); + painter.drawLine(lineLeft, middle, lineRight, middle); + + //other lines to increase contrast + painter.setPen(QColor(0,0,0,120)); + painter.drawLine(lineLeft, middle - 1, lineRight, middle - 1); + painter.drawLine(lineLeft, middle + 1, lineRight, middle + 1); + } } else //no text draw triangle { float triangleSize = 9.0; - mark.m_image = QImage(labelRectWidth+1, - m_waveformRenderer->getHeight(), - QImage::Format_ARGB32_Premultiplied); + float markLength = triangleSize + 1.0; + float markBreadth = m_waveformRenderer->getBreadth(); + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { + mark.m_image = QImage(markLength, + markBreadth, + QImage::Format_ARGB32_Premultiplied); + } else { + mark.m_image = QImage(markBreadth, + markLength, + QImage::Format_ARGB32_Premultiplied); + } mark.m_image.fill(QColor(0,0,0,0).rgba()); painter.begin(&mark.m_image); @@ -174,6 +210,11 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { 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 = mark.m_color; triangleColor.setAlpha(140); painter.setPen(QColor(0,0,0,0)); @@ -190,9 +231,9 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { painter.drawPolygon(triangle); triangle.clear(); - triangle.append(QPointF(0.0,mark.m_image.height())); - triangle.append(QPointF(triangleSize+0.5,mark.m_image.height())); - triangle.append(QPointF(triangleSize*0.5 + 0.1, mark.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); @@ -201,10 +242,10 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { QColor lineColor = mark.m_color; lineColor.setAlpha(140); painter.setPen(lineColor); - float middle = mark.m_image.width() / 2.0; + float middle = markLength / 2.0; float lineTop = triangleSize * 0.5 + 1; - float lineBottom = mark.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/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 e88d31085db3..ec8eecc77cc1 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 @@ -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) @@ -391,6 +421,10 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { painter.setOpacity(0.9); + if (m_orientation == Qt::Vertical) { + painter.setTransform(QTransform(0, 1, 1, 0, 0, 0)); + } + for (int i = 0; i < m_marks.size(); ++i) { WaveformMark& currentMark = m_marks[i]; if (currentMark.m_pPointCos && currentMark.m_pPointCos->get() >= 0.0) { @@ -398,7 +432,7 @@ 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())); + const QLineF line(markPosition, 0.0, markPosition, static_cast(breadth())); painter.setPen(shadowPen); painter.drawLine(line); @@ -430,20 +464,20 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { // 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(); @@ -457,16 +491,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 * (breadth() - 5) / textWidth; if (pointSize < 6) { pointSize = 6; } font.setPointSizeF(pointSize); painter->setFont(font); } + if (m_orientation == Qt::Vertical) { + painter->rotate(90); + } painter->drawText(10, 12, text); + painter->resetTransform(); } void WOverview::resizeEvent(QResizeEvent * /*unused*/) { @@ -481,7 +519,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..f571a79cb87f 100644 --- a/src/widget/woverview.h +++ b/src/widget/woverview.h @@ -85,6 +85,12 @@ class WOverview : public WWidget { // Append the waveform overview pixmap according to available data in waveform virtual bool drawNextPixmapPart() = 0; void paintText(const QString &text, QPainter *painter); + inline int length() { + return m_orientation == Qt::Horizontal ? width() : height(); + } + inline int breadth() { + return m_orientation == Qt::Vertical ? height() : width(); + } inline int valueToPosition(double value) const { return static_cast(m_a * value - m_b); } @@ -108,6 +114,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/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); From a87601745779688593fc98b5fae344b0c8565304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nino=20Mi=C5=A1ki=C4=87-Pletenac?= Date: Thu, 28 Jul 2016 18:00:00 +0200 Subject: [PATCH 2/5] Various fixes and improvements of vertical waveform overview --- src/widget/woverview.cpp | 37 +++++++++++++++++++++++-------------- src/widget/woverview.h | 14 ++++++++------ src/widget/woverviewhsv.cpp | 2 +- src/widget/woverviewlmh.cpp | 2 +- src/widget/woverviewrgb.cpp | 2 +- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp index ec8eecc77cc1..9d67ce28cda0 100644 --- a/src/widget/woverview.cpp +++ b/src/widget/woverview.cpp @@ -368,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) { @@ -421,10 +421,6 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { painter.setOpacity(0.9); - if (m_orientation == Qt::Vertical) { - painter.setTransform(QTransform(0, 1, 1, 0, 0, 0)); - } - for (int i = 0; i < m_marks.size(); ++i) { WaveformMark& currentMark = m_marks[i]; if (currentMark.m_pPointCos && currentMark.m_pPointCos->get() >= 0.0) { @@ -432,7 +428,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(breadth())); + 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); @@ -440,14 +441,18 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { painter.drawLine(line); if (!currentMark.m_text.isEmpty()) { + QFontMetricsF metric(markerFont); QPointF textPoint; - textPoint.setX(markPosition + 0.5f); - - if (currentMark.m_align == Qt::AlignTop) { - QFontMetricsF metric(markerFont); - textPoint.setY(metric.tightBoundingRect(currentMark.m_text).height()+0.5f); + if (m_orientation == Qt::Horizontal) { + textPoint.setX(markPosition + 0.5f); + if (currentMark.m_align == Qt::AlignTop) { + textPoint.setY(metric.tightBoundingRect(currentMark.m_text).height() + 0.5f); + } else { + textPoint.setY(float(height()) - 0.5f); + } } else { - textPoint.setY(float(height())-0.5f); + textPoint.setX(1.0f); + textPoint.setY(markPosition + metric.ascent()); } painter.setPen(shadowPen); @@ -461,6 +466,10 @@ 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); @@ -493,7 +502,7 @@ void WOverview::paintText(const QString &text, QPainter *painter) { int textWidth = fm.width(text); if (textWidth > length()) { qreal pointSize = font.pointSizeF(); - pointSize = pointSize * (breadth() - 5) / textWidth; + pointSize = pointSize * (length() - 5) / textWidth; if (pointSize < 6) { pointSize = 6; } @@ -501,7 +510,7 @@ void WOverview::paintText(const QString &text, QPainter *painter) { painter->setFont(font); } if (m_orientation == Qt::Vertical) { - painter->rotate(90); + painter->setTransform(QTransform(0, 1, -1, 0, width(), 0)); } painter->drawText(10, 12, text); painter->resetTransform(); diff --git a/src/widget/woverview.h b/src/widget/woverview.h index f571a79cb87f..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; } @@ -85,12 +93,6 @@ class WOverview : public WWidget { // Append the waveform overview pixmap according to available data in waveform virtual bool drawNextPixmapPart() = 0; void paintText(const QString &text, QPainter *painter); - inline int length() { - return m_orientation == Qt::Horizontal ? width() : height(); - } - inline int breadth() { - return m_orientation == Qt::Vertical ? height() : width(); - } inline int valueToPosition(double value) const { return static_cast(m_a * value - m_b); } 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; } From 92c041a48117de058a4e8dd1b91b3ed74b6fe46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nino=20Mi=C5=A1ki=C4=87-Pletenac?= Date: Fri, 29 Jul 2016 13:30:00 +0200 Subject: [PATCH 3/5] Use left/right instead of top/bottom for alignment of vertical waveforms --- .../glwaveformrendererfilteredsignal.cpp | 2 +- .../renderers/glwaveformrendererrgb.cpp | 2 +- .../glwaveformrenderersimplesignal.cpp | 2 +- .../qtwaveformrendererfilteredsignal.cpp | 8 +++--- .../qtwaveformrenderersimplesignal.cpp | 8 +++--- .../waveformrendererfilteredsignal.cpp | 6 ++++ .../renderers/waveformrendererhsv.cpp | 2 ++ .../renderers/waveformrendererrgb.cpp | 2 ++ .../renderers/waveformrenderersignalbase.cpp | 28 +++++++++++++------ 9 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp index fd288d65e684..cac0d987e172 100644 --- a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp @@ -144,7 +144,7 @@ void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev glRotatef(90.0f, 0.0f, 0.0f, 1.0f); glScalef(-1.0f, 1.0f, 1.0f); } - if (m_alignment == Qt::AlignBottom) + 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 b0e77c6b89be..397ca86648fe 100644 --- a/src/waveform/renderers/glwaveformrendererrgb.cpp +++ b/src/waveform/renderers/glwaveformrendererrgb.cpp @@ -147,7 +147,7 @@ void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) { glRotatef(90.0f, 0.0f, 0.0f, 1.0f); glScalef(-1.0f, 1.0f, 1.0f); } - if (m_alignment == Qt::AlignBottom) { + 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 13f289a007d3..35805de2b933 100644 --- a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp +++ b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp @@ -127,7 +127,7 @@ void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even glRotatef(90.0f, 0.0f, 0.0f, 1.0f); glScalef(-1.0f, 1.0f, 1.0f); } - if (m_alignment == Qt::AlignBottom) + 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 cfcdd0fc7dc6..bcd5dc219100 100644 --- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp @@ -153,8 +153,8 @@ int QtWaveformRendererFilteredSignal::buildPolygon() { 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) { @@ -290,10 +290,10 @@ void QtWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev getGains(&allGain, NULL, NULL, NULL); double heightGain = allGain * (double)m_waveformRenderer->getBreadth() / 255.0; - if (m_alignment == Qt::AlignTop) { + 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) { + } else if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignLeft) { painter->translate(0.0, m_waveformRenderer->getBreadth()); painter->scale(1.0, heightGain); } else { diff --git a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp index bc72f1c84721..47f97a55d403 100644 --- a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp +++ b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp @@ -72,10 +72,10 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even getGains(&allGain, NULL, NULL, NULL); double heightGain = allGain * (double)m_waveformRenderer->getBreadth()/255.0; - if (m_alignment == Qt::AlignTop) { + 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) { + } else if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignLeft) { painter->translate(0.0, m_waveformRenderer->getBreadth()); painter->scale(1.0, heightGain); } else { @@ -113,8 +113,8 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even 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) { diff --git a/src/waveform/renderers/waveformrendererfilteredsignal.cpp b/src/waveform/renderers/waveformrendererfilteredsignal.cpp index c56c140e28cc..2952c9e88386 100644 --- a/src/waveform/renderers/waveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/waveformrendererfilteredsignal.cpp @@ -156,11 +156,13 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, if (maxLow[0] && maxLow[1]) { switch (m_alignment) { case Qt::AlignBottom : + case Qt::AlignRight : m_lowLines[actualLowLineNumber].setLine( 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]))); @@ -176,11 +178,13 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, if (maxMid[0] && maxMid[1]) { switch (m_alignment) { case Qt::AlignBottom : + case Qt::AlignRight : m_midLines[actualMidLineNumber].setLine( 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]))); @@ -196,11 +200,13 @@ void WaveformRendererFilteredSignal::draw(QPainter* painter, if (maxHigh[0] && maxHigh[1]) { switch (m_alignment) { case Qt::AlignBottom : + case Qt::AlignRight : m_highLines[actualHighLineNumber].setLine( 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]))); diff --git a/src/waveform/renderers/waveformrendererhsv.cpp b/src/waveform/renderers/waveformrendererhsv.cpp index cc5af5f8a997..7589952dcafb 100644 --- a/src/waveform/renderers/waveformrendererhsv.cpp +++ b/src/waveform/renderers/waveformrendererhsv.cpp @@ -158,11 +158,13 @@ void WaveformRendererHSV::draw(QPainter* painter, painter->setPen(color); switch (m_alignment) { case Qt::AlignBottom : + case Qt::AlignRight : painter->drawLine( 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]))); diff --git a/src/waveform/renderers/waveformrendererrgb.cpp b/src/waveform/renderers/waveformrendererrgb.cpp index 105836de26f8..c7507ef19329 100644 --- a/src/waveform/renderers/waveformrendererrgb.cpp +++ b/src/waveform/renderers/waveformrendererrgb.cpp @@ -146,11 +146,13 @@ void WaveformRendererRGB::draw(QPainter* painter, painter->setPen(color); switch (m_alignment) { case Qt::AlignBottom : + case Qt::AlignRight : painter->drawLine( 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))); diff --git a/src/waveform/renderers/waveformrenderersignalbase.cpp b/src/waveform/renderers/waveformrenderersignalbase.cpp index 2deaf612d993..f14d7edcec33 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.cpp +++ b/src/waveform/renderers/waveformrenderersignalbase.cpp @@ -94,15 +94,6 @@ bool WaveformRendererSignalBase::init() { void WaveformRendererSignalBase::setup(const QDomNode& node, const SkinContext& context) { - QString alignString = context.selectString(node, "Align").toLower(); - if (alignString == "bottom") { - m_alignment = Qt::AlignBottom; - } else if (alignString == "top") { - m_alignment = Qt::AlignTop; - } else { - m_alignment = Qt::AlignCenter; - } - QString orientationString = context.selectString(node, "Orientation").toLower(); if (orientationString == "vertical") { m_orientation = Qt::Vertical; @@ -110,6 +101,25 @@ void WaveformRendererSignalBase::setup(const QDomNode& node, m_orientation = Qt::Horizontal; } + QString alignString = context.selectString(node, "Align").toLower(); + 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 { + 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(); const QColor& l = m_pColors->getLowColor(); From 350748fb8a2fb9343cc13af397151652f3153c4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nino=20Mi=C5=A1ki=C4=87-Pletenac?= Date: Sun, 14 Aug 2016 16:30:00 +0200 Subject: [PATCH 4/5] Enable left/hcenter/right alignment of marker's text on waveform and overview Also, decrease transparency of marker's text on waveform. --- res/skins/Deere/deck_overview_row.xml | 4 +- res/skins/LateNight/deck_row_5.xml | 4 +- res/skins/Shade/deck.xml | 4 +- src/waveform/renderers/waveformmark.cpp | 43 ++++- src/waveform/renderers/waveformrendermark.cpp | 147 +++++++++++------- src/widget/woverview.cpp | 39 ++++- 6 files changed, 170 insertions(+), 71 deletions(-) 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/waveformmark.cpp b/src/waveform/renderers/waveformmark.cpp index 238c7d7a61da..19b656704c4a 100644 --- a/src/waveform/renderers/waveformmark.cpp +++ b/src/waveform/renderers/waveformmark.cpp @@ -15,6 +15,43 @@ WaveformMark::~WaveformMark() { delete m_pPointCos; } +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; +} + void WaveformMark::setup(const QString& group, const QDomNode& node, const SkinContext& context, const WaveformSignalColors& signalColors) { @@ -40,11 +77,7 @@ void WaveformMark::setup(const QString& group, 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::AlignTop | Qt::AlignHCenter); m_text = context.selectString(node, "Text"); m_pixmapPath = context.selectString(node, "Pixmap"); diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp index 96b9d1e422df..7f74f1f823e3 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -88,9 +88,6 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { QPainter painter; - int labelRectWidth = 0; - int labelRectHeight = 0; - // If no text is provided, leave m_markImage as a null image if (!mark.m_text.isNull()) { //QFont font("Bitstream Vera Sans"); @@ -107,28 +104,44 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { 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); + int width; + int height; + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { - mark.m_image = QImage(labelRectWidth + 1, - m_waveformRenderer->getHeight(), - QImage::Format_ARGB32_Premultiplied); + width = 2 * labelRectWidth + 1; + height = m_waveformRenderer->getHeight(); } else { - mark.m_image = QImage(m_waveformRenderer->getWidth(), - 2 * labelRectHeight + 1, - QImage::Format_ARGB32_Premultiplied); - labelRect.moveLeft((m_waveformRenderer->getWidth() - labelRectWidth) / 2); + width = m_waveformRenderer->getWidth(); + height = 2 * labelRectHeight + 1; + } + + mark.m_image = QImage(width, + height, + QImage::Format_ARGB32_Premultiplied); + + Qt::Alignment markAlignH = mark.m_align & Qt::AlignHorizontal_Mask; + Qt::Alignment markAlignV = mark.m_align & Qt::AlignVertical_Mask; + + if (markAlignH == Qt::AlignHCenter) { + labelRect.moveLeft((width - labelRectWidth) / 2); + } else if (markAlignH == Qt::AlignRight) { + labelRect.moveRight(width - 1); } - if (mark.m_align == Qt::AlignBottom) { - labelRect.moveBottom(mark.m_image.height()-1); + if (markAlignV == Qt::AlignVCenter) { + labelRect.moveTop((height - labelRectHeight) / 2); + } else if (markAlignV == Qt::AlignBottom) { + labelRect.moveBottom(height - 1); } // Fill with transparent pixels @@ -139,55 +152,83 @@ void WaveformRenderMark::generateMarkImage(WaveformMark& mark) { painter.setWorldMatrixEnabled(false); - //draw the label rect + // Prepare colors for drawing of marker lines + QColor lineColor = mark.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 = mark.m_color; - rectColor.setAlpha(150); + rectColor.setAlpha(200); painter.setPen(mark.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))); font.setWeight(75); painter.setFont(font); painter.setPen(mark.m_textColor); painter.drawText(labelRect, Qt::AlignCenter, mark.m_text); - - //draw line - QColor lineColor = mark.m_color; - lineColor.setAlpha(200); - painter.setPen(lineColor); - - if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { - float middle = mark.m_image.width() / 2.0; - //Default line align top - float lineTop = labelRectHeight + 1; - float lineBottom = mark.m_image.height(); - - if (mark.m_align == Qt::AlignBottom) { - lineTop = 0.0; - lineBottom = mark.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 { - float middle = mark.m_image.height() / 2.0; - float lineLeft = 0.0; - float lineRight = mark.m_image.width(); - - painter.drawLine(lineLeft, middle, lineRight, middle); - - //other lines to increase contrast - painter.setPen(QColor(0,0,0,120)); - painter.drawLine(lineLeft, middle - 1, lineRight, middle - 1); - painter.drawLine(lineLeft, middle + 1, lineRight, middle + 1); - } } else //no text draw triangle { diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp index 9d67ce28cda0..fddc0faec047 100644 --- a/src/widget/woverview.cpp +++ b/src/widget/woverview.cpp @@ -441,18 +441,43 @@ void WOverview::paintEvent(QPaintEvent * /*unused*/) { painter.drawLine(line); if (!currentMark.m_text.isEmpty()) { + Qt::Alignment halign = currentMark.m_align & Qt::AlignHorizontal_Mask; + Qt::Alignment valign = currentMark.m_align & Qt::AlignVertical_Mask; QFontMetricsF metric(markerFont); + QRectF textRect = metric.tightBoundingRect(currentMark.m_text); QPointF textPoint; if (m_orientation == Qt::Horizontal) { - textPoint.setX(markPosition + 0.5f); - if (currentMark.m_align == Qt::AlignTop) { - textPoint.setY(metric.tightBoundingRect(currentMark.m_text).height() + 0.5f); - } else { + 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 { - textPoint.setX(1.0f); - textPoint.setY(markPosition + metric.ascent()); + } 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); From 1b0157079f33d64edfb83dd6e0da1ac8d9098697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nino=20Mi=C5=A1ki=C4=87-Pletenac?= Date: Mon, 15 Aug 2016 18:45:00 +0200 Subject: [PATCH 5/5] Delete marks' images on waveform resize --- src/waveform/renderers/waveformrendermark.cpp | 7 +++++++ src/waveform/renderers/waveformrendermark.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp index 7f74f1f823e3..6aa0a09a4f7c 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -72,6 +72,13 @@ void WaveformRenderMark::draw(QPainter* painter, QPaintEvent* /*event*/) { 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::generateMarkImage(WaveformMark& mark) { // Load the pixmap from file -- takes precedence over text. if (mark.m_pixmapPath != "") { diff --git a/src/waveform/renderers/waveformrendermark.h b/src/waveform/renderers/waveformrendermark.h index 5399f9e431ec..9a5fd10c0201 100644 --- a/src/waveform/renderers/waveformrendermark.h +++ b/src/waveform/renderers/waveformrendermark.h @@ -13,6 +13,8 @@ class WaveformRenderMark : public WaveformRendererAbstract { virtual void setup(const QDomNode& node, const SkinContext& context); virtual void draw(QPainter* painter, QPaintEvent* event); + virtual void onResize() override; + private: void generateMarkImage(WaveformMark& mark);