Add Menu for Relative Screen Position

This commit is contained in:
Lorenzooone 2024-05-22 05:12:04 +02:00
parent e27db15bfd
commit 0819e1fad9
6 changed files with 685 additions and 37 deletions

View File

@ -132,7 +132,7 @@ file(MAKE_DIRECTORY ${TOOLS_DATA_DIR})
set(OUTPUT_NAME cc3dsfs)
add_executable(CMakeBin2C tools/bin2c.cpp)
add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/3dscapture.cpp source/conversions.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp)
add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/3dscapture.cpp source/conversions.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp source/Menus/RelativePositionMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp)
add_dependencies(${OUTPUT_NAME} FTD3XX_BUILD_PROJECT CMakeBin2C)
target_link_libraries(${OUTPUT_NAME} PRIVATE sfml-graphics sfml-audio sfml-window sfml-system ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER}/${FTD3XX_LIB})
target_link_directories(${OUTPUT_NAME} PRIVATE ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER})

View File

@ -0,0 +1,90 @@
#ifndef __RELPOSMENU_HPP
#define __RELPOSMENU_HPP
#include <SFML/Graphics.hpp>
#include <chrono>
#include "TextRectangle.hpp"
#include "sfml_gfx_structs.hpp"
#include "display_structs.hpp"
#define BACK_X_OUTPUT_OPTION -1
enum RelPosMenuOutAction{
REL_POS_MENU_NO_ACTION,
REL_POS_MENU_BACK,
REL_POS_MENU_CONFIRM,
};
class RelativePositionMenu {
public:
RelativePositionMenu(bool font_load_success, sf::Font &text_font);
~RelativePositionMenu();
bool poll(SFEvent &event_data);
void draw(float scaling_factor, sf::RenderTarget &window);
void reset_data();
std::chrono::time_point<std::chrono::high_resolution_clock> last_input_processed_time;
void reset_output_option();
void prepare(float scaling_factor, int view_size_x, int view_size_y, BottomRelativePosition curr_bottom_pos);
void insert_data();
RelPosMenuOutAction selected_index = RelPosMenuOutAction::REL_POS_MENU_NO_ACTION;
BottomRelativePosition selected_confirm_value = BOT_REL_POS_END;
private:
struct RelPosMenuData {
int option_selected = -1;
int menu_width;
int menu_height;
int pos_x;
int pos_y;
};
RelPosMenuData future_data;
TextRectangle **labels;
int num_options_per_screen;
int elements_start_id;
int min_elements_text_scaling_factor;
int width_factor_menu;
int width_divisor_menu;
int base_height_factor_menu;
int base_height_divisor_menu;
float min_text_size;
float max_width_slack;
sf::Color menu_color;
std::string title;
int num_elements_per_screen;
int num_title_back_x_elements;
int num_elements_displayed_per_screen;
int num_vertical_slices;
int title_back_x_start_id;
int back_x_id;
int title_id;
std::chrono::time_point<std::chrono::high_resolution_clock> last_action_time;
const float action_timeout = 0.1;
int option_selected = -1;
bool *selectable_labels;
RelPosMenuData loaded_data;
sf::RectangleShape menu_rectangle = sf::RectangleShape(sf::Vector2f(1, 1));
bool is_option_selectable(int index);
void set_output_option(int index);
std::string get_string_option(int index);
void class_setup();
void prepare_options();
void base_prepare(float menu_scaling_factor, int view_size_x, int view_size_y);
void after_class_setup_connected_values();
void prepare_text_slices(int x_multiplier, int x_divisor, int y_multiplier, int y_divisor, int index, float text_scaling_factor, bool center = false);
bool can_execute_action();
void up_code(bool is_simple);
void down_code(bool is_simple);
void left_code();
void right_code();
void option_selection_handling();
bool is_option_element(int option);
void set_default_cursor_position();
void decrement_selected_option(bool is_simple);
void increment_selected_option(bool is_simple);
};
#endif

View File

