|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
}
|