b5d6f645bd
* externals: Update dynarmic * settings: Introduce GraphicsAPI enum * For now it's OpenGL only but will be expanded upon later * citra_qt: Introduce backend agnostic context management * Mostly a direct port from yuzu * core: Simplify context acquire * settings: Add option to create debug contexts * renderer_opengl: Abstract initialization to Driver * This commit also updates glad and adds some useful extensions which we will use in part 2 * Rasterizer construction is moved to the specific renderer instead of RendererBase. Software rendering has been disable to achieve this but will be brought back in the next commit. * video_core: Remove Init/Shutdown methods from renderer * The constructor and destructor can do the same job * In addition move opengl function loading to Qt since SDL already does this. Also remove ErrorVideoCore which is never reached * citra_qt: Decouple software renderer from opengl part 1 * citra: Decouple software renderer from opengl part 2 * android: Decouple software renderer from opengl part 3 * swrasterizer: Decouple software renderer from opengl part 4 * This commit simply enforces the renderer naming conventions in the software renderer * video_core: Move RendererBase to VideoCore * video_core: De-globalize screenshot state * video_core: Pass system to the renderers * video_core: Commonize shader uniform data * video_core: Abstract backend agnostic rasterizer operations * bootmanager: Remove references to OpenGL for macOS OpenGL macOS headers definitions clash heavily with each other * citra_qt: Proper title for api settings * video_core: Reduce boost usage * bootmanager: Fix hide mouse option Remove event handlers from RenderWidget for events that are already handled by the parent GRenderWindow. Also enable mouse tracking on the RenderWidget. * android: Remove software from graphics api list * code: Address review comments * citra: Port per-game settings read * Having to update the default value for all backends is a pain so lets centralize it * android: Rename to OpenGLES --------- Co-authored-by: MerryMage <MerryMage@users.noreply.github.com> Co-authored-by: Vitor Kiguchi <vitor-kiguchi@hotmail.com>
119 lines
5.1 KiB
C++
119 lines
5.1 KiB
C++
// Copyright 2020 yuzu Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <QCheckBox>
|
|
#include <QComboBox>
|
|
#include "common/settings.h"
|
|
|
|
namespace ConfigurationShared {
|
|
|
|
constexpr int USE_GLOBAL_INDEX =
|
|
0; ///< The index of the "Use global configuration" option in checkboxes
|
|
constexpr int USE_GLOBAL_SEPARATOR_INDEX = 1;
|
|
constexpr int USE_GLOBAL_OFFSET = 2;
|
|
|
|
/// CheckBoxes require a tracker for their state since we emulate a tristate CheckBox
|
|
enum class CheckState {
|
|
Off, ///< Checkbox overrides to off/false
|
|
On, ///< Checkbox overrides to on/true
|
|
Global, ///< Checkbox defers to the global state
|
|
Count, ///< Simply the number of states, not a valid checkbox state
|
|
};
|
|
|
|
/**
|
|
* @brief ApplyPerGameSetting given a setting and a Qt UI element, properly applies a Setting
|
|
* taking into account the global/per-game check state. This is used for configuring checkboxes
|
|
* @param setting
|
|
* @param checkbox
|
|
* @param tracker
|
|
*/
|
|
void ApplyPerGameSetting(Settings::SwitchableSetting<bool>* setting, const QCheckBox* checkbox,
|
|
const CheckState& tracker);
|
|
|
|
/**
|
|
* @brief ApplyPerGameSetting given a setting and a Qt UI element, properly applies a Setting
|
|
* taking into account the global/per-game check state. This is used for both combo boxes
|
|
* as well as any other widget that is accompanied by a combo box in per-game settings.
|
|
* @param setting The setting class that stores the desired option
|
|
* @param combobox The Qt combo box that stores the value/per-game status
|
|
* @param transform A function that accepts the combo box index and transforms it to the
|
|
* desired settings value. When used with sliders/edit the user can ignore the input value
|
|
* and set a custom value this making this function useful for these widgets as well
|
|
*/
|
|
template <typename Type, bool ranged>
|
|
void ApplyPerGameSetting(Settings::SwitchableSetting<Type, ranged>* setting,
|
|
const QComboBox* combobox, auto transform) {
|
|
if (Settings::IsConfiguringGlobal() && setting->UsingGlobal()) {
|
|
setting->SetValue(static_cast<Type>(transform(combobox->currentIndex())));
|
|
} else if (!Settings::IsConfiguringGlobal()) {
|
|
if (combobox->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
|
|
setting->SetGlobal(true);
|
|
} else {
|
|
setting->SetGlobal(false);
|
|
setting->SetValue(static_cast<Type>(
|
|
transform(combobox->currentIndex() - ConfigurationShared::USE_GLOBAL_OFFSET)));
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Simpler version of ApplyPerGameSetting without a transform parameter
|
|
template <typename Type, bool ranged>
|
|
void ApplyPerGameSetting(Settings::SwitchableSetting<Type, ranged>* setting,
|
|
const QComboBox* combobox) {
|
|
const auto transform = [](s32 index) { return index; };
|
|
return ApplyPerGameSetting(setting, combobox, transform);
|
|
}
|
|
|
|
/// Sets a Qt UI element given a Settings::Setting
|
|
void SetPerGameSetting(QCheckBox* checkbox, const Settings::SwitchableSetting<bool>* setting);
|
|
|
|
template <typename Type, bool ranged>
|
|
void SetPerGameSetting(QComboBox* combobox,
|
|
const Settings::SwitchableSetting<Type, ranged>* setting) {
|
|
combobox->setCurrentIndex(setting->UsingGlobal() ? ConfigurationShared::USE_GLOBAL_INDEX
|
|
: static_cast<int>(setting->GetValue()) +
|
|
ConfigurationShared::USE_GLOBAL_OFFSET);
|
|
}
|
|
|
|
/// Specialization for string settings
|
|
template <>
|
|
void SetPerGameSetting(QComboBox* combobox,
|
|
const Settings::SwitchableSetting<std::string>* setting);
|
|
|
|
/// Given an index of a combobox setting extracts the setting taking into
|
|
/// account per-game status
|
|
template <typename Type, bool ranged>
|
|
Type GetComboboxSetting(int index, const Settings::SwitchableSetting<Type, ranged>* setting) {
|
|
if (Settings::IsConfiguringGlobal() && setting->UsingGlobal()) {
|
|
return static_cast<Type>(index);
|
|
} else if (!Settings::IsConfiguringGlobal()) {
|
|
if (index == 0) {
|
|
return setting->GetValue();
|
|
} else {
|
|
return static_cast<Type>(index - ConfigurationShared::USE_GLOBAL_OFFSET);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Given a Qt widget sets the background color to indicate whether the setting
|
|
/// is per-game overriden (highlighted) or global (non-highlighted)
|
|
void SetHighlight(QWidget* widget, bool highlighted);
|
|
|
|
/// Sets up a QCheckBox like a tristate one, given a Setting
|
|
void SetColoredTristate(QCheckBox* checkbox, const Settings::SwitchableSetting<bool>& setting,
|
|
CheckState& tracker);
|
|
void SetColoredTristate(QCheckBox* checkbox, bool global, bool state, bool global_state,
|
|
CheckState& tracker);
|
|
|
|
/// Sets up coloring of a QWidget `target` based on the state of a QComboBox, and calls
|
|
/// InsertGlobalItem
|
|
void SetColoredComboBox(QComboBox* combobox, QWidget* target, int global);
|
|
|
|
/// Adds the "Use Global Configuration" selection and separator to the beginning of a QComboBox
|
|
void InsertGlobalItem(QComboBox* combobox, int global_index);
|
|
|
|
} // namespace ConfigurationShared
|