#include #include #include #include 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); }