summaryrefslogtreecommitdiffstats
path: root/kmix/kmixtoolbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmix/kmixtoolbox.cpp')
-rw-r--r--kmix/kmixtoolbox.cpp215
1 files changed, 215 insertions, 0 deletions
diff --git a/kmix/kmixtoolbox.cpp b/kmix/kmixtoolbox.cpp
new file mode 100644
index 00000000..06a6ed36
--- /dev/null
+++ b/kmix/kmixtoolbox.cpp
@@ -0,0 +1,215 @@
+/*
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#include "qcolor.h"
+#include "qwidget.h"
+#include "qstring.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(QPtrList<QWidget> &mdws, bool on ) {
+ for ( QWidget *qmdw=mdws.first(); qmdw!=0; qmdw=mdws.next() ) {
+ if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
+ static_cast<MixDeviceWidget*>(qmdw)->setIcons( on );
+ }
+ }
+}
+
+void KMixToolBox::setLabels(QPtrList<QWidget> &mdws, bool on ) {
+ QWidget *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(QPtrList<QWidget> &mdws, bool on ) {
+ QWidget *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(QPtrList<QWidget> &mdws, int vs ) {
+ QWidget *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(QPtrList<QWidget> &mdws, KConfig *config, const QString &grp, const QString &viewPrefix) {
+ int n = 0;
+ config->setGroup( grp );
+ int num = config->readNumEntry( viewPrefix + ".Devs", 0);
+
+ for ( QWidget *qmdw=mdws.first(); qmdw!=0 && n<num; qmdw=mdws.next() ) {
+ if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
+ MixDeviceWidget* mdw = static_cast<MixDeviceWidget*>(qmdw);
+ QString 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.
+ */
+ QString 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 )
+ {
+ QString 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(QPtrList<QWidget> &mdws, KConfig *config, const QString &grp, const QString &viewPrefix) {
+ config->setGroup( grp );
+ config->writeEntry( viewPrefix + ".Devs", mdws.count() );
+
+ int n=0;
+ for ( QWidget *qmdw=mdws.first(); qmdw!=0; qmdw=mdws.next() ) {
+ if ( qmdw->inherits("MixDeviceWidget") ) { // -<- play safe here
+ MixDeviceWidget* mdw = static_cast<MixDeviceWidget*>(qmdw);
+
+ QString 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) {
+ QString 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
+}
+