queue/Selection: add "window" field

This commit is contained in:
Max Kellermann 2022-02-14 08:17:56 +01:00
parent 5588291a35
commit e9e3d8c57c
2 changed files with 28 additions and 2 deletions

View File

@ -25,6 +25,7 @@
#include "song/DetachedSong.hxx"
#include "song/LightSong.hxx"
#include "client/Response.hxx"
#include "PlaylistError.hxx"
#include <fmt/format.h>
@ -104,8 +105,29 @@ void
PrintQueue(Response &r, const Queue &queue,
const QueueSelection &selection)
{
auto window = selection.window;
if (!window.CheckClip(queue.GetLength()))
throw PlaylistError::BadRange();
if (selection.window.IsEmpty())
return;
unsigned skip = window.start;
unsigned n = window.Count();
for (unsigned i = 0; i < queue.GetLength(); i++) {
if (selection.MatchPosition(queue, i))
queue_print_song_info(r, queue, i);
if (!selection.MatchPosition(queue, i))
continue;
if (skip > 0) {
--skip;
continue;
}
queue_print_song_info(r, queue, i);
if (--n == 0)
break;
}
}

View File

@ -19,6 +19,8 @@
#pragma once
#include "protocol/RangeArg.hxx"
struct Queue;
class SongFilter;
@ -32,6 +34,8 @@ struct QueueSelection {
*/
const SongFilter *filter = nullptr;
RangeArg window = RangeArg::All();
[[gnu::pure]]
bool MatchPosition(const Queue &queue,
unsigned position) const noexcept;