~ubuntu-branches/ubuntu/natty/kdemultimedia/natty-proposed

« back to all changes in this revision

Viewing changes to kmix/gui/dialogselectmaster.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Debian Qt/KDE Maintainers
  • Date: 2011-05-26 02:41:36 UTC
  • mfrom: (0.2.3 upstream)
  • mto: This revision was merged to the branch mainline in revision 108.
  • Revision ID: james.westby@ubuntu.com-20110526024136-jjwsigfy402jhupm
Tags: upstream-4.6.3
ImportĀ upstreamĀ versionĀ 4.6.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * KMix -- KDE's full featured mini mixer
 
3
 *
 
4
 *
 
5
 * Copyright (C) 1996-2004 Christian Esken <esken@kde.org>
 
6
 *
 
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.
 
11
 *
 
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.
 
16
 *
 
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.
 
20
 */
 
21
 
 
22
#include <qbuttongroup.h>
 
23
#include <QLabel>
 
24
#include <qradiobutton.h>
 
25
#include <qscrollarea.h>
 
26
#include <QVBoxLayout>
 
27
#include <QHBoxLayout>
 
28
 
 
29
#include <kcombobox.h>
 
30
#include <kdebug.h>
 
31
#include <klocale.h>
 
32
 
 
33
#include "gui/dialogselectmaster.h"
 
34
#include "core/mixdevice.h"
 
35
#include "core/mixer.h"
 
36
 
 
37
DialogSelectMaster::DialogSelectMaster( Mixer *mixer  )
 
38
  : KDialog(  0 )
 
39
{
 
40
    setCaption( i18n( "Select Master Channel" ) );
 
41
    if ( Mixer::mixers().count() > 0 )
 
42
        setButtons( Ok|Cancel );
 
43
    else {
 
44
        setButtons( Cancel );
 
45
    }
 
46
    setDefaultButton( Ok );
 
47
   _layout = 0;
 
48
   m_vboxForScrollView = 0;
 
49
   m_scrollableChannelSelector = 0;
 
50
   m_buttonGroupForScrollView = 0;
 
51
   createWidgets(mixer);  // Open with Mixer Hardware #0
 
52
 
 
53
}
 
54
 
 
55
DialogSelectMaster::~DialogSelectMaster()
 
56
{
 
57
   delete _layout;
 
58
   delete m_vboxForScrollView;
 
59
}
 
60
 
 
61
/**
 
62
 * Create basic widgets of the Dialog.
 
63
 */
 
64
void DialogSelectMaster::createWidgets(Mixer *ptr_mixer)
 
65
{
 
66
    m_mainFrame = new QFrame( this );
 
67
    setMainWidget( m_mainFrame );
 
68
    _layout = new QVBoxLayout(m_mainFrame);
 
69
    _layout->setMargin(0);
 
70
 
 
71
    if ( Mixer::mixers().count() > 1 ) {
 
72
        // More than one Mixer => show Combo-Box to select Mixer
 
73
        // Mixer widget line
 
74
        QHBoxLayout* mixerNameLayout = new QHBoxLayout();
 
75
        _layout->addItem( mixerNameLayout );
 
76
        mixerNameLayout->setSpacing(KDialog::spacingHint());
 
77
    
 
78
        QLabel *qlbl = new QLabel( i18n("Current mixer:"), m_mainFrame );
 
79
        mixerNameLayout->addWidget(qlbl);
 
80
        qlbl->setFixedHeight(qlbl->sizeHint().height());
 
81
    
 
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 ) ) );
 
86
 
 
87
        for( int i =0; i<Mixer::mixers().count(); i++ )
 
88
        {
 
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 );
 
95
        
 
96
    
 
97
        m_cMixer->setToolTip( i18n("Current mixer" ) );
 
98
        mixerNameLayout->addWidget(m_cMixer);
 
99
    
 
100
    } // end if (more_than_1_Mixer)
 
101
 
 
102
    
 
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);
 
106
    
 
107
        createPage(ptr_mixer);
 
108
        connect( this, SIGNAL(okClicked())   , this, SLOT(apply()) );
 
109
    }
 
110
    else {
 
111
        QLabel *qlbl = new QLabel( i18n("No sound card is installed or currently plugged in."), m_mainFrame );
 
112
        _layout->addWidget(qlbl);
 
113
    }
 
