diff --git a/src/library/basesqltablemodel.cpp b/src/library/basesqltablemodel.cpp index 7beac213fd06..c88112eb38a8 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 4318a9ee40b7..88407a5c566a 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 0f73b68f3c58..875d12c4d698 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; @@ -106,6 +107,33 @@ 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))); + + QLocale locale; + // Track Display model + 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), + 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 m_bDisallowTrackLoadToPlayingDeck = !m_pConfig->getValue( @@ -495,11 +523,24 @@ 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)); +} + 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 = 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) { pControl->set(m_iCueMode); diff --git a/src/preferences/dialog/dlgprefdeck.h b/src/preferences/dialog/dlgprefdeck.h index bd7e0bd79f0a..4e6e99b5984a 100644 --- a/src/preferences/dialog/dlgprefdeck.h +++ b/src/preferences/dialog/dlgprefdeck.h @@ -22,6 +22,12 @@ namespace TrackTime { Remaining, ElapsedAndRemaining, }; + enum class DisplayFormat { + TRADITIONAL, + SECOND, + KILO_SECOND, + HECTO_SECOND, + }; } enum class KeylockMode { @@ -67,6 +73,8 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg { void slotRateRampingModeLinearButton(bool); void slotRateRampSensitivitySlider(int); + void slotTimeFormatChanged(double); + void slotNumDecksChanged(double, bool initializing=false); void slotNumSamplersChanged(double, bool initializing=false); @@ -85,6 +93,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; diff --git a/src/preferences/dialog/dlgprefdeckdlg.ui b/src/preferences/dialog/dlgprefdeckdlg.ui index 35712d80e95d..4fa7b1b9f2f7 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 7fec8b61f145..f9875f7b8b8d 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 = @@ -41,24 +58,98 @@ 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); + } + + 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) { - 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, 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("1d, 00:00:00.000", 24 * 3600); +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, 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); + 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\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); +} + + } // anonymous namespace diff --git a/src/track/track.cpp b/src/track/track.cpp index 4c114cd4d693..af56ac263b2e 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 d050b55b22ae..9ed65a770153 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,7 +18,11 @@ static const qint64 kSecondsPerDay = 24 * kSecondsPerHour; } // namespace // static -QString DurationBase::formatSeconds(double dSeconds, Precision precision) { +QChar DurationBase::kCentisecondSeperator = QChar(0x2009); +QChar DurationBase::kHectosecondSeperator = QChar(0x231E); + +// static +QString DurationBase::formatTime(double dSeconds, Precision precision) { if (dSeconds < 0.0) { // negative durations are not supported return "?"; @@ -32,12 +36,85 @@ 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. + if (Precision::CENTISECONDS == precision) { + DEBUG_ASSERT(1 <= durationString.length()); + durationString = durationString.left(durationString.length() - 1); + } + + 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) { + // negative durations are not supported + return "?"; + } + + int kilos = (int)dSeconds / 1000; + double seconds = floor(fmod(dSeconds, 1000)); + double subs = fmod(dSeconds, 1); + + 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); + } + + // 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%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); + } // The format string gives us milliseconds but we want // centiseconds. Slice one character off. diff --git a/src/util/duration.h b/src/util/duration.h index 075a30607bee..933826c4d859 100644 --- a/src/util/duration.h +++ b/src/util/duration.h @@ -70,15 +70,27 @@ 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); + 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 QChar kCentisecondSeperator; + static QChar kHectosecondSeperator; protected: explicit DurationBase(qint64 durationNanos) diff --git a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp index bf96024ec457..5c29ed1cce34 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,41 @@ 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 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::formatTime; + } 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 +121,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 c4023100ae22..10694fc60083 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