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) {
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 {

View File

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

View File

@ -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);
}
}