From b53290344b358380b40d273f3c9dc0f31fdf13ef Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sat, 22 Jul 2023 22:55:02 +0200 Subject: [PATCH] Adjust most audio driver settings dialogs Adjust the dialogs of most audio driver settings dialogs by showing them in a QGroupBox and adjusting their layouts. All dialogs now use `QFormLayout` to layout their labels and input widgets. Technical details ------------------ Introduce `AudioDeviceSetupGroupWidget` which is intended to functionally replace `AudioDeviceSetupWidget` in the long run. This is likely a temporary replacement in the sense that `AudioDeviceSetupGroupWidget` will be renamed to `AudioDeviceSetupWidget` once the latter has been replaced everywhere. Both classes are very similar and the only difference is that the former inherits from `QGroupBox` instead of `TabWidget`. Adjust the using of AswMap so that it is now defined as a map from `QString` to `AudioDeviceSetupGroupWidget`. Use `QFormLayout` to layout the widgets of the setup dialogs instead of hard coding geometries and placement. TODOs ------ Adjust the widgets for the SoundIO and SndIo cases. These will be a bit more effort as they are not compiled on my machine. --- include/AudioAlsaSetupWidget.h | 4 +- include/AudioDeviceSetupGroupWidget.h | 49 +++++++++++++++++++++++++ include/AudioDummy.h | 6 +-- include/AudioJack.h | 4 +- include/AudioOss.h | 4 +- include/AudioPortAudio.h | 4 +- include/AudioPulseAudio.h | 4 +- include/AudioSdl.h | 4 +- include/SetupDialog.h | 4 +- src/core/audio/AudioJack.cpp | 15 ++++---- src/core/audio/AudioOss.cpp | 16 ++++---- src/core/audio/AudioPortAudio.cpp | 20 ++++------ src/core/audio/AudioPulseAudio.cpp | 19 ++++------ src/core/audio/AudioSdl.cpp | 12 +++--- src/gui/AudioAlsaSetupWidget.cpp | 14 +++---- src/gui/AudioDeviceSetupGroupWidget.cpp | 42 +++++++++++++++++++++ src/gui/CMakeLists.txt | 1 + src/gui/modals/SetupDialog.cpp | 5 ++- 18 files changed, 152 insertions(+), 75 deletions(-) create mode 100644 include/AudioDeviceSetupGroupWidget.h create mode 100644 src/gui/AudioDeviceSetupGroupWidget.cpp diff --git a/include/AudioAlsaSetupWidget.h b/include/AudioAlsaSetupWidget.h index cbe99ba01..9795a3588 100644 --- a/include/AudioAlsaSetupWidget.h +++ b/include/AudioAlsaSetupWidget.h @@ -29,7 +29,7 @@ #ifdef LMMS_HAVE_ALSA -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" #include "AudioAlsa.h" @@ -41,7 +41,7 @@ namespace lmms::gui class LcdSpinBox; -class AudioAlsaSetupWidget : public AudioDeviceSetupWidget +class AudioAlsaSetupWidget : public AudioDeviceSetupGroupWidget { Q_OBJECT diff --git a/include/AudioDeviceSetupGroupWidget.h b/include/AudioDeviceSetupGroupWidget.h new file mode 100644 index 000000000..8980d0a65 --- /dev/null +++ b/include/AudioDeviceSetupGroupWidget.h @@ -0,0 +1,49 @@ +/* + * AudioDeviceSetupGroupWidget.h - Base class for audio device setup widgets using group box + * + * Copyright (c) 2004-2015 Tobias Doerffel + * Copyright (c) 2004-2015 Michael Gregorius + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H +#define LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H + +#include + +namespace lmms::gui +{ + +class AudioDeviceSetupGroupWidget : public QGroupBox +{ + Q_OBJECT +public: + AudioDeviceSetupGroupWidget( const QString & _caption, QWidget * _parent ); + + ~AudioDeviceSetupGroupWidget() override = default; + + virtual void saveSettings() = 0; + + virtual void show(); +}; + +} // namespace lmms::gui + +#endif // LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H diff --git a/include/AudioDummy.h b/include/AudioDummy.h index e34260171..c7ac3d67f 100644 --- a/include/AudioDummy.h +++ b/include/AudioDummy.h @@ -26,7 +26,7 @@ #define LMMS_AUDIO_DUMMY_H #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" #include "AudioEngine.h" #include "MicroTimer.h" @@ -54,11 +54,11 @@ public: } - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ) : - gui::AudioDeviceSetupWidget( AudioDummy::name(), _parent ) + gui::AudioDeviceSetupGroupWidget( AudioDummy::name(), _parent ) { } diff --git a/include/AudioJack.h b/include/AudioJack.h index 2ef0f665c..4135dc5e0 100644 --- a/include/AudioJack.h +++ b/include/AudioJack.h @@ -38,7 +38,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -74,7 +74,7 @@ public: } -class setupWidget : public gui::AudioDeviceSetupWidget +class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioOss.h b/include/AudioOss.h index 55f64de85..953c72a4f 100644 --- a/include/AudioOss.h +++ b/include/AudioOss.h @@ -32,7 +32,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -61,7 +61,7 @@ public: static QString probeDevice(); -class setupWidget : public gui::AudioDeviceSetupWidget +class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioPortAudio.h b/include/AudioPortAudio.h index 01b8f3fd7..a926b1bf0 100644 --- a/include/AudioPortAudio.h +++ b/include/AudioPortAudio.h @@ -35,7 +35,7 @@ # include # include "AudioDevice.h" -# include "AudioDeviceSetupWidget.h" +# include "AudioDeviceSetupGroupWidget.h" # if defined paNeverDropInput || defined paNonInterleaved # define PORTAUDIO_V19 @@ -90,7 +90,7 @@ public: unsigned long _framesPerBuffer ); - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioPulseAudio.h b/include/AudioPulseAudio.h index b6a998274..22e47896d 100644 --- a/include/AudioPulseAudio.h +++ b/include/AudioPulseAudio.h @@ -34,7 +34,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -62,7 +62,7 @@ public: static QString probeDevice(); - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioSdl.h b/include/AudioSdl.h index 62db8b68a..5f29596a5 100644 --- a/include/AudioSdl.h +++ b/include/AudioSdl.h @@ -37,7 +37,7 @@ #endif #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -57,7 +57,7 @@ public: } - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/SetupDialog.h b/include/SetupDialog.h index a68fe89cf..7097b3206 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -29,7 +29,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" #include "lmmsconfig.h" #include "MidiClient.h" #include "MidiSetupWidget.h" @@ -166,7 +166,7 @@ private: bool m_vstAlwaysOnTop; bool m_disableAutoQuit; - using AswMap = QMap; + using AswMap = QMap; using MswMap = QMap; using trMap = QMap; diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index 222ebf10d..00024de63 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -27,8 +27,8 @@ #ifdef LMMS_HAVE_JACK #include -#include #include +#include #include "Engine.h" #include "GuiApplication.h" @@ -452,19 +452,18 @@ void AudioJack::shutdownCallback( void * _udata ) AudioJack::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioJack::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioJack::name(), _parent ) { + QFormLayout * form = new QFormLayout(this); + QString cn = ConfigManager::inst()->value( "audiojack", "clientname" ); if( cn.isEmpty() ) { cn = "lmms"; } m_clientName = new QLineEdit( cn, this ); - m_clientName->setGeometry( 10, 20, 160, 20 ); - auto cn_lbl = new QLabel(tr("Client name"), this); - cn_lbl->setFont( pointSize<7>( cn_lbl->font() ) ); - cn_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Client name"), m_clientName); auto m = new gui::LcdSpinBoxModel(/* this */); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -474,8 +473,8 @@ AudioJack::setupWidget::setupWidget( QWidget * _parent ) : m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + + form->addRow(tr("Channels"), m_channels); } diff --git a/src/core/audio/AudioOss.cpp b/src/core/audio/AudioOss.cpp index 5166bad79..5e0a8fc89 100644 --- a/src/core/audio/AudioOss.cpp +++ b/src/core/audio/AudioOss.cpp @@ -27,7 +27,7 @@ #ifdef LMMS_HAVE_OSS #include -#include +#include > #include #include "endian_handling.h" @@ -318,14 +318,13 @@ void AudioOss::run() AudioOss::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioOss::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioOss::name(), _parent ) { - m_device = new QLineEdit( probeDevice(), this ); - m_device->setGeometry( 10, 20, 160, 20 ); + QFormLayout * form = new QFormLayout(this); - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + m_device = new QLineEdit( probeDevice(), this ); + + form->addRow(tr("Device"), m_device); auto m = new gui::LcdSpinBoxModel(/* this */); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -335,9 +334,8 @@ AudioOss::setupWidget::setupWidget( QWidget * _parent ) : m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/core/audio/AudioPortAudio.cpp b/src/core/audio/AudioPortAudio.cpp index 0f5a4122f..cb0e4616c 100644 --- a/src/core/audio/AudioPortAudio.cpp +++ b/src/core/audio/AudioPortAudio.cpp @@ -49,7 +49,7 @@ void AudioPortAudioSetupUtil::updateChannels() #ifdef LMMS_HAVE_PORTAUDIO -#include +#include #include "Engine.h" #include "ConfigManager.h" @@ -415,23 +415,17 @@ void AudioPortAudioSetupUtil::updateChannels() AudioPortAudio::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioPortAudio::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioPortAudio::name(), _parent ) { using gui::ComboBox; - m_backend = new ComboBox( this, "BACKEND" ); - m_backend->setGeometry( 64, 15, 260, ComboBox::DEFAULT_HEIGHT ); + QFormLayout * form = new QFormLayout(this); - auto backend_lbl = new QLabel(tr("Backend"), this); - backend_lbl->setFont( pointSize<7>( backend_lbl->font() ) ); - backend_lbl->move( 8, 18 ); + m_backend = new ComboBox( this, "BACKEND" ); + form->addRow(tr("Backend"), m_backend); m_device = new ComboBox( this, "DEVICE" ); - m_device->setGeometry( 64, 35, 260, ComboBox::DEFAULT_HEIGHT ); - - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->move( 8, 38 ); + form->addRow(tr("Device"), m_device); /* LcdSpinBoxModel * m = new LcdSpinBoxModel( ); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -505,7 +499,7 @@ void AudioPortAudio::setupWidget::show() m_setupUtil.m_deviceModel.setValue( i ); } - AudioDeviceSetupWidget::show(); + AudioDeviceSetupGroupWidget::show(); } } // namespace lmms diff --git a/src/core/audio/AudioPulseAudio.cpp b/src/core/audio/AudioPulseAudio.cpp index bac997075..24913c60f 100644 --- a/src/core/audio/AudioPulseAudio.cpp +++ b/src/core/audio/AudioPulseAudio.cpp @@ -23,7 +23,7 @@ */ #include -#include +#include #include "AudioPulseAudio.h" @@ -310,26 +310,23 @@ void AudioPulseAudio::signalConnected( bool connected ) AudioPulseAudio::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioPulseAudio::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioPulseAudio::name(), _parent ) { + QFormLayout * form = new QFormLayout(this); + m_device = new QLineEdit( AudioPulseAudio::probeDevice(), this ); - m_device->setGeometry( 10, 20, 160, 20 ); + form->addRow(tr("Device"), m_device); - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); - - auto m = new gui::LcdSpinBoxModel(/* this */); + auto m = new gui::LcdSpinBoxModel(); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); m->setStep( 2 ); m->setValue( ConfigManager::inst()->value( "audiopa", - "channels" ).toInt() ); + "channels" ).toInt() ); m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/core/audio/AudioSdl.cpp b/src/core/audio/AudioSdl.cpp index e73ccadc1..071877f0d 100644 --- a/src/core/audio/AudioSdl.cpp +++ b/src/core/audio/AudioSdl.cpp @@ -26,7 +26,7 @@ #ifdef LMMS_HAVE_SDL -#include +#include > #include #include @@ -325,16 +325,14 @@ void AudioSdl::sdlInputAudioCallback(Uint8 *_buf, int _len) { #endif AudioSdl::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioSdl::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioSdl::name(), _parent ) { + QFormLayout * form = new QFormLayout(this); + QString dev = ConfigManager::inst()->value( "audiosdl", "device" ); m_device = new QLineEdit( dev, this ); - m_device->setGeometry( 10, 20, 160, 20 ); - - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Device"), m_device); } diff --git a/src/gui/AudioAlsaSetupWidget.cpp b/src/gui/AudioAlsaSetupWidget.cpp index 4ea6d4c58..015f4e8ad 100644 --- a/src/gui/AudioAlsaSetupWidget.cpp +++ b/src/gui/AudioAlsaSetupWidget.cpp @@ -23,7 +23,7 @@ */ #include -#include +#include #include "AudioAlsaSetupWidget.h" @@ -37,9 +37,11 @@ namespace lmms::gui { AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioAlsa::name(), _parent ), + AudioDeviceSetupGroupWidget( AudioAlsa::name(), _parent ), m_selectedDevice(-1) { + QFormLayout * form = new QFormLayout(this); + m_deviceInfos = AudioAlsa::getAvailableDevices(); QString deviceText = ConfigManager::inst()->value( "audioalsa", "device" ); @@ -62,14 +64,11 @@ AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : m_selectedDevice = m_deviceComboBox->currentIndex(); - m_deviceComboBox->setGeometry( 10, 20, 160, 20 ); connect(m_deviceComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onCurrentIndexChanged(int))); - auto dev_lbl = new QLabel(tr("DEVICE"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Device"), m_deviceComboBox); auto m = new LcdSpinBoxModel(/* this */); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -79,9 +78,8 @@ AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : m_channels = new LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "CHANNELS" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/gui/AudioDeviceSetupGroupWidget.cpp b/src/gui/AudioDeviceSetupGroupWidget.cpp new file mode 100644 index 000000000..f84c8bb8b --- /dev/null +++ b/src/gui/AudioDeviceSetupGroupWidget.cpp @@ -0,0 +1,42 @@ +/* + * AudioDeviceSetupGroupWidget.cpp - Base class for audio device setup widgets using group box + * + * Copyright (c) 2004-2015 Tobias Doerffel + * Copyright (c) 2004-2015 Michael Gregorius + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "AudioDeviceSetupGroupWidget.h" + +namespace lmms::gui +{ + +AudioDeviceSetupGroupWidget::AudioDeviceSetupGroupWidget(const QString & caption, QWidget * parent) : + QGroupBox(QGroupBox::tr("Settings for %1").arg(tr(caption.toUtf8())), parent) +{ +} + +void AudioDeviceSetupGroupWidget::show() +{ + parentWidget()->show(); + QWidget::show(); +} + +} // namespace lmms::gui diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 9f940c035..3ae16c573 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -3,6 +3,7 @@ SET(LMMS_SRCS gui/ActionGroup.cpp gui/AudioAlsaSetupWidget.cpp gui/AudioDeviceSetupWidget.cpp + gui/AudioDeviceSetupGroupWidget.cpp gui/AutomatableModelView.cpp gui/ControlLayout.cpp gui/ControllerDialog.cpp diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 0565b8238..d1375c033 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -466,7 +466,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Ifaces-settings-widget. auto as_w = new QWidget(audio_w); - as_w->setFixedHeight(60); auto as_w_layout = new QHBoxLayout(as_w); as_w_layout->setSpacing(0); @@ -492,6 +491,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : new AudioPortAudio::setupWidget(as_w); #endif +// TODO !!! #ifdef LMMS_HAVE_SOUNDIO m_audioIfaceSetupWidgets[AudioSoundIo::name()] = new AudioSoundIo::setupWidget(as_w); @@ -507,6 +507,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : new AudioOss::setupWidget(as_w); #endif +// TODO !!! #ifdef LMMS_HAVE_SNDIO m_audioIfaceSetupWidgets[AudioSndio::name()] = new AudioSndio::setupWidget(as_w); @@ -520,7 +521,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : it != m_audioIfaceSetupWidgets.end(); ++it) { m_audioIfaceNames[ - AudioDeviceSetupWidget::tr(it.key().toUtf8())] = it.key(); + AudioDeviceSetupGroupWidget::tr(it.key().toUtf8())] = it.key(); } for(trMap::iterator it = m_audioIfaceNames.begin(); it != m_audioIfaceNames.end(); ++it)