add volume quicksetting with volume slider (#7307)
Co-authored-by: Jonas Gutenschwager <spam.saikai@googlemail.com> Co-authored-by: Morph <39850852+Morph1984@users.noreply.github.com>
This commit is contained in:
parent
8b6a9b0dd8
commit
4f00eb20db
|
@ -12,18 +12,19 @@ QPushButton#GraphicsAPIStatusBarButton:hover {
|
|||
border: 1px solid #76797C;
|
||||
}
|
||||
|
||||
QPushButton#3DOptionStatusBarButton {
|
||||
color: #A5A5A5;
|
||||
font-weight: bold;
|
||||
QPushButton#TogglableStatusBarButton {
|
||||
color: #959595;
|
||||
border: 1px solid transparent;
|
||||
background-color: transparent;
|
||||
padding: 0px 3px 0px 3px;
|
||||
text-align: center;
|
||||
min-width: 60px;
|
||||
min-height: 20px;
|
||||
}
|
||||
|
||||
QPushButton#3DOptionStatusBarButton:hover {
|
||||
QPushButton#TogglableStatusBarButton:checked {
|
||||
color: #00FF00;
|
||||
}
|
||||
|
||||
QPushButton#TogglableStatusBarButton:hover {
|
||||
border: 1px solid #76797C;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,19 +1,3 @@
|
|||
QPushButton#TogglableStatusBarButton {
|
||||
color: #959595;
|
||||
border: 1px solid transparent;
|
||||
background-color: transparent;
|
||||
padding: 0px 3px 0px 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
QPushButton#TogglableStatusBarButton:checked {
|
||||
color: palette(text);
|
||||
}
|
||||
|
||||
QPushButton#TogglableStatusBarButton:hover {
|
||||
border: 1px solid #76797C;
|
||||
}
|
||||
|
||||
QPushButton#GraphicsAPIStatusBarButton {
|
||||
color: #656565;
|
||||
border: 1px solid transparent;
|
||||
|
@ -26,6 +10,23 @@ QPushButton#GraphicsAPIStatusBarButton:hover {
|
|||
border: 1px solid #76797C;
|
||||
}
|
||||
|
||||
QPushButton#TogglableStatusBarButton {
|
||||
min-width: 0px;
|
||||
color: #656565;
|
||||
border: 1px solid transparent;
|
||||
background-color: transparent;
|
||||
padding: 0px 3px 0px 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
QPushButton#TogglableStatusBarButton:checked {
|
||||
color: #00FF00;
|
||||
}
|
||||
|
||||
QPushButton#TogglableStatusBarButton:hover {
|
||||
border: 1px solid #76797C;
|
||||
}
|
||||
|
||||
QToolTip {
|
||||
border: 1px solid #76797C;
|
||||
background-color: #5A7566;
|
||||
|
|
|
@ -54,8 +54,11 @@ const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> Config:
|
|||
// This must be in alphabetical order according to action name as it must have the same order as
|
||||
// UISetting::values.shortcuts, which is alphabetically ordered.
|
||||
// clang-format off
|
||||
const std::array<UISettings::Shortcut, 28> Config::default_hotkeys {{
|
||||
const std::array<UISettings::Shortcut, 30> Config::default_hotkeys {{
|
||||
{QStringLiteral("Advance Frame"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::ApplicationShortcut}},
|
||||
{QStringLiteral("Audio Mute/Unmute"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Audio Volume Down"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Audio Volume Up"), QStringLiteral("Main Window"), {QStringLiteral(""), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Capture Screenshot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+P"), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Continue/Pause Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F4"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Decrease 3D Factor"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+-"), Qt::ApplicationShortcut}},
|
||||
|
@ -68,7 +71,6 @@ const std::array<UISettings::Shortcut, 28> Config::default_hotkeys {{
|
|||
{QStringLiteral("Load Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F2"), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Load File"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+O"), Qt::WidgetWithChildrenShortcut}},
|
||||
{QStringLiteral("Load from Newest Slot"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+V"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Mute Audio"), QStringLiteral("Main Window"), {QStringLiteral("Ctrl+M"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Remove Amiibo"), QStringLiteral("Main Window"), {QStringLiteral("F3"), Qt::ApplicationShortcut}},
|
||||
{QStringLiteral("Restart Emulation"), QStringLiteral("Main Window"), {QStringLiteral("F6"), Qt::WindowShortcut}},
|
||||
{QStringLiteral("Rotate Screens Upright"), QStringLiteral("Main Window"), {QStringLiteral("F8"), Qt::WindowShortcut}},
|
||||
|
|
|
@ -26,7 +26,7 @@ public:
|
|||
|
||||
static const std::array<int, Settings::NativeButton::NumButtons> default_buttons;
|
||||
static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs;
|
||||
static const std::array<UISettings::Shortcut, 28> default_hotkeys;
|
||||
static const std::array<UISettings::Shortcut, 30> default_hotkeys;
|
||||
|
||||
private:
|
||||
void Initialize(const std::string& config_name);
|
||||
|
|
|
@ -420,6 +420,38 @@ void GMainWindow::InitializeWidgets() {
|
|||
|
||||
statusBar()->insertPermanentWidget(0, graphics_api_button);
|
||||
|
||||
volume_popup = new QWidget(this);
|
||||
volume_popup->setWindowFlags(Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::Popup);
|
||||
volume_popup->setLayout(new QVBoxLayout());
|
||||
volume_popup->setMinimumWidth(200);
|
||||
|
||||
volume_slider = new QSlider(Qt::Horizontal);
|
||||
volume_slider->setObjectName(QStringLiteral("volume_slider"));
|
||||
volume_slider->setMaximum(100);
|
||||
volume_slider->setPageStep(5);
|
||||
connect(volume_slider, &QSlider::valueChanged, this, [this](int percentage) {
|
||||
Settings::values.audio_muted = false;
|
||||
const auto value = static_cast<float>(percentage) / volume_slider->maximum();
|
||||
Settings::values.volume.SetValue(value);
|
||||
UpdateVolumeUI();
|
||||
});
|
||||
volume_popup->layout()->addWidget(volume_slider);
|
||||
|
||||
volume_button = new QPushButton();
|
||||
volume_button->setObjectName(QStringLiteral("TogglableStatusBarButton"));
|
||||
volume_button->setFocusPolicy(Qt::NoFocus);
|
||||
volume_button->setCheckable(true);
|
||||
UpdateVolumeUI();
|
||||
connect(volume_button, &QPushButton::clicked, this, [&] {
|
||||
UpdateVolumeUI();
|
||||
volume_popup->setVisible(!volume_popup->isVisible());
|
||||
QRect rect = volume_button->geometry();
|
||||
QPoint bottomLeft = statusBar()->mapToGlobal(rect.topLeft());
|
||||
bottomLeft.setY(bottomLeft.y() - volume_popup->geometry().height());
|
||||
volume_popup->setGeometry(QRect(bottomLeft, QSize(rect.width(), rect.height())));
|
||||
});
|
||||
statusBar()->insertPermanentWidget(1, volume_button);
|
||||
|
||||
statusBar()->addPermanentWidget(multiplayer_state->GetStatusText());
|
||||
statusBar()->addPermanentWidget(multiplayer_state->GetStatusIcon());
|
||||
|
||||
|
@ -672,8 +704,10 @@ void GMainWindow::InitializeHotkeys() {
|
|||
}
|
||||
UpdateStatusBar();
|
||||
});
|
||||
connect_shortcut(QStringLiteral("Mute Audio"),
|
||||
[] { Settings::values.audio_muted = !Settings::values.audio_muted; });
|
||||
|
||||
connect_shortcut(QStringLiteral("Audio Mute/Unmute"), &GMainWindow::OnMute);
|
||||
connect_shortcut(QStringLiteral("Audio Volume Down"), &GMainWindow::OnDecreaseVolume);
|
||||
connect_shortcut(QStringLiteral("Audio Volume Up"), &GMainWindow::OnIncreaseVolume);
|
||||
|
||||
// We use "static" here in order to avoid capturing by lambda due to a MSVC bug, which makes the
|
||||
// variable hold a garbage value after this function exits
|
||||
|
@ -1874,7 +1908,7 @@ void GMainWindow::OnStartGame() {
|
|||
#endif
|
||||
|
||||
UpdateSaveStates();
|
||||
UpdateAPIIndicator();
|
||||
UpdateStatusButtons();
|
||||
}
|
||||
|
||||
void GMainWindow::OnRestartGame() {
|
||||
|
@ -1911,7 +1945,7 @@ void GMainWindow::OnStopGame() {
|
|||
ShutdownGame();
|
||||
graphics_api_button->setEnabled(true);
|
||||
Settings::RestoreGlobalState(false);
|
||||
UpdateAPIIndicator();
|
||||
UpdateStatusButtons();
|
||||
}
|
||||
|
||||
void GMainWindow::OnLoadComplete() {
|
||||
|
@ -2152,7 +2186,7 @@ void GMainWindow::OnConfigure() {
|
|||
}
|
||||
UpdateSecondaryWindowVisibility();
|
||||
UpdateBootHomeMenuState();
|
||||
UpdateAPIIndicator();
|
||||
UpdateStatusButtons();
|
||||
} else {
|
||||
Settings::values.input_profiles = old_input_profiles;
|
||||
Settings::values.touch_from_button_maps = old_touch_from_button_maps;
|
||||
|
@ -2582,6 +2616,57 @@ void GMainWindow::ShowMouseCursor() {
|
|||
}
|
||||
}
|
||||
|
||||
void GMainWindow::OnMute() {
|
||||
Settings::values.audio_muted = !Settings::values.audio_muted;
|
||||
UpdateVolumeUI();
|
||||
}
|
||||
|
||||
void GMainWindow::OnDecreaseVolume() {
|
||||
Settings::values.audio_muted = false;
|
||||
const auto current_volume =
|
||||
static_cast<s32>(Settings::values.volume.GetValue() * volume_slider->maximum());
|
||||
int step = 5;
|
||||
if (current_volume <= 30) {
|
||||
step = 2;
|
||||
}
|
||||
if (current_volume <= 6) {
|
||||
step = 1;
|
||||
}
|
||||
const auto value =
|
||||
static_cast<float>(std::max(current_volume - step, 0)) / volume_slider->maximum();
|
||||
Settings::values.volume.SetValue(value);
|
||||
UpdateVolumeUI();
|
||||
}
|
||||
|
||||
void GMainWindow::OnIncreaseVolume() {
|
||||
Settings::values.audio_muted = false;
|
||||
const auto current_volume =
|
||||
static_cast<s32>(Settings::values.volume.GetValue() * volume_slider->maximum());
|
||||
int step = 5;
|
||||
if (current_volume < 30) {
|
||||
step = 2;
|
||||
}
|
||||
if (current_volume < 6) {
|
||||
step = 1;
|
||||
}
|
||||
const auto value = static_cast<float>(current_volume + step) / volume_slider->maximum();
|
||||
Settings::values.volume.SetValue(value);
|
||||
UpdateVolumeUI();
|
||||
}
|
||||
|
||||
void GMainWindow::UpdateVolumeUI() {
|
||||
const auto volume_value =
|
||||
static_cast<int>(Settings::values.volume.GetValue() * volume_slider->maximum());
|
||||
volume_slider->setValue(volume_value);
|
||||
if (Settings::values.audio_muted) {
|
||||
volume_button->setChecked(false);
|
||||
volume_button->setText(tr("VOLUME: MUTE"));
|
||||
} else {
|
||||
volume_button->setChecked(true);
|
||||
volume_button->setText(tr("VOLUME: %1%", "Volume percentage (e.g. 50%)").arg(volume_value));
|
||||
}
|
||||
}
|
||||
|
||||
void GMainWindow::UpdateAPIIndicator(bool update) {
|
||||
static std::array graphics_apis = {QStringLiteral("SOFTWARE"), QStringLiteral("OPENGL"),
|
||||
QStringLiteral("VULKAN")};
|
||||
|
@ -2602,6 +2687,11 @@ void GMainWindow::UpdateAPIIndicator(bool update) {
|
|||
graphics_api_button->setStyleSheet(style_sheet);
|
||||
}
|
||||
|
||||
void GMainWindow::UpdateStatusButtons() {
|
||||
UpdateAPIIndicator();
|
||||
UpdateVolumeUI();
|
||||
}
|
||||
|
||||
void GMainWindow::OnMouseActivity() {
|
||||
ShowMouseCursor();
|
||||
}
|
||||
|
@ -2903,6 +2993,8 @@ void GMainWindow::OpenPerGameConfiguration(u64 title_id, const QString& file_nam
|
|||
if (!is_powered_on) {
|
||||
config->Save();
|
||||
}
|
||||
|
||||
UpdateStatusButtons();
|
||||
}
|
||||
|
||||
void GMainWindow::OnMoviePlaybackCompleted() {
|
||||
|
|
|
@ -267,6 +267,10 @@ private slots:
|
|||
void OnLanguageChanged(const QString& locale);
|
||||
void OnMouseActivity();
|
||||
|
||||
void OnDecreaseVolume();
|
||||
void OnIncreaseVolume();
|
||||
void OnMute();
|
||||
|
||||
private:
|
||||
Q_INVOKABLE void OnMoviePlaybackCompleted();
|
||||
void UpdateStatusBar();
|
||||
|
@ -279,7 +283,9 @@ private:
|
|||
void HideMouseCursor();
|
||||
void ShowMouseCursor();
|
||||
void OpenPerGameConfiguration(u64 title_id, const QString& file_name);
|
||||
void UpdateVolumeUI();
|
||||
void UpdateAPIIndicator(bool update = false);
|
||||
void UpdateStatusButtons();
|
||||
#ifdef __unix__
|
||||
void SetGamemodeEnabled(bool state);
|
||||
#endif
|
||||
|
@ -301,6 +307,9 @@ private:
|
|||
QLabel* game_fps_label = nullptr;
|
||||
QLabel* emu_frametime_label = nullptr;
|
||||
QPushButton* graphics_api_button = nullptr;
|
||||
QPushButton* volume_button = nullptr;
|
||||
QWidget* volume_popup = nullptr;
|
||||
QSlider* volume_slider = nullptr;
|
||||
QTimer status_bar_update_timer;
|
||||
bool message_label_used_for_movie = false;
|
||||
|
||||
|
|
Reference in New Issue