summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Klotz <uklotz@mixxx.org>2020-10-23 18:10:01 +0200
committerUwe Klotz <uklotz@mixxx.org>2020-10-23 18:10:01 +0200
commita175f868eea9337e07ad6a15024f3d82585f29ba (patch)
tree94b34ba20e5befc80d3b5b47fc5c6a93545b8af8
parent4e02f721b0c00afabcc38001d691ae143ceb3dec (diff)
parent7e62e9f1c3c0345a750392ff566dd176a14ebe3c (diff)
Merge branch '2.3' of git@github.com:mixxxdj/mixxx.git into main
-rw-r--r--CHANGELOG.md9
-rw-r--r--src/controllers/delegates/controldelegate.cpp2
-rw-r--r--src/test/keyutilstest.cpp42
-rw-r--r--src/test/rescalertest.cpp8
-rw-r--r--src/track/keyutils.cpp18
-rw-r--r--src/waveform/renderers/waveformmarkrange.cpp44
-rw-r--r--src/widget/wsearchlineedit.cpp12
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);