Skip to content

Commit

Permalink
Merge pull request #3950 from Holzhaus/qml-cleanup
Browse files Browse the repository at this point in the history
QML Pointer Cleanup
  • Loading branch information
uklotzde committed Jun 5, 2021
2 parents 8eb8ecc + 378ef7a commit edfa039
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 11 deletions.
12 changes: 10 additions & 2 deletions src/skin/qml/qmlplayermanagerproxy.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
#include "skin/qml/qmlplayermanagerproxy.h"

#include <QQmlEngine>

#include "mixer/playermanager.h"
#include "skin/qml/qmlplayerproxy.h"

namespace mixxx {
namespace skin {
namespace qml {

QmlPlayerManagerProxy::QmlPlayerManagerProxy(PlayerManager* pPlayerManager, QObject* parent)
QmlPlayerManagerProxy::QmlPlayerManagerProxy(
std::shared_ptr<PlayerManager> pPlayerManager, QObject* parent)
: QObject(parent), m_pPlayerManager(pPlayerManager) {
}

Expand All @@ -17,7 +20,12 @@ QObject* QmlPlayerManagerProxy::getPlayer(const QString& group) {
qWarning() << "PlayerManagerProxy failed to find player for group" << group;
return nullptr;
}
return new QmlPlayerProxy(pPlayer, this);

// Don't set a parent here, so that the QML engine deletes the object when
// the corresponding JS object is garbage collected.
QmlPlayerProxy* pPlayerProxy = new QmlPlayerProxy(pPlayer);
QQmlEngine::setObjectOwnership(pPlayerProxy, QQmlEngine::JavaScriptOwnership);
return pPlayerProxy;
}

} // namespace qml
Expand Down
8 changes: 5 additions & 3 deletions src/skin/qml/qmlplayermanagerproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#include <QObject>
#include <QString>

class PlayerManager;
#include "mixer/playermanager.h"

namespace mixxx {
namespace skin {
Expand All @@ -11,12 +11,14 @@ namespace qml {
class QmlPlayerManagerProxy : public QObject {
Q_OBJECT
public:
explicit QmlPlayerManagerProxy(PlayerManager* pPlayerManager, QObject* parent = nullptr);
explicit QmlPlayerManagerProxy(
std::shared_ptr<PlayerManager> pPlayerManager,
QObject* parent = nullptr);

Q_INVOKABLE QObject* getPlayer(const QString& deck);

private:
const PlayerManager* m_pPlayerManager;
const std::shared_ptr<PlayerManager> m_pPlayerManager;
};

} // namespace qml
Expand Down
2 changes: 1 addition & 1 deletion src/skin/qml/qmlplayerproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace mixxx {
namespace skin {
namespace qml {

QmlPlayerProxy::QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent = nullptr)
QmlPlayerProxy::QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent)
: QObject(parent), m_pTrackPlayer(pTrackPlayer) {
connect(m_pTrackPlayer,
&BaseTrackPlayer::loadingTrack,
Expand Down
8 changes: 4 additions & 4 deletions src/skin/qml/qmlplayerproxy.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
#include <QColor>
#include <QObject>
#include <QPointer>
#include <QString>
#include <QUrl>

#include "mixer/basetrackplayer.h"
#include "track/track.h"

class BaseTrackPlayer;

namespace mixxx {
namespace skin {
namespace qml {
Expand All @@ -31,7 +31,7 @@ class QmlPlayerProxy : public QObject {
Q_PROPERTY(QUrl coverArtUrl READ getCoverArtUrl NOTIFY coverArtUrlChanged)

public:
explicit QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent);
explicit QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent = nullptr);

QString getTrack() const;
QString getTitle() const;
Expand Down Expand Up @@ -90,7 +90,7 @@ class QmlPlayerProxy : public QObject {
void coverArtUrlChanged();

private:
BaseTrackPlayer* m_pTrackPlayer;
QPointer<BaseTrackPlayer> m_pTrackPlayer;
TrackPointer m_pCurrentTrack;
};

Expand Down
2 changes: 1 addition & 1 deletion src/skin/qml/qmlskin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ QWidget* QmlSkin::loadSkin(QWidget* pParent,

QmlPlayerManagerProxy* pPlayerManagerProxy =
new QmlPlayerManagerProxy(
pCoreServices->getPlayerManager().get(),
pCoreServices->getPlayerManager(),
pEngine);
return pPlayerManagerProxy;
}));
Expand Down

0 comments on commit edfa039

Please sign in to comment.