/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <QtGui> #include "UBMediaPlayer.h" #define SLIDER_RANGE 8 MediaVideoWidget::MediaVideoWidget(UBMediaPlayer *player, QWidget *parent) : Phonon::VideoWidget(parent), m_player(player)/*, m_action(this)*/ { //NOOP } void MediaVideoWidget::timerEvent(QTimerEvent *e) { if (e->timerId() == m_timer.timerId()) { //let's store the cursor shape #ifndef QT_NO_CURSOR setCursor(Qt::BlankCursor); #endif } Phonon::VideoWidget::timerEvent(e); } UBMediaPlayer::UBMediaPlayer() : playButton(0), m_AudioOutput(Phonon::VideoCategory), m_videoWidget(new MediaVideoWidget(this)) { setContextMenuPolicy(Qt::CustomContextMenu); m_videoWidget->setContextMenuPolicy(Qt::CustomContextMenu); QSize buttonSize(26, 20); playButton = new QPushButton(this); playIcon = style()->standardIcon(QStyle::SP_MediaPlay); pauseIcon = style()->standardIcon(QStyle::SP_MediaPause); playButton->setIcon(playIcon); slider = new Phonon::SeekSlider(this); slider->setMediaObject(&m_MediaObject); QVBoxLayout *vLayout = new QVBoxLayout(this); vLayout->setContentsMargins(1, 1, 1, 1); initVideoWindow(); vLayout->addWidget(&m_videoWindow); QVBoxLayout *buttonPanelLayout = new QVBoxLayout(); #ifndef Q_WS_WIN m_videoWindow.hide(); #endif progressLabel = new QLabel(this); QWidget *sliderPanel = new QWidget(this); QHBoxLayout *sliderLayout = new QHBoxLayout(); sliderLayout->addWidget(playButton); sliderLayout->addWidget(slider); sliderLayout->addWidget(progressLabel); sliderLayout->setContentsMargins(0, 0, 0, 0); sliderPanel->setLayout(sliderLayout); buttonPanelLayout->addWidget(sliderPanel); buttonPanelLayout->setContentsMargins(0, 0, 0, 0); #ifdef Q_OS_MAC buttonPanelLayout->setSpacing(0); #endif QWidget *buttonPanelWidget = new QWidget(this); buttonPanelWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); buttonPanelWidget->setLayout(buttonPanelLayout); vLayout->addWidget(buttonPanelWidget); QHBoxLayout *labelLayout = new QHBoxLayout(); vLayout->addLayout(labelLayout); setLayout(vLayout); connect(playButton, SIGNAL(clicked()), this, SLOT(playPause())); connect(&m_MediaObject, SIGNAL(finished()), this, SLOT(finished())); connect(&m_MediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State,Phonon::State))); connect(&m_MediaObject, SIGNAL(bufferStatus(int)), this, SLOT(bufferStatus(int))); connect(&m_MediaObject, SIGNAL(hasVideoChanged(bool)), this, SLOT(hasVideoChanged(bool))); playButton->setEnabled(false); m_audioOutputPath = Phonon::createPath(&m_MediaObject, &m_AudioOutput); Phonon::createPath(&m_MediaObject, m_videoWidget); resize(minimumSizeHint()); } void UBMediaPlayer::stateChanged(Phonon::State newstate, Phonon::State oldstate) { if (oldstate == Phonon::LoadingState) { QRect videoHintRect = QRect(QPoint(0, 0), m_videoWindow.sizeHint()); QApplication::desktop()->screenGeometry().intersected(videoHintRect); if (m_MediaObject.hasVideo()) { qApp->processEvents(); resize(sizeHint()); } else resize(minimumSize()); } switch (newstate) { case Phonon::ErrorState: if (m_MediaObject.errorType() == Phonon::FatalError) { playButton->setEnabled(false); } else { m_MediaObject.pause(); } QMessageBox::warning(this, "Phonon UBMediaPlayer", m_MediaObject.errorString(), QMessageBox::Close); break; case Phonon::StoppedState: // Fall through case Phonon::PausedState: playButton->setIcon(playIcon); if (m_MediaObject.currentSource().type() != Phonon::MediaSource::Invalid){ playButton->setEnabled(true); } else { playButton->setEnabled(false); } break; case Phonon::PlayingState: playButton->setEnabled(true); playButton->setIcon(pauseIcon); if (m_MediaObject.hasVideo()) m_videoWindow.show(); // Fall through case Phonon::BufferingState: break; case Phonon::LoadingState: break; } } void UBMediaPlayer::setVolume(qreal volume) { m_AudioOutput.setVolume(volume); } void UBMediaPlayer::initVideoWindow() { QVBoxLayout *videoLayout = new QVBoxLayout(); videoLayout->addWidget(m_videoWidget); videoLayout->setContentsMargins(0, 0, 0, 0); m_videoWindow.setLayout(videoLayout); m_videoWindow.setMinimumSize(60, 40); } void UBMediaPlayer::playPause() { if (m_MediaObject.state() == Phonon::PlayingState) m_MediaObject.pause(); else { if (m_MediaObject.currentTime() == m_MediaObject.totalTime()) m_MediaObject.seek(0); m_MediaObject.play(); } } void UBMediaPlayer::setFile(const QString &fileName) { setWindowTitle(fileName.right(fileName.length() - fileName.lastIndexOf('/') - 1)); m_MediaObject.setCurrentSource(Phonon::MediaSource(fileName)); } void UBMediaPlayer::setLocation(const QString& location) { setWindowTitle(location.right(location.length() - location.lastIndexOf('/') - 1)); m_MediaObject.setCurrentSource(Phonon::MediaSource(QUrl::fromEncoded(location.toUtf8()))); m_MediaObject.play(); } void UBMediaPlayer::openFile() { QStringList fileNames = QFileDialog::getOpenFileNames(this, QString(), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); m_MediaObject.clearQueue(); if (fileNames.size() > 0) { QString fileName = fileNames[0]; setFile(fileName); for (int i=1; i<fileNames.size(); i++) m_MediaObject.enqueue(Phonon::MediaSource(fileNames[i])); } } void UBMediaPlayer::bufferStatus(int percent) { if (percent == 100) progressLabel->setText(QString()); else { QString str = QString::fromLatin1("(%1%)").arg(percent); progressLabel->setText(str); } } void UBMediaPlayer::rewind() { m_MediaObject.seek(0); } void UBMediaPlayer::forward() { QList<Phonon::MediaSource> queue = m_MediaObject.queue(); if (queue.size() > 0) { m_MediaObject.setCurrentSource(queue[0]); m_MediaObject.play(); } } void UBMediaPlayer::openUrl() { QSettings settings; settings.beginGroup(QLatin1String("BrowserMainWindow")); QString sourceURL = settings.value("location").toString(); bool ok = false; sourceURL = QInputDialog::getText(this, tr("Open Location"), tr("Please enter a valid address here:"), QLineEdit::Normal, sourceURL, &ok); if (ok && !sourceURL.isEmpty()) { setLocation(sourceURL); settings.setValue("location", sourceURL); } } void UBMediaPlayer::finished() { } void UBMediaPlayer::hasVideoChanged(bool bHasVideo) { m_videoWindow.setVisible(bHasVideo); } void UBMediaPlayer::resizeEvent(QResizeEvent* pEvent) { Q_UNUSED(pEvent); }