From 9dd8b4b38166e0ec8c65e125740dcee9d7fbabec Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 23 Mar 2025 14:49:27 +0100 Subject: [PATCH] Added artwork+biography in artist view, ref #640 --- approot/artist.xml | 40 ++++++++++++++++++------------ approot/explore.xml | 12 +++++++++ approot/messages.xml | 1 + approot/messages_fr.xml | 1 + approot/messages_it.xml | 1 + approot/messages_pl.xml | 1 + approot/messages_zh.xml | 1 + approot/release.xml | 12 --------- docroot/css/lms.css | 5 ++-- src/lms/ui/Utils.cpp | 13 ++++++++++ src/lms/ui/Utils.hpp | 2 ++ src/lms/ui/explore/ArtistView.cpp | 27 ++++++++++++++++++++ src/lms/ui/explore/ArtistView.hpp | 2 ++ src/lms/ui/explore/ReleaseView.cpp | 9 +------ 14 files changed, 88 insertions(+), 39 deletions(-) diff --git a/approot/artist.xml b/approot/artist.xml index 6119ca39..9c7b7b58 100644 --- a/approot/artist.xml +++ b/approot/artist.xml @@ -3,22 +3,30 @@ -
-

${name}

- ${clusters class="mb-2"} -
- ${play-btn class="btn btn-primary"} -
${release-containers} diff --git a/approot/explore.xml b/approot/explore.xml index d3dc2f81..eba82ec2 100644 --- a/approot/explore.xml +++ b/approot/explore.xml @@ -69,4 +69,16 @@
+ + + + diff --git a/approot/messages.xml b/approot/messages.xml index 188c07af..fe3315a8 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -209,6 +209,7 @@ Appears on +Biography Similar artists diff --git a/approot/messages_fr.xml b/approot/messages_fr.xml index 3b5421ed..998ed0b1 100644 --- a/approot/messages_fr.xml +++ b/approot/messages_fr.xml @@ -209,6 +209,7 @@ Apparaît dans +Biographie Artistes similaires diff --git a/approot/messages_it.xml b/approot/messages_it.xml index 74361e68..a11c121f 100644 --- a/approot/messages_it.xml +++ b/approot/messages_it.xml @@ -209,6 +209,7 @@ Appare su +Biografia Artisti simili diff --git a/approot/messages_pl.xml b/approot/messages_pl.xml index 372b5c18..6784aed7 100644 --- a/approot/messages_pl.xml +++ b/approot/messages_pl.xml @@ -226,6 +226,7 @@ Pojawia się na +Biografia Podobni artyści diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 0ea9cbe9..f0640e56 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -209,6 +209,7 @@ 出现于 + 相似歌手 diff --git a/approot/release.xml b/approot/release.xml index b103fc6d..9b983ef4 100644 --- a/approot/release.xml +++ b/approot/release.xml @@ -49,18 +49,6 @@ ${} - - - - ${artist class="text-decoration-none link-success"} diff --git a/docroot/css/lms.css b/docroot/css/lms.css index cee169a6..b9eed06b 100644 --- a/docroot/css/lms.css +++ b/docroot/css/lms.css @@ -87,7 +87,7 @@ body { min-width: 64px; } -.Lms-cover-full-modal-dialog { +.Lms-artwork-full-modal-dialog { width: auto; max-width: none; max-height: 90vh; @@ -103,12 +103,11 @@ body { height: auto; display: block; margin: auto; - cursor: pointer; object-fit: contain; } .Lms-cursor-pointer { - cursor: pointer; + cursor: pointer; } #lms-mp-progress { diff --git a/src/lms/ui/Utils.cpp b/src/lms/ui/Utils.cpp index 11305fc1..0cbfe325 100644 --- a/src/lms/ui/Utils.cpp +++ b/src/lms/ui/Utils.cpp @@ -35,6 +35,7 @@ #include "database/TrackList.hpp" #include "LmsApplication.hpp" +#include "ModalManager.hpp" #include "explore/Filters.hpp" namespace lms::ui::utils @@ -63,6 +64,18 @@ namespace lms::ui::utils return oss.str(); } + void showArtworkModal(Wt::WLink image) + { + auto rawImage{ std::make_unique(Wt::WString::tr("Lms.Explore.template.full-modal-artwork")) }; + rawImage->bindNew("artwork", image); + + Wt::WTemplate* rawImagePtr{ rawImage.get() }; + rawImage->clicked().connect([=] { + LmsApp->getModalManager().dispose(rawImagePtr); + }); + LmsApp->getModalManager().show(std::move(rawImage)); + } + std::unique_ptr createArtistImage(db::ArtistId artistId, ArtworkResource::Size size) { auto image{ std::make_unique() }; diff --git a/src/lms/ui/Utils.hpp b/src/lms/ui/Utils.hpp index 0365870b..2039db95 100644 --- a/src/lms/ui/Utils.hpp +++ b/src/lms/ui/Utils.hpp @@ -54,6 +54,8 @@ namespace lms::ui::utils { std::string durationToString(std::chrono::milliseconds msDuration); + void showArtworkModal(Wt::WLink image); + std::unique_ptr createReleaseCover(db::ReleaseId releaseId, ArtworkResource::Size size); std::unique_ptr createTrackImage(db::TrackId trackId, ArtworkResource::Size size); std::unique_ptr createArtistImage(db::ArtistId artistId, ArtworkResource::Size size); diff --git a/src/lms/ui/explore/ArtistView.cpp b/src/lms/ui/explore/ArtistView.cpp index 2f821edf..21b8d9c5 100644 --- a/src/lms/ui/explore/ArtistView.cpp +++ b/src/lms/ui/explore/ArtistView.cpp @@ -23,6 +23,7 @@ #include "core/String.hpp" #include "database/Artist.hpp" +#include "database/ArtistInfo.hpp" #include "database/Cluster.hpp" #include "database/Release.hpp" #include "database/ScanSettings.hpp" @@ -118,6 +119,8 @@ namespace lms::ui LmsApp->setTitle(artist->getName()); _artistId = *artistId; + refreshArtwork(); + refreshArtistInfo(); refreshReleases(); refreshAppearsOnReleases(); refreshNonReleaseTracks(); @@ -188,6 +191,30 @@ namespace lms::ui } } + void Artist::refreshArtwork() + { + auto* image{ bindWidget("artwork", utils::createArtistImage(_artistId, ArtworkResource::Size::Large)) }; + image->clicked().connect([this] { + utils::showArtworkModal(Wt::WLink{ LmsApp->getArtworkResource()->getArtistImageUrl(_artistId) }); + }); + } + + void Artist::refreshArtistInfo() + { + db::ArtistInfo::find(LmsApp->getDbSession(), _artistId, db::Range{ .offset = 0, .size = 1 }, [this](const db::ArtistInfo::pointer& _info) { + if (!_info->getBiography().empty()) + { + setCondition("if-has-biography", true); + Wt::WText* bio{ bindNew("biography", std::string{ _info->getBiography() }, Wt::TextFormat::Plain) }; + bio->setInline(false); + bio->setToolTip(tr("Lms.Explore.Artist.biography")); + bio->clicked().connect([bio] { + bio->toggleStyleClass("Lms-multiline-clamp", !bio->hasStyleClass("Lms-multiline-clamp")); // hack + }); + } + }); + } + void Artist::refreshReleases() { _releaseContainers.clear(); diff --git a/src/lms/ui/explore/ArtistView.hpp b/src/lms/ui/explore/ArtistView.hpp index cdf54f75..bcd9b527 100644 --- a/src/lms/ui/explore/ArtistView.hpp +++ b/src/lms/ui/explore/ArtistView.hpp @@ -47,6 +47,8 @@ namespace lms::ui private: void refreshView(); + void refreshArtwork(); + void refreshArtistInfo(); void refreshReleases(); void refreshAppearsOnReleases(); void refreshNonReleaseTracks(); diff --git a/src/lms/ui/explore/ReleaseView.cpp b/src/lms/ui/explore/ReleaseView.cpp index 64fd63bc..8fd13d70 100644 --- a/src/lms/ui/explore/ReleaseView.cpp +++ b/src/lms/ui/explore/ReleaseView.cpp @@ -309,14 +309,7 @@ namespace lms::ui auto* image{ bindWidget("cover", utils::createReleaseCover(release->getId(), ArtworkResource::Size::Large)) }; image->clicked().connect([=] { - auto fullCover{ std::make_unique(Wt::WString::tr("Lms.Explore.Release.template.full-cover")) }; - fullCover->bindNew("cover-full", Wt::WLink{ LmsApp->getArtworkResource()->getReleaseCoverUrl(*releaseId) }); - - Wt::WTemplate* fullCoverPtr{ fullCover.get() }; - fullCover->clicked().connect([=] { - LmsApp->getModalManager().dispose(fullCoverPtr); - }); - LmsApp->getModalManager().show(std::move(fullCover)); + utils::showArtworkModal(Wt::WLink{ LmsApp->getArtworkResource()->getReleaseCoverUrl(*releaseId) }); }); Wt::WContainerWidget* clusterContainers{ bindNew("clusters") };