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"