From 967b13871c31d967f85fdcdc52be34226919a36d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 17 Sep 2018 19:45:30 +0200 Subject: [PATCH] Imported existing sources --- images/web-radio.png | Bin 0 -> 4209 bytes translations/webradioplugin_de.ts | 101 ++++++++++++++++++++++ translations/webradioplugin_en.ts | 101 ++++++++++++++++++++++ webradiodialog.cpp | 128 ++++++++++++++++++++++++++++ webradiodialog.h | 38 +++++++++ webradiodialog.ui | 135 ++++++++++++++++++++++++++++++ webradioplugin.cpp | 45 ++++++++++ webradioplugin.h | 24 ++++++ webradioplugin.json | 0 webradioplugin.pro | 26 ++++++ webradioplugin_resources.qrc | 5 ++ webradiosettings.cpp | 114 +++++++++++++++++++++++++ webradiosettings.h | 42 ++++++++++ webradiosettingswidget.cpp | 37 ++++++++ webradiosettingswidget.h | 29 +++++++ 15 files changed, 825 insertions(+) create mode 100644 images/web-radio.png create mode 100644 translations/webradioplugin_de.ts create mode 100644 translations/webradioplugin_en.ts create mode 100644 webradiodialog.cpp create mode 100644 webradiodialog.h create mode 100644 webradiodialog.ui create mode 100644 webradioplugin.cpp create mode 100644 webradioplugin.h create mode 100644 webradioplugin.json create mode 100644 webradioplugin.pro create mode 100644 webradioplugin_resources.qrc create mode 100644 webradiosettings.cpp create mode 100644 webradiosettings.h create mode 100644 webradiosettingswidget.cpp create mode 100644 webradiosettingswidget.h diff --git a/images/web-radio.png b/images/web-radio.png new file mode 100644 index 0000000000000000000000000000000000000000..c68d7c11690f317fe2d334bf8705d11bc5e390d5 GIT binary patch literal 4209 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 + + + + WebRadioDialog + + + Radio + Radio + + + + Play + Abspielen + + + + Pause + Pause + + + + Stop + Stop + + + + Stopped + Gestoppt + + + + Playing + Wird abgespielt + + + + Paused + Pausiert + + + + + Unknown + Unbekannt + + + + Unknown media + Unbekanntes Medium + + + + No media + Kein Medium + + + + Loading media... + Lade Medium... + + + + Loaded media + Medium geladen + + + + Stalled media + Medium angehalten + + + + Buffering media + Puffere Medium + + + + Buffered media + Medium gepuffert + + + + End of media + Ende des Mediums + + + + Invalid media + Ungültiges Medium + + + + WebRadioPlugin + + + Play webradio + Webradio spielen + + + diff --git a/translations/webradioplugin_en.ts b/translations/webradioplugin_en.ts new file mode 100644 index 0000000..7ba7a5b --- /dev/null +++ b/translations/webradioplugin_en.ts @@ -0,0 +1,101 @@ + + + + + WebRadioDialog + + + Radio + + + + + Play + + + + + Pause + + + + + Stop + + + + + Stopped + + + + + Playing + + + + + Paused + + + + + + Unknown + + + + + Unknown media + + + + + No media + + + + + Loading media... + + + + + Loaded media + + + + + Stalled media + + + + + Buffering media + + + + + Buffered media + + + + + End of media + + + + + Invalid media + + + + + WebRadioPlugin + + + Play webradio + + + + diff --git a/webradiodialog.cpp b/webradiodialog.cpp new file mode 100644 index 0000000..236ee90 --- /dev/null +++ b/webradiodialog.cpp @@ -0,0 +1,128 @@ +#include "webradiodialog.h" +#include "ui_webradiodialog.h" + +#include "mainwindow.h" +#include "zeiterfassungsettings.h" + +WebRadioDialog::WebRadioDialog(MainWindow &mainWindow) : + ZeiterfassungDialog(&mainWindow), + ui(new Ui::WebRadioDialog), + m_mainWindow(mainWindow), + m_settings(m_mainWindow.settings()) +{ + ui->setupUi(this); + + m_player = new QMediaPlayer(this); + connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); + connect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); + connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::mediaStatusChanged); + connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::updateWidgets); + connect(m_player, static_cast(&QMediaPlayer::error), this, &WebRadioDialog::error); + + for(const auto &url : m_settings.urls()) + ui->comboBox->addItem(url, url); + + ui->comboBox->setCurrentIndex(ui->comboBox->findData(m_settings.lastUrl())); + + connect(ui->comboBox, static_cast(&QComboBox::currentIndexChanged), + this, &WebRadioDialog::currentIndexChanged); + + connect(ui->comboBox, static_cast(&QComboBox::currentIndexChanged), + this, &WebRadioDialog::updateWidgets); + + connect(ui->pushButtonPlay, &QAbstractButton::pressed, this, &WebRadioDialog::play); + connect(ui->pushButtonPause, &QAbstractButton::pressed, m_player, &QMediaPlayer::pause); + connect(ui->pushButtonStop, &QAbstractButton::pressed, m_player, &QMediaPlayer::stop); + + m_player->setVolume(m_settings.volume()); + ui->horizontalSlider->setValue(m_player->volume()); + connect(ui->horizontalSlider, &QAbstractSlider::valueChanged, this, &WebRadioDialog::volumeChanged); + + stateChanged(m_player->state()); + mediaStatusChanged(m_player->mediaStatus()); + currentIndexChanged(ui->comboBox->currentIndex()); + updateWidgets(); +} + +WebRadioDialog::~WebRadioDialog() +{ + // To avoid crash on app close + disconnect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::stateChanged); + disconnect(m_player, &QMediaPlayer::stateChanged, this, &WebRadioDialog::updateWidgets); + disconnect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::mediaStatusChanged); + disconnect(m_player, &QMediaPlayer::mediaStatusChanged, this, &WebRadioDialog::updateWidgets); + disconnect(m_player, static_cast(&QMediaPlayer::error), this, &WebRadioDialog::error); + + delete ui; +} + +void WebRadioDialog::stateChanged(QMediaPlayer::State newState) +{ + switch(newState) + { + case QMediaPlayer::StoppedState: ui->labelState->setText(tr("Stopped")); break; + case QMediaPlayer::PlayingState: ui->labelState->setText(tr("Playing")); break; + case QMediaPlayer::PausedState: ui->labelState->setText(tr("Paused")); break; + default: + qWarning() << "unknown state" << newState; + ui->labelState->setText(tr("Unknown")); + } +} + +void WebRadioDialog::mediaStatusChanged(QMediaPlayer::MediaStatus status) +{ + switch(status) + { + case QMediaPlayer::UnknownMediaStatus: ui->labelMediaStatus->setText(tr("Unknown media")); break; + case QMediaPlayer::NoMedia: ui->labelMediaStatus->setText(tr("No media")); break; + case QMediaPlayer::LoadingMedia: ui->labelMediaStatus->setText(tr("Loading media...")); break; + case QMediaPlayer::LoadedMedia: ui->labelMediaStatus->setText(tr("Loaded media")); break; + case QMediaPlayer::StalledMedia: ui->labelMediaStatus->setText(tr("Stalled media")); break; + case QMediaPlayer::BufferingMedia: ui->labelMediaStatus->setText(tr("Buffering media")); break; + case QMediaPlayer::BufferedMedia: ui->labelMediaStatus->setText(tr("Buffered media")); break; + case QMediaPlayer::EndOfMedia: ui->labelMediaStatus->setText(tr("End of media")); break; + case QMediaPlayer::InvalidMedia: ui->labelMediaStatus->setText(tr("Invalid media")); break; + default: + qWarning() << "unknown mediaStatus" << status; + ui->labelMediaStatus->setText(tr("Unknown")); + } +} + +void WebRadioDialog::error(QMediaPlayer::Error error) +{ + qWarning() << error; +} + +void WebRadioDialog::currentIndexChanged(int index) +{ + if(index == -1) + m_player->setMedia(QMediaContent()); + else + m_player->setMedia(QMediaContent(QUrl(ui->comboBox->currentData().toString()))); +} + +void WebRadioDialog::play() +{ + if(ui->comboBox->currentIndex() == -1) + return; + + m_settings.setLastUrl(ui->comboBox->currentData().toString()); + + m_player->play(); +} + +void WebRadioDialog::updateWidgets() +{ + ui->comboBox->setEnabled(m_player->state() != QMediaPlayer::PlayingState); + ui->pushButtonPlay->setEnabled(ui->comboBox->currentIndex() > -1 && + (m_player->state() == QMediaPlayer::StoppedState || m_player->state() == QMediaPlayer::PausedState) && + (m_player->mediaStatus() == QMediaPlayer::LoadedMedia || m_player->mediaStatus() == QMediaPlayer::BufferedMedia)); + ui->pushButtonPause->setEnabled(m_player->state() == QMediaPlayer::PlayingState || m_player->state() == QMediaPlayer::PausedState); + ui->pushButtonStop->setEnabled(m_player->state() == QMediaPlayer::PlayingState || m_player->state() == QMediaPlayer::PausedState); +} + +void WebRadioDialog::volumeChanged(int volume) +{ + m_settings.setVolume(volume); + m_player->setVolume(volume); +} diff --git a/webradiodialog.h b/webradiodialog.h new file mode 100644 index 0000000..b1c6c73 --- /dev/null +++ b/webradiodialog.h @@ -0,0 +1,38 @@ +#pragma once + +#include + +#include "zeiterfassungdialog.h" + +#include "webradiosettings.h" + +class MainWindow; + +namespace Ui { class WebRadioDialog; } + +class WebRadioDialog : public ZeiterfassungDialog +{ + Q_OBJECT + +public: + explicit WebRadioDialog(MainWindow &mainWindow); + ~WebRadioDialog(); + +private Q_SLOTS: + void stateChanged(QMediaPlayer::State newState); + void mediaStatusChanged(QMediaPlayer::MediaStatus status); + void error(QMediaPlayer::Error error); + void currentIndexChanged(int index); + void volumeChanged(int volume); + void play(); + +private: + void updateWidgets(); + + Ui::WebRadioDialog *ui; + + MainWindow &m_mainWindow; + WebRadioSettings m_settings; + + QMediaPlayer *m_player; +}; diff --git a/webradiodialog.ui b/webradiodialog.ui new file mode 100644 index 0000000..5758e10 --- /dev/null +++ b/webradiodialog.ui @@ -0,0 +1,135 @@ + + + WebRadioDialog + + + + 0 + 0 + 494 + 155 + + + + Radio + + + + + + + + + + + + 0 + 50 + + + + Play + + + + + + + + 0 + 50 + + + + Pause + + + + + + + + 0 + 50 + + + + Stop + + + + + + + Qt::Horizontal + + + + + + + + + + + state + + + + + + + mediaStatus + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + accepted() + WebRadioDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + WebRadioDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/webradioplugin.cpp b/webradioplugin.cpp new file mode 100644 index 0000000..d75bfcb --- /dev/null +++ b/webradioplugin.cpp @@ -0,0 +1,45 @@ +#include "webradioplugin.h" + +#include +#include +#include +#include +#include +#include + +#include "mainwindow.h" + +#include "webradiodialog.h" +#include "webradiosettingswidget.h" + +WebRadioPlugin::WebRadioPlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("webradioplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation webradioplugin"; + } + } + else + { + qWarning() << "could not load translation webradioplugin"; + } +} + +void WebRadioPlugin::attachTo(MainWindow &mainWindow) +{ + auto dialog = new WebRadioDialog(mainWindow); + mainWindow.menuTools()->addAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/webradioplugin/images/web-radio.png")), + tr("Play webradio"), dialog, &QWidget::show); +} + +SettingsWidget *WebRadioPlugin::settingsWidget(ZeiterfassungSettings &settings, QWidget *parent) const +{ + return new WebRadioSettingsWidget(settings, parent); +} diff --git a/webradioplugin.h b/webradioplugin.h new file mode 100644 index 0000000..6644b3f --- /dev/null +++ b/webradioplugin.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class Q_DECL_EXPORT WebRadioPlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "webradioplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit WebRadioPlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + + SettingsWidget *settingsWidget(ZeiterfassungSettings &settings, QWidget *parent = Q_NULLPTR) const Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/webradioplugin.json b/webradioplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/webradioplugin.pro b/webradioplugin.pro new file mode 100644 index 0000000..2999d4b --- /dev/null +++ b/webradioplugin.pro @@ -0,0 +1,26 @@ +QT += core network gui widgets multimedia + +DBLIBS += dbgui zeiterfassungcore zeiterfassunggui + +TARGET = webradioplugin + +HEADERS += webradiodialog.h \ + webradioplugin.h \ + webradiosettings.h \ + webradiosettingswidget.h + +SOURCES += webradiodialog.cpp \ + webradioplugin.cpp \ + webradiosettings.cpp \ + webradiosettingswidget.cpp + +FORMS += webradiodialog.ui + +RESOURCES += webradioplugin_resources.qrc + +TRANSLATIONS += translations/webradioplugin_en.ts \ + translations/webradioplugin_de.ts + +OTHER_FILES += webradioplugin.json + +include(../plugin.pri) diff --git a/webradioplugin_resources.qrc b/webradioplugin_resources.qrc new file mode 100644 index 0000000..f7b12b5 --- /dev/null +++ b/webradioplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/web-radio.png + + diff --git a/webradiosettings.cpp b/webradiosettings.cpp new file mode 100644 index 0000000..615c44a --- /dev/null +++ b/webradiosettings.cpp @@ -0,0 +1,114 @@ +#include "webradiosettings.h" + +#include "zeiterfassungsettings.h" + +const QString WebRadioSettings::m_urls("WebRadioPlugin/urls"); +const QString WebRadioSettings::m_lastUrl("WebRadioPlugin/lastUrl"); +const QString WebRadioSettings::m_volume("WebRadioPlugin/volume"); +const QStringList WebRadioSettings::m_defaultUrls { + QStringLiteral("http://stream.drumandbass.fm:9002"), + QStringLiteral("http://stream.trap.fm:6002"), + QStringLiteral("http://stream.dubbase.fm:7002"), + QStringLiteral("http://lw1.mp3.tb-group.fm/hb.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/tb.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/tt.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/ht.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/trb.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/ct.mp3"), + QStringLiteral("http://lw1.mp3.tb-group.fm/clt.mp3"), + QStringLiteral("https://live.helsinki.at:8088/live160.ogg") +}; +const int WebRadioSettings::m_defaultVolume(100); + +WebRadioSettings::WebRadioSettings(ZeiterfassungSettings &settings, QObject *parent) : + QObject(parent), + m_settings(settings) +{ +} + +QStringList WebRadioSettings::urls() const +{ + return m_settings.value(m_urls, m_defaultUrls).toStringList(); +} + +bool WebRadioSettings::setUrls(const QStringList &urls) +{ + if(this->urls() == urls) + return true; + + if(urls == m_defaultUrls) + m_settings.remove(m_urls); + else + m_settings.setValue(m_urls, urls); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) + Q_EMIT urlsChanged(urls); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); + } + + return success; +} + +QString WebRadioSettings::lastUrl() const +{ + return m_settings.value(m_lastUrl).toString(); +} + +bool WebRadioSettings::setLastUrl(const QString &lastUrl) +{ + if(this->lastUrl() == lastUrl) + return true; + + if(lastUrl.isNull()) + m_settings.remove(m_lastUrl); + else + m_settings.setValue(m_lastUrl, lastUrl); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) + Q_EMIT lastUrlChanged(lastUrl); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); + } + + return success; +} + +int WebRadioSettings::volume() const +{ + return m_settings.value(m_volume, m_defaultVolume).toInt(); +} + +bool WebRadioSettings::setVolume(int volume) +{ + if(this->volume() == volume) + return true; + + if(volume == m_defaultVolume) + m_settings.remove(m_volume); + else + m_settings.setValue(m_volume, volume); + + m_settings.sync(); + + const auto success = m_settings.status() == QSettings::NoError; + if(success) + Q_EMIT volumeChanged(volume); + else + { + Q_EMIT m_settings.saveErrorOccured(); + Q_EMIT saveErrorOccured(); + } + + return success; +} diff --git a/webradiosettings.h b/webradiosettings.h new file mode 100644 index 0000000..0e8ceb6 --- /dev/null +++ b/webradiosettings.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +class ZeiterfassungSettings; + +class WebRadioSettings : public QObject +{ + Q_OBJECT + Q_PROPERTY(QStringList urls READ urls WRITE setUrls NOTIFY urlsChanged) + Q_PROPERTY(QString lastUrl READ lastUrl WRITE setLastUrl NOTIFY lastUrlChanged) + Q_PROPERTY(int volume READ volume WRITE setVolume NOTIFY volumeChanged) + +public: + WebRadioSettings(ZeiterfassungSettings &settings, QObject *parent = Q_NULLPTR); + + QStringList urls() const; + bool setUrls(const QStringList &urls); + + QString lastUrl() const; + bool setLastUrl(const QString &lastUrl); + + int volume() const; + bool setVolume(int volume); + +Q_SIGNALS: + void saveErrorOccured(); + + void urlsChanged(const QStringList &urls); + void lastUrlChanged(const QString &lastUrl); + void volumeChanged(int volume); + +private: + ZeiterfassungSettings &m_settings; + + static const QString m_urls; + static const QString m_lastUrl; + static const QString m_volume; + static const QStringList m_defaultUrls; + static const int m_defaultVolume; +}; diff --git a/webradiosettingswidget.cpp b/webradiosettingswidget.cpp new file mode 100644 index 0000000..04f8b56 --- /dev/null +++ b/webradiosettingswidget.cpp @@ -0,0 +1,37 @@ +#include "webradiosettingswidget.h" + +#include + +#include "stringlistwidget.h" + +WebRadioSettingsWidget::WebRadioSettingsWidget(ZeiterfassungSettings &settings, QWidget *parent) : + SettingsWidget(parent), + m_settings(settings) +{ + auto layout = new QFormLayout(this); + layout->setMargin(0); + + m_urlsWidget = new StringListWidget(m_settings.urls(), this); + layout->addRow(tr("URLs:"), m_urlsWidget); + + setLayout(layout); +} + +bool WebRadioSettingsWidget::isValid(QString &message) const +{ + for(const auto &url : m_urlsWidget->value()) + { + if(!QUrl::fromUserInput(url).isValid()) + { + message = tr("A web radio url is invalid!"); + return false; + } + } + + return true; +} + +bool WebRadioSettingsWidget::apply() +{ + return m_settings.setUrls(m_urlsWidget->value()); +} diff --git a/webradiosettingswidget.h b/webradiosettingswidget.h new file mode 100644 index 0000000..04f0181 --- /dev/null +++ b/webradiosettingswidget.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "settingswidget.h" + +#include "webradiosettings.h" + +class StringListWidget; + +class ZeiterfassungSettings; + +class WebRadioSettingsWidget : public SettingsWidget +{ + Q_OBJECT + +public: + explicit WebRadioSettingsWidget(ZeiterfassungSettings &settings, QWidget *parent = Q_NULLPTR); + + bool isValid(QString &message) const Q_DECL_OVERRIDE; + +public Q_SLOTS: + virtual bool apply() Q_DECL_OVERRIDE; + +private: + WebRadioSettings m_settings; + + StringListWidget *m_urlsWidget; +};