diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-22 21:10:04 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-22 21:10:04 +0200 |
| commit | 75ec461eeaa851cb5c53f4cfffc434e3e529ed1d (patch) | |
| tree | 3944737340718ca3675381aa06636045d397e780 /src/widgets | |
| parent | 8dbfb0890560fd1cd698d06fa05ac868c4db8576 (diff) | |
| download | kristall-75ec461eeaa851cb5c53f4cfffc434e3e529ed1d.tar.gz | |
Restructures the project source and cleans up a bit
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/elidelabel.cpp | 59 | ||||
| -rw-r--r-- | src/widgets/elidelabel.hpp | 28 | ||||
| -rw-r--r-- | src/widgets/mediaplayer.cpp | 86 | ||||
| -rw-r--r-- | src/widgets/mediaplayer.hpp | 42 | ||||
| -rw-r--r-- | src/widgets/mediaplayer.ui | 85 | ||||
| -rw-r--r-- | src/widgets/searchbar.cpp | 26 | ||||
| -rw-r--r-- | src/widgets/searchbar.hpp | 19 | ||||
| -rw-r--r-- | src/widgets/ssltrusteditor.cpp | 82 | ||||
| -rw-r--r-- | src/widgets/ssltrusteditor.hpp | 44 | ||||
| -rw-r--r-- | src/widgets/ssltrusteditor.ui | 101 |
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 ¤t, 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> |
