UI
This commit is contained in:
@@ -5,12 +5,11 @@
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
|
||||
#include <boost/json/value.hpp>
|
||||
|
||||
#include <ligo.hpp>
|
||||
|
||||
#include <vamp_protocol/page_control.hpp>
|
||||
#include <vamp_zero/config.hpp>
|
||||
#include <vamp_zero/menu.hpp>
|
||||
#include <vamp_zero/types.hpp>
|
||||
|
||||
namespace vamp_zero {
|
||||
@@ -21,6 +20,7 @@ public:
|
||||
auto config() const -> vamp_zero::config;
|
||||
auto snapshot() const -> vamp_zero::app_state;
|
||||
auto apply(vamp_protocol::page_command command) -> vamp_zero::app_state;
|
||||
auto apply(vamp_zero::menu_action const &action) -> vamp_zero::app_state;
|
||||
auto heartbeat() -> vamp_zero::app_state;
|
||||
auto refresh_connection() -> std::optional<vamp_zero::app_state>;
|
||||
auto set_observer(std::function<void(vamp_zero::app_state)> observer) -> void;
|
||||
@@ -36,7 +36,6 @@ private:
|
||||
};
|
||||
|
||||
auto make_router(vamp_zero::control_state &state) -> ligo::service_router;
|
||||
auto portal_status_json(vamp_zero::config const &config, vamp_zero::app_state const &state) -> boost::json::value;
|
||||
auto validated_title_path(std::string const &assets_path, std::string const &identifier) -> std::expected<std::string, modulus::error>;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <vamp_zero/types.hpp>
|
||||
|
||||
|
||||
namespace vamp_zero {
|
||||
|
||||
enum class menu_action_kind { ACTIVATE,
|
||||
PREVIOUS,
|
||||
NEXT,
|
||||
TEMPO_DOWN,
|
||||
TEMPO_UP };
|
||||
|
||||
struct menu_action {
|
||||
vamp_zero::menu_action_kind kind{};
|
||||
std::size_t row{};
|
||||
std::uint64_t revision{};
|
||||
std::shared_ptr<vamp_zero::catalog const> catalog{};
|
||||
};
|
||||
|
||||
struct menu_item {
|
||||
std::string label{};
|
||||
std::string detail{};
|
||||
};
|
||||
|
||||
auto menu_count(vamp_zero::app_state const &state) -> std::size_t;
|
||||
auto menu_selection(vamp_zero::app_state const &state) -> std::size_t;
|
||||
auto menu_title(vamp_zero::app_state const &state) -> std::string;
|
||||
auto menu_row(vamp_zero::app_state const &state, std::size_t row) -> vamp_zero::menu_item;
|
||||
auto apply_menu_action(vamp_zero::app_state state, vamp_zero::menu_action const &action) -> vamp_zero::app_state;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include <chrono>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
#include <luma.hpp>
|
||||
|
||||
#include <vamp_style.hpp>
|
||||
#include <vamp_zero/menu.hpp>
|
||||
|
||||
|
||||
namespace vamp_zero {
|
||||
|
||||
struct menu_target {
|
||||
luma::rect bounds{};
|
||||
vamp_zero::menu_action action{};
|
||||
};
|
||||
|
||||
auto menu_layout(luma::rect bounds, vamp_zero::app_state const &state) -> std::vector<vamp_zero::menu_target>;
|
||||
auto draw_label(luma::draw_context &context, luma::rect bounds, std::string text, std::float32_t size, vamp_style::color color) -> void;
|
||||
auto draw_menu(luma::draw_context &context, luma::rect bounds, vamp_zero::app_state const &state) -> void;
|
||||
auto draw_header(luma::draw_context &context, luma::rect bounds, vamp_zero::app_state const &state) -> void;
|
||||
|
||||
class menu_touch {
|
||||
public:
|
||||
auto handle(luma::touch_event const &event, luma::rect bounds, vamp_zero::app_state const &state) -> std::optional<vamp_zero::menu_action>;
|
||||
private:
|
||||
std::set<std::int32_t> fingers_{};
|
||||
std::optional<vamp_zero::menu_target> target_{};
|
||||
luma::point origin_{};
|
||||
std::chrono::steady_clock::time_point pressed_{};
|
||||
};
|
||||
|
||||
}
|
||||
@@ -3,8 +3,6 @@
|
||||
#include <expected>
|
||||
#include <string>
|
||||
|
||||
#include <boost/json/value.hpp>
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
#include <vamp_protocol/page_control.hpp>
|
||||
@@ -14,7 +12,6 @@
|
||||
namespace vamp_zero {
|
||||
|
||||
auto apply_app_command(vamp_zero::app_state state, vamp_protocol::page_command command) -> vamp_zero::app_state;
|
||||
auto app_status_json(vamp_zero::app_state const &state) -> boost::json::value;
|
||||
auto remote_display_text(vamp_zero::app_state const &state) -> std::string;
|
||||
auto validate_app_state(vamp_zero::app_state const &state) -> std::expected<void, modulus::error>;
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ public:
|
||||
touch_input(touch_input const &) = delete;
|
||||
auto operator=(touch_input const &) -> touch_input & = delete;
|
||||
auto handle(luma::touch_event const &event) -> std::bool_t;
|
||||
auto reset() -> void;
|
||||
auto stop() -> void;
|
||||
private:
|
||||
struct state;
|
||||
|
||||
@@ -62,6 +62,7 @@ struct score_reference {
|
||||
|
||||
enum class app_mode {
|
||||
MAIN_MENU,
|
||||
SETTINGS_MENU,
|
||||
PERFORMANCE_SONG_MENU,
|
||||
PERFORMANCE_PART_MENU,
|
||||
PERFORMANCE_SCORE,
|
||||
@@ -83,16 +84,14 @@ struct app_state {
|
||||
vamp_zero::app_mode mode{vamp_zero::app_mode::MAIN_MENU};
|
||||
vamp_zero::audio_state audio{};
|
||||
std::size_t selected_main_menu_index{};
|
||||
std::size_t selected_settings_index{1U};
|
||||
std::size_t remembered_settings_index{1U};
|
||||
std::size_t selected_song_index{};
|
||||
std::size_t selected_part_index{};
|
||||
std::string active_part_id{};
|
||||
std::size_t page_index{};
|
||||
std::uint64_t score_session{};
|
||||
std::uint64_t next_count{};
|
||||
std::uint64_t previous_count{};
|
||||
std::uint64_t select_count{};
|
||||
std::uint64_t heartbeat_count{};
|
||||
std::string last_command{"startup"};
|
||||
std::uint64_t input_revision{};
|
||||
std::bool_t pico_connected{false};
|
||||
};
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <vamp_protocol/page_control.hpp>
|
||||
#include <vamp_zero/config.hpp>
|
||||
#include <vamp_zero/types.hpp>
|
||||
#include <vamp_zero/menu.hpp>
|
||||
|
||||
namespace vamp_zero {
|
||||
|
||||
@@ -21,23 +22,15 @@ struct ui_runtime;
|
||||
|
||||
class score_loader;
|
||||
|
||||
struct ui_state {
|
||||
vamp_zero::app_state app{};
|
||||
std::string ap_ssid{};
|
||||
std::string zero_ip{};
|
||||
std::uint16_t port{8080};
|
||||
};
|
||||
|
||||
class zero_ui {
|
||||
public:
|
||||
zero_ui(boost::asio::any_io_executor executor, luma::application_config config, vamp_zero::database_config database, std::string assets_path, std::function<void(vamp_protocol::page_command)> command_handler = {});
|
||||
zero_ui(boost::asio::any_io_executor executor, luma::application_config config, vamp_zero::database_config database, std::string assets_path, std::function<void(vamp_protocol::page_command)> command_handler = {}, std::function<void(vamp_zero::menu_action)> menu_handler = {});
|
||||
~zero_ui();
|
||||
zero_ui(zero_ui const &) = delete;
|
||||
auto operator=(zero_ui const &) -> zero_ui & = delete;
|
||||
auto run() -> std::expected<void, modulus::error>;
|
||||
auto stop() -> void;
|
||||
auto publish(vamp_zero::ui_state state) -> std::expected<void, modulus::error>;
|
||||
auto snapshot() const -> vamp_zero::ui_state;
|
||||
auto publish(vamp_zero::app_state state) -> std::expected<void, modulus::error>;
|
||||
auto selected_score_loader() const -> std::shared_ptr<vamp_zero::score_loader>;
|
||||
private:
|
||||
std::shared_ptr<luma::application> application_;
|
||||
@@ -45,6 +38,4 @@ private:
|
||||
std::shared_ptr<vamp_zero::score_loader> score_loader_;
|
||||
};
|
||||
|
||||
auto make_ui_state(vamp_zero::config const &config, vamp_zero::app_state app) -> vamp_zero::ui_state;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user