From b944687191474f908cd5e82a52e8c05c3d8f7a11 Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Sat, 10 Apr 2021 01:00:05 -0500 Subject: [PATCH] GS: Clean up wx config code --- pcsx2/GS/Window/GSwxDialog.cpp | 809 +++++++++++---------------------- pcsx2/GS/Window/GSwxDialog.h | 129 ++++-- 2 files changed, 358 insertions(+), 580 deletions(-) diff --git a/pcsx2/GS/Window/GSwxDialog.cpp b/pcsx2/GS/Window/GSwxDialog.cpp index e4a8940d1d..5fe1bd9a40 100644 --- a/pcsx2/GS/Window/GSwxDialog.cpp +++ b/pcsx2/GS/Window/GSwxDialog.cpp @@ -59,82 +59,195 @@ namespace theApp.SetConfig(str, s[idx].value); } - void add_label(wxWindow* parent, wxSizer* sizer, const char* str, int tooltip = -1, long style = wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL, wxSizerFlags flags = wxSizerFlags().Right().DoubleBorder()) + void add_label(wxWindow* parent, wxSizer* sizer, const char* str, int tooltip = -1, long style = wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL, wxSizerFlags flags = wxSizerFlags().Centre().Right()) { auto* temp_text = new wxStaticText(parent, wxID_ANY, str, wxDefaultPosition, wxDefaultSize, style); add_tooltip(temp_text, tooltip); sizer->Add(temp_text, flags); } - - void add_combo_box(wxWindow* parent, wxSizer* sizer, wxChoice*& choice, const std::vector& s, int tooltip = -1, wxSizerFlags flags = wxSizerFlags().Expand().Left()) - { - wxArrayString temp; - add_settings_to_array_string(s, temp); - choice = new wxChoice(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, temp); - - add_tooltip(choice, tooltip); - sizer->Add(choice, flags); - } - - void add_label_and_combo_box(wxWindow* parent, wxSizer* sizer, wxChoice*& choice, const char* str, const std::vector& s, int tooltip = -1) - { - add_label(parent, sizer, str, tooltip); - add_combo_box(parent, sizer, choice, s, tooltip); - } } // namespace +GSUIElementHolder::GSUIElementHolder(wxWindow* window) + : m_window(window) +{ +} + +void GSUIElementHolder::addWithLabel(wxControl* control, UIElem::Type type, wxSizer* sizer, const char* label, const char* config_name, int tooltip, wxCheckBox* prereq, wxSizerFlags flags) +{ + add_tooltip(control, tooltip); + wxStaticText* text = new wxStaticText(m_window, wxID_ANY, label, wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); + add_tooltip(text, tooltip); + sizer->Add(text, wxSizerFlags().Centre().Right()); + sizer->Add(control, flags); + m_elems.emplace_back(type, control, config_name, prereq); +} + +wxCheckBox* GSUIElementHolder::addCheckBox(wxSizer* sizer, const char* label, const char* config_name, int tooltip, wxCheckBox* prereq) +{ + wxCheckBox* box = new wxCheckBox(m_window, wxID_ANY, label); + add_tooltip(box, tooltip); + if (sizer) + sizer->Add(box); + m_elems.emplace_back(UIElem::Type::CheckBox, box, config_name, prereq); + return box; +} + +wxChoice* GSUIElementHolder::addComboBoxAndLabel(wxSizer* sizer, const char* label, const char* config_name, const std::vector* settings, int tooltip, wxCheckBox* prereq) +{ + wxArrayString temp; + add_settings_to_array_string(*settings, temp); + wxChoice* choice = new GSwxChoice(m_window, wxID_ANY, wxDefaultPosition, wxDefaultSize, temp, settings); + addWithLabel(choice, UIElem::Type::Choice, sizer, label, config_name, tooltip, prereq); + return choice; +} + +wxSpinCtrl* GSUIElementHolder::addSpin(wxSizer* sizer, const char* config_name, int min, int max, int initial, int tooltip, wxCheckBox* prereq) +{ + wxSpinCtrl* spin = new wxSpinCtrl(m_window, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, initial); + add_tooltip(spin, tooltip); + if (sizer) + sizer->Add(spin, wxSizerFlags()); + m_elems.emplace_back(UIElem::Type::Spin, spin, config_name, prereq); + return spin; +} + +wxSpinCtrl* GSUIElementHolder::addSpinAndLabel(wxSizer* sizer, const char* label, const char* config_name, int min, int max, int initial, int tooltip, wxCheckBox* prereq) +{ + wxSpinCtrl* spin = new wxSpinCtrl(m_window, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, initial); + addWithLabel(spin, UIElem::Type::Spin, sizer, label, config_name, tooltip, prereq, wxSizerFlags().Centre().Left()); + return spin; +} + +wxSlider* GSUIElementHolder::addSliderAndLabel(wxSizer* sizer, const char* label, const char* config_name, int min, int max, int initial, int tooltip, wxCheckBox* prereq) +{ + wxSlider* slider = new wxSlider(m_window, wxID_ANY, initial, min, max, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_VALUE_LABEL); + addWithLabel(slider, UIElem::Type::Slider, sizer, label, config_name, tooltip, prereq); + return slider; +} + +wxFilePickerCtrl* GSUIElementHolder::addFilePickerAndLabel(wxSizer* sizer, const char* label, const char* config_name, int tooltip, wxCheckBox* prereq) +{ + wxFilePickerCtrl* picker = new wxFilePickerCtrl(m_window, wxID_ANY); + addWithLabel(picker, UIElem::Type::File, sizer, label, config_name, tooltip, prereq); + return picker; +} + +wxDirPickerCtrl* GSUIElementHolder::addDirPickerAndLabel(wxSizer* sizer, const char* label, const char* config_name, int tooltip, wxCheckBox* prereq) +{ + wxDirPickerCtrl* picker = new wxDirPickerCtrl(m_window, wxID_ANY); + addWithLabel(picker, UIElem::Type::Directory, sizer, label, config_name, tooltip, prereq); + return picker; +} + +void GSUIElementHolder::Load() +{ + for (const UIElem& elem : m_elems) + { + switch (elem.type) + { + case UIElem::Type::CheckBox: + static_cast(elem.control)->SetValue(theApp.GetConfigB(elem.config)); + break; + case UIElem::Type::Choice: + { + GSwxChoice* choice = static_cast(elem.control); + choice->SetSelection(get_config_index(choice->settings, elem.config)); + break; + } + case UIElem::Type::Spin: + static_cast(elem.control)->SetValue(theApp.GetConfigI(elem.config)); + break; + case UIElem::Type::Slider: + static_cast(elem.control)->SetValue(theApp.GetConfigI(elem.config)); + break; + case UIElem::Type::File: + case UIElem::Type::Directory: + { + auto* picker = static_cast(elem.control); + picker->SetInitialDirectory(theApp.GetConfigS(elem.config)); + picker->SetPath(theApp.GetConfigS(elem.config)); + break; + } + } + } +} + +void GSUIElementHolder::Save() +{ + for (const UIElem& elem : m_elems) + { + switch (elem.type) + { + case UIElem::Type::CheckBox: + theApp.SetConfig(elem.config, static_cast(elem.control)->GetValue()); + break; + case UIElem::Type::Choice: + { + GSwxChoice* choice = static_cast(elem.control); + set_config_from_choice(choice, choice->settings, elem.config); + break; + } + case UIElem::Type::Spin: + theApp.SetConfig(elem.config, static_cast(elem.control)->GetValue()); + break; + case UIElem::Type::Slider: + theApp.SetConfig(elem.config, static_cast(elem.control)->GetValue()); + break; + case UIElem::Type::File: + case UIElem::Type::Directory: + theApp.SetConfig(elem.config, static_cast(elem.control)->GetPath()); + break; + } + } +} + +void GSUIElementHolder::Update() +{ + for (const UIElem& elem : m_elems) + { + if (elem.prereq) + elem.control->Enable(elem.prereq->GetValue()); + } +} + RendererTab::RendererTab(wxWindow* parent) : wxPanel(parent, wxID_ANY) + , m_ui(this) { auto* tab_box = new wxBoxSizer(wxVERTICAL); auto* hardware_box = new wxStaticBoxSizer(wxVERTICAL, this, "Hardware Mode"); auto* software_box = new wxStaticBoxSizer(wxVERTICAL, this, "Software Mode"); - eight_bit_check = new wxCheckBox(this, wxID_ANY, "GPU Palette Conversion"); - add_tooltip(eight_bit_check, IDC_PALTEX); - framebuffer_check = new wxCheckBox(this, wxID_ANY, "Conservative Buffer Allocation"); - add_tooltip(framebuffer_check, IDC_CONSERVATIVE_FB); - acc_date_check = new wxCheckBox(this, wxID_ANY, "Accurate DATE"); - add_tooltip(acc_date_check, IDC_ACCURATE_DATE); + auto* hw_checks_box = new wxWrapSizer(wxHORIZONTAL); - auto* hw_choice_grid = new wxFlexGridSizer(2, 0, 0); + m_ui.addCheckBox(hw_checks_box, "GPU Palette Conversion", "paltex", IDC_PALTEX); + m_ui.addCheckBox(hw_checks_box, "Conservative Buffer Allocation", "conservative_framebuffer", IDC_CONSERVATIVE_FB); + m_ui.addCheckBox(hw_checks_box, "Accurate DATE", "accurate_date", IDC_ACCURATE_DATE); - add_label_and_combo_box(this, hw_choice_grid, m_res_select, "Internal Resolution:", theApp.m_gs_upscale_multiplier); - add_label_and_combo_box(this, hw_choice_grid, m_anisotropic_select, "Anisotropic Filtering:", theApp.m_gs_max_anisotropy, IDC_AFCOMBO); - add_label_and_combo_box(this, hw_choice_grid, m_dither_select, "Dithering (PgDn):", theApp.m_gs_dithering, IDC_DITHERING); - add_label_and_combo_box(this, hw_choice_grid, m_mipmap_select, "Mipmapping (Insert):", theApp.m_gs_hw_mipmapping, IDC_MIPMAP_HW); - add_label_and_combo_box(this, hw_choice_grid, m_crc_select, "CRC Hack Level:", theApp.m_gs_crc_level, IDC_CRC_LEVEL); - add_label_and_combo_box(this, hw_choice_grid, m_blend_select, "Blending Accuracy:", theApp.m_gs_acc_blend_level, IDC_ACCURATE_BLEND_UNIT); + auto* hw_choice_grid = new wxFlexGridSizer(2, 5, 5); - auto* top_checks_box = new wxWrapSizer(wxHORIZONTAL); - top_checks_box->Add(eight_bit_check, wxSizerFlags().Centre()); - top_checks_box->Add(framebuffer_check, wxSizerFlags().Centre()); - top_checks_box->Add(acc_date_check, wxSizerFlags().Centre()); + m_ui.addComboBoxAndLabel(hw_choice_grid, "Internal Resolution:", "upscale_multiplier", &theApp.m_gs_upscale_multiplier); + m_ui.addComboBoxAndLabel(hw_choice_grid, "Anisotropic Filtering:", "MaxAnisotropy", &theApp.m_gs_max_anisotropy, IDC_AFCOMBO); + m_ui.addComboBoxAndLabel(hw_choice_grid, "Dithering (PgDn):", "dithering_ps2", &theApp.m_gs_dithering, IDC_DITHERING); + m_ui.addComboBoxAndLabel(hw_choice_grid, "Mipmapping (Insert):", "mipmap_hw", &theApp.m_gs_hw_mipmapping, IDC_MIPMAP_HW); + m_ui.addComboBoxAndLabel(hw_choice_grid, "CRC Hack Level:", "crc_hack_level", &theApp.m_gs_crc_level, IDC_CRC_LEVEL); + m_ui.addComboBoxAndLabel(hw_choice_grid, "Blending Accuracy:", "accurate_blending_unit", &theApp.m_gs_acc_blend_level, IDC_ACCURATE_BLEND_UNIT); - hardware_box->Add(top_checks_box, wxSizerFlags().Centre()); + hardware_box->Add(hw_checks_box, wxSizerFlags().Centre()); + hardware_box->AddSpacer(5); hardware_box->Add(hw_choice_grid, wxSizerFlags().Centre()); - auto* bottom_checks_box = new wxWrapSizer(wxHORIZONTAL); - flush_check = new wxCheckBox(this, wxID_ANY, "Auto Flush"); - add_tooltip(flush_check, IDC_AUTO_FLUSH_SW); + auto* sw_checks_box = new wxWrapSizer(wxHORIZONTAL); + m_ui.addCheckBox(sw_checks_box, "Auto Flush", "autoflush_sw", IDC_AUTO_FLUSH_SW); + m_ui.addCheckBox(sw_checks_box, "Edge Antialiasing (Del)", "aa1", IDC_AA1); + m_ui.addCheckBox(sw_checks_box, "Mipmapping", "mipmap", IDC_MIPMAP_SW); - edge_check = new wxCheckBox(this, wxID_ANY, "Edge Antialiasing (Del)"); - add_tooltip(edge_check, IDC_AA1); - - mipmap_check = new wxCheckBox(this, wxID_ANY, "Mipmapping"); - add_tooltip(mipmap_check, IDC_MIPMAP_SW); - - bottom_checks_box->Add(flush_check, wxSizerFlags().Centre()); - bottom_checks_box->Add(edge_check, wxSizerFlags().Centre()); - bottom_checks_box->Add(mipmap_check, wxSizerFlags().Centre()); - software_box->Add(bottom_checks_box, wxSizerFlags().Centre()); + software_box->Add(sw_checks_box, wxSizerFlags().Centre()); + software_box->AddSpacer(5); // Rendering threads auto* thread_box = new wxBoxSizer(wxHORIZONTAL); - - add_label(this, thread_box, "Extra Rendering threads:", IDC_SWTHREADS); - thread_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 32, 2); - thread_box->Add(thread_spin, wxSizerFlags().Centre()); + m_ui.addSpinAndLabel(thread_box, "Extra Rendering threads:", "extrathreads", 0, 32, 2, IDC_SWTHREADS); software_box->Add(thread_box, wxSizerFlags().Centre()); tab_box->Add(hardware_box, wxSizerFlags().Centre().Expand()); @@ -146,145 +259,72 @@ RendererTab::RendererTab(wxWindow* parent) void RendererTab::CallUpdate(wxCommandEvent&) { - Update(); -} - -void RendererTab::Load() -{ - acc_date_check->SetValue(theApp.GetConfigB("accurate_date")); - eight_bit_check->SetValue(theApp.GetConfigB("paltex")); - framebuffer_check->SetValue(theApp.GetConfigB("conservative_framebuffer")); - flush_check->SetValue(theApp.GetConfigB("autoflush_sw")); - edge_check->SetValue(theApp.GetConfigB("aa1")); - mipmap_check->SetValue(theApp.GetConfigB("mipmap")); - - thread_spin->SetValue(theApp.GetConfigI("extrathreads")); - - m_res_select->SetSelection(get_config_index(theApp.m_gs_upscale_multiplier, "upscale_multiplier")); - m_anisotropic_select->SetSelection(get_config_index(theApp.m_gs_max_anisotropy, "MaxAnisotropy")); - m_dither_select->SetSelection(get_config_index(theApp.m_gs_dithering, "dithering_ps2")); - m_mipmap_select->SetSelection(get_config_index(theApp.m_gs_hw_mipmapping, "mipmap_hw")); - m_crc_select->SetSelection(get_config_index(theApp.m_gs_crc_level, "crc_hack_level")); - m_blend_select->SetSelection(get_config_index(theApp.m_gs_acc_blend_level, "accurate_blending_unit")); - Update(); -} - -void RendererTab::Save() -{ - theApp.SetConfig("accurate_date", acc_date_check->GetValue()); - theApp.SetConfig("paltex", eight_bit_check->GetValue()); - theApp.SetConfig("conservative_framebuffer", framebuffer_check->GetValue()); - theApp.SetConfig("autoflush_sw", flush_check->GetValue()); - theApp.SetConfig("aa1", edge_check->GetValue()); - theApp.SetConfig("mipmap", mipmap_check->GetValue()); - - theApp.SetConfig("extrathreads", thread_spin->GetValue()); - - set_config_from_choice(m_res_select, theApp.m_gs_upscale_multiplier, "upscale_multiplier"); - set_config_from_choice(m_anisotropic_select, theApp.m_gs_max_anisotropy, "MaxAnisotropy"); - set_config_from_choice(m_dither_select, theApp.m_gs_dithering, "dithering_ps2"); - set_config_from_choice(m_mipmap_select, theApp.m_gs_hw_mipmapping, "mipmap_hw"); - set_config_from_choice(m_crc_select, theApp.m_gs_crc_level, "crc_hack_level"); - set_config_from_choice(m_blend_select, theApp.m_gs_acc_blend_level, "accurate_blending_unit"); -} - -void RendererTab::Update() -{ + m_ui.Update(); } HacksTab::HacksTab(wxWindow* parent) : wxPanel(parent, wxID_ANY) + , m_ui(this) { auto* tab_box = new wxBoxSizer(wxVERTICAL); - hacks_check = new wxCheckBox(this, wxID_ANY, "Enable User Hacks"); + auto* hacks_check = m_ui.addCheckBox(tab_box, "Enable User Hacks", "UserHacks"); - auto* rend_hacks_box = new wxStaticBoxSizer(wxVERTICAL, this, "Renderer Hacks"); + auto* rend_hacks_box = new wxStaticBoxSizer(wxVERTICAL, this, "Renderer Hacks"); auto* upscale_hacks_box = new wxStaticBoxSizer(wxVERTICAL, this, "Upscale Hacks"); - auto* rend_hacks_grid = new wxFlexGridSizer(2, 0, 0); + auto* rend_hacks_grid = new wxFlexGridSizer(2, 0, 0); auto* upscale_hacks_grid = new wxFlexGridSizer(3, 0, 0); // Renderer Hacks - auto_flush_check = new wxCheckBox(this, wxID_ANY, "Auto Flush"); - fast_inv_check = new wxCheckBox(this, wxID_ANY, "Fast Texture Invalidation"); - dis_depth_check = new wxCheckBox(this, wxID_ANY, "Disable Depth Emulation"); - fb_convert_check = new wxCheckBox(this, wxID_ANY, "Frame Buffer Conversion"); - dis_safe_features_check = new wxCheckBox(this, wxID_ANY, "Disable Safe Features"); - mem_wrap_check = new wxCheckBox(this, wxID_ANY, "Memory Wrapping"); - preload_gs_check = new wxCheckBox(this, wxID_ANY, "Preload Frame Data"); - - add_tooltip(auto_flush_check, IDC_AUTO_FLUSH_HW); - add_tooltip(fast_inv_check, IDC_FAST_TC_INV); - add_tooltip(dis_depth_check, IDC_TC_DEPTH); - add_tooltip(fb_convert_check, IDC_CPU_FB_CONVERSION); - add_tooltip(dis_safe_features_check, IDC_SAFE_FEATURES); - add_tooltip(mem_wrap_check, IDC_MEMORY_WRAPPING); - add_tooltip(preload_gs_check, IDC_PRELOAD_GS); + m_ui.addCheckBox(rend_hacks_grid, "Auto Flush", "UserHacks_AutoFlush", IDC_AUTO_FLUSH_HW, hacks_check); + m_ui.addCheckBox(rend_hacks_grid, "Fast Texture Invalidation", "UserHacks_DisablePartialInvalidation", IDC_FAST_TC_INV, hacks_check); + m_ui.addCheckBox(rend_hacks_grid, "Disable Depth Emulation", "UserHacks_DisableDepthSupport", IDC_TC_DEPTH, hacks_check); + m_ui.addCheckBox(rend_hacks_grid, "Frame Buffer Conversion", "UserHacks_CPU_FB_Conversion", IDC_CPU_FB_CONVERSION, hacks_check); + m_ui.addCheckBox(rend_hacks_grid, "Disable Safe Features", "UserHacks_Disable_Safe_Features", IDC_SAFE_FEATURES, hacks_check); + m_ui.addCheckBox(rend_hacks_grid, "Memory Wrapping", "wrap_gs_mem", IDC_MEMORY_WRAPPING, hacks_check); + m_ui.addCheckBox(rend_hacks_grid, "Preload Frame Data", "preload_frame_with_gs_data", IDC_PRELOAD_GS, hacks_check); // Upscale - align_sprite_check = new wxCheckBox(this, wxID_ANY, "Align Sprite"); - merge_sprite_check = new wxCheckBox(this, wxID_ANY, "Merge Sprite"); - wild_arms_check = new wxCheckBox(this, wxID_ANY, "Wild Arms Hack"); + m_ui.addCheckBox(upscale_hacks_grid, "Align Sprite", "UserHacks_align_sprite_X", IDC_ALIGN_SPRITE, hacks_check); + m_ui.addCheckBox(upscale_hacks_grid, "Merge Sprite", "UserHacks_merge_pp_sprite", IDC_MERGE_PP_SPRITE, hacks_check); + m_ui.addCheckBox(upscale_hacks_grid, "Wild Arms Hack", "UserHacks_WildHack", IDC_WILDHACK, hacks_check); - add_tooltip(align_sprite_check, IDC_ALIGN_SPRITE); - add_tooltip(merge_sprite_check, IDC_MERGE_PP_SPRITE); - add_tooltip(wild_arms_check, IDC_WILDHACK); - - rend_hacks_grid->Add(auto_flush_check); - rend_hacks_grid->Add(fast_inv_check); - rend_hacks_grid->Add(dis_depth_check); - rend_hacks_grid->Add(fb_convert_check); - rend_hacks_grid->Add(dis_safe_features_check); - rend_hacks_grid->Add(mem_wrap_check); - rend_hacks_grid->Add(preload_gs_check); - - upscale_hacks_grid->Add(align_sprite_check); - upscale_hacks_grid->Add(merge_sprite_check); - upscale_hacks_grid->Add(wild_arms_check); - - auto* rend_hack_choice_grid = new wxFlexGridSizer(2, 0, 0); - auto* upscale_hack_choice_grid = new wxFlexGridSizer(2, 0, 0); + auto* rend_hack_choice_grid = new wxFlexGridSizer(2, 5, 5); + auto* upscale_hack_choice_grid = new wxFlexGridSizer(2, 5, 5); // Renderer Hacks: - add_label_and_combo_box(this, rend_hack_choice_grid, m_half_select, "Half Screen Fix:", theApp.m_gs_generic_list, IDC_HALF_SCREEN_TS); - add_label_and_combo_box(this, rend_hack_choice_grid, m_tri_select, "Trilinear Filtering:", theApp.m_gs_trifilter, IDC_TRI_FILTER); + m_ui.addComboBoxAndLabel(rend_hack_choice_grid, "Half Screen Fix:", "UserHacks_HalfPixelOffset", &theApp.m_gs_generic_list, IDC_HALF_SCREEN_TS, hacks_check); + m_ui.addComboBoxAndLabel(rend_hack_choice_grid, "Trilinear Filtering:", "UserHacks_TriFilter", &theApp.m_gs_trifilter, IDC_TRI_FILTER, hacks_check); // Skipdraw Range - add_label(this, rend_hack_choice_grid, "Skipdraw Range:"); + add_label(this, rend_hack_choice_grid, "Skipdraw Range:", IDC_SKIPDRAWHACK); auto* skip_box = new wxBoxSizer(wxHORIZONTAL); - skip_x_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 0); - skip_y_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 0); - add_tooltip(skip_x_spin, IDC_TCOFFSETX); - add_tooltip(skip_y_spin, IDC_TCOFFSETY); - skip_box->Add(skip_x_spin); - skip_box->Add(skip_y_spin); + skip_x_spin = m_ui.addSpin(skip_box, "UserHacks_SkipDraw_Offset", 0, 10000, 0, IDC_SKIPDRAWOFFSET, hacks_check); + skip_y_spin = m_ui.addSpin(skip_box, "UserHacks_SkipDraw", 0, 10000, 0, IDC_SKIPDRAWHACK, hacks_check); rend_hack_choice_grid->Add(skip_box); // Upscale Hacks: - add_label_and_combo_box(this, upscale_hack_choice_grid, m_gs_offset_hack_select, "Half-Pixel Offset:", theApp.m_gs_offset_hack, IDC_OFFSETHACK); - add_label_and_combo_box(this, upscale_hack_choice_grid, m_round_hack_select, "Round Sprite:", theApp.m_gs_hack, IDC_ROUND_SPRITE); + m_ui.addComboBoxAndLabel(upscale_hack_choice_grid, "Half-Pixel Offset:", "UserHacks_Half_Bottom_Override", &theApp.m_gs_offset_hack, IDC_OFFSETHACK, hacks_check); + m_ui.addComboBoxAndLabel(upscale_hack_choice_grid, "Round Sprite:", "UserHacks_round_sprite_offset", &theApp.m_gs_hack, IDC_ROUND_SPRITE, hacks_check); // Texture Offsets - add_label(this, upscale_hack_choice_grid, "Texture Offsets:"); + add_label(this, upscale_hack_choice_grid, "Texture Offsets:", IDC_TCOFFSETX); auto* tex_off_box = new wxBoxSizer(wxHORIZONTAL); - tex_off_x_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 0); - tex_off_y_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 0); - tex_off_box->Add(tex_off_x_spin); - tex_off_box->Add(tex_off_y_spin); + m_ui.addSpin(tex_off_box, "UserHacks_TCOffsetX", 0, 10000, 0, IDC_TCOFFSETX, hacks_check); + m_ui.addSpin(tex_off_box, "UserHacks_TCOffsetY", 0, 10000, 0, IDC_TCOFFSETY, hacks_check); upscale_hack_choice_grid->Add(tex_off_box); rend_hacks_box->Add(rend_hacks_grid); - rend_hacks_box->Add(new wxStaticLine(this, wxID_ANY), wxSizerFlags().Centre().Expand().Border(5)); + rend_hacks_box->AddSpacer(5); rend_hacks_box->Add(rend_hack_choice_grid, wxSizerFlags().Expand()); upscale_hacks_box->Add(upscale_hacks_grid); - upscale_hacks_box->Add(new wxStaticLine(this, wxID_ANY), wxSizerFlags().Centre().Expand().Border(5)); + upscale_hacks_box->AddSpacer(5); upscale_hacks_box->Add(upscale_hack_choice_grid, wxSizerFlags().Expand()); - tab_box->Add(hacks_check, wxSizerFlags().Left()); tab_box->Add(rend_hacks_box, wxSizerFlags().Centre().Expand()); tab_box->Add(upscale_hacks_box, wxSizerFlags().Centre().Expand()); @@ -298,125 +338,42 @@ void HacksTab::CallUpdate(wxCommandEvent&) Update(); } -void HacksTab::Load() -{ - hacks_check->SetValue(theApp.GetConfigB("UserHacks")); - - align_sprite_check->SetValue(theApp.GetConfigB("UserHacks_align_sprite_X")); - fb_convert_check->SetValue(theApp.GetConfigB("UserHacks_CPU_FB_Conversion")); - auto_flush_check->SetValue(theApp.GetConfigB("UserHacks_AutoFlush")); - mem_wrap_check->SetValue(theApp.GetConfigB("wrap_gs_mem")); - dis_depth_check->SetValue(theApp.GetConfigB("UserHacks_DisableDepthSupport")); - merge_sprite_check->SetValue(theApp.GetConfigB("UserHacks_merge_pp_sprite")); - dis_safe_features_check->SetValue(theApp.GetConfigB("UserHacks_Disable_Safe_Features")); - preload_gs_check->SetValue(theApp.GetConfigB("preload_frame_with_gs_data")); - fast_inv_check->SetValue(theApp.GetConfigB("UserHacks_DisablePartialInvalidation")); - wild_arms_check->SetValue(theApp.GetConfigB("UserHacks_WildHack")); - - m_half_select->SetSelection(get_config_index(theApp.m_gs_offset_hack, "UserHacks_HalfPixelOffset")); - m_tri_select->SetSelection(get_config_index(theApp.m_gs_trifilter, "UserHacks_TriFilter")); - m_gs_offset_hack_select->SetSelection(get_config_index(theApp.m_gs_generic_list, "UserHacks_Half_Bottom_Override")); - m_round_hack_select->SetSelection(get_config_index(theApp.m_gs_hack, "UserHacks_round_sprite_offset")); - - skip_x_spin->SetValue(theApp.GetConfigI("UserHacks_SkipDraw_Offset")); - skip_y_spin->SetValue(theApp.GetConfigI("UserHacks_SkipDraw")); - tex_off_x_spin->SetValue(theApp.GetConfigI("UserHacks_TCOffsetX")); - tex_off_y_spin->SetValue(theApp.GetConfigI("UserHacks_TCOffsetY")); - Update(); -} - -void HacksTab::Save() -{ - theApp.SetConfig("UserHacks", hacks_check->GetValue()); - - theApp.SetConfig("UserHacks_align_sprite_X", align_sprite_check->GetValue()); - theApp.SetConfig("UserHacks_CPU_FB_Conversion", fb_convert_check->GetValue()); - theApp.SetConfig("UserHacks_AutoFlush", auto_flush_check->GetValue()); - theApp.SetConfig("wrap_gs_mem", mem_wrap_check->GetValue()); - theApp.SetConfig("UserHacks_DisableDepthSupport", dis_depth_check->GetValue()); - theApp.SetConfig("UserHacks_merge_pp_sprite", merge_sprite_check->GetValue()); - theApp.SetConfig("UserHacks_Disable_Safe_Features", dis_safe_features_check->GetValue()); - theApp.SetConfig("preload_frame_with_gs_data", preload_gs_check->GetValue()); - theApp.SetConfig("UserHacks_DisablePartialInvalidation", fast_inv_check->GetValue()); - theApp.SetConfig("UserHacks_WildHack", wild_arms_check->GetValue()); - - set_config_from_choice(m_half_select, theApp.m_gs_offset_hack, "UserHacks_HalfPixelOffset"); - set_config_from_choice(m_tri_select, theApp.m_gs_trifilter, "UserHacks_TriFilter"); - set_config_from_choice(m_gs_offset_hack_select, theApp.m_gs_generic_list, "UserHacks_Half_Bottom_Override"); - set_config_from_choice(m_round_hack_select, theApp.m_gs_hack, "UserHacks_round_sprite_offset"); - - theApp.SetConfig("UserHacks_SkipDraw_Offset", skip_x_spin->GetValue()); - theApp.SetConfig("UserHacks_SkipDraw", skip_y_spin->GetValue()); - theApp.SetConfig("UserHacks_TCOffsetX", tex_off_x_spin->GetValue()); - theApp.SetConfig("UserHacks_TCOffsetY", tex_off_y_spin->GetValue()); -} - void HacksTab::Update() { - bool hacks_enabled = hacks_check->GetValue(); - - align_sprite_check->Enable(hacks_enabled); - fb_convert_check->Enable(hacks_enabled); - auto_flush_check->Enable(hacks_enabled); - mem_wrap_check->Enable(hacks_enabled); - dis_depth_check->Enable(hacks_enabled); - merge_sprite_check->Enable(hacks_enabled); - dis_safe_features_check->Enable(hacks_enabled); - preload_gs_check->Enable(hacks_enabled); - fast_inv_check->Enable(hacks_enabled); - wild_arms_check->Enable(hacks_enabled); - - m_half_select->Enable(hacks_enabled); - m_tri_select->Enable(hacks_enabled); - m_gs_offset_hack_select->Enable(hacks_enabled); - m_round_hack_select->Enable(hacks_enabled); - - skip_x_spin->Enable(hacks_enabled); - skip_y_spin->Enable(hacks_enabled); - tex_off_x_spin->Enable(hacks_enabled); - tex_off_y_spin->Enable(hacks_enabled); + m_ui.Update(); if (skip_x_spin->GetValue() == 0) skip_y_spin->SetValue(0); if (skip_y_spin->GetValue() < skip_x_spin->GetValue()) skip_y_spin->SetValue(skip_x_spin->GetValue()); - //if (tex_off_y_spin->GetValue() < tex_off_x_spin->GetValue()) tex_off_y_spin->SetValue(tex_off_x_spin->GetValue()); } RecTab::RecTab(wxWindow* parent) : wxPanel(parent, wxID_ANY) + , m_ui(this) { auto* tab_box = new wxBoxSizer(wxVERTICAL); - record_check = new wxCheckBox(this, wxID_ANY, "Enable Recording (F12)"); + auto* record_check = m_ui.addCheckBox(tab_box, "Enable Recording (F12)", "capture_enabled"); auto* record_box = new wxStaticBoxSizer(wxVERTICAL, this, "Recording"); - auto* record_grid_box = new wxFlexGridSizer(2, 0, 0); + auto* record_grid_box = new wxFlexGridSizer(2, 5, 5); + record_grid_box->AddGrowableCol(1); // Resolution add_label(this, record_grid_box, "Resolution:"); auto* res_box = new wxBoxSizer(wxHORIZONTAL); - res_x_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 256, 8192, 640); - res_y_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 256, 8192, 480); - res_box->Add(res_x_spin); - res_box->Add(res_y_spin); + m_ui.addSpin(res_box, "CaptureWidth", 256, 8192, 640, -1, record_check); + m_ui.addSpin(res_box, "CaptureHeight", 256, 8192, 480, -1, record_check); record_grid_box->Add(res_box); - add_label(this, record_grid_box, "Saving Threads:"); - thread_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 32, 4); - record_grid_box->Add(thread_spin); + m_ui.addSpinAndLabel(record_grid_box, "Saving Threads:", "capture_threads", 1, 32, 4, -1, record_check); + m_ui.addSpinAndLabel(record_grid_box, "PNG Compression Level:", "png_compression_level", 1, 9, 1, -1, record_check); - add_label(this, record_grid_box, "PNG Compression Level:"); - png_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 9, 1); - record_grid_box->Add(png_spin); - - add_label(this, record_grid_box, "Output Directory:"); - dir_select = new wxDirPickerCtrl(this, wxID_ANY); - record_grid_box->Add(dir_select, wxSizerFlags().Expand()); + m_ui.addDirPickerAndLabel(record_grid_box, "Output Directory:", "capture_out_dir", -1, record_check); record_box->Add(record_grid_box, wxSizerFlags().Centre().Expand()); - tab_box->Add(record_check, wxSizerFlags().Left()); tab_box->Add(record_box, wxSizerFlags().Centre().Expand()); SetSizerAndFit(tab_box); Bind(wxEVT_CHECKBOX, &RecTab::CallUpdate, this); @@ -424,213 +381,88 @@ RecTab::RecTab(wxWindow* parent) void RecTab::CallUpdate(wxCommandEvent&) { - Update(); -} - -void RecTab::Load() -{ - record_check->SetValue(theApp.GetConfigB("capture_enabled")); - - res_x_spin->SetValue(theApp.GetConfigI("CaptureWidth")); - res_y_spin->SetValue(theApp.GetConfigI("CaptureHeight")); - thread_spin->SetValue(theApp.GetConfigI("capture_threads")); - png_spin->SetValue(theApp.GetConfigI("png_compression_level")); - - dir_select->SetInitialDirectory(theApp.GetConfigS("capture_out_dir")); - Update(); -} - -void RecTab::Save() -{ - theApp.SetConfig("capture_enabled", record_check->GetValue()); - - theApp.SetConfig("CaptureWidth", res_x_spin->GetValue()); - theApp.SetConfig("CaptureHeight", res_y_spin->GetValue()); - theApp.SetConfig("capture_threads", thread_spin->GetValue()); - theApp.SetConfig("png_compression_level", png_spin->GetValue()); - - theApp.SetConfig("capture_out_dir", dir_select->GetPath()); -} - -void RecTab::Update() -{ - bool capture_enabled = record_check->GetValue(); - - res_x_spin->Enable(capture_enabled); - res_y_spin->Enable(capture_enabled); - thread_spin->Enable(capture_enabled); - png_spin->Enable(capture_enabled); - - dir_select->Enable(capture_enabled); + m_ui.Update(); } PostTab::PostTab(wxWindow* parent) : wxPanel(parent, wxID_ANY) + , m_ui(this) { auto* tab_box = new wxBoxSizer(wxVERTICAL); auto* shader_box = new wxStaticBoxSizer(wxVERTICAL, this, "Custom Shader"); - tex_filter_check = new wxCheckBox(this, wxID_ANY, "Texture Filtering of Display"); - fxaa_check = new wxCheckBox(this, wxID_ANY, "FXAA Shader (PgUp)"); - add_tooltip(tex_filter_check, IDC_LINEAR_PRESENT); - add_tooltip(fxaa_check, IDC_FXAA); + m_ui.addCheckBox(shader_box, "Texture Filtering of Display", "linear_present", IDC_LINEAR_PRESENT); + m_ui.addCheckBox(shader_box, "FXAA Shader (PgUp)", "fxaa", IDC_FXAA); - shader_box->Add(tex_filter_check); - shader_box->Add(fxaa_check); + auto* shade_boost_check = m_ui.addCheckBox(shader_box, "Enable Shade Boost", "ShadeBoost", IDC_SHADEBOOST); - shade_boost_check = new wxCheckBox(this, wxID_ANY, "Enable Shade Boost"); - add_tooltip(shade_boost_check, IDC_SHADEBOOST); - shader_box->Add(shade_boost_check); + auto* shade_boost_box = new wxStaticBoxSizer(wxVERTICAL, this, "Shade Boost"); + auto* shader_boost_grid = new wxFlexGridSizer(2, 0, 5); + shader_boost_grid->AddGrowableCol(1); - shade_boost_box = new wxStaticBoxSizer(wxVERTICAL, this, "Shade Boost"); - auto* shader_boost_grid = new wxFlexGridSizer(2, 0, 0); + m_ui.addSliderAndLabel(shader_boost_grid, "Brightness:", "ShadeBoost_Brightness", 0, 100, 50, -1, shade_boost_check); + m_ui.addSliderAndLabel(shader_boost_grid, "Contrast:", "ShadeBoost_Contrast", 0, 100, 50, -1, shade_boost_check); + m_ui.addSliderAndLabel(shader_boost_grid, "Saturation:", "ShadeBoost_Saturation", 0, 100, 50, -1, shade_boost_check); - add_label(this, shader_boost_grid, "Brightness:"); - sb_brightness_slider = new wxSlider(this, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - shader_boost_grid->Add(sb_brightness_slider, wxSizerFlags().Expand().Shaped()); - - - add_label(this, shader_boost_grid, "Contrast:"); - sb_contrast_slider = new wxSlider(this, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - shader_boost_grid->Add(sb_contrast_slider, wxSizerFlags().Centre().Expand()); - - add_label(this, shader_boost_grid, "Saturation:"); - sb_saturation_slider = new wxSlider(this, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - shader_boost_grid->Add(sb_saturation_slider, wxSizerFlags().Centre().Expand()); - - shade_boost_box->Add(shader_boost_grid, wxSizerFlags().Centre()); + shade_boost_box->Add(shader_boost_grid, wxSizerFlags().Expand().Centre()); shader_box->Add(shade_boost_box, wxSizerFlags().Expand().Centre()); - ext_shader_check = new wxCheckBox(this, wxID_ANY, "Enable External Shader"); - add_tooltip(ext_shader_check, IDC_SHADER_FX); - shader_box->Add(ext_shader_check); + auto* ext_shader_check = m_ui.addCheckBox(shader_box, "Enable External Shader", "shaderfx", IDC_SHADER_FX); - ext_shader_box = new wxStaticBoxSizer(wxVERTICAL, this, "External Shader (Home)"); - auto* ext_shader_grid = new wxFlexGridSizer(4, 0, 0); + auto* ext_shader_box = new wxStaticBoxSizer(wxVERTICAL, this, "External Shader (Home)"); + auto* ext_shader_grid = new wxFlexGridSizer(2, 0, 5); + ext_shader_grid->AddGrowableCol(1); - ext_shader_grid->Add(new wxStaticText(this, wxID_ANY, "GLSL fx File:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT), wxSizerFlags().Centre()); - glsl_select = new wxDirPickerCtrl(this, wxID_ANY); - ext_shader_grid->Add(glsl_select, wxSizerFlags().Expand()); + m_ui.addFilePickerAndLabel(ext_shader_grid, "GLSL fx File:", "shaderfx_glsl", -1, ext_shader_check); + m_ui.addFilePickerAndLabel(ext_shader_grid, "Config File:", "shaderfx_conf", -1, ext_shader_check); - ext_shader_grid->Add(new wxStaticText(this, wxID_ANY, "Config File:", wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT), wxSizerFlags().Centre()); - config_select = new wxDirPickerCtrl(this, wxID_ANY); - ext_shader_grid->Add(config_select, wxSizerFlags().Expand()); - - ext_shader_box->Add(ext_shader_grid, wxSizerFlags().Centre()); + ext_shader_box->Add(ext_shader_grid, wxSizerFlags().Expand().Centre()); shader_box->Add(ext_shader_box, wxSizerFlags().Expand().Centre()); // TV Shader auto* tv_box = new wxBoxSizer(wxHORIZONTAL); - add_label_and_combo_box(this, tv_box, m_tv_select, "TV Shader:", theApp.m_gs_tv_shaders); + m_ui.addComboBoxAndLabel(tv_box, "TV Shader:", "TVShader", &theApp.m_gs_tv_shaders); shader_box->Add(tv_box); - tab_box->Add(shader_box, wxSizerFlags().Centre().Expand()); + tab_box->Add(shader_box, wxSizerFlags().Expand()); SetSizerAndFit(tab_box); Bind(wxEVT_CHECKBOX, &PostTab::CallUpdate, this); } void PostTab::CallUpdate(wxCommandEvent&) { - Update(); -} - -void PostTab::Load() -{ - tex_filter_check->SetValue(theApp.GetConfigB("linear_present")); - fxaa_check->SetValue(theApp.GetConfigB("fxaa")); - shade_boost_check->SetValue(theApp.GetConfigB("ShadeBoost")); - ext_shader_check->SetValue(theApp.GetConfigB("shaderfx")); - - m_tv_select->SetSelection(get_config_index(theApp.m_gs_tv_shaders, "TVShader")); - - glsl_select->SetInitialDirectory(theApp.GetConfigS("shaderfx_glsl")); - config_select->SetInitialDirectory(theApp.GetConfigS("shaderfx_conf")); - - sb_brightness_slider->SetValue(theApp.GetConfigI("ShadeBoost_Brightness")); - sb_contrast_slider->SetValue(theApp.GetConfigI("ShadeBoost_Contrast")); - sb_saturation_slider->SetValue(theApp.GetConfigI("ShadeBoost_Saturation")); - Update(); -} - -void PostTab::Save() -{ - theApp.SetConfig("linear_present", tex_filter_check->GetValue()); - theApp.SetConfig("fxaa", fxaa_check->GetValue()); - theApp.SetConfig("ShadeBoost", shade_boost_check->GetValue()); - theApp.SetConfig("shaderfx", ext_shader_check->GetValue()); - - set_config_from_choice(m_tv_select, theApp.m_gs_tv_shaders, "TVShader"); - - theApp.SetConfig("shaderfx_glsl", glsl_select->GetPath()); - theApp.SetConfig("shaderfx_conf", config_select->GetPath()); - - theApp.SetConfig("ShadeBoost_Brightness", sb_brightness_slider->GetValue()); - theApp.SetConfig("ShadeBoost_Contrast", sb_contrast_slider->GetValue()); - theApp.SetConfig("ShadeBoost_Saturation", sb_saturation_slider->GetValue()); -} - -void PostTab::Update() -{ - bool shade_boost_enabled = shade_boost_check->GetValue(); - bool ext_shader_enabled = ext_shader_check->GetValue(); - - shade_boost_box->GetStaticBox()->Enable(shade_boost_enabled); - sb_brightness_slider->Enable(shade_boost_enabled); - sb_contrast_slider->Enable(shade_boost_enabled); - sb_saturation_slider->Enable(shade_boost_enabled); - - ext_shader_box->GetStaticBox()->Enable(ext_shader_enabled); - glsl_select->Enable(ext_shader_enabled); - config_select->Enable(ext_shader_enabled); + m_ui.Update(); } OSDTab::OSDTab(wxWindow* parent) : wxPanel(parent, wxID_ANY) + , m_ui(this) { auto* tab_box = new wxBoxSizer(wxVERTICAL); - monitor_check = new wxCheckBox(this, wxID_ANY, "Enable Monitor"); - tab_box->Add(monitor_check); + auto* monitor_check = m_ui.addCheckBox(tab_box, "Enable Monitor", "osd_monitor_enabled", IDC_OSD_MONITOR); - font_box = new wxStaticBoxSizer(wxVERTICAL, this, "Font"); - auto* font_grid = new wxFlexGridSizer(2, 0, 0); + auto* font_box = new wxStaticBoxSizer(wxVERTICAL, this, "Font"); + auto* font_grid = new wxFlexGridSizer(2, 0, 5); + font_grid->AddGrowableCol(1); - add_label(this, font_grid, "Size:"); - size_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 100, 25); - font_grid->Add(size_spin, wxSizerFlags().Expand()); + m_ui.addSpinAndLabel(font_grid, "Size:", "osd_fontsize", 1, 100, 25, -1, monitor_check); - add_label(this, font_grid, "Red:"); - red_slider = new wxSlider(this, wxID_ANY, 0, 0, 255, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - font_grid->Add(red_slider, wxSizerFlags().Expand().Shaped()); - - add_label(this, font_grid, "Green:"); - green_slider = new wxSlider(this, wxID_ANY, 0, 0, 255, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - font_grid->Add(green_slider, wxSizerFlags().Expand().Shaped()); - - add_label(this, font_grid, "Blue:"); - blue_slider = new wxSlider(this, wxID_ANY, 0, 0, 255, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - font_grid->Add(blue_slider, wxSizerFlags().Expand().Shaped()); - - add_label(this, font_grid, "Opacity:"); - opacity_slider = new wxSlider(this, wxID_ANY, 100, 0, 100, wxDefaultPosition, wxSize(250, -1), wxSL_HORIZONTAL | wxSL_VALUE_LABEL); - font_grid->Add(opacity_slider, wxSizerFlags().Expand().Shaped()); + m_ui.addSliderAndLabel(font_grid, "Red:", "osd_color_r", 0, 255, 0, -1, monitor_check); + m_ui.addSliderAndLabel(font_grid, "Green:", "osd_color_g", 0, 255, 0, -1, monitor_check); + m_ui.addSliderAndLabel(font_grid, "Blue:", "osd_color_b", 0, 255, 0, -1, monitor_check); + m_ui.addSliderAndLabel(font_grid, "Opacity:", "osd_color_opacity", 0, 100, 100, -1, monitor_check); font_box->Add(font_grid, wxSizerFlags().Centre().Expand()); - tab_box->Add(font_box, wxSizerFlags().Centre()); + tab_box->Add(font_box, wxSizerFlags().Centre().Expand()); - log_check = new wxCheckBox(this, wxID_ANY, "Enable Log"); - tab_box->Add(log_check); + auto* log_check = m_ui.addCheckBox(tab_box, "Enable Log", "osd_log_enabled", IDC_OSD_LOG); - log_box = new wxStaticBoxSizer(wxVERTICAL, this, "Log Messages"); - auto* log_grid = new wxFlexGridSizer(2, 0, 0); + auto* log_box = new wxStaticBoxSizer(wxVERTICAL, this, "Log Messages"); + auto* log_grid = new wxFlexGridSizer(2, 5, 5); - add_label(this, log_grid, "Timeout (seconds):"); - timeout_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 2, 10, 4); - log_grid->Add(timeout_spin); - - add_label(this, log_grid, "Max On-Screen Messages:"); - max_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, 2); - log_grid->Add(max_spin); + m_ui.addSpinAndLabel(log_grid, "Timeout (seconds):", "osd_log_timeout", 2, 10, 4, -1, log_check); + m_ui.addSpinAndLabel(log_grid, "Max On-Screen Messages:", "osd_max_log_messages", 1, 10, 2, IDC_OSD_MAX_LOG, log_check); log_box->Add(log_grid, wxSizerFlags().Centre().Expand()); tab_box->Add(log_box, wxSizerFlags().Centre()); @@ -641,108 +473,43 @@ OSDTab::OSDTab(wxWindow* parent) void OSDTab::CallUpdate(wxCommandEvent&) { - Update(); -} - -void OSDTab::Load() -{ - monitor_check->SetValue(theApp.GetConfigB("osd_monitor_enabled")); - log_check->SetValue(theApp.GetConfigB("osd_log_enabled")); - - size_spin->SetValue(theApp.GetConfigI("osd_fontsize")); - timeout_spin->SetValue(theApp.GetConfigI("osd_log_timeout")); - max_spin->SetValue(theApp.GetConfigI("osd_max_log_messages")); - - red_slider->SetValue(theApp.GetConfigI("osd_color_r")); - green_slider->SetValue(theApp.GetConfigI("osd_color_g")); - blue_slider->SetValue(theApp.GetConfigI("osd_color_b")); - opacity_slider->SetValue(theApp.GetConfigI("osd_color_opacity")); - Update(); -} - -void OSDTab::Save() -{ - theApp.SetConfig("osd_monitor_enabled", monitor_check->GetValue()); - theApp.SetConfig("osd_log_enabled", log_check->GetValue()); - - theApp.SetConfig("osd_fontsize", size_spin->GetValue()); - theApp.SetConfig("osd_log_timeout", timeout_spin->GetValue()); - theApp.SetConfig("osd_max_log_messages", max_spin->GetValue()); - - theApp.SetConfig("osd_color_r", red_slider->GetValue()); - theApp.SetConfig("osd_color_g", green_slider->GetValue()); - theApp.SetConfig("osd_color_b", blue_slider->GetValue()); - theApp.SetConfig("osd_color_opacity", opacity_slider->GetValue()); -} - -void OSDTab::Update() -{ - bool font_enabled = monitor_check->GetValue(); - bool log_enabled = log_check->GetValue(); - - font_box->GetStaticBox()->Enable(font_enabled); - size_spin->Enable(font_enabled); - red_slider->Enable(font_enabled); - green_slider->Enable(font_enabled); - blue_slider->Enable(font_enabled); - opacity_slider->Enable(font_enabled); - - log_box->GetStaticBox()->Enable(log_enabled); - timeout_spin->Enable(log_enabled); - max_spin->Enable(log_enabled); + m_ui.Update(); } DebugTab::DebugTab(wxWindow* parent) : wxPanel(parent, wxID_ANY) + , m_ui(this) { auto* tab_box = new wxBoxSizer(wxVERTICAL); auto* debug_box = new wxStaticBoxSizer(wxVERTICAL, this, "Debug"); auto* debug_check_box = new wxWrapSizer(wxHORIZONTAL); - - glsl_debug_check = new wxCheckBox(this, wxID_ANY, "GLSL compilation"); - debug_check_box->Add(glsl_debug_check); - - gl_debug_check = new wxCheckBox(this, wxID_ANY, "Print GL error"); - debug_check_box->Add(gl_debug_check); - - gs_dump_check = new wxCheckBox(this, wxID_ANY, "Dump GS data"); - debug_check_box->Add(gs_dump_check); + m_ui.addCheckBox(debug_check_box, "GLSL compilation", "debug_glsl_shader"); + m_ui.addCheckBox(debug_check_box, "Print GL error", "debug_opengl"); + m_ui.addCheckBox(debug_check_box, "Dump GS data", "dump"); auto* debug_save_check_box = new wxWrapSizer(wxHORIZONTAL); - - gs_save_check = new wxCheckBox(this, wxID_ANY, "Save RT"); - debug_save_check_box->Add(gs_save_check); - - gs_savef_check = new wxCheckBox(this, wxID_ANY, "Save Frame"); - debug_save_check_box->Add(gs_savef_check); - - gs_savet_check = new wxCheckBox(this, wxID_ANY, "Save Texture"); - debug_save_check_box->Add(gs_savet_check); - - gs_savez_check = new wxCheckBox(this, wxID_ANY, "Save Depth"); - debug_save_check_box->Add(gs_savez_check); + m_ui.addCheckBox(debug_save_check_box, "Save RT", "save"); + m_ui.addCheckBox(debug_save_check_box, "Save Frame", "savef"); + m_ui.addCheckBox(debug_save_check_box, "Save Texture", "savet"); + m_ui.addCheckBox(debug_save_check_box, "Save Depth", "savez"); debug_box->Add(debug_check_box); debug_box->Add(debug_save_check_box); - auto* dump_grid = new wxFlexGridSizer(2, 0, 0); + auto* dump_grid = new wxFlexGridSizer(2, 5, 5); - add_label(this, dump_grid, "Start of Dump:"); - start_dump_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, pow(10, 9), 0); - dump_grid->Add(start_dump_spin); - - add_label(this, dump_grid, "End of Dump:"); - end_dump_spin = new wxSpinCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, pow(10, 5), 5000); - dump_grid->Add(end_dump_spin); + start_dump_spin = m_ui.addSpinAndLabel(dump_grid, "Start of Dump:", "saven", 0, pow(10, 9), 0); + end_dump_spin = m_ui.addSpinAndLabel(dump_grid, "End of Dump:", "savel", 0, pow(10, 5), 5000); + debug_box->AddSpacer(5); debug_box->Add(dump_grid); auto* ogl_box = new wxStaticBoxSizer(wxVERTICAL, this, "OpenGL"); - auto* ogl_grid = new wxFlexGridSizer(2, 0, 0); - add_label_and_combo_box(this, ogl_grid, m_geo_shader_select, "Geometry Shader:", theApp.m_gs_generic_list); - add_label_and_combo_box(this, ogl_grid, m_image_load_store_select, "Image Load Store:", theApp.m_gs_generic_list); - add_label_and_combo_box(this, ogl_grid, m_sparse_select, "Sparse Texture:", theApp.m_gs_generic_list); + auto* ogl_grid = new wxFlexGridSizer(2, 5, 5); + m_ui.addComboBoxAndLabel(ogl_grid, "Geometry Shader:", "override_geometry_shader", &theApp.m_gs_generic_list, IDC_GEOMETRY_SHADER_OVERRIDE); + m_ui.addComboBoxAndLabel(ogl_grid, "Image Load Store:", "override_GL_ARB_shader_image_load_store", &theApp.m_gs_generic_list, IDC_IMAGE_LOAD_STORE); + m_ui.addComboBoxAndLabel(ogl_grid, "Sparse Texture:", "override_GL_ARB_sparse_texture", &theApp.m_gs_generic_list, IDC_SPARSE_TEXTURE); ogl_box->Add(ogl_grid); tab_box->Add(debug_box, wxSizerFlags().Centre().Expand()); @@ -758,51 +525,16 @@ void DebugTab::CallUpdate(wxCommandEvent&) Update(); } -void DebugTab::Load() -{ - glsl_debug_check->SetValue(theApp.GetConfigB("debug_glsl_shader")); - gl_debug_check->SetValue(theApp.GetConfigB("debug_opengl")); - gs_dump_check->SetValue(theApp.GetConfigB("dump")); - gs_save_check->SetValue(theApp.GetConfigB("save")); - gs_savef_check->SetValue(theApp.GetConfigB("savef")); - gs_savet_check->SetValue(theApp.GetConfigB("savet")); - gs_savez_check->SetValue(theApp.GetConfigB("savez")); - - start_dump_spin->SetValue(theApp.GetConfigI("saven")); - end_dump_spin->SetValue(theApp.GetConfigI("savel")); - - m_geo_shader_select->SetSelection(get_config_index(theApp.m_gs_generic_list, "override_geometry_shader")); - m_image_load_store_select->SetSelection(get_config_index(theApp.m_gs_generic_list, "override_GL_ARB_shader_image_load_store")); - m_sparse_select->SetSelection(get_config_index(theApp.m_gs_generic_list, "override_GL_ARB_sparse_texture")); - Update(); -} - -void DebugTab::Save() -{ - theApp.SetConfig("debug_glsl_shader", glsl_debug_check->GetValue()); - theApp.SetConfig("debug_opengl", gl_debug_check->GetValue()); - theApp.SetConfig("dump", gs_dump_check->GetValue()); - theApp.SetConfig("save", gs_save_check->GetValue()); - theApp.SetConfig("savef", gs_savef_check->GetValue()); - theApp.SetConfig("savet", gs_savet_check->GetValue()); - theApp.SetConfig("savez", gs_savez_check->GetValue()); - - theApp.SetConfig("saven", start_dump_spin->GetValue()); - theApp.SetConfig("savel", end_dump_spin->GetValue()); - - set_config_from_choice(m_geo_shader_select, theApp.m_gs_generic_list, "override_geometry_shader"); - set_config_from_choice(m_image_load_store_select, theApp.m_gs_generic_list, "override_GL_ARB_shader_image_load_store"); - set_config_from_choice(m_sparse_select, theApp.m_gs_generic_list, "override_GL_ARB_sparse_texture"); -} - void DebugTab::Update() { + m_ui.Update(); if (end_dump_spin->GetValue() < start_dump_spin->GetValue()) end_dump_spin->SetValue(start_dump_spin->GetValue()); } Dialog::Dialog() - : wxDialog(nullptr, wxID_ANY, "Graphics Settings", wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) + : wxDialog(nullptr, wxID_ANY, "Graphics Settings", wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX | wxRESIZE_BORDER) + , m_ui(this) { auto* padding = new wxBoxSizer(wxVERTICAL); m_top_box = new wxBoxSizer(wxVERTICAL); @@ -816,10 +548,10 @@ Dialog::Dialog() m_top_box->Add(new wxStaticBitmap(this, wxID_ANY, logo), wxSizerFlags().Centre()); } - auto* top_grid = new wxFlexGridSizer(2, 0, 0); + auto* top_grid = new wxFlexGridSizer(2, 5, 5); top_grid->SetFlexibleDirection(wxHORIZONTAL); - add_label_and_combo_box(this, top_grid, m_renderer_select, "Renderer:", theApp.m_gs_renderers); + m_ui.addComboBoxAndLabel(top_grid, "Renderer:", "Renderer", &theApp.m_gs_renderers); #ifdef _WIN32 add_label(this, top_grid, "Adapter:"); @@ -830,8 +562,8 @@ Dialog::Dialog() top_grid->Add(m_adapter_select, wxSizerFlags().Expand()); #endif - add_label_and_combo_box(this, top_grid, m_interlace_select, "Interlacing(F5):", theApp.m_gs_interlace); - add_label_and_combo_box(this, top_grid, m_texture_select, "Texture Filtering:", theApp.m_gs_bifilter); + m_ui.addComboBoxAndLabel(top_grid, "Interlacing (F5):", "interlace", &theApp.m_gs_interlace); + m_ui.addComboBoxAndLabel(top_grid, "Texture Filtering:", "filter", &theApp.m_gs_bifilter, IDC_FILTER); auto* book = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize); @@ -871,12 +603,10 @@ void Dialog::CallUpdate(wxCommandEvent&) void Dialog::Load() { - m_renderer_select->SetSelection(get_config_index(theApp.m_gs_renderers, "Renderer")); + m_ui.Load(); #ifdef _WIN32 m_adapter_select->SetSelection(0); #endif - m_interlace_select->SetSelection(get_config_index(theApp.m_gs_interlace, "interlace")); - m_texture_select->SetSelection(get_config_index(theApp.m_gs_bifilter, "filter")); m_hacks_panel->Load(); m_renderer_panel->Load(); @@ -888,9 +618,7 @@ void Dialog::Load() void Dialog::Save() { - set_config_from_choice(m_renderer_select, theApp.m_gs_renderers, "Renderer"); - set_config_from_choice(m_interlace_select, theApp.m_gs_interlace, "interlace"); - set_config_from_choice(m_texture_select, theApp.m_gs_bifilter, "filter"); + m_ui.Save(); m_hacks_panel->Save(); m_renderer_panel->Save(); @@ -902,6 +630,7 @@ void Dialog::Save() void Dialog::Update() { + m_ui.Update(); m_adapter_select->Disable(); m_hacks_panel->Update(); diff --git a/pcsx2/GS/Window/GSwxDialog.h b/pcsx2/GS/Window/GSwxDialog.h index 5d8a5e5809..df5a86fbeb 100644 --- a/pcsx2/GS/Window/GSwxDialog.h +++ b/pcsx2/GS/Window/GSwxDialog.h @@ -26,6 +26,73 @@ #include #include #include +#include + +class GSUIElementHolder +{ + class GSwxChoice : public wxChoice + { + public: + const std::vector& settings; + + GSwxChoice( + wxWindow* parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + const std::vector* settings, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + : wxChoice(parent, id, pos, size, choices, style, validator, name) + , settings(*settings) + { + } + }; + + struct UIElem + { + enum class Type + { + CheckBox, + Choice, + Spin, + Slider, + File, + Directory, + }; + + Type type; + wxControl* control; + const char* config; + wxCheckBox* prereq; + + UIElem(Type type, wxControl* control, const char* config, wxCheckBox* prereq) + : type(type), control(control), config(config), prereq(prereq) + { + } + }; + + wxWindow* m_window; + std::vector m_elems; + + void addWithLabel(wxControl* control, UIElem::Type type, wxSizer* sizer, const char* label, const char* config_name, int tooltip, wxCheckBox* prereq, wxSizerFlags flags = wxSizerFlags().Centre().Expand().Left()); + +public: + GSUIElementHolder(wxWindow* window); + wxCheckBox* addCheckBox(wxSizer* sizer, const char* label, const char* config_name, int tooltip = -1, wxCheckBox* prereq = nullptr); + wxChoice* addComboBoxAndLabel(wxSizer* sizer, const char* label, const char* config_name, const std::vector* settings, int tooltip = -1, wxCheckBox* prereq = nullptr); + wxSpinCtrl* addSpin(wxSizer* sizer, const char* config_name, int min, int max, int initial, int tooltip = -1, wxCheckBox* prereq = nullptr); + wxSpinCtrl* addSpinAndLabel(wxSizer* sizer, const char* label, const char* config_name, int min, int max, int initial, int tooltip = -1, wxCheckBox* prereq = nullptr); + wxSlider* addSliderAndLabel(wxSizer* sizer, const char* label, const char* config_name, int min, int max, int initial, int tooltip = -1, wxCheckBox* prereq = nullptr); + wxFilePickerCtrl* addFilePickerAndLabel(wxSizer* sizer, const char* label, const char* config_name, int tooltip = -1, wxCheckBox* prereq = nullptr); + wxDirPickerCtrl* addDirPickerAndLabel(wxSizer* sizer, const char* label, const char* config_name, int tooltip = -1, wxCheckBox* prereq = nullptr); + + void Load(); + void Save(); + void Update(); +}; namespace GSSettingsDialog { @@ -33,30 +100,23 @@ namespace GSSettingsDialog class RendererTab : public wxPanel { public: - wxCheckBox *acc_date_check, *eight_bit_check, *framebuffer_check, *flush_check, *edge_check, *mipmap_check; - wxChoice *m_res_select, *m_anisotropic_select, *m_dither_select, *m_mipmap_select, *m_crc_select, *m_blend_select; - wxSpinCtrl* thread_spin; + GSUIElementHolder m_ui; RendererTab(wxWindow* parent); - void Load(); - void Save(); - void Update(); + void Load() { m_ui.Load(); m_ui.Update(); } + void Save() { m_ui.Save(); } void CallUpdate(wxCommandEvent& event); }; class HacksTab : public wxPanel { public: - wxCheckBox* hacks_check; - wxCheckBox *align_sprite_check, *fb_convert_check, *auto_flush_check, *mem_wrap_check, *dis_depth_check; - wxCheckBox *merge_sprite_check, *dis_safe_features_check, *preload_gs_check, *fast_inv_check, *wild_arms_check; - - wxChoice *m_half_select, *m_tri_select, *m_gs_offset_hack_select, *m_round_hack_select; - wxSpinCtrl *skip_x_spin, *skip_y_spin, *tex_off_x_spin, *tex_off_y_spin; + GSUIElementHolder m_ui; + wxSpinCtrl *skip_x_spin, *skip_y_spin; HacksTab(wxWindow* parent); - void Load(); - void Save(); + void Load() { m_ui.Load(); Update(); } + void Save() { m_ui.Save(); } void Update(); void CallUpdate(wxCommandEvent& event); }; @@ -64,13 +124,12 @@ namespace GSSettingsDialog class DebugTab : public wxPanel { public: - wxCheckBox *glsl_debug_check, *gl_debug_check, *gs_dump_check, *gs_save_check, *gs_savef_check, *gs_savet_check, *gs_savez_check; + GSUIElementHolder m_ui; wxSpinCtrl *start_dump_spin, *end_dump_spin; - wxChoice *m_geo_shader_select, *m_image_load_store_select, *m_sparse_select; DebugTab(wxWindow* parent); - void Load(); - void Save(); + void Load() { m_ui.Load(); Update(); } + void Save() { m_ui.Save(); } void Update(); void CallUpdate(wxCommandEvent& event); }; @@ -78,52 +137,42 @@ namespace GSSettingsDialog class RecTab : public wxPanel { public: - wxCheckBox* record_check; - wxSpinCtrl *res_x_spin, *res_y_spin, *thread_spin, *png_spin; - wxDirPickerCtrl* dir_select; + GSUIElementHolder m_ui; RecTab(wxWindow* parent); - void Load(); - void Save(); - void Update(); + void Load() { m_ui.Load(); m_ui.Update(); } + void Save() { m_ui.Save(); } void CallUpdate(wxCommandEvent& event); }; class PostTab : public wxPanel { public: - wxCheckBox *tex_filter_check, *fxaa_check, *shade_boost_check, *ext_shader_check; - wxSlider *sb_brightness_slider, *sb_contrast_slider, *sb_saturation_slider; - wxDirPickerCtrl *glsl_select, *config_select; - wxChoice* m_tv_select; - wxStaticBoxSizer *shade_boost_box, *ext_shader_box; + GSUIElementHolder m_ui; PostTab(wxWindow* parent); - void Load(); - void Save(); - void Update(); + void Load() { m_ui.Load(); m_ui.Update(); } + void Save() { m_ui.Save(); } void CallUpdate(wxCommandEvent& event); }; class OSDTab : public wxPanel { public: - wxCheckBox *monitor_check, *log_check; - wxSpinCtrl *size_spin, *timeout_spin, *max_spin; - wxSlider *red_slider, *green_slider, *blue_slider, *opacity_slider; - wxStaticBoxSizer *font_box, *log_box; + GSUIElementHolder m_ui; OSDTab(wxWindow* parent); - void Load(); - void Save(); - void Update(); + void Load() { m_ui.Load(); m_ui.Update(); } + void Save() { m_ui.Save(); } void CallUpdate(wxCommandEvent& event); }; class Dialog : public wxDialog { + GSUIElementHolder m_ui; + wxBoxSizer* m_top_box; - wxChoice *m_renderer_select, *m_interlace_select, *m_texture_select, *m_adapter_select; + wxChoice* m_adapter_select; RendererTab* m_renderer_panel; HacksTab* m_hacks_panel; DebugTab* m_debug_panel;