Skip to content
This repository was archived by the owner on May 3, 2019. It is now read-only.

Commit

Permalink
Use WebChannel to interact with WebEngineView
Browse files Browse the repository at this point in the history
Close #172
  • Loading branch information
ColinDuquesnoy committed Dec 22, 2017
1 parent a5f856c commit 22f7ff3
Show file tree
Hide file tree
Showing 10 changed files with 146 additions and 148 deletions.
1 change: 1 addition & 0 deletions cmake/FindDependencies.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
Svg
Test
WebEngine
WebChannel
WebEngineWidgets
Widgets)
find_package(Qt5LinguistTools REQUIRED)
Expand Down
72 changes: 11 additions & 61 deletions lib/MellowPlayer/Domain/Player/Player.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#include "Player.hpp"
#include "Song.hpp"
#include <QVariantMap>
#include <QTimer>
#include <MellowPlayer/Domain/Logging/Loggers.hpp>
#include <MellowPlayer/Domain/Logging/ILogger.hpp>
#include <MellowPlayer/Domain/Logging/LoggingMacros.hpp>
Expand All @@ -16,12 +14,9 @@ Player::Player(StreamingService& streamingService)
: logger_(Loggers::logger("Player-" + streamingService.name().toStdString())),
currentSong_(nullptr),
streamingService_(streamingService),
streamingServiceScript_(*streamingService.script()),
refreshTimer_(make_unique<QTimer>())
streamingServiceScript_(*streamingService.script())
{
connect(refreshTimer_.get(), &QTimer::timeout, this, &Player::refresh);
connect(&streamingService, &StreamingService::scriptChanged, this, &Player::loadPlugin);
refreshTimer_->setInterval(100);
connect(&streamingService, &StreamingService::scriptChanged, this, &Player::sourceCodeChanged);
}

Player::~Player() = default;
Expand All @@ -35,41 +30,20 @@ void Player::togglePlayPause()
play();
}

void Player::play()
{
LOG_TRACE(logger_, "play()");
emit runJavascriptRequested(streamingServiceScript_.play());
}

void Player::pause()
{
LOG_INFO(logger_, "pause()");
emit runJavascriptRequested(streamingServiceScript_.pause());
}

void Player::next()
{
LOG_TRACE(logger_, "next()");
emit runJavascriptRequested(streamingServiceScript_.next());
}

void Player::previous()
{
LOG_TRACE(logger_, "previous()");
emit runJavascriptRequested(streamingServiceScript_.previous());
}

void Player::seekToPosition(double value)
{
LOG_TRACE(logger_, "seekToPosition(" << value << ")");
emit runJavascriptRequested(streamingServiceScript_.seekToPosition(value));
emit seekToPositionRequest(value);
setPosition(value);
}

void Player::setVolume(double value)
{
LOG_TRACE(logger_, "setVolume(" << value << ")");
emit runJavascriptRequested(streamingServiceScript_.setVolume(value));
if (value != volume_)
{
volume_ = value;
emit changeVolumeRequest(value);
emit volumeChanged();
}
}

void Player::toggleFavoriteSong()
Expand All @@ -84,18 +58,6 @@ void Player::toggleFavoriteSong()
addToFavorites();
}

void Player::addToFavorites()
{
LOG_TRACE(logger_, "addToFavorites()");
emit runJavascriptRequested(streamingServiceScript_.addToFavorites());
}

void Player::removeFromFavorites()
{
LOG_TRACE(logger_, "removeFromFavorites()");
emit runJavascriptRequested(streamingServiceScript_.removeFromFavorites());
}

Song* Player::currentSong()
{
return currentSong_.get();
Expand Down Expand Up @@ -153,21 +115,13 @@ void Player::stop()
LOG_DEBUG(logger_, "stop()");
isRunning_ = false;
emit isRunningChanged();
refreshTimer_->stop();
}

bool Player::isRunning() const
{
return isRunning_;
}

void Player::refresh()
{
LOG_TRACE(logger_, "refresh()");
emit updateRequested(streamingServiceScript_.update());
refreshTimer_->start();
}

void Player::setUpdateResults(const QVariant& results)
{
LOG_TRACE(logger_, "setUpdateResults()");
Expand Down Expand Up @@ -203,7 +157,6 @@ void Player::suspend()
pause();
playbackStatus_ = PlaybackStatus::Paused;
}
refreshTimer_->stop();
}

void Player::resume()
Expand All @@ -212,7 +165,6 @@ void Player::resume()
if (suspendedState_ == PlaybackStatus::Playing) {
play();
}
refreshTimer_->start();
}

void Player::setCurrentSong(unique_ptr<Song>& song)
Expand Down Expand Up @@ -318,8 +270,6 @@ bool Player::isStopped() const
return playbackStatus_ == PlaybackStatus::Stopped;
}

