diff --git a/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp b/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp index 0ccb43a4f1..02b4f06230 100644 --- a/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp +++ b/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.cpp @@ -23,6 +23,7 @@ #include "DolphinQt/Config/Graphics/GraphicsChoice.h" #include "DolphinQt/Config/Graphics/GraphicsRadio.h" #include "DolphinQt/Config/Graphics/GraphicsWindow.h" +#include "DolphinQt/Config/ToolTipControls/ToolTipComboBox.h" #include "DolphinQt/QtUtils/ModalMessageBox.h" #include "DolphinQt/Settings.h" @@ -32,7 +33,7 @@ #include "VideoCommon/VideoConfig.h" GeneralWidget::GeneralWidget(X11Utils::XRRConfiguration* xrr_config, GraphicsWindow* parent) - : GraphicsWidget(parent), m_xrr_config(xrr_config) + : m_xrr_config(xrr_config) { CreateWidgets(); LoadSettings(); @@ -54,11 +55,11 @@ void GeneralWidget::CreateWidgets() auto* m_video_box = new QGroupBox(tr("Basic")); m_video_layout = new QGridLayout(); - m_backend_combo = new QComboBox(); + m_backend_combo = new ToolTipComboBox(); m_aspect_combo = new GraphicsChoice({tr("Auto"), tr("Force 16:9"), tr("Force 4:3"), tr("Stretch to Window")}, Config::GFX_ASPECT_RATIO); - m_adapter_combo = new QComboBox; + m_adapter_combo = new ToolTipComboBox; m_enable_vsync = new GraphicsBool(tr("V-Sync"), Config::GFX_VSYNC); m_enable_fullscreen = new GraphicsBool(tr("Use Fullscreen"), Config::MAIN_FULLSCREEN); @@ -197,89 +198,122 @@ void GeneralWidget::AddDescriptions() // We need QObject::tr #if defined(_WIN32) static const char TR_BACKEND_DESCRIPTION[] = QT_TR_NOOP( - "Selects which graphics API to use internally.\n\nThe software renderer is extremely " + "Selects which graphics API to use internally.

The software renderer is extremely " "slow and only useful for debugging, so either OpenGL, Direct3D, or Vulkan are " "recommended. Different games and different GPUs will behave differently on each " "backend, so for the best emulation experience it is recommended to try each and " - "select the backend that is least problematic.\n\nIf unsure, select OpenGL."); + "select the backend that is least problematic.

If unsure, " + "select OpenGL."); #else static const char TR_BACKEND_DESCRIPTION[] = QT_TR_NOOP( - "Selects which graphics API to use internally.\n\nThe software renderer is extremely " + "Selects which graphics API to use internally.

The software renderer is extremely " "slow and only useful for debugging, so any of the other backends are " - "recommended.\n\nIf unsure, select OpenGL."); + "recommended.

If unsure, select OpenGL."); #endif static const char TR_ADAPTER_DESCRIPTION[] = - QT_TR_NOOP("Selects a hardware adapter to use.\n\nIf unsure, select the first one."); + QT_TR_NOOP("Selects a hardware adapter to use.

If unsure, " + "select the first one."); static const char TR_FULLSCREEN_DESCRIPTION[] = - QT_TR_NOOP("Uses the entire screen for rendering.\n\nIf disabled, a " - "render window will be created instead.\n\nIf unsure, leave this unchecked."); + QT_TR_NOOP("Uses the entire screen for rendering.

If disabled, a " + "render window will be created instead.

If " + "unsure, leave this unchecked."); static const char TR_AUTOSIZE_DESCRIPTION[] = - QT_TR_NOOP("Automatically adjusts the window size to the internal resolution.\n\nIf unsure, " - "leave this unchecked."); - + QT_TR_NOOP("Automatically adjusts the window size to the internal resolution.

