diff options
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/include/screen_track_browser.hpp | 8 | ||||
| -rw-r--r-- | src/ui/include/ui_events.hpp | 5 | ||||
| -rw-r--r-- | src/ui/screen_track_browser.cpp | 65 | ||||
| -rw-r--r-- | src/ui/ui_fsm.cpp | 16 |
4 files changed, 47 insertions, 47 deletions
diff --git a/src/ui/include/screen_track_browser.hpp b/src/ui/include/screen_track_browser.hpp index af80f29c..3d347158 100644 --- a/src/ui/include/screen_track_browser.hpp +++ b/src/ui/include/screen_track_browser.hpp @@ -38,15 +38,14 @@ class TrackBrowser : public Screen { END = 1, }; auto AddLoadingIndictor(Position pos) -> void; - auto AddResults(Position pos, database::Result<database::IndexRecord>*) + auto AddResults(Position pos, + std::shared_ptr<database::Result<database::IndexRecord>>) -> void; auto DropPage(Position pos) -> void; auto FetchNewPage(Position pos) -> void; auto GetNumRecords() -> std::size_t; auto GetItemIndex(lv_obj_t* obj) -> std::optional<std::size_t>; - auto GetRecordByIndex(std::size_t index) - -> std::optional<database::IndexRecord>; std::weak_ptr<database::Database> db_; lv_obj_t* back_button_; @@ -57,7 +56,8 @@ class TrackBrowser : public Screen { std::optional<std::future<database::Result<database::IndexRecord>*>> loading_page_; - std::deque<std::unique_ptr<database::Result<database::IndexRecord>>> + std::shared_ptr<database::Result<database::IndexRecord>> initial_page_; + std::deque<std::shared_ptr<database::Result<database::IndexRecord>>> current_pages_; }; diff --git a/src/ui/include/ui_events.hpp b/src/ui/include/ui_events.hpp index cc7db349..a0ef1c31 100644 --- a/src/ui/include/ui_events.hpp +++ b/src/ui/include/ui_events.hpp @@ -6,6 +6,7 @@ #pragma once +#include <memory> #include "database.hpp" #include "index.hpp" #include "tinyfsm.hpp" @@ -25,7 +26,9 @@ struct OnSystemError : tinyfsm::Event {}; namespace internal { struct RecordSelected : tinyfsm::Event { - database::IndexRecord record; + std::shared_ptr<database::Result<database::IndexRecord>> initial_page; + std::shared_ptr<database::Result<database::IndexRecord>> page; + std::size_t record; }; struct IndexSelected : tinyfsm::Event { diff --git a/src/ui/screen_track_browser.cpp b/src/ui/screen_track_browser.cpp index a9333be4..07977710 100644 --- a/src/ui/screen_track_browser.cpp +++ b/src/ui/screen_track_browser.cpp @@ -66,7 +66,8 @@ TrackBrowser::TrackBrowser( list_(nullptr), loading_indicator_(nullptr), loading_pos_(END), - loading_page_(std::move(initial_page)), + loading_page_(move(initial_page)), + initial_page_(), current_pages_() { lv_obj_set_layout(root_, LV_LAYOUT_FLEX); lv_obj_set_size(root_, lv_pct(100), lv_pct(100)); @@ -102,7 +103,8 @@ auto TrackBrowser::Tick() -> void { } if (loading_page_->wait_for(std::chrono::seconds(0)) == std::future_status::ready) { - auto result = loading_page_->get(); + std::shared_ptr<database::Result<database::IndexRecord>> result{ + loading_page_->get()}; AddResults(loading_pos_.value_or(END), result); loading_page_.reset(); @@ -126,18 +128,26 @@ auto TrackBrowser::OnItemSelected(lv_event_t* ev) -> void { } auto TrackBrowser::OnItemClicked(lv_event_t* ev) -> void { - auto index = GetItemIndex(lv_event_get_target(ev)); - if (!index) { + auto res = GetItemIndex(lv_event_get_target(ev)); + if (!res) { return; } - auto record = GetRecordByIndex(*index); - if (!record) { - return; + + auto index = *res; + for (const auto& page : current_pages_) { + for (std::size_t i = 0; i < page->values().size(); i++) { + if (index == 0) { + events::Dispatch<internal::RecordSelected, UiState>( + internal::RecordSelected{ + .initial_page = initial_page_, + .page = page, + .record = i, + }); + return; + } + index--; + } } - ESP_LOGI(kTag, "clicked item %u (%s)", *index, - record->text().value_or("[nil]").c_str()); - events::Dispatch<internal::RecordSelected, UiState>( - internal::RecordSelected{.record = *record}); } auto TrackBrowser::AddLoadingIndictor(Position pos) -> void { @@ -150,14 +160,18 @@ auto TrackBrowser::AddLoadingIndictor(Position pos) -> void { } } -auto TrackBrowser::AddResults(Position pos, - database::Result<database::IndexRecord>* results) - -> void { +auto TrackBrowser::AddResults( + Position pos, + std::shared_ptr<database::Result<database::IndexRecord>> results) -> void { if (loading_indicator_ != nullptr) { lv_obj_del(loading_indicator_); loading_indicator_ = nullptr; } + if (initial_page_ == nullptr) { + initial_page_ = results; + } + auto fn = [&](const database::IndexRecord& record) { auto text = record.text(); if (!text) { @@ -192,11 +206,11 @@ auto TrackBrowser::AddResults(Position pos, switch (pos) { case START: std::for_each(results->values().rbegin(), results->values().rend(), fn); - current_pages_.emplace_front(results); + current_pages_.push_front(results); break; case END: std::for_each(results->values().begin(), results->values().end(), fn); - current_pages_.emplace_back(results); + current_pages_.push_back(results); break; } @@ -302,24 +316,5 @@ auto TrackBrowser::GetItemIndex(lv_obj_t* obj) -> std::optional<std::size_t> { return {}; } -auto TrackBrowser::GetRecordByIndex(std::size_t index) - -> std::optional<database::IndexRecord> { - std::size_t total_tracks = 0; - for (int i = 0; i < current_pages_.size(); i++) { - total_tracks += current_pages_.at(i)->values().size(); - } - ESP_LOGI(kTag, "total tracks %u, getting index %u", total_tracks, index); - - for (const auto& page : current_pages_) { - for (int i = 0; i < page->values().size(); i++) { - if (index == 0) { - return page->values().at(i); - } - index--; - } - } - return {}; -} - } // namespace screens } // namespace ui diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp index 96949cd0..a9c3b61c 100644 --- a/src/ui/ui_fsm.cpp +++ b/src/ui/ui_fsm.cpp @@ -17,6 +17,7 @@ #include "screen_playing.hpp" #include "screen_splash.hpp" #include "screen_track_browser.hpp" +#include "source.hpp" #include "system_events.hpp" #include "touchwheel.hpp" #include "track_queue.hpp" @@ -117,20 +118,21 @@ void Browse::react(const internal::RecordSelected& ev) { return; } - if (ev.record.track()) { - ESP_LOGI(kTag, "selected track '%s'", ev.record.text()->c_str()); - // TODO(jacqueline): We should also send some kind of playlist info here. + auto record = ev.page->values().at(ev.record); + if (record.track()) { + ESP_LOGI(kTag, "selected track '%s'", record.text()->c_str()); sQueue->Clear(); - sQueue->AddLast(*ev.record.track()); + sQueue->IncludeLast(std::make_shared<playlist::IndexRecordSource>( + sDb, ev.initial_page, 0, ev.page, ev.record)); transit<Playing>(); } else { - ESP_LOGI(kTag, "selected record '%s'", ev.record.text()->c_str()); - auto cont = ev.record.Expand(kRecordsPerPage); + ESP_LOGI(kTag, "selected record '%s'", record.text()->c_str()); + auto cont = record.Expand(kRecordsPerPage); if (!cont) { return; } auto query = db->GetPage(&cont.value()); - std::string title = ev.record.text().value_or("TODO"); + std::string title = record.text().value_or("TODO"); PushScreen( std::make_shared<screens::TrackBrowser>(sDb, title, std::move(query))); } |
