aboutsummaryrefslogtreecommitdiff
path: root/src/widgets
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-22 21:10:04 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-22 21:10:04 +0200
commit75ec461eeaa851cb5c53f4cfffc434e3e529ed1d (patch)
tree3944737340718ca3675381aa06636045d397e780 /src/widgets
parent8dbfb0890560fd1cd698d06fa05ac868c4db8576 (diff)
downloadkristall-75ec461eeaa851cb5c53f4cfffc434e3e529ed1d.tar.gz
Restructures the project source and cleans up a bit
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/elidelabel.cpp59
-rw-r--r--src/widgets/elidelabel.hpp28
-rw-r--r--src/widgets/mediaplayer.cpp86
-rw-r--r--src/widgets/mediaplayer.hpp42
-rw-r--r--src/widgets/mediaplayer.ui85
-rw-r--r--src/widgets/searchbar.cpp26
-rw-r--r--src/widgets/searchbar.hpp19
-rw-r--r--src/widgets/ssltrusteditor.cpp82
-rw-r--r--src/widgets/ssltrusteditor.hpp44
-rw-r--r--src/widgets/ssltrusteditor.ui101
10 files changed, 572 insertions, 0 deletions
diff --git a/src/widgets/elidelabel.cpp b/src/widgets/elidelabel.cpp
new file mode 100644
index 0000000..dc0a6b2
--- /dev/null
+++ b/src/widgets/elidelabel.cpp
@@ -0,0 +1,59 @@
+#include "elidelabel.hpp"
+
+#include <QPainter>
+
+ElideLabel::ElideLabel(QWidget* parent)
+ : QLabel(parent)
+{
+ m_elideMode = Qt::ElideNone;
+}
+
+ElideLabel::ElideLabel(const QString &text, QWidget* parent) : QLabel(text, parent)
+{
+ m_elideMode = Qt::ElideNone;
+}
+
+ElideLabel::~ElideLabel()
+{
+}
+
+void ElideLabel::setElideMode(Qt::TextElideMode mode)
+{
+ m_elideMode = mode;
+}
+
+Qt::TextElideMode ElideLabel::elideMode() const
+{
+ return m_elideMode;
+}
+
+void ElideLabel::paintEvent(QPaintEvent * event)
+{
+ if (m_elideMode == Qt::ElideNone)
+ {
+ QLabel::paintEvent(event);
+ }
+ else
+ {
+ QFrame::paintEvent(event);
+ QPainter painter(this);
+ QRect r = contentsRect();
+ painter.drawText(r, alignment(), fontMetrics().elidedText(text(), m_elideMode, r.width()));
+ }
+}
+
+QSize ElideLabel::minimumSizeHint() const
+{
+ if (m_elideMode != Qt::ElideNone)
+ {
+ const QFontMetrics& fm = fontMetrics();
+#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
+ QSize size(fm.horizontalAdvance("..."), fm.height());
+#else
+ QSize size(fm.width("..."), fm.height());
+#endif
+ return size;
+ }
+
+ return QLabel::minimumSizeHint();
+}
diff --git a/src/widgets/elidelabel.hpp b/src/widgets/elidelabel.hpp
new file mode 100644
index 0000000..9eae69d
--- /dev/null
+++ b/src/widgets/elidelabel.hpp
@@ -0,0 +1,28 @@
+#ifndef ELIDELABEL_HPP
+#define ELIDELABEL_HPP
+
+#include <QLabel>
+
+class ElideLabel : public QLabel
+{
+ Q_OBJECT
+ Q_PROPERTY(Qt::TextElideMode elideMode READ elideMode WRITE setElideMode)
+
+public:
+ ElideLabel(QWidget* parent = 0);
+ ElideLabel(const QString &text, QWidget* parent = 0);
+ ~ElideLabel();
+
+ void setElideMode(Qt::TextElideMode mode);
+ Qt::TextElideMode elideMode() const;
+
+ QSize minimumSizeHint() const;
+
+protected:
+ virtual void paintEvent(QPaintEvent * event);
+
+private:
+ Qt::TextElideMode m_elideMode;
+};
+
+#endif // ELIDELABEL_HPP
diff --git a/src/widgets/mediaplayer.cpp b/src/widgets/mediaplayer.cpp
new file mode 100644
index 0000000..e510d21
--- /dev/null
+++ b/src/widgets/mediaplayer.cpp
@@ -0,0 +1,86 @@
+#include "mediaplayer.hpp"
+#include "ui_mediaplayer.h"
+
+#include <QMediaContent>
+#include <QToolButton>
+#include <QTime>
+#include <QIcon>
+
+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::stateChanged, this, &MediaPlayer::on_media_playbackChanged);
+ 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::stopPlaying()
+{
+ this->player.stop();
+}
+
+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());
+}
+
+void MediaPlayer::on_media_playbackChanged(QMediaPlayer::State status)
+{
+ this->ui->playpause_button->setIcon(
+ (status == QMediaPlayer::PlayingState) ? QIcon::fromTheme("pause") : QIcon::fromTheme("play")
+ );
+}
diff --git a/src/widgets/mediaplayer.hpp b/src/widgets/mediaplayer.hpp
new file mode 100644
index 0000000..c39a800
--- /dev/null
+++ b/src/widgets/mediaplayer.hpp
@@ -0,0 +1,42 @@
+#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);
+
+ void stopPlaying();
+
+private slots:
+ void on_playpause_button_clicked();
+
+ void on_mute_button_clicked(bool checked);
+
+private: // slots
+ void on_media_positionChanged(qint64 pos);
+
+ void on_media_playbackChanged(QMediaPlayer::State);
+
+private:
+ Ui::MediaPlayer *ui;
+ QBuffer media_stream;
+ QString mime;
+ QMediaPlayer player;
+};
+
+#endif // MEDIAPLAYER_HPP
diff --git a/src/widgets/mediaplayer.ui b/src/widgets/mediaplayer.ui
new file mode 100644
index 0000000..39fb570
--- /dev/null
+++ b/src/widgets/mediaplayer.ui
@@ -0,0 +1,85 @@
+<?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>
+ <property name="icon">
+ <iconset theme="play"/>
+ </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="icon">
+ <iconset theme="volume-on"/>
+ </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>
diff --git a/src/widgets/searchbar.cpp b/src/widgets/searchbar.cpp
new file mode 100644
index 0000000..4d8ea3a
--- /dev/null
+++ b/src/widgets/searchbar.cpp
@@ -0,0 +1,26 @@
+#include "searchbar.hpp"
+
+#include <QKeyEvent>
+
+SearchBar::SearchBar(QWidget *parent) : QLineEdit(parent)
+{
+
+}
+
+void SearchBar::keyPressEvent(QKeyEvent *event)
+{
+ if(event->key() == Qt::Key_Escape) {
+ emit this->escapePressed();
+ } else {
+ QLineEdit::keyPressEvent(event);
+ }
+}
+
+void SearchBar::keyReleaseEvent(QKeyEvent *event)
+{
+ if(event->key() == Qt::Key_Escape) {
+ // Eat the event
+ } else {
+ QLineEdit::keyReleaseEvent(event);
+ }
+}
diff --git a/src/widgets/searchbar.hpp b/src/widgets/searchbar.hpp
new file mode 100644
index 0000000..e03331f
--- /dev/null
+++ b/src/widgets/searchbar.hpp
@@ -0,0 +1,19 @@
+#ifndef SEARCHBAR_HPP
+#define SEARCHBAR_HPP
+
+#include <QLineEdit>
+
+class SearchBar : public QLineEdit
+{
+ Q_OBJECT
+public:
+ explicit SearchBar(QWidget *parent = nullptr);
+
+signals:
+ void escapePressed();
+public:
+ void keyPressEvent(QKeyEvent *event) override;
+ void keyReleaseEvent(QKeyEvent *event) override;
+};
+
+#endif // SEARCHBAR_HPP
diff --git a/src/widgets/ssltrusteditor.cpp b/src/widgets/ssltrusteditor.cpp
new file mode 100644
index 0000000..af10a72
--- /dev/null
+++ b/src/widgets/ssltrusteditor.cpp
@@ -0,0 +1,82 @@
+#include "ssltrusteditor.hpp"
+#include "ui_ssltrusteditor.h"
+
+SslTrustEditor::SslTrustEditor(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::SslTrustEditor)
+{
+ ui->setupUi(this);
+
+ this->ui->trust_level->clear();
+ this->ui->trust_level->addItem("Trust on first encounter", QVariant::fromValue<int>(SslTrust::TrustOnFirstUse));
+ this->ui->trust_level->addItem("Trust everything", QVariant::fromValue<int>(SslTrust::TrustEverything));
+ this->ui->trust_level->addItem("Manually verify fingerprints", QVariant::fromValue<int>(SslTrust::TrustNoOne));
+
+ this->ui->trusted_hosts->setModel(&this->current_trust.trusted_hosts);
+
+ this->ui->trusted_hosts->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
+ this->ui->trusted_hosts->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
+ this->ui->trusted_hosts->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
+
+ connect(
+ this->ui->trusted_hosts->selectionModel(),
+ &QItemSelectionModel::currentChanged,
+ this,
+ &SslTrustEditor::on_trusted_server_selection);
+}
+
+SslTrustEditor::~SslTrustEditor()
+{
+ delete ui;
+}
+
+SslTrust SslTrustEditor::trust() const
+{
+ return this->current_trust;
+}
+
+void SslTrustEditor::setTrust(const SslTrust &trust)
+{
+ this->current_trust = trust;
+
+ this->ui->trust_level->setCurrentIndex(
+ this->ui->trust_level->findData(QVariant::fromValue<int>(trust.trust_level))
+ );
+
+ if(trust.enable_ca)
+ this->ui->trust_enable_ca->setChecked(true);
+ else
+ this->ui->trust_disable__ca->setChecked(true);
+
+ this->ui->trusted_hosts->resizeColumnsToContents();
+}
+
+void SslTrustEditor::on_trust_revoke_selected_clicked()
+{
+ this->current_trust.trusted_hosts.remove(this->ui->trusted_hosts->currentIndex());
+}
+
+void SslTrustEditor::on_trust_enable_ca_clicked()
+{
+ this->current_trust.enable_ca = true;
+}
+
+void SslTrustEditor::on_trust_disable__ca_clicked()
+{
+ this->current_trust.enable_ca = false;
+}
+
+void SslTrustEditor::on_trust_level_currentIndexChanged(int index)
+{
+ this->current_trust.trust_level = SslTrust::TrustLevel(this->ui->trust_level->itemData(index).toInt());
+}
+
+void SslTrustEditor::on_trusted_server_selection(const QModelIndex &current, const QModelIndex &previous)
+{
+ Q_UNUSED(previous);
+ if(auto host = this->current_trust.trusted_hosts.get(current); host) {
+ this->ui->trust_revoke_selected->setEnabled(true);
+ } else {
+ this->ui->trust_revoke_selected->setEnabled(false);
+ }
+}
diff --git a/src/widgets/ssltrusteditor.hpp b/src/widgets/ssltrusteditor.hpp
new file mode 100644
index 0000000..841ba64
--- /dev/null
+++ b/src/widgets/ssltrusteditor.hpp
@@ -0,0 +1,44 @@
+#ifndef SSLTRUSTEDITOR_HPP
+#define SSLTRUSTEDITOR_HPP
+
+#include <QWidget>
+
+#include "ssltrust.hpp"
+
+namespace Ui {
+class SslTrustEditor;
+}
+
+class SslTrustEditor : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit SslTrustEditor(QWidget *parent = nullptr);
+ ~SslTrustEditor();
+
+
+ SslTrust trust() const;
+ void setTrust(SslTrust const & trust);
+
+private slots:
+ void on_trust_revoke_selected_clicked();
+
+ void on_trust_enable_ca_clicked();
+
+ void on_trust_disable__ca_clicked();
+
+ void on_trust_level_currentIndexChanged(int index);
+
+private:
+
+
+ void on_trusted_server_selection(QModelIndex const & current, QModelIndex const & previous);
+
+private:
+ Ui::SslTrustEditor *ui;
+
+ SslTrust current_trust;
+};
+
+#endif // SSLTRUSTEDITOR_HPP
diff --git a/src/widgets/ssltrusteditor.ui b/src/widgets/ssltrusteditor.ui
new file mode 100644
index 0000000..068c065
--- /dev/null
+++ b/src/widgets/ssltrusteditor.ui
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SslTrustEditor</class>
+ <widget class="QWidget" name="SslTrustEditor">
+ <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="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_23">
+ <property name="text">
+ <string>Trust Level</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="trust_level"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_24">
+ <property name="text">
+ <string>Certificate Authorities</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
+ <item>
+ <widget class="QRadioButton" name="trust_enable_ca">
+ <property name="text">
+ <string>Use local certificate authorities</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="trust_disable__ca">
+ <property name="text">
+ <string>Don't use local certificate authorities</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_25">
+ <property name="text">
+ <string>Trusted Hosts</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QTableView" name="trusted_hosts">
+ <property name="cornerButtonEnabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
+ <item>
+ <widget class="QToolButton" name="trust_revoke_selected">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Revoke trust</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>