summaryrefslogtreecommitdiff
path: root/src/ui/modal_add_to_queue.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-10-04 14:47:30 +1100
committerjacqueline <me@jacqueline.id.au>2023-10-04 14:47:30 +1100
commit28633e857f86a21d874117fd677de5e8ad21d8d3 (patch)
treed016f7da3b7d5b8ca9c577ea5eaf783a925e418b /src/ui/modal_add_to_queue.cpp
parent7a7fafdd92f8ddc1143a00febf0a540cfefaf099 (diff)
downloadtangara-fw-28633e857f86a21d874117fd677de5e8ad21d8d3.tar.gz
Implement UI for enqueuing instead of replacing the current track
Diffstat (limited to 'src/ui/modal_add_to_queue.cpp')
-rw-r--r--src/ui/modal_add_to_queue.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/ui/modal_add_to_queue.cpp b/src/ui/modal_add_to_queue.cpp
new file mode 100644
index 00000000..649ba3bd
--- /dev/null
+++ b/src/ui/modal_add_to_queue.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2023 jacqueline <me@jacqueline.id.au>
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+#include "modal_add_to_queue.hpp"
+
+#include "core/lv_event.h"
+#include "core/lv_obj.h"
+#include "core/lv_obj_tree.h"
+#include "esp_log.h"
+
+#include "core/lv_group.h"
+#include "core/lv_obj_pos.h"
+#include "event_queue.hpp"
+#include "extra/widgets/list/lv_list.h"
+#include "extra/widgets/menu/lv_menu.h"
+#include "extra/widgets/spinner/lv_spinner.h"
+#include "hal/lv_hal_disp.h"
+#include "index.hpp"
+#include "misc/lv_area.h"
+#include "source.hpp"
+#include "track_queue.hpp"
+#include "ui_events.hpp"
+#include "ui_fsm.hpp"
+#include "widget_top_bar.hpp"
+#include "widgets/lv_btn.h"
+#include "widgets/lv_label.h"
+
+namespace ui {
+namespace modals {
+
+AddToQueue::AddToQueue(Screen* host,
+ audio::TrackQueue& queue,
+ std::shared_ptr<playlist::IndexRecordSource> item)
+ : Modal(host), queue_(queue), item_(item) {
+ lv_obj_set_layout(root_, LV_LAYOUT_FLEX);
+ lv_obj_set_flex_flow(root_, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(root_, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER,
+ LV_FLEX_ALIGN_CENTER);
+
+ lv_obj_t* label = lv_label_create(root_);
+ lv_label_set_text(label, "This track");
+
+ lv_obj_t* button_container = lv_obj_create(root_);
+ lv_obj_set_size(button_container, lv_pct(100), LV_SIZE_CONTENT);
+ lv_obj_set_layout(button_container, LV_LAYOUT_FLEX);
+ lv_obj_set_flex_flow(button_container, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(button_container, LV_FLEX_ALIGN_SPACE_EVENLY,
+ LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+
+ lv_obj_t* btn = lv_btn_create(button_container);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Play");
+ lv_group_add_obj(group_, btn);
+
+ lv_bind(btn, LV_EVENT_CLICKED, [this](lv_obj_t*) {
+ queue_.Clear();
+ auto track = item_->Current();
+ if (track) {
+ queue_.AddNext(*track);
+ }
+ events::Ui().Dispatch(internal::ModalCancelPressed{});
+ });
+
+ bool has_queue = queue.GetCurrent().has_value();
+
+ if (has_queue) {
+ btn = lv_btn_create(button_container);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Enqueue");
+ lv_group_add_obj(group_, btn);
+
+ lv_bind(btn, LV_EVENT_CLICKED, [this](lv_obj_t*) {
+ auto track = item_->Current();
+ if (track) {
+ queue_.AddLast(*track);
+ }
+ events::Ui().Dispatch(internal::ModalCancelPressed{});
+ });
+ }
+ label = lv_label_create(root_);
+ lv_label_set_text(label, "All tracks");
+
+ button_container = lv_obj_create(root_);
+ lv_obj_set_size(button_container, lv_pct(100), LV_SIZE_CONTENT);
+ lv_obj_set_layout(button_container, LV_LAYOUT_FLEX);
+ lv_obj_set_flex_flow(button_container, LV_FLEX_FLOW_ROW);
+ lv_obj_set_flex_align(button_container, LV_FLEX_ALIGN_SPACE_EVENLY,
+ LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
+
+ btn = lv_btn_create(button_container);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Play");
+ lv_group_add_obj(group_, btn);
+
+ lv_bind(btn, LV_EVENT_CLICKED, [this](lv_obj_t*) {
+ queue_.Clear();
+ queue_.IncludeNext(item_);
+ events::Ui().Dispatch(internal::ModalCancelPressed{});
+ });
+
+ if (has_queue) {
+ btn = lv_btn_create(button_container);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Enqueue");
+ lv_group_add_obj(group_, btn);
+
+ lv_bind(btn, LV_EVENT_CLICKED, [this](lv_obj_t*) {
+ queue_.IncludeLast(item_);
+ events::Ui().Dispatch(internal::ModalCancelPressed{});
+ });
+ }
+
+ btn = lv_btn_create(root_);
+ label = lv_label_create(btn);
+ lv_label_set_text(label, "Cancel");
+ lv_group_add_obj(group_, btn);
+
+ lv_bind(btn, LV_EVENT_CLICKED, [](lv_obj_t*) {
+ events::Ui().Dispatch(internal::ModalCancelPressed{});
+ });
+}
+
+} // namespace modals
+} // namespace ui