Skip to content

Commit

Permalink
Waveforms: show 'Passthrough' label
Browse files Browse the repository at this point in the history
  • Loading branch information
ronso0 committed Jun 11, 2022
1 parent da71f8d commit b9343db
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 4 deletions.
10 changes: 8 additions & 2 deletions src/waveform/renderers/waveformsignalcolors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,19 @@ bool WaveformSignalColors::setup(const QDomNode &node, const SkinContext& contex
m_playedOverlayColor = Qt::transparent;
}

// This color is used to draw an overlay over the entire overview-waveforms
// if vinyl passthrough is enabled
// This color is used to draw an overlay over the entire overview waveforms
// if vinyl passthrough is enabled. Default is black with 73% opacity.
m_passthroughOverlayColor = context.selectColor(node, "PassthroughOverlayColor");
m_passthroughOverlayColor = WSkinColor::getCorrectColor(m_passthroughOverlayColor).toRgb();
if (!m_passthroughOverlayColor.isValid()) {
m_passthroughOverlayColor = WSkinColor::getCorrectColor(QColor(0, 0, 0, 187)).toRgb();
}
// This color is for the "Passthrough" label on scrolling waveforms. Default is white.
m_passthroughLabelColor = context.selectColor(node, "PassthroughLabelColor");
m_passthroughLabelColor = WSkinColor::getCorrectColor(m_passthroughLabelColor).toRgb();
if (!m_passthroughLabelColor.isValid()) {
m_passthroughLabelColor = WSkinColor::getCorrectColor(QColor(255, 255, 255, 255)).toRgb();
}

