diff options
Diffstat (limited to 'src/qml/qmlplayerproxy.cpp')
-rw-r--r-- | src/qml/qmlplayerproxy.cpp | 197 |
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 |