" + "If unsure, leave this unchecked."); static const char TR_RENDER_TO_MAINWINDOW_DESCRIPTION[] = QT_TR_NOOP("Uses the main Dolphin window for rendering rather than " - "a separate render window.\n\nIf unsure, leave this unchecked."); + "a separate render window.

If unsure, leave " + "this unchecked."); static const char TR_ASPECT_RATIO_DESCRIPTION[] = QT_TR_NOOP( - "Selects which aspect ratio to use when rendering.\n\nAuto: Uses the native aspect " - "ratio\nForce 16:9: Mimics an analog TV with a widescreen aspect ratio.\nForce 4:3: " - "Mimics a standard 4:3 analog TV.\nStretch to Window: Stretches the picture to the " - "window size.\n\nIf unsure, select Auto."); - static const char TR_VSYNC_DESCRIPTION[] = - QT_TR_NOOP("Waits for vertical blanks in order to prevent tearing.\n\nDecreases performance " - "if emulation speed is below 100%.\n\nIf unsure, leave this unchecked."); + "Selects which aspect ratio to use when rendering.

Auto: Uses the native aspect " + "ratio
Force 16:9: Mimics an analog TV with a widescreen aspect ratio.
Force 4:3: " + "Mimics a standard 4:3 analog TV.
Stretch to Window: Stretches the picture to the " + "window size.

If unsure, select Auto."); + static const char TR_VSYNC_DESCRIPTION[] = QT_TR_NOOP( + "Waits for vertical blanks in order to prevent tearing.

Decreases performance " + "if emulation speed is below 100%.

If unsure, leave " + "this " + "unchecked."); static const char TR_SHOW_FPS_DESCRIPTION[] = QT_TR_NOOP("Shows the number of frames rendered per second as a measure of " - "emulation speed.\n\nIf unsure, leave this unchecked."); - static const char TR_SHOW_NETPLAY_PING_DESCRIPTION[] = - QT_TR_NOOP("Shows the player's maximum ping while playing on " - "NetPlay.\n\nIf unsure, leave this unchecked."); - static const char TR_LOG_RENDERTIME_DESCRIPTION[] = - QT_TR_NOOP("Logs the render time of every frame to User/Logs/render_time.txt.\n\nUse this " - "feature when to measure the performance of Dolphin.\n\nIf " - "unsure, leave this unchecked."); + "emulation speed.

If unsure, leave this " + "unchecked."); + static const char TR_SHOW_NETPLAY_PING_DESCRIPTION[] = QT_TR_NOOP( + "Shows the player's maximum ping while playing on " + "NetPlay.

If unsure, leave this unchecked."); + static const char TR_LOG_RENDERTIME_DESCRIPTION[] = QT_TR_NOOP( + "Logs the render time of every frame to User/Logs/render_time.txt.

Use this " + "feature when to measure the performance of Dolphin.

If " + "unsure, leave this unchecked."); static const char TR_SHOW_NETPLAY_MESSAGES_DESCRIPTION[] = QT_TR_NOOP("Shows chat messages, buffer changes, and desync alerts " - "while playing NetPlay.\n\nIf unsure, leave this unchecked."); + "while playing NetPlay.

If unsure, leave " + "this unchecked."); static const char TR_SHADER_COMPILE_SYNC_DESCRIPTION[] = QT_TR_NOOP("Ubershaders are never used. Stuttering will occur during shader " - "compilation, but GPU demands are low.\n\nRecommended for low-end hardware. " - "\n\nIf unsure, select this mode."); + "compilation, but GPU demands are low.

Recommended for low-end hardware. " + "

If unsure, select this mode."); static const char TR_SHADER_COMPILE_SYNC_UBER_DESCRIPTION[] = QT_TR_NOOP( "Ubershaders will always be used. Provides a near stutter-free experience at the cost of " - "high GPU performance requirements.\n\nOnly recommended for high-end systems."); - static const char TR_SHADER_COMPILE_ASYNC_UBER_DESCRIPTION[] = - QT_TR_NOOP("Ubershaders will be used to prevent stuttering during shader compilation, but " - "specialized shaders will be used when they will not cause stuttering.\n\nIn the " - "best case it eliminates shader compilation stuttering while having minimal " - "performance impact, but results depend on video driver behavior."); + "high GPU performance requirements.

