/* This file is part of the KDE project | |
Copyright (C) 2006-2007 Matthias Kretz <kretz@kde.org> | |
This library is free software; you can redistribute it and/or | |
modify it under the terms of the GNU Lesser General Public | |
License as published by the Free Software Foundation; either | |
version 2.1 of the License, or (at your option) version 3, or any | |
later version accepted by the membership of KDE e.V. (or its | |
successor approved by the membership of KDE e.V.), Nokia Corporation | |
(or its successors, if any) and the KDE Free Qt Foundation, which shall | |
act as a proxy defined in Section 6 of version 3 of the license. | |
This library 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 | |
Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public | |
License along with this library. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
#include "volumeslider.h" | |
#include "volumeslider_p.h" | |
#include "audiooutput.h" | |
#include "phonondefs_p.h" | |
#include "phononnamespace_p.h" | |
#include "factory_p.h" | |
QT_BEGIN_NAMESPACE | |
#ifndef QT_NO_PHONON_VOLUMESLIDER | |
namespace Phonon | |
{ | |
VolumeSlider::VolumeSlider(QWidget *parent) | |
: QWidget(parent), | |
k_ptr(new VolumeSliderPrivate(this)) | |
{ | |
K_D(VolumeSlider); | |
#ifndef QT_NO_TOOLTIP | |
setToolTip(tr("Volume: %1%").arg(100)); | |
#endif | |
#ifndef QT_NO_WHATSTHIS | |
setWhatsThis(tr("Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%").arg(100)); | |
#endif | |
connect(&d->slider, SIGNAL(valueChanged(int)), SLOT(_k_sliderChanged(int))); | |
connect(&d->muteButton, SIGNAL(clicked()), SLOT(_k_buttonClicked())); | |
setFocusProxy(&d->slider); | |
} | |
VolumeSlider::VolumeSlider(AudioOutput *output, QWidget *parent) | |
: QWidget(parent), | |
k_ptr(new VolumeSliderPrivate(this)) | |
{ | |
K_D(VolumeSlider); | |
#ifndef QT_NO_TOOLTIP | |
setToolTip(tr("Volume: %1%").arg(100)); | |
#endif | |
#ifndef QT_NO_WHATSTHIS | |
setWhatsThis(tr("Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%").arg(100)); | |
#endif | |
connect(&d->slider, SIGNAL(valueChanged(int)), SLOT(_k_sliderChanged(int))); | |
connect(&d->muteButton, SIGNAL(clicked()), SLOT(_k_buttonClicked())); | |
if (output) { | |
d->output = output; | |
d->slider.setValue(qRound(100 * output->volume())); | |
d->slider.setEnabled(true); | |
d->muteButton.setEnabled(true); | |
connect(output, SIGNAL(volumeChanged(qreal)), SLOT(_k_volumeChanged(qreal))); | |
connect(output, SIGNAL(mutedChanged(bool)), SLOT(_k_mutedChanged(bool))); | |
} | |
setFocusProxy(&d->slider); | |
} | |
VolumeSlider::~VolumeSlider() | |
{ | |
delete k_ptr; | |
} | |
bool VolumeSlider::isMuteVisible() const | |
{ | |
return !k_ptr->muteButton.isHidden(); | |
} | |
void VolumeSlider::setMuteVisible(bool visible) | |
{ | |
k_ptr->muteButton.setVisible(visible); | |
} | |
QSize VolumeSlider::iconSize() const | |
{ | |
return k_ptr->muteButton.iconSize(); | |
} | |
void VolumeSlider::setIconSize(const QSize &iconSize) | |
{ | |
pDebug() << Q_FUNC_INFO << iconSize; | |
k_ptr->muteButton.setIconSize(iconSize); | |
} | |
qreal VolumeSlider::maximumVolume() const | |
{ | |
return k_ptr->slider.maximum() * 0.01; | |
} | |
void VolumeSlider::setMaximumVolume(qreal volume) | |
{ | |
int max = static_cast<int>(volume * 100); | |
k_ptr->slider.setMaximum(max); | |
#ifndef QT_NO_WHATSTHIS | |
setWhatsThis(tr("Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%") | |
.arg(max)); | |
#endif | |
} | |
Qt::Orientation VolumeSlider::orientation() const | |
{ | |
return k_ptr->slider.orientation(); | |
} | |
void VolumeSlider::setOrientation(Qt::Orientation o) | |
{ | |
K_D(VolumeSlider); | |
Qt::Alignment align = (o == Qt::Horizontal ? Qt::AlignVCenter : Qt::AlignHCenter); | |
d->layout.setAlignment(&d->muteButton, align); | |
d->layout.setAlignment(&d->slider, align); | |
d->layout.setDirection(o == Qt::Horizontal ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom); | |
d->slider.setOrientation(o); | |
} | |
AudioOutput *VolumeSlider::audioOutput() const | |
{ | |
K_D(const VolumeSlider); | |
return d->output; | |
} | |
void VolumeSlider::setAudioOutput(AudioOutput *output) | |
{ | |
K_D(VolumeSlider); | |
if (d->output) { | |
disconnect(d->output, 0, this, 0); | |
} | |
d->output = output; | |
if (output) { | |
d->slider.setValue(qRound(100 * output->volume())); | |
d->slider.setEnabled(true); | |
d->muteButton.setEnabled(true); | |
d->_k_volumeChanged(output->volume()); | |
d->_k_mutedChanged(output->isMuted()); | |
connect(output, SIGNAL(volumeChanged(qreal)), SLOT(_k_volumeChanged(qreal))); | |
connect(output, SIGNAL(mutedChanged(bool)), SLOT(_k_mutedChanged(bool))); | |
} else { | |
d->slider.setValue(100); | |
d->slider.setEnabled(false); | |
d->muteButton.setEnabled(false); | |
} | |
} | |
void VolumeSliderPrivate::_k_buttonClicked() | |
{ | |
if (output) { | |
output->setMuted(!output->isMuted()); | |
} else { | |
slider.setEnabled(false); | |
muteButton.setEnabled(false); | |
} | |
} | |
void VolumeSliderPrivate::_k_mutedChanged(bool muted) | |
{ | |
#ifndef QT_NO_TOOLTIP | |
Q_Q(VolumeSlider); | |
#endif | |
if (muted) { | |
#ifndef QT_NO_TOOLTIP | |
q->setToolTip(VolumeSlider::tr("Muted")); | |
#endif | |
muteButton.setIcon(mutedIcon); | |
} else { | |
#ifndef QT_NO_TOOLTIP | |
q->setToolTip(VolumeSlider::tr("Volume: %1%").arg(static_cast<int>(output->volume() * 100.0))); | |
#endif | |
muteButton.setIcon(volumeIcon); | |
} | |
} | |
void VolumeSliderPrivate::_k_sliderChanged(int value) | |
{ | |
#ifndef QT_NO_TOOLTIP | |
Q_Q(VolumeSlider); | |
#endif | |
if (output) { | |
#ifndef QT_NO_TOOLTIP | |
if (!output->isMuted()) { | |
q->setToolTip(VolumeSlider::tr("Volume: %1%").arg(value)); | |
} | |
#endif | |
ignoreVolumeChange = true; | |
output->setVolume((static_cast<qreal>(value)) * 0.01); | |
ignoreVolumeChange = false; | |
} else { | |
slider.setEnabled(false); | |
muteButton.setEnabled(false); | |
} | |
} | |
void VolumeSliderPrivate::_k_volumeChanged(qreal value) | |
{ | |
if (!ignoreVolumeChange) { | |
slider.setValue(qRound(100 * value)); | |
} | |
} | |
bool VolumeSlider::hasTracking() const | |
{ | |
return k_ptr->slider.hasTracking(); | |
} | |
void VolumeSlider::setTracking(bool tracking) | |
{ | |
k_ptr->slider.setTracking(tracking); | |
} | |
int VolumeSlider::pageStep() const | |
{ | |
return k_ptr->slider.pageStep(); | |
} | |
void VolumeSlider::setPageStep(int milliseconds) | |
{ | |
k_ptr->slider.setPageStep(milliseconds); | |
} | |
int VolumeSlider::singleStep() const | |
{ | |
return k_ptr->slider.singleStep(); | |
} | |
void VolumeSlider::setSingleStep(int milliseconds) | |
{ | |
k_ptr->slider.setSingleStep(milliseconds); | |
} | |
} // namespace Phonon | |
#endif //QT_NO_PHONON_VOLUMESLIDER | |
QT_END_NAMESPACE | |
#include "moc_volumeslider.cpp" | |
// vim: sw=4 et |