diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-10-18 14:35:28 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-10-18 14:35:28 +1100 |
| commit | 782e8dc8c25402171fc4724075b998eae4fa2c76 (patch) | |
| tree | f710f8fe8e84f5a201410520f3f88364a19f76d8 /src/playlist/include/source.hpp | |
| parent | 2eb7eaa2a6a5d9ccfe7a0535858778dfb85997cb (diff) | |
| download | tangara-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.hpp | 33 |
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 |