void Player::loadPlugin()
{
emit runJavascriptRequested(streamingServiceScript_.constants() + "\n" + streamingServiceScript_.code());
refreshTimer_->start();
QString Player::sourceCode() const {
return streamingServiceScript_.constants() + "\n" + streamingServiceScript_.code();
}
31 changes: 14 additions & 17 deletions lib/MellowPlayer/Domain/Player/Player.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,15 @@ namespace MellowPlayer::Domain
{
Q_OBJECT
Q_PROPERTY(bool isRunning READ isRunning NOTIFY isRunningChanged)
Q_PROPERTY(QString sourceCode READ sourceCode NOTIFY sourceCodeChanged)
public:
explicit Player(Domain::StreamingService& streamingService);
~Player() override;

// IPlayer
Q_INVOKABLE void togglePlayPause() override;
Q_INVOKABLE void play() override;
Q_INVOKABLE void pause() override;
Q_INVOKABLE void next() override;
Q_INVOKABLE void previous() override;
Q_INVOKABLE void seekToPosition(double value) override;
Q_INVOKABLE void setVolume(double volume) override;
Q_INVOKABLE void togglePlayPause() override;
Q_INVOKABLE void toggleFavoriteSong() override;
Q_INVOKABLE void addToFavorites() override;
Q_INVOKABLE void removeFromFavorites() override;

Domain::Song* currentSong() override;
double position() const override;
Expand All @@ -43,12 +37,13 @@ namespace MellowPlayer::Domain
QString serviceName() const override;
bool isPlaying() const override;
bool isStopped() const override;
bool isRunning() const;
QString sourceCode() const;

// invoked by WebView (QML)
Q_INVOKABLE void setUpdateResults(const QVariant& results);
Q_INVOKABLE void start();
Q_INVOKABLE void stop();
Q_INVOKABLE bool isRunning() const;
Q_INVOKABLE void setUpdateResults(const QVariant& results);

// invoked by CurrentPlayer
void suspend();
Expand All @@ -60,13 +55,16 @@ namespace MellowPlayer::Domain
void setPlaybackStatus(PlaybackStatus value);

signals:
void runJavascriptRequested(const QString& script);
void updateRequested(const QString& script);
void isRunningChanged();

public slots:
void refresh();
void loadPlugin();
void sourceCodeChanged();
void play() override;
void pause() override;
void next() override;
void previous() override;
void addToFavorites() override;
void removeFromFavorites() override;
void seekToPositionRequest(double newPosition);
void changeVolumeRequest(double newVolume);

private:
void setCurrentSong(std::unique_ptr<Domain::Song>& song);
Expand All @@ -90,6 +88,5 @@ namespace MellowPlayer::Domain
Domain::StreamingServiceScript& streamingServiceScript_;
PlaybackStatus suspendedState_ = PlaybackStatus::Stopped;
bool isRunning_ = false;
std::unique_ptr<QTimer> refreshTimer_;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,51 +32,6 @@ const QString& StreamingServiceScript::path() const
return path_;
}

QString StreamingServiceScript::update() const
{
return "if (typeof update !== 'undefined') update();";
}

QString StreamingServiceScript::play() const
{
return "play();";
}

QString StreamingServiceScript::pause() const
{
return "pause();";
}

QString StreamingServiceScript::next() const
{
return "goNext();";
}

QString StreamingServiceScript::previous() const
{
return "goPrevious();";
}

QString StreamingServiceScript::setVolume(double volume) const
{
return QString("setVolume(%1);").arg(volume);
}

QString StreamingServiceScript::addToFavorites() const
{
return "addToFavorites();";
}

QString StreamingServiceScript::removeFromFavorites() const
{
return "removeFromFavorites();";
}

QString StreamingServiceScript::seekToPosition(double position) const
{
return QString("seekToPosition(%1);").arg(position);
}

QString StreamingServiceScript::constants() const
{
return "mellowplayer = {\n"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,6 @@ namespace MellowPlayer::Domain
void setCode(const QString& value);

const QString& path() const;

Q_INVOKABLE QString update() const;
Q_INVOKABLE QString play() const;
Q_INVOKABLE QString pause() const;
Q_INVOKABLE QString next() const;
Q_INVOKABLE QString previous() const;
Q_INVOKABLE QString setVolume(double volume) const;
Q_INVOKABLE QString addToFavorites() const;
Q_INVOKABLE QString removeFromFavorites() const;
Q_INVOKABLE QString seekToPosition(double position) const;

signals:
void codeChanged(QString);

Expand Down
38 changes: 38 additions & 0 deletions lib/MellowPlayer/Presentation/Resources/mellowplayer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
var ready = false;
var qWebChannel = null;
var player = null;
var refreshInterval = 100;

function refresh() {
if (ready && player.isRunning)
player.updateResults = update();
}

function initialize() {
console.log("Connecting to MellowPlayer's WebChannel...");
try {
qWebChannel = new QWebChannel(qt.webChannelTransport, function(channel) {
console.log("Connected to MellowPlayer's WebChannel, ready to send/receive messages!");
player = channel.objects.player;

// connect events to integration script functions
player.play.connect(play);
player.pause.connect(pause);
player.next.connect(goNext);
player.previous.connect(goPrevious);
player.addToFavorites.connect(addToFavorites);
player.removeFromFavorites.connect(removeFromFavorites);
player.seekToPosition.connect(seekToPosition);
player.changeVolume.connect(setVolume);

ready = true;
window.setInterval(refresh, refreshInterval);
});
}
catch (e)
{
console.warn(e);
}
}

initialize();
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <MellowPlayer/Domain/Settings/ISettingsStore.hpp>
#include <MellowPlayer/Domain/StreamingServices/StreamingService.hpp>
#include <MellowPlayer/Domain/Settings/SettingKey.hpp>
#include <qfile.h>

using namespace MellowPlayer::Domain;
using namespace MellowPlayer::Domain;
Expand Down
Loading

0 comments on commit 22f7ff3

Please sign in to comment.