Only recommended " + "for high-end systems."); + static const char TR_SHADER_COMPILE_ASYNC_UBER_DESCRIPTION[] = QT_TR_NOOP( + "Ubershaders will be used to prevent stuttering during shader compilation, but " + "specialized shaders will be used when they will not cause stuttering.

In the " + "best case it eliminates shader compilation stuttering while having minimal " + "performance impact, but results depend on video driver behavior."); static const char TR_SHADER_COMPILE_ASYNC_SKIP_DESCRIPTION[] = QT_TR_NOOP( "Prevents shader compilation stuttering by not rendering waiting objects. Can work in " "scenarios where Ubershaders doesn't, at the cost of introducing visual glitches and broken " - "effects.\n\nNot recommended, only use if the other options give poor results."); + "effects.

Not recommended, only use if the other " + "options give poor results."); static const char TR_SHADER_COMPILE_BEFORE_START_DESCRIPTION[] = QT_TR_NOOP("Waits for all shaders to finish compiling before starting a game. Enabling this " "option may reduce stuttering or hitching for a short time after the game is " "started, at the cost of a longer delay before the game starts. For systems with " "two or fewer cores, it is recommended to enable this option, as a large shader " - "queue may reduce frame rates.\n\nOtherwise, if unsure, leave this unchecked."); + "queue may reduce frame rates.