@ -21,6 +21,7 @@
#include "OffsetMenu.hpp"
#include "AudioMenu.hpp"
#include "BFIMenu.hpp"
#include "RelativePositionMenu.hpp"
#include "display_structs.hpp"
class WindowScreen {
@ -92,6 +93,7 @@ private:
OffsetMenu *offset_menu;
AudioMenu *audio_menu;
BFIMenu *bfi_menu;
RelativePositionMenu *relpos_menu;
std::vector<const CropData*> possible_crops;
std::vector<const PARData*> possible_pars;
@ -144,6 +146,7 @@ private:
void rotation_change(int &value, bool right);
void ratio_change(bool top_priority);
void bfi_change();
void bottom_pos_change(int new_bottom_pos);
void poll_window();
bool common_poll(SFEvent &event_data);
bool main_poll(SFEvent &event_data);

View File

@ -311,7 +311,7 @@ void OptionSelectionMenu::option_selection_handling() {
this->set_output_option(BACK_X_OUTPUT_OPTION, BAD_ACTION);
this->last_action_time = std::chrono::high_resolution_clock::now();
}
else if(this->future_data.option_selected < (this->elements_start_id + this->num_elements_per_screen)) {
else if(this->is_option_element(this->future_data.option_selected)) {
int elem_index = this->future_data.option_selected - this->elements_start_id;
int start = this->num_options_per_screen * this->future_data.page;
this->set_output_option((elem_index / this->single_option_multiplier) + start, elem_index % this->single_option_multiplier);

View File

@ -0,0 +1,485 @@
#include "RelativePositionMenu.hpp"
#include "utils.hpp"
#define NUM_TOTAL_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0]))
struct RelativePositionMenuOptionInfo {
const std::string base_name;
const bool is_selectable;
const int position_x, position_y, multiplier_y;
float text_factor_multiplier;
const BottomRelativePosition out_action;
};
static const RelativePositionMenuOptionInfo above_option = {
.base_name = "Above", .is_selectable = true,
.position_x = 1, .position_y = 0, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = UNDER_TOP};
static const RelativePositionMenuOptionInfo left_option = {
.base_name = "Left", .is_selectable = true,
.position_x = 0, .position_y = 1, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = RIGHT_TOP};
static const RelativePositionMenuOptionInfo right_option = {
.base_name = "Right", .is_selectable = true,
.position_x = 2, .position_y = 1, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = LEFT_TOP};
static const RelativePositionMenuOptionInfo below_option = {
.base_name = "Below", .is_selectable = true,
.position_x = 1, .position_y = 2, .multiplier_y = 1,
.text_factor_multiplier = 1.0,
.out_action = ABOVE_TOP};
static const RelativePositionMenuOptionInfo desc_option = {
.base_name = "Top Screen", .is_selectable = false,
.position_x = 1, .position_y = 2, .multiplier_y = 2,
.text_factor_multiplier = 0.95,
.out_action = BOT_REL_POS_END};
static const RelativePositionMenuOptionInfo desc2_option = {
.base_name = "Position", .is_selectable = false,
.position_x = 1, .position_y = 3, .multiplier_y = 2,
.text_factor_multiplier = 0.95,
.out_action = BOT_REL_POS_END};
static const RelativePositionMenuOptionInfo* pollable_options[] = {
&above_option,
&left_option,
&right_option,
&below_option,
&desc_option,
&desc2_option,
};
RelativePositionMenu::RelativePositionMenu(bool font_load_success, sf::Font &text_font) {
this->class_setup();
this->after_class_setup_connected_values();
this->menu_rectangle.setFillColor(this->menu_color);
this->menu_rectangle.setPosition(1, 1);
this->labels = new TextRectangle*[this->num_elements_displayed_per_screen];
this->selectable_labels = new bool[this->num_elements_displayed_per_screen];
for(int i = 0; i < this->num_elements_displayed_per_screen; i++) {
this->labels[i] = new TextRectangle(font_load_success, text_font);
this->labels[i]->setProportionalBox(false);
this->labels[i]->setText(std::to_string(i));
this->labels[i]->setShowText(true);
this->selectable_labels[i] = true;
}
this->future_data.menu_width = 1;
this->future_data.menu_height = 1;
this->future_data.pos_x = 0;
this->future_data.pos_y = 0;
this->last_action_time = std::chrono::high_resolution_clock::now();
this->last_input_processed_time = std::chrono::high_resolution_clock::now();
this->selectable_labels[this->back_x_id] = true;
this->selectable_labels[this->title_id] = false;
}
RelativePositionMenu::~RelativePositionMenu() {
for(int i = 0; i < this->num_elements_displayed_per_screen; i++)
delete this->labels[i];
delete []this->labels;
delete []this->selectable_labels;
}
void RelativePositionMenu::class_setup() {
this->num_options_per_screen = NUM_TOTAL_MENU_OPTIONS;
this->min_elements_text_scaling_factor = 4;
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.3;
this->max_width_slack = 1.1;
this->menu_color = sf::Color(30, 30, 60, 192);
this->title = "Screens Placement";
}
void RelativePositionMenu::after_class_setup_connected_values() {
this->num_title_back_x_elements = 2;
this->num_elements_per_screen = this->num_options_per_screen;
this->num_elements_displayed_per_screen = num_title_back_x_elements + num_elements_per_screen;
this->num_vertical_slices = 4;
this->title_back_x_start_id = 0;
this->elements_start_id = num_title_back_x_elements + title_back_x_start_id;
this->back_x_id = title_back_x_start_id + 1;
this->title_id = title_back_x_start_id;
}
bool RelativePositionMenu::can_execute_action() {
this->last_input_processed_time = std::chrono::high_resolution_clock::now();
auto curr_time = std::chrono::high_resolution_clock::now();
const std::chrono::duration<double> diff = curr_time - this->last_action_time;
if(diff.count() > this->action_timeout)
return true;
return false;
}
void RelativePositionMenu::insert_data() {
this->prepare_options();
}
void RelativePositionMenu::reset_data() {
this->last_input_processed_time = std::chrono::high_resolution_clock::now();
this->reset_output_option();
this->future_data.option_selected = -1;
}
bool RelativePositionMenu::is_option_element(int option) {
return (option >= this->elements_start_id) && (option < (this->elements_start_id + this->num_elements_per_screen));
}
void RelativePositionMenu::set_default_cursor_position() {
this->future_data.option_selected = this->elements_start_id;
while(!this->selectable_labels[this->future_data.option_selected]){
this->future_data.option_selected += 1;
if(this->future_data.option_selected >= this->num_elements_displayed_per_screen)
this->future_data.option_selected = 0;
if(this->future_data.option_selected == this->elements_start_id)
break;
}
}
void RelativePositionMenu::decrement_selected_option(bool is_simple) {
if(this->future_data.option_selected < 0) {
this->set_default_cursor_position();
return;
}
int elem_index = this->future_data.option_selected - this->elements_start_id;
if(!is_simple) {
if(this->is_option_element(this->future_data.option_selected) && ((pollable_options[elem_index]->out_action == LEFT_TOP) || (pollable_options[elem_index]->out_action == ABOVE_TOP)))
this->future_data.option_selected -= 1;
}
do {
this->future_data.option_selected -= 1;
if(this->future_data.option_selected < 0)
this->future_data.option_selected = this->num_elements_displayed_per_screen - 1;
} while(!this->selectable_labels[this->future_data.option_selected]);
}
void RelativePositionMenu::increment_selected_option(bool is_simple) {
if(this->future_data.option_selected < 0){
this->set_default_cursor_position();
return;
}
int elem_index = this->future_data.option_selected - this->elements_start_id;
if(!is_simple) {
if(this->is_option_element(this->future_data.option_selected) && (pollable_options[elem_index]->out_action == RIGHT_TOP))
this->future_data.option_selected += 1;
}
do {
this->future_data.option_selected += 1;
if(this->future_data.option_selected >= this->num_elements_displayed_per_screen)
this->future_data.option_selected = 0;
} while(!this->selectable_labels[this->future_data.option_selected]);
}
void RelativePositionMenu::reset_output_option() {
this->selected_index = REL_POS_MENU_NO_ACTION;
}
void RelativePositionMenu::set_output_option(int index) {
if(index == BACK_X_OUTPUT_OPTION)
this->selected_index = REL_POS_MENU_BACK;
else if(pollable_options[index]->out_action != BOT_REL_POS_END){
this->selected_confirm_value = pollable_options[index]->out_action;
this->selected_index = REL_POS_MENU_CONFIRM;
}
}
bool RelativePositionMenu::is_option_selectable(int index) {
return pollable_options[index]->is_selectable;
}
std::string RelativePositionMenu::get_string_option(int index) {
return pollable_options[index]->base_name;
}
void RelativePositionMenu::prepare_options() {
for(int i = 0; i < this->num_elements_displayed_per_screen; i++) {
this->labels[i]->setShowText(false);
}
this->labels[this->back_x_id]->setText("<--");
this->labels[this->back_x_id]->setShowText(true);
this->labels[this->title_id]->setText(this->title);
this->labels[this->title_id]->setShowText(true);
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
int label_start_index = i + this->elements_start_id;
this->labels[label_start_index]->setText(this->get_string_option(i));
this->selectable_labels[label_start_index] = this->is_option_selectable(i);
this->labels[label_start_index]->setShowText(true);
}
if(!this->selectable_labels[this->future_data.option_selected]) {
this->future_data.option_selected = -1;
}
}
void RelativePositionMenu::option_selection_handling() {
if((this->future_data.option_selected == -1) || (!this->selectable_labels[this->future_data.option_selected])) {
this->future_data.option_selected = -1;
return;
}
if(!this->can_execute_action())
return;
if(this->future_data.option_selected == this->back_x_id) {
this->set_output_option(BACK_X_OUTPUT_OPTION);
this->last_action_time = std::chrono::high_resolution_clock::now();
}
else if(this->is_option_element(this->future_data.option_selected)) {
int elem_index = this->future_data.option_selected - this->elements_start_id;
this->set_output_option(elem_index);
this->last_action_time = std::chrono::high_resolution_clock::now();
}
}
void RelativePositionMenu::up_code(bool is_simple) {
if(!this->can_execute_action())
return;
this->decrement_selected_option(is_simple);
this->last_action_time = std::chrono::high_resolution_clock::now();
}
void RelativePositionMenu::down_code(bool is_simple) {
if(!this->can_execute_action())
return;
this->increment_selected_option(is_simple);
this->last_action_time = std::chrono::high_resolution_clock::now();
}
void RelativePositionMenu::left_code() {
if(!this->can_execute_action())
return;
if(this->is_option_element(this->future_data.option_selected) && (pollable_options[this->future_data.option_selected - this->elements_start_id]->out_action == RIGHT_TOP))
this->option_selection_handling();
else {
this->future_data.option_selected -= 1;
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
if(pollable_options[i]->out_action == RIGHT_TOP) {
this->future_data.option_selected = i + this->elements_start_id;
break;
}
}
this->last_action_time = std::chrono::high_resolution_clock::now();
}
}
void RelativePositionMenu::right_code() {
if(!this->can_execute_action())
return;
int elem_index = this->future_data.option_selected - this->elements_start_id;
if(this->is_option_element(this->future_data.option_selected) && (pollable_options[this->future_data.option_selected - this->elements_start_id]->out_action == LEFT_TOP))
this->option_selection_handling();
else {
this->future_data.option_selected -= 1;
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
if(pollable_options[i]->out_action == LEFT_TOP) {
this->future_data.option_selected = i + this->elements_start_id;
break;
}
}
this->last_action_time = std::chrono::high_resolution_clock::now();
}
}
bool RelativePositionMenu::poll(SFEvent &event_data) {
bool consumed = true;
switch (event_data.type) {
case sf::Event::TextEntered:
switch (event_data.unicode) {
default:
consumed = false;
break;
}
break;
case sf::Event::KeyPressed:
switch (event_data.code) {
case sf::Keyboard::Up:
this->up_code(false);
break;
case sf::Keyboard::Down:
this->down_code(false);
break;
case sf::Keyboard::PageUp:
this->up_code(true);
break;
case sf::Keyboard::PageDown:
this->down_code(true);
break;
case sf::Keyboard::Left:
this->left_code();
break;
case sf::Keyboard::Right:
this->right_code();
break;
case sf::Keyboard::Enter:
this->option_selection_handling();
break;
default:
consumed = false;
break;
}
break;
case sf::Event::MouseMoved:
this->future_data.option_selected = -1;
for(int i = 0; i < this->num_elements_displayed_per_screen; i++) {
if(!this->selectable_labels[i])
continue;
if(this->labels[i]->isCoordInRectangle(event_data.mouse_x, event_data.mouse_y)) {
this->future_data.option_selected = i;
this->last_input_processed_time = std::chrono::high_resolution_clock::now();
break;
}
}
break;
case sf::Event::MouseButtonPressed:
this->future_data.option_selected = -1;
for(int i = 0; i < this->num_elements_displayed_per_screen; i++) {
if(!this->selectable_labels[i])
continue;
if(this->labels[i]->isCoordInRectangle(event_data.mouse_x, event_data.mouse_y)) {
this->future_data.option_selected = i;
break;
}
}
if(this->future_data.option_selected == -1)
break;
if(event_data.mouse_button == sf::Mouse::Left)
this->option_selection_handling();
break;
case sf::Event::JoystickButtonPressed:
switch(get_joystick_action(event_data.joystickId, event_data.joy_button)) {
case JOY_ACTION_CONFIRM:
this->option_selection_handling();
break;
case JOY_ACTION_NEGATE:
this->option_selection_handling();
break;
default:
consumed = false;
break;
}
break;
case sf::Event::JoystickMoved:
switch(get_joystick_direction(event_data.joystickId, event_data.axis, event_data.position)) {
case JOY_DIR_UP:
this->up_code(false);
break;
case JOY_DIR_DOWN:
this->down_code(false);
break;
case JOY_DIR_LEFT:
this->left_code();
break;
case JOY_DIR_RIGHT:
this->right_code();
break;
default:
consumed = false;
break;
}
break;
default:
consumed = false;
break;
}
return consumed;
}
void RelativePositionMenu::draw(float scaling_factor, sf::RenderTarget &window) {
const sf::Vector2f rect_size = this->menu_rectangle.getSize();
if((this->loaded_data.menu_width != rect_size.x) || (this->loaded_data.menu_height != rect_size.y)) {
this->menu_rectangle.setSize(sf::Vector2f(this->loaded_data.menu_width, this->loaded_data.menu_height));
}
this->menu_rectangle.setPosition(this->loaded_data.pos_x, this->loaded_data.pos_y);
window.draw(this->menu_rectangle);
for(int i = 0; i < this->num_elements_displayed_per_screen; i++) {
this->labels[i]->draw(window);
}
}
void RelativePositionMenu::prepare_text_slices(int x_multiplier, int x_divisor, int y_multiplier, int y_divisor, int index, float text_scaling_factor, bool center) {
this->labels[index]->setTextFactor(text_scaling_factor);
int x_base_pos = (this->future_data.menu_width * x_multiplier) / x_divisor;
int y_base_pos = (this->future_data.menu_height * y_multiplier) / y_divisor;
int x_size = ((this->future_data.menu_width * (x_multiplier + 1)) / x_divisor) - x_base_pos;
int y_size = ((this->future_data.menu_height * (y_multiplier + 1)) / y_divisor) - y_base_pos;
if(center)
x_size = ((this->future_data.menu_width * (x_divisor - x_multiplier)) / x_divisor) - x_base_pos;
this->labels[index]->setSize(x_size, y_size);
this->labels[index]->setPosition(this->future_data.pos_x + x_base_pos, this->future_data.pos_y + y_base_pos);
if(index == this->future_data.option_selected)
this->labels[index]->setRectangleKind(TEXT_KIND_SELECTED);
else {
if(!this->selectable_labels[index])
this->labels[index]->setRectangleKind(TEXT_KIND_TITLE);
else
this->labels[index]->setRectangleKind(TEXT_KIND_NORMAL);
}
this->labels[index]->prepareRenderText();
}
void RelativePositionMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y, BottomRelativePosition curr_bottom_pos) {
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
int index = i + this->elements_start_id;
switch(pollable_options[i]->out_action) {
case BOT_REL_POS_END:
break;
default:
if(pollable_options[i]->out_action == curr_bottom_pos)
this->labels[index]->setText("<" + this->get_string_option(i) + ">");
else
this->labels[index]->setText(this->get_string_option(i));
break;
}
}
this->base_prepare(menu_scaling_factor, view_size_x, view_size_y);
}
void RelativePositionMenu::base_prepare(float menu_scaling_factor, int view_size_x, int view_size_y) {
const float base_height = (7 * BASE_PIXEL_FONT_HEIGHT * 11) / 9;
int max_width = (view_size_x * 9) / 10;
int max_height = (view_size_y * 9) / 10;
float max_width_corresponding_height = (max_width * this->width_divisor_menu * this->max_width_slack) / this->width_factor_menu;
float max_scaling_factor = max_height / base_height;
if(max_width_corresponding_height < max_height)
max_scaling_factor = max_width_corresponding_height / base_height;
float final_menu_scaling_factor = (menu_scaling_factor * this->base_height_factor_menu) / this->base_height_divisor_menu;
if(menu_scaling_factor > max_scaling_factor)
menu_scaling_factor = max_scaling_factor;
if(final_menu_scaling_factor > max_scaling_factor)
final_menu_scaling_factor = max_scaling_factor;
if(menu_scaling_factor < this->min_text_size)
menu_scaling_factor = this->min_text_size;
if(final_menu_scaling_factor < this->min_text_size)
final_menu_scaling_factor = this->min_text_size;
int num_elements_text_scaling_factor = this->num_vertical_slices;
if(num_elements_text_scaling_factor < this->min_elements_text_scaling_factor)
num_elements_text_scaling_factor = this->min_elements_text_scaling_factor;
float text_scaling_factor = (menu_scaling_factor * this->num_vertical_slices) / num_elements_text_scaling_factor;
this->future_data.menu_height = base_height * final_menu_scaling_factor;
this->future_data.menu_width = (this->future_data.menu_height * this->width_factor_menu) / this->width_divisor_menu;
if(this->future_data.menu_width > max_width)
this->future_data.menu_width = max_width;
this->future_data.pos_x = (view_size_x - this->future_data.menu_width) / 2;
this->future_data.pos_y = (view_size_y - this->future_data.menu_height) / 2;
int slice_y_size = this->future_data.menu_height / this->num_vertical_slices;
int slice_x_size = 3;
int num_rendered_y = 0;
int top_divisor = 6;
this->prepare_text_slices(0, 6, 0, this->num_vertical_slices, this->back_x_id, text_scaling_factor);
this->prepare_text_slices(0, 1, 0, this->num_vertical_slices, this->title_id, text_scaling_factor);
for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) {
int index = i + this->elements_start_id;
this->prepare_text_slices(pollable_options[i]->position_x, 3, pollable_options[i]->position_y + (1 * pollable_options[i]->multiplier_y), this->num_vertical_slices * pollable_options[i]->multiplier_y, index, text_scaling_factor * pollable_options[i]->text_factor_multiplier);
}
this->loaded_data = this->future_data;
}

