cc3dsfs/source/Menus/SecondScreen3DRelativePositionMenu.cpp

217 lines
8.2 KiB
C++

#include "SecondScreen3DRelativePositionMenu.hpp"
#include "utils.hpp"
#define NUM_TOTAL_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
struct SecondScreen3DRelativePositionMenuOptionInfo {
const std::string base_name;
const std::string false_name;
const bool is_selectable;
const int position_x, position_y, multiplier_y;
float text_factor_multiplier;
const SecondScreen3DRelPosMenuOutAction out_action;
const SecondScreen3DRelativePosition out_position;
int divisor_x;
const bool exists_non_joint;
};
static const SecondScreen3DRelativePositionMenuOptionInfo above_option = {
.base_name = "Above", .false_name = "",
.is_selectable = true,
.position_x = 1, .position_y = 1, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM,
.out_position = ABOVE_FIRST,
.divisor_x = 3, .exists_non_joint = true};
static const SecondScreen3DRelativePositionMenuOptionInfo left_option = {
.base_name = "Left", .false_name = "",
.is_selectable = true,
.position_x = 0, .position_y = 2, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM,
.out_position = LEFT_FIRST,
.divisor_x = 3, .exists_non_joint = true};
static const SecondScreen3DRelativePositionMenuOptionInfo right_option = {
.base_name = "Right", .false_name = "",
.is_selectable = true,
.position_x = 2, .position_y = 2, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM,
.out_position = RIGHT_FIRST,
.divisor_x = 3, .exists_non_joint = true};
static const SecondScreen3DRelativePositionMenuOptionInfo below_option = {
.base_name = "Below", .false_name = "",
.is_selectable = true,
.position_x = 1, .position_y = 3, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM,
.out_position = UNDER_FIRST,
.divisor_x = 3, .exists_non_joint = true};
static const SecondScreen3DRelativePositionMenuOptionInfo desc_option = {
.base_name = "3D Screen", .false_name = "",
.is_selectable = false,
.position_x = 1, .position_y = 4, .multiplier_y = 2,
.text_factor_multiplier = 0.95f,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_NO_ACTION,
.out_position = SECOND_SCREEN_3D_REL_POS_END,
.divisor_x = 3, .exists_non_joint = true};
static const SecondScreen3DRelativePositionMenuOptionInfo desc2_option = {
.base_name = "Position", .false_name = "",
.is_selectable = false,
.position_x = 1, .position_y = 5, .multiplier_y = 2,
.text_factor_multiplier = 0.95f,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_NO_ACTION,
.out_position = SECOND_SCREEN_3D_REL_POS_END,
.divisor_x = 3, .exists_non_joint = true};
static const SecondScreen3DRelativePositionMenuOptionInfo match_option = {
.base_name = "Set Manual 3D Screen Pos.", .false_name = "Set Automatic 3D Screen Pos.",
.is_selectable = true,
.position_x = 0, .position_y = 0, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = SECOND_SCREEN_3D_REL_POS_MENU_TOGGLE_MATCH,
.out_position = SECOND_SCREEN_3D_REL_POS_END,
.divisor_x = 1, .exists_non_joint = false};
static const SecondScreen3DRelativePositionMenuOptionInfo* pollable_options[] = {
&match_option,
&above_option,
&left_option,
&right_option,
&below_option,
&desc_option,
&desc2_option,
};
SecondScreen3DRelativePositionMenu::SecondScreen3DRelativePositionMenu(TextRectanglePool* text_rectangle_pool) {
this->initialize(text_rectangle_pool);
}
SecondScreen3DRelativePositionMenu::~SecondScreen3DRelativePositionMenu() {
for(int i = 0; i < this->num_elements_displayed_per_screen; i++)
delete this->labels[i];
delete []this->labels;
delete []this->selectable_labels;
}
void SecondScreen3DRelativePositionMenu::class_setup() {
this->num_options_per_screen = NUM_TOTAL_MENU_OPTIONS;
this->min_elements_text_scaling_factor = 4;
this->num_vertical_slices = 5;
this->pos_y_subtractor = 0;
this->width_factor_menu = 16;
this->width_divisor_menu = 9;
this->base_height_factor_menu = 12;
this->base_height_divisor_menu = 6;
this->min_text_size = 0.3f;
this->max_width_slack = 1.1f;
this->menu_color = sf::Color(30, 30, 60, 192);
this->title = "3D Screen Placement";
}
void SecondScreen3DRelativePositionMenu::insert_data(ScreenType stype_out) {
this->stype = stype_out;
this->pos_y_subtractor = 0;
this->num_vertical_slices = 5;
if(this->stype != ScreenType::JOINT) {
this->pos_y_subtractor += 1;
this->num_vertical_slices -= 1;
}
this->prepare_options();
}
void SecondScreen3DRelativePositionMenu::reset_output_option() {
this->selected_index = SECOND_SCREEN_3D_REL_POS_MENU_NO_ACTION;
}
void SecondScreen3DRelativePositionMenu::set_output_option(int index) {
if(index == BACK_X_OUTPUT_OPTION)
this->selected_index = SECOND_SCREEN_3D_REL_POS_MENU_BACK;
else {
this->selected_index = pollable_options[index]->out_action;
this->selected_confirm_value = pollable_options[index]->out_position;
}
}
bool SecondScreen3DRelativePositionMenu::is_option_drawable(int index) {
if(index < this->elements_start_id)
return true;
if((this->stype != ScreenType::JOINT) && (!pollable_options[index - this->elements_start_id]->exists_non_joint))
return false;
return true;
}
bool SecondScreen3DRelativePositionMenu::is_option_selectable(int index) {
if((this->stype != ScreenType::JOINT) && (!pollable_options[index]->exists_non_joint))
return false;
return pollable_options[index]->is_selectable;
}
std::string SecondScreen3DRelativePositionMenu::get_string_option(int index) {
return pollable_options[index]->base_name;
}
std::string SecondScreen3DRelativePositionMenu::get_false_option(int index) {
return pollable_options[index]->false_name;
}
void SecondScreen3DRelativePositionMenu::option_slice_prepare(int i, int index, int num_vertical_slices, float text_scaling_factor) {
if((this->stype != ScreenType::JOINT) && (!pollable_options[i]->exists_non_joint))
return;
int pos_y = pollable_options[i]->position_y - (this->pos_y_subtractor * pollable_options[i]->multiplier_y);
this->prepare_text_slices(pollable_options[i]->position_x, pollable_options[i]->divisor_x, pos_y + (1 * pollable_options[i]->multiplier_y), num_vertical_slices * pollable_options[i]->multiplier_y, index, text_scaling_factor * pollable_options[i]->text_factor_multiplier);
}
bool SecondScreen3DRelativePositionMenu::is_option_element(int option) {
return (option >= this->elements_start_id) && (option < (this->elements_start_id + this->num_elements_per_screen));
}
bool SecondScreen3DRelativePositionMenu::is_option_left(int index) {
return (pollable_options[index]->out_action == SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM) && (pollable_options[index]->out_position == LEFT_FIRST);
}
bool SecondScreen3DRelativePositionMenu::is_option_right(int index) {
return (pollable_options[index]->out_action == SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM) && (pollable_options[index]->out_position == RIGHT_FIRST);
}
bool SecondScreen3DRelativePositionMenu::is_option_above(int index) {
return (pollable_options[index]->out_action == SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM) && (pollable_options[index]->out_position == ABOVE_FIRST);
}
bool SecondScreen3DRelativePositionMenu::is_option_below(int index) {
return (pollable_options[index]->out_action == SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM) && (pollable_options[index]->out_position == UNDER_FIRST);
}
std::string SecondScreen3DRelativePositionMenu::setTextOptionBool(int index, bool value) {
if(value)
return this->get_string_option(index);
return this->get_false_option(index);
}
void SecondScreen3DRelativePositionMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, ScreenInfo* info) {
SecondScreen3DRelativePosition curr_2nd_screen_3d_pos = info->second_screen_pos;
for(int i = 0; i < this->num_options_per_screen; i++) {
int index = i + this->elements_start_id;
switch(pollable_options[i]->out_action) {
case SECOND_SCREEN_3D_REL_POS_MENU_CONFIRM:
if(pollable_options[i]->out_position == curr_2nd_screen_3d_pos)
this->labels[index]->setText("<" + this->get_string_option(i) + ">");
else
this->labels[index]->setText(this->get_string_option(i));
break;
case SECOND_SCREEN_3D_REL_POS_MENU_TOGGLE_MATCH:
this->labels[index]->setText(this->setTextOptionBool(i, info->match_bottom_pos_and_second_screen_pos));
break;
default:
break;
}
}
this->base_prepare(menu_scaling_factor, view_size_x, view_size_y);
}