summaryrefslogtreecommitdiffstats
path: root/src/qml/qmlplayerproxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qmlplayerproxy.cpp')
-rw-r--r--src/qml/qmlplayerproxy.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/qml/qmlplayerproxy.cpp b/src/qml/qmlplayerproxy.cpp
new file mode 100644
index 0000000000..f5f7925411
--- /dev/null
+++ b/src/qml/qmlplayerproxy.cpp
@@ -0,0 +1,197 @@
+#include "qml/qmlplayerproxy.h"
+
+#include "mixer/basetrackplayer.h"
+#include "qml/asyncimageprovider.h"
+
+#define PROPERTY_IMPL_GETTER(TYPE, NAME, GETTER) \
+ TYPE QmlPlayerProxy::GETTER() const { \
+ const TrackPointer pTrack = m_pCurrentTrack; \
+ if (pTrack == nullptr) { \
+ return TYPE(); \
+ } \
+ return pTrack->GETTER(); \
+ }
+
+#define PROPERTY_IMPL(TYPE, NAME, GETTER, SETTER) \
+ PROPERTY_IMPL_GETTER(TYPE, NAME, GETTER) \
+ void QmlPlayerProxy::SETTER(const TYPE& value) { \
+ const TrackPointer pTrack = m_pCurrentTrack; \
+ if (pTrack != nullptr) { \
+ pTrack->SETTER(value); \
+ } \
+ }
+
+namespace mixxx {
+namespace skin {
+namespace qml {
+
+QmlPlayerProxy::QmlPlayerProxy(BaseTrackPlayer* pTrackPlayer, QObject* parent)
+ : QObject(parent), m_pTrackPlayer(pTrackPlayer) {
+ connect(m_pTrackPlayer,
+ &BaseTrackPlayer::loadingTrack,
+ this,
+ &QmlPlayerProxy::slotLoadingTrack);
+ connect(m_pTrackPlayer,
+ &BaseTrackPlayer::newTrackLoaded,
+ this,
+ &QmlPlayerProxy::slotTrackLoaded);
+ connect(m_pTrackPlayer,
+ &BaseTrackPlayer::playerEmpty,
+ this,
+ &QmlPlayerProxy::trackUnloaded);
+ connect(this, &QmlPlayerProxy::trackChanged, this, &QmlPlayerProxy::slotTrackChanged);
+}
+
+void QmlPlayerProxy::loadTrackFromLocation(const QString& trackLocation) {
+ emit loadTrackFromLocationRequested(trackLocation);
+}
+
+void QmlPlayerProxy::loadTrackFromLocationUrl(const QUrl& trackLocationUrl) {
+ if (trackLocationUrl.isLocalFile()) {
+ loadTrackFromLocation(trackLocationUrl.toLocalFile());
+ } else {
+ qWarning() << "QmlPlayerProxy: URL" << trackLocationUrl << "is not a local file!";
+ }
+}
+
+void QmlPlayerProxy::slotTrackLoaded(TrackPointer pTrack) {
+ m_pCurrentTrack = pTrack;
+ if (pTrack != nullptr) {
+ connect(pTrack.get(),
+ &Track::artistChanged,
+ this,
+ &QmlPlayerProxy::artistChanged);
+ connect(pTrack.get(),
+ &Track::titleChanged,
+ this,
+ &QmlPlayerProxy::titleChanged);
+ connect(pTrack.get(),
+ &Track::albumChanged,
+ this,
+ &QmlPlayerProxy::albumChanged);
+ connect(pTrack.get(),
+ &Track::albumArtistChanged,
+ this,
+ &QmlPlayerProxy::albumArtistChanged);
+ connect(pTrack.get(),
+ &Track::genreChanged,
+ this,
+ &QmlPlayerProxy::genreChanged);
+ connect(pTrack.get(),
+ &Track::composerChanged,
+ this,
+ &QmlPlayerProxy::composerChanged);
+ connect(pTrack.get(),
+ &Track::groupingChanged,
+ this,
+ &QmlPlayerProxy::groupingChanged);
+ connect(pTrack.get(),
+ &Track::yearChanged,
+ this,
+ &QmlPlayerProxy::yearChanged);
+ connect(pTrack.get(),
+ &Track::trackNumberChanged,
+ this,
+ &QmlPlayerProxy::trackNumberChanged);
+ connect(pTrack.get(),
+ &Track::trackTotalChanged,
+ this,
+ &QmlPlayerProxy::trackTotalChanged);
+ connect(pTrack.get(),
+ &Track::commentChanged,
+ this,
+ &QmlPlayerProxy::commentChanged);
+ connect(pTrack.get(),
+ &Track::keyChanged,
+ this,
+ &QmlPlayerProxy::keyTextChanged);
+ connect(pTrack.get(),
+ &Track::colorUpdated,
+ this,
+ &QmlPlayerProxy::colorChanged);
+ }
+ emit trackChanged();
+ emit trackLoaded();
+}
+
+void QmlPlayerProxy::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) {
+ Q_UNUSED(pNewTrack);
+ Q_UNUSED(pOldTrack);
+ const TrackPointer pTrack = m_pCurrentTrack;
+ if (pTrack != nullptr) {
+ disconnect(pTrack.get(), nullptr, this, nullptr);
+ }
+ m_pCurrentTrack.reset();
+ emit trackChanged();
+ emit trackLoading();
+}
+
+void QmlPlayerProxy::slotTrackChanged() {
+ emit artistChanged();
+ emit titleChanged();
+ emit albumChanged();
+ emit albumArtistChanged();
+ emit genreChanged();
+ emit composerChanged();
+ emit groupingChanged();
+ emit yearChanged();
+ emit trackNumberChanged();
+ emit trackTotalChanged();
+ emit commentChanged();
+ emit keyTextChanged();
+ emit colorChanged();
+ emit coverArtUrlChanged();
+ emit trackLocationUrlChanged();
+}
+
+PROPERTY_IMPL(QString, artist, getArtist, setArtist)
+PROPERTY_IMPL(QString, title, getTitle, setTitle)
+PROPERTY_IMPL(QString, album, getAlbum, setAlbum)
+PROPERTY_IMPL(QString, albumArtist, getAlbumArtist, setAlbumArtist)
+PROPERTY_IMPL_GETTER(QString, genre, getGenre)
+PROPERTY_IMPL(QString, composer, getComposer, setComposer)
+PROPERTY_IMPL(QString, grouping, getGrouping, setGrouping)
+PROPERTY_IMPL(QString, year, getYear, setYear)
+PROPERTY_IMPL(QString, trackNumber, getTrackNumber, setTrackNumber)
+PROPERTY_IMPL(QString, trackTotal, getTrackTotal, setTrackTotal)
+PROPERTY_IMPL(QString, comment, getComment, setComment)
+PROPERTY_IMPL(QString, keyText, getKeyText, setKeyText)
+
+QColor QmlPlayerProxy::getColor() const {
+ const TrackPointer pTrack = m_pCurrentTrack;
+ if (pTrack == nullptr) {
+ return QColor();
+ }
+ return RgbColor::toQColor(pTrack->getColor());
+}
+
+void QmlPlayerProxy::setColor(const QColor& value) {
+ const TrackPointer pTrack = m_pTrackPlayer->getLoadedTrack();
+ if (pTrack != nullptr) {
+ std::optional<RgbColor> color = RgbColor::fromQColor(value);
+ pTrack->setColor(color);
+ }
+}
+
+QUrl QmlPlayerProxy::getCoverArtUrl() const {
+ const TrackPointer pTrack = m_pCurrentTrack;
+ if (pTrack == nullptr) {
+ return QUrl();
+ }
+
+ const CoverInfo coverInfo = pTrack->getCoverInfoWithLocation();
+ return AsyncImageProvider::trackLocationToCoverArtUrl(coverInfo.trackLocation);
+}
+
+QUrl QmlPlayerProxy::getTrackLocationUrl() const {
+ const TrackPointer pTrack = m_pCurrentTrack;
+ if (pTrack == nullptr) {
+ return QUrl();
+ }
+
+ return QUrl::fromLocalFile(pTrack->getLocation());
+}
+
+} // namespace qml
+} // namespace skin
+} // namespace mixxx