aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-08 11:02:39 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-08 11:02:39 +0200
commit67af296c10de639c6d2391ae4608ec5c307549d2 (patch)
treebd8fbbc3b7304b0c0eb585c0e9049376296c3f31 /src
parent7a4d3771bc24cf66d77d9bf32d26a3eb9d8489f3 (diff)
downloadkristall-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.cpp17
-rw-r--r--src/browsertab.ui11
-rw-r--r--src/kristall.pro5
-rw-r--r--src/mediaplayer.cpp72
-rw-r--r--src/mediaplayer.hpp37
-rw-r--r--src/mediaplayer.ui79
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>