diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-08 11:02:39 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-08 11:02:39 +0200 |
| commit | 67af296c10de639c6d2391ae4608ec5c307549d2 (patch) | |
| tree | bd8fbbc3b7304b0c0eb585c0e9049376296c3f31 /src | |
| parent | 7a4d3771bc24cf66d77d9bf32d26a3eb9d8489f3 (diff) | |
| download | kristall-67af296c10de639c6d2391ae4608ec5c307549d2.tar.gz | |
Adds support for multimedia modules: Now can pla audio/ (tested) and video/ (untested).
Diffstat (limited to 'src')
| -rw-r--r-- | src/browsertab.cpp | 17 | ||||
| -rw-r--r-- | src/browsertab.ui | 11 | ||||
| -rw-r--r-- | src/kristall.pro | 5 | ||||
| -rw-r--r-- | src/mediaplayer.cpp | 72 | ||||
| -rw-r--r-- | src/mediaplayer.hpp | 37 | ||||
| -rw-r--r-- | src/mediaplayer.ui | 79 |
6 files changed, 216 insertions, 5 deletions
diff --git a/src/browsertab.cpp b/src/browsertab.cpp index 6f6e453..0e94770 100644 --- a/src/browsertab.cpp +++ b/src/browsertab.cpp @@ -45,6 +45,7 @@ BrowserTab::BrowserTab(MainWindow * mainWindow) : this->updateUI(); + this->ui->media_browser->setVisible(false); this->ui->graphics_browser->setVisible(false); this->ui->text_browser->setVisible(true); @@ -223,6 +224,9 @@ void BrowserTab::on_requestComplete(const QByteArray &data, const QString &mime) ui->text_browser->setStyleSheet(""); + enum DocumentType { Text, Image, Media }; + + DocumentType doc_type = Text; std::unique_ptr<QTextDocument> document; this->outline.clear(); @@ -267,6 +271,7 @@ void BrowserTab::on_requestComplete(const QByteArray &data, const QString &mime) document->setPlainText(QString::fromUtf8(data)); } else if(mime.startsWith("image/")) { + doc_type = Image; QImage img; if(img.loadFromData(data, nullptr)) @@ -279,7 +284,10 @@ void BrowserTab::on_requestComplete(const QByteArray &data, const QString &mime) } this->ui->graphics_browser->fitInView(graphics_scene.sceneRect(), Qt::KeepAspectRatio); - + } + else if(mime.startsWith("video/") or mime.startsWith("audio/")) { + doc_type = Media; + this->ui->media_browser->setMedia(data, this->current_location, mime); } else { document = std::make_unique<QTextDocument>(); @@ -298,10 +306,11 @@ File Size: %2 )md").arg(mime).arg(size_human(data.size()))); } + assert((document != nullptr) == (doc_type == Text)); - this->ui->text_browser->setVisible(document != nullptr); - this->ui->graphics_browser->setVisible(document == nullptr); - + this->ui->text_browser->setVisible(doc_type == Text); + this->ui->graphics_browser->setVisible(doc_type == Image); + this->ui->media_browser->setVisible(doc_type == Media); this->ui->text_browser->setDocument(document.get()); this->current_document = std::move(document); diff --git a/src/browsertab.ui b/src/browsertab.ui index 265560e..6903bd8 100644 --- a/src/browsertab.ui +++ b/src/browsertab.ui @@ -176,10 +176,21 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> + <item> + <widget class="MediaPlayer" name="media_browser" native="true"/> + </item> </layout> </item> </layout> </widget> + <customwidgets> + <customwidget> + <class>MediaPlayer</class> + <extends>QWidget</extends> + <header>mediaplayer.hpp</header> + <container>1</container> + </customwidget> + </customwidgets> <resources> <include location="icons.qrc"/> </resources> diff --git a/src/kristall.pro b/src/kristall.pro index e6874ed..d0bf2c4 100644 --- a/src/kristall.pro +++ b/src/kristall.pro @@ -1,6 +1,6 @@ QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets network +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets network multimedia multimediawidgets CONFIG += c++17 @@ -30,6 +30,7 @@ SOURCES += \ ioutil.cpp \ main.cpp \ mainwindow.cpp \ + mediaplayer.cpp \ protocolsetup.cpp \ settingsdialog.cpp \ tabbrowsinghistory.cpp \ @@ -46,6 +47,7 @@ HEADERS += \ gophermaprenderer.hpp \ ioutil.hpp \ mainwindow.hpp \ + mediaplayer.hpp \ protocolsetup.hpp \ settingsdialog.hpp \ tabbrowsinghistory.hpp \ @@ -54,6 +56,7 @@ HEADERS += \ FORMS += \ browsertab.ui \ mainwindow.ui \ + mediaplayer.ui \ settingsdialog.ui TRANSLATIONS += \ diff --git a/src/mediaplayer.cpp b/src/mediaplayer.cpp new file mode 100644 index 0000000..6b6c67d --- /dev/null +++ b/src/mediaplayer.cpp @@ -0,0 +1,72 @@ +#include "mediaplayer.hpp" +#include "ui_mediaplayer.h" + +#include <QMediaContent> +#include <QToolButton> +#include <QTime> + +MediaPlayer::MediaPlayer(QWidget *parent) : + QWidget(parent), + ui(new Ui::MediaPlayer), + media_stream(), + player() +{ + ui->setupUi(this); + + this->player.setVideoOutput(this->ui->video_out); + + connect(&this->player, &QMediaPlayer::durationChanged, this->ui->media_progress, &QSlider::setMaximum); + connect(&this->player, &QMediaPlayer::positionChanged, this->ui->media_progress, &QSlider::setValue); + + connect(&this->player, &QMediaPlayer::audioAvailableChanged, this->ui->mute_button, &QToolButton::setEnabled); + connect(&this->player, &QMediaPlayer::videoAvailableChanged, this->ui->video_out, &QVideoWidget::setVisible); + + connect(&this->player, &QMediaPlayer::mediaStatusChanged, [](QMediaPlayer::MediaStatus status) { + qDebug() << "media status changed" << status; + }); + + connect(&this->player, &QMediaPlayer::positionChanged, this, &MediaPlayer::on_media_positionChanged); + + connect(this->ui->media_progress, &QSlider::valueChanged, &this->player, &QMediaPlayer::setPosition); +} + +MediaPlayer::~MediaPlayer() +{ + delete ui; +} + +void MediaPlayer::setMedia(QByteArray const & data, QUrl const & ref_url, QString const & mime) +{ + this->player.stop(); + + this->mime = mime; + + this->media_stream.close(); + this->media_stream.setData(data); // = QBuffer { &this->backing_buffer }; + this->media_stream.open(QIODevice::ReadOnly); + + QMediaContent content { ref_url }; + + this->player.setMedia(content, &this->media_stream); +} + +void MediaPlayer::on_playpause_button_clicked() +{ + if(this->player.state() != QMediaPlayer::PlayingState) { + this->player.play(); + } else { + this->player.pause(); + } +} + +void MediaPlayer::on_mute_button_clicked(bool checked) +{ + this->player.setMuted(checked); +} + +void MediaPlayer::on_media_positionChanged(qint64 pos) +{ + auto time = QTime::fromMSecsSinceStartOfDay(pos); + + this->ui->media_position->setText(time.toString()); +} diff --git a/src/mediaplayer.hpp b/src/mediaplayer.hpp new file mode 100644 index 0000000..b848ec1 --- /dev/null +++ b/src/mediaplayer.hpp @@ -0,0 +1,37 @@ +#ifndef MEDIAPLAYER_HPP +#define MEDIAPLAYER_HPP + +#include <QWidget> +#include <QBuffer> +#include <QVideoWidget> +#include <QMediaPlayer> + +namespace Ui { +class MediaPlayer; +} + +class MediaPlayer : public QWidget +{ + Q_OBJECT + +public: + explicit MediaPlayer(QWidget *parent = nullptr); + ~MediaPlayer(); + + void setMedia(QByteArray const & data, QUrl const & ref_url, QString const & mime); + +private slots: + void on_playpause_button_clicked(); + + void on_mute_button_clicked(bool checked); + + void on_media_positionChanged(qint64 pos); + +private: + Ui::MediaPlayer *ui; + QBuffer media_stream; + QString mime; + QMediaPlayer player; +}; + +#endif // MEDIAPLAYER_HPP diff --git a/src/mediaplayer.ui b/src/mediaplayer.ui new file mode 100644 index 0000000..eebbcc2 --- /dev/null +++ b/src/mediaplayer.ui @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MediaPlayer</class> + <widget class="QWidget" name="MediaPlayer"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>640</width> + <height>480</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QVideoWidget" name="video_out" native="true"/> + </item> + <item> + <layout class="QHBoxLayout" name="root_layout"> + <item> + <widget class="QToolButton" name="playpause_button"> + <property name="toolTip"> + <string>Click to play/pause</string> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + <item> + <widget class="QSlider" name="media_progress"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="media_position"> + <property name="text"> + <string>00:00:00</string> + </property> + <property name="textFormat"> + <enum>Qt::PlainText</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="mute_button"> + <property name="toolTip"> + <string>Mute/unmute audio</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>QVideoWidget</class> + <extends>QWidget</extends> + <header location="global">QVideoWidget</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> |