Otherwise, if " + "unsure, leave this unchecked."); - AddDescription(m_backend_combo, TR_BACKEND_DESCRIPTION); - AddDescription(m_adapter_combo, TR_ADAPTER_DESCRIPTION); - AddDescription(m_aspect_combo, TR_ASPECT_RATIO_DESCRIPTION); - AddDescription(m_enable_vsync, TR_VSYNC_DESCRIPTION); - AddDescription(m_enable_fullscreen, TR_FULLSCREEN_DESCRIPTION); - AddDescription(m_show_fps, TR_SHOW_FPS_DESCRIPTION); - AddDescription(m_show_ping, TR_SHOW_NETPLAY_PING_DESCRIPTION); - AddDescription(m_log_render_time, TR_LOG_RENDERTIME_DESCRIPTION); - AddDescription(m_autoadjust_window_size, TR_AUTOSIZE_DESCRIPTION); - AddDescription(m_show_messages, TR_SHOW_NETPLAY_MESSAGES_DESCRIPTION); - AddDescription(m_render_main_window, TR_RENDER_TO_MAINWINDOW_DESCRIPTION); - AddDescription(m_shader_compilation_mode[0], TR_SHADER_COMPILE_SYNC_DESCRIPTION); - AddDescription(m_shader_compilation_mode[1], TR_SHADER_COMPILE_SYNC_UBER_DESCRIPTION); - AddDescription(m_shader_compilation_mode[2], TR_SHADER_COMPILE_ASYNC_UBER_DESCRIPTION); - AddDescription(m_shader_compilation_mode[3], TR_SHADER_COMPILE_ASYNC_SKIP_DESCRIPTION); - AddDescription(m_wait_for_shaders, TR_SHADER_COMPILE_BEFORE_START_DESCRIPTION); + m_backend_combo->SetTitle(tr("Backend")); + m_backend_combo->SetDescription(QString::fromStdString(TR_BACKEND_DESCRIPTION)); + + m_adapter_combo->SetTitle(tr("Adapter")); + m_adapter_combo->SetDescription(QString::fromStdString(TR_ADAPTER_DESCRIPTION)); + + m_aspect_combo->SetTitle(tr("Aspect Ratio")); + m_aspect_combo->SetDescription(QString::fromStdString(TR_ASPECT_RATIO_DESCRIPTION)); + + m_enable_vsync->SetDescription(QString::fromStdString(TR_VSYNC_DESCRIPTION)); + + m_enable_fullscreen->SetDescription(QString::fromStdString(TR_FULLSCREEN_DESCRIPTION)); + + m_show_fps->SetDescription(QString::fromStdString(TR_SHOW_FPS_DESCRIPTION)); + + m_show_ping->SetDescription(QString::fromStdString(TR_SHOW_NETPLAY_PING_DESCRIPTION)); + + m_log_render_time->SetDescription(QString::fromStdString(TR_LOG_RENDERTIME_DESCRIPTION)); + + m_autoadjust_window_size->SetDescription(QString::fromStdString(TR_AUTOSIZE_DESCRIPTION)); + + m_show_messages->SetDescription(QString::fromStdString(TR_SHOW_NETPLAY_MESSAGES_DESCRIPTION)); + + m_render_main_window->SetDescription(QString::fromStdString(TR_RENDER_TO_MAINWINDOW_DESCRIPTION)); + + m_shader_compilation_mode[0]->SetDescription( + QString::fromStdString(TR_SHADER_COMPILE_SYNC_DESCRIPTION)); + + m_shader_compilation_mode[1]->SetDescription( + QString::fromStdString(TR_SHADER_COMPILE_SYNC_UBER_DESCRIPTION)); + + m_shader_compilation_mode[2]->SetDescription( + QString::fromStdString(TR_SHADER_COMPILE_ASYNC_UBER_DESCRIPTION)); + + m_shader_compilation_mode[3]->SetDescription( + QString::fromStdString(TR_SHADER_COMPILE_ASYNC_SKIP_DESCRIPTION)); + + m_wait_for_shaders->SetDescription( + QString::fromStdString(TR_SHADER_COMPILE_BEFORE_START_DESCRIPTION)); } void GeneralWidget::OnBackendChanged(const QString& backend_name) diff --git a/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.h b/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.h index cd11a5607d..d398f0a9d7 100644 --- a/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.h +++ b/Source/Core/DolphinQt/Config/Graphics/GeneralWidget.h @@ -7,11 +7,15 @@ #include #include "DolphinQt/Config/Graphics/GraphicsWidget.h" +class GraphicsBool; +class GraphicsChoice; +class GraphicsRadioInt; class GraphicsWindow; class QCheckBox; class QComboBox; class QRadioButton; class QGridLayout; +class ToolTipComboBox; namespace X11Utils { @@ -39,21 +43,21 @@ private: // Video QGridLayout* m_video_layout; - QComboBox* m_backend_combo; - QComboBox* m_adapter_combo; - QComboBox* m_aspect_combo; - QCheckBox* m_enable_vsync; - QCheckBox* m_enable_fullscreen; + ToolTipComboBox* m_backend_combo; + ToolTipComboBox* m_adapter_combo; + GraphicsChoice* m_aspect_combo; + GraphicsBool* m_enable_vsync; + GraphicsBool* m_enable_fullscreen; // Options - QCheckBox* m_show_fps; - QCheckBox* m_show_ping; - QCheckBox* m_log_render_time; - QCheckBox* m_autoadjust_window_size; - QCheckBox* m_show_messages; - QCheckBox* m_render_main_window; - std::array m_shader_compilation_mode{}; - QCheckBox* m_wait_for_shaders; + GraphicsBool* m_show_fps; + GraphicsBool* m_show_ping; + GraphicsBool* m_log_render_time; + GraphicsBool* m_autoadjust_window_size; + GraphicsBool* m_show_messages; + GraphicsBool* m_render_main_window; + std::array m_shader_compilation_mode{}; + GraphicsBool* m_wait_for_shaders; X11Utils::XRRConfiguration* m_xrr_config; };