-
-
${name}
- ${
}${artists class="d-block d-md-none text-truncate"}${}
+
+
${name}
+ ${
}${artists class="d-block d-md-none"}${}
+ ${
}${work}
${}
- ${}${artists-md class="d-none d-md-block text-truncate"}${}
+ ${}${artists-md class="d-none d-md-block"}${}
-
- ${
}${release class="d-none d-lg-inline text-truncate text-decoration-none link-success"}${}
+
+ ${}${release class="d-none d-lg-inline text-decoration-none link-success"}${}
diff --git a/src/lms/ui/MediaPlayer.cpp b/src/lms/ui/MediaPlayer.cpp
index 5e33226e..5c3aa1f6 100644
--- a/src/lms/ui/MediaPlayer.cpp
+++ b/src/lms/ui/MediaPlayer.cpp
@@ -244,7 +244,7 @@ namespace lms::ui
const std::string nativeResource{ _audioFileResource->getUrl(trackId) };
const auto artistDisplayInfo{ utils::computeArtistDisplayInfo(track, db::TrackArtistLinkType::Artist) };
- const std::string displayTitle{ utils::computeTrackDisplayTitle(track) };
+ const std::string displayTitle{ utils::computeTrackDisplayInfo(track).title };
oss
<< "var params = {"
diff --git a/src/lms/ui/PlayQueue.cpp b/src/lms/ui/PlayQueue.cpp
index a1d0eb23..46d3647e 100644
--- a/src/lms/ui/PlayQueue.cpp
+++ b/src/lms/ui/PlayQueue.cpp
@@ -497,12 +497,17 @@ namespace lms::ui
const auto track{ tracklistEntry->getTrack() };
const db::TrackId trackId{ track->getId() };
- const std::string displayTitle{ utils::computeTrackDisplayTitle(track) };
+ const utils::TrackDisplayInfo displayInfo{ utils::computeTrackDisplayInfo(track) };
Template* entry{ _entriesContainer->addNew(Wt::WString::tr("Lms.PlayQueue.template.entry")) };
entry->addFunction("id", &Wt::WTemplate::Functions::id);
- entry->bindString("name", Wt::WString::fromUTF8(displayTitle), Wt::TextFormat::Plain);
+ entry->bindString("name", Wt::WString::fromUTF8(displayInfo.title), Wt::TextFormat::Plain);
+ if (displayInfo.workName)
+ {
+ entry->setCondition("if-has-work", true);
+ entry->bindString("work", Wt::WString::fromUTF8(*displayInfo.workName), Wt::TextFormat::Plain);
+ }
const auto artists{ track->getArtistIds({ db::TrackArtistLinkType::Artist }) };
if (!artists.empty())
@@ -541,7 +546,7 @@ namespace lms::ui
entry->bindString("duration", utils::durationToString(track->getDuration()), Wt::TextFormat::Plain);
Wt::WPushButton* playBtn{ entry->bindNew("play-btn", Wt::WString::tr("Lms.template.play-btn"), Wt::TextFormat::XHTML) };
- playBtn->setAttributeValue("aria-label", Wt::WString::tr("Lms.play-item").arg(displayTitle));
+ playBtn->setAttributeValue("aria-label", Wt::WString::tr("Lms.play-item").arg(displayInfo.title));
playBtn->clicked().connect([this, entry] {
const std::optional pos{ _entriesContainer->getIndexOf(*entry) };
if (pos)
@@ -549,7 +554,7 @@ namespace lms::ui
});
Wt::WPushButton* delBtn{ entry->bindNew("del-btn", Wt::WString::tr("Lms.template.delete-btn"), Wt::TextFormat::XHTML) };
- delBtn->setAttributeValue("aria-label", Wt::WString::tr("Lms.delete-item").arg(displayTitle));
+ delBtn->setAttributeValue("aria-label", Wt::WString::tr("Lms.delete-item").arg(displayInfo.title));
delBtn->setToolTip(Wt::WString::tr("Lms.delete"));
delBtn->clicked().connect([this, tracklistEntryId, entry] {
// Remove the entry n both the widget tree and the playqueue
diff --git a/src/lms/ui/Utils.cpp b/src/lms/ui/Utils.cpp
index 134e11ec..530c6277 100644
--- a/src/lms/ui/Utils.cpp
+++ b/src/lms/ui/Utils.cpp
@@ -43,6 +43,7 @@
#include "database/objects/Track.hpp"
#include "database/objects/TrackArtistLink.hpp"
#include "database/objects/TrackList.hpp"
+#include "database/objects/Work.hpp"
#include "LmsApplication.hpp"
#include "ModalManager.hpp"
@@ -562,25 +563,31 @@ namespace lms::ui::utils
LmsApp->doJavaScript("navigator.clipboard.writeText('" + core::stringUtils::jsEscape(text) + "').catch(function(){})");
}
- std::string computeTrackDisplayTitle(const db::ObjectPtr& track)
+ TrackDisplayInfo computeTrackDisplayInfo(const db::ObjectPtr& track)
{
const auto movements{ track->getMovements() };
if (!movements.empty() && track->hasWork())
{
const db::Movement::pointer& movement{ movements.front() };
- std::string result;
+ std::string title;
if (const auto n{ movement->getNumber() })
{
if (const std::string numeral{ core::stringUtils::toRomanNumeral(*n) }; !numeral.empty())
- result += numeral + ". ";
+ title += numeral + ". ";
}
- result += movement->getName();
+ title += movement->getName();
- if (!result.empty())
- return result;
+ if (!title.empty())
+ {
+ TrackDisplayInfo info{ .title = std::move(title), .workName = std::nullopt };
+ if (const auto works{ track->getWorks() }; !works.empty())
+ info.workName = std::string{ works.front()->getName() };
+
+ return info;
+ }
}
- return std::string{ track->getName() };
+ return TrackDisplayInfo{ .title = std::string{ track->getName() }, .workName = std::nullopt };
}
} // namespace lms::ui::utils
diff --git a/src/lms/ui/Utils.hpp b/src/lms/ui/Utils.hpp
index 81f4dccf..067f6ec1 100644
--- a/src/lms/ui/Utils.hpp
+++ b/src/lms/ui/Utils.hpp
@@ -21,6 +21,7 @@
#include
#include