m_bgColor = context.selectColor(node, "BgColor");
if (!m_bgColor.isValid()) {
Expand Down
4 changes: 4 additions & 0 deletions src/waveform/renderers/waveformsignalcolors.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ class WaveformSignalColors {
inline const QColor& getPassthroughOverlayColor() const {
return m_passthroughOverlayColor;
}
inline const QColor& getPassthroughLabelColor() const {
return m_passthroughLabelColor;
}
inline const QColor& getBgColor() const {
return m_bgColor;
}
Expand Down Expand Up @@ -82,6 +85,7 @@ class WaveformSignalColors {
QColor m_playPosColor;
QColor m_playedOverlayColor;
QColor m_passthroughOverlayColor;
QColor m_passthroughLabelColor;
QColor m_bgColor;
int m_dimBrightThreshold;
};
52 changes: 50 additions & 2 deletions src/waveform/renderers/waveformwidgetrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ WaveformWidgetRenderer::WaveformWidgetRenderer(const QString& group)
m_pTrackSamplesControlObject(nullptr),
m_trackSamples(0.0),
m_scaleFactor(1.0),
m_playMarkerPosition(s_defaultPlayMarkerPosition) {
m_playMarkerPosition(s_defaultPlayMarkerPosition),
m_passthroughEnabled(false) {
//qDebug() << "WaveformWidgetRenderer";

#ifdef WAVEFORMWIDGETRENDERER_DEBUG
Expand Down Expand Up @@ -104,6 +105,11 @@ bool WaveformWidgetRenderer::init() {
}

void WaveformWidgetRenderer::onPreRender(VSyncThread* vsyncThread) {
if (m_passthroughEnabled) {
m_playPos = -1; // disables renderers in draw()
return;
}

// For a valid track to render we need
m_trackSamples = static_cast<int>(m_pTrackSamplesControlObject->get());
if (m_trackSamples <= 0) {
Expand Down Expand Up @@ -183,12 +189,15 @@ void WaveformWidgetRenderer::draw(QPainter* painter, QPaintEvent* event) {
//timer.start();

// not ready to display need to wait until track initialization is done
// draw only first is stack (background)
// draw only first in stack (background)
int stackSize = m_rendererStack.size();
if (m_trackSamples <= 0.0 || m_playPos == -1) {
if (stackSize) {
m_rendererStack.at(0)->draw(painter, event);
}
if (m_passthroughEnabled) {
drawPassthroughLabel(painter);
}
return;
} else {
for (int i = 0; i < stackSize; i++) {
Expand Down Expand Up @@ -307,6 +316,44 @@ void WaveformWidgetRenderer::drawTriangle(QPainter* painter,
painter->fillPath(triangle, fillColor);
}

void WaveformWidgetRenderer::drawPassthroughLabel(QPainter* painter) {
QFont font;
font.setFamily("Open Sans"); // default label font
// Make the label always fit
font.setPixelSize(math_min(25, int(m_height * 0.8)));
font.setWeight(75); // bold
font.setItalic(false);

QString label = QObject::tr("Passthrough");
QFontMetrics metrics(font);
QRect labelRect = metrics.boundingRect(label);
// Center label
labelRect.moveTo(
int(m_width / 2 - labelRect.width() / 2),
int(m_height / 2 - labelRect.height() / 2));

// Draw text
painter->setBrush(QBrush(QColor(0, 0, 0, 0)));
painter->setFont(font);
painter->setPen(m_passthroughLabelColor);
painter->drawText(labelRect, Qt::AlignCenter, label);
}

void WaveformWidgetRenderer::setPassThroughEnabled(bool enabled) {
m_passthroughEnabled = enabled;
// Nothing to do if passthrough is disabled
if (!enabled) {
return;
}
// If passthrough is activated while no track has been loaded previously mark
// the renderer state dirty in order trigger the render process. This is only
// required for the background renderer since that's the only one that'll
// be processed if passtrhough is active.
if (m_rendererStack.size()) {
m_rendererStack[0]->setDirty(true);
}
}

void WaveformWidgetRenderer::resize(int width, int height, float devicePixelRatio) {
m_width = width;
m_height = height;
Expand Down Expand Up @@ -338,6 +385,7 @@ void WaveformWidgetRenderer::setup(
m_rendererStack[i]->setScaleFactor(m_scaleFactor);
m_rendererStack[i]->setup(node, context);
}
m_passthroughLabelColor = m_colors.getPassthroughLabelColor();
}

void WaveformWidgetRenderer::setZoom(double zoom) {
Expand Down
5 changes: 5 additions & 0 deletions src/waveform/renderers/waveformwidgetrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ class WaveformWidgetRenderer {
m_playMarkerPosition = newPos;
}

void setPassThroughEnabled(bool enabled);

protected:
const QString m_group;
TrackPointer m_pTrack;
Expand All @@ -163,6 +165,7 @@ class WaveformWidgetRenderer {
int m_width;
float m_devicePixelRatio;
WaveformSignalColors m_colors;
QColor m_passthroughLabelColor;

double m_firstDisplayedPosition;
double m_lastDisplayedPosition;
Expand Down Expand Up @@ -210,4 +213,6 @@ class WaveformWidgetRenderer {
QPointF p1,
QPointF p2,
QPointF p3);
void drawPassthroughLabel(QPainter* painter);
bool m_passthroughEnabled;
};
17 changes: 17 additions & 0 deletions src/widget/wwaveformviewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ WWaveformViewer::WWaveformViewer(
m_pWheel = new ControlProxy(
group, "wheel", this, ControlFlag::NoAssertIfMissing);
m_pPlayEnabled = new ControlProxy(group, "play", this, ControlFlag::NoAssertIfMissing);
m_pPassthroughEnabled = new ControlProxy(group, "passthrough");
m_pPassthroughEnabled->connectValueChanged(this,
&WWaveformViewer::passthroughChanged,
Qt::DirectConnection);

setAttribute(Qt::WA_OpaquePaintEvent);
setFocusPolicy(Qt::NoFocus);
Expand Down Expand Up @@ -263,6 +267,19 @@ void WWaveformViewer::setWaveformWidget(WaveformWidgetAbstract* waveformWidget)
QWidget* pWidget = m_waveformWidget->getWidget();
connect(pWidget, &QWidget::destroyed, this, &WWaveformViewer::slotWidgetDead);
m_waveformWidget->getWidget()->setMouseTracking(true);
// Make connection to show "Passthrough" label on the waveform, except for
// "Empty" waveform type
if (m_waveformWidget->getType() == WaveformWidgetType::EmptyWaveform) {
return;
}
connect(this,
&WWaveformViewer::passthroughChanged,
this,
[this](double value) {
m_waveformWidget->setPassThroughEnabled(value > 0);
});
// Make sure the label is shown after the waveform type was changed
emit passthroughChanged(m_pPassthroughEnabled->get() > 0);
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/widget/wwaveformviewer.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class WWaveformViewer : public WWidget, public TrackDropTarget {
signals:
void trackDropped(const QString& filename, const QString& group) override;
void cloneDeck(const QString& sourceGroup, const QString& targetGroup) override;
void passthroughChanged(double value);

public slots:
void slotTrackLoaded(TrackPointer track);
Expand Down Expand Up @@ -77,6 +78,7 @@ class WWaveformViewer : public WWidget, public TrackDropTarget {
ControlProxy* m_pScratchPosition;
ControlProxy* m_pWheel;
ControlProxy* m_pPlayEnabled;
ControlProxy* m_pPassthroughEnabled;
bool m_bScratching;
bool m_bBending;
QPoint m_mouseAnchor;
Expand Down

0 comments on commit b9343db

Please sign in to comment.