View File

@ -29,6 +29,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp
this->rotation_menu = new RotationMenu(this->font_load_success, this->text_font);
this->audio_menu = new AudioMenu(this->font_load_success, this->text_font);
this->bfi_menu = new BFIMenu(this->font_load_success, this->text_font);
this->relpos_menu = new RelativePositionMenu(this->font_load_success, this->text_font);
this->in_tex.create(IN_VIDEO_WIDTH, IN_VIDEO_HEIGHT);
this->m_in_rect_top.setTexture(&this->in_tex);
this->m_in_rect_bot.setTexture(&this->in_tex);
@ -63,6 +64,7 @@ WindowScreen::~WindowScreen() {
delete this->rotation_menu;
delete this->audio_menu;
delete this->bfi_menu;
delete this->relpos_menu;
}
void WindowScreen::build() {
@ -248,6 +250,15 @@ void WindowScreen::bfi_change() {
this->print_notification_on_off("BFI", this->m_info.bfi);
}
void WindowScreen::bottom_pos_change(int new_bottom_pos) {
BottomRelativePosition cast_new_bottom_pos = static_cast<BottomRelativePosition>(new_bottom_pos % BottomRelativePosition::BOT_REL_POS_END);
if(cast_new_bottom_pos != this->m_info.bottom_pos) {
this->m_info.bottom_pos = cast_new_bottom_pos;
this->prepare_size_ratios(false, false);
this->future_operations.call_screen_settings_update = true;
}
}
bool WindowScreen::common_poll(SFEvent &event_data) {
bool consumed = true;
switch(event_data.type) {
@ -433,6 +444,11 @@ void WindowScreen::setup_licenses_menu() {
}
void WindowScreen::setup_relative_pos_menu() {
if(this->curr_menu != RELATIVE_POS_MENU_TYPE) {
this->curr_menu = RELATIVE_POS_MENU_TYPE;
this->relpos_menu->reset_data();
this->relpos_menu->insert_data();
}
}
bool WindowScreen::no_menu_poll(SFEvent &event_data) {
@ -488,7 +504,6 @@ bool WindowScreen::no_menu_poll(SFEvent &event_data) {
bool WindowScreen::main_poll(SFEvent &event_data) {
bool consumed = true;
bool done = false;
switch(event_data.type) {
case sf::Event::TextEntered:
switch(event_data.unicode) {
@ -509,9 +524,7 @@ bool WindowScreen::main_poll(SFEvent &event_data) {
break;
case 't':
this->m_info.bottom_pos = static_cast<BottomRelativePosition>((this->m_info.bottom_pos + 1) % (BottomRelativePosition::BOT_REL_POS_END));
this->prepare_size_ratios(false, false);
this->future_operations.call_screen_settings_update = true;
this->bottom_pos_change(this->m_info.bottom_pos + 1);
break;
case '6':
@ -652,12 +665,15 @@ void WindowScreen::poll() {
this->m_info.show_mouse = false;
}
this->poll_window();
bool done = false;
while(!events_queue.empty()) {
if(done)
return;
SFEvent event_data = events_queue.front();
events_queue.pop();
if(this->common_poll(event_data)) {
if(this->close_capture())
return;
done = true;
continue;
}
if(this->loaded_menu != CONNECT_MENU_TYPE) {
@ -672,7 +688,7 @@ void WindowScreen::poll() {
case CONNECT_MENU_TYPE:
if(this->connection_menu->poll(event_data)) {
if(this->check_connection_menu_result() != CONNECTION_MENU_NO_ACTION)
return;
done = true;
continue;
}
break;
@ -684,40 +700,52 @@ void WindowScreen::poll() {
break;
case MAIN_MENU_CLOSE_MENU:
this->curr_menu = DEFAULT_MENU_TYPE;
return;
done = true;
break;
case MAIN_MENU_QUIT_APPLICATION:
this->m_prepare_quit = true;
this->curr_menu = DEFAULT_MENU_TYPE;
return;
done = true;
break;
case MAIN_MENU_FULLSCREEN:
this->fullscreen_change();
return;
done = true;
break;
case MAIN_MENU_SPLIT:
this->split_change();
return;
done = true;
break;
case MAIN_MENU_VIDEO_SETTINGS:
this->setup_video_menu();
return;
done = true;
break;
case MAIN_MENU_AUDIO_SETTINGS:
this->setup_audio_menu();
return;
done = true;
break;
case MAIN_MENU_LOAD_PROFILES:
this->setup_load_menu();
return;
done = true;
break;
case MAIN_MENU_SAVE_PROFILES:
this->setup_save_menu();
return;
done = true;
break;
case MAIN_MENU_STATUS:
this->setup_status_menu();
return;
done = true;
break;
case MAIN_MENU_LICENSES:
this->setup_licenses_menu();
return;
done = true;
break;
case MAIN_MENU_EXTRA_SETTINGS:
this->setup_extra_menu();
return;
done = true;
break;
case MAIN_MENU_SHUTDOWN:
return;
done = true;
break;
default:
break;
}
@ -730,7 +758,8 @@ void WindowScreen::poll() {
switch(this->audio_menu->selected_index) {
case AUDIO_MENU_BACK:
this->setup_main_menu();
return;
done = true;
break;
case AUDIO_MENU_NO_ACTION:
break;
case AUDIO_MENU_VOLUME_DEC:
@ -757,7 +786,8 @@ void WindowScreen::poll() {
switch(this->video_menu->selected_index) {
case VIDEO_MENU_BACK:
this->setup_main_menu();
return;
done = true;
break;
case VIDEO_MENU_VSYNC:
this->vsync_change();
break;
@ -772,16 +802,20 @@ void WindowScreen::poll() {
break;
case VIDEO_MENU_CROPPING:
this->setup_crop_menu();
return;
done = true;
break;
case VIDEO_MENU_TOP_PAR:
this->setup_par_menu(true);
return;
done = true;
break;
case VIDEO_MENU_BOT_PAR:
this->setup_par_menu(false);
return;
done = true;
break;
case VIDEO_MENU_ONE_PAR:
this->setup_par_menu(this->m_stype == ScreenType::TOP);
return;
done = true;
break;
case VIDEO_MENU_MENU_SCALING_DEC:
this->menu_scaling_change(false);
break;
@ -820,19 +854,24 @@ void WindowScreen::poll() {
break;
case VIDEO_MENU_ROTATION_SETTINGS:
this->setup_rotation_menu();
return;
done = true;
break;
case VIDEO_MENU_OFFSET_SETTINGS:
this->setup_offset_menu();
return;
done = true;
break;
case VIDEO_MENU_BFI_SETTINGS:
this->setup_bfi_menu();
return;
done = true;
break;
case VIDEO_MENU_RESOLUTION_SETTINGS:
this->setup_resolution_menu();
return;
done = true;
break;
case VIDEO_MENU_BOTTOM_SCREEN_POS:
this->setup_relative_pos_menu();
return;
done = true;
break;
default:
break;
}
@ -844,7 +883,8 @@ void WindowScreen::poll() {
switch(this->crop_menu->selected_index) {
case CROP_MENU_BACK:
this->setup_video_menu();
return;
done = true;
break;
case CROP_MENU_NO_ACTION:
break;
default:
@ -860,7 +900,8 @@ void WindowScreen::poll() {
switch(this->par_menu->selected_index) {
case PAR_MENU_BACK:
this->setup_video_menu();
return;
done = true;
break;
case PAR_MENU_NO_ACTION:
break;
default:
@ -876,7 +917,8 @@ void WindowScreen::poll() {
switch(this->par_menu->selected_index) {
case PAR_MENU_BACK:
this->setup_video_menu();
return;
done = true;
break;
case PAR_MENU_NO_ACTION:
break;
default:
@ -892,7 +934,8 @@ void WindowScreen::poll() {
switch(this->rotation_menu->selected_index) {
case ROTATION_MENU_BACK:
this->setup_video_menu();
return;
done = true;
break;
case ROTATION_MENU_NO_ACTION:
break;
case ROTATION_MENU_TOP_ROTATION_DEC:
@ -927,7 +970,8 @@ void WindowScreen::poll() {
switch(this->offset_menu->selected_index) {
case OFFSET_MENU_BACK:
this->setup_video_menu();
return;
done = true;
break;
case OFFSET_MENU_NO_ACTION:
break;
case OFFSET_MENU_SMALL_OFFSET_DEC:
@ -966,7 +1010,8 @@ void WindowScreen::poll() {
switch(this->bfi_menu->selected_index) {
case BFI_MENU_BACK:
this->setup_video_menu();
return;
done = true;
break;
case BFI_MENU_NO_ACTION:
break;
case BFI_MENU_TOGGLE:
@ -1001,6 +1046,25 @@ void WindowScreen::poll() {
continue;
}
break;
case RELATIVE_POS_MENU_TYPE:
if(this->relpos_menu->poll(event_data)) {
switch(this->relpos_menu->selected_index) {
case REL_POS_MENU_BACK:
this->setup_video_menu();
done = true;
break;
case REL_POS_MENU_NO_ACTION:
break;
case REL_POS_MENU_CONFIRM:
this->bottom_pos_change(this->relpos_menu->selected_confirm_value);
break;
default:
break;
}
this->relpos_menu->reset_output_option();
continue;
}
break;
default:
break;
}
@ -1117,6 +1181,9 @@ void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) {
case BFI_MENU_TYPE:
this->bfi_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y, &this->loaded_info);
break;
case RELATIVE_POS_MENU_TYPE:
this->relpos_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y, this->loaded_info.bottom_pos);
break;
default:
break;
}
@ -1450,6 +1517,9 @@ void WindowScreen::display_data_to_window(bool actually_draw, bool is_debug) {
case BFI_MENU_TYPE:
this->bfi_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win);
break;
case RELATIVE_POS_MENU_TYPE:
this->relpos_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win);
break;
default:
break;
}