Git commit 69dfc21e1b9a6eb536894286952d4a374724000d by Urs Fleisch. Committed on 11/02/2023 at 15:21. Pushed by ufleisch into branch 'master'.
Click on play tool bar time toggles between elapsed and remaining time BUG 465371 M +3 -0 doc/en/index.docbook M +72 -9 src/gui/widgets/playtoolbar.cpp M +14 -0 src/gui/widgets/playtoolbar.h https://invent.kde.org/multimedia/kid3/commit/69dfc21e1b9a6eb536894286952d4a374724000d diff --git a/doc/en/index.docbook b/doc/en/index.docbook index 31c3e5af..0b6e34c3 100644 --- a/doc/en/index.docbook +++ b/doc/en/index.docbook @@ -2129,6 +2129,9 @@ basic operations (<guibutton>Play/Pause</guibutton>, sliders for position and volume and a display of the current position. If multiple files are selected, the selected tracks are played, else all files will be played. +</para><para> +The time displayed can be toggled between elapsed and remaining time by +clicking on the display. </para></listitem> </varlistentry> diff --git a/src/gui/widgets/playtoolbar.cpp b/src/gui/widgets/playtoolbar.cpp index 4cd9c47c..b32737c6 100644 --- a/src/gui/widgets/playtoolbar.cpp +++ b/src/gui/widgets/playtoolbar.cpp @@ -46,6 +46,47 @@ namespace { const QString zeroTime(QLatin1String(" 0:00")); +/** + * Event filter for click on time LCD. + */ +class TimeLcdClickHandler : public QObject { +public: + /** + * Constructor. + * @param playToolBar play tool bar + */ + explicit TimeLcdClickHandler(PlayToolBar* playToolBar) + : QObject(playToolBar), m_playToolBar(playToolBar) {} + virtual ~TimeLcdClickHandler() override = default; + +protected: + /** + * Event filter function, calls PlayToolBar::toggleTimeDisplayMode(). + * + * @param obj watched object + * @param event event for object + * + * @return true if event is filtered. + */ + virtual bool eventFilter(QObject* obj, QEvent* event) override; + +private: + Q_DISABLE_COPY(TimeLcdClickHandler) + + PlayToolBar* m_playToolBar; +}; + +bool TimeLcdClickHandler::eventFilter(QObject* obj, QEvent* event) +{ + if (event->type() == QEvent::MouseButtonRelease) { + m_playToolBar->toggleTimeDisplayMode(); + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } +} + } /** @@ -55,7 +96,8 @@ const QString zeroTime(QLatin1String(" 0:00")); * @param parent parent widget */ PlayToolBar::PlayToolBar(AudioPlayer* player, QWidget* parent) - : QToolBar(parent), m_player(player) + : QToolBar(parent), m_player(player), + m_timeDisplayMode(TimeDisplayMode::Elapsed) { setObjectName(QLatin1String("Kid3Player")); setWindowTitle(tr("Play")); @@ -80,8 +122,9 @@ PlayToolBar::PlayToolBar(AudioPlayer* player, QWidget* parent) m_seekSlider = new QSlider(Qt::Horizontal, splitter); m_seekSlider->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); m_seekSlider->setMinimum(0); + m_duration = mediaPlayer->duration(); // Setting a maximum of 0 crashes with Qt 5.4.0 on Mac OS X. - int maximum = mediaPlayer->duration() / 1000; + int maximum = m_duration / 1000; if (maximum > 0) { m_seekSlider->setMaximum(maximum); } @@ -107,6 +150,7 @@ PlayToolBar::PlayToolBar(AudioPlayer* player, QWidget* parent) m_timeLcd->setFrameStyle(QFrame::NoFrame); m_timeLcd->display(zeroTime); m_timeLcd->setDigitCount(7); + m_timeLcd->installEventFilter(new TimeLcdClickHandler(this)); addAction(m_playOrPauseAction); addAction(m_stopAction); @@ -179,18 +223,26 @@ void PlayToolBar::closeEvent(QCloseEvent*) */ void PlayToolBar::tick(qint64 msec) { - int hours = msec / (60 * 60 * 1000); - int minutes = (msec / (60 * 1000)) % 60; - int seconds = (msec / 1000) % 60; - if (msec % 1000 >= 500) { + qint64 displayedMsecs = msec; + QString sign; + if (m_timeDisplayMode == TimeDisplayMode::Remaining) { + displayedMsecs = qAbs(m_duration - msec); + sign = QLatin1String("-"); + } + int hours = displayedMsecs / (60 * 60 * 1000); + int minutes = (displayedMsecs / (60 * 1000)) % 60; + int seconds = (displayedMsecs / 1000) % 60; + if (displayedMsecs % 1000 >= 500) { ++seconds; } if (hours == 0) { - m_timeLcd->display(QString(QLatin1String("%1:%2")) + m_timeLcd->display(QString(QLatin1String("%1%2:%3")) + .arg(sign) .arg(minutes, 2, 10, QLatin1Char(' ')) .arg(seconds, 2, 10, QLatin1Char('0'))); } else { - m_timeLcd->display(QString(QLatin1String("%1:%2:%3")) + m_timeLcd->display(QString(QLatin1String("%1%2:%3:%4")) + .arg(sign) .arg(hours, 2, 10, QLatin1Char(' ')) .arg(minutes, 2, 10, QLatin1Char('0')) .arg(seconds, 2, 10, QLatin1Char('0'))); @@ -249,6 +301,7 @@ void PlayToolBar::error(QMediaPlayer::Error err) */ void PlayToolBar::durationChanged(qint64 duration) { + m_duration = duration; int maximum = duration / 1000; // Setting a maximum of 0 crashes with Qt 5.4.0 on Mac OS X. if (maximum > 0) { @@ -306,6 +359,15 @@ void PlayToolBar::toggleMute() ? QStyle::SP_MediaVolumeMuted : QStyle::SP_MediaVolume)); } +/** + * Toggle time display mode. + */ +void PlayToolBar::toggleTimeDisplayMode() +{ + m_timeDisplayMode = m_timeDisplayMode == TimeDisplayMode::Elapsed + ? TimeDisplayMode::Remaining : TimeDisplayMode::Elapsed; +} + /** * Update display and button state when the current track is changed. * @@ -322,7 +384,8 @@ void PlayToolBar::trackChanged(const QString& filePath, m_previousAction->setEnabled(hasPrevious); m_nextAction->setEnabled(hasNext); - int maximum = m_player->mediaPlayer()->duration() / 1000; + m_duration = m_player->mediaPlayer()->duration(); + int maximum = m_duration / 1000; // Setting a maximum of 0 crashes with Qt 5.4.0 on Mac OS X. if (maximum > 0) { m_seekSlider->setMaximum(maximum); diff --git a/src/gui/widgets/playtoolbar.h b/src/gui/widgets/playtoolbar.h index a45141d8..36a2c6b6 100644 --- a/src/gui/widgets/playtoolbar.h +++ b/src/gui/widgets/playtoolbar.h @@ -42,6 +42,12 @@ class QSlider; class PlayToolBar : public QToolBar { Q_OBJECT public: + /** What time is displayed in m_timeLcd. */ + enum class TimeDisplayMode { + Elapsed, /**< Elapsed time */ + Remaining /**< Remaining time */ + }; + /** * Constructor. * @@ -55,6 +61,11 @@ public: */ virtual ~PlayToolBar() override; + /** + * Toggle time display mode. + */ + void toggleTimeDisplayMode(); + signals: /** * Emitted when an error occurs. @@ -156,4 +167,7 @@ private: QAction* m_muteAction; QSlider* m_seekSlider; QSlider* m_volumeSlider; + + qint64 m_duration; + TimeDisplayMode m_timeDisplayMode; };
