You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/kmix/kmixtoolbox.cpp

216 lines
8.8 KiB

/*
* KMix -- KDE's full featured mini mixer
*
*
* Copyright (C) 2004 Christian Esken <esken@kde.org>
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "tqcolor.h"
#include "tqwidget.h"
#include "tqstring.h"
//#include <kdebug.h>
#include <kglobalaccel.h>
#include <klocale.h>
#include "mdwslider.h"
#include "mdwswitch.h"
#include "mixdevicewidget.h"
#include "mixdevice.h"
#include "mixer.h"
#include "kmixtoolbox.h"
/***********************************************************************************
KMixToolbox contains several GUI relevant methods that are shared between the
KMix Main Program, and the KMix Applet.
kmixctrl - as not non-GUI application - does NOT link to KMixToolBox.
This means: Shared GUI stuff goes into the KMixToolBox class , non-GUI stuff goes
into the MixerToolBox class.
***********************************************************************************/
void KMixToolBox::setIcons(TQPtrList<TQWidget> &mdws, bool on ) {
for ( TQWidget *qmdw=mdws.first(); qmdw!=0; qmdw=mdws.next() ) {
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
static_cast<MixDeviceWidget*>(qmdw)->setIcons( on );
}
}
}
void KMixToolBox::setLabels(TQPtrList<TQWidget> &mdws, bool on ) {
TQWidget *qmdw;
for ( qmdw=mdws.first(); qmdw != 0; qmdw=mdws.next() ) {
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
static_cast<MixDeviceWidget*>(qmdw)->setLabeled( on );
}
}
}
void KMixToolBox::setTicks(TQPtrList<TQWidget> &mdws, bool on ) {
TQWidget *qmdw;
for ( qmdw=mdws.first(); qmdw != 0; qmdw=mdws.next() ) {
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- in reality it is only in MDWSlider
static_cast<MixDeviceWidget*>(qmdw)->setTicks( on );
}
}
}
void KMixToolBox::setValueStyle(TQPtrList<TQWidget> &mdws, int vs ) {
TQWidget *qmdw;
for ( qmdw=mdws.first(); qmdw != 0; qmdw=mdws.next() ) {
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- in reality it is only in MDWSlider
static_cast<MixDeviceWidget*>(qmdw)->setValueStyle( (MixDeviceWidget::ValueStyle) vs );
}
}
}
void KMixToolBox::loadConfig(TQPtrList<TQWidget> &mdws, KConfig *config, const TQString &grp, const TQString &viewPrefix) {
int n = 0;
config->setGroup( grp );
int num = config->readNumEntry( viewPrefix + ".Devs", 0);
for ( TQWidget *qmdw=mdws.first(); qmdw!=0 && n<num; qmdw=mdws.next() ) {
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
MixDeviceWidget* mdw = static_cast<MixDeviceWidget*>(qmdw);
TQString devgrp;
/*
* Compatibility config loader! We use the old config group only, if the
* new one does not exist.
* The new group system has been introduced, because it accounts much
* better for soundcard driver updates (if numbering changes, or semantics
* of an ID changes like ALSA changing from "Disable Amplifier" to "External Amplifier").
*/
// !!! check
devgrp.sprintf( "%s.%s.Dev%s", viewPrefix.ascii(), grp.ascii(), mdw->mixDevice()->getPK().ascii() );
/**
Find an appropriate group name for capture GUI elements.
We try devgrp.append(".Capture")
If it doesn't exist, we fall back to devgrp.
This is the second compatibility measure, and was introduced for KDE3.5.2.
*/
if ( mdw->mixDevice()->getVolume().isCapture() ) {
/* A "capture" GUI element must save its own state. Otherwise playback and capture
properties would be written twice under the same name. This would mean, when
restoring, both would get the same value. This is bad, because hidden sliders will re-appear
after restart of KMix, and a lot of other nasty GUI-related problems.
So we add ".Capture" to the group name.
See bug 121451 "KMix panel applet shows broken duplicates of bass, treble sliders"
The name should have been set in the backend class, but we REALLY cannot do this for KDE3.5.x. !!
This issue will be fixed in KDE4 by the great config cleanup.
*/
TQString devgrpTmp(devgrp);
devgrpTmp.append(".Capture");
if ( config->hasGroup(devgrpTmp) ) {
// Group for capture device exists => take over the name
devgrp = devgrpTmp;
}
else {
// do nothing => keep old name (devgrp).
// Saving wil autmatically create the group 'devgrp.append(".Capture")'
kdDebug(67100) << "KMixToolBox::loadConfig() capture fallback activcated. Fallback group is " << devgrp << endl;
}
} // isCapture()
if ( ! config->hasGroup(devgrp) ) {
// fall back to old-Style configuration (KMix2.1 and earlier)
devgrp.sprintf( "%s.%s.Dev%i", viewPrefix.ascii(), grp.ascii(), n );
// this configuration group will be deleted when config is saved
}
config->setGroup( devgrp );
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- in reality it is only in MDWSlider
// only sliders have the ability to split apart in mutliple channels
bool splitChannels = config->readBoolEntry("Split", false);
mdw->setStereoLinked( !splitChannels );
}
mdw->setDisabled( !config->readBoolEntry("Show", true) );
KGlobalAccel *keys=mdw->keys();
if ( keys )
{
TQString devgrpkeys;
devgrpkeys.sprintf( "%s.%s.Dev%i.keys", viewPrefix.ascii(), grp.ascii(), n );
//kdDebug(67100) << "KMixToolBox::loadConfig() load Keys " << devgrpkeys << endl;
// please see KMixToolBox::saveConfig() for some rambling about saving/loading Keys
keys->setConfigGroup(devgrpkeys);
keys->readSettings(config);
keys->updateConnections();
}
n++;
} // if it is a MixDeviceWidget
} // for all widgets
}
void KMixToolBox::saveConfig(TQPtrList<TQWidget> &mdws, KConfig *config, const TQString &grp, const TQString &viewPrefix) {
config->setGroup( grp );
config->writeEntry( viewPrefix + ".Devs", mdws.count() );
int n=0;
for ( TQWidget *qmdw=mdws.first(); qmdw!=0; qmdw=mdws.next() ) {
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
MixDeviceWidget* mdw = static_cast<MixDeviceWidget*>(qmdw);
TQString devgrp;
devgrp.sprintf( "%s.%s.Dev%i", viewPrefix.ascii(), grp.ascii(), n );
if ( ! config->hasGroup(devgrp) ) {
// old-Style configuration (KMix2.1 and earlier => remove now unused group
config->deleteGroup(devgrp);
}
devgrp.sprintf( "%s.%s.Dev%s", viewPrefix.ascii(), grp.ascii(), mdw->mixDevice()->getPK().ascii() );
//devgrp.sprintf( "%s.%s.Dev%i", viewPrefix.ascii(), grp.ascii(), n );
if ( mdw->mixDevice()->getVolume().isCapture() ) {
/* see loadConfig() for the rationale of having an own name for capture devices. */
devgrp.append(".Capture");
} // isCapture()
config->setGroup( devgrp );
if ( qmdw->inherits("MixDeviceWidget") ) { // -<- in reality it is only in MDWSlider
// only sliders have the ability to split apart in mutliple channels
config->writeEntry( "Split", ! mdw->isStereoLinked() );
}
config->writeEntry( "Show" , ! mdw->isDisabled() );
// Save key bindings
/*
Implementation hint: Conceptually keys SHOULD be bound to the actual hardware, and not
to one GUI representation. Both work, but it COULD confuse users, if we have multiple
GUI representations (e.g. "Dock Icon" and "Main Window").
If you think about this aspect more deeply, you will find out that this is the case already
today with "kmixapplet" and "kmix main application". It would really nice to rework this.
*/
KGlobalAccel *keys=mdw->keys();
if (keys) {
TQString devgrpkeys;
devgrpkeys.sprintf( "%s.%s.Dev%i.keys", viewPrefix.ascii(), grp.ascii(), n );
//kdDebug(67100) << "KMixToolBox::saveConfig() save Keys " << devgrpkeys << endl;
keys->setConfigGroup(devgrpkeys);
keys->writeSettings(config);
}
n++;
} // if it is a MixDeviceWidget
} // for all widgets
}