2
* KMix -- KDE's full featured mini mixer
5
* Copyright (C) 1996-2004 Christian Esken <esken@kde.org>
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Library General Public
9
* License as published by the Free Software Foundation; either
10
* version 2 of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Library General Public License for more details.
17
* You should have received a copy of the GNU Library General Public
18
* License along with this program; if not, write to the Free
19
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
#include <qbuttongroup.h>
24
#include <qradiobutton.h>
25
#include <qscrollarea.h>
26
#include <QVBoxLayout>
27
#include <QHBoxLayout>
29
#include <kcombobox.h>
33
#include "gui/dialogselectmaster.h"
34
#include "core/mixdevice.h"
35
#include "core/mixer.h"
37
DialogSelectMaster::DialogSelectMaster( Mixer *mixer )
40
setCaption( i18n( "Select Master Channel" ) );
41
if ( Mixer::mixers().count() > 0 )
42
setButtons( Ok|Cancel );
46
setDefaultButton( Ok );
48
m_vboxForScrollView = 0;
49
m_scrollableChannelSelector = 0;
50
m_buttonGroupForScrollView = 0;
51
createWidgets(mixer); // Open with Mixer Hardware #0
55
DialogSelectMaster::~DialogSelectMaster()
58
delete m_vboxForScrollView;
62
* Create basic widgets of the Dialog.
64
void DialogSelectMaster::createWidgets(Mixer *ptr_mixer)
66
m_mainFrame = new QFrame( this );
67
setMainWidget( m_mainFrame );
68
_layout = new QVBoxLayout(m_mainFrame);
69
_layout->setMargin(0);
71
if ( Mixer::mixers().count() > 1 ) {
72
// More than one Mixer => show Combo-Box to select Mixer
74
QHBoxLayout* mixerNameLayout = new QHBoxLayout();
75
_layout->addItem( mixerNameLayout );
76
mixerNameLayout->setSpacing(KDialog::spacingHint());
78
QLabel *qlbl = new QLabel( i18n("Current mixer:"), m_mainFrame );
79
mixerNameLayout->addWidget(qlbl);
80
qlbl->setFixedHeight(qlbl->sizeHint().height());
82
m_cMixer = new KComboBox( false, m_mainFrame);
83
m_cMixer->setObjectName( QLatin1String( "mixerCombo" ) );
84
m_cMixer->setFixedHeight(m_cMixer->sizeHint().height());
85
connect( m_cMixer, SIGNAL( activated( int ) ), this, SLOT( createPageByID( int ) ) );
87
for( int i =0; i<Mixer::mixers().count(); i++ )
89
Mixer *mixer = (Mixer::mixers())[i];
90
m_cMixer->addItem( mixer->readableName() );
91
} // end for all_Mixers
92
// Make the current Mixer the current item in the ComboBox
93
int findIndex = m_cMixer->findText( ptr_mixer->readableName() );
94
if ( findIndex != -1 ) m_cMixer->setCurrentIndex( findIndex );
97
m_cMixer->setToolTip( i18n("Current mixer" ) );
98
mixerNameLayout->addWidget(m_cMixer);
100
} // end if (more_than_1_Mixer)
103
if ( Mixer::mixers().count() > 0 ) {
104
QLabel *qlbl = new QLabel( i18n("Select the channel representing the master volume:"), m_mainFrame );
105
_layout->addWidget(qlbl);
107
createPage(ptr_mixer);
108
connect( this, SIGNAL(okClicked()) , this, SLOT(apply()) );
111
QLabel *qlbl = new QLabel( i18n("No sound card is installed or currently plugged in."), m_mainFrame );
112
_layout->addWidget(qlbl);
117
* Create RadioButton's for the Mixer with number 'mixerId'.
118
* @par mixerId The Mixer, for which the RadioButton's should be created.
120
void DialogSelectMaster::createPageByID(int mixerId)
122
//kDebug(67100) << "DialogSelectMaster::createPage()";
123
QString selectedMixerName = m_cMixer->itemText(mixerId);
124
for( int i =0; i<Mixer::mixers().count(); i++ )
126
Mixer *mixer = (Mixer::mixers())[i];
127
if ( mixer->readableName() == selectedMixerName ) {
135
* Create RadioButton's for the Mixer with number 'mixerId'.
136
* @par mixerId The Mixer, for which the RadioButton's should be created.
138
void DialogSelectMaster::createPage(Mixer* mixer)
141
/** --- Reset page -----------------------------------------------
142
* In case the user selected a new Mixer via m_cMixer, we need
143
* to remove the stuff created on the last call.
145
// delete the VBox. This should automatically remove all contained QRadioButton's.
146
delete m_vboxForScrollView;
147
delete m_scrollableChannelSelector;
148
delete m_buttonGroupForScrollView;
150
/** Reset page end -------------------------------------------------- */
152
m_buttonGroupForScrollView = new QButtonGroup(this); // invisible QButtonGroup
153
//m_buttonGroupForScrollView->hide();
155
m_scrollableChannelSelector = new QScrollArea(m_mainFrame);
156
// m_scrollableChannelSelector->viewport()->setBackgroundRole(QPalette::Background);
157
_layout->addWidget(m_scrollableChannelSelector);
159
m_vboxForScrollView = new KVBox(); //m_scrollableChannelSelector->viewport()
161
QString masterKey = "----noMaster---"; // Use a non-matching name as default
162
MixDevice* master = mixer->getLocalMasterMD();
163
if ( master != 0 ) masterKey = master->id();
165
const MixSet& mixset = mixer->getMixSet();
166
MixSet& mset = const_cast<MixSet&>(mixset);
167
for( int i=0; i< mset.count(); ++i )
169
MixDevice* md = mset[i];
170
// Create a RadioButton for each MixDevice (excluding Enum's)
171
if ( md->playbackVolume().hasVolume() ) {
172
// kDebug(67100) << "DialogSelectMaster::createPage() mset append qrb";
173
QString mdName = md->readableName();
174
mdName.replace('&', "&&"); // Quoting the '&' needed, to prevent QRadioButton creating an accelerator
175
QRadioButton* qrb = new QRadioButton( mdName, m_vboxForScrollView);
176
qrb->setObjectName(md->id()); // The object name is used as ID here: see apply()
177
m_buttonGroupForScrollView->addButton(qrb); //(qrb, md->num());
178
//_qEnabledCB.append(qrb);
179
//m_mixerPKs.push_back(md->id());
180
if ( md->id() == masterKey ) {
181
qrb->setChecked(true); // preselect the current master
184
qrb->setChecked(false);
189
m_scrollableChannelSelector->setWidget(m_vboxForScrollView);
190
m_vboxForScrollView->show(); // show() is necessary starting with the second call to createPage()
194
void DialogSelectMaster::apply()
197
if ( Mixer::mixers().count() == 1 ) {
198
// only one mxier => no combo box => take first entry
199
mixer = (Mixer::mixers())[0];
201
else if ( Mixer::mixers().count() > 1 ) {
202
// find mixer that is currently active in the ComboBox
203
QString selectedMixerName = m_cMixer->itemText(m_cMixer->currentIndex());
205
for( int i =0; i<Mixer::mixers().count(); i++ )
207
mixer = (Mixer::mixers())[i];
208
if ( mixer->readableName() == selectedMixerName ) {
209
mixer = (Mixer::mixers())[i];
215
QAbstractButton* button = m_buttonGroupForScrollView->checkedButton();
217
QString control_id = button->objectName();
218
// A channel was selected by the user => emit the "newMasterSelected()" signal
219
//kDebug(67100) << "DialogSelectMaster::apply(): card=" << soundcard_id << ", channel=" << channel_id;
221
kError(67100) << "DialogSelectMaster::createPage(): Invalid Mixer (mixer=0)" << endl;
222
return; // can not happen
225
mixer->setLocalMasterMD( control_id );
226
Mixer::setGlobalMaster(mixer->id(), control_id);
227
emit newMasterSelected( mixer->id(), control_id );
232
#include "dialogselectmaster.moc"