#include "UBMediaPlayer.h" #include <QtGui> #define SLIDER_RANGE 8 MediaVideoWidget::MediaVideoWidget(UBMediaPlayer *player, QWidget *parent) : Phonon::VideoWidget(parent), m_player(player)/*, m_action(this)*/ { // m_action.setCheckable(true); // m_action.setChecked(false); // m_action.setShortcut(QKeySequence( Qt::AltModifier + Qt::Key_Return)); // m_action.setShortcutContext(Qt::WindowShortcut); // connect(&m_action, SIGNAL(toggled(bool)), SLOT(setFullScreen(bool))); // addAction(&m_action); // setAcceptDrops(true); } 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); // QPushButton *openButton = new QPushButton(this); //// openButton->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton)); //// QPalette bpal; //// QColor arrowcolor = bpal.buttonText().color(); //// if (arrowcolor == Qt::black) //// arrowcolor = QColor(80, 80, 80); //// bpal.setBrush(QPalette::ButtonText, arrowcolor); //// openButton->setPalette(bpal); // rewindButton = new QPushButton(this); // rewindButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward)); // forwardButton = new QPushButton(this); // forwardButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward)); // forwardButton->setEnabled(false); 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); // QHBoxLayout *layout = new QHBoxLayout(); // info = new QLabel(this); // info->setMinimumHeight(70); // info->setAcceptDrops(false); // info->setMargin(2); // info->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); // info->setLineWidth(2); // info->setAutoFillBackground(true); // QPalette palette; // palette.setBrush(QPalette::WindowText, Qt::white); #ifndef Q_WS_MAC // rewindButton->setMinimumSize(buttonSize); // forwardButton->setMinimumSize(buttonSize); playButton->setMinimumSize(buttonSize); #endif // info->setStyleSheet("border-image:url(:/images/screen.png) ; border-width:3px"); // info->setPalette(palette); // info->setText(tr("<center>No media</center>")); // layout->addWidget(rewindButton); // layout->addWidget(playButton); // layout->addWidget(forwardButton); // layout->addStretch(); // vLayout->addWidget(info); initVideoWindow(); vLayout->addWidget(&m_videoWindow); // m_videoWidget->setStyleSheet(QString("background:red;")); QVBoxLayout *buttonPanelLayout = new QVBoxLayout(); #ifndef Q_WS_WIN m_videoWindow.hide(); #endif // buttonPanelLayout->addLayout(layout); // timeLabel = new QLabel(this); progressLabel = new QLabel(this); QWidget *sliderPanel = new QWidget(this); // sliderPanel->setStyleSheet(QString("background:green;")); QHBoxLayout *sliderLayout = new QHBoxLayout(); // playButton->setStyleSheet(QString("background:yellow;")); sliderLayout->addWidget(playButton); sliderLayout->addWidget(slider); // sliderLayout->addWidget(timeLabel); 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 // layout->setSpacing(4); buttonPanelLayout->setSpacing(0); // info->setMinimumHeight(100); // info->setFont(QFont("verdana", 15)); // openButton->setFocusPolicy(Qt::NoFocus); #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); // Setup signal connections: // connect(rewindButton, SIGNAL(clicked()), this, SLOT(rewind())); connect(playButton, SIGNAL(clicked()), this, SLOT(playPause())); // connect(forwardButton, SIGNAL(clicked()), this, SLOT(forward())); // connect(&m_MediaObject, SIGNAL(totalTimeChanged(qint64)), this, SLOT(updateTime())); // connect(&m_MediaObject, SIGNAL(tick(qint64)), this, SLOT(updateTime())); 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))); // rewindButton->setEnabled(false); playButton->setEnabled(false); // setAcceptDrops(true); 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); // rewindButton->setEnabled(false); } else { m_MediaObject.pause(); } QMessageBox::warning(this, "Phonon UBMediaPlayer", m_MediaObject.errorString(), QMessageBox::Close); break; case Phonon::StoppedState: // m_videoWidget-> (false); // Fall through case Phonon::PausedState: playButton->setIcon(playIcon); if (m_MediaObject.currentSource().type() != Phonon::MediaSource::Invalid){ playButton->setEnabled(true); // rewindButton->setEnabled(true); } else { playButton->setEnabled(false); // rewindButton->setEnabled(false); } break; case Phonon::PlayingState: playButton->setEnabled(true); playButton->setIcon(pauseIcon); if (m_MediaObject.hasVideo()) m_videoWindow.show(); // Fall through case Phonon::BufferingState: // rewindButton->setEnabled(true); break; case Phonon::LoadingState: // rewindButton->setEnabled(false); 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::updateTime() //{ // long len = m_MediaObject.totalTime(); // long pos = m_MediaObject.currentTime(); // QString timeString; // if (pos || len) // { // int sec = pos/1000; // int min = sec/60; // int hour = min/60; // int msec = pos; // QTime playTime(hour%60, min%60, sec%60, msec%1000); // sec = len / 1000; // min = sec / 60; // hour = min / 60; // msec = len; // QTime stopTime(hour%60, min%60, sec%60, msec%1000); // QString timeFormat = "m:ss"; // if (hour > 0) // timeFormat = "h:mm:ss"; // timeString = playTime.toString(timeFormat); // if (len) // timeString += " / " + stopTime.toString(timeFormat); // } // timeLabel->setText(timeString); //} 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]); // forwardButton->setEnabled(queue.size() > 1); 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) { // info->setVisible(!bHasVideo); m_videoWindow.setVisible(bHasVideo); } void UBMediaPlayer::resizeEvent(QResizeEvent* pEvent) { Q_UNUSED(pEvent); // int origWidth = m_videoWindow.width(); // int origHeight = m_videoWindow.height(); // float scaleFactor = (float)origWidth / (float)width(); // int newWidth = width(); // int newHeigth = origHeight/scaleFactor; // m_videoWindow.resize(newWidth, newHeigth); } //************************************************************************* UBDraggableMediaPlayer::UBDraggableMediaPlayer():UBMediaPlayer() { // setAcceptDrops(true); } void UBDraggableMediaPlayer::setFile(const QString &text) { mSourcePath = text; UBMediaPlayer::setFile(text); } void UBDraggableMediaPlayer::mousePressEvent(QMouseEvent *event) { Q_UNUSED(event); QMimeData *mimeData = new QMimeData; QList<QUrl> urls; urls << QUrl::fromLocalFile(mSourcePath); mimeData->setUrls(urls); mimeData->setText(mSourcePath); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->start(); }