diff options
Diffstat (limited to 'src-qt5/desktop-utils/lumina-fm-dev/widgets/MultimediaWidget.cpp')
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm-dev/widgets/MultimediaWidget.cpp | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/src-qt5/desktop-utils/lumina-fm-dev/widgets/MultimediaWidget.cpp b/src-qt5/desktop-utils/lumina-fm-dev/widgets/MultimediaWidget.cpp new file mode 100644 index 00000000..eaa15a59 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm-dev/widgets/MultimediaWidget.cpp @@ -0,0 +1,222 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2015, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "MultimediaWidget.h" +#include "ui_MultimediaWidget.h" + +#include <QTimer> + +MultimediaWidget::MultimediaWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MultimediaWidget){ + ui->setupUi(this); //load the designer file + + //Add in the special QMultimediaWidgets + mediaObj = new QMediaPlayer(this); + mediaObj->setVolume(100); + mediaObj->setNotifyInterval(500); //only every 1/2 second update + videoDisplay = new QVideoWidget(this); + videoDisplay->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + ui->videoLayout->addWidget(videoDisplay); + mediaObj->setVideoOutput(videoDisplay); + videoDisplay->setVisible(false); + + UpdateIcons(); + UpdateText(); + + //Connect the special signals/slots for the media object + connect(mediaObj, SIGNAL(durationChanged(qint64)), this, SLOT(playerDurationChanged(qint64)) ); + connect(mediaObj, SIGNAL(seekableChanged(bool)), ui->playerSlider, SLOT(setEnabled(bool)) ); + connect(mediaObj, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(playerStatusChanged(QMediaPlayer::MediaStatus)) ); + connect(mediaObj, SIGNAL(positionChanged(qint64)), this, SLOT(playerTimeChanged(qint64)) ); + connect(mediaObj, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged(QMediaPlayer::State)) ); + connect(mediaObj, SIGNAL(videoAvailableChanged(bool)), this, SLOT(playerVideoAvailable(bool)) ); + connect(mediaObj, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(playerError()) ); + + //Disable some of the initial states + ui->tool_player_stop->setEnabled(false); //nothing to stop yet + ui->tool_player_pause->setVisible(false); //nothing to pause yet + ui->playerSlider->setEnabled(false); //nothing to seek yet +} + +MultimediaWidget::~MultimediaWidget(){ + +} + +// ================ +// PUBLIC SLOTS +// ================ +void MultimediaWidget::ClearPlaylist(){ + mediaObj->stop(); + ui->combo_player_list->clear(); +} + +void MultimediaWidget::LoadMultimedia(QList<LFileInfo> list){ + for(int i=0; i<list.length(); i++){ + if(list[i].isAVFile()){ ui->combo_player_list->addItem(list[i].fileName(), list[i].absoluteFilePath() ); } + } +} + +void MultimediaWidget::Cleanup(){ + mediaObj->stop(); //just make sure the player is stopped +} + +//Theme change functions +void MultimediaWidget::UpdateIcons(){ + ui->tool_player_next->setIcon( LXDG::findIcon("media-skip-forward","") ); + ui->tool_player_prev->setIcon( LXDG::findIcon("media-skip-backward","") ); + ui->tool_player_pause->setIcon( LXDG::findIcon("media-playback-pause","") ); + ui->tool_player_play->setIcon( LXDG::findIcon("media-playback-start","") ); + ui->tool_player_stop->setIcon( LXDG::findIcon("media-playback-stop","") ); +} + +void MultimediaWidget::UpdateText(){ + ui->retranslateUi(this); +} + + +// ================= +// PRIVATE +// ================= +QString MultimediaWidget::msToText(qint64 ms){ + QString disp; + if(ms>3600000){ + disp.append( QString::number(ms/3600000)+":" ); + ms = ms%3600000; + } + if(ms>60000){ + disp.append( QString::number(ms/60000)+":" ); + ms = ms%60000; + }else{ + disp.append("0:"); + } + if(ms>1000){ + if(ms>=10000){ disp.append( QString::number(ms/1000) ); } + else{ disp.append( "0"+QString::number(ms/1000) ); } + }else{ + disp.append("00"); + } + return disp; +} + +// ================= +// PRIVATE SLOTS +// ================= +void MultimediaWidget::playerStatusChanged(QMediaPlayer::MediaStatus stat){ + //Only use this for end-of-file detection - use the state detection otherwise + if(stat == QMediaPlayer::EndOfMedia){ + if(!mediaObj->isMuted()){ playerFinished(); } //make sure it is not being seeked right now + } +} + +void MultimediaWidget::playerStateChanged(QMediaPlayer::State newstate){ + //This function keeps track of updating the visuals of the player + bool running = false; + bool showVideo = false; + QString msg; + switch(newstate){ + case QMediaPlayer::PlayingState: + running=true; + showVideo = mediaObj->isVideoAvailable(); + msg = "";//mediaObj->metaData(Phonon::TitleMetaData).join(" "); + if(msg.simplified().isEmpty()){ msg = ui->combo_player_list->currentText(); } + ui->label_player_novideo->setText(tr("Playing:")+"\n"+msg); + break; + case QMediaPlayer::PausedState: + showVideo=videoDisplay->isVisible(); //don't change the screen + break; + case QMediaPlayer::StoppedState: + ui->label_player_novideo->setText(tr("Stopped")); + break; + } + ui->tool_player_play->setVisible(!running); + ui->tool_player_pause->setVisible(running); + ui->tool_player_stop->setEnabled(running); + ui->label_player_novideo->setVisible(!showVideo); + videoDisplay->setVisible(showVideo); +} + +void MultimediaWidget::playerVideoAvailable(bool showVideo){ + ui->label_player_novideo->setVisible(!showVideo); + videoDisplay->setVisible(showVideo); +} + +void MultimediaWidget::playerDurationChanged(qint64 dur){ + if(dur < 0){ return; } //not ready yet + ui->playerSlider->setMaximum(mediaObj->duration()); + playerTTime = msToText(dur); +} + +void MultimediaWidget::playerTimeChanged(qint64 ctime){ + if(mediaObj->isMuted() || playerTTime.isEmpty() ){ return; } //currently being moved + ui->playerSlider->setSliderPosition(ctime); +} + +void MultimediaWidget::playerError(){ + QString msg = QString(tr("Error Playing File: %1")); + msg = msg.arg( mediaObj->currentMedia().canonicalUrl().fileName() ); + msg.append("\n"+mediaObj->errorString()); + ui->label_player_novideo->setText(msg); +} + +void MultimediaWidget::playerFinished(){ + if(ui->combo_player_list->currentIndex()<(ui->combo_player_list->count()-1) && ui->check_player_gotonext->isChecked()){ + ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1 ); + QTimer::singleShot(0,this,SLOT(on_tool_player_play_clicked())); + }else{ + ui->label_player_novideo->setText(tr("Finished")); + } +} + +void MultimediaWidget::on_tool_player_play_clicked(){ + if(mediaObj->state()==QMediaPlayer::PausedState \ + && mediaObj->currentMedia().canonicalUrl().fileName()==ui->combo_player_list->currentText() ){ + mediaObj->play(); + }else{ + mediaObj->stop(); + //Get the selected file path + QString filePath = ui->combo_player_list->currentData().toString(); + mediaObj->setMedia( QUrl::fromLocalFile(filePath) ); + playerTTime.clear(); + ui->playerSlider->setEnabled(mediaObj->isSeekable()); + mediaObj->play(); + } +} + +void MultimediaWidget::on_combo_player_list_currentIndexChanged(int index){ + ui->tool_player_next->setEnabled( ui->combo_player_list->count() > (index+1) ); + ui->tool_player_prev->setEnabled( (index-1) >= 0 ); +} + +void MultimediaWidget::on_tool_player_next_clicked(){ + ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1); + if(mediaObj->state()!=QMediaPlayer::StoppedState){ on_tool_player_play_clicked(); } +} + +void MultimediaWidget::on_tool_player_prev_clicked(){ + ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()-1); + if(mediaObj->state()!=QMediaPlayer::StoppedState){ on_tool_player_play_clicked(); } +} + +void MultimediaWidget::on_tool_player_pause_clicked(){ + mediaObj->pause(); +} + +void MultimediaWidget::on_tool_player_stop_clicked(){ + mediaObj->stop(); +} + +//Slider controls +void MultimediaWidget::on_playerSlider_sliderPressed(){ + mediaObj->setMuted(true); + mediaObj->pause(); +} +void MultimediaWidget::on_playerSlider_sliderReleased(){ + if(mediaObj->state()==QMediaPlayer::PausedState){ mediaObj->play(); } + mediaObj->setMuted(false); +} +void MultimediaWidget::on_playerSlider_valueChanged(int val){ + ui->label_player_runstats->setText( msToText(val)+"/"+playerTTime ); + if(mediaObj->isMuted()){ mediaObj->setPosition(val); } //currently seeking +} |