From e2de64d6f1beb9e492daf5b886e19933c1fa41dd Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdemultimedia@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kmix/dialogselectmaster.cpp | 197 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 kmix/dialogselectmaster.cpp (limited to 'kmix/dialogselectmaster.cpp') diff --git a/kmix/dialogselectmaster.cpp b/kmix/dialogselectmaster.cpp new file mode 100644 index 00000000..44f38626 --- /dev/null +++ b/kmix/dialogselectmaster.cpp @@ -0,0 +1,197 @@ +/* + * KMix -- KDE's full featured mini mixer + * + * + * Copyright (C) 1996-2004 Christian Esken + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "dialogselectmaster.h" +#include "mixdevice.h" +#include "mixer.h" + +DialogSelectMaster::DialogSelectMaster( Mixer *mixer ) + : KDialogBase( Plain, i18n( "Select Master Channel" ), Ok|Cancel, Ok ) +{ + _layout = 0; + m_vboxForScrollView = 0; + createWidgets(mixer); // Open with Mixer Hardware #0 + +} + +DialogSelectMaster::~DialogSelectMaster() +{ + delete _layout; + delete m_vboxForScrollView; +} + +/** + * Create basic widgets of the Dialog. + */ +void DialogSelectMaster::createWidgets(Mixer *ptr_mixer) +{ + QFrame *m_mainFrame = plainPage(); + _layout = new QVBoxLayout(m_mainFrame,0,-1, "_layout" ); + + if ( Mixer::mixers().count() > 1 ) { + //kdDebug(67100) << "DialogSelectMaster::createPage count()>1" << "\n"; + // More than one Mixer => show Combo-Box to select Mixer + // Mixer widget line + QHBoxLayout* mixerNameLayout = new QHBoxLayout( _layout ); + //widgetsLayout->setStretchFactor( mixerNameLayout, 0 ); + //QSizePolicy qsp( QSizePolicy::Ignored, QSizePolicy::Maximum); + //mixerNameLayout->setSizePolicy(qsp); + mixerNameLayout->setSpacing(KDialog::spacingHint()); + + QLabel *qlbl = new QLabel( i18n("Current Mixer"), m_mainFrame ); + mixerNameLayout->addWidget(qlbl); + qlbl->setFixedHeight(qlbl->sizeHint().height()); + + m_cMixer = new KComboBox( FALSE, m_mainFrame, "mixerCombo" ); + m_cMixer->setFixedHeight(m_cMixer->sizeHint().height()); + connect( m_cMixer, SIGNAL( activated( int ) ), this, SLOT( createPageByID( int ) ) ); + + //int id=1; + for ( Mixer *mixer = Mixer::mixers().first(); mixer !=0; mixer = Mixer::mixers().next() ) { + m_cMixer->insertItem( mixer->mixerName() ); + if ( ptr_mixer == mixer ) { + // Make the current Mixer the current item in the ComboBos + m_cMixer->setCurrentItem( m_cMixer->count()-1 ); + } + //id++; + } // end for all_Mixers + + QToolTip::add( m_cMixer, i18n("Current mixer" ) ); + mixerNameLayout->addWidget(m_cMixer); + + } // end if (more_than_1_Mixer) + + QLabel *qlbl = new QLabel( i18n("Select the channel representing the master volume:"), m_mainFrame ); + _layout->addWidget(qlbl); + + m_scrollableChannelSelector = new QScrollView(m_mainFrame, "scrollableChannelSelector"); + m_scrollableChannelSelector->viewport()->setBackgroundMode(Qt::PaletteBackground); + _layout->add(m_scrollableChannelSelector); + + m_buttonGroupForScrollView = new QButtonGroup(this); // invisible QButtonGroup + m_buttonGroupForScrollView->hide(); + + createPage(ptr_mixer); + connect( this, SIGNAL(okClicked()) , this, SLOT(apply()) ); +} + +/** + * Create RadioButton's for the Mixer with number 'mixerId'. + * @par mixerId The Mixer, for which the RadioButton's should be created. + */ +void DialogSelectMaster::createPageByID(int mixerId) +{ + //kdDebug(67100) << "DialogSelectMaster::createPage()" << endl; + Mixer *mixer = Mixer::mixers().at(mixerId); + if ( mixer == 0 ) { + kdError(67100) << "DialogSelectMaster::createPage(): Invalid Mixer (mixerID=" << mixerId << ")" << endl; + return; // can not happen + } + createPage(mixer); +} + +/** + * Create RadioButton's for the Mixer with number 'mixerId'. + * @par mixerId The Mixer, for which the RadioButton's should be created. + */ +void DialogSelectMaster::createPage(Mixer* mixer) +{ + + /** --- Reset page ----------------------------------------------- + * In case the user selected a new Mixer via m_cMixer, we need + * to remove the stuff created on the last call. + */ + // delete the VBox. This should automatically remove all contained QRadioButton's. + delete m_vboxForScrollView; + m_mixerPKs.clear(); + /** Reset page end -------------------------------------------------- */ + + m_vboxForScrollView = new QVBox(m_scrollableChannelSelector->viewport()); + m_scrollableChannelSelector->addChild(m_vboxForScrollView); + + QString masterKey = "----noMaster---"; // Use a non-matching name as default + MixDevice* master = mixer->masterDevice(); + if ( master != 0 ) masterKey = master->getPK(); + + const MixSet& mixset = mixer->getMixSet(); + MixSet& mset = const_cast(mixset); + for( MixDevice* md = mset.first(); md != 0; md = mset.next() ) + { + // Create a RadioButton for each MixDevice (excluding Enum's) + if ( ! md->isEnum() && ! md->isSwitch() ) { + //kdDebug(67100) << "DialogSelectMaster::createPage() mset append qrb" << endl; + QString mdName = md->name(); + mdName.replace('&', "&&"); // Quoting the '&' needed, to prevent QRadioButton creating an accelerator + QRadioButton* qrb = new QRadioButton( mdName, m_vboxForScrollView); + m_buttonGroupForScrollView->insert(qrb); //(qrb, md->num()); + //_qEnabledCB.append(qrb); + m_mixerPKs.push_back(md->getPK()); + if ( md->getPK() == masterKey ) { + qrb->setChecked(true); // preselect the current master + } + else { + qrb->setChecked(false); + } + } + } + + m_vboxForScrollView->show(); // show() is neccesary starting with the second call to createPage() +} + + +void DialogSelectMaster::apply() +{ + int soundcard_id = 0; + if ( Mixer::mixers().count() > 1 ) { + soundcard_id = m_cMixer->currentItem(); + } + int channel_id = m_buttonGroupForScrollView->selectedId(); + if ( channel_id != -1 ) { + // A channel was selected by the user => emit the "newMasterSelected()" signal + //kdDebug(67100) << "DialogSelectMaster::apply(): card=" << soundcard_id << ", channel=" << channel_id << endl; + Mixer *mixer = Mixer::mixers().at(soundcard_id); + if ( mixer == 0 ) { + kdError(67100) << "DialogSelectMaster::createPage(): Invalid Mixer (mixerID=" << soundcard_id << ")" << endl; + return; // can not happen + } + else { + mixer->setMasterDevice( m_mixerPKs[channel_id] ); + emit newMasterSelected(soundcard_id, m_mixerPKs[channel_id] ); + } + } +} + +#include "dialogselectmaster.moc" + -- cgit v1.2.1