55#include < memory>
66
77#include " control/controlproxy.h"
8+ #include " engine/engine.h"
89#include " rendergraph/geometry.h"
910#include " rendergraph/material/rgbamaterial.h"
1011#include " rendergraph/vertexupdaters/rgbavertexupdater.h"
12+ #include " track/track.h"
1113#include " util/colorcomponents.h"
1214#include " waveform/renderers/waveformwidgetrenderer.h"
15+ #include " waveform/waveform.h"
1316#include " waveform/waveformwidgetfactory.h"
1417#include " widget/wskincolor.h"
1518
@@ -88,6 +91,12 @@ bool WaveformRendererSlipMode::preprocessInner() {
8891 return false ;
8992 }
9093
94+ TrackPointer pTrack = m_waveformRenderer->getTrackInfo ();
95+ const bool isStemTrack = pTrack && pTrack->hasStem () &&
96+ pTrack->getWaveform () && pTrack->getWaveform ()->hasStem ();
97+ const bool splitStemTracks = isStemTrack &&
98+ WaveformWidgetFactory::instance ()->isStemSplitTracks ();
99+
91100 const int elapsed = m_timer.elapsed ().toIntegerMillis () % kBlinkingPeriodMillis ;
92101
93102 const float blinkIntensity =
@@ -99,38 +108,55 @@ bool WaveformRendererSlipMode::preprocessInner() {
99108
100109 const float posx1 = 0 .f ;
101110 const float posx2 = m_waveformRenderer->getLength ();
102- const float posy1 = 0 .f ;
103- const float posy2 = m_waveformRenderer->getBreadth () / 2 .f ;
111+ const float breadth = m_waveformRenderer->getBreadth ();
112+
113+ const int numBoxes = splitStemTracks ? mixxx::kMaxSupportedStems : 1 ;
114+ const float boxBreadth = splitStemTracks
115+ ? breadth / static_cast <float >(mixxx::kMaxSupportedStems )
116+ : breadth;
104117
105- const float sideBorderOutlineSide = m_slipBorderTopOutlineSize;
118+ const float topOutlineSize = splitStemTracks
119+ ? m_slipBorderTopOutlineSize / static_cast <float >(mixxx::kMaxSupportedStems )
120+ : m_slipBorderTopOutlineSize;
121+ const float bottomOutlineSize = splitStemTracks
122+ ? m_slipBorderBottomOutlineSize / static_cast <float >(mixxx::kMaxSupportedStems )
123+ : m_slipBorderBottomOutlineSize;
124+ const float sideBorderOutlineSide = topOutlineSize;
106125
107126 const QVector4D bgColor{0 .f , 0 .f , 0 .f , 1 .f };
108127 const QVector4D borderColor{m_color.redF (), m_color.greenF (), m_color.blueF (), alpha};
109128 const QVector4D borderColor0{m_color.redF (), m_color.greenF (), m_color.blueF (), 0 .f };
110129
111- const int numVerticesPerLine = 6 ; // 2 triangles
112- geometry ().allocate (numVerticesPerLine * 5 ); // border on 4 sides + bgColor filler in center
130+ const int numVerticesPerLine = 6 ; // 2 triangles
131+ geometry ().allocate (numVerticesPerLine * 5 *
132+ numBoxes); // border on 4 sides + bgColor filler in center
113133
114134 RGBAVertexUpdater vertexUpdater{geometry ().vertexDataAs <Geometry::RGBAColoredPoint2D>()};
115135
116- vertexUpdater.addRectangle (
117- {posx1, posy1},
118- {posx2, posy2},
119- bgColor);
120-
121- vertexUpdater.addRectangle (
122- {posx1, posy1}, {posx2, posy1 + m_slipBorderTopOutlineSize}, borderColor);
123- vertexUpdater.addRectangle ({posx1, posy1 + m_slipBorderTopOutlineSize},
124- {posx1 + sideBorderOutlineSide,
125- posy2},
126- borderColor);
127- vertexUpdater.addRectangle ({posx2 - sideBorderOutlineSide, posy1 + m_slipBorderTopOutlineSize},
128- {posx2, posy2},
129- borderColor);
130- vertexUpdater.addRectangleVGradient ({posx1, posy2},
131- {posx2, posy2 + m_slipBorderBottomOutlineSize},
132- borderColor,
133- borderColor0);
136+ for (int boxIdx = 0 ; boxIdx < numBoxes; ++boxIdx) {
137+ const float posy1 = boxIdx * boxBreadth;
138+ const float posy2 = posy1 + boxBreadth / 2 .f ;
139+
140+ vertexUpdater.addRectangle (
141+ {posx1, posy1},
142+ {posx2, posy2},
143+ bgColor);
144+
145+ vertexUpdater.addRectangle (
146+ {posx1, posy1}, {posx2, posy1 + topOutlineSize}, borderColor);
147+ vertexUpdater.addRectangle ({posx1, posy1 + topOutlineSize},
148+ {posx1 + sideBorderOutlineSide,
149+ posy2},
150+ borderColor);
151+ vertexUpdater.addRectangle ({posx2 - sideBorderOutlineSide, posy1 + topOutlineSize},
152+ {posx2, posy2},
153+ borderColor);
154+ vertexUpdater.addRectangleVGradient ({posx1, posy2},
155+ {posx2, posy2 + bottomOutlineSize},
156+ borderColor,
157+ borderColor0);
158+ }
159+
134160 markDirtyGeometry ();
135161 markDirtyMaterial ();
136162
0 commit comments