summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/include/screen_track_browser.hpp8
-rw-r--r--src/ui/include/ui_events.hpp5
-rw-r--r--src/ui/screen_track_browser.cpp65
-rw-r--r--src/ui/ui_fsm.cpp16
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)));
}