From f788f3d7eb3388c30020819c0d369eec7cf2910c Mon Sep 17 00:00:00 2001 From: Antoine C Date: Tue, 9 Jan 2024 12:02:19 +0000 Subject: [PATCH] QML: Support for waveform preferences --- res/qml/WaveformOverview.qml | 4 + res/qml/WaveformRow.qml | 15 +- res/qml/WaveformShader.qml | 22 +- src/preferences/dialog/dlgpreferences.cpp | 25 +- src/preferences/dialog/dlgprefwaveform.cpp | 357 +++++++++++++++---- src/preferences/dialog/dlgprefwaveform.h | 3 + src/preferences/dialog/dlgprefwaveformdlg.ui | 28 +- src/qml/qmlconfigproxy.cpp | 16 + src/qml/qmlconfigproxy.h | 4 + src/qml/qmlwaveformoverview.cpp | 24 +- src/qml/qmlwaveformoverview.h | 13 + 11 files changed, 410 insertions(+), 101 deletions(-) diff --git a/res/qml/WaveformOverview.qml b/res/qml/WaveformOverview.qml index 6ab3e6b5f66d..050b3f3a6cd2 100644 --- a/res/qml/WaveformOverview.qml +++ b/res/qml/WaveformOverview.qml @@ -124,6 +124,10 @@ Item { colorHigh: Theme.white colorMid: Theme.blue colorLow: Theme.green + gainHigh: Mixxx.Config.getDouble("[Waveform]", "VisualGain_3", 1.0) + gainAll: Mixxx.Config.getDouble("[Waveform]", "VisualGain_0", 1.0) + gainLow: Mixxx.Config.getDouble("[Waveform]", "VisualGain_1", 1.0) + gainMid: Mixxx.Config.getDouble("[Waveform]", "VisualGain_2", 1.0) group: root.group } } diff --git a/res/qml/WaveformRow.qml b/res/qml/WaveformRow.qml index ec69f3e23ed0..8848ac2d2c27 100644 --- a/res/qml/WaveformRow.qml +++ b/res/qml/WaveformRow.qml @@ -118,11 +118,14 @@ Item { Item { id: waveform - property real effectiveZoomFactor: rateRatioControl.value * zoomControl.value * 100 + property real constantRate: Mixxx.Config.getBool("[Waveform]", "ConstantRate", true) + property real screenPos: Mixxx.Config.getDouble("[Waveform]", "PlayMarkerPosition", 0.5) + + property real effectiveZoomFactor: (waveform.constantRate ? rateRatioControl.value : 1.0) * zoomControl.value * 100 width: waveformContainer.duration * effectiveZoomFactor height: parent.height - x: 0.5 * waveformContainer.width - playPositionControl.value * width + x: screenPos * waveformContainer.width - playPositionControl.value * width visible: root.deckPlayer.isLoaded WaveformShader { @@ -191,11 +194,13 @@ Item { Repeater { model: root.deckPlayer.beatsModel + property real alpha: Mixxx.Config.getInt("[Waveform]", "beatGridAlpha", 90) / 100 + Rectangle { width: 1 height: waveform.height x: (framePosition * 2 / samplesControl.value) * waveform.width - color: Theme.waveformBeatColor + color: Qt.alpha(Theme.waveformBeatColor, alpha) } } @@ -273,7 +278,9 @@ Item { ShapePath { id: playMarkerPath - startX: parent.width / 2 + property real screenPos: Mixxx.Config.getDouble("[Waveform]", "PlayMarkerPosition", 0.5) + + startX: parent.width * playMarkerPath.screenPos startY: 0 strokeColor: Theme.waveformCursorColor strokeWidth: 1 diff --git a/res/qml/WaveformShader.qml b/res/qml/WaveformShader.qml index 72bf1c17116e..f3e0cbc8913f 100644 --- a/res/qml/WaveformShader.qml +++ b/res/qml/WaveformShader.qml @@ -16,19 +16,29 @@ ShaderEffect { property color highColor: "#0000FF" property color midColor: "#00FF00" property color lowColor: "#FF0000" - property real highGain: filterWaveformEnableControl.value ? (filterHighKillControl.value ? 0 : filterHighControl.value) : 1 - property real midGain: filterWaveformEnableControl.value ? (filterMidKillControl.value ? 0 : filterMidControl.value) : 1 - property real lowGain: filterWaveformEnableControl.value ? (filterLowKillControl.value ? 0 : filterLowControl.value) : 1 - property real allGain: pregainControl.value + + property var visualGainAll: Mixxx.Config.getDouble("[Waveform]", "VisualGain_0", 1.0) + property var visualGainLow: Mixxx.Config.getDouble("[Waveform]", "VisualGain_1", 1.0) + property var visualGainMid: Mixxx.Config.getDouble("[Waveform]", "VisualGain_2", 1.0) + property var visualGainHigh: Mixxx.Config.getDouble("[Waveform]", "VisualGain_3", 1.0) + + property real highGain: (filterWaveformEnableControl.value ? (filterHighKillControl.value ? 0 : filterHighControl.value) : 1) * visualGainHigh + property real midGain: (filterWaveformEnableControl.value ? (filterMidKillControl.value ? 0 : filterMidControl.value) : 1) * visualGainMid + property real lowGain: (filterWaveformEnableControl.value ? (filterLowKillControl.value ? 0 : filterLowControl.value) : 1) * visualGainLow + property real allGain: gainControl.value * 2.0 * visualGainAll // See WaveformWidgetRenderer::getGain() + + Component.onCompleted: () => { + console.warn(`visualGainAll: ${visualGainAll}, visualGainLow: ${visualGainLow}, visualGainMid: ${visualGainMid}, visualGainHigh: ${visualGainHigh}`) + } property Image waveformTexture fragmentShader: "qrc:/shaders/rgbsignal_qml.frag.qsb" Mixxx.ControlProxy { - id: pregainControl + id: gainControl group: root.group - key: "pregain" + key: "total_gain" } Mixxx.ControlProxy { diff --git a/src/preferences/dialog/dlgpreferences.cpp b/src/preferences/dialog/dlgpreferences.cpp index 20da1402aa37..ad18d2b214d7 100644 --- a/src/preferences/dialog/dlgpreferences.cpp +++ b/src/preferences/dialog/dlgpreferences.cpp @@ -152,20 +152,17 @@ DlgPreferences::DlgPreferences( tr("Interface"), "ic_preferences_interface.svg"); - // ugly proxy for determining whether this is being instantiated for QML or legacy QWidgets GUI - if (pSkinLoader) { - DlgPrefWaveform* pWaveformPage = new DlgPrefWaveform(this, m_pConfig, pLibrary); - addPageWidget(PreferencesPage( - pWaveformPage, - new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type)), - tr("Waveforms"), - "ic_preferences_waveforms.svg"); - connect(pWaveformPage, - &DlgPrefWaveform::reloadUserInterface, - this, - &DlgPreferences::reloadUserInterface, - Qt::DirectConnection); - } + DlgPrefWaveform* pWaveformPage = new DlgPrefWaveform(this, m_pConfig, pLibrary); + addPageWidget(PreferencesPage( + pWaveformPage, + new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type)), + tr("Waveforms"), + "ic_preferences_waveforms.svg"); + connect(pWaveformPage, + &DlgPrefWaveform::reloadUserInterface, + this, + &DlgPreferences::reloadUserInterface, + Qt::DirectConnection); addPageWidget(PreferencesPage( new DlgPrefColors(this, m_pConfig, pLibrary), diff --git a/src/preferences/dialog/dlgprefwaveform.cpp b/src/preferences/dialog/dlgprefwaveform.cpp index 5e43e783d6a0..909466311365 100644 --- a/src/preferences/dialog/dlgprefwaveform.cpp +++ b/src/preferences/dialog/dlgprefwaveform.cpp @@ -7,6 +7,9 @@ #include "util/db/dbconnectionpooled.h" #include "waveform/renderers/waveformwidgetrenderer.h" #include "waveform/waveformwidgetfactory.h" +#ifdef MIXXX_USE_QML +#include "util/cmdlineargs.h" +#endif DlgPrefWaveform::DlgPrefWaveform( QWidget* pParent, @@ -18,18 +21,30 @@ DlgPrefWaveform::DlgPrefWaveform( setupUi(this); // Waveform overview init - waveformOverviewComboBox->addItem(tr("Filtered")); // "0" - waveformOverviewComboBox->addItem(tr("HSV")); // "1" - waveformOverviewComboBox->addItem(tr("RGB")); // "2" - - // Populate waveform options. - WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); - // We assume that the original type list order remains constant. - // We will use the type index later on to set waveform types and to - // update the combobox. - QVector handles = factory->getAvailableTypes(); - for (int i = 0; i < handles.size(); ++i) { - waveformTypeComboBox->addItem(handles[i].getDisplayName(), i); +#ifdef MIXXX_USE_QML + if (!CmdlineArgs::Instance().isQml()) { + waveformOverviewComboBox->addItem(tr("Filtered"), 0); // "0" + waveformOverviewComboBox->addItem(tr("HSV"), 1); // "1" + } +#endif + waveformOverviewComboBox->addItem(tr("RGB"), 2); // "2" + +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + waveformTypeComboBox->addItem("RGB (GLSL)", 0); + } else +#endif + { + // Populate waveform options. + WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); + DEBUG_ASSERT(factory); + // We assume that the original type list order remains constant. + // We will use the type index later on to set waveform types and to + // update the combobox. + QVector handles = factory->getAvailableTypes(); + for (int i = 0; i < handles.size(); ++i) { + waveformTypeComboBox->addItem(handles[i].getDisplayName(), i); + } } // Sort the combobox items alphabetically waveformTypeComboBox->model()->sort(0); @@ -95,6 +110,10 @@ DlgPrefWaveform::DlgPrefWaveform( &QCheckBox::clicked, this, &DlgPrefWaveform::slotSetZoomSynchronization); + connect(constantScrollingRateCheckBox, + &QCheckBox::clicked, + this, + &DlgPrefWaveform::slotSetConstantScrollingRate); connect(allVisualGain, QOverload::of(&QDoubleSpinBox::valueChanged), this, @@ -115,10 +134,34 @@ DlgPrefWaveform::DlgPrefWaveform( &QCheckBox::toggled, this, &DlgPrefWaveform::slotSetNormalizeOverview); - connect(factory, - &WaveformWidgetFactory::waveformMeasured, - this, - &DlgPrefWaveform::slotWaveformMeasured); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + frameRateAverage->hide(); + frameRateAverageLabel->hide(); + frameRateSpinBox->hide(); + frameRateSlider->hide(); + frameRateLabel->hide(); + + // TODO to remove when end of track CO is available on QML + endOfTrackWarningTimeLabel->setEnabled(false); + endOfTrackWarningTimeSlider->setEnabled(false); + endOfTrackWarningTimeSpinBox->setEnabled(false); + endOfTrackWarningTimeSlider->setToolTip( + endOfTrackWarningTimeSlider->toolTip() + + tr(" Not yet available in the new interface.")); + endOfTrackWarningTimeSpinBox->setToolTip( + endOfTrackWarningTimeSpinBox->toolTip() + + tr(" Not yet available in the new interface.")); + } else +#endif + { + WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); + DEBUG_ASSERT(factory); + connect(factory, + &WaveformWidgetFactory::waveformMeasured, + this, + &DlgPrefWaveform::slotWaveformMeasured); + } connect(waveformOverviewComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, @@ -140,38 +183,104 @@ DlgPrefWaveform::~DlgPrefWaveform() { void DlgPrefWaveform::slotUpdate() { WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); - - if (factory->isOpenGlAvailable() || factory->isOpenGlesAvailable()) { - openGlStatusIcon->setText(factory->getOpenGLVersion()); - } else { - openGlStatusIcon->setText(tr("OpenGL not available") + ": " + factory->getOpenGLVersion()); + int currentIndex = -1; + +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + openGlStatusLabel->hide(); + openGlStatusIcon->hide(); + currentIndex = m_pConfig->getValue(ConfigKey("[Waveform]", "WaveformTypeQml"), 0); + } else +#endif + { + if (factory->isOpenGlAvailable() || factory->isOpenGlesAvailable()) { + openGlStatusIcon->setText(factory->getOpenGLVersion()); + } else { + openGlStatusIcon->setText(tr("OpenGL not available") + ": " + + factory->getOpenGLVersion()); + } + + // The combobox holds a list of [handle name, handle index] + currentIndex = waveformTypeComboBox->findData(factory->getHandleIndex()); } - - // The combobox holds a list of [handle name, handle index] - int currentIndex = waveformTypeComboBox->findData(factory->getHandleIndex()); if (currentIndex != -1 && waveformTypeComboBox->currentIndex() != currentIndex) { waveformTypeComboBox->setCurrentIndex(currentIndex); } - frameRateSpinBox->setValue(factory->getFrameRate()); - frameRateSlider->setValue(factory->getFrameRate()); - endOfTrackWarningTimeSpinBox->setValue(factory->getEndOfTrackWarningTime()); - endOfTrackWarningTimeSlider->setValue(factory->getEndOfTrackWarningTime()); - synchronizeZoomCheckBox->setChecked(factory->isZoomSync()); - allVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::All)); - lowVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::Low)); - midVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::Mid)); - highVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::High)); - normalizeOverviewCheckBox->setChecked(factory->isOverviewNormalized()); - // Round zoom to int to get a default zoom index. - defaultZoomComboBox->setCurrentIndex(static_cast(factory->getDefaultZoom()) - 1); - playMarkerPositionSlider->setValue(static_cast(factory->getPlayMarkerPosition() * 100)); - beatGridAlphaSpinBox->setValue(factory->getBeatGridAlpha()); - beatGridAlphaSlider->setValue(factory->getBeatGridAlpha()); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + // m_config->setValue(ConfigKey("[Waveform]", "WaveformTypeQml") + int aEndOfTrackWarning = m_pConfig->getValue( + ConfigKey("[Waveform]", "EndOfTrackWarningTime"), 30); + endOfTrackWarningTimeSpinBox->setValue(aEndOfTrackWarning); + endOfTrackWarningTimeSlider->setValue(aEndOfTrackWarning); + + synchronizeZoomCheckBox->setChecked(m_pConfig->getValue( + ConfigKey("[Waveform]", "ZoomSynchronization"), true)); + constantScrollingRateCheckBox->setChecked(m_pConfig->getValue( + ConfigKey("[Waveform]", "ConstantRate"), true)); + allVisualGain->setValue(m_pConfig->getValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::All)), + 1.0)); + lowVisualGain->setValue(m_pConfig->getValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::Low)), + 1.0)); + midVisualGain->setValue(m_pConfig->getValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::Mid)), + 1.0)); + highVisualGain->setValue(m_pConfig->getValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::High)), + 1.0)); + normalizeOverviewCheckBox->setChecked(m_pConfig->getValue( + ConfigKey("[Waveform]", "OverviewNormalized"), true)); + // Round zoom to int to get a default zoom index. + defaultZoomComboBox->setCurrentIndex( + static_cast(m_pConfig->getValue( + ConfigKey("[Waveform]", "DefaultZoom"), + WaveformWidgetRenderer::s_waveformDefaultZoom)) - + 1); + playMarkerPositionSlider->setValue(static_cast( + m_pConfig->getValue( + ConfigKey("[Waveform]", "PlayMarkerPosition"), + WaveformWidgetRenderer::s_defaultPlayMarkerPosition) * + 100.0)); + + int aBeatGridAlpha = m_pConfig->getValue(ConfigKey("[Waveform]", "beatGridAlpha"), 90); + beatGridAlphaSpinBox->setValue(aBeatGridAlpha); + beatGridAlphaSlider->setValue(aBeatGridAlpha); + } else +#endif + { + frameRateSpinBox->setValue(factory->getFrameRate()); + frameRateSlider->setValue(factory->getFrameRate()); + endOfTrackWarningTimeSpinBox->setValue(factory->getEndOfTrackWarningTime()); + endOfTrackWarningTimeSlider->setValue(factory->getEndOfTrackWarningTime()); + synchronizeZoomCheckBox->setChecked(factory->isZoomSync()); + allVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::All)); + lowVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::Low)); + midVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::Mid)); + highVisualGain->setValue(factory->getVisualGain(WaveformWidgetFactory::High)); + normalizeOverviewCheckBox->setChecked(factory->isOverviewNormalized()); + // Round zoom to int to get a default zoom index. + defaultZoomComboBox->setCurrentIndex(static_cast(factory->getDefaultZoom()) - 1); + playMarkerPositionSlider->setValue( + static_cast(factory->getPlayMarkerPosition() * 100)); + beatGridAlphaSpinBox->setValue(factory->getBeatGridAlpha()); + beatGridAlphaSlider->setValue(factory->getBeatGridAlpha()); + } // By default we set RGB woverview = "2" - int overviewType = m_pConfig->getValue( - ConfigKey("[Waveform]","WaveformOverviewType"), 2); + int overviewType = waveformOverviewComboBox->findData(m_pConfig->getValue( + ConfigKey("[Waveform]", "WaveformOverviewType"), 2)); + qDebug() << "WaveformOverviewType:" << overviewType; if (overviewType != waveformOverviewComboBox->currentIndex()) { waveformOverviewComboBox->setCurrentIndex(overviewType); } @@ -184,7 +293,10 @@ void DlgPrefWaveform::slotUpdate() { } void DlgPrefWaveform::slotApply() { - ConfigValue overviewtype = ConfigValue(waveformOverviewComboBox->currentIndex()); + ConfigValue overviewtype = ConfigValue( + waveformOverviewComboBox + ->itemData(waveformOverviewComboBox->currentIndex()) + .toInt()); if (overviewtype != m_pConfig->get(ConfigKey("[Waveform]", "WaveformOverviewType"))) { m_pConfig->set(ConfigKey("[Waveform]", "WaveformOverviewType"), overviewtype); } @@ -192,17 +304,31 @@ void DlgPrefWaveform::slotApply() { waveformSettings.setWaveformCachingEnabled(enableWaveformCaching->isChecked()); waveformSettings.setWaveformGenerationWithAnalysisEnabled( enableWaveformGenerationWithAnalysis->isChecked()); + +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + QMessageBox::information(this, + tr("Information"), + tr("Mixxx must be restarted before some of the waveform settings take effect."), + QMessageBox::Ok); + } +#endif } void DlgPrefWaveform::slotResetToDefaults() { - WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); - - // Get the default we ought to use based on whether the user has OpenGL or not. - // Select the combobox index that holds the default handle's index in data column. - int defaultIndex = waveformTypeComboBox->findData( - factory->findHandleIndexFromType(factory->autoChooseWidgetType())); - if (defaultIndex != -1 && waveformTypeComboBox->currentIndex() != defaultIndex) { - waveformTypeComboBox->setCurrentIndex(defaultIndex); +#ifdef MIXXX_USE_QML + if (!CmdlineArgs::Instance().isQml()) +#endif + { + WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); + + // Get the default we ought to use based on whether the user has OpenGL or not. + // Select the combobox index that holds the default handle's index in data column. + int defaultIndex = waveformTypeComboBox->findData( + factory->findHandleIndexFromType(factory->autoChooseWidgetType())); + if (defaultIndex != -1 && waveformTypeComboBox->currentIndex() != defaultIndex) { + waveformTypeComboBox->setCurrentIndex(defaultIndex); + } } allVisualGain->setValue(1.0); @@ -238,11 +364,23 @@ void DlgPrefWaveform::slotResetToDefaults() { } void DlgPrefWaveform::slotSetFrameRate(int frameRate) { - WaveformWidgetFactory::instance()->setFrameRate(frameRate); +#ifdef MIXXX_USE_QML + if (!CmdlineArgs::Instance().isQml()) +#endif + { + WaveformWidgetFactory::instance()->setFrameRate(frameRate); + } } void DlgPrefWaveform::slotSetWaveformEndRender(int endTime) { - WaveformWidgetFactory::instance()->setEndOfTrackWarningTime(endTime); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "EndOfTrackWarningTime"), endTime); + } else +#endif + { + WaveformWidgetFactory::instance()->setEndOfTrackWarningTime(endTime); + } } void DlgPrefWaveform::slotSetWaveformType(int index) { @@ -251,40 +389,121 @@ void DlgPrefWaveform::slotSetWaveformType(int index) { return; } int handleIndex = waveformTypeComboBox->itemData(index).toInt(); - WaveformWidgetFactory::instance()->setWidgetTypeFromHandle(handleIndex); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "WaveformTypeQml"), handleIndex); + } else +#endif + { + WaveformWidgetFactory::instance()->setWidgetTypeFromHandle(handleIndex); + } } void DlgPrefWaveform::slotSetWaveformOverviewType(int index) { - m_pConfig->set(ConfigKey("[Waveform]","WaveformOverviewType"), ConfigValue(index)); + int handleIndex = waveformOverviewComboBox->itemData(index).toInt(); + m_pConfig->set(ConfigKey("[Waveform]", "WaveformOverviewType"), ConfigValue(handleIndex)); emit reloadUserInterface(); } void DlgPrefWaveform::slotSetDefaultZoom(int index) { - WaveformWidgetFactory::instance()->setDefaultZoom(index + 1); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "DefaultZoom"), (double)index + 1.0); + } else +#endif + { + WaveformWidgetFactory::instance()->setDefaultZoom(index + 1); + } } void DlgPrefWaveform::slotSetZoomSynchronization(bool checked) { - WaveformWidgetFactory::instance()->setZoomSync(checked); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "ZoomSynchronization"), checked); + } else +#endif + { + WaveformWidgetFactory::instance()->setZoomSync(checked); + } +} + +#ifdef MIXXX_USE_QML +void DlgPrefWaveform::slotSetConstantScrollingRate(bool checked) { + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "ConstantRate"), checked); + } } +#endif void DlgPrefWaveform::slotSetVisualGainAll(double gain) { - WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::All,gain); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::All)), + gain); + } else +#endif + { + WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::All, gain); + } } void DlgPrefWaveform::slotSetVisualGainLow(double gain) { - WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::Low,gain); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::Low)), + gain); + } else +#endif + { + WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::Low, gain); + } } void DlgPrefWaveform::slotSetVisualGainMid(double gain) { - WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::Mid,gain); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::Mid)), + gain); + } else +#endif + { + WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::Mid, gain); + } } void DlgPrefWaveform::slotSetVisualGainHigh(double gain) { - WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::High,gain); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue( + ConfigKey("[Waveform]", + "VisualGain_" + + QString::number(WaveformWidgetFactory::High)), + gain); + } else +#endif + { + WaveformWidgetFactory::instance()->setVisualGain(WaveformWidgetFactory::High, gain); + } } void DlgPrefWaveform::slotSetNormalizeOverview(bool normalize) { - WaveformWidgetFactory::instance()->setOverviewNormalized(normalize); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "OverviewNormalized"), normalize); + } else +#endif + { + WaveformWidgetFactory::instance()->setOverviewNormalized(normalize); + } } void DlgPrefWaveform::slotWaveformMeasured(float frameRate, int droppedFrames) { @@ -303,13 +522,25 @@ void DlgPrefWaveform::slotClearCachedWaveforms() { void DlgPrefWaveform::slotSetBeatGridAlpha(int alpha) { m_pConfig->setValue(ConfigKey("[Waveform]", "beatGridAlpha"), alpha); - WaveformWidgetFactory::instance()->setDisplayBeatGridAlpha(alpha); +#ifdef MIXXX_USE_QML + if (!CmdlineArgs::Instance().isQml()) +#endif + { + WaveformWidgetFactory::instance()->setDisplayBeatGridAlpha(alpha); + } } void DlgPrefWaveform::slotSetPlayMarkerPosition(int position) { // QSlider works with integer values, so divide the percentage given by the // slider value by 100 to get a fraction of the waveform width. - WaveformWidgetFactory::instance()->setPlayMarkerPosition(position / 100.0); +#ifdef MIXXX_USE_QML + if (CmdlineArgs::Instance().isQml()) { + m_pConfig->setValue(ConfigKey("[Waveform]", "PlayMarkerPosition"), position / 100.0); + } else +#endif + { + WaveformWidgetFactory::instance()->setPlayMarkerPosition(position / 100.0); + } } void DlgPrefWaveform::calculateCachedWaveformDiskUsage() { diff --git a/src/preferences/dialog/dlgprefwaveform.h b/src/preferences/dialog/dlgprefwaveform.h index 4f21b490b57e..3b23f3caf389 100644 --- a/src/preferences/dialog/dlgprefwaveform.h +++ b/src/preferences/dialog/dlgprefwaveform.h @@ -29,6 +29,9 @@ class DlgPrefWaveform : public DlgPreferencePage, public Ui::DlgPrefWaveformDlg void slotSetWaveformOverviewType(int index); void slotSetDefaultZoom(int index); void slotSetZoomSynchronization(bool checked); +#ifdef MIXXX_USE_QML + void slotSetConstantScrollingRate(bool checked); +#endif void slotSetVisualGainAll(double gain); void slotSetVisualGainLow(double gain); void slotSetVisualGainMid(double gain); diff --git a/src/preferences/dialog/dlgprefwaveformdlg.ui b/src/preferences/dialog/dlgprefwaveformdlg.ui index 6bdc3c265208..331ae2ea97cb 100644 --- a/src/preferences/dialog/dlgprefwaveformdlg.ui +++ b/src/preferences/dialog/dlgprefwaveformdlg.ui @@ -43,6 +43,9 @@ 16777215 + + Highlight the waveforms when the last seconds of a track remains. + 0 @@ -97,7 +100,7 @@ - + @@ -521,12 +524,12 @@ Select from different types of displays for the waveform, which differ primarily - - Play marker position - + + Play marker position + - - + + Moves the play marker position on the waveforms to the left, right or center (default). @@ -557,6 +560,19 @@ Select from different types of displays for the waveform, which differ primarily + + + + Waveform will always scroll at the same speed. This means that if the track play rate is changed, the zoom level will be adjusted to keep the scrolling pace. If disabled, playback ratio will change the scrolling speed. + + + Waveform always scroll at the same speed + + + true + + + diff --git a/src/qml/qmlconfigproxy.cpp b/src/qml/qmlconfigproxy.cpp index 4bdaaccf15d0..f9a24b46fb11 100644 --- a/src/qml/qmlconfigproxy.cpp +++ b/src/qml/qmlconfigproxy.cpp @@ -31,6 +31,22 @@ QVariantList QmlConfigProxy::getTrackColorPalette() { return paletteToQColorList(colorPaletteSettings.getTrackColorPalette()); } +QString QmlConfigProxy::getString(QString group, QString item, QString defaultValue) { + return m_pConfig->getValue(ConfigKey(group, item), defaultValue); +} + +int QmlConfigProxy::getInt(QString group, QString item, int defaultValue) { + return m_pConfig->getValue(ConfigKey(group, item), defaultValue); +} + +bool QmlConfigProxy::getBool(QString group, QString item, bool defaultValue) { + return m_pConfig->getValue(ConfigKey(group, item), defaultValue); +} + +double QmlConfigProxy::getDouble(QString group, QString item, double defaultValue) { + return m_pConfig->getValue(ConfigKey(group, item), defaultValue); +} + // static QmlConfigProxy* QmlConfigProxy::create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine) { // The implementation of this method is mostly taken from the code example diff --git a/src/qml/qmlconfigproxy.h b/src/qml/qmlconfigproxy.h index e8e69021f7e1..9fa885992443 100644 --- a/src/qml/qmlconfigproxy.h +++ b/src/qml/qmlconfigproxy.h @@ -20,6 +20,10 @@ class QmlConfigProxy : public QObject { Q_INVOKABLE QVariantList getHotcueColorPalette(); Q_INVOKABLE QVariantList getTrackColorPalette(); + Q_INVOKABLE int getInt(QString group, QString item, int defaultValue = 0); + Q_INVOKABLE bool getBool(QString group, QString item, bool defaultValue = false); + Q_INVOKABLE double getDouble(QString group, QString item, double defaultValue = 0.0); + Q_INVOKABLE QString getString(QString group, QString item, QString defaultValue = ""); static QmlConfigProxy* create(QQmlEngine* pQmlEngine, QJSEngine* pJsEngine); static inline void registerUserSettings(UserSettingsPointer pConfig) { diff --git a/src/qml/qmlwaveformoverview.cpp b/src/qml/qmlwaveformoverview.cpp index 4edf86639c04..122023cd3711 100644 --- a/src/qml/qmlwaveformoverview.cpp +++ b/src/qml/qmlwaveformoverview.cpp @@ -17,7 +17,11 @@ QmlWaveformOverview::QmlWaveformOverview(QQuickItem* parent) m_renderer(Renderer::RGB), m_colorHigh(0xFF0000), m_colorMid(0x00FF00), - m_colorLow(0x0000FF) { + m_colorLow(0x0000FF), + m_gainLow(1.0), + m_gainMid(1.0), + m_gainHigh(1.0), + m_gainAll(1.0) { } QmlPlayerProxy* QmlWaveformOverview::getPlayer() const { @@ -213,29 +217,33 @@ void QmlWaveformOverview::drawFiltered(QPainter* pPainter, if (channels.testFlag(ChannelFlag::LeftChannel)) { const uint8_t leftHigh = pWaveform->getHigh(completion); pPainter->setPen(m_colorHigh); - pPainter->drawLine(QPointF(offsetX, 2 * -leftHigh), QPointF(offsetX, 0.0)); + pPainter->drawLine(QPointF(offsetX, m_gainAll * m_gainHigh * -leftHigh), + QPointF(offsetX, 0.0)); const uint8_t leftMid = pWaveform->getMid(completion); pPainter->setPen(m_colorMid); - pPainter->drawLine(QPointF(offsetX, 1.5 * -leftMid), QPointF(offsetX, 0.0)); + pPainter->drawLine(QPointF(offsetX, m_gainAll * m_gainMid * -leftMid), + QPointF(offsetX, 0.0)); const uint8_t leftLow = pWaveform->getLow(completion); pPainter->setPen(m_colorLow); - pPainter->drawLine(QPointF(offsetX, -leftLow), QPointF(offsetX, 0.0)); + pPainter->drawLine(QPointF(offsetX, m_gainAll * m_gainLow * -leftLow), + QPointF(offsetX, 0.0)); } if (channels.testFlag(ChannelFlag::RightChannel)) { const uint8_t rightHigh = pWaveform->getHigh(completion + 1); pPainter->setPen(m_colorHigh); - pPainter->drawLine(QPointF(offsetX, 0), QPointF(offsetX, 2 * rightHigh)); + pPainter->drawLine(QPointF(offsetX, 0), + QPointF(offsetX, m_gainAll * m_gainHigh * rightHigh)); - const uint8_t rightMid = pWaveform->getMid(completion + 1) * 2; + const uint8_t rightMid = pWaveform->getMid(completion + 1) * m_gainAll * m_gainHigh; pPainter->setPen(m_colorMid); - pPainter->drawLine(QPointF(offsetX, 0), QPointF(offsetX, 1.5 * rightMid)); + pPainter->drawLine(QPointF(offsetX, 0), QPointF(offsetX, m_gainAll * m_gainMid * rightMid)); const uint8_t rightLow = pWaveform->getLow(completion + 1); pPainter->setPen(m_colorLow); - pPainter->drawLine(QPointF(offsetX, 0), QPointF(offsetX, rightLow)); + pPainter->drawLine(QPointF(offsetX, 0), QPointF(offsetX, m_gainAll * m_gainLow * rightLow)); } } diff --git a/src/qml/qmlwaveformoverview.h b/src/qml/qmlwaveformoverview.h index 810cbd92e5fa..878442966581 100644 --- a/src/qml/qmlwaveformoverview.h +++ b/src/qml/qmlwaveformoverview.h @@ -23,6 +23,10 @@ class QmlWaveformOverview : public QQuickPaintedItem { Q_PROPERTY(QColor colorHigh MEMBER m_colorHigh NOTIFY colorHighChanged) Q_PROPERTY(QColor colorMid MEMBER m_colorMid NOTIFY colorMidChanged) Q_PROPERTY(QColor colorLow MEMBER m_colorLow NOTIFY colorLowChanged) + Q_PROPERTY(double gainLow MEMBER m_gainLow NOTIFY gainLowChanged) + Q_PROPERTY(double gainMid MEMBER m_gainMid NOTIFY gainMidChanged) + Q_PROPERTY(double gainHigh MEMBER m_gainHigh NOTIFY gainHighChanged) + Q_PROPERTY(double gainAll MEMBER m_gainAll NOTIFY gainAllChanged) QML_NAMED_ELEMENT(WaveformOverview) public: @@ -62,6 +66,10 @@ class QmlWaveformOverview : public QQuickPaintedItem { void colorHighChanged(const QColor& color); void colorMidChanged(const QColor& color); void colorLowChanged(const QColor& color); + void gainHighChanged(double gain); + void gainMidChanged(double gain); + void gainLowChanged(double gain); + void gainAllChanged(double gain); private: void setCurrentTrack(TrackPointer pTrack); @@ -82,6 +90,11 @@ class QmlWaveformOverview : public QQuickPaintedItem { QColor m_colorHigh; QColor m_colorMid; QColor m_colorLow; + + double m_gainLow; + double m_gainMid; + double m_gainHigh; + double m_gainAll; }; } // namespace qml