diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b60684..3026549 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 source/Menus/RelativePositionMenu.cpp source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.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 source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.cpp source/Menus/ExtraSettingsMenu.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}) diff --git a/include/Menus/ExtraSettingsMenu.hpp b/include/Menus/ExtraSettingsMenu.hpp new file mode 100755 index 0000000..52b70ae --- /dev/null +++ b/include/Menus/ExtraSettingsMenu.hpp @@ -0,0 +1,36 @@ +#ifndef __EXTRASETTINGSMENU_HPP +#define __EXTRASETTINGSMENU_HPP + +#include "OptionSelectionMenu.hpp" +#include + +#include "TextRectangle.hpp" +#include "sfml_gfx_structs.hpp" +#include "display_structs.hpp" + +enum ExtraSettingsMenuOutAction{ + EXTRA_SETTINGS_MENU_NO_ACTION, + EXTRA_SETTINGS_MENU_BACK, + EXTRA_SETTINGS_MENU_QUIT_APPLICATION, + EXTRA_SETTINGS_MENU_FULLSCREEN, + EXTRA_SETTINGS_MENU_SPLIT, +}; + +class ExtraSettingsMenu : public OptionSelectionMenu { +public: + ExtraSettingsMenu(bool font_load_success, sf::Font &text_font); + ~ExtraSettingsMenu(); + void prepare(float scaling_factor, int view_size_x, int view_size_y); + void insert_data(ScreenType s_type, bool is_fullscreen); + ExtraSettingsMenuOutAction selected_index = ExtraSettingsMenuOutAction::EXTRA_SETTINGS_MENU_NO_ACTION; + void reset_output_option(); +protected: + void set_output_option(int index, int action); + int get_num_options(); + std::string get_string_option(int index, int action); + void class_setup(); +private: + int *options_indexes; + int num_enabled_options; +}; +#endif diff --git a/include/frontend.hpp b/include/frontend.hpp index 0c0d7c2..b23d024 100755 --- a/include/frontend.hpp +++ b/include/frontend.hpp @@ -24,6 +24,7 @@ #include "RelativePositionMenu.hpp" #include "ResolutionMenu.hpp" #include "FileConfigMenu.hpp" +#include "ExtraSettingsMenu.hpp" #include "display_structs.hpp" struct HeldTime { @@ -109,6 +110,7 @@ private: RelativePositionMenu *relpos_menu; ResolutionMenu *resolution_menu; FileConfigMenu *fileconfig_menu; + ExtraSettingsMenu *extra_menu; std::vector possible_crops; std::vector possible_pars; std::vector possible_resolutions; diff --git a/source/Menus/ExtraSettingsMenu.cpp b/source/Menus/ExtraSettingsMenu.cpp new file mode 100755 index 0000000..228dfba --- /dev/null +++ b/source/Menus/ExtraSettingsMenu.cpp @@ -0,0 +1,122 @@ +#include "ExtraSettingsMenu.hpp" + +#define NUM_TOTAL_MENU_OPTIONS (sizeof(pollable_options)/sizeof(pollable_options[0])) + +struct ExtraSettingsMenuOptionInfo { + const std::string base_name; + const bool active_fullscreen; + const bool active_windowed_screen; + const bool active_joint_screen; + const bool active_top_screen; + const bool active_bottom_screen; + const ExtraSettingsMenuOutAction out_action; +}; + +static const ExtraSettingsMenuOptionInfo windowed_option = { +.base_name = "Windowed Mode", +.active_fullscreen = true, .active_windowed_screen = false, +.active_joint_screen = true, .active_top_screen = true, .active_bottom_screen = true, +.out_action = EXTRA_SETTINGS_MENU_FULLSCREEN}; + +static const ExtraSettingsMenuOptionInfo fullscreen_option = { +.base_name = "Fullscreen Mode", +.active_fullscreen = false, .active_windowed_screen = true, +.active_joint_screen = true, .active_top_screen = true, .active_bottom_screen = true, +.out_action = EXTRA_SETTINGS_MENU_FULLSCREEN}; + +static const ExtraSettingsMenuOptionInfo join_screens_option = { +.base_name = "Join Screens", +.active_fullscreen = true, .active_windowed_screen = true, +.active_joint_screen = false, .active_top_screen = true, .active_bottom_screen = true, +.out_action = EXTRA_SETTINGS_MENU_SPLIT}; + +static const ExtraSettingsMenuOptionInfo split_screens_option = { +.base_name = "Split Screens", +.active_fullscreen = true, .active_windowed_screen = true, +.active_joint_screen = true, .active_top_screen = false, .active_bottom_screen = false, +.out_action = EXTRA_SETTINGS_MENU_SPLIT}; + +static const ExtraSettingsMenuOptionInfo quit_option = { +.base_name = "Quit Application", +.active_fullscreen = true, .active_windowed_screen = true, +.active_joint_screen = true, .active_top_screen = true, .active_bottom_screen = true, +.out_action = EXTRA_SETTINGS_MENU_QUIT_APPLICATION}; + +static const ExtraSettingsMenuOptionInfo* pollable_options[] = { +&windowed_option, +&fullscreen_option, +&join_screens_option, +&split_screens_option, +&quit_option, +}; + +ExtraSettingsMenu::ExtraSettingsMenu(bool font_load_success, sf::Font &text_font) : OptionSelectionMenu(){ + this->options_indexes = new int[NUM_TOTAL_MENU_OPTIONS]; + this->initialize(font_load_success, text_font); + this->num_enabled_options = 0; +} + +ExtraSettingsMenu::~ExtraSettingsMenu() { + delete []this->options_indexes; +} + +void ExtraSettingsMenu::class_setup() { + this->num_options_per_screen = 5; + this->min_elements_text_scaling_factor = num_options_per_screen + 2; + 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 = "Extra Settings"; + this->show_back_x = true; + this->show_x = true; + this->show_title = true; +} + +void ExtraSettingsMenu::insert_data(ScreenType s_type, bool is_fullscreen) { + this->num_enabled_options = 0; + for(int i = 0; i < NUM_TOTAL_MENU_OPTIONS; i++) { + bool valid = true; + if(is_fullscreen) + valid = valid && pollable_options[i]->active_fullscreen; + else + valid = valid && pollable_options[i]->active_windowed_screen; + if(s_type == ScreenType::TOP) + valid = valid && pollable_options[i]->active_top_screen; + else if(s_type == ScreenType::BOTTOM) + valid = valid && pollable_options[i]->active_bottom_screen; + else + valid = valid && pollable_options[i]->active_joint_screen; + if(valid) { + this->options_indexes[this->num_enabled_options] = i; + this->num_enabled_options++; + } + } + this->prepare_options(); +} + +void ExtraSettingsMenu::reset_output_option() { + this->selected_index = ExtraSettingsMenuOutAction::EXTRA_SETTINGS_MENU_NO_ACTION; +} + +void ExtraSettingsMenu::set_output_option(int index, int action) { + if(index == BACK_X_OUTPUT_OPTION) + this->selected_index = EXTRA_SETTINGS_MENU_BACK; + else + this->selected_index = pollable_options[this->options_indexes[index]]->out_action; +} + +int ExtraSettingsMenu::get_num_options() { + return this->num_enabled_options; +} + +std::string ExtraSettingsMenu::get_string_option(int index, int action) { + return pollable_options[this->options_indexes[index]]->base_name; +} + +void ExtraSettingsMenu::prepare(float menu_scaling_factor, int view_size_x, int view_size_y) { + this->base_prepare(menu_scaling_factor, view_size_x, view_size_y); +} diff --git a/source/WindowScreen.cpp b/source/WindowScreen.cpp index 84637ac..7d64fbd 100755 --- a/source/WindowScreen.cpp +++ b/source/WindowScreen.cpp @@ -32,6 +32,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp this->relpos_menu = new RelativePositionMenu(this->font_load_success, this->text_font); this->resolution_menu = new ResolutionMenu(this->font_load_success, this->text_font); this->fileconfig_menu = new FileConfigMenu(this->font_load_success, this->text_font); + this->extra_menu = new ExtraSettingsMenu(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); @@ -70,6 +71,7 @@ WindowScreen::~WindowScreen() { delete this->relpos_menu; delete this->resolution_menu; delete this->fileconfig_menu; + delete this->extra_menu; } void WindowScreen::build() { @@ -506,6 +508,12 @@ void WindowScreen::setup_resolution_menu(bool reset_data) { } void WindowScreen::setup_extra_menu(bool reset_data) { + if(this->curr_menu != EXTRA_MENU_TYPE) { + this->curr_menu = EXTRA_MENU_TYPE; + if(reset_data) + this->extra_menu->reset_data(); + this->extra_menu->insert_data(this->m_stype, this->m_info.is_fullscreen); + } } void WindowScreen::setup_status_menu(bool reset_data) { @@ -1213,6 +1221,35 @@ void WindowScreen::poll() { continue; } break; + case EXTRA_MENU_TYPE: + if(this->extra_menu->poll(event_data)) { + switch(this->extra_menu->selected_index) { + case EXTRA_SETTINGS_MENU_BACK: + this->setup_main_menu(); + done = true; + break; + case EXTRA_SETTINGS_MENU_NO_ACTION: + break; + case EXTRA_SETTINGS_MENU_QUIT_APPLICATION: + this->m_prepare_quit = true; + this->curr_menu = DEFAULT_MENU_TYPE; + done = true; + break; + case EXTRA_SETTINGS_MENU_FULLSCREEN: + this->fullscreen_change(); + done = true; + break; + case EXTRA_SETTINGS_MENU_SPLIT: + this->split_change(); + done = true; + break; + default: + break; + } + this->extra_menu->reset_output_option(); + continue; + } + break; default: break; } @@ -1341,6 +1378,9 @@ void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) { case LOAD_MENU_TYPE: this->fileconfig_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y); break; + case EXTRA_MENU_TYPE: + this->extra_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y); + break; default: break; } @@ -1746,6 +1786,9 @@ void WindowScreen::display_data_to_window(bool actually_draw, bool is_debug) { case LOAD_MENU_TYPE: this->fileconfig_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win); break; + case EXTRA_MENU_TYPE: + this->extra_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win); + break; default: break; }