From 68378cf8e5b79ede04f77857cc7ab322302c0db5 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 19 Nov 2021 16:42:28 +0400 Subject: [PATCH] Support reversed order in the playlist. --- .../media/player/media_player_instance.cpp | 30 +++++++++++++------ .../media/player/media_player_instance.h | 4 +-- .../media/player/media_player_widget.cpp | 4 +-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index 617d4b189a..7bf1f1c39f 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -364,12 +364,13 @@ bool Instance::moveInPlaylist( if (!data->playlistIndex) { return false; } - const auto newIndex = *data->playlistIndex + delta; + const auto newIndex = *data->playlistIndex + + (data->order.current() == OrderMode::Reverse ? -delta : delta); if (const auto item = itemByIndex(data, newIndex)) { if (const auto media = item->media()) { if (const auto document = media->document()) { if (autonext) { - _switchToNextStream.fire({ + _switchToNext.fire({ data->current, item->fullId() }); @@ -389,24 +390,35 @@ bool Instance::moveInPlaylist( bool Instance::previousAvailable(AudioMsgId::Type type) const { const auto data = getData(type); Assert(data != nullptr); - return data->playlistIndex - && data->playlistSlice - && (*data->playlistIndex > 0); + + if (!data->playlistIndex || !data->playlistSlice) { + return false; + } + return (data->order.current() == OrderMode::Reverse) + ? (*data->playlistIndex + 1 < data->playlistSlice->size()) + : (*data->playlistIndex > 0); } bool Instance::nextAvailable(AudioMsgId::Type type) const { const auto data = getData(type); Assert(data != nullptr); - return data->playlistIndex - && data->playlistSlice - && (*data->playlistIndex + 1 < data->playlistSlice->size()); + + if (!data->playlistIndex || !data->playlistSlice) { + return false; + } + return (data->order.current() == OrderMode::Reverse) + ? (*data->playlistIndex > 0) + : (*data->playlistIndex + 1 < data->playlistSlice->size()); } rpl::producer<> Media::Player::Instance::playlistChanges( AudioMsgId::Type type) const { const auto data = getData(type); Assert(data != nullptr); - return data->playlistChanges.events(); + + return rpl::merge( + data->playlistChanges.events(), + data->order.changes() | rpl::to_empty); } rpl::producer<> Media::Player::Instance::stops(AudioMsgId::Type type) const { diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index 9645c3ec50..185d80765c 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -189,7 +189,7 @@ public: }; [[nodiscard]] rpl::producer switchToNextEvents() const { - return _switchToNextStream.events(); + return _switchToNext.events(); } [[nodiscard]] rpl::producer tracksFinished() const { return _tracksFinished.events(); @@ -322,7 +322,7 @@ private: Data _voiceData; bool _roundPlaying = false; - rpl::event_stream _switchToNextStream; + rpl::event_stream _switchToNext; rpl::event_stream _tracksFinished; rpl::event_stream _trackChanged; rpl::event_stream _playerStopped; diff --git a/Telegram/SourceFiles/media/player/media_player_widget.cpp b/Telegram/SourceFiles/media/player/media_player_widget.cpp index c0c5836bcb..96f513df41 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.cpp +++ b/Telegram/SourceFiles/media/player/media_player_widget.cpp @@ -826,10 +826,10 @@ void Widget::handlePlaylistUpdate() { createPrevNextButtons(); _previousTrack->setIconOverride(previousEnabled ? nullptr : &st::mediaPlayerPreviousDisabledIcon); _previousTrack->setRippleColorOverride(previousEnabled ? nullptr : &st::mediaPlayerBg); - _previousTrack->setCursor(previousEnabled ? style::cur_pointer : style::cur_default); + _previousTrack->setPointerCursor(previousEnabled); _nextTrack->setIconOverride(nextEnabled ? nullptr : &st::mediaPlayerNextDisabledIcon); _nextTrack->setRippleColorOverride(nextEnabled ? nullptr : &st::mediaPlayerBg); - _nextTrack->setCursor(nextEnabled ? style::cur_pointer : style::cur_default); + _nextTrack->setPointerCursor(nextEnabled); } }