mirror of
https://github.com/Lorenzooone/cc3dsfs.git
synced 2025-06-18 16:45:39 -04:00
217 lines
8.2 KiB
C++
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);
|
|
}
|