Files
product-vamp/src/vamp_zero/menu.cpp
T
khodowany 2a1aa2c67a UI
2026-09-30 18:23:25 -05:00

132 lines
4.5 KiB
C++

#include <vamp_zero/menu.hpp>
#include <utility>
#include <vamp_zero/navigation.hpp>
#include <vamp_zero/page_control.hpp>
auto vamp_zero::menu_count(vamp_zero::app_state const &state) -> std::size_t {
switch (state.mode) {
case vamp_zero::app_mode::MAIN_MENU:
return 2U;
case vamp_zero::app_mode::SETTINGS_MENU:
return 4U;
case vamp_zero::app_mode::PERFORMANCE_SONG_MENU:
return state.catalog->groups.size() + 1U;
case vamp_zero::app_mode::PERFORMANCE_PART_MENU:
if (auto group = selected_group(state)) {
return group->parts.size() + 1U;
}
return 1U;
case vamp_zero::app_mode::PERFORMANCE_SCORE:
return 0U;
}
return 0U;
}
auto vamp_zero::menu_selection(vamp_zero::app_state const &state) -> std::size_t {
switch (state.mode) {
case vamp_zero::app_mode::MAIN_MENU:
return state.selected_main_menu_index;
case vamp_zero::app_mode::SETTINGS_MENU:
return state.selected_settings_index;
case vamp_zero::app_mode::PERFORMANCE_SONG_MENU:
return state.selected_song_index;
case vamp_zero::app_mode::PERFORMANCE_PART_MENU:
return state.selected_part_index;
case vamp_zero::app_mode::PERFORMANCE_SCORE:
return 0U;
}
return 0U;
}
auto vamp_zero::menu_title(vamp_zero::app_state const &state) -> std::string {
switch (state.mode) {
case vamp_zero::app_mode::MAIN_MENU:
return "Main Menu";
case vamp_zero::app_mode::SETTINGS_MENU:
return "Settings";
case vamp_zero::app_mode::PERFORMANCE_SONG_MENU:
return "Performance";
case vamp_zero::app_mode::PERFORMANCE_PART_MENU:
if (auto group = selected_group(state)) {
return group->title;
}
return "Parts";
case vamp_zero::app_mode::PERFORMANCE_SCORE:
return {};
}
return {};
}
auto vamp_zero::menu_row(vamp_zero::app_state const &state, std::size_t row) -> vamp_zero::menu_item {
if (row >= menu_count(state)) {
return {};
}
if (state.mode == vamp_zero::app_mode::MAIN_MENU) {
return {row == 0U ? "Performance" : "Settings", row == 0U ? std::to_string(state.catalog->groups.size()) + " songs" : ""};
}
if (row == 0U) {
return {"Back", ""};
}
if (state.mode == vamp_zero::app_mode::SETTINGS_MENU) {
if (row == 1U) {
return {"Playback", state.audio.playback_enabled ? "On" : "Off"};
}
if (row == 2U) {
return {"Metronome", state.audio.metronome_enabled ? "On" : "Off"};
}
return {"Tempo", std::to_string(state.audio.metronome_bpm) + " BPM"};
}
if (state.mode == vamp_zero::app_mode::PERFORMANCE_SONG_MENU) {
auto const &group = state.catalog->groups[row - 1U];
return {group.title, group.composer};
}
if (auto group = selected_group(state)) {
auto const &part = state.catalog->parts[group->parts[row - 1U]];
return {part.part, std::to_string(part.total_pages) + " pages"};
}
return {};
}
auto vamp_zero::apply_menu_action(vamp_zero::app_state state, vamp_zero::menu_action const &action) -> vamp_zero::app_state {
if (state.input_revision != action.revision || state.catalog != action.catalog || menu_count(state) == 0U) {
return state;
}
if (action.kind == vamp_zero::menu_action_kind::NEXT || action.kind == vamp_zero::menu_action_kind::PREVIOUS) {
return apply_app_command(std::move(state), action.kind == vamp_zero::menu_action_kind::NEXT ? vamp_protocol::page_command::NEXT : vamp_protocol::page_command::PREVIOUS);
}
if (action.row >= menu_count(state)) {
return state;
}
if (action.kind == vamp_zero::menu_action_kind::TEMPO_DOWN || action.kind == vamp_zero::menu_action_kind::TEMPO_UP) {
if (state.mode != vamp_zero::app_mode::SETTINGS_MENU || action.row != 3U) {
return state;
}
state.selected_settings_index = 3U;
state.audio.tempo_editing = true;
state = apply_app_command(std::move(state), action.kind == vamp_zero::menu_action_kind::TEMPO_UP ? vamp_protocol::page_command::NEXT : vamp_protocol::page_command::PREVIOUS);
state.audio.tempo_editing = false;
return state;
}
switch (state.mode) {
case vamp_zero::app_mode::MAIN_MENU:
state.selected_main_menu_index = action.row;
break;
case vamp_zero::app_mode::SETTINGS_MENU:
state.selected_settings_index = action.row;
state.audio.tempo_editing = false;
break;
case vamp_zero::app_mode::PERFORMANCE_SONG_MENU:
state.selected_song_index = action.row;
break;
case vamp_zero::app_mode::PERFORMANCE_PART_MENU:
state.selected_part_index = action.row;
break;
case vamp_zero::app_mode::PERFORMANCE_SCORE:
return state;
}
return apply_app_command(std::move(state), vamp_protocol::page_command::SELECT);
}