Skip to content

Commit

Permalink
fixup! feat: add scrolling waveform in QML using scenegraph
Browse files Browse the repository at this point in the history
  • Loading branch information
acolombier committed Dec 1, 2024
1 parent ad11a74 commit d424088
Show file tree
Hide file tree
Showing 10 changed files with 118 additions and 10 deletions.
48 changes: 48 additions & 0 deletions res/qml/Deck.qml
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,54 @@ Item {
activeColor: Theme.deckActiveColor
}

Row {
anchors.left: playButton.right
anchors.leftMargin: 10
anchors.bottom: playButton.bottom
anchors.topMargin: 5
spacing: -1

Skin.IntroOutroButton {
keyPrefix: "intro_start"
group: root.group

text: "Intro\nStart"

width: playButton.height * 2 - 1
height: playButton.height
}

Skin.IntroOutroButton {
keyPrefix: "intro_end"
group: root.group

text: "Intro\nEnd"

width: playButton.height * 2 - 1
height: playButton.height
}

Skin.IntroOutroButton {
keyPrefix: "outro_start"
group: root.group

text: "Outro\nStart"

width: playButton.height * 2 - 1
height: playButton.height
}

Skin.IntroOutroButton {
keyPrefix: "outro_end"
group: root.group

text: "Outro\nEnd"

width: playButton.height * 2 - 1
height: playButton.height
}
}

