diff --git a/CMakeLists.txt b/CMakeLists.txt index c9e8971..6b60684 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 ${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 ${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/FileConfigMenu.hpp b/include/Menus/FileConfigMenu.hpp new file mode 100755 index 0000000..f222c20 --- /dev/null +++ b/include/Menus/FileConfigMenu.hpp @@ -0,0 +1,37 @@ +#ifndef __FILECONFIGMENU_HPP +#define __FILECONFIGMENU_HPP + +#include "OptionSelectionMenu.hpp" +#include + +#include "TextRectangle.hpp" +#include "sfml_gfx_structs.hpp" +#include "utils.hpp" + +#define FILECONFIG_MENU_NO_ACTION -20 +#define FILECONFIG_MENU_BACK -21 + +struct FileData { + int index; + std::string name; +}; + +class FileConfigMenu : public OptionSelectionMenu { +public: + FileConfigMenu(bool font_load_success, sf::Font &text_font); + ~FileConfigMenu(); + void setup_title(std::string added_name); + void prepare(float scaling_factor, int view_size_x, int view_size_y); + void insert_data(std::vector* possible_files); + int selected_index = FILECONFIG_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: + const std::string base_name = "Profiles"; + std::vector* possible_files; +}; +#endif diff --git a/include/frontend.hpp b/include/frontend.hpp index db1d37e..0c0d7c2 100755 --- a/include/frontend.hpp +++ b/include/frontend.hpp @@ -23,6 +23,7 @@ #include "BFIMenu.hpp" #include "RelativePositionMenu.hpp" #include "ResolutionMenu.hpp" +#include "FileConfigMenu.hpp" #include "display_structs.hpp" struct HeldTime { @@ -46,9 +47,10 @@ public: void end(); void after_thread_join(); void draw(double frame_time, VideoOutputData* out_buf); - void setup_connection_menu(DevicesList *devices_list); + void setup_connection_menu(DevicesList *devices_list, bool reset_data = true); int check_connection_menu_result(); void end_connection_menu(); + void update_save_menu(); void print_notification(std::string text, TextKind kind = TEXT_KIND_NORMAL); int load_data(); @@ -106,9 +108,11 @@ private: BFIMenu *bfi_menu; RelativePositionMenu *relpos_menu; ResolutionMenu *resolution_menu; + FileConfigMenu *fileconfig_menu; std::vector possible_crops; std::vector possible_pars; std::vector possible_resolutions; + std::vector possible_files; sf::Texture in_tex; @@ -190,21 +194,20 @@ private: sf::Vector2f getShownScreenSize(bool is_top, int &crop_kind); void crop(); void setWinSize(bool is_main_thread); - void setup_main_menu(); - void setup_video_menu(); - void setup_crop_menu(); - void setup_par_menu(bool is_top); - void setup_offset_menu(); - void setup_rotation_menu(); - void setup_audio_menu(); - void setup_bfi_menu(); - void setup_load_menu(); - void setup_save_menu(); - void setup_resolution_menu(); - void setup_extra_menu(); - void setup_status_menu(); - void setup_licenses_menu(); - void setup_relative_pos_menu(); + void setup_main_menu(bool reset_data = true); + void setup_video_menu(bool reset_data = true); + void setup_crop_menu(bool reset_data = true); + void setup_par_menu(bool is_top, bool reset_data = true); + void setup_offset_menu(bool reset_data = true); + void setup_rotation_menu(bool reset_data = true); + void setup_audio_menu(bool reset_data = true); + void setup_bfi_menu(bool reset_data = true); + void setup_fileconfig_menu(bool is_save, bool reset_data = true); + void setup_resolution_menu(bool reset_data = true); + void setup_extra_menu(bool reset_data = true); + void setup_status_menu(bool reset_data = true); + void setup_licenses_menu(bool reset_data = true); + void setup_relative_pos_menu(bool reset_data = true); void update_connection(); }; diff --git a/include/utils.hpp b/include/utils.hpp index 0a0eee9..ea27ab3 100755 --- a/include/utils.hpp +++ b/include/utils.hpp @@ -22,6 +22,7 @@ #define STARTUP_FILE_INDEX -1 #define SIMPLE_RESET_DATA_INDEX -2 +#define CREATE_NEW_FILE_INDEX -3 std::string LayoutNameGenerator(int index); std::string LayoutPathGenerator(int index); diff --git a/source/Menus/FileConfigMenu.cpp b/source/Menus/FileConfigMenu.cpp new file mode 100755 index 0000000..d9c6413 --- /dev/null +++ b/source/Menus/FileConfigMenu.cpp @@ -0,0 +1,61 @@ +#include "FileConfigMenu.hpp" + +FileConfigMenu::FileConfigMenu(bool font_load_success, sf::Font &text_font) : OptionSelectionMenu(){ + this->initialize(font_load_success, text_font); +} + +FileConfigMenu::~FileConfigMenu() { +} + +void FileConfigMenu::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 = this->base_name; + this->show_back_x = true; + this->show_x = false; + this->show_title = true; +} + +void FileConfigMenu::setup_title(std::string added_name) { + this->title = added_name + (added_name != "" ? " " : "") + this->base_name; +} + +void FileConfigMenu::insert_data(std::vector* possible_files) { + this->possible_files = possible_files; + this->prepare_options(); +} + +void FileConfigMenu::reset_output_option() { + this->selected_index = FILECONFIG_MENU_NO_ACTION; +} + +void FileConfigMenu::set_output_option(int index, int action) { + if(index == BACK_X_OUTPUT_OPTION) + this->selected_index = FILECONFIG_MENU_BACK; + else + this->selected_index = (*this->possible_files)[index].index; +} + +int FileConfigMenu::get_num_options() { + return (*this->possible_files).size(); +} + +std::string FileConfigMenu::get_string_option(int index, int action) { + FileData file_data = (*this->possible_files)[index]; + if(file_data.index == CREATE_NEW_FILE_INDEX) + return "Create new..."; + if(file_data.index == STARTUP_FILE_INDEX) + return "Initial Profile"; + return "Profile " + file_data.name; +} + +void FileConfigMenu::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/TextRectangle.cpp b/source/TextRectangle.cpp index d0db9c3..b6b8fcd 100755 --- a/source/TextRectangle.cpp +++ b/source/TextRectangle.cpp @@ -47,7 +47,7 @@ void TextRectangle::setPosition(int pos_x, int pos_y) { } bool TextRectangle::isCoordInRectangle(int coord_x, int coord_y) { - if(!(font_load_success && this->future_data.show_text && (!this->is_done_showing_text))) + if(!(font_load_success && this->future_data.show_text)) return false; if(coord_x < this->future_data.pos_x) return false; @@ -73,7 +73,7 @@ void TextRectangle::setProportionalBox(bool proportional_box) { } void TextRectangle::prepareRenderText() { - if(this->loaded_data.proportional_box) { + if(this->future_data.proportional_box) { this->future_data.width = this->loaded_data.width; this->future_data.height = this->loaded_data.height; } diff --git a/source/WindowScreen.cpp b/source/WindowScreen.cpp index ee57651..84637ac 100755 --- a/source/WindowScreen.cpp +++ b/source/WindowScreen.cpp @@ -31,6 +31,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp 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->resolution_menu = new ResolutionMenu(this->font_load_success, this->text_font); + this->fileconfig_menu = new FileConfigMenu(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); @@ -53,6 +54,7 @@ WindowScreen::WindowScreen(ScreenType stype, CaptureStatus* capture_status, Disp } WindowScreen::~WindowScreen() { + this->possible_files.clear(); this->possible_resolutions.clear(); delete this->saved_buf; delete this->notification; @@ -67,6 +69,7 @@ WindowScreen::~WindowScreen() { delete this->bfi_menu; delete this->relpos_menu; delete this->resolution_menu; + delete this->fileconfig_menu; } void WindowScreen::build() { @@ -355,37 +358,41 @@ bool WindowScreen::common_poll(SFEvent &event_data) { return consumed; } -void WindowScreen::setup_main_menu() { +void WindowScreen::setup_main_menu(bool reset_data) { if(this->curr_menu != MAIN_MENU_TYPE) { this->curr_menu = MAIN_MENU_TYPE; - this->main_menu->reset_data(); + if(reset_data) + this->main_menu->reset_data(); this->main_menu->insert_data(this->m_stype, this->m_info.is_fullscreen); } } -void WindowScreen::setup_video_menu() { +void WindowScreen::setup_video_menu(bool reset_data) { if(this->curr_menu != VIDEO_MENU_TYPE) { this->curr_menu = VIDEO_MENU_TYPE; - this->video_menu->reset_data(); + if(reset_data) + this->video_menu->reset_data(); this->video_menu->insert_data(this->m_stype, this->m_info.is_fullscreen); } } -void WindowScreen::setup_crop_menu() { +void WindowScreen::setup_crop_menu(bool reset_data) { if(this->curr_menu != CROP_MENU_TYPE) { this->curr_menu = CROP_MENU_TYPE; - this->crop_menu->reset_data(); + if(reset_data) + this->crop_menu->reset_data(); this->crop_menu->insert_data(&this->possible_crops); } } -void WindowScreen::setup_par_menu(bool is_top) { +void WindowScreen::setup_par_menu(bool is_top, bool reset_data) { CurrMenuType wanted_type = TOP_PAR_MENU_TYPE; if(!is_top) wanted_type = BOTTOM_PAR_MENU_TYPE; if(this->curr_menu != wanted_type) { this->curr_menu = wanted_type; - this->par_menu->reset_data(); + if(reset_data) + this->par_menu->reset_data(); std::string title_piece = ""; if((is_top) && (this->m_stype == ScreenType::JOINT)) title_piece = "Top"; @@ -396,45 +403,89 @@ void WindowScreen::setup_par_menu(bool is_top) { } } -void WindowScreen::setup_offset_menu() { +void WindowScreen::setup_offset_menu(bool reset_data) { if(this->curr_menu != OFFSET_MENU_TYPE) { this->curr_menu = OFFSET_MENU_TYPE; - this->offset_menu->reset_data(); + if(reset_data) + this->offset_menu->reset_data(); this->offset_menu->insert_data(); } } -void WindowScreen::setup_rotation_menu() { +void WindowScreen::setup_rotation_menu(bool reset_data) { if(this->curr_menu != ROTATION_MENU_TYPE) { this->curr_menu = ROTATION_MENU_TYPE; - this->rotation_menu->reset_data(); + if(reset_data) + this->rotation_menu->reset_data(); this->rotation_menu->insert_data(); } } -void WindowScreen::setup_audio_menu() { +void WindowScreen::setup_audio_menu(bool reset_data) { if(this->curr_menu != AUDIO_MENU_TYPE) { this->curr_menu = AUDIO_MENU_TYPE; - this->audio_menu->reset_data(); + if(reset_data) + this->audio_menu->reset_data(); this->audio_menu->insert_data(); } } -void WindowScreen::setup_bfi_menu() { +void WindowScreen::setup_bfi_menu(bool reset_data) { if(this->curr_menu != BFI_MENU_TYPE) { this->curr_menu = BFI_MENU_TYPE; - this->bfi_menu->reset_data(); + if(reset_data) + this->bfi_menu->reset_data(); this->bfi_menu->insert_data(); } } -void WindowScreen::setup_load_menu() { +void WindowScreen::setup_fileconfig_menu(bool is_save, bool reset_data) { + CurrMenuType wanted_type = LOAD_MENU_TYPE; + if(is_save) + wanted_type = SAVE_MENU_TYPE; + if(this->curr_menu != wanted_type) { + this->possible_files.clear(); + FileData file_data; + bool success = false; + if(is_save) { + file_data.index = CREATE_NEW_FILE_INDEX; + file_data.name = ""; + this->possible_files.push_back(file_data); + } + file_data.index = STARTUP_FILE_INDEX; + file_data.name = load_layout_name(file_data.index, success); + this->possible_files.push_back(file_data); + for(int i = 1; i <= 4; i++) { + file_data.index = i; + file_data.name = load_layout_name(file_data.index, success); + this->possible_files.push_back(file_data); + } + int first_free; + bool failed = false; + for(first_free = 5; first_free <= 100; first_free++) { + file_data.index = first_free; + file_data.name = load_layout_name(file_data.index, success); + if(!success) { + failed = true; + break; + } + this->possible_files.push_back(file_data); + } + if(is_save && (!failed)) { + this->possible_files.erase(this->possible_files.begin()); + } + this->curr_menu = wanted_type; + if(reset_data) + this->fileconfig_menu->reset_data(); + std::string title_piece = "Load"; + if(is_save) + title_piece = "Save"; + this->fileconfig_menu->setup_title(title_piece); + this->fileconfig_menu->insert_data(&this->possible_files); + } } -void WindowScreen::setup_save_menu() { -} - -void WindowScreen::setup_resolution_menu() { +void WindowScreen::setup_resolution_menu(bool reset_data) { if(this->curr_menu != RESOLUTION_MENU_TYPE) { this->possible_resolutions.clear(); std::vector modes = sf::VideoMode::getFullscreenModes(); @@ -445,7 +496,8 @@ void WindowScreen::setup_resolution_menu() { this->possible_resolutions.push_back(modes[i]); if(this->possible_resolutions.size() > 0) { this->curr_menu = RESOLUTION_MENU_TYPE; - this->resolution_menu->reset_data(); + if(reset_data) + this->resolution_menu->reset_data(); this->resolution_menu->insert_data(&this->possible_resolutions); } else @@ -453,23 +505,31 @@ void WindowScreen::setup_resolution_menu() { } } -void WindowScreen::setup_extra_menu() { +void WindowScreen::setup_extra_menu(bool reset_data) { } -void WindowScreen::setup_status_menu() { +void WindowScreen::setup_status_menu(bool reset_data) { } -void WindowScreen::setup_licenses_menu() { +void WindowScreen::setup_licenses_menu(bool reset_data) { } -void WindowScreen::setup_relative_pos_menu() { +void WindowScreen::setup_relative_pos_menu(bool reset_data) { if(this->curr_menu != RELATIVE_POS_MENU_TYPE) { this->curr_menu = RELATIVE_POS_MENU_TYPE; - this->relpos_menu->reset_data(); + if(reset_data) + this->relpos_menu->reset_data(); this->relpos_menu->insert_data(); } } +void WindowScreen::update_save_menu() { + if(this->curr_menu == SAVE_MENU_TYPE) { + this->curr_menu = DEFAULT_MENU_TYPE; + this->setup_fileconfig_menu(true, false); + } +} + bool WindowScreen::no_menu_poll(SFEvent &event_data) { bool consumed = true; switch(event_data.type) { @@ -752,11 +812,11 @@ void WindowScreen::poll() { done = true; break; case MAIN_MENU_LOAD_PROFILES: - this->setup_load_menu(); + this->setup_fileconfig_menu(false); done = true; break; case MAIN_MENU_SAVE_PROFILES: - this->setup_save_menu(); + this->setup_fileconfig_menu(true); done = true; break; case MAIN_MENU_STATUS: @@ -809,6 +869,46 @@ void WindowScreen::poll() { continue; } break; + case SAVE_MENU_TYPE: + if(this->fileconfig_menu->poll(event_data)) { + switch(this->fileconfig_menu->selected_index) { + case FILECONFIG_MENU_BACK: + this->setup_main_menu(); + done = true; + break; + case FILECONFIG_MENU_NO_ACTION: + break; + case CREATE_NEW_FILE_INDEX: + this->m_prepare_save = this->possible_files[this->possible_files.size() - 1].index + 1; + done = true; + break; + default: + this->m_prepare_save = this->fileconfig_menu->selected_index; + done = true; + break; + } + this->fileconfig_menu->reset_output_option(); + continue; + } + break; + case LOAD_MENU_TYPE: + if(this->fileconfig_menu->poll(event_data)) { + switch(this->fileconfig_menu->selected_index) { + case FILECONFIG_MENU_BACK: + this->setup_main_menu(); + done = true; + break; + case FILECONFIG_MENU_NO_ACTION: + break; + default: + this->m_prepare_load = this->fileconfig_menu->selected_index; + done = true; + break; + } + this->fileconfig_menu->reset_output_option(); + continue; + } + break; case VIDEO_MENU_TYPE: if(this->video_menu->poll(event_data)) { switch(this->video_menu->selected_index) { @@ -1235,6 +1335,12 @@ void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) { case RESOLUTION_MENU_TYPE: this->resolution_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y, &this->curr_desk_mode); break; + case SAVE_MENU_TYPE: + this->fileconfig_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y); + break; + case LOAD_MENU_TYPE: + this->fileconfig_menu->prepare(this->loaded_info.menu_scaling_factor, view_size_x, view_size_y); + break; default: break; } @@ -1251,9 +1357,10 @@ void WindowScreen::draw(double frame_time, VideoOutputData* out_buf) { } } -void WindowScreen::setup_connection_menu(DevicesList *devices_list) { +void WindowScreen::setup_connection_menu(DevicesList *devices_list, bool reset_data) { this->curr_menu = CONNECT_MENU_TYPE; - this->connection_menu->reset_data(); + if(reset_data) + this->connection_menu->reset_data(); this->connection_menu->insert_data(devices_list); } @@ -1633,6 +1740,12 @@ void WindowScreen::display_data_to_window(bool actually_draw, bool is_debug) { case RESOLUTION_MENU_TYPE: this->resolution_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win); break; + case SAVE_MENU_TYPE: + this->fileconfig_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win); + break; + case LOAD_MENU_TYPE: + this->fileconfig_menu->draw(this->loaded_info.menu_scaling_factor, this->m_win); + break; default: break; } @@ -1662,6 +1775,9 @@ void WindowScreen::window_render_call() { this->loaded_info.bfi_amount = 1; if(this->loaded_info.bfi_amount > (this->loaded_info.bfi_divider - 1)) this->loaded_info.bfi_amount = this->loaded_info.bfi_divider - 1; + for(int i = 0; i < (this->loaded_info.bfi_divider - this->loaded_info.bfi_amount - 1); i++) { + sf::sleep(sf::seconds(frame_time / (this->loaded_info.bfi_divider * 1.1))); + } for(int i = 0; i < this->loaded_info.bfi_amount; i++) { sf::sleep(sf::seconds(frame_time / (this->loaded_info.bfi_divider * 1.1))); this->display_data_to_window(false); diff --git a/source/cc3dsfs.cpp b/source/cc3dsfs.cpp index 05817b1..3d399fb 100755 --- a/source/cc3dsfs.cpp +++ b/source/cc3dsfs.cpp @@ -100,7 +100,7 @@ static bool load(const std::string path, const std::string name, ScreenInfo &top return true; } -static void load_layout_file(int load_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, bool skip_io) { +static void load_layout_file(int load_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, bool skip_io, bool do_print) { if(skip_io) return; @@ -120,7 +120,7 @@ static void load_layout_file(int load_index, FrontendData *frontend_data, AudioD std::string layout_name = LayoutNameGenerator(load_index); std::string layout_path = LayoutPathGenerator(load_index); bool op_success = load(layout_path, layout_name, frontend_data->top_screen->m_info, frontend_data->bot_screen->m_info, frontend_data->joint_screen->m_info, frontend_data->display_data, audio_data, out_text_data); - if((load_index != STARTUP_FILE_INDEX) && op_success) { + if(do_print && op_success) { std::string load_name = load_layout_name(load_index, name_load_success); UpdateOutText(out_text_data, "Layout loaded from: " + layout_path + layout_name, "Layout " + load_name + " loaded", TEXT_KIND_SUCCESS); } @@ -149,7 +149,7 @@ static bool save(const std::string path, const std::string name, const std::stri return true; } -static void save_layout_file(int save_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, bool skip_io) { +static void save_layout_file(int save_index, FrontendData *frontend_data, AudioData* audio_data, OutTextData &out_text_data, bool skip_io, bool do_print) { if(skip_io) return; @@ -161,7 +161,7 @@ static void save_layout_file(int save_index, FrontendData *frontend_data, AudioD std::string layout_name = LayoutNameGenerator(save_index); std::string layout_path = LayoutPathGenerator(save_index); bool op_success = save(layout_path, layout_name, save_name, frontend_data->top_screen->m_info, frontend_data->bot_screen->m_info, frontend_data->joint_screen->m_info, frontend_data->display_data, audio_data, out_text_data); - if((save_index != STARTUP_FILE_INDEX) && op_success) { + if(do_print && op_success) { UpdateOutText(out_text_data, "Layout saved to: " + layout_path + layout_name, "Layout " + save_name + " saved", TEXT_KIND_SUCCESS); } } @@ -250,7 +250,7 @@ static void mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data frontend_data.bot_screen = &bot_screen; frontend_data.joint_screen = &joint_screen; - load_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, skip_io); + load_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, skip_io, false); // Due to the risk for seizures, at the start of the program, set BFI to false! top_screen.m_info.bfi = false; bot_screen.m_info.bfi = false; @@ -341,10 +341,14 @@ static void mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data } if((load_index = top_screen.load_data()) || (load_index = bot_screen.load_data()) || (load_index = joint_screen.load_data())) - load_layout_file(load_index, &frontend_data, audio_data, out_text_data, skip_io); + load_layout_file(load_index, &frontend_data, audio_data, out_text_data, skip_io, true); - if((save_index = top_screen.save_data()) || (save_index = bot_screen.save_data()) || (save_index = joint_screen.save_data())) - save_layout_file(save_index, &frontend_data, audio_data, out_text_data, skip_io); + if((save_index = top_screen.save_data()) || (save_index = bot_screen.save_data()) || (save_index = joint_screen.save_data())) { + save_layout_file(save_index, &frontend_data, audio_data, out_text_data, skip_io, true); + top_screen.update_save_menu(); + bot_screen.update_save_menu(); + joint_screen.update_save_menu(); + } if(audio_data->has_text_to_print()) { UpdateOutText(out_text_data, "", audio_data->text_to_print(), TEXT_KIND_NORMAL); @@ -376,7 +380,7 @@ static void mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data bot_screen.after_thread_join(); joint_screen.after_thread_join(); - save_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, skip_io); + save_layout_file(STARTUP_FILE_INDEX, &frontend_data, audio_data, out_text_data, skip_io, false); if(!out_text_data.consumed) { ConsoleOutText(out_text_data.full_text);