aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/libLumina/LVideoLabel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core/libLumina/LVideoLabel.cpp')
-rw-r--r--src-qt5/core/libLumina/LVideoLabel.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src-qt5/core/libLumina/LVideoLabel.cpp b/src-qt5/core/libLumina/LVideoLabel.cpp
new file mode 100644
index 00000000..bddb1cba
--- /dev/null
+++ b/src-qt5/core/libLumina/LVideoLabel.cpp
@@ -0,0 +1,120 @@
+#include "LVideoLabel.h"
+#include <LuminaXDG.h>
+#include <QCoreApplication>
+
+LVideoLabel::LVideoLabel(QString file, bool icons, QWidget *parent) : QLabel(parent) {
+ thumbnail = QPixmap();
+ entered = false;
+ this->icons = icons;
+ filepath = file;
+ defaultThumbnail = LXDG::findIcon("unknown", "").pixmap(256,256);
+
+ QTimer::singleShot(0, this, SLOT(initializeBackend()) );
+}
+
+LVideoLabel::~LVideoLabel() {
+ mediaPlayer->deleteLater();
+ surface->deleteLater();
+}
+
+void LVideoLabel::initializeBackend(){
+ mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
+ surface = new LVideoSurface(this);
+ mediaPlayer->setVideoOutput(surface);
+ mediaPlayer->setPlaybackRate(3);
+ mediaPlayer->setMuted(true);
+
+ this->setPixmap(defaultThumbnail.scaled(this->size(),Qt::IgnoreAspectRatio));
+ mediaPlayer->setMedia(QUrl::fromLocalFile(filepath));
+ mediaPlayer->play();
+
+ this->connect(surface, SIGNAL(frameReceived(QPixmap)), this, SLOT(stopVideo(QPixmap)));
+ this->connect(mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State)));
+ this->connect(mediaPlayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(setDuration(QMediaPlayer::MediaStatus)));
+ this->connect(this, SIGNAL(rollOver()), surface, SLOT(switchRollOver()));
+}
+
+void LVideoLabel::enableIcons() {
+ this->setPixmap(thumbnail.scaled(this->size(),Qt::IgnoreAspectRatio));
+ icons = true;
+}
+
+void LVideoLabel::disableIcons() {
+ this->setPixmap(defaultThumbnail.scaled(this->size(),Qt::IgnoreAspectRatio));
+ icons = false;
+}
+
+void LVideoLabel::stopVideo(QPixmap pix) {
+ if(!entered) {
+ emit frameReceived(pix);
+ if(thumbnail.isNull())
+ thumbnail = pix;
+ if(icons)
+ this->setPixmap(thumbnail.scaled(this->size(),Qt::IgnoreAspectRatio));
+ mediaPlayer->pause();
+ }else {
+ if(icons)
+ this->setPixmap(pix.scaled(this->size(),Qt::IgnoreAspectRatio));
+ }
+}
+
+void LVideoLabel::stateChanged(QMediaPlayer::State state) {
+ //qDebug() << state;
+}
+
+void LVideoLabel::setDuration(QMediaPlayer::MediaStatus status) {
+ //qDebug() << status;
+ if(status == QMediaPlayer::BufferedMedia && !entered) { //Set duration in the middle to capture the thumbnail
+ mediaPlayer->setPosition(mediaPlayer->duration() / 2);
+ mediaPlayer->play();
+ }else if(status == QMediaPlayer::EndOfMedia && entered) { //Loop back to the beginning if playback started and at the end of the video
+ mediaPlayer->setPosition(0);
+ mediaPlayer->play();
+ }else if(status == QMediaPlayer::InvalidMedia){
+ mediaPlayer->stop();
+ mediaPlayer->play();
+ }/*else if(status == QMediaPlayer::LoadingMedia) {
+ mediaPlayer->pause();
+ QTimer timer;
+ timer.setSingleShot(true);
+ timer.setInterval(300);
+ timer.start();
+ qDebug() << "Timer Started" << timer.remainingTime();
+ while(timer.isActive()) QCoreApplication::processEvents(QEventLoop::AllEvents, 5);
+ qDebug() << "Timer Finished" << timer.remainingTime();
+ mediaPlayer->setPosition(0);
+ mediaPlayer->play();
+ }*/
+}
+
+void LVideoLabel::resizeEvent(QResizeEvent *event) {
+ //Resize the current pixmap to match the new size
+ if(!thumbnail.isNull()){
+ if(icons)
+ this->setPixmap(thumbnail.scaled(this->size(),Qt::IgnoreAspectRatio));
+ else
+ this->setPixmap(defaultThumbnail.scaled(this->size(),Qt::IgnoreAspectRatio));
+ }
+ QLabel::resizeEvent(event);
+}
+
+//Start playing the video from the beginning when the mouse enters the label
+void LVideoLabel::enterEvent(QEvent *event) {
+ if(icons) {
+ entered=true;
+ emit rollOver();
+ mediaPlayer->setPosition(0);
+ mediaPlayer->play();
+ }
+ QWidget::enterEvent(event);
+}
+
+//Stop the video and set the thumbnail back to the middle of the video when the mouse leaves the label
+void LVideoLabel::leaveEvent(QEvent *event) {
+ if(icons) {
+ entered=false;
+ mediaPlayer->setPosition(mediaPlayer->duration() / 2);
+ emit rollOver();
+ }
+ QWidget::leaveEvent(event);
+}
bgstack15