Row {
anchors.left: cueButton.right
anchors.top: parent.top
Expand Down
45 changes: 45 additions & 0 deletions res/qml/IntroOutroButton.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import "." as Skin
import Mixxx 1.0 as Mixxx
import QtQuick 2.12

import "Theme"

Skin.Button {
id: root

required property string keyPrefix
required property string group

activeColor: Theme.deckActiveColor
highlight: enabledControl.value

Mixxx.ControlProxy {
id: control

group: root.group
key: `${root.keyPrefix}_activate`
value: root.down
}

Mixxx.ControlProxy {
id: enabledControl

group: root.group
key: `${root.keyPrefix}_enabled`
}

Mixxx.ControlProxy {
id: cleanControl

group: root.group
key: `${root.keyPrefix}_clear`
value: mousearea.pressed && enabledControl.value
}

MouseArea {
id: mousearea

anchors.fill: parent
acceptedButtons: Qt.RightButton
}
}
3 changes: 2 additions & 1 deletion res/qml/WaveformDisplay.qml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ Item {
}
Mixxx.WaveformMark {
control: "intro_start_position"
text: ''
align: 'top|right'
color: 'blue'
textColor: '#FFFFFF'
Expand All @@ -130,6 +131,7 @@ Item {
}
Mixxx.WaveformMark {
control: "outro_end_position"
text: ''
align: 'top|left'
color: 'blue'
textColor: '#FFFFFF'
Expand Down Expand Up @@ -171,7 +173,6 @@ Item {
group: root.group
key: "waveform_zoom"
}
readonly property real effectiveZoomFactor: (1 / rateRatioControl.value) * (100 / zoomControl.value)

MouseArea {
property int mouseStatus: WaveformDisplay.MouseStatus.Normal
Expand Down
5 changes: 3 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ constexpr int kPixmapCacheLimitAt100PercentZoom = 32 * 1024; // 32 MByte
int runMixxx(MixxxApplication* pApp, const CmdlineArgs& args) {
CmdlineArgs::Instance().parseForUserFeedback();

const auto pCoreServices = std::make_shared<mixxx::CoreServices>(args, pApp);
auto pCoreServices = std::make_shared<mixxx::CoreServices>(args, pApp);

int exitCode;
#ifdef MIXXX_USE_QML
Expand All @@ -66,7 +66,7 @@ int runMixxx(MixxxApplication* pApp, const CmdlineArgs& args) {
auto pVisuals = std::make_unique<VisualsManager>();
WaveformWidgetFactory::createInstance(); // takes a long time
WaveformWidgetFactory::instance()->setConfig(pCoreServices->getSettings());
WaveformWidgetFactory::instance()->startVSync(pTick.get(), pVisuals.get());
WaveformWidgetFactory::instance()->startVSync(pTick.get(), pVisuals.get(), true);
{
mixxx::qml::QmlApplication qmlApplication(pApp, pCoreServices);
const QStringList visualGroups =
Expand All @@ -85,6 +85,7 @@ int runMixxx(MixxxApplication* pApp, const CmdlineArgs& args) {
});
exitCode = pApp->exec();
}
pCoreServices.reset();
WaveformWidgetFactory::destroy();
} else
#endif
Expand Down
2 changes: 1 addition & 1 deletion src/mixxxmainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ void MixxxMainWindow::initialize() {

WaveformWidgetFactory::createInstance(); // takes a long time
WaveformWidgetFactory::instance()->setConfig(m_pCoreServices->getSettings());
WaveformWidgetFactory::instance()->startVSync(m_pGuiTick, m_pVisualsManager);
WaveformWidgetFactory::instance()->startVSync(m_pGuiTick, m_pVisualsManager, false);

connect(this,
&MixxxMainWindow::skinLoaded,
Expand Down
9 changes: 7 additions & 2 deletions src/qml/qmlwaveformdisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ QmlWaveformDisplay::QmlWaveformDisplay(QQuickItem* parent)
this,
&QmlWaveformDisplay::slotWindowChanged,
Qt::DirectConnection);
slotWindowChanged(window());
}

QmlWaveformDisplay::~QmlWaveformDisplay() {
Expand Down Expand Up @@ -150,8 +151,12 @@ QSGNode* QmlWaveformDisplay::updatePaintNode(QSGNode* node, UpdatePaintNodeData*
boundingRect().height());
}

m_waveformRenderMark->update();
m_waveformRenderMarkRange->update();
if (m_waveformRenderMark != nullptr) {
m_waveformRenderMark->update();
}
if (m_waveformRenderMarkRange != nullptr) {
m_waveformRenderMarkRange->update();
}

onPreRender(this);
bgNode->markDirty(QSGNode::DirtyForceUpdate);
Expand Down
3 changes: 3 additions & 0 deletions src/waveform/renderers/allshader/waveformrendermark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ allshader::WaveformRenderMark::WaveformRenderMark(
}
}

#ifdef __RENDERGRAPH_IS_SCENEGRAPH
void allshader::WaveformRenderMark::setup(const QColor& fgPlayColor,
const QColor& bgPlayColor,
bool untilMarkShowBeats,
Expand All @@ -192,6 +193,8 @@ void allshader::WaveformRenderMark::setup(const QColor& fgPlayColor,
m_untilMarkAlign = untilMarkAlign;
m_untilMarkTextSize = untilMarkTextSize;
}
#endif

void allshader::WaveformRenderMark::draw(QPainter* painter, QPaintEvent* event) {
Q_UNUSED(painter);
Q_UNUSED(event);
Expand Down
2 changes: 2 additions & 0 deletions src/waveform/renderers/allshader/waveformrendermark.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase,
// Pure virtual from WaveformRendererAbstract, not used
void draw(QPainter* painter, QPaintEvent* event) override final;

#ifdef __RENDERGRAPH_IS_SCENEGRAPH
void setup(const QColor& fgPlayColor,
const QColor& bgPlayColor,
bool untilMarkShowBeats,
bool untilMarkShowTime,
Qt::Alignment untilMarkAlign,
int untilMarkTextSize);
#endif

bool init() override;

Expand Down
9 changes: 6 additions & 3 deletions src/waveform/waveformwidgetfactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1168,9 +1168,12 @@ int WaveformWidgetFactory::findIndexOf(WWaveformViewer* viewer) const {
return -1;
}

void WaveformWidgetFactory::startVSync(GuiTick* pGuiTick, VisualsManager* pVisualsManager) {
const auto vSyncMode = static_cast<VSyncThread::VSyncMode>(
m_config->getValue(ConfigKey("[Waveform]", "VSync"), 0));
void WaveformWidgetFactory::startVSync(
GuiTick* pGuiTick, VisualsManager* pVisualsManager, bool useQML) {
const auto vSyncMode = useQML
? VSyncThread::ST_TIMER
: static_cast<VSyncThread::VSyncMode>(
m_config->getValue(ConfigKey("[Waveform]", "VSync"), 0));

m_pGuiTick = pGuiTick;
m_pVisualsManager = pVisualsManager;
Expand Down
2 changes: 1 addition & 1 deletion src/waveform/waveformwidgetfactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ class WaveformWidgetFactory : public QObject, public Singleton<WaveformWidgetFac
void addVuMeter(WVuMeterLegacy* pWidget);
void addVuMeter(WVuMeterBase* pWidget);

void startVSync(GuiTick* pGuiTick, VisualsManager* pVisualsManager);
void startVSync(GuiTick* pGuiTick, VisualsManager* pVisualsManager, bool useQML);

void setPlayMarkerPosition(double position);
double getPlayMarkerPosition() const { return m_playMarkerPosition; }
Expand Down

0 comments on commit d424088

Please sign in to comment.