From 64f99fc7dea30339ef5e7b8226bfdbf5a880a118 Mon Sep 17 00:00:00 2001 From: blakdulz Date: Fri, 12 May 2023 17:39:52 +0700 Subject: [PATCH] QT add Custom Layout Menu Option. This add Custom Layout selector in Both Menu and Enhancment Setting. This will allow to use or change Custom Layout mode or by using toggle. Still No Overlay Editor, just manual edit box, and this Not saved or carried at per game settings --- .../configuration/configure_enhancements.cpp | 17 + .../configuration/configure_enhancements.ui | 1280 ++++++++++------- src/citra_qt/main.cpp | 8 + src/citra_qt/main.ui | 9 + src/common/settings.h | 1 + src/core/frontend/emu_window.cpp | 4 + src/core/frontend/framebuffer_layout.cpp | 7 + 7 files changed, 785 insertions(+), 541 deletions(-) diff --git a/src/citra_qt/configuration/configure_enhancements.cpp b/src/citra_qt/configuration/configure_enhancements.cpp index 90dfbf44d..58790f53f 100644 --- a/src/citra_qt/configuration/configure_enhancements.cpp +++ b/src/citra_qt/configuration/configure_enhancements.cpp @@ -82,6 +82,14 @@ void ConfigureEnhancements::SetConfiguration() { ui->toggle_swap_screen->setChecked(Settings::values.swap_screen.GetValue()); ui->toggle_upright_screen->setChecked(Settings::values.upright_screen.GetValue()); ui->large_screen_proportion->setValue(Settings::values.large_screen_proportion.GetValue()); + ui->custom_top_left->setValue(Settings::values.custom_top_left.GetValue()); + ui->custom_top_top->setValue(Settings::values.custom_top_top.GetValue()); + ui->custom_top_right->setValue(Settings::values.custom_top_right.GetValue()); + ui->custom_top_bottom->setValue(Settings::values.custom_top_bottom.GetValue()); + ui->custom_bottom_left->setValue(Settings::values.custom_bottom_left.GetValue()); + ui->custom_bottom_top->setValue(Settings::values.custom_bottom_top.GetValue()); + ui->custom_bottom_right->setValue(Settings::values.custom_bottom_right.GetValue()); + ui->custom_bottom_bottom->setValue(Settings::values.custom_bottom_bottom.GetValue()); ui->toggle_dump_textures->setChecked(Settings::values.dump_textures.GetValue()); ui->toggle_custom_textures->setChecked(Settings::values.custom_textures.GetValue()); ui->toggle_preload_textures->setChecked(Settings::values.preload_textures.GetValue()); @@ -147,6 +155,15 @@ void ConfigureEnhancements::ApplyConfiguration() { } Settings::values.large_screen_proportion = ui->large_screen_proportion->value(); + Settings::values.custom_top_left = ui->custom_top_left->value(); + Settings::values.custom_top_top = ui->custom_top_top->value(); + Settings::values.custom_top_right = ui->custom_top_right->value(); + Settings::values.custom_top_bottom = ui->custom_top_bottom->value(); + Settings::values.custom_bottom_left = ui->custom_bottom_left->value(); + Settings::values.custom_bottom_top = ui->custom_bottom_top->value(); + Settings::values.custom_bottom_right = ui->custom_bottom_right->value(); + Settings::values.custom_bottom_bottom = ui->custom_bottom_bottom->value(); + ConfigurationShared::ApplyPerGameSetting(&Settings::values.filter_mode, ui->toggle_linear_filter, linear_filter); ConfigurationShared::ApplyPerGameSetting(&Settings::values.texture_filter, diff --git a/src/citra_qt/configuration/configure_enhancements.ui b/src/citra_qt/configuration/configure_enhancements.ui index 6f644d835..bbfca444a 100644 --- a/src/citra_qt/configuration/configure_enhancements.ui +++ b/src/citra_qt/configuration/configure_enhancements.ui @@ -1,544 +1,742 @@ - ConfigureEnhancements - - - - 0 - 0 - 440 - 748 - - - - - 0 - 0 - - - - Form - - - - - - Renderer - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Internal Resolution - - - - - - - - Auto (Window Size) - - - - - Native (400x240) - - - - - 2x Native (800x480) - - - - - 3x Native (1200x720) - - - - - 4x Native (1600x960) - - - - - 5x Native (2000x1200) - - - - - 6x Native (2400x1440) - - - - - 7x Native (2800x1680) - - - - - 8x Native (3200x1920) - - - - - 9x Native (3600x2160) - - - - - 10x Native (4000x2400) - - - - - - - - - - - Enable Linear Filtering - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Post-Processing Shader - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Texture Filter - - - - - - - - None - - - - - Anime4K - - - - - Bicubic - - - - - Nearest Neighbor - - - - - ScaleForce - - - - - xBRZ - - - - - - - - - - - - - - Stereoscopy - - - - - - - - Stereoscopic 3D Mode - - - - - - - - Off - - - - - Side by Side - - - - - Anaglyph - - - - - Interlaced - - - - - Reverse Interlaced - - - - - - - - - - - - Depth - - - - - - - % - - - 0 - - - 100 - - - 0 - - - - - - - - - - - Eye to Render in Monoscopic Mode - - - - - - - - Left Eye (default) - - - - - Right Eye - - - - - - - - - - - - - Layout - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Screen Layout: - - - - - - - - Default - - - - - Single Screen - - - - - Large Screen - - - - - Side by Side - - - - - Separate Windows - - - - - - - - - - - Swap Screens - - - - - - - Rotate Screens Upright - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Large Screen Proportion: - - - - - - - 1.000000000000000 - - - 16.000000000000000 - - - 4.000000000000000 - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Background Color: - - - - - - - - 40 - 16777215 - - - - - - - - - - - - - - Utility - - - - - - <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - - Use Custom Textures - - - - - - - <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - - Dump Textures - - - - - - - <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the game requires them.</p></body></html> - - - Preload Custom Textures - - - - - - - <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - - Async Custom Texture Loading - - - - - - - - - - Qt::Vertical - - - - 20 - 165 - - - - - - - - resolution_factor_combobox - toggle_linear_filter - shader_combobox - texture_filter_combobox - render_3d_combobox - factor_3d - mono_rendering_eye - layout_combobox - toggle_swap_screen - toggle_upright_screen - large_screen_proportion - bg_button - toggle_custom_textures - toggle_dump_textures - toggle_preload_textures - - - + ConfigureEnhancements + + + + 0 + 0 + 440 + 748 + + + + + 0 + 0 + + + + Form + + + + + + + 0 + 480 + + + + QFrame::NoFrame + + + 1 + + + true + + + + + 0 + 0 + 422 + 932 + + + + + + + Renderer + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Internal Resolution + + + + + + + + Auto (Window Size) + + + + + Native (400x240) + + + + + 2x Native (800x480) + + + + + 3x Native (1200x720) + + + + + 4x Native (1600x960) + + + + + 5x Native (2000x1200) + + + + + 6x Native (2400x1440) + + + + + 7x Native (2800x1680) + + + + + 8x Native (3200x1920) + + + + + 9x Native (3600x2160) + + + + + 10x Native (4000x2400) + + + + + + + + + + + Enable Linear Filtering + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Post-Processing Shader + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Texture Filter + + + + + + + + None + + + + + Anime4K + + + + + Bicubic + + + + + Nearest Neighbor + + + + + ScaleForce + + + + + xBRZ + + + + + + + + + + + + + + Stereoscopy + + + + + + + + Stereoscopic 3D Mode + + + + + + + + Off + + + + + Side by Side + + + + + Anaglyph + + + + + Interlaced + + + + + Reverse Interlaced + + + + + + + + + + + + Depth + + + + + + + % + + + 0 + + + 100 + + + 0 + + + + + + + + + + + Eye to Render in Monoscopic Mode + + + + + + + + Left Eye (default) + + + + + Right Eye + + + + + + + + + + + + + Layout + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Screen Layout: + + + + + + + + Default + + + + + Single Screen + + + + + Large Screen + + + + + Side by Side + + + + + Separate Windows + + + + + Custom Layout + + + + + + + + + + + Swap Screens + + + + + + + Rotate Screens Upright + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Large Screen Proportion: + + + + + + + 1.000000000000000 + + + 16.000000000000000 + + + 4.000000000000000 + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Background Color: + + + + + + + + 40 + 16777215 + + + + + + + + + + + + 0 + 0 + + + + Custom Layout + + + + + + Top Screen + + + + + + Left + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Top + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Right + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Bottom + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + + + + + 0 + 0 + + + + Bottom Screen + + + + + + Left + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Top + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Right + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Bottom + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + + + + + + + + + + Utility + + + + + + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> + + + Use Custom Textures + + + + + + + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> + + + Dump Textures + + + + + + + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the game requires them.</p></body></html> + + + Preload Custom Textures + + + + + + + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> + + + Async Custom Texture Loading + + + + + + + + + + + + + + resolution_factor_combobox + toggle_linear_filter + shader_combobox + texture_filter_combobox + render_3d_combobox + factor_3d + mono_rendering_eye + layout_combobox + toggle_swap_screen + toggle_upright_screen + large_screen_proportion + bg_button + toggle_custom_textures + toggle_dump_textures + toggle_preload_textures + + + diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 6a99129c6..074d7ce93 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -375,6 +375,7 @@ void GMainWindow::InitializeWidgets() { actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Large_Screen); actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Side_by_Side); actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Separate_Windows); + actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Custom_Layout); } void GMainWindow::InitializeDebugWidgets() { @@ -795,6 +796,7 @@ void GMainWindow::ConnectMenuEvents() { connect_menu(ui->action_Screen_Layout_Large_Screen, &GMainWindow::ChangeScreenLayout); connect_menu(ui->action_Screen_Layout_Side_by_Side, &GMainWindow::ChangeScreenLayout); connect_menu(ui->action_Screen_Layout_Separate_Windows, &GMainWindow::ChangeScreenLayout); + connect_menu(ui->action_Screen_Layout_Custom_Layout, &GMainWindow::ChangeScreenLayout); connect_menu(ui->action_Screen_Layout_Swap_Screens, &GMainWindow::OnSwapScreens); connect_menu(ui->action_Screen_Layout_Upright_Screens, &GMainWindow::OnRotateScreens); @@ -1887,6 +1889,8 @@ void GMainWindow::ChangeScreenLayout() { new_layout = Settings::LayoutOption::SideScreen; } else if (ui->action_Screen_Layout_Separate_Windows->isChecked()) { new_layout = Settings::LayoutOption::SeparateWindows; + } else if (ui->action_Screen_Layout_Custom_Layout->isChecked()) { + new_layout = Settings::LayoutOption::CustomLayout; } Settings::values.layout_option = new_layout; @@ -1906,6 +1910,8 @@ void GMainWindow::ToggleScreenLayout() { case Settings::LayoutOption::SideScreen: return Settings::LayoutOption::SeparateWindows; case Settings::LayoutOption::SeparateWindows: + return Settings::LayoutOption::CustomLayout; + case Settings::LayoutOption::CustomLayout: return Settings::LayoutOption::Default; default: LOG_ERROR(Frontend, "Unknown layout option {}", @@ -2655,6 +2661,8 @@ void GMainWindow::SyncMenuUISettings() { Settings::LayoutOption::SideScreen); ui->action_Screen_Layout_Separate_Windows->setChecked( Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); + ui->action_Screen_Layout_Custom_Layout->setChecked(Settings::values.layout_option.GetValue() == + Settings::LayoutOption::CustomLayout); ui->action_Screen_Layout_Swap_Screens->setChecked(Settings::values.swap_screen.GetValue()); ui->action_Screen_Layout_Upright_Screens->setChecked( Settings::values.upright_screen.GetValue()); diff --git a/src/citra_qt/main.ui b/src/citra_qt/main.ui index 345139568..dba9ba868 100644 --- a/src/citra_qt/main.ui +++ b/src/citra_qt/main.ui @@ -136,6 +136,7 @@ + @@ -520,6 +521,14 @@ Separate Windows + + + true + + + Custom Layout + + true diff --git a/src/common/settings.h b/src/common/settings.h index 0d980406f..873ef3359 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -35,6 +35,7 @@ enum class LayoutOption : u32 { #ifndef ANDROID SeparateWindows, #endif + CustomLayout, // Similiar to default, but better for mobile devices in portrait mode. Top screen in clamped to // the top of the frame, and the bottom screen is enlarged to match the top screen. MobilePortrait, diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index f70a5fc60..364e42729 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -217,6 +217,10 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height, layout = Layout::MobileLandscapeFrameLayout( width, height, Settings::values.swap_screen.GetValue(), 2.25f, false); break; + case Settings::LayoutOption::CustomLayout: + layout = + Layout::CustomFrameLayout(width, height, Settings::values.swap_screen.GetValue()); + break; case Settings::LayoutOption::Default: default: layout = diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index 36a7c5de0..c34197fcf 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -487,6 +487,13 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar layout = MobileLandscapeFrameLayout( width, height, Settings::values.swap_screen.GetValue(), 2.25f, false); break; + case Settings::LayoutOption::CustomLayout: + layout = CustomFrameLayout(std::max(Settings::values.custom_top_right.GetValue(), + Settings::values.custom_bottom_right.GetValue()), + std::max(Settings::values.custom_top_bottom.GetValue(), + Settings::values.custom_bottom_bottom.GetValue()), + Settings::values.swap_screen.GetValue()); + break; case Settings::LayoutOption::Default: default: if (Settings::values.upright_screen.GetValue()) {