summaryrefslogtreecommitdiff
path: root/src/playlist/include/source.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-10-18 14:35:28 +1100
committerjacqueline <me@jacqueline.id.au>2023-10-18 14:35:28 +1100
commit782e8dc8c25402171fc4724075b998eae4fa2c76 (patch)
treef710f8fe8e84f5a201410520f3f88364a19f76d8 /src/playlist/include/source.hpp
parent2eb7eaa2a6a5d9ccfe7a0535858778dfb85997cb (diff)
downloadtangara-fw-782e8dc8c25402171fc4724075b998eae4fa2c76.tar.gz
Add better controls for queue manipulation
Diffstat (limited to 'src/playlist/include/source.hpp')
-rw-r--r--src/playlist/include/source.hpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/playlist/include/source.hpp b/src/playlist/include/source.hpp
index 069c1e93..aa15e7df 100644
--- a/src/playlist/include/source.hpp
+++ b/src/playlist/include/source.hpp
@@ -73,6 +73,11 @@ class IResetableSource : public ISource {
virtual auto Reset() -> void = 0;
};
+auto CreateSourceFromResults(
+ std::weak_ptr<database::Database>,
+ std::shared_ptr<database::Result<database::IndexRecord>>)
+ -> std::shared_ptr<IResetableSource>;
+
class IndexRecordSource : public IResetableSource {
public:
IndexRecordSource(std::weak_ptr<database::Database> db,
@@ -102,4 +107,32 @@ class IndexRecordSource : public IResetableSource {
ssize_t current_item_;
};
+class NestedSource : public IResetableSource {
+ public:
+ NestedSource(std::weak_ptr<database::Database> db,
+ std::shared_ptr<database::Result<database::IndexRecord>>);
+
+ auto Current() -> std::optional<database::TrackId> override;
+ auto Advance() -> std::optional<database::TrackId> override;
+ auto Peek(std::size_t n, std::vector<database::TrackId>*)
+ -> std::size_t override;
+
+ auto Previous() -> std::optional<database::TrackId> override;
+ auto Reset() -> void override;
+
+ private:
+ auto CreateChild(std::shared_ptr<database::IndexRecord> page)
+ -> std::shared_ptr<IResetableSource>;
+
+ std::weak_ptr<database::Database> db_;
+
+ std::shared_ptr<database::Result<database::IndexRecord>> initial_page_;
+ ssize_t initial_item_;
+
+ std::shared_ptr<database::Result<database::IndexRecord>> current_page_;
+ ssize_t current_item_;
+
+ std::shared_ptr<IResetableSource> current_child_;
+};
+
} // namespace playlist