From 558e80fa2f0f8a86c1d8e5de06ace7191f1cac18 Mon Sep 17 00:00:00 2001 From: defnax Date: Mon, 27 Jan 2020 19:45:43 +0100 Subject: [PATCH] Added Video Player page for MainWindow --- retroshare-gui/src/gui/MainWindow.cpp | 8 + retroshare-gui/src/gui/MainWindow.h | 8 +- retroshare-gui/src/gui/PlayerPage.cpp | 209 ++++++++++++++++++ retroshare-gui/src/gui/PlayerPage.h | 91 ++++++++ retroshare-gui/src/gui/PlayerPage.ui | 27 +++ retroshare-gui/src/gui/feeds/SubFileItem.cpp | 8 +- retroshare-gui/src/gui/icons.qrc | 1 + .../src/gui/icons/png/video-camera.png | Bin 0 -> 3991 bytes retroshare-gui/src/retroshare-gui.pro | 5 +- 9 files changed, 350 insertions(+), 7 deletions(-) create mode 100644 retroshare-gui/src/gui/PlayerPage.cpp create mode 100644 retroshare-gui/src/gui/PlayerPage.h create mode 100644 retroshare-gui/src/gui/PlayerPage.ui create mode 100644 retroshare-gui/src/gui/icons/png/video-camera.png diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 6ec0c22f7..fcc5cd5b6 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -57,6 +57,7 @@ #include "chat/ChatDialog.h" #include "RetroShareLink.h" #include "SoundManager.h" +#include "PlayerPage.h" #include "notifyqt.h" #include "common/UserNotify.h" #include "gui/ServicePermissionDialog.h" @@ -185,6 +186,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) gxschannelDialog=NULL; gxsforumDialog=NULL; postedDialog=NULL; + playerDialog=NULL; /* Invoke the Qt Designer generated QObject setup routine */ ui->setupUi(this); @@ -412,6 +414,7 @@ void MainWindow::initStackedPage() addPage(gxschannelDialog = new GxsChannelDialog(ui->stackPages), grp, ¬ify); addPage(gxsforumDialog = new GxsForumsDialog(ui->stackPages), grp, ¬ify); addPage(postedDialog = new PostedDialog(ui->stackPages), grp, ¬ify); + addPage(playerDialog = new PlayerPage(ui->stackPages), grp, NULL); #ifdef RS_USE_NEW_PEOPLE_DIALOG PeopleDialog *peopleDialog = NULL; @@ -979,6 +982,9 @@ void SetForegroundWindowInternal(HWND hWnd) case Posted: _instance->ui->stackPages->setCurrentPage( _instance->postedDialog ); return true ; + case Player: + _instance->ui->stackPages->setCurrentPage( _instance->playerDialog ); + return true ; default: std::cerr << "Show page called on value that is not handled yet. Please code it! (value = " << page << ")" << std::endl; } @@ -1061,6 +1067,8 @@ void SetForegroundWindowInternal(HWND hWnd) return _instance->gxsforumDialog; case Posted: return _instance->postedDialog; + case Player: + return _instance->playerDialog; } return NULL; diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 5240cdce3..53c5ea401 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -61,7 +61,7 @@ class TransfersDialog; class MessagesDialog; class PluginsPage; class HomePage; -//class ChannelFeed; +class PlayerPage; class BandwidthGraph; class MainPage; class NewsFeed; @@ -92,8 +92,9 @@ public: Forums = 7, /** Forums page. */ Search = 8, /** Search page. */ Posted = 11, /** Posted links */ - People = 12, /** People page. */ - Options = 13 /** People page. */ + People = 12, /** People page. */ + Options = 13, /** People page. */ + Player = 14 /** Player page. */ }; @@ -153,6 +154,7 @@ public: GxsChannelDialog *gxschannelDialog ; GxsForumsDialog *gxsforumDialog ; PostedDialog *postedDialog; + PlayerPage *playerDialog; // ForumsDialog *forumsDialog; // ChannelFeed *channelFeed; diff --git a/retroshare-gui/src/gui/PlayerPage.cpp b/retroshare-gui/src/gui/PlayerPage.cpp new file mode 100644 index 000000000..3a80202e8 --- /dev/null +++ b/retroshare-gui/src/gui/PlayerPage.cpp @@ -0,0 +1,209 @@ +/******************************************************************************* + * gui/PlayerPage.cpp * + * * + * Copyright (C) 2020 RetroShare Team * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero 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 Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ + +#include "PlayerPage.h" +#include "ui_PlayerPage.h" + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) +#include +#endif + +#include +#include + +#include +#include + + +PlayerPage::PlayerPage(QWidget *parent) : + MainPage(parent), + ui(new Ui::PlayerPage) +{ + ui->setupUi(this); + + mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface); + videoWidget = new QVideoWidget; + + videoWidget->show(); + videoWidget->setStyleSheet("background-color: #1f1f1f;"); + + playButton = new QPushButton; + playButton->setEnabled(false); + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + + stopButton = new QPushButton; + stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); + stopButton->setEnabled(false); + + fullScreenButton = new QPushButton(tr("FullScreen")); + fullScreenButton->setCheckable(true); + fullScreenButton->setEnabled(false); + + positionSlider = new QSlider(Qt::Horizontal); + positionSlider->setRange(0, mediaPlayer->duration() / 1000); + + labelDuration = new QLabel; + + errorLabel = new QLabel; + errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + + QBoxLayout *controlLayout = new QHBoxLayout; + controlLayout->setMargin(0); + + controlLayout->addWidget(playButton); + controlLayout->addWidget(stopButton); + controlLayout->addWidget(positionSlider); + controlLayout->addWidget(labelDuration); + controlLayout->addWidget(fullScreenButton); + + QBoxLayout *layout = new QVBoxLayout; + layout->addWidget(videoWidget); + layout->addLayout(controlLayout); + layout->addWidget(errorLabel); + + ui->widget->setLayout(layout); + + mediaPlayer->setVideoOutput(videoWidget); + + connect(playButton, &QAbstractButton::clicked,this, &PlayerPage::play); + connect(stopButton, &QAbstractButton::clicked,this, &PlayerPage::stopVideo); + connect(mediaPlayer, &QMediaPlayer::stateChanged,this, &PlayerPage::mediaStateChanged); + connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &PlayerPage::positionChanged); + connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &PlayerPage::durationChanged); + connect(mediaPlayer, QOverload::of(&QMediaPlayer::error),this, &PlayerPage::handleError); + connect(mediaPlayer, SIGNAL(videoAvailableChanged(bool)), this, SLOT(videoAvailableChanged(bool))); + connect(positionSlider, &QSlider::sliderMoved, this, &PlayerPage::seek); +} + +PlayerPage::~PlayerPage() +{ + delete ui; +} + +void PlayerPage::setUrl(const QUrl &url) +{ + errorLabel->setText(QString()); + mediaPlayer->setMedia(url); + playButton->setEnabled(true); + play(); +} + +void PlayerPage::play() +{ + switch (mediaPlayer->state()) { + //case QMediaPlayer::StoppedState: + case QMediaPlayer::PlayingState: + mediaPlayer->pause(); + break; + default: + mediaPlayer->play(); + break; + } +} + +void PlayerPage::stopVideo() +{ + mediaPlayer->stop(); +} + +void PlayerPage::mediaStateChanged(QMediaPlayer::State state) +{ + switch (state) { + case QMediaPlayer::StoppedState: + stopButton->setEnabled(false); + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + break; + case QMediaPlayer::PlayingState: + stopButton->setEnabled(true); + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); + break; + case QMediaPlayer::PausedState: + stopButton->setEnabled(true); + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + break; + } +} + +void PlayerPage::positionChanged(qint64 progress) +{ + if (!positionSlider->isSliderDown()) + positionSlider->setValue(progress / 1000); + + updateDurationInfo(progress / 1000); +} + +void PlayerPage::durationChanged(qint64 duration) +{ + duration = duration / 1000; + positionSlider->setMaximum(duration); +} + +void PlayerPage::seek(int seconds) +{ + mediaPlayer->setPosition(seconds * 1000); +} + +void PlayerPage::handleError() +{ + playButton->setEnabled(false); + const QString errorString = mediaPlayer->errorString(); + QString message = "Error: "; + if (errorString.isEmpty()) + message += " #" + QString::number(int(mediaPlayer->error())); + else + message += errorString; + errorLabel->setText(message); +} + +void PlayerPage::videoAvailableChanged(bool available) +{ + if (!available) { + disconnect(fullScreenButton, SIGNAL(clicked(bool)), + videoWidget, SLOT(setFullScreen(bool))); + disconnect(videoWidget, SIGNAL(fullScreenChanged(bool)), + fullScreenButton, SLOT(setChecked(bool))); + videoWidget->setFullScreen(false); + } else { + connect(fullScreenButton, SIGNAL(clicked(bool)), + videoWidget, SLOT(setFullScreen(bool))); + connect(videoWidget, SIGNAL(fullScreenChanged(bool)), + fullScreenButton, SLOT(setChecked(bool))); + + if (fullScreenButton->isChecked()) + videoWidget->setFullScreen(true); + } + +} + +void PlayerPage::updateDurationInfo(qint64 currentInfo) +{ + QString tStr; + if (currentInfo || duration) { + QTime currentTime((currentInfo / 3600) % 60, (currentInfo / 60) % 60, + currentInfo % 60, (currentInfo * 1000) % 1000); + QTime totalTime((duration / 3600) % 60, (duration / 60) % 60, + duration % 60, (duration * 1000) % 1000); + QString format = "mm:ss"; + if (duration > 3600) + format = "hh:mm:ss"; + tStr = currentTime.toString(format) + " / " + totalTime.toString(format); + } + labelDuration->setText(tStr); +} diff --git a/retroshare-gui/src/gui/PlayerPage.h b/retroshare-gui/src/gui/PlayerPage.h new file mode 100644 index 000000000..3e6de8eb8 --- /dev/null +++ b/retroshare-gui/src/gui/PlayerPage.h @@ -0,0 +1,91 @@ +/******************************************************************************* + * gui/PlayerPage.h * + * * + * Copyright (C) 2020 RetroShare Team * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero 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 Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with this program. If not, see . * + * * + *******************************************************************************/ + +#ifndef PLAYERPAGE_H +#define PLAYERPAGE_H + +#include +#include +#include + +#include +#include +#include + +class QAbstractButton; +class QPushButton; +class QSlider; +class QLabel; +class QUrl; + + +namespace Ui { +class PlayerPage; +} + +class PlayerPage : public MainPage +{ + Q_OBJECT + +public: + explicit PlayerPage(QWidget *parent); + ~PlayerPage(); + + virtual QIcon iconPixmap() const { return QIcon(":/icons/png/video-camera.png") ; } //MainPage + virtual QString pageName() const { return tr("Player") ; } //MainPage + virtual QString helpText() const { return ""; } //MainPage + + void setUrl(const QUrl &url); +protected: + //virtual void keyPressEvent(QKeyEvent *e) ; + +public slots: + + void play(); + void stopVideo(); + +private slots: + void mediaStateChanged(QMediaPlayer::State state); + void positionChanged(qint64 position); + void durationChanged(qint64 duration); + void handleError(); + void videoAvailableChanged(bool available); + + void seek(int seconds); + +private: + void updateDurationInfo(qint64 currentInfo); + + QMediaPlayer* mediaPlayer; + QVideoWidget *videoWidget; + QPushButton *playButton; + QPushButton *fullScreenButton; + QPushButton *stopButton; + QSlider *positionSlider; + QLabel *errorLabel; + QLabel *labelDuration; + qint64 duration; + + Ui::PlayerPage *ui; + + +}; + +#endif // PlayerPage_H diff --git a/retroshare-gui/src/gui/PlayerPage.ui b/retroshare-gui/src/gui/PlayerPage.ui new file mode 100644 index 000000000..16f1e9ef3 --- /dev/null +++ b/retroshare-gui/src/gui/PlayerPage.ui @@ -0,0 +1,27 @@ + + + PlayerPage + + + + 0 + 0 + 612 + 450 + + + + Form + + + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/feeds/SubFileItem.cpp b/retroshare-gui/src/gui/feeds/SubFileItem.cpp index ba81ab9bf..332432871 100644 --- a/retroshare-gui/src/gui/feeds/SubFileItem.cpp +++ b/retroshare-gui/src/gui/feeds/SubFileItem.cpp @@ -24,6 +24,8 @@ #include #include "SubFileItem.h" +#include "gui/PlayerPage.h" +#include "gui/MainWindow.h" #include #include @@ -587,9 +589,9 @@ void SubFileItem::play() QFileInfo qinfo; qinfo.setFile(info.path.c_str()); if (qinfo.exists()) { - if (!RsUrlHandler::openUrl(QUrl::fromLocalFile(qinfo.absoluteFilePath()))) { - std::cerr << "openTransfer(): can't open file " << info.path << std::endl; - } + MainWindow::showWindow(MainWindow::Player); + PlayerPage *Player = dynamic_cast(MainWindow::getPage(MainWindow::Player)); + Player->setUrl(QUrl::fromLocalFile(qinfo.absoluteFilePath())); }else{ QMessageBox::information(this, tr("Play File"), tr("File %1 does not exist at location.").arg(info.path.c_str())); diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index 81eeecb08..0e154fe7d 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -136,6 +136,7 @@ icons/png/thumbs-up.png icons/png/typing.png icons/png/video.png + icons/png/video-camera.png icons/posted_128.png icons/posted_red_128.png icons/quit_128.png diff --git a/retroshare-gui/src/gui/icons/png/video-camera.png b/retroshare-gui/src/gui/icons/png/video-camera.png new file mode 100644 index 0000000000000000000000000000000000000000..181bcf47f7862f6769656daf03a9c8edb41a87f5 GIT binary patch literal 3991 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 literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 188bd9546..8619bbad8 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -19,7 +19,7 @@ !include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri") TEMPLATE = app -QT += network xml +QT += network xml multimedia multimediawidgets CONFIG += qt gui uic qrc resources idle CONFIG += console TARGET = retroshare @@ -415,6 +415,7 @@ HEADERS += rshare.h \ gui/SoundManager.h \ gui/HelpDialog.h \ gui/LogoBar.h \ + gui/PlayerPage.h \ gui/common/AvatarDialog.h \ gui/FileTransfer/SearchDialog.h \ gui/FileTransfer/SharedFilesDialog.h \ @@ -668,6 +669,7 @@ FORMS += gui/StartDialog.ui \ # gui/ShareDialog.ui \ gui/help/browser/helpbrowser.ui \ gui/HelpDialog.ui \ + gui/PlayerPage.ui \ gui/ServicePermissionDialog.ui \ gui/profile/ProfileWidget.ui \ gui/profile/StatusMessage.ui \ @@ -790,6 +792,7 @@ SOURCES += main.cpp \ # gui/ShareDialog.cpp \ # gui/SFListDelegate.cpp \ gui/SoundManager.cpp \ + gui/PlayerPage.cpp \ gui/im_history/ImHistoryBrowser.cpp \ gui/im_history/IMHistoryItemDelegate.cpp \ gui/im_history/IMHistoryItemPainter.cpp \