Support reversed order in the playlist.

This commit is contained in:
John Preston 2021-11-19 16:42:28 +04:00
parent 4f02f722ae
commit 68378cf8e5
3 changed files with 25 additions and 13 deletions

View File

@ -364,12 +364,13 @@ bool Instance::moveInPlaylist(
if (!data->playlistIndex) { if (!data->playlistIndex) {
return false; 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 item = itemByIndex(data, newIndex)) {
if (const auto media = item->media()) { if (const auto media = item->media()) {
if (const auto document = media->document()) { if (const auto document = media->document()) {
if (autonext) { if (autonext) {
_switchToNextStream.fire({ _switchToNext.fire({
data->current, data->current,
item->fullId() item->fullId()
}); });
@ -389,24 +390,35 @@ bool Instance::moveInPlaylist(
bool Instance::previousAvailable(AudioMsgId::Type type) const { bool Instance::previousAvailable(AudioMsgId::Type type) const {
const auto data = getData(type); const auto data = getData(type);
Assert(data != nullptr); Assert(data != nullptr);
return data->playlistIndex
&& data->playlistSlice if (!data->playlistIndex || !data->playlistSlice) {
&& (*data->playlistIndex > 0); return false;
}
return (data->order.current() == OrderMode::Reverse)
? (*data->playlistIndex + 1 < data->playlistSlice->size())
: (*data->playlistIndex > 0);
} }
bool Instance::nextAvailable(AudioMsgId::Type type) const { bool Instance::nextAvailable(AudioMsgId::Type type) const {
const auto data = getData(type); const auto data = getData(type);
Assert(data != nullptr); Assert(data != nullptr);
return data->playlistIndex
&& data->playlistSlice if (!data->playlistIndex || !data->playlistSlice) {
&& (*data->playlistIndex + 1 < data->playlistSlice->size()); return false;
}
return (data->order.current() == OrderMode::Reverse)
? (*data->playlistIndex > 0)
: (*data->playlistIndex + 1 < data->playlistSlice->size());
} }
rpl::producer<> Media::Player::Instance::playlistChanges( rpl::producer<> Media::Player::Instance::playlistChanges(
AudioMsgId::Type type) const { AudioMsgId::Type type) const {
const auto data = getData(type); const auto data = getData(type);
Assert(data != nullptr); 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 { rpl::producer<> Media::Player::Instance::stops(AudioMsgId::Type type) const {

View File

@ -189,7 +189,7 @@ public:
}; };
[[nodiscard]] rpl::producer<Switch> switchToNextEvents() const { [[nodiscard]] rpl::producer<Switch> switchToNextEvents() const {
return _switchToNextStream.events(); return _switchToNext.events();
} }
[[nodiscard]] rpl::producer<AudioMsgId::Type> tracksFinished() const { [[nodiscard]] rpl::producer<AudioMsgId::Type> tracksFinished() const {
return _tracksFinished.events(); return _tracksFinished.events();
@ -322,7 +322,7 @@ private:
Data _voiceData; Data _voiceData;
bool _roundPlaying = false; bool _roundPlaying = false;
rpl::event_stream<Switch> _switchToNextStream; rpl::event_stream<Switch> _switchToNext;
rpl::event_stream<AudioMsgId::Type> _tracksFinished; rpl::event_stream<AudioMsgId::Type> _tracksFinished;
rpl::event_stream<AudioMsgId::Type> _trackChanged; rpl::event_stream<AudioMsgId::Type> _trackChanged;
rpl::event_stream<AudioMsgId::Type> _playerStopped; rpl::event_stream<AudioMsgId::Type> _playerStopped;

View File

@ -826,10 +826,10 @@ void Widget::handlePlaylistUpdate() {
createPrevNextButtons(); createPrevNextButtons();
_previousTrack->setIconOverride(previousEnabled ? nullptr : &st::mediaPlayerPreviousDisabledIcon); _previousTrack->setIconOverride(previousEnabled ? nullptr : &st::mediaPlayerPreviousDisabledIcon);
_previousTrack->setRippleColorOverride(previousEnabled ? nullptr : &st::mediaPlayerBg); _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->setIconOverride(nextEnabled ? nullptr : &st::mediaPlayerNextDisabledIcon);
_nextTrack->setRippleColorOverride(nextEnabled ? nullptr : &st::mediaPlayerBg); _nextTrack->setRippleColorOverride(nextEnabled ? nullptr : &st::mediaPlayerBg);
_nextTrack->setCursor(nextEnabled ? style::cur_pointer : style::cur_default); _nextTrack->setPointerCursor(nextEnabled);
} }
} }