132 lines
4.5 KiB
C++
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);
|
|
}
|