From 9c658a054b0741c9e69f1cd9d665c2e816896dce Mon Sep 17 00:00:00 2001 From: Daniel Poelzleithner Date: Thu, 26 Apr 2018 19:40:25 +0200 Subject: [PATCH 01/20] Implement switchable duration format The display format on the decks can now be configured. Implement alternative display based on kiloseconds. --- src/preferences/dialog/dlgprefdeck.cpp | 38 ++++++++ src/preferences/dialog/dlgprefdeck.h | 9 ++ src/preferences/dialog/dlgprefdeckdlg.ui | 113 +++++++++++++---------- src/test/durationutiltest.cpp | 31 +++++++ src/util/duration.cpp | 33 ++++++- src/util/duration.h | 4 + src/widget/wnumberpos.cpp | 33 +++++-- src/widget/wnumberpos.h | 3 + 8 files changed, 206 insertions(+), 58 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 0f73b68f3c5..b82d58bd64a 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -106,6 +106,24 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, connect(buttonGroupTrackTime, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slotSetTrackTimeDisplay(QAbstractButton *))); + // display time format + + m_pControlTrackTimeFormat = new ControlObject( + ConfigKey("[Controls]", "TimeFormat")); + connect(m_pControlTrackTimeDisplay, SIGNAL(valueChanged(double)), + this, SLOT(slotTimeFormatChanged(double))); + + // Track Display model + comboBoxTimeFormat->clear(); + comboBoxTimeFormat->addItem(tr("hh:mm:ss.zzz"), + static_cast(TrackTime::DisplayFormat::DEFAULT)); + comboBoxTimeFormat->addItem(tr("k.sss:zz"), + static_cast(TrackTime::DisplayFormat::KILO_SECOND)); + connect(comboBoxTimeFormat, SIGNAL(activated(int)), + this, SLOT(slotTimeFormatChanged(int))); + slotTimeFormatChanged((double)m_pConfig->getValue(ConfigKey("[Controls]", "TimeFormat"), + static_cast(TrackTime::DisplayFormat::DEFAULT))); + // Override Playing Track on Track Load // The check box reflects the opposite of the config value m_bDisallowTrackLoadToPlayingDeck = !m_pConfig->getValue( @@ -495,11 +513,31 @@ void DlgPrefDeck::slotRateRampingModeLinearButton(bool checked) { } } +void DlgPrefDeck::slotTimeFormatChanged(double v) { + int i = static_cast(v); + m_timeDisplayFormat = static_cast(i); + + m_pConfig->set(ConfigKey("[Controls]","TimeFormat"), ConfigValue(v)); + comboBoxTimeFormat->setCurrentIndex( + comboBoxTimeFormat->findData(i)); + +} + +void DlgPrefDeck::slotTimeFormatChanged(int index) { + int mode = comboBoxTimeFormat->itemData(index).toInt(); + m_timeDisplayFormat = static_cast(mode); +} + void DlgPrefDeck::slotApply() { double timeDisplay = static_cast(m_timeDisplayMode); m_pConfig->set(ConfigKey("[Controls]","PositionDisplay"), ConfigValue(timeDisplay)); m_pControlTrackTimeDisplay->set(timeDisplay); + // time format + double timeFormat = static_cast(m_timeDisplayFormat); + m_pConfig->set(ConfigKey("[Controls]","TimeFormat"), ConfigValue(timeFormat)); + m_pControlTrackTimeFormat->set(timeFormat); + // Set cue mode for every deck for (ControlProxy* pControl : m_cueControls) { pControl->set(m_iCueMode); diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index bd7e0bd79f0..847964517ec 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -22,6 +22,10 @@ namespace TrackTime { Remaining, ElapsedAndRemaining, }; + enum class DisplayFormat { + DEFAULT, + KILO_SECOND, + }; } enum class KeylockMode { @@ -67,6 +71,9 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg { void slotRateRampingModeLinearButton(bool); void slotRateRampSensitivitySlider(int); + void slotTimeFormatChanged(double); + void slotTimeFormatChanged(int); + void slotNumDecksChanged(double, bool initializing=false); void slotNumSamplersChanged(double, bool initializing=false); @@ -85,6 +92,7 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg { UserSettingsPointer m_pConfig; ControlObject* m_pControlTrackTimeDisplay; + ControlObject* m_pControlTrackTimeFormat; ControlProxy* m_pNumDecks; ControlProxy* m_pNumSamplers; QList m_cueControls; @@ -100,6 +108,7 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg { int m_iNumConfiguredSamplers; TrackTime::DisplayMode m_timeDisplayMode; + TrackTime::DisplayFormat m_timeDisplayFormat; int m_iCueMode; diff --git a/src/preferences/dialog/dlgprefdeckdlg.ui b/src/preferences/dialog/dlgprefdeckdlg.ui index 35712d80e95..4fa7b1b9f2f 100644 --- a/src/preferences/dialog/dlgprefdeckdlg.ui +++ b/src/preferences/dialog/dlgprefdeckdlg.ui @@ -20,41 +20,16 @@ Deck options - - + + 10 + + + - Cue mode - - - true + Auto cue - ComboBoxCueMode - - - - - - - Mixxx mode: -- Cue button while pause at cue point = preview -- Cue button while pause not at cue point = set cue point -- Cue button while playing = pause at cue point -Mixxx mode (no blinking): -- Same as Mixxx mode but with no blinking indicators -Pioneer mode: -- Same as Mixxx mode with a flashing play button -Denon mode: -- Cue button at cue point = preview -- Cue button not at cue point = pause at cue point -- Play = set cue point -Numark mode: -- Same as Denon mode, but without a flashing play button -CUP mode: -- Cue button while pause at cue point = play after release -- Cue button while pause not at cue point = set cue point and play after release -- Cue button while playing = go to cue point and play after release - + checkBoxSeekToCue @@ -77,6 +52,24 @@ CUP mode: + + + + Do not load tracks into playing decks + + + + + + + Automatically seeks to the first saved cue point on track load. + If none exists, seeks to the beginning of the track. + + + Jump to main cue point on track load + + + @@ -111,44 +104,64 @@ CUP mode: - - + + - Auto cue + Cue mode + + + true - checkBoxSeekToCue + ComboBoxCueMode - - + + - Automatically seeks to the first saved cue point on track load. - If none exists, seeks to the beginning of the track. - - - Jump to main cue point on track load + Mixxx mode: +- Cue button while pause at cue point = preview +- Cue button while pause not at cue point = set cue point +- Cue button while playing = pause at cue point +Mixxx mode (no blinking): +- Same as Mixxx mode but with no blinking indicators +Pioneer mode: +- Same as Mixxx mode with a flashing play button +Denon mode: +- Cue button at cue point = preview +- Cue button not at cue point = pause at cue point +- Play = set cue point +Numark mode: +- Same as Denon mode, but without a flashing play button +CUP mode: +- Cue button while pause at cue point = play after release +- Cue button while pause not at cue point = set cue point and play after release +- Cue button while playing = go to cue point and play after release + - + - Playing track protection + Pla&ying track protection checkBoxDisallowLoadToPlayingDeck - - + + - Do not load tracks into playing decks + Time Format + + + @@ -755,13 +768,13 @@ CUP mode: - - false + + diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index 7fec8b61f14..c73737d9b3e 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -41,6 +41,23 @@ class DurationUtilTest : public testing::Test { mixxx::Duration::formatSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); EXPECT_EQ(actualMilliseconds, actualMilliseconds); } + + void formatKiloSeconds(QString expectedMilliseconds, double dSeconds) { + ASSERT_LE(4, expectedMilliseconds.length()); // 3 digits + 1 decimal point + const QString actualSeconds = + mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::SECONDS); + const QString expectedSeconds = + adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::SECONDS); + EXPECT_EQ(expectedSeconds, actualSeconds); + const QString expectedCentiseconds = + adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::CENTISECONDS); + const QString actualCentiseconds = + mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::CENTISECONDS); + EXPECT_EQ(expectedCentiseconds, actualCentiseconds); + const QString actualMilliseconds = + mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); + EXPECT_EQ(actualMilliseconds, actualMilliseconds); + } }; TEST_F(DurationUtilTest, FormatSecondsNegative) { @@ -61,4 +78,18 @@ TEST_F(DurationUtilTest, FormatSeconds) { formatSeconds("1d, 00:00:00.000", 24 * 3600); } +TEST_F(DurationUtilTest, FormatKiloSeconds) { + formatKiloSeconds("0.000:000", 0); + formatKiloSeconds("0.001:000", 1); + formatKiloSeconds("0.001:500", 1.5); + formatKiloSeconds("0.001:510", 1.51); + formatKiloSeconds("0.001:490", 1.49); + formatKiloSeconds("0.059:000", 59); + formatKiloSeconds("0.060:000", 60); + formatKiloSeconds("0.061:123", 61.1234); + formatKiloSeconds("0.999:990", 999.99); + formatKiloSeconds("1.000:000", 1000.00); + formatKiloSeconds("1d, 0.000:000", 24 * 3600); +} + } // anonymous namespace diff --git a/src/util/duration.cpp b/src/util/duration.cpp index d050b55b22a..2f34302465c 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -3,7 +3,7 @@ #include #include #include - +#include #include "util/assert.h" #include "util/math.h" @@ -48,5 +48,36 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { return durationString; } +// static +QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { + if (dSeconds < 0.0) { + // negative durations are not supported + return "?"; + } + + const qint64 days = static_cast(std::floor(dSeconds)) / kSecondsPerDay; + dSeconds -= days * kSecondsPerDay; + + int kilos = (int)dSeconds / 1000; + double seconds = floor(fmod(dSeconds, 1000)); + double subs = fmod(dSeconds, 1); + + QString durationString = + (days > 0 ? (QString::number(days) % + QLatin1String("d, ")) : QString()) % + QString("%1.%2").arg(kilos, 0, 10).arg(seconds, 3, 'f', 0, QLatin1Char('0')); + if (Precision::SECONDS != precision) { + durationString += QString(":") % QString::number(subs, 'f', 3).right(3); + } + + // The format string gives us milliseconds but we want + // centiseconds. Slice one character off. + if (Precision::CENTISECONDS == precision) { + DEBUG_ASSERT(1 <= durationString.length()); + durationString = durationString.left(durationString.length() - 1); + } + + return durationString; +} } // namespace mixxx diff --git a/src/util/duration.h b/src/util/duration.h index 075a30607be..f6810ca2953 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -73,6 +73,10 @@ class DurationBase { static QString formatSeconds( double dSeconds, Precision precision = Precision::SECONDS); + // Alternative format for duration based on kilo seconds + static QString formatKiloSeconds( + double dSeconds, + Precision precision = Precision::SECONDS); static constexpr qint64 kMillisPerSecond = 1000; static constexpr qint64 kMicrosPerSecond = kMillisPerSecond * 1000; diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index bf96024ec45..6cd8db24dce 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -21,6 +21,13 @@ WNumberPos::WNumberPos(const char* group, QWidget* parent) m_pShowTrackTimeRemaining->connectValueChanged( SLOT(slotSetDisplayMode(double))); slotSetDisplayMode(m_pShowTrackTimeRemaining->get()); + + m_pTimeFormat = new ControlProxy( + "[Controls]", "TimeFormat", this); + m_pTimeFormat->connectValueChanged( + SLOT(slotSetTimeFormat(double))); + slotSetTimeFormat(m_pTimeFormat->get()); + } void WNumberPos::mousePressEvent(QMouseEvent* pEvent) { @@ -51,30 +58,37 @@ void WNumberPos::setValue(double dValue) { void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { double dTimeRemaining = m_pTimeRemaining->get(); + QString (*formatter)(double dSeconds, mixxx::Duration::Precision precision); + + if (m_displayFormat == TrackTime::DisplayFormat::KILO_SECOND) { + formatter = &mixxx::Duration::formatKiloSeconds; + } else { + formatter = &mixxx::Duration::formatSeconds; + } if (m_displayMode == TrackTime::DisplayMode::Elapsed) { if (dTimeElapsed >= 0.0) { - setText(mixxx::Duration::formatSeconds( + setText(formatter( dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); } else { - setText(QLatin1String("-") % mixxx::Duration::formatSeconds( + setText(QLatin1String("-") % formatter( -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); } } else if (m_displayMode == TrackTime::DisplayMode::Remaining) { - setText(QLatin1String("-") % mixxx::Duration::formatSeconds( + setText(QLatin1String("-") % formatter( dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); } else if (m_displayMode == TrackTime::DisplayMode::ElapsedAndRemaining) { if (dTimeElapsed >= 0.0) { - setText(mixxx::Duration::formatSeconds( + setText(formatter( dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) % QLatin1String(" -") % - mixxx::Duration::formatSeconds( + formatter( dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); } else { - setText(QLatin1String("-") % mixxx::Duration::formatSeconds( + setText(QLatin1String("-") % formatter( -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) % QLatin1String(" -") % - mixxx::Duration::formatSeconds( + formatter( dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); } } @@ -103,3 +117,8 @@ void WNumberPos::slotSetDisplayMode(double remain) { slotSetTimeElapsed(m_dOldTimeElapsed); } +void WNumberPos::slotSetTimeFormat(double v) { + m_displayFormat = static_cast(static_cast(v)); + + slotSetTimeElapsed(m_dOldTimeElapsed); +} diff --git a/src/widget/wnumberpos.h b/src/widget/wnumberpos.h index c4023100ae2..10694fc6008 100644 --- a/src/widget/wnumberpos.h +++ b/src/widget/wnumberpos.h @@ -23,15 +23,18 @@ class WNumberPos : public WNumber { void slotSetTimeElapsed(double); void slotTimeRemainingUpdated(double); void slotSetDisplayMode(double); + void slotSetTimeFormat(double); private: TrackTime::DisplayMode m_displayMode; + TrackTime::DisplayFormat m_displayFormat; double m_dOldTimeElapsed; ControlProxy* m_pTimeElapsed; ControlProxy* m_pTimeRemaining; ControlProxy* m_pShowTrackTimeRemaining; + ControlProxy* m_pTimeFormat; }; #endif From 66fc9d111d99e83d1129bbac2529969ae6d35e37 Mon Sep 17 00:00:00 2001 From: Daniel Poelzleithner Date: Wed, 2 May 2018 09:44:51 +0200 Subject: [PATCH 02/20] Cleanup and Hectoseconds Fix comments regarding style. Also add hectosecond formatting. For mixing, 100 seconds is actually a quite useful seperator. --- src/preferences/dialog/dlgprefdeck.cpp | 33 ++++++++------- src/preferences/dialog/dlgprefdeck.h | 5 +-- src/test/durationutiltest.cpp | 58 ++++++++++++++++++++------ src/util/duration.cpp | 44 +++++++++++++++---- src/util/duration.h | 4 ++ src/widget/wnumberpos.cpp | 2 + 6 files changed, 106 insertions(+), 40 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index b82d58bd64a..145dd8375eb 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -19,6 +19,7 @@ #include "control/controlobject.h" #include "mixxx.h" #include "defs_urls.h" +#include "util/duration.h" namespace { constexpr int kDefaultRateRangePercent = 8; @@ -113,16 +114,23 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, connect(m_pControlTrackTimeDisplay, SIGNAL(valueChanged(double)), this, SLOT(slotTimeFormatChanged(double))); + QLocale locale; // Track Display model comboBoxTimeFormat->clear(); - comboBoxTimeFormat->addItem(tr("hh:mm:ss.zzz"), - static_cast(TrackTime::DisplayFormat::DEFAULT)); - comboBoxTimeFormat->addItem(tr("k.sss:zz"), + comboBoxTimeFormat->addItem(tr("hh:mm:ss.zzz - Traditional"), + static_cast(TrackTime::DisplayFormat::TRADITIONAL)); + comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds").arg(mixxx::DurationBase::kCentisecondSeperator), static_cast(TrackTime::DisplayFormat::KILO_SECOND)); - connect(comboBoxTimeFormat, SIGNAL(activated(int)), - this, SLOT(slotTimeFormatChanged(int))); - slotTimeFormatChanged((double)m_pConfig->getValue(ConfigKey("[Controls]", "TimeFormat"), - static_cast(TrackTime::DisplayFormat::DEFAULT))); + comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kCentisecondSeperator), + static_cast(TrackTime::DisplayFormat::HECTO_SECOND)); + + double time_format = static_cast( + m_pConfig->getValue( + ConfigKey("[Controls]", "TimeFormat"), + static_cast(TrackTime::DisplayFormat::TRADITIONAL))); + m_pControlTrackTimeFormat->set(time_format); + comboBoxTimeFormat->setCurrentIndex( + comboBoxTimeFormat->findData(time_format)); // Override Playing Track on Track Load // The check box reflects the opposite of the config value @@ -515,17 +523,10 @@ void DlgPrefDeck::slotRateRampingModeLinearButton(bool checked) { void DlgPrefDeck::slotTimeFormatChanged(double v) { int i = static_cast(v); - m_timeDisplayFormat = static_cast(i); m_pConfig->set(ConfigKey("[Controls]","TimeFormat"), ConfigValue(v)); comboBoxTimeFormat->setCurrentIndex( comboBoxTimeFormat->findData(i)); - -} - -void DlgPrefDeck::slotTimeFormatChanged(int index) { - int mode = comboBoxTimeFormat->itemData(index).toInt(); - m_timeDisplayFormat = static_cast(mode); } void DlgPrefDeck::slotApply() { @@ -534,9 +535,9 @@ void DlgPrefDeck::slotApply() { m_pControlTrackTimeDisplay->set(timeDisplay); // time format - double timeFormat = static_cast(m_timeDisplayFormat); - m_pConfig->set(ConfigKey("[Controls]","TimeFormat"), ConfigValue(timeFormat)); + double timeFormat = comboBoxTimeFormat->itemData(comboBoxTimeFormat->currentIndex()).toDouble(); m_pControlTrackTimeFormat->set(timeFormat); + m_pConfig->setValue(ConfigKey("[Controls]", "TimeFormat"), timeFormat); // Set cue mode for every deck for (ControlProxy* pControl : m_cueControls) { diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index 847964517ec..ad77a70501c 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -23,8 +23,9 @@ namespace TrackTime { ElapsedAndRemaining, }; enum class DisplayFormat { - DEFAULT, + TRADITIONAL, KILO_SECOND, + HECTO_SECOND, }; } @@ -72,7 +73,6 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg { void slotRateRampSensitivitySlider(int); void slotTimeFormatChanged(double); - void slotTimeFormatChanged(int); void slotNumDecksChanged(double, bool initializing=false); void slotNumSamplersChanged(double, bool initializing=false); @@ -108,7 +108,6 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg { int m_iNumConfiguredSamplers; TrackTime::DisplayMode m_timeDisplayMode; - TrackTime::DisplayFormat m_timeDisplayFormat; int m_iCueMode; diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index c73737d9b3e..4d85bdd34db 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -58,6 +58,23 @@ class DurationUtilTest : public testing::Test { mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); EXPECT_EQ(actualMilliseconds, actualMilliseconds); } + + void formatHectoSeconds(QString expectedMilliseconds, double dSeconds) { + ASSERT_LE(4, expectedMilliseconds.length()); // 3 digits + 1 decimal point + const QString actualSeconds = + mixxx::Duration::formatHectoSeconds(dSeconds, mixxx::Duration::Precision::SECONDS); + const QString expectedSeconds = + adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::SECONDS); + EXPECT_EQ(expectedSeconds, actualSeconds); + const QString expectedCentiseconds = + adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::CENTISECONDS); + const QString actualCentiseconds = + mixxx::Duration::formatHectoSeconds(dSeconds, mixxx::Duration::Precision::CENTISECONDS); + EXPECT_EQ(expectedCentiseconds, actualCentiseconds); + const QString actualMilliseconds = + mixxx::Duration::formatHectoSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); + EXPECT_EQ(actualMilliseconds, actualMilliseconds); + } }; TEST_F(DurationUtilTest, FormatSecondsNegative) { @@ -75,21 +92,38 @@ TEST_F(DurationUtilTest, FormatSeconds) { formatSeconds("59:59.999", 3599.999); formatSeconds("01:00:00.000", 3600); formatSeconds("23:59:59.000", 24 * 3600 - 1); - formatSeconds("1d, 00:00:00.000", 24 * 3600); + formatSeconds("24:00:00.000", 24 * 3600); + formatSeconds("24:00:01.000", 24 * 3600 + 1); + formatSeconds("25:00:01.000", 25 * 3600 + 1); } TEST_F(DurationUtilTest, FormatKiloSeconds) { - formatKiloSeconds("0.000:000", 0); - formatKiloSeconds("0.001:000", 1); - formatKiloSeconds("0.001:500", 1.5); - formatKiloSeconds("0.001:510", 1.51); - formatKiloSeconds("0.001:490", 1.49); - formatKiloSeconds("0.059:000", 59); - formatKiloSeconds("0.060:000", 60); - formatKiloSeconds("0.061:123", 61.1234); - formatKiloSeconds("0.999:990", 999.99); - formatKiloSeconds("1.000:000", 1000.00); - formatKiloSeconds("1d, 0.000:000", 24 * 3600); + formatKiloSeconds(QString::fromUtf8("0.000\u2009000"), 0); + formatKiloSeconds(QString::fromUtf8("0.001\u2009000"), 1); + formatKiloSeconds(QString::fromUtf8("0.001\u2009500"), 1.5); + formatKiloSeconds(QString::fromUtf8("0.001\u2009510"), 1.51); + formatKiloSeconds(QString::fromUtf8("0.001\u2009490"), 1.49); + formatKiloSeconds(QString::fromUtf8("0.059\u2009000"), 59); + formatKiloSeconds(QString::fromUtf8("0.060\u2009000"), 60); + formatKiloSeconds(QString::fromUtf8("0.061\u2009123"), 61.1234); + formatKiloSeconds(QString::fromUtf8("0.999\u2009990"), 999.99); + formatKiloSeconds(QString::fromUtf8("1.000\u2009000"), 1000.00); + formatKiloSeconds(QString::fromUtf8("86.400\u2009000"), 24 * 3600); +} + +TEST_F(DurationUtilTest, FormatHectoSeconds) { + formatHectoSeconds(QString::fromUtf8("0.00\u2009000"), 0); + formatHectoSeconds(QString::fromUtf8("0.01\u2009000"), 1); + formatHectoSeconds(QString::fromUtf8("0.01\u2009500"), 1.5); + formatHectoSeconds(QString::fromUtf8("0.01\u2009510"), 1.51); + formatHectoSeconds(QString::fromUtf8("0.01\u2009490"), 1.49); + formatHectoSeconds(QString::fromUtf8("0.59\u2009000"), 59); + formatHectoSeconds(QString::fromUtf8("0.60\u2009000"), 60); + formatHectoSeconds(QString::fromUtf8("0.61\u2009123"), 61.1234); + formatHectoSeconds(QString::fromUtf8("9.99\u2009990"), 999.99); + formatHectoSeconds(QString::fromUtf8("10.00\u2009000"), 1000.00); + formatHectoSeconds(QString::fromUtf8("864.00\u2009000"), 24 * 3600); } + } // anonymous namespace diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 2f34302465c..5fdc045fb23 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -17,6 +17,9 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; } // namespace +// static +QString DurationBase::kCentisecondSeperator = QString::fromUtf8("\u2009"); + // static QString DurationBase::formatSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { @@ -32,12 +35,13 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { QTime t = QTime(0, 0).addMSecs(dSeconds * kMillisPerSecond); QString formatString = - (days > 0 ? (QString::number(days) % - QLatin1String("'d', ")) : QString()) % - QLatin1String(days > 0 || t.hour() > 0 ? "hh:mm:ss" : "mm:ss") % + QLatin1String(t.hour() > 0 && days < 1 ? "hh:mm:ss" : "mm:ss") % QLatin1String(Precision::SECONDS == precision ? "" : ".zzz"); QString durationString = t.toString(formatString); + if (days > 0) { + durationString = QString("%1:").arg(days * 24 + t.hour()) % durationString; + } // The format string gives us milliseconds but we want // centiseconds. Slice one character off. @@ -55,19 +59,41 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { return "?"; } - const qint64 days = static_cast(std::floor(dSeconds)) / kSecondsPerDay; - dSeconds -= days * kSecondsPerDay; - int kilos = (int)dSeconds / 1000; double seconds = floor(fmod(dSeconds, 1000)); double subs = fmod(dSeconds, 1); QString durationString = - (days > 0 ? (QString::number(days) % - QLatin1String("d, ")) : QString()) % QString("%1.%2").arg(kilos, 0, 10).arg(seconds, 3, 'f', 0, QLatin1Char('0')); if (Precision::SECONDS != precision) { - durationString += QString(":") % QString::number(subs, 'f', 3).right(3); + durationString += kCentisecondSeperator % QString::number(subs, 'f', 3).right(3); + } + + // The format string gives us milliseconds but we want + // centiseconds. Slice one character off. + if (Precision::CENTISECONDS == precision) { + DEBUG_ASSERT(1 <= durationString.length()); + durationString = durationString.left(durationString.length() - 1); + } + + return durationString; +} + +// static +QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { + if (dSeconds < 0.0) { + // negative durations are not supported + return "?"; + } + + int hecto = (int)dSeconds / 100; + double seconds = floor(fmod(dSeconds, 100)); + double subs = fmod(dSeconds, 1); + + QString durationString = + QString("%1.%2").arg(hecto, 0, 10).arg(seconds, 2, 'f', 0, QLatin1Char('0')); + if (Precision::SECONDS != precision) { + durationString += kCentisecondSeperator % QString::number(subs, 'f', 3).right(3); } // The format string gives us milliseconds but we want diff --git a/src/util/duration.h b/src/util/duration.h index f6810ca2953..cbde8e40626 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -77,12 +77,16 @@ class DurationBase { static QString formatKiloSeconds( double dSeconds, Precision precision = Precision::SECONDS); + static QString formatHectoSeconds( + double dSeconds, + Precision precision = Precision::SECONDS); static constexpr qint64 kMillisPerSecond = 1000; static constexpr qint64 kMicrosPerSecond = kMillisPerSecond * 1000; static constexpr qint64 kNanosPerSecond = kMicrosPerSecond * 1000; static constexpr qint64 kNanosPerMilli = kNanosPerSecond / 1000; static constexpr qint64 kNanosPerMicro = kNanosPerMilli / 1000; + static QString kCentisecondSeperator; protected: explicit DurationBase(qint64 durationNanos) diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index 6cd8db24dce..0d25bab6ba9 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -62,6 +62,8 @@ void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { if (m_displayFormat == TrackTime::DisplayFormat::KILO_SECOND) { formatter = &mixxx::Duration::formatKiloSeconds; + } else if (m_displayFormat == TrackTime::DisplayFormat::HECTO_SECOND) { + formatter = &mixxx::Duration::formatHectoSeconds; } else { formatter = &mixxx::Duration::formatSeconds; } From f987e3dc5bb11430c3c382db7dbf97123e8f4d19 Mon Sep 17 00:00:00 2001 From: Daniel Poelzleithner Date: Tue, 15 May 2018 00:23:40 +0200 Subject: [PATCH 03/20] add simple second display. rename formatSeconds into formatTime to reflect function better. --- src/library/basesqltablemodel.cpp | 2 +- src/library/crate/cratesummary.h | 2 +- src/preferences/dialog/dlgprefdeck.cpp | 2 + src/preferences/dialog/dlgprefdeck.h | 1 + src/test/durationutiltest.cpp | 56 +++++++++++++++++++------- src/track/track.cpp | 2 +- src/util/duration.cpp | 21 +++++++++- src/util/duration.h | 5 ++- src/widget/wnumberpos.cpp | 4 +- 9 files changed, 74 insertions(+), 21 deletions(-) diff --git a/src/library/basesqltablemodel.cpp b/src/library/basesqltablemodel.cpp index 7beac213fd0..c88112eb38a 100644 --- a/src/library/basesqltablemodel.cpp +++ b/src/library/basesqltablemodel.cpp @@ -653,7 +653,7 @@ QVariant BaseSqlTableModel::data(const QModelIndex& index, int role) const { if (column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_DURATION)) { int duration = value.toInt(); if (duration > 0) { - value = mixxx::Duration::formatSeconds(duration); + value = mixxx::Duration::formatTime(duration); } else { value = QString(); } diff --git a/src/library/crate/cratesummary.h b/src/library/crate/cratesummary.h index 4318a9ee40b..88407a5c566 100644 --- a/src/library/crate/cratesummary.h +++ b/src/library/crate/cratesummary.h @@ -34,7 +34,7 @@ class CrateSummary: public Crate { } // Returns the duration formatted as a string H:MM:SS QString getTrackDurationText() const { - return mixxx::Duration::formatSeconds(getTrackDuration(), mixxx::Duration::Precision::SECONDS); + return mixxx::Duration::formatTime(getTrackDuration(), mixxx::Duration::Precision::SECONDS); } private: diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 145dd8375eb..875d12c4d69 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -119,6 +119,8 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, comboBoxTimeFormat->clear(); comboBoxTimeFormat->addItem(tr("hh:mm:ss.zzz - Traditional"), static_cast(TrackTime::DisplayFormat::TRADITIONAL)); + comboBoxTimeFormat->addItem(tr("s%1zz - Seconds").arg(mixxx::DurationBase::kCentisecondSeperator), + static_cast(TrackTime::DisplayFormat::SECOND)); comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds").arg(mixxx::DurationBase::kCentisecondSeperator), static_cast(TrackTime::DisplayFormat::KILO_SECOND)); comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kCentisecondSeperator), diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index ad77a70501c..4e6e99b5984 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -24,6 +24,7 @@ namespace TrackTime { }; enum class DisplayFormat { TRADITIONAL, + SECOND, KILO_SECOND, HECTO_SECOND, }; diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index 4d85bdd34db..a6bae18f944 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -25,6 +25,23 @@ class DurationUtilTest : public testing::Test { } } + void formatTime(QString expectedMilliseconds, double dSeconds) { + ASSERT_LE(4, expectedMilliseconds.length()); // 3 digits + 1 decimal point + const QString actualSeconds = + mixxx::Duration::formatTime(dSeconds, mixxx::Duration::Precision::SECONDS); + const QString expectedSeconds = + adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::SECONDS); + EXPECT_EQ(expectedSeconds, actualSeconds); + const QString expectedCentiseconds = + adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::CENTISECONDS); + const QString actualCentiseconds = + mixxx::Duration::formatTime(dSeconds, mixxx::Duration::Precision::CENTISECONDS); + EXPECT_EQ(expectedCentiseconds, actualCentiseconds); + const QString actualMilliseconds = + mixxx::Duration::formatTime(dSeconds, mixxx::Duration::Precision::MILLISECONDS); + EXPECT_EQ(actualMilliseconds, actualMilliseconds); + } + void formatSeconds(QString expectedMilliseconds, double dSeconds) { ASSERT_LE(4, expectedMilliseconds.length()); // 3 digits + 1 decimal point const QString actualSeconds = @@ -78,25 +95,34 @@ class DurationUtilTest : public testing::Test { }; TEST_F(DurationUtilTest, FormatSecondsNegative) { - EXPECT_EQ("?", mixxx::Duration::formatSeconds(-1, mixxx::Duration::Precision::SECONDS)); - EXPECT_EQ("?", mixxx::Duration::formatSeconds(-1, mixxx::Duration::Precision::CENTISECONDS)); - EXPECT_EQ("?", mixxx::Duration::formatSeconds(-1, mixxx::Duration::Precision::MILLISECONDS)); + EXPECT_EQ("?", mixxx::Duration::formatTime(-1, mixxx::Duration::Precision::SECONDS)); + EXPECT_EQ("?", mixxx::Duration::formatTime(-1, mixxx::Duration::Precision::CENTISECONDS)); + EXPECT_EQ("?", mixxx::Duration::formatTime(-1, mixxx::Duration::Precision::MILLISECONDS)); +} + +TEST_F(DurationUtilTest, formatTime) { + formatTime("00:00.000", 0); + formatTime("00:01.000", 1); + formatTime("00:59.000", 59); + formatTime("01:00.000", 60); + formatTime("01:01.123", 61.1234); + formatTime("59:59.999", 3599.999); + formatTime("01:00:00.000", 3600); + formatTime("23:59:59.000", 24 * 3600 - 1); + formatTime("24:00:00.000", 24 * 3600); + formatTime("24:00:01.000", 24 * 3600 + 1); + formatTime("25:00:01.000", 25 * 3600 + 1); } -TEST_F(DurationUtilTest, FormatSeconds) { - formatSeconds("00:00.000", 0); - formatSeconds("00:01.000", 1); - formatSeconds("00:59.000", 59); - formatSeconds("01:00.000", 60); - formatSeconds("01:01.123", 61.1234); - formatSeconds("59:59.999", 3599.999); - formatSeconds("01:00:00.000", 3600); - formatSeconds("23:59:59.000", 24 * 3600 - 1); - formatSeconds("24:00:00.000", 24 * 3600); - formatSeconds("24:00:01.000", 24 * 3600 + 1); - formatSeconds("25:00:01.000", 25 * 3600 + 1); +TEST_F(DurationUtilTest, formatSecond) { + formatSeconds("0.000", 0); + formatSeconds("1.000", 1); + formatSeconds("59.000", 59); + formatSeconds("60.000", 60); + formatSeconds("321.123", 321.1234); } + TEST_F(DurationUtilTest, FormatKiloSeconds) { formatKiloSeconds(QString::fromUtf8("0.000\u2009000"), 0); formatKiloSeconds(QString::fromUtf8("0.001\u2009000"), 1); diff --git a/src/track/track.cpp b/src/track/track.cpp index 4c114cd4d69..af56ac263b2 100644 --- a/src/track/track.cpp +++ b/src/track/track.cpp @@ -442,7 +442,7 @@ QString Track::getDurationText(mixxx::Duration::Precision precision) const { } else { duration = getDuration(DurationRounding::NONE); } - return mixxx::Duration::formatSeconds(duration, precision); + return mixxx::Duration::formatTime(duration, precision); } QString Track::getTitle() const { diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 5fdc045fb23..9408b6f2b02 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -21,7 +21,7 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; QString DurationBase::kCentisecondSeperator = QString::fromUtf8("\u2009"); // static -QString DurationBase::formatSeconds(double dSeconds, Precision precision) { +QString DurationBase::formatTime(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported return "?"; @@ -52,6 +52,25 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { return durationString; } + +QString DurationBase::formatSeconds(double dSeconds, Precision precision) { + if (dSeconds < 0.0) { + // negative durations are not supported + return "?"; + } + QString durationString; + + if (Precision::CENTISECONDS == precision) { + durationString = QString("%1").arg(dSeconds,1,'f',2,'0'); + } else if (Precision::MILLISECONDS == precision) { + durationString = QString("%1").arg(dSeconds,1,'f',3,'0'); + } else { + durationString = QString("%1").arg(dSeconds,1,'f',0,'0'); + } + + return durationString; +} + // static QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { diff --git a/src/util/duration.h b/src/util/duration.h index cbde8e40626..5c9a083a03e 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -70,10 +70,13 @@ class DurationBase { // The standard way of formatting a floating-point duration in seconds. // Used for display of track duration, etc. + static QString formatTime( + double dSeconds, + Precision precision = Precision::SECONDS); + // Alternative format for duration based on seconds static QString formatSeconds( double dSeconds, Precision precision = Precision::SECONDS); - // Alternative format for duration based on kilo seconds static QString formatKiloSeconds( double dSeconds, Precision precision = Precision::SECONDS); diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index 0d25bab6ba9..5c29ed1cce3 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -64,8 +64,10 @@ void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { formatter = &mixxx::Duration::formatKiloSeconds; } else if (m_displayFormat == TrackTime::DisplayFormat::HECTO_SECOND) { formatter = &mixxx::Duration::formatHectoSeconds; + } else if (m_displayFormat == TrackTime::DisplayFormat::SECOND) { + formatter = &mixxx::Duration::formatSeconds; } else { - formatter = &mixxx::Duration::formatSeconds; + formatter = &mixxx::Duration::formatTime; } if (m_displayMode == TrackTime::DisplayMode::Elapsed) { From f6f2a7868a2bcf2718225dba1a409f99851f45f6 Mon Sep 17 00:00:00 2001 From: Daniel Poelzleithner Date: Tue, 15 May 2018 19:46:29 +0200 Subject: [PATCH 04/20] fixup tests. Try some unrelated character as seperator in hectoseconds. --- src/test/durationutiltest.cpp | 22 +++++++++++----------- src/util/duration.cpp | 5 +++-- src/util/duration.h | 3 ++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index a6bae18f944..f9875f7b8b8 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -138,17 +138,17 @@ TEST_F(DurationUtilTest, FormatKiloSeconds) { } TEST_F(DurationUtilTest, FormatHectoSeconds) { - formatHectoSeconds(QString::fromUtf8("0.00\u2009000"), 0); - formatHectoSeconds(QString::fromUtf8("0.01\u2009000"), 1); - formatHectoSeconds(QString::fromUtf8("0.01\u2009500"), 1.5); - formatHectoSeconds(QString::fromUtf8("0.01\u2009510"), 1.51); - formatHectoSeconds(QString::fromUtf8("0.01\u2009490"), 1.49); - formatHectoSeconds(QString::fromUtf8("0.59\u2009000"), 59); - formatHectoSeconds(QString::fromUtf8("0.60\u2009000"), 60); - formatHectoSeconds(QString::fromUtf8("0.61\u2009123"), 61.1234); - formatHectoSeconds(QString::fromUtf8("9.99\u2009990"), 999.99); - formatHectoSeconds(QString::fromUtf8("10.00\u2009000"), 1000.00); - formatHectoSeconds(QString::fromUtf8("864.00\u2009000"), 24 * 3600); + formatHectoSeconds(QString::fromUtf8("0\u231E00\u2009000"), 0); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009000"), 1); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009500"), 1.5); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009510"), 1.51); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009490"), 1.49); + formatHectoSeconds(QString::fromUtf8("0\u231E59\u2009000"), 59); + formatHectoSeconds(QString::fromUtf8("0\u231E60\u2009000"), 60); + formatHectoSeconds(QString::fromUtf8("0\u231E61\u2009123"), 61.1234); + formatHectoSeconds(QString::fromUtf8("9\u231E99\u2009990"), 999.99); + formatHectoSeconds(QString::fromUtf8("10\u231E00\u2009000"), 1000.00); + formatHectoSeconds(QString::fromUtf8("864\u231E00\u2009000"), 24 * 3600); } diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 9408b6f2b02..9ed65a77015 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -18,7 +18,8 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; } // namespace // static -QString DurationBase::kCentisecondSeperator = QString::fromUtf8("\u2009"); +QChar DurationBase::kCentisecondSeperator = QChar(0x2009); +QChar DurationBase::kHectosecondSeperator = QChar(0x231E); // static QString DurationBase::formatTime(double dSeconds, Precision precision) { @@ -110,7 +111,7 @@ QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { double subs = fmod(dSeconds, 1); QString durationString = - QString("%1.%2").arg(hecto, 0, 10).arg(seconds, 2, 'f', 0, QLatin1Char('0')); + QString("%1%2%3").arg(hecto, 0, 10).arg(kHectosecondSeperator).arg(seconds, 2, 'f', 0, QLatin1Char('0')); if (Precision::SECONDS != precision) { durationString += kCentisecondSeperator % QString::number(subs, 'f', 3).right(3); } diff --git a/src/util/duration.h b/src/util/duration.h index 5c9a083a03e..933826c4d85 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -89,7 +89,8 @@ class DurationBase { static constexpr qint64 kNanosPerSecond = kMicrosPerSecond * 1000; static constexpr qint64 kNanosPerMilli = kNanosPerSecond / 1000; static constexpr qint64 kNanosPerMicro = kNanosPerMilli / 1000; - static QString kCentisecondSeperator; + static QChar kCentisecondSeperator; + static QChar kHectosecondSeperator; protected: explicit DurationBase(qint64 durationNanos) From 22a2b4c029ad379211b47f9a1ce04eea3e734c36 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 13 Oct 2018 21:44:48 +0100 Subject: [PATCH 05/20] Implement switchable time format for decks by @poelzi - #1652 --- src/preferences/dialog/dlgprefdeck.cpp | 8 ++---- src/preferences/dialog/dlgprefdeck.h | 5 ++-- src/util/duration.cpp | 13 +++++---- src/util/duration.h | 4 +-- src/widget/wnumberpos.cpp | 40 ++++++++++++-------------- 5 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 875d12c4d69..0970c003957 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -119,13 +119,12 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, comboBoxTimeFormat->clear(); comboBoxTimeFormat->addItem(tr("hh:mm:ss.zzz - Traditional"), static_cast(TrackTime::DisplayFormat::TRADITIONAL)); - comboBoxTimeFormat->addItem(tr("s%1zz - Seconds").arg(mixxx::DurationBase::kCentisecondSeperator), + comboBoxTimeFormat->addItem(tr("s%1zz - Seconds").arg(mixxx::DurationBase::kCentisecondSeparator), static_cast(TrackTime::DisplayFormat::SECOND)); - comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds").arg(mixxx::DurationBase::kCentisecondSeperator), + comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds").arg(mixxx::DurationBase::kCentisecondSeparator), static_cast(TrackTime::DisplayFormat::KILO_SECOND)); - comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kCentisecondSeperator), + comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kCentisecondSeparator), static_cast(TrackTime::DisplayFormat::HECTO_SECOND)); - double time_format = static_cast( m_pConfig->getValue( ConfigKey("[Controls]", "TimeFormat"), @@ -525,7 +524,6 @@ void DlgPrefDeck::slotRateRampingModeLinearButton(bool checked) { void DlgPrefDeck::slotTimeFormatChanged(double v) { int i = static_cast(v); - m_pConfig->set(ConfigKey("[Controls]","TimeFormat"), ConfigValue(v)); comboBoxTimeFormat->setCurrentIndex( comboBoxTimeFormat->findData(i)); diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index 4e6e99b5984..411165f9235 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -20,13 +20,14 @@ namespace TrackTime { enum class DisplayMode { Elapsed, Remaining, - ElapsedAndRemaining, + ElapsedAndRemaining }; + enum class DisplayFormat { TRADITIONAL, SECOND, KILO_SECOND, - HECTO_SECOND, + HECTO_SECOND }; } diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 9ed65a77015..911f80a9176 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -3,7 +3,7 @@ #include #include #include -#include + #include "util/assert.h" #include "util/math.h" @@ -18,8 +18,8 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; } // namespace // static -QChar DurationBase::kCentisecondSeperator = QChar(0x2009); -QChar DurationBase::kHectosecondSeperator = QChar(0x231E); +QChar DurationBase::kCentisecondSeparator = QChar(0x2009); +QChar DurationBase::kHectosecondSeparator = QChar(0x231E); // static QString DurationBase::formatTime(double dSeconds, Precision precision) { @@ -86,7 +86,7 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { QString durationString = QString("%1.%2").arg(kilos, 0, 10).arg(seconds, 3, 'f', 0, QLatin1Char('0')); if (Precision::SECONDS != precision) { - durationString += kCentisecondSeperator % QString::number(subs, 'f', 3).right(3); + durationString += kCentisecondSeparator % QString::number(subs, 'f', 3).right(3); } // The format string gives us milliseconds but we want @@ -111,11 +111,12 @@ QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { double subs = fmod(dSeconds, 1); QString durationString = - QString("%1%2%3").arg(hecto, 0, 10).arg(kHectosecondSeperator).arg(seconds, 2, 'f', 0, QLatin1Char('0')); + QString("%1%2%3").arg(hecto, 0, 10).arg(kHectosecondSeparator).arg(seconds, 2, 'f', 0, QLatin1Char('0')); if (Precision::SECONDS != precision) { - durationString += kCentisecondSeperator % QString::number(subs, 'f', 3).right(3); + durationString += kCentisecondSeparator % QString::number(subs, 'f', 3).right(3); } + // The format string gives us milliseconds but we want // centiseconds. Slice one character off. if (Precision::CENTISECONDS == precision) { diff --git a/src/util/duration.h b/src/util/duration.h index 933826c4d85..05303c301be 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -89,8 +89,8 @@ class DurationBase { static constexpr qint64 kNanosPerSecond = kMicrosPerSecond * 1000; static constexpr qint64 kNanosPerMilli = kNanosPerSecond / 1000; static constexpr qint64 kNanosPerMicro = kNanosPerMilli / 1000; - static QChar kCentisecondSeperator; - static QChar kHectosecondSeperator; + static QChar kCentisecondSeparator; + static QChar kHectosecondSeparator; protected: explicit DurationBase(qint64 durationNanos) diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index 5c29ed1cce3..552dc01717b 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -58,42 +58,40 @@ void WNumberPos::setValue(double dValue) { void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { double dTimeRemaining = m_pTimeRemaining->get(); - QString (*formatter)(double dSeconds, mixxx::Duration::Precision precision); + QString (*timeFormat)(double dSeconds, mixxx::Duration::Precision precision); if (m_displayFormat == TrackTime::DisplayFormat::KILO_SECOND) { - formatter = &mixxx::Duration::formatKiloSeconds; + timeFormat = &mixxx::Duration::formatKiloSeconds; } else if (m_displayFormat == TrackTime::DisplayFormat::HECTO_SECOND) { - formatter = &mixxx::Duration::formatHectoSeconds; + timeFormat = &mixxx::Duration::formatHectoSeconds; } else if (m_displayFormat == TrackTime::DisplayFormat::SECOND) { - formatter = &mixxx::Duration::formatSeconds; + timeFormat = &mixxx::Duration::formatSeconds; } else { - formatter = &mixxx::Duration::formatTime; + timeFormat = &mixxx::Duration::formatTime; } if (m_displayMode == TrackTime::DisplayMode::Elapsed) { if (dTimeElapsed >= 0.0) { - setText(formatter( - dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); + setText(timeFormat( + dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); } else { - setText(QLatin1String("-") % formatter( - -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); + setText(QLatin1String("-") % timeFormat( + -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); } } else if (m_displayMode == TrackTime::DisplayMode::Remaining) { - setText(QLatin1String("-") % formatter( - dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); + setText(QLatin1String("-") % timeFormat( + dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); } else if (m_displayMode == TrackTime::DisplayMode::ElapsedAndRemaining) { if (dTimeElapsed >= 0.0) { - setText(formatter( - dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) - % QLatin1String(" -") % - formatter( - dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); + setText(timeFormat( + dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) + % QLatin1String(" -") % timeFormat( + dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); } else { - setText(QLatin1String("-") % formatter( - -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) - % QLatin1String(" -") % - formatter( - dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); + setText(QLatin1String("-") % timeFormat( + -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) + % QLatin1String(" -") % timeFormat( + dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); } } m_dOldTimeElapsed = dTimeElapsed; From a87dc95fb42327fca2353da979191672583e95c6 Mon Sep 17 00:00:00 2001 From: beenisss <36423450+beenisss@users.noreply.github.com> Date: Sun, 4 Nov 2018 09:27:15 +0000 Subject: [PATCH 06/20] Comment to identify separator characters --- src/util/duration.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 911f80a9176..20f67c94c11 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -18,7 +18,9 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; } // namespace // static +// Unicode for thin space QChar DurationBase::kCentisecondSeparator = QChar(0x2009); +// Unicode for bottom left corner QChar DurationBase::kHectosecondSeparator = QChar(0x231E); // static From 5f1196c8cc858141383ea085b0a883cbf249d327 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 22 Nov 2018 19:26:50 +0000 Subject: [PATCH 07/20] Fix issues identified by CodeFactor --- src/widget/wnumberpos.cpp | 1 - src/widget/wnumberpos.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index 552dc01717b..8c725a27d7f 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -27,7 +27,6 @@ WNumberPos::WNumberPos(const char* group, QWidget* parent) m_pTimeFormat->connectValueChanged( SLOT(slotSetTimeFormat(double))); slotSetTimeFormat(m_pTimeFormat->get()); - } void WNumberPos::mousePressEvent(QMouseEvent* pEvent) { diff --git a/src/widget/wnumberpos.h b/src/widget/wnumberpos.h index 10694fc6008..03aac328df4 100644 --- a/src/widget/wnumberpos.h +++ b/src/widget/wnumberpos.h @@ -12,6 +12,7 @@ class ControlProxy; class WNumberPos : public WNumber { Q_OBJECT + public: explicit WNumberPos(const char *group, QWidget *parent=nullptr); From 5dc62e6e4a55dafdcf326a0d56d5ebf7c5fd3c51 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 6 Jan 2019 16:31:55 +0000 Subject: [PATCH 08/20] Replace if with VERIFY_OR_DEBUG_ASSERT in src/util/duration.cpp --- src/util/duration.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 20f67c94c11..4fa615b3c4c 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -25,9 +25,9 @@ QChar DurationBase::kHectosecondSeparator = QChar(0x231E); // static QString DurationBase::formatTime(double dSeconds, Precision precision) { - if (dSeconds < 0.0) { + VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { // negative durations are not supported - return "?"; + // TODO:(XXX) Does this actually need to do anything? } const qint64 days = static_cast(std::floor(dSeconds)) / kSecondsPerDay; @@ -57,10 +57,11 @@ QString DurationBase::formatTime(double dSeconds, Precision precision) { } QString DurationBase::formatSeconds(double dSeconds, Precision precision) { - if (dSeconds < 0.0) { + VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { // negative durations are not supported - return "?"; + // TODO:(XXX) Does this actually need to do anything? } + QString durationString; if (Precision::CENTISECONDS == precision) { @@ -76,9 +77,9 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { // static QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { - if (dSeconds < 0.0) { + VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { // negative durations are not supported - return "?"; + // TODO:(XXX) Does this actually need to do anything? } int kilos = (int)dSeconds / 1000; @@ -103,9 +104,9 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { // static QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { - if (dSeconds < 0.0) { + VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { // negative durations are not supported - return "?"; + // TODO:(XXX) Does this actually need to do anything? } int hecto = (int)dSeconds / 100; From 7685e0a96115eb972c3f6bdd9dce5e9f2cee290a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 6 Jan 2019 22:56:55 +0100 Subject: [PATCH 09/20] reintroduce the lost "?" for negative durations --- src/util/duration.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 4fa615b3c4c..e85832371f4 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -25,9 +25,9 @@ QChar DurationBase::kHectosecondSeparator = QChar(0x231E); // static QString DurationBase::formatTime(double dSeconds, Precision precision) { - VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { + if (dSeconds < 0.0) { // negative durations are not supported - // TODO:(XXX) Does this actually need to do anything? + return "?"; } const qint64 days = static_cast(std::floor(dSeconds)) / kSecondsPerDay; @@ -57,9 +57,9 @@ QString DurationBase::formatTime(double dSeconds, Precision precision) { } QString DurationBase::formatSeconds(double dSeconds, Precision precision) { - VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { + if (dSeconds < 0.0) { // negative durations are not supported - // TODO:(XXX) Does this actually need to do anything? + return "?"; } QString durationString; @@ -77,9 +77,9 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { // static QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { - VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { + if (dSeconds < 0.0) { // negative durations are not supported - // TODO:(XXX) Does this actually need to do anything? + return "?"; } int kilos = (int)dSeconds / 1000; @@ -104,9 +104,9 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { // static QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { - VERIFY_OR_DEBUG_ASSERT (dSeconds >= 0.0) { + if (dSeconds < 0.0) { // negative durations are not supported - // TODO:(XXX) Does this actually need to do anything? + return "?"; } int hecto = (int)dSeconds / 100; From 3efd74d27086eb944581b0d876859666935d0831 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 10 Jan 2019 21:01:07 +0000 Subject: [PATCH 10/20] Add 'Traditional (Coarse)' time format option --- src/preferences/dialog/dlgprefdeck.cpp | 6 ++++-- src/preferences/dialog/dlgprefdeck.h | 1 + src/widget/wnumberpos.cpp | 28 +++++++++++++------------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 0970c003957..6ab215fc0d0 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -117,13 +117,15 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, QLocale locale; // Track Display model comboBoxTimeFormat->clear(); - comboBoxTimeFormat->addItem(tr("hh:mm:ss.zzz - Traditional"), + comboBoxTimeFormat->addItem(tr("hh:mm:ss.zz - Traditional"), static_cast(TrackTime::DisplayFormat::TRADITIONAL)); + comboBoxTimeFormat->addItem(tr("hh:mm:ss - Traditional (Coarse)"), + static_cast(TrackTime::DisplayFormat::TRADITIONAL_COARSE)); comboBoxTimeFormat->addItem(tr("s%1zz - Seconds").arg(mixxx::DurationBase::kCentisecondSeparator), static_cast(TrackTime::DisplayFormat::SECOND)); comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds").arg(mixxx::DurationBase::kCentisecondSeparator), static_cast(TrackTime::DisplayFormat::KILO_SECOND)); - comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kCentisecondSeparator), + comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kHectosecondSeparator), static_cast(TrackTime::DisplayFormat::HECTO_SECOND)); double time_format = static_cast( m_pConfig->getValue( diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index 411165f9235..63452f062cc 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -25,6 +25,7 @@ namespace TrackTime { enum class DisplayFormat { TRADITIONAL, + TRADITIONAL_COARSE, SECOND, KILO_SECOND, HECTO_SECOND diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index 8c725a27d7f..a306bed6ed7 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -69,28 +69,28 @@ void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { timeFormat = &mixxx::Duration::formatTime; } + mixxx::Duration::Precision precision; + if (m_displayFormat != TrackTime::DisplayFormat::TRADITIONAL_COARSE) { + precision = mixxx::Duration::Precision::CENTISECONDS; + } else { + precision = mixxx::Duration::Precision::SECONDS; + } + if (m_displayMode == TrackTime::DisplayMode::Elapsed) { if (dTimeElapsed >= 0.0) { - setText(timeFormat( - dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); + setText(timeFormat(dTimeElapsed, precision)); } else { - setText(QLatin1String("-") % timeFormat( - -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS)); + setText(QLatin1String("-") % timeFormat(-dTimeElapsed, precision)); } } else if (m_displayMode == TrackTime::DisplayMode::Remaining) { - setText(QLatin1String("-") % timeFormat( - dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); + setText(QLatin1String("-") % timeFormat(dTimeRemaining, precision)); } else if (m_displayMode == TrackTime::DisplayMode::ElapsedAndRemaining) { if (dTimeElapsed >= 0.0) { - setText(timeFormat( - dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) - % QLatin1String(" -") % timeFormat( - dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); + setText(timeFormat(dTimeElapsed, precision) + % QLatin1String(" -") % timeFormat(dTimeRemaining, precision)); } else { - setText(QLatin1String("-") % timeFormat( - -dTimeElapsed, mixxx::Duration::Precision::CENTISECONDS) - % QLatin1String(" -") % timeFormat( - dTimeRemaining, mixxx::Duration::Precision::CENTISECONDS)); + setText(QLatin1String("-") % timeFormat(-dTimeElapsed, precision) + % QLatin1String(" -") % timeFormat(dTimeRemaining, precision)); } } m_dOldTimeElapsed = dTimeElapsed; From c0d3cae16b9d7ed48efa9213f999c3e9dbebefec Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 10 Jan 2019 21:05:10 +0000 Subject: [PATCH 11/20] Minor formatting corrections to duration.cpp --- src/preferences/dialog/dlgprefdeck.h | 4 ++-- src/util/duration.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index 63452f062cc..00c105befe8 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -20,7 +20,7 @@ namespace TrackTime { enum class DisplayMode { Elapsed, Remaining, - ElapsedAndRemaining + ElapsedAndRemaining, }; enum class DisplayFormat { @@ -28,7 +28,7 @@ namespace TrackTime { TRADITIONAL_COARSE, SECOND, KILO_SECOND, - HECTO_SECOND + HECTO_SECOND, }; } diff --git a/src/util/duration.cpp b/src/util/duration.cpp index e85832371f4..6e6e2733aa1 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -27,7 +27,7 @@ QChar DurationBase::kHectosecondSeparator = QChar(0x231E); QString DurationBase::formatTime(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return "?"; } const qint64 days = static_cast(std::floor(dSeconds)) / kSecondsPerDay; @@ -59,7 +59,7 @@ QString DurationBase::formatTime(double dSeconds, Precision precision) { QString DurationBase::formatSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return "?"; } QString durationString; @@ -79,7 +79,7 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return "?"; } int kilos = (int)dSeconds / 1000; @@ -106,7 +106,7 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return "?"; } int hecto = (int)dSeconds / 100; From 5fe1f0fc674cff4f150e5859a5fee572436ff3be Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 10 Jan 2019 21:40:09 +0000 Subject: [PATCH 12/20] Re-format dlgprefdeck.cpp:120 onwards to make more readable --- src/preferences/dialog/dlgprefdeck.cpp | 33 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 6ab215fc0d0..f5f067f5f23 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -117,20 +117,33 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, QLocale locale; // Track Display model comboBoxTimeFormat->clear(); + comboBoxTimeFormat->addItem(tr("hh:mm:ss.zz - Traditional"), - static_cast(TrackTime::DisplayFormat::TRADITIONAL)); + static_cast + (TrackTime::DisplayFormat::TRADITIONAL)); + comboBoxTimeFormat->addItem(tr("hh:mm:ss - Traditional (Coarse)"), - static_cast(TrackTime::DisplayFormat::TRADITIONAL_COARSE)); - comboBoxTimeFormat->addItem(tr("s%1zz - Seconds").arg(mixxx::DurationBase::kCentisecondSeparator), + static_cast + (TrackTime::DisplayFormat::TRADITIONAL_COARSE)); + + comboBoxTimeFormat->addItem(tr("s%1zz - Seconds") + .arg(mixxx::DurationBase::kCentisecondSeparator), static_cast(TrackTime::DisplayFormat::SECOND)); - comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds").arg(mixxx::DurationBase::kCentisecondSeparator), - static_cast(TrackTime::DisplayFormat::KILO_SECOND)); - comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds").arg(mixxx::DurationBase::kHectosecondSeparator), - static_cast(TrackTime::DisplayFormat::HECTO_SECOND)); + + comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds") + .arg(mixxx::DurationBase::kCentisecondSeparator), + static_cast + (TrackTime::DisplayFormat::KILO_SECOND)); + + comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds") + .arg(mixxx::DurationBase::kHectosecondSeparator), + static_cast + (TrackTime::DisplayFormat::HECTO_SECOND)); + double time_format = static_cast( - m_pConfig->getValue( - ConfigKey("[Controls]", "TimeFormat"), - static_cast(TrackTime::DisplayFormat::TRADITIONAL))); + m_pConfig->getValue( + ConfigKey("[Controls]", "TimeFormat"), + static_cast(TrackTime::DisplayFormat::TRADITIONAL))); m_pControlTrackTimeFormat->set(time_format); comboBoxTimeFormat->setCurrentIndex( comboBoxTimeFormat->findData(time_format)); From 341242a9bff43f1b66e52f14fe86881e4ad01924 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 11 Jan 2019 19:19:06 +0000 Subject: [PATCH 13/20] Remove 'hh:' from descrptions in time format drop-down in Deck Preferences --- src/preferences/dialog/dlgprefdeck.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index f5f067f5f23..7a897fd9290 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -118,11 +118,11 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, // Track Display model comboBoxTimeFormat->clear(); - comboBoxTimeFormat->addItem(tr("hh:mm:ss.zz - Traditional"), + comboBoxTimeFormat->addItem(tr("mm:ss.zz - Traditional"), static_cast (TrackTime::DisplayFormat::TRADITIONAL)); - comboBoxTimeFormat->addItem(tr("hh:mm:ss - Traditional (Coarse)"), + comboBoxTimeFormat->addItem(tr("mm:ss - Traditional (Coarse)"), static_cast (TrackTime::DisplayFormat::TRADITIONAL_COARSE)); From f27e92d8664155d37efec7470afd71b8bac20bcd Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 12 Jan 2019 18:59:10 +0000 Subject: [PATCH 14/20] Clean up deck time formatting logic The choice of variable names for separator characters (both 'group' separator characters and decimal separator), as well as the actual application of formatting, was inconsistent and confusing. Now it's better, hopefully. --- src/util/duration.cpp | 16 +++++++++------- src/util/duration.h | 5 +++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 6e6e2733aa1..adba0c8f54d 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -19,9 +19,11 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; // static // Unicode for thin space -QChar DurationBase::kCentisecondSeparator = QChar(0x2009); +QChar DurationBase::kKiloGroupSeparator = QChar(0x2009); // Unicode for bottom left corner -QChar DurationBase::kHectosecondSeparator = QChar(0x231E); +QChar DurationBase::kHectoGroupSeparator = QChar(0x231E); +// Unicode for decimal point +QChar DurationBase::kDecimalSeparator = QChar(0x002E); // static QString DurationBase::formatTime(double dSeconds, Precision precision) { @@ -87,9 +89,9 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { double subs = fmod(dSeconds, 1); QString durationString = - QString("%1.%2").arg(kilos, 0, 10).arg(seconds, 3, 'f', 0, QLatin1Char('0')); + QString("%1%2%3").arg(kilos, 0, 10).arg(kKiloGroupSeparator).arg(seconds, 3, 'f', 0, QLatin1Char('0')); if (Precision::SECONDS != precision) { - durationString += kCentisecondSeparator % QString::number(subs, 'f', 3).right(3); + durationString += kDecimalSeparator % QString::number(subs, 'f', 3).right(3); } // The format string gives us milliseconds but we want @@ -109,14 +111,14 @@ QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { return "?"; } - int hecto = (int)dSeconds / 100; + int hectos = (int)dSeconds / 100; double seconds = floor(fmod(dSeconds, 100)); double subs = fmod(dSeconds, 1); QString durationString = - QString("%1%2%3").arg(hecto, 0, 10).arg(kHectosecondSeparator).arg(seconds, 2, 'f', 0, QLatin1Char('0')); + QString("%1%2%3").arg(hectos, 0, 10).arg(kHectoGroupSeparator).arg(seconds, 2, 'f', 0, QLatin1Char('0')); if (Precision::SECONDS != precision) { - durationString += kCentisecondSeparator % QString::number(subs, 'f', 3).right(3); + durationString += kDecimalSeparator % QString::number(subs, 'f', 3).right(3); } diff --git a/src/util/duration.h b/src/util/duration.h index 05303c301be..f66b0d441f5 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -89,8 +89,9 @@ class DurationBase { static constexpr qint64 kNanosPerSecond = kMicrosPerSecond * 1000; static constexpr qint64 kNanosPerMilli = kNanosPerSecond / 1000; static constexpr qint64 kNanosPerMicro = kNanosPerMilli / 1000; - static QChar kCentisecondSeparator; - static QChar kHectosecondSeparator; + static QChar kKiloGroupSeparator; + static QChar kHectoGroupSeparator; + static QChar kDecimalSeparator; protected: explicit DurationBase(qint64 durationNanos) From 66c48cd02853f6d7a523809253ec3d358b2ceaee Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 12 Jan 2019 19:03:29 +0000 Subject: [PATCH 15/20] Fix entries in deck time prefs drop-down These were using a mix of hard-coded and argument-based separator characters and also didn't match the intended formatting. This is now fixed and all separator characters are now argument-based. --- src/preferences/dialog/dlgprefdeck.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 7a897fd9290..161aaa40c34 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -118,7 +118,8 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, // Track Display model comboBoxTimeFormat->clear(); - comboBoxTimeFormat->addItem(tr("mm:ss.zz - Traditional"), + comboBoxTimeFormat->addItem(tr("mm:ss%1zz - Traditional") + .arg(mixxx::DurationBase::kDecimalSeparator), static_cast (TrackTime::DisplayFormat::TRADITIONAL)); @@ -127,16 +128,19 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, (TrackTime::DisplayFormat::TRADITIONAL_COARSE)); comboBoxTimeFormat->addItem(tr("s%1zz - Seconds") - .arg(mixxx::DurationBase::kCentisecondSeparator), - static_cast(TrackTime::DisplayFormat::SECOND)); + .arg(mixxx::DurationBase::kDecimalSeparator), + static_cast + (TrackTime::DisplayFormat::SECOND)); - comboBoxTimeFormat->addItem(tr("k.sss%1zz - Kiloseconds") - .arg(mixxx::DurationBase::kCentisecondSeparator), + comboBoxTimeFormat->addItem(tr("k%1sss%2zz - Kiloseconds") + .arg(mixxx::DurationBase::kKiloGroupSeparator) + .arg(mixxx::DurationBase::kDecimalSeparator), static_cast (TrackTime::DisplayFormat::KILO_SECOND)); - comboBoxTimeFormat->addItem(tr("hs.ss%1zz - Hectoseconds") - .arg(mixxx::DurationBase::kHectosecondSeparator), + comboBoxTimeFormat->addItem(tr("hs%1ss%2zz - Hectoseconds") + .arg(mixxx::DurationBase::kHectoGroupSeparator) + .arg(mixxx::DurationBase::kDecimalSeparator), static_cast (TrackTime::DisplayFormat::HECTO_SECOND)); From d356226f9e620e63ba90a109135bc926b9fbfc14 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 12 Jan 2019 19:24:01 +0000 Subject: [PATCH 16/20] Amend durationutiltest.cpp following previous 2 commits --- src/test/durationutiltest.cpp | 44 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index f9875f7b8b8..d98ece2b9ad 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -124,31 +124,31 @@ TEST_F(DurationUtilTest, formatSecond) { TEST_F(DurationUtilTest, FormatKiloSeconds) { - formatKiloSeconds(QString::fromUtf8("0.000\u2009000"), 0); - formatKiloSeconds(QString::fromUtf8("0.001\u2009000"), 1); - formatKiloSeconds(QString::fromUtf8("0.001\u2009500"), 1.5); - formatKiloSeconds(QString::fromUtf8("0.001\u2009510"), 1.51); - formatKiloSeconds(QString::fromUtf8("0.001\u2009490"), 1.49); - formatKiloSeconds(QString::fromUtf8("0.059\u2009000"), 59); - formatKiloSeconds(QString::fromUtf8("0.060\u2009000"), 60); - formatKiloSeconds(QString::fromUtf8("0.061\u2009123"), 61.1234); - formatKiloSeconds(QString::fromUtf8("0.999\u2009990"), 999.99); - formatKiloSeconds(QString::fromUtf8("1.000\u2009000"), 1000.00); - formatKiloSeconds(QString::fromUtf8("86.400\u2009000"), 24 * 3600); + formatKiloSeconds(QString::fromUtf8("0\u2009000\u002E000"), 0); + formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E000"), 1); + formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E500"), 1.5); + formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E510"), 1.51); + formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E490"), 1.49); + formatKiloSeconds(QString::fromUtf8("0\u2009059\u002E000"), 59); + formatKiloSeconds(QString::fromUtf8("0\u2009060\u002E000"), 60); + formatKiloSeconds(QString::fromUtf8("0\u2009061\u002E123"), 61.1234); + formatKiloSeconds(QString::fromUtf8("0\u2009999\u002E990"), 999.99); + formatKiloSeconds(QString::fromUtf8("1\u2009000\u002E000"), 1000.00); + formatKiloSeconds(QString::fromUtf8("86\u2009400\u002E000"), 24 * 3600); } TEST_F(DurationUtilTest, FormatHectoSeconds) { - formatHectoSeconds(QString::fromUtf8("0\u231E00\u2009000"), 0); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009000"), 1); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009500"), 1.5); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009510"), 1.51); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u2009490"), 1.49); - formatHectoSeconds(QString::fromUtf8("0\u231E59\u2009000"), 59); - formatHectoSeconds(QString::fromUtf8("0\u231E60\u2009000"), 60); - formatHectoSeconds(QString::fromUtf8("0\u231E61\u2009123"), 61.1234); - formatHectoSeconds(QString::fromUtf8("9\u231E99\u2009990"), 999.99); - formatHectoSeconds(QString::fromUtf8("10\u231E00\u2009000"), 1000.00); - formatHectoSeconds(QString::fromUtf8("864\u231E00\u2009000"), 24 * 3600); + formatHectoSeconds(QString::fromUtf8("0\u231E00\u002E000"), 0); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E000"), 1); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E500"), 1.5); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E510"), 1.51); + formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E490"), 1.49); + formatHectoSeconds(QString::fromUtf8("0\u231E59\u002E000"), 59); + formatHectoSeconds(QString::fromUtf8("0\u231E60\u002E000"), 60); + formatHectoSeconds(QString::fromUtf8("0\u231E61\u002E123"), 61.1234); + formatHectoSeconds(QString::fromUtf8("9\u231E99\u002E990"), 999.99); + formatHectoSeconds(QString::fromUtf8("10\u231E00\u002E000"), 1000.00); + formatHectoSeconds(QString::fromUtf8("864\u231E00\u002E000"), 24 * 3600); } From 9977df39c8174e603b2e1a3cd3d8261c6905e245 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 13 Jan 2019 10:05:51 +0000 Subject: [PATCH 17/20] Refactor DisplayMode enum for consistency --- src/preferences/dialog/dlgprefdeck.cpp | 24 ++++++++++++------------ src/preferences/dialog/dlgprefdeck.h | 6 +++--- src/widget/wnumberpos.cpp | 24 ++++++++++++------------ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 161aaa40c34..72d06747363 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -83,26 +83,26 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, // If not present in the config, set the default value if (!m_pConfig->exists(ConfigKey("[Controls]","PositionDisplay"))) { m_pConfig->set(ConfigKey("[Controls]","PositionDisplay"), - QString::number(static_cast(TrackTime::DisplayMode::Remaining))); + QString::number(static_cast(TrackTime::DisplayMode::REMAINING))); } double positionDisplayType = m_pConfig->getValue( ConfigKey("[Controls]", "PositionDisplay"), - static_cast(TrackTime::DisplayMode::Elapsed)); + static_cast(TrackTime::DisplayMode::ELAPSED)); if (positionDisplayType == - static_cast(TrackTime::DisplayMode::Remaining)) { + static_cast(TrackTime::DisplayMode::REMAINING)) { radioButtonRemaining->setChecked(true); m_pControlTrackTimeDisplay->set( - static_cast(TrackTime::DisplayMode::Remaining)); + static_cast(TrackTime::DisplayMode::REMAINING)); } else if (positionDisplayType == - static_cast(TrackTime::DisplayMode::ElapsedAndRemaining)) { + static_cast(TrackTime::DisplayMode::ELAPSED_AND_REMAINING)) { radioButtonElapsedAndRemaining->setChecked(true); m_pControlTrackTimeDisplay->set( - static_cast(TrackTime::DisplayMode::ElapsedAndRemaining)); + static_cast(TrackTime::DisplayMode::ELAPSED_AND_REMAINING)); } else { radioButtonElapsed->setChecked(true); m_pControlTrackTimeDisplay->set( - static_cast(TrackTime::DisplayMode::Elapsed)); + static_cast(TrackTime::DisplayMode::ELAPSED)); } connect(buttonGroupTrackTime, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slotSetTrackTimeDisplay(QAbstractButton *))); @@ -493,20 +493,20 @@ void DlgPrefDeck::slotJumpToCueOnTrackLoadCheckbox(bool checked) { void DlgPrefDeck::slotSetTrackTimeDisplay(QAbstractButton* b) { if (b == radioButtonRemaining) { - m_timeDisplayMode = TrackTime::DisplayMode::Remaining; + m_timeDisplayMode = TrackTime::DisplayMode::REMAINING; } else if (b == radioButtonElapsedAndRemaining) { - m_timeDisplayMode = TrackTime::DisplayMode::ElapsedAndRemaining; + m_timeDisplayMode = TrackTime::DisplayMode::ELAPSED_AND_REMAINING; } else { - m_timeDisplayMode = TrackTime::DisplayMode::Elapsed; + m_timeDisplayMode = TrackTime::DisplayMode::ELAPSED; } } void DlgPrefDeck::slotSetTrackTimeDisplay(double v) { m_timeDisplayMode = static_cast(static_cast(v)); m_pConfig->set(ConfigKey("[Controls]","PositionDisplay"), ConfigValue(v)); - if (m_timeDisplayMode == TrackTime::DisplayMode::Remaining) { + if (m_timeDisplayMode == TrackTime::DisplayMode::REMAINING) { radioButtonRemaining->setChecked(true); - } else if (m_timeDisplayMode == TrackTime::DisplayMode::ElapsedAndRemaining) { + } else if (m_timeDisplayMode == TrackTime::DisplayMode::ELAPSED_AND_REMAINING) { radioButtonElapsedAndRemaining->setChecked(true); } else { // Elapsed radioButtonElapsed->setChecked(true); diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index 00c105befe8..018d062b270 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -18,9 +18,9 @@ class ControlObject; namespace TrackTime { enum class DisplayMode { - Elapsed, - Remaining, - ElapsedAndRemaining, + ELAPSED, + REMAINING, + ELAPSED_AND_REMAINING, }; enum class DisplayFormat { diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index a306bed6ed7..a053718e95d 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -34,12 +34,12 @@ void WNumberPos::mousePressEvent(QMouseEvent* pEvent) { if (leftClick) { // Cycle through display modes - if (m_displayMode == TrackTime::DisplayMode::Elapsed) { - m_displayMode = TrackTime::DisplayMode::Remaining; - } else if (m_displayMode == TrackTime::DisplayMode::Remaining) { - m_displayMode = TrackTime::DisplayMode::ElapsedAndRemaining; - } else if (m_displayMode == TrackTime::DisplayMode::ElapsedAndRemaining) { - m_displayMode = TrackTime::DisplayMode::Elapsed; + if (m_displayMode == TrackTime::DisplayMode::ELAPSED) { + m_displayMode = TrackTime::DisplayMode::REMAINING; + } else if (m_displayMode == TrackTime::DisplayMode::REMAINING) { + m_displayMode = TrackTime::DisplayMode::ELAPSED_AND_REMAINING; + } else if (m_displayMode == TrackTime::DisplayMode::ELAPSED_AND_REMAINING) { + m_displayMode = TrackTime::DisplayMode::ELAPSED; } m_pShowTrackTimeRemaining->set(static_cast(m_displayMode)); @@ -76,15 +76,15 @@ void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { precision = mixxx::Duration::Precision::SECONDS; } - if (m_displayMode == TrackTime::DisplayMode::Elapsed) { + if (m_displayMode == TrackTime::DisplayMode::ELAPSED) { if (dTimeElapsed >= 0.0) { setText(timeFormat(dTimeElapsed, precision)); } else { setText(QLatin1String("-") % timeFormat(-dTimeElapsed, precision)); } - } else if (m_displayMode == TrackTime::DisplayMode::Remaining) { + } else if (m_displayMode == TrackTime::DisplayMode::REMAINING) { setText(QLatin1String("-") % timeFormat(dTimeRemaining, precision)); - } else if (m_displayMode == TrackTime::DisplayMode::ElapsedAndRemaining) { + } else if (m_displayMode == TrackTime::DisplayMode::ELAPSED_AND_REMAINING) { if (dTimeElapsed >= 0.0) { setText(timeFormat(dTimeElapsed, precision) % QLatin1String(" -") % timeFormat(dTimeRemaining, precision)); @@ -109,11 +109,11 @@ void WNumberPos::slotTimeRemainingUpdated(double dTimeRemaining) { void WNumberPos::slotSetDisplayMode(double remain) { if (remain == 1.0) { - m_displayMode = TrackTime::DisplayMode::Remaining; + m_displayMode = TrackTime::DisplayMode::REMAINING; } else if (remain == 2.0) { - m_displayMode = TrackTime::DisplayMode::ElapsedAndRemaining; + m_displayMode = TrackTime::DisplayMode::ELAPSED_AND_REMAINING; } else { - m_displayMode = TrackTime::DisplayMode::Elapsed; + m_displayMode = TrackTime::DisplayMode::ELAPSED; } slotSetTimeElapsed(m_dOldTimeElapsed); From 5ba36deeb661802da50214a50b32ca6311ca4398 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 13 Jan 2019 10:20:40 +0000 Subject: [PATCH 18/20] Return const QString for invalid duration value --- src/util/duration.cpp | 9 +++++---- src/util/duration.h | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/util/duration.cpp b/src/util/duration.cpp index adba0c8f54d..993f1638caf 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -18,6 +18,7 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; } // namespace // static +const QString DurationBase::kInvalidDurationString = "?"; // Unicode for thin space QChar DurationBase::kKiloGroupSeparator = QChar(0x2009); // Unicode for bottom left corner @@ -29,7 +30,7 @@ QChar DurationBase::kDecimalSeparator = QChar(0x002E); QString DurationBase::formatTime(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return kInvalidDurationString; } const qint64 days = static_cast(std::floor(dSeconds)) / kSecondsPerDay; @@ -61,7 +62,7 @@ QString DurationBase::formatTime(double dSeconds, Precision precision) { QString DurationBase::formatSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return kInvalidDurationString; } QString durationString; @@ -81,7 +82,7 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return kInvalidDurationString; } int kilos = (int)dSeconds / 1000; @@ -108,7 +109,7 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported - return "?"; + return kInvalidDurationString; } int hectos = (int)dSeconds / 100; diff --git a/src/util/duration.h b/src/util/duration.h index f66b0d441f5..f0002ba0c68 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -14,6 +14,7 @@ namespace mixxx { class DurationBase { public: + enum Units { SECONDS, MILLIS, @@ -89,6 +90,7 @@ class DurationBase { static constexpr qint64 kNanosPerSecond = kMicrosPerSecond * 1000; static constexpr qint64 kNanosPerMilli = kNanosPerSecond / 1000; static constexpr qint64 kNanosPerMicro = kNanosPerMilli / 1000; + static const QString kInvalidDurationString; static QChar kKiloGroupSeparator; static QChar kHectoGroupSeparator; static QChar kDecimalSeparator; From 5d357b21d564d5c86091cdcce4e0b14de95faea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 19 Jan 2019 20:54:26 +0100 Subject: [PATCH 19/20] make time formats more like SI --- src/preferences/dialog/dlgprefdeck.cpp | 12 +++---- src/test/durationutiltest.cpp | 44 +++++++++++++------------- src/util/duration.cpp | 17 ++++++---- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 7c39a8f1b35..9437e4cc032 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -132,15 +132,15 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, static_cast (TrackTime::DisplayFormat::SECOND)); - comboBoxTimeFormat->addItem(tr("k%1sss%2zz - Kiloseconds") - .arg(mixxx::DurationBase::kKiloGroupSeparator) - .arg(mixxx::DurationBase::kDecimalSeparator), + comboBoxTimeFormat->addItem(tr("s%1sss%2zz - Kiloseconds") + .arg(QString(mixxx::DurationBase::kDecimalSeparator), + QString(mixxx::DurationBase::kKiloGroupSeparator)), static_cast (TrackTime::DisplayFormat::KILO_SECOND)); - comboBoxTimeFormat->addItem(tr("hs%1ss%2zz - Hectoseconds") - .arg(mixxx::DurationBase::kHectoGroupSeparator) - .arg(mixxx::DurationBase::kDecimalSeparator), + comboBoxTimeFormat->addItem(tr("s%1ss%2zz - Hectoseconds") + .arg(QString(mixxx::DurationBase::kDecimalSeparator), + QString(mixxx::DurationBase::kKiloGroupSeparator)), static_cast (TrackTime::DisplayFormat::HECTO_SECOND)); diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index d98ece2b9ad..a6bae18f944 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -124,31 +124,31 @@ TEST_F(DurationUtilTest, formatSecond) { TEST_F(DurationUtilTest, FormatKiloSeconds) { - formatKiloSeconds(QString::fromUtf8("0\u2009000\u002E000"), 0); - formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E000"), 1); - formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E500"), 1.5); - formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E510"), 1.51); - formatKiloSeconds(QString::fromUtf8("0\u2009001\u002E490"), 1.49); - formatKiloSeconds(QString::fromUtf8("0\u2009059\u002E000"), 59); - formatKiloSeconds(QString::fromUtf8("0\u2009060\u002E000"), 60); - formatKiloSeconds(QString::fromUtf8("0\u2009061\u002E123"), 61.1234); - formatKiloSeconds(QString::fromUtf8("0\u2009999\u002E990"), 999.99); - formatKiloSeconds(QString::fromUtf8("1\u2009000\u002E000"), 1000.00); - formatKiloSeconds(QString::fromUtf8("86\u2009400\u002E000"), 24 * 3600); + formatKiloSeconds(QString::fromUtf8("0.000\u2009000"), 0); + formatKiloSeconds(QString::fromUtf8("0.001\u2009000"), 1); + formatKiloSeconds(QString::fromUtf8("0.001\u2009500"), 1.5); + formatKiloSeconds(QString::fromUtf8("0.001\u2009510"), 1.51); + formatKiloSeconds(QString::fromUtf8("0.001\u2009490"), 1.49); + formatKiloSeconds(QString::fromUtf8("0.059\u2009000"), 59); + formatKiloSeconds(QString::fromUtf8("0.060\u2009000"), 60); + formatKiloSeconds(QString::fromUtf8("0.061\u2009123"), 61.1234); + formatKiloSeconds(QString::fromUtf8("0.999\u2009990"), 999.99); + formatKiloSeconds(QString::fromUtf8("1.000\u2009000"), 1000.00); + formatKiloSeconds(QString::fromUtf8("86.400\u2009000"), 24 * 3600); } TEST_F(DurationUtilTest, FormatHectoSeconds) { - formatHectoSeconds(QString::fromUtf8("0\u231E00\u002E000"), 0); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E000"), 1); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E500"), 1.5); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E510"), 1.51); - formatHectoSeconds(QString::fromUtf8("0\u231E01\u002E490"), 1.49); - formatHectoSeconds(QString::fromUtf8("0\u231E59\u002E000"), 59); - formatHectoSeconds(QString::fromUtf8("0\u231E60\u002E000"), 60); - formatHectoSeconds(QString::fromUtf8("0\u231E61\u002E123"), 61.1234); - formatHectoSeconds(QString::fromUtf8("9\u231E99\u002E990"), 999.99); - formatHectoSeconds(QString::fromUtf8("10\u231E00\u002E000"), 1000.00); - formatHectoSeconds(QString::fromUtf8("864\u231E00\u002E000"), 24 * 3600); + formatHectoSeconds(QString::fromUtf8("0.00\u2009000"), 0); + formatHectoSeconds(QString::fromUtf8("0.01\u2009000"), 1); + formatHectoSeconds(QString::fromUtf8("0.01\u2009500"), 1.5); + formatHectoSeconds(QString::fromUtf8("0.01\u2009510"), 1.51); + formatHectoSeconds(QString::fromUtf8("0.01\u2009490"), 1.49); + formatHectoSeconds(QString::fromUtf8("0.59\u2009000"), 59); + formatHectoSeconds(QString::fromUtf8("0.60\u2009000"), 60); + formatHectoSeconds(QString::fromUtf8("0.61\u2009123"), 61.1234); + formatHectoSeconds(QString::fromUtf8("9.99\u2009990"), 999.99); + formatHectoSeconds(QString::fromUtf8("10.00\u2009000"), 1000.00); + formatHectoSeconds(QString::fromUtf8("864.00\u2009000"), 24 * 3600); } diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 993f1638caf..59a559f96c5 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -21,8 +21,6 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; const QString DurationBase::kInvalidDurationString = "?"; // Unicode for thin space QChar DurationBase::kKiloGroupSeparator = QChar(0x2009); -// Unicode for bottom left corner -QChar DurationBase::kHectoGroupSeparator = QChar(0x231E); // Unicode for decimal point QChar DurationBase::kDecimalSeparator = QChar(0x002E); @@ -90,9 +88,12 @@ QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { double subs = fmod(dSeconds, 1); QString durationString = - QString("%1%2%3").arg(kilos, 0, 10).arg(kKiloGroupSeparator).arg(seconds, 3, 'f', 0, QLatin1Char('0')); + QString("%1%2%3").arg( + QString::number(kilos), + QString(kDecimalSeparator), + QString::number(seconds).rightJustified(3, QLatin1Char('0'))); if (Precision::SECONDS != precision) { - durationString += kDecimalSeparator % QString::number(subs, 'f', 3).right(3); + durationString += kKiloGroupSeparator % QString::number(subs, 'f', 3).right(3); } // The format string gives us milliseconds but we want @@ -117,12 +118,14 @@ QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { double subs = fmod(dSeconds, 1); QString durationString = - QString("%1%2%3").arg(hectos, 0, 10).arg(kHectoGroupSeparator).arg(seconds, 2, 'f', 0, QLatin1Char('0')); + QString("%1%2%3").arg( + QString::number(hectos), + QString(kDecimalSeparator), + QString::number(seconds).rightJustified(2, QLatin1Char('0'))); if (Precision::SECONDS != precision) { - durationString += kDecimalSeparator % QString::number(subs, 'f', 3).right(3); + durationString += kKiloGroupSeparator % QString::number(subs, 'f', 3).right(3); } - // The format string gives us milliseconds but we want // centiseconds. Slice one character off. if (Precision::CENTISECONDS == precision) { From 43aeb9e91cadae6d65ead420a735cab7cb3fb009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 20 Jan 2019 00:58:17 +0100 Subject: [PATCH 20/20] Replace hectoseconds format by seconds long. Hectosends fromat was too hard to read and the new long format is basically the same but with other separators --- src/preferences/dialog/dlgprefdeck.cpp | 13 ++++---- src/preferences/dialog/dlgprefdeck.h | 7 ++-- src/test/durationutiltest.cpp | 43 +++++++++++-------------- src/util/duration.cpp | 44 +++++++++++--------------- src/util/duration.h | 4 +-- src/widget/wnumberpos.cpp | 8 ++--- 6 files changed, 53 insertions(+), 66 deletions(-) diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp index 9437e4cc032..f7ad5ed612f 100644 --- a/src/preferences/dialog/dlgprefdeck.cpp +++ b/src/preferences/dialog/dlgprefdeck.cpp @@ -130,19 +130,18 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx, comboBoxTimeFormat->addItem(tr("s%1zz - Seconds") .arg(mixxx::DurationBase::kDecimalSeparator), static_cast - (TrackTime::DisplayFormat::SECOND)); + (TrackTime::DisplayFormat::SECONDS)); - comboBoxTimeFormat->addItem(tr("s%1sss%2zz - Kiloseconds") - .arg(QString(mixxx::DurationBase::kDecimalSeparator), - QString(mixxx::DurationBase::kKiloGroupSeparator)), + comboBoxTimeFormat->addItem(tr("sss%1zz - Seconds (Long)") + .arg(mixxx::DurationBase::kDecimalSeparator), static_cast - (TrackTime::DisplayFormat::KILO_SECOND)); + (TrackTime::DisplayFormat::SECONDS_LONG)); - comboBoxTimeFormat->addItem(tr("s%1ss%2zz - Hectoseconds") + comboBoxTimeFormat->addItem(tr("s%1sss%2zz - Kiloseconds") .arg(QString(mixxx::DurationBase::kDecimalSeparator), QString(mixxx::DurationBase::kKiloGroupSeparator)), static_cast - (TrackTime::DisplayFormat::HECTO_SECOND)); + (TrackTime::DisplayFormat::KILO_SECONDS)); double time_format = static_cast( m_pConfig->getValue( diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index 614a51deb58..ebc77ce2a7d 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -26,9 +26,10 @@ namespace TrackTime { enum class DisplayFormat { TRADITIONAL, TRADITIONAL_COARSE, - SECOND, - KILO_SECOND, - HECTO_SECOND, + SECONDS, + SECONDS_LONG, + KILO_SECONDS, + HECTO_SECONDS, }; } diff --git a/src/test/durationutiltest.cpp b/src/test/durationutiltest.cpp index a6bae18f944..149b4b31ff5 100644 --- a/src/test/durationutiltest.cpp +++ b/src/test/durationutiltest.cpp @@ -59,37 +59,37 @@ class DurationUtilTest : public testing::Test { EXPECT_EQ(actualMilliseconds, actualMilliseconds); } - void formatKiloSeconds(QString expectedMilliseconds, double dSeconds) { + void formatSecondsLong(QString expectedMilliseconds, double dSeconds) { ASSERT_LE(4, expectedMilliseconds.length()); // 3 digits + 1 decimal point const QString actualSeconds = - mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::SECONDS); + mixxx::Duration::formatSecondsLong(dSeconds, mixxx::Duration::Precision::SECONDS); const QString expectedSeconds = adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::SECONDS); EXPECT_EQ(expectedSeconds, actualSeconds); const QString expectedCentiseconds = adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::CENTISECONDS); const QString actualCentiseconds = - mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::CENTISECONDS); + mixxx::Duration::formatSecondsLong(dSeconds, mixxx::Duration::Precision::CENTISECONDS); EXPECT_EQ(expectedCentiseconds, actualCentiseconds); const QString actualMilliseconds = - mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); + mixxx::Duration::formatSecondsLong(dSeconds, mixxx::Duration::Precision::MILLISECONDS); EXPECT_EQ(actualMilliseconds, actualMilliseconds); } - void formatHectoSeconds(QString expectedMilliseconds, double dSeconds) { + void formatKiloSeconds(QString expectedMilliseconds, double dSeconds) { ASSERT_LE(4, expectedMilliseconds.length()); // 3 digits + 1 decimal point const QString actualSeconds = - mixxx::Duration::formatHectoSeconds(dSeconds, mixxx::Duration::Precision::SECONDS); + mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::SECONDS); const QString expectedSeconds = adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::SECONDS); EXPECT_EQ(expectedSeconds, actualSeconds); const QString expectedCentiseconds = adjustPrecision(expectedMilliseconds, mixxx::Duration::Precision::CENTISECONDS); const QString actualCentiseconds = - mixxx::Duration::formatHectoSeconds(dSeconds, mixxx::Duration::Precision::CENTISECONDS); + mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::CENTISECONDS); EXPECT_EQ(expectedCentiseconds, actualCentiseconds); const QString actualMilliseconds = - mixxx::Duration::formatHectoSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); + mixxx::Duration::formatKiloSeconds(dSeconds, mixxx::Duration::Precision::MILLISECONDS); EXPECT_EQ(actualMilliseconds, actualMilliseconds); } }; @@ -114,7 +114,7 @@ TEST_F(DurationUtilTest, formatTime) { formatTime("25:00:01.000", 25 * 3600 + 1); } -TEST_F(DurationUtilTest, formatSecond) { +TEST_F(DurationUtilTest, formatSeconds) { formatSeconds("0.000", 0); formatSeconds("1.000", 1); formatSeconds("59.000", 59); @@ -122,34 +122,27 @@ TEST_F(DurationUtilTest, formatSecond) { formatSeconds("321.123", 321.1234); } +TEST_F(DurationUtilTest, formatSecondsLong) { + formatSecondsLong("000.000", 0); + formatSecondsLong("001.000", 1); + formatSecondsLong("059.000", 59); + formatSecondsLong("321.123", 321.1234); + formatSecondsLong("321.124", 321.1235); + formatSecondsLong("4321.123", 4321.1234); +} + TEST_F(DurationUtilTest, FormatKiloSeconds) { formatKiloSeconds(QString::fromUtf8("0.000\u2009000"), 0); formatKiloSeconds(QString::fromUtf8("0.001\u2009000"), 1); - formatKiloSeconds(QString::fromUtf8("0.001\u2009500"), 1.5); - formatKiloSeconds(QString::fromUtf8("0.001\u2009510"), 1.51); formatKiloSeconds(QString::fromUtf8("0.001\u2009490"), 1.49); formatKiloSeconds(QString::fromUtf8("0.059\u2009000"), 59); - formatKiloSeconds(QString::fromUtf8("0.060\u2009000"), 60); formatKiloSeconds(QString::fromUtf8("0.061\u2009123"), 61.1234); formatKiloSeconds(QString::fromUtf8("0.999\u2009990"), 999.99); formatKiloSeconds(QString::fromUtf8("1.000\u2009000"), 1000.00); formatKiloSeconds(QString::fromUtf8("86.400\u2009000"), 24 * 3600); } -TEST_F(DurationUtilTest, FormatHectoSeconds) { - formatHectoSeconds(QString::fromUtf8("0.00\u2009000"), 0); - formatHectoSeconds(QString::fromUtf8("0.01\u2009000"), 1); - formatHectoSeconds(QString::fromUtf8("0.01\u2009500"), 1.5); - formatHectoSeconds(QString::fromUtf8("0.01\u2009510"), 1.51); - formatHectoSeconds(QString::fromUtf8("0.01\u2009490"), 1.49); - formatHectoSeconds(QString::fromUtf8("0.59\u2009000"), 59); - formatHectoSeconds(QString::fromUtf8("0.60\u2009000"), 60); - formatHectoSeconds(QString::fromUtf8("0.61\u2009123"), 61.1234); - formatHectoSeconds(QString::fromUtf8("9.99\u2009990"), 999.99); - formatHectoSeconds(QString::fromUtf8("10.00\u2009000"), 1000.00); - formatHectoSeconds(QString::fromUtf8("864.00\u2009000"), 24 * 3600); -} } // anonymous namespace diff --git a/src/util/duration.cpp b/src/util/duration.cpp index 59a559f96c5..198e124ba6e 100644 --- a/src/util/duration.cpp +++ b/src/util/duration.cpp @@ -57,6 +57,7 @@ QString DurationBase::formatTime(double dSeconds, Precision precision) { return durationString; } +// static QString DurationBase::formatSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported @@ -66,62 +67,55 @@ QString DurationBase::formatSeconds(double dSeconds, Precision precision) { QString durationString; if (Precision::CENTISECONDS == precision) { - durationString = QString("%1").arg(dSeconds,1,'f',2,'0'); + durationString = QString::number(dSeconds, 'f', 2); } else if (Precision::MILLISECONDS == precision) { - durationString = QString("%1").arg(dSeconds,1,'f',3,'0'); + durationString = QString::number(dSeconds, 'f', 3); } else { - durationString = QString("%1").arg(dSeconds,1,'f',0,'0'); + durationString = QString::number(dSeconds, 'f', 0); } return durationString; } // static -QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { +QString DurationBase::formatSecondsLong(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported return kInvalidDurationString; } - int kilos = (int)dSeconds / 1000; - double seconds = floor(fmod(dSeconds, 1000)); - double subs = fmod(dSeconds, 1); - - QString durationString = - QString("%1%2%3").arg( - QString::number(kilos), - QString(kDecimalSeparator), - QString::number(seconds).rightJustified(3, QLatin1Char('0'))); - if (Precision::SECONDS != precision) { - durationString += kKiloGroupSeparator % QString::number(subs, 'f', 3).right(3); - } + QString durationString; - // The format string gives us milliseconds but we want - // centiseconds. Slice one character off. if (Precision::CENTISECONDS == precision) { - DEBUG_ASSERT(1 <= durationString.length()); - durationString = durationString.left(durationString.length() - 1); + durationString = QString::number(dSeconds, 'f', 2) + .rightJustified(6, QLatin1Char('0')); + } else if (Precision::MILLISECONDS == precision) { + durationString = QString::number(dSeconds, 'f', 3) + .rightJustified(7, QLatin1Char('0')); + } else { + durationString = QString::number(dSeconds, 'f', 0) + .rightJustified(3, QLatin1Char('0')); } return durationString; } // static -QString DurationBase::formatHectoSeconds(double dSeconds, Precision precision) { +QString DurationBase::formatKiloSeconds(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported return kInvalidDurationString; } - int hectos = (int)dSeconds / 100; - double seconds = floor(fmod(dSeconds, 100)); + int kilos = (int)dSeconds / 1000; + double seconds = floor(fmod(dSeconds, 1000)); double subs = fmod(dSeconds, 1); QString durationString = QString("%1%2%3").arg( - QString::number(hectos), + QString::number(kilos), QString(kDecimalSeparator), - QString::number(seconds).rightJustified(2, QLatin1Char('0'))); + QString::number(seconds).rightJustified(3, QLatin1Char('0'))); if (Precision::SECONDS != precision) { durationString += kKiloGroupSeparator % QString::number(subs, 'f', 3).right(3); } diff --git a/src/util/duration.h b/src/util/duration.h index f0002ba0c68..0d933f9032b 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -78,10 +78,10 @@ class DurationBase { static QString formatSeconds( double dSeconds, Precision precision = Precision::SECONDS); - static QString formatKiloSeconds( + static QString formatSecondsLong( double dSeconds, Precision precision = Precision::SECONDS); - static QString formatHectoSeconds( + static QString formatKiloSeconds( double dSeconds, Precision precision = Precision::SECONDS); diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index be68bf78647..109d58f458f 100644 --- a/src/widget/wnumberpos.cpp +++ b/src/widget/wnumberpos.cpp @@ -60,11 +60,11 @@ void WNumberPos::slotSetTimeElapsed(double dTimeElapsed) { double dTimeRemaining = m_pTimeRemaining->get(); QString (*timeFormat)(double dSeconds, mixxx::Duration::Precision precision); - if (m_displayFormat == TrackTime::DisplayFormat::KILO_SECOND) { + if (m_displayFormat == TrackTime::DisplayFormat::KILO_SECONDS) { timeFormat = &mixxx::Duration::formatKiloSeconds; - } else if (m_displayFormat == TrackTime::DisplayFormat::HECTO_SECOND) { - timeFormat = &mixxx::Duration::formatHectoSeconds; - } else if (m_displayFormat == TrackTime::DisplayFormat::SECOND) { + } else if (m_displayFormat == TrackTime::DisplayFormat::SECONDS_LONG) { + timeFormat = &mixxx::Duration::formatSecondsLong; + } else if (m_displayFormat == TrackTime::DisplayFormat::SECONDS) { timeFormat = &mixxx::Duration::formatSeconds; } else { timeFormat = &mixxx::Duration::formatTime;