diff --git a/lib/mpris2/mprismediaplayer2player.cpp b/lib/mpris2/mprismediaplayer2player.cpp --- a/lib/mpris2/mprismediaplayer2player.cpp +++ b/lib/mpris2/mprismediaplayer2player.cpp @@ -65,6 +65,8 @@ connect(mSlideShow, &SlideShow::stateChanged, this, &MprisMediaPlayer2Player::onSlideShowStateChanged); + connect(mSlideShow, &SlideShow::intervalChanged, + this, &MprisMediaPlayer2Player::onMetaInfoUpdated); connect(mContextManager, &ContextManager::currentUrlChanged, this, &MprisMediaPlayer2Player::onCurrentUrlChanged); connect(mSlideShow->randomAction(), &QAction::toggled, @@ -184,7 +186,8 @@ qlonglong MprisMediaPlayer2Player::position() const { - return 0; + // milliseconds -> microseconds + return mSlideShow->position() * 1000; } double MprisMediaPlayer2Player::rate() const @@ -245,6 +248,7 @@ return; } + signalPropertyChange("Position", position()); signalPropertyChange("PlaybackStatus", mPlaybackStatus); } @@ -259,6 +263,7 @@ } onMetaInfoUpdated(); + signalPropertyChange("Position", position()); } void MprisMediaPlayer2Player::onMetaInfoUpdated() @@ -280,10 +285,9 @@ // TODO: for videos also get and report the length if (MimeTypeUtils::urlKind(url) != MimeTypeUtils::KIND_VIDEO) { - // TODO: implement other MPRIS API for position // convert seconds in microseconds - // const qlonglong duration = qlonglong(mSlideShow->interval() * 1000000); - // updatedMetaData.insert(QStringLiteral("mpris:length"), duration); + const qlonglong duration = qlonglong(mSlideShow->interval() * 1000000); + updatedMetaData.insert(QStringLiteral("mpris:length"), duration); } // TODO: update on metadata changes, given user can edit most of this data @@ -329,6 +333,7 @@ return; } + signalPropertyChange("Position", position()); signalPropertyChange("PlaybackStatus", mPlaybackStatus); } @@ -346,6 +351,7 @@ signalPropertyChange("CanPlay", mSlideShowEnabled); signalPropertyChange("CanPause", mSlideShowEnabled); if (playbackStatusChanged) { + signalPropertyChange("Position", position()); signalPropertyChange("PlaybackStatus", mPlaybackStatus); } } diff --git a/lib/slideshow.h b/lib/slideshow.h --- a/lib/slideshow.h +++ b/lib/slideshow.h @@ -51,7 +51,14 @@ /** @return true if the slideshow is running */ bool isRunning() const; + /** + * @return interval in seconds + */ int interval() const; + /** + * @return position in time slot for current image in milliseconds + */ + int position() const; public Q_SLOTS: void setInterval(int); @@ -68,6 +75,11 @@ * Slideshow has been started or stopped */ void stateChanged(bool running); + /** + * Emitted when interval has been changed + * @param interval interval in seconds + */ + void intervalChanged(int interval); private Q_SLOTS: void goToNextUrl(); diff --git a/lib/slideshow.cpp b/lib/slideshow.cpp --- a/lib/slideshow.cpp +++ b/lib/slideshow.cpp @@ -238,13 +238,32 @@ { GwenviewConfig::setInterval(double(intervalInSeconds)); d->updateTimerInterval(); + emit intervalChanged(intervalInSeconds); } int SlideShow::interval() const { return GwenviewConfig::interval(); } +int SlideShow::position() const +{ + // TODO: also support videos + + // QTimer::remainingTime() returns -1 if inactive + // and there are moments where mState == Started but timer already done but not yet next url reached + // so handle that + if (d->mState == Started) { + if (d->mTimer->isActive()) { + return interval() * 1000 - d->mTimer->remainingTime(); + } + // already timeout reached, but not yet progressed to next url + return interval(); + } + + return 0; +} + void SlideShow::stop() { LOG("Stopping timer");