diff options
author | Uwe Klotz <uklotz@mixxx.org> | 2020-10-23 18:10:01 +0200 |
---|---|---|
committer | Uwe Klotz <uklotz@mixxx.org> | 2020-10-23 18:10:01 +0200 |
commit | a175f868eea9337e07ad6a15024f3d82585f29ba (patch) | |
tree | 94b34ba20e5befc80d3b5b47fc5c6a93545b8af8 | |
parent | 4e02f721b0c00afabcc38001d691ae143ceb3dec (diff) | |
parent | 7e62e9f1c3c0345a750392ff566dd176a14ebe3c (diff) |
Merge branch '2.3' of git@github.com:mixxxdj/mixxx.git into main
-rw-r--r-- | CHANGELOG.md | 9 | ||||
-rw-r--r-- | src/controllers/delegates/controldelegate.cpp | 2 | ||||
-rw-r--r-- | src/test/keyutilstest.cpp | 42 | ||||
-rw-r--r-- | src/test/rescalertest.cpp | 8 | ||||
-rw-r--r-- | src/track/keyutils.cpp | 18 | ||||
-rw-r--r-- | src/waveform/renderers/waveformmarkrange.cpp | 44 | ||||
-rw-r--r-- | src/widget/wsearchlineedit.cpp | 12 |
7 files changed, 74 insertions, 61 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 65567a02ef..8a0ba8d109 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,10 +80,11 @@ * Add controller mapping for Hercules DJControl Inpulse 200 [#2542](https://github.com/mixxxdj/mixxx/pull/2542) * Add controller mapping for Hercules DJControl Jogvision [#2370](https://github.com/mixxxdj/mixxx/pull/2370) -* Fix missing manual in deb package [lp:1889776] (https://bugs.launchpad.net/mixxx/+bug/1889776) -* Fix caching of duplicate tracks that reference the same file #3027 -* Fix loss of precision when dealing with floating-point sample positions while setting loop out position and seeking using vinyl control #3126 #3127 -* Prevent moving a loop beyond track end #3117 https://bugs.launchpad.net/mixxx/+bug/1799574 +* Fix missing manual in deb package [lp:1889776](https://bugs.launchpad.net/mixxx/+bug/1889776) +* Fix caching of duplicate tracks that reference the same file [#3027](https://github.com/mixxxdj/mixxx/pull/3027) +* Fix loss of precision when dealing with floating-point sample positions while setting loop out position and seeking using vinyl control [#3126](https://github.com/mixxxdj/mixxx/pull/3126) [#3127](https://github.com/mixxxdj/mixxx/pull/3127) +* Prevent moving a loop beyond track end [#3117](https://github.com/mixxxdj/mixxx/pull/3117) [lp:1799574](https://bugs.launchpad.net/mixxx/+bug/1799574) +* Use 6 instead of only 4 compatible musical keys (major/minor) [#3205](https://github.com/mixxxdj/mixxx/pull/3205) ## [2.2.4](https://launchpad.net/mixxx/+milestone/2.2.4) (2020-06-27) diff --git a/src/controllers/delegates/controldelegate.cpp b/src/controllers/delegates/controldelegate.cpp index 392a7f9451..cfae30ac79 100644 --- a/src/controllers/delegates/controldelegate.cpp +++ b/src/controllers/delegates/controldelegate.cpp @@ -48,7 +48,7 @@ QString ControlDelegate::displayText(const QVariant& value, } if (m_bIsIndexScript) { - return tr("Script: %1(%2)").arg(key.item, key.group); + return tr("%1 %2").arg(key.group, key.item); } QString description = m_pPicker->descriptionForConfigKey(key); diff --git a/src/test/keyutilstest.cpp b/src/test/keyutilstest.cpp index cd876b0fa9..d8fb148107 100644 --- a/src/test/keyutilstest.cpp +++ b/src/test/keyutilstest.cpp @@ -1,13 +1,12 @@ -#include <gtest/gtest.h> #include <gmock/gmock.h> +#include <gtest/gtest.h> + #include <QDebug> -#include "track/keyutils.h" #include "proto/keys.pb.h" +#include "track/keyutils.h" -using ::testing::ElementsAre; - -namespace { +using ::testing::UnorderedElementsAre; class KeyUtilsTest : public testing::Test { }; @@ -206,8 +205,9 @@ TEST_F(KeyUtilsTest, ShortestStepsToKey) { } TEST_F(KeyUtilsTest, GetCompatibleKeys) { - // The relative major, the perfect 4th and the perfect 5th are all - // compatible. This is easily checked with the Circle of Fifths. + // The relative major/minor, the perfect 4th major/minor and the + // perfect 5th major/minor are all compatible. This is easily + // checked with the Circle of Fifths. // Test keys on the boundary between 1 and 12 to check that wrap-around // works. @@ -215,21 +215,21 @@ TEST_F(KeyUtilsTest, GetCompatibleKeys) { mixxx::track::io::key::A_MINOR; QList<mixxx::track::io::key::ChromaticKey> compatible = KeyUtils::getCompatibleKeys(key); - std::sort(compatible.begin(), compatible.end()); - EXPECT_THAT(compatible, ElementsAre( - mixxx::track::io::key::C_MAJOR, - mixxx::track::io::key::D_MINOR, - mixxx::track::io::key::E_MINOR, - mixxx::track::io::key::A_MINOR)); + EXPECT_THAT(compatible, + UnorderedElementsAre(mixxx::track::io::key::C_MAJOR, + mixxx::track::io::key::F_MAJOR, + mixxx::track::io::key::G_MAJOR, + mixxx::track::io::key::D_MINOR, + mixxx::track::io::key::E_MINOR, + mixxx::track::io::key::A_MINOR)); key = mixxx::track::io::key::F_MAJOR; compatible = KeyUtils::getCompatibleKeys(key); - std::sort(compatible.begin(), compatible.end()); - EXPECT_THAT(compatible, ElementsAre( - mixxx::track::io::key::C_MAJOR, - mixxx::track::io::key::F_MAJOR, - mixxx::track::io::key::B_FLAT_MAJOR, - mixxx::track::io::key::D_MINOR)); + EXPECT_THAT(compatible, + UnorderedElementsAre(mixxx::track::io::key::C_MAJOR, + mixxx::track::io::key::F_MAJOR, + mixxx::track::io::key::B_FLAT_MAJOR, + mixxx::track::io::key::D_MINOR, + mixxx::track::io::key::A_MINOR, + mixxx::track::io::key::G_MINOR)); } - -} // namespace diff --git a/src/test/rescalertest.cpp b/src/test/rescalertest.cpp index a5ab8afe1c..f6bf014edf 100644 --- a/src/test/rescalertest.cpp +++ b/src/test/rescalertest.cpp @@ -1,15 +1,9 @@ #include <gtest/gtest.h> -#include <gmock/gmock.h> #include <QDebug> #include "util/math.h" #include "util/rescaler.h" - -using ::testing::ElementsAre; - -namespace { - class RescalerUtilsTest : public testing::Test { }; @@ -62,5 +56,3 @@ TEST_F(RescalerUtilsTest, Test) { result = RescalerUtils::oneByXToLinear(result, 1000, 0, 100); EXPECT_TRUE(fabs(result - 50) < 0.0000000001); } - -} // namespace diff --git a/src/track/keyutils.cpp b/src/track/keyutils.cpp index 87c2148542..b4db95d9fa 100644 --- a/src/track/keyutils.cpp +++ b/src/track/keyutils.cpp @@ -530,15 +530,15 @@ QList<mixxx::track::io::key::ChromaticKey> KeyUtils::getCompatibleKeys( return compatible; } + int openKeyNumber = KeyUtils::keyToOpenKeyNumber(key); // We know the key is in the set of valid values. Save whether or not the // value is minor. bool major = keyIsMajor(key); - int openKeyNumber = KeyUtils::keyToOpenKeyNumber(key); // The compatible keys of particular key are: // * The relative major/minor key. - // * The perfect 4th (sub-dominant) key. - // * The perfect 5th (dominant) key. + // * The perfect 4th (sub-dominant) major/minor key. + // * The perfect 5th (dominant) major/minor key. // // The Circle of Fifths is a handy tool that encodes this compatibility. // Keys on the same radial of the circle are compatible and adjacent keys on @@ -550,14 +550,22 @@ QList<mixxx::track::io::key::ChromaticKey> KeyUtils::getCompatibleKeys( // The key is compatible with tracks in the same key. compatible << key; + auto relativeKey = openKeyNumberToKey(openKeyNumber, !major); + int relativeOpenKeyNumber = KeyUtils::keyToOpenKeyNumber(relativeKey); + // The relative major/minor key is compatible. - compatible << openKeyNumberToKey(openKeyNumber, !major); + compatible << relativeKey; - // The perfect 4th and perfect 5th are compatible. + // The perfect 4th and perfect 5th of BOTH major and minor key are compatible + // (as explained by Phil Morse: https://youtu.be/9eECvYYAwbg?t=2370) compatible << openKeyNumberToKey( openKeyNumber == 12 ? 1 : openKeyNumber + 1, major); compatible << openKeyNumberToKey( + relativeOpenKeyNumber == 12 ? 1 : relativeOpenKeyNumber + 1, !major); + compatible << openKeyNumberToKey( openKeyNumber == 1 ? 12 : openKeyNumber - 1, major); + compatible << openKeyNumberToKey( + relativeOpenKeyNumber == 1 ? 12 : relativeOpenKeyNumber - 1, !major); return compatible; } diff --git a/src/waveform/renderers/waveformmarkrange.cpp b/src/waveform/renderers/waveformmarkrange.cpp index 7ed9a49e9f..93eb207f0b 100644 --- a/src/waveform/renderers/waveformmarkrange.cpp +++ b/src/waveform/renderers/waveformmarkrange.cpp @@ -17,22 +17,6 @@ WaveformMarkRange::WaveformMarkRange( m_enabledOpacity(context.selectDouble(node, "Opacity", 0.5)), m_disabledOpacity(context.selectDouble(node, "DisabledOpacity", 0.5)), m_durationTextColor(context.selectString(node, "DurationTextColor")) { - if (!m_activeColor.isValid()) { - //vRince kind of legacy fallback ... - // As a fallback, grab the mark color from the parent's MarkerColor - m_activeColor = signalColors.getAxesColor(); - qDebug() << "Didn't get mark Color, using parent's <AxesColor>:" << m_activeColor; - } else { - m_activeColor = WSkinColor::getCorrectColor(m_activeColor); - } - - if (!m_disabledColor.isValid()) { - //vRince kind of legacy fallback ... - // Read the text color, otherwise use the parent's SignalColor. - m_disabledColor = signalColors.getSignalColor(); - qDebug() << "Didn't get mark TextColor, using parent's <SignalColor>:" << m_disabledColor; - } - QString startControl = context.selectString(node, "StartControl"); if (!startControl.isEmpty()) { DEBUG_ASSERT(!m_markStartPointControl); // has not been created yet @@ -43,6 +27,7 @@ WaveformMarkRange::WaveformMarkRange( DEBUG_ASSERT(!m_markEndPointControl); // has not been created yet m_markEndPointControl = std::make_unique<ControlProxy>(group, endControl); } + QString enabledControl = context.selectString(node, "EnabledControl"); if (!enabledControl.isEmpty()) { DEBUG_ASSERT(!m_markEnabledControl); // has not been created yet @@ -61,6 +46,33 @@ WaveformMarkRange::WaveformMarkRange( } else { m_durationTextLocation = DurationTextLocation::After; } + + if (!m_activeColor.isValid()) { + //vRince kind of legacy fallback ... + // As a fallback, grab the mark color from the parent's MarkerColor + QString rangeSuffix = QStringLiteral("_start_position"); + QString rangeName = startControl.remove(rangeSuffix); + m_activeColor = signalColors.getAxesColor(); + qDebug() << "Didn't get Color for mark range" << rangeName + << "- using parent's AxesColor:" << m_activeColor; + } else { + m_activeColor = WSkinColor::getCorrectColor(m_activeColor); + } + + if (!m_disabledColor.isValid()) { + if (enabledControl.isEmpty()) { + m_disabledColor = QColor(Qt::transparent); + } else { + // Show warning only when there's no EnabledControl, + // like for intro & outro ranges. + QString rangeSuffix = QStringLiteral("_start_position"); + QString rangeName = startControl.remove(rangeSuffix); + int gray = qGray(m_activeColor.rgb()); + m_disabledColor = QColor(gray, gray, gray); + qDebug() << "Didn't get DisabledColor for mark range" << rangeName + << "- using desaturated Color:" << m_disabledColor; + } + } } bool WaveformMarkRange::active() const { diff --git a/src/widget/wsearchlineedit.cpp b/src/widget/wsearchlineedit.cpp index 89b9ed0341..ca004c5600 100644 --- a/src/widget/wsearchlineedit.cpp +++ b/src/widget/wsearchlineedit.cpp @@ -163,9 +163,9 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { << "Invisible foreground color - using default color as fallback"; foregroundColor = defaultForegroundColor; } - kLogger.debug() - << "Foreground color:" - << foregroundColor; + //kLogger.debug() + // << "Foreground color:" + // << foregroundColor; QPalette pal = palette(); DEBUG_ASSERT(backgroundColor != foregroundColor); @@ -174,9 +174,9 @@ void WSearchLineEdit::setup(const QDomNode& node, const SkinContext& context) { #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) auto placeholderColor = foregroundColor; placeholderColor.setAlpha(placeholderColor.alpha() * 3 / 4); // 75% opaque - kLogger.debug() - << "Placeholder color:" - << placeholderColor; + //kLogger.debug() + // << "Placeholder color:" + // << placeholderColor; pal.setBrush(QPalette::PlaceholderText, placeholderColor); #endif setPalette(pal); |