diff options
Diffstat (limited to 'kmix/viewapplet.cpp')
-rw-r--r-- | kmix/viewapplet.cpp | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/kmix/viewapplet.cpp b/kmix/viewapplet.cpp new file mode 100644 index 00000000..23599190 --- /dev/null +++ b/kmix/viewapplet.cpp @@ -0,0 +1,242 @@ +/* + * KMix -- KDE's full featured mini mixer + * + * + * Copyright (C) 1996-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 "viewapplet.h" + +// Qt +#include <qwidget.h> +#include <qlayout.h> +#include <qsize.h> + +// KDE +#include <kactioncollection.h> +#include <kdebug.h> +#include <kpanelapplet.h> +#include <kstdaction.h> + +// KMix +#include "kmixtoolbox.h" +#include "mdwslider.h" +#include "mixer.h" + +ViewApplet::ViewApplet(QWidget* parent, const char* name, Mixer* mixer, ViewBase::ViewFlags vflags, KPanelApplet::Position position ) + : ViewBase(parent, name, QString::null, mixer, WStyle_Customize|WStyle_NoBorder, vflags) +{ + setBackgroundOrigin(AncestorOrigin); + // remove the menu bar action, that is put by the "ViewBase" constructor in _actions. + //KToggleAction *m = static_cast<KToggleAction*>(KStdAction::showMenubar( this, SLOT(toggleMenuBarSlot()), _actions )); + _actions->remove( KStdAction::showMenubar(this, SLOT(toggleMenuBarSlot()), _actions) ); + + + if ( position == KPanelApplet::pLeft || position == KPanelApplet::pRight ) { + //kdDebug(67100) << "ViewApplet() isVertical" << "\n"; + _viewOrientation = Qt::Vertical; + } + else { + //kdDebug(67100) << "ViewApplet() isHorizontal" << "\n"; + _viewOrientation = Qt::Horizontal; + } + + if ( _viewOrientation == Qt::Horizontal ) { + _layoutMDW = new QHBoxLayout( this ); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + } + else { + _layoutMDW = new QVBoxLayout( this ); + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + } + + + //_layoutMDW->setResizeMode(QLayout::Fixed); + init(); +} + +ViewApplet::~ViewApplet() { +} + +void ViewApplet::setMixSet(MixSet *mixset) +{ + MixDevice* md; + for ( md = mixset->first(); md != 0; md = mixset->next() ) { + if ( (! md->isSwitch()) && ( ! md->isEnum() ) ) { + _mixSet->append(md); + } + } +} + +int ViewApplet::count() +{ + return ( _mixSet->count() ); +} + +int ViewApplet::advice() { + if ( _mixSet->count() > 0 ) { + // The standard input and output views are always advised, if there are devices in it + return 100; + } + else { + return 0; + } +} + + + +QWidget* ViewApplet::add(MixDevice *md) +{ + /** + Slider orientation is exactly the other way round. If the applet stretches horzontally, + the sliders must be vertical + */ + Qt::Orientation sliderOrientation; + if (_viewOrientation == Qt::Horizontal ) + sliderOrientation = Qt::Vertical; + else + sliderOrientation = Qt::Horizontal; + + // kdDebug(67100) << "ViewApplet::add()\n"; + MixDeviceWidget *mdw = + new MDWSlider( + _mixer, // the mixer for this device + md, // MixDevice (parameter) + false, // Show Mute LED + false, // Show Record LED + true, // Small + sliderOrientation, // Orientation + this, // parent + this, // View widget + md->name().latin1() + ); + mdw->setBackgroundOrigin(AncestorOrigin); + + static_cast<MDWSlider*>(mdw)->setValueStyle(MixDeviceWidget::NNONE); + static_cast<MDWSlider*>(mdw)->setIcons(shouldShowIcons( size()) ); // !!! This should use the panel size + _layoutMDW->add(mdw); + return mdw; +} + +void ViewApplet::constructionFinished() { + _layoutMDW->activate(); + + KMixToolBox::setIcons ( _mdws, shouldShowIcons( size()) ); // !!! This should use the panel size + KMixToolBox::setValueStyle( _mdws, MixDeviceWidget::NNONE); +} + + +QSize ViewApplet::sizeHint() const { + // Basically out main layout knows very good what the sizes should be + QSize qsz = _layoutMDW->sizeHint(); + //kdDebug(67100) << "ViewApplet::sizeHint(): NewSize is " << qsz << "\n"; + return qsz; +} + +QSizePolicy ViewApplet::sizePolicy() const { + if ( _viewOrientation == Qt::Horizontal ) { + //kdDebug(67100) << "ViewApplet::sizePolicy=(Fixed,Expanding)\n"; + return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + } + else { + //kdDebug(67100) << "ViewApplet::sizePolicy=(Expanding,Fixed)\n"; + return QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + } +} + +bool ViewApplet::shouldShowIcons(QSize qsz) { + bool showIcons = false; + if ( _viewOrientation == Qt::Horizontal ) { + if ( qsz.height() >= 32 ) { + //kdDebug(67100) << "ViewApplet::resizeEvent() hor >=32" << qre->size() << "\n"; + showIcons = true; + } + } + else { + if ( qsz.width() >= 32 ) { + //kdDebug(67100) << "ViewApplet::resizeEvent() vert >=32" << qre->size() << "\n"; + showIcons = true; + } + } + return showIcons; +} + +void ViewApplet::resizeEvent(QResizeEvent *qre) +{ + //kdDebug(67100) << "ViewApplet::resizeEvent() size=" << qre->size() << "\n"; + // decide whether we have to show or hide all icons + bool showIcons = shouldShowIcons(qre->size()); + + for ( QWidget *mdw = _mdws.first(); mdw != 0; mdw = _mdws.next() ) { + if ( mdw == 0 ) { + kdError(67100) << "ViewApplet::resizeEvent(): mdw == 0\n"; + break; // sanity check (normally the lists are set up correctly) + } + else { + if ( mdw->inherits("MDWSlider")) { + static_cast<MDWSlider*>(mdw)->setIcons(showIcons); + static_cast<MDWSlider*>(mdw)->setValueStyle(MixDeviceWidget::NNONE); + //static_cast<MDWSlider*>(mdw)->resize(qre->size()); + } + } + } + // kdDebug(67100) << "ViewApplet::resizeEvent(). SHOULD resize _layoutMDW to " << qre->size() << endl; + //QWidget::resizeEvent(qre); + + // resizing changes our own sizeHint(), because we must take the new PanelSize in account. + // So updateGeometry() is amust for us. + updateGeometry(); +} + + +void ViewApplet::refreshVolumeLevels() { + //kdDebug(67100) << "ViewApplet::refreshVolumeLevels()\n"; + + QWidget *mdw = _mdws.first(); + MixDevice* md; + for ( md = _mixSet->first(); md != 0; md = _mixSet->next() ) { + if ( mdw == 0 ) { + kdError(67100) << "ViewApplet::refreshVolumeLevels(): mdw == 0\n"; + break; // sanity check (normally the lists are set up correctly) + } + else { + if ( mdw->inherits("MDWSlider")) { + //kdDebug(67100) << "ViewApplet::refreshVolumeLevels(): updating\n"; + // a slider, fine. Lets update its value + static_cast<MDWSlider*>(mdw)->update(); + } + else { + kdError(67100) << "ViewApplet::refreshVolumeLevels(): mdw is not slider\n"; + // no slider. Cannot happen in theory => skip it + } + } + mdw = _mdws.next(); + } +} + +void ViewApplet::configurationUpdate() { + updateGeometry(); + //_layoutMDW->activate(); + constructionFinished(); // contains "_layoutMDW->activate();" + emit appletContentChanged(); + kdDebug(67100) << "ViewApplet::configurationUpdate()" << endl; + // the following "emit" is only here to be picked up by KMixApplet, because it has to + // - make sure the panel is informed about the size change + // - save the new configuration + //emit configurationUpdated(); +} + +#include "viewapplet.moc" |