114
}
 
115
 
 
116
/**
 
117
 * Create RadioButton's for the Mixer with number 'mixerId'.
 
118
 * @par mixerId The Mixer, for which the RadioButton's should be created.
 
119
 */
 
120
void DialogSelectMaster::createPageByID(int mixerId)
 
121
{
 
122
  //kDebug(67100) << "DialogSelectMaster::createPage()";
 
123
    QString selectedMixerName = m_cMixer->itemText(mixerId);
 
124
    for( int i =0; i<Mixer::mixers().count(); i++ )
 
125
    {
 
126
        Mixer *mixer = (Mixer::mixers())[i];
 
127
        if ( mixer->readableName() == selectedMixerName ) {
 
128
            createPage(mixer);
 
129
            break;
 
130
        }
 
131
    } // for
 
132
}
 
133
 
 
134
/**
 
135
 * Create RadioButton's for the Mixer with number 'mixerId'.
 
136
 * @par mixerId The Mixer, for which the RadioButton's should be created.
 
137
 */
 
138
void DialogSelectMaster::createPage(Mixer* mixer)
 
139
{
 
140
 
 
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.
 
144
     */
 
145
    // delete the VBox. This should automatically remove all contained QRadioButton's.
 
146
    delete m_vboxForScrollView;
 
147
    delete m_scrollableChannelSelector;
 
148
    delete m_buttonGroupForScrollView;
 
149
    
 
150
    /** Reset page end -------------------------------------------------- */
 
151
    
 
152
    m_buttonGroupForScrollView = new QButtonGroup(this); // invisible QButtonGroup
 
153
    //m_buttonGroupForScrollView->hide();
 
154
 
 
155
    m_scrollableChannelSelector = new QScrollArea(m_mainFrame);
 
156
//    m_scrollableChannelSelector->viewport()->setBackgroundRole(QPalette::Background);
 
157
    _layout->addWidget(m_scrollableChannelSelector);
 
158
 
 
159
    m_vboxForScrollView = new KVBox(); //m_scrollableChannelSelector->viewport()
 
160
 
 
161
    QString masterKey = "----noMaster---";  // Use a non-matching name as default
 
162
    MixDevice* master = mixer->getLocalMasterMD();
 
163
    if ( master != 0 ) masterKey = master->id();
 
164
 
 
165
    const MixSet& mixset = mixer->getMixSet();
 
166
    MixSet& mset = const_cast<MixSet&>(mixset);
 
167
    for( int i=0; i< mset.count(); ++i )
 
168
    {
 
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
 
182
            }
 
183
            else {
 
184
                qrb->setChecked(false);
 
185
            }
 
186
        }
 
187
    }
 
188
 
 
189
    m_scrollableChannelSelector->setWidget(m_vboxForScrollView);
 
190
    m_vboxForScrollView->show();  // show() is necessary starting with the second call to createPage()
 
191
}
 
192
 
 
193
 
 
194
void DialogSelectMaster::apply()
 
195
{
 
196
    Mixer *mixer = 0;
 
197
    if ( Mixer::mixers().count() == 1 ) {
 
198
        // only one mxier => no combo box => take first entry
 
199
        mixer = (Mixer::mixers())[0];
 
200
    }
 
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());
 
204
        
 
205
        for( int i =0; i<Mixer::mixers().count(); i++ )
 
206
        {
 
207
            mixer = (Mixer::mixers())[i];
 
208
            if ( mixer->readableName() == selectedMixerName ) {
 
209
                mixer = (Mixer::mixers())[i];
 
210
                break;
 
211
            }
 
212
        } // for
 
213
    }
 
214
   
 
215
    QAbstractButton* button =  m_buttonGroupForScrollView->checkedButton();
 
216
    if ( button != 0 ) {
 
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;
 
220
      if ( mixer == 0 ) {
 
221
         kError(67100) << "DialogSelectMaster::createPage(): Invalid Mixer (mixer=0)" << endl;
 
222
         return; // can not happen
 
223
      }
 
224
      else {
 
225
          mixer->setLocalMasterMD( control_id );
 
226
          Mixer::setGlobalMaster(mixer->id(), control_id);
 
227
          emit newMasterSelected( mixer->id(), control_id );
 
228
      }
 
229
   }
 
230
}
 
231
 
 
232
#include "dialogselectmaster.moc"
 
233