summaryrefslogtreecommitdiffstats
path: root/kmix/viewdockareapopup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmix/viewdockareapopup.cpp')
-rw-r--r--kmix/viewdockareapopup.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/kmix/viewdockareapopup.cpp b/kmix/viewdockareapopup.cpp
new file mode 100644
index 00000000..b08138f7
--- /dev/null
+++ b/kmix/viewdockareapopup.cpp
@@ -0,0 +1,206 @@
+/*
+ * 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 "viewdockareapopup.h"
+
+// Qt
+#include <qwidget.h>
+#include <qevent.h>
+#include <qlayout.h>
+#include <qframe.h>
+#include <qpushbutton.h>
+#include <qdatetime.h>
+
+// KDE
+#include <kdebug.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <klocale.h>
+
+// KMix
+#include "mdwslider.h"
+#include "mixer.h"
+#include "kmixdockwidget.h"
+
+// !! Do NOT remove or mask out "WType_Popup"
+// Users will not be able to close the Popup without opening the KMix main window then.
+// See Bug #93443, #96332 and #96404 for further details. -- esken
+ViewDockAreaPopup::ViewDockAreaPopup(QWidget* parent, const char* name, Mixer* mixer, ViewBase::ViewFlags vflags, KMixDockWidget *dockW )
+ : ViewBase(parent, name, QString::null, mixer, WStyle_Customize | WType_Popup | Qt::WStyle_DialogBorder, vflags), _mdw(0), _dock(dockW)
+{
+ QBoxLayout *layout = new QHBoxLayout( this );
+ _frame = new QFrame( this );
+ layout->addWidget( _frame );
+
+ _frame->setFrameStyle( QFrame::PopupPanel | QFrame::Raised );
+ _frame->setLineWidth( 1 );
+
+ _layoutMDW = new QGridLayout( _frame, 1, 1, 2, 1, "KmixPopupLayout" );
+ _hideTimer = new QTime();
+ init();
+}
+
+ViewDockAreaPopup::~ViewDockAreaPopup() {
+}
+
+
+
+void ViewDockAreaPopup::mousePressEvent(QMouseEvent *)
+{
+// kdDebug() << "Teste pres mouse" << endl;
+ /**
+ Hide the popup:
+ This should work automatically, when the user clicks outside the bounds of this popup:
+ Alas - it does not work.
+ Why it does not work, I do not know: this->isPopup() returns "true", so Qt should
+ properly take care of it in QWidget.
+ */
+ if ( ! this->hasMouse() ) {
+ _hideTimer->start();
+ hide(); // needed!
+ }
+ return;
+}
+
+bool ViewDockAreaPopup::justHidden()
+{
+ return _hideTimer->elapsed() < 300;
+}
+
+void ViewDockAreaPopup::wheelEvent ( QWheelEvent * e ) {
+ // Pass wheel event from "border widget" to child
+ if ( _mdw != 0 ) {
+ QApplication::sendEvent( _mdw, e);
+ }
+}
+
+MixDevice* ViewDockAreaPopup::dockDevice()
+{
+ return _dockDevice;
+}
+
+
+void ViewDockAreaPopup::showContextMenu()
+{
+ // no right-button-menu on "dock area popup"
+ return;
+}
+
+
+void ViewDockAreaPopup::setMixSet(MixSet *)
+{
+ // kdDebug(67100) << "ViewDockAreaPopup::setMixSet()\n";
+ // This implementation of setMixSet() is a bit "exotic". But I will leave it like this, until I implement
+ // a configuration option for "what device to show on the dock area"
+ _dockDevice = _mixer->masterDevice();
+ if ( _dockDevice == 0 ) {
+ // If we have no mixer device, we will take the first available mixer device
+ _dockDevice = (*_mixer)[0];
+ }
+ _mixSet->append(_dockDevice);
+}
+
+QWidget* ViewDockAreaPopup::add(MixDevice *md)
+{
+ _mdw =
+ new MDWSlider(
+ _mixer, // the mixer for this device
+ md, // only 1 device. This is actually _dockDevice
+ true, // Show Mute LED
+ false, // Show Record LED
+ false, // Small
+ Qt::Vertical, // Direction: only 1 device, so doesn't matter
+ _frame, // parent
+ 0, // Is "NULL", so that there is no RMB-popup
+ _dockDevice->name().latin1() );
+ _layoutMDW->addItem( new QSpacerItem( 5, 20 ), 0, 2 );
+ _layoutMDW->addItem( new QSpacerItem( 5, 20 ), 0, 0 );
+ _layoutMDW->addWidget( _mdw, 0, 1 );
+
+ // Add button to show main panel
+ _showPanelBox = new QPushButton( i18n("Mixer"), _frame, "MixerPanel" );
+ connect ( _showPanelBox, SIGNAL( clicked() ), SLOT( showPanelSlot() ) );
+ _layoutMDW->addMultiCellWidget( _showPanelBox, 1, 1, 0, 2 );
+
+ return _mdw;
+}
+
+int ViewDockAreaPopup::count()
+{
+ return ( _mixSet->count() );
+}
+
+int ViewDockAreaPopup::advice() {
+ if ( _dockDevice != 0 ) {
+ // I could also evaluate whether we have a "sensible" device available.
+ // For example
+ // 100 : "master volume"
+ // 100 : "PCM"
+ // 50 : "CD"
+ // 0 : all other devices
+ return 100;
+ }
+ else {
+ return 0;
+ }
+}
+
+QSize ViewDockAreaPopup::sizeHint() const {
+ // kdDebug(67100) << "ViewDockAreaPopup::sizeHint(): NewSize is " << _mdw->sizeHint() << "\n";
+ return( _mdw->sizeHint() );
+}
+
+void ViewDockAreaPopup::constructionFinished() {
+ // kdDebug(67100) << "ViewDockAreaPopup::constructionFinished()\n";
+
+ _mdw->move(0,0);
+ _mdw->show();
+ _mdw->resize(_mdw->sizeHint() );
+ resize(sizeHint());
+
+}
+
+
+void ViewDockAreaPopup::refreshVolumeLevels() {
+ // kdDebug(67100) << "ViewDockAreaPopup::refreshVolumeLevels()\n";
+ QWidget* mdw = _mdws.first();
+ if ( mdw == 0 ) {
+ kdError(67100) << "ViewDockAreaPopup::refreshVolumeLevels(): mdw == 0\n";
+ // sanity check (normally the lists are set up correctly)
+ }
+ else {
+ if ( mdw->inherits("MDWSlider")) {
+ static_cast<MDWSlider*>(mdw)->update();
+ }
+ else {
+ kdError(67100) << "ViewDockAreaPopup::refreshVolumeLevels(): mdw is not slider\n";
+ // no slider. Cannot happen in theory => skip it
+ }
+ }
+}
+
+void ViewDockAreaPopup::showPanelSlot() {
+ _dock->toggleActive();
+ _dock->_dockAreaPopup->hide();
+}
+
+#include "viewdockareapopup.moc"
+