File indexing completed on 2024-04-21 04:57:32

0001 /* This file is part of the KDE libraries
0002    SPDX-FileCopyrightText: 2003 Carsten Pfeiffer <pfeiffer@kde.org>
0003    SPDX-FileCopyrightText: 2006 Matthias Kretz <kretz@kde.org>
0004 
0005    SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "kfileaudiopreview.h"
0009 
0010 #include <QCheckBox>
0011 #include <QGroupBox>
0012 #include <QLayout>
0013 
0014 #define TRANSLATION_DOMAIN "kfileaudiopreview6"
0015 #include <KConfig>
0016 #include <KConfigGroup>
0017 #include <KLocalizedString>
0018 #include <KPluginFactory>
0019 #include <KSharedConfig>
0020 
0021 #include "mediacontrols.h"
0022 #include <phonon/audiooutput.h>
0023 #include <phonon/backendcapabilities.h>
0024 #include <phonon/mediaobject.h>
0025 #include <phonon/path.h>
0026 #include <phonon/videowidget.h>
0027 
0028 K_PLUGIN_FACTORY(KFileAudioPreviewFactory, registerPlugin<KFileAudioPreview>();)
0029 
0030 #define ConfigGroup QStringLiteral("Audio Preview Settings")
0031 
0032 ///////////////////////////////////////////////////////////////////
0033 ///////////////////////////////////////////////////////////////////
0034 
0035 using namespace Phonon;
0036 
0037 class KFileAudioPreview::Private
0038 {
0039 public:
0040     Private()
0041         : player(nullptr)
0042         , audioOutput(nullptr)
0043         , videoWidget(nullptr)
0044     {
0045     }
0046 
0047     MediaObject *player;
0048     AudioOutput *audioOutput;
0049     VideoWidget *videoWidget;
0050     MediaControls *controls;
0051 };
0052 
0053 KFileAudioPreview::KFileAudioPreview(QWidget *parent, const QVariantList &)
0054     : KPreviewWidgetBase(parent)
0055     , d(new Private)
0056 {
0057     setSupportedMimeTypes(BackendCapabilities::availableMimeTypes());
0058 
0059     d->audioOutput = new AudioOutput(Phonon::NoCategory, this);
0060 
0061     d->videoWidget = new VideoWidget(this);
0062     d->videoWidget->hide();
0063 
0064     d->controls = new MediaControls(this);
0065     d->controls->setEnabled(false);
0066     d->controls->setAudioOutput(d->audioOutput);
0067 
0068     m_autoPlay = new QCheckBox(i18n("Play &automatically"), this);
0069     KConfigGroup config(KSharedConfig::openConfig(), ConfigGroup);
0070     m_autoPlay->setChecked(config.readEntry("Autoplay", false));
0071     connect(m_autoPlay, &QCheckBox::toggled, this, &KFileAudioPreview::toggleAuto);
0072 
0073     QVBoxLayout *layout = new QVBoxLayout(this);
0074     layout->setContentsMargins(0, 0, 0, 0);
0075     layout->addWidget(d->videoWidget);
0076     layout->addWidget(d->controls);
0077     layout->addWidget(m_autoPlay, 0, Qt::AlignHCenter);
0078     layout->addStretch();
0079 }
0080 
0081 KFileAudioPreview::~KFileAudioPreview()
0082 {
0083     KConfigGroup config(KSharedConfig::openConfig(), ConfigGroup);
0084     config.writeEntry("Autoplay", m_autoPlay->isChecked());
0085 
0086     delete d;
0087 }
0088 
0089 void KFileAudioPreview::stateChanged(Phonon::State newstate, Phonon::State oldstate)
0090 {
0091     if (oldstate == Phonon::LoadingState && newstate != Phonon::ErrorState) {
0092         d->controls->setEnabled(true);
0093     }
0094 }
0095 
0096 void KFileAudioPreview::showPreview(const QUrl &url)
0097 {
0098     d->controls->setEnabled(false);
0099     if (!d->player) {
0100         d->player = new MediaObject(this);
0101         Phonon::createPath(d->player, d->videoWidget);
0102         Phonon::createPath(d->player, d->audioOutput);
0103         connect(d->player, &MediaObject::stateChanged, this, &KFileAudioPreview::stateChanged);
0104         d->videoWidget->setVisible(d->player->hasVideo());
0105         connect(d->player, SIGNAL(hasVideoChanged(bool)), d->videoWidget, SLOT(setVisible(bool)));
0106         d->controls->setMediaObject(d->player);
0107     }
0108     d->player->setCurrentSource(url);
0109 
0110     if (m_autoPlay->isChecked()) {
0111         d->player->play();
0112     }
0113 }
0114 
0115 void KFileAudioPreview::clearPreview()
0116 {
0117     if (d->player) {
0118         delete d->player;
0119         d->player = nullptr;
0120         d->controls->setEnabled(false);
0121     }
0122 }
0123 
0124 void KFileAudioPreview::toggleAuto(bool on)
0125 {
0126     if (!d->player) {
0127         return;
0128     }
0129 
0130     if (on && d->controls->isEnabled()) {
0131         d->player->play();
0132     } else {
0133         d->player->stop();
0134     }
0135 }
0136 
0137 #include "kfileaudiopreview.moc"
0138 #include "moc_kfileaudiopreview.cpp"