Files
qemby/src/qEmbyApp/components/mediasectionwidget.cpp
T
2026-06-10 11:17:51 +08:00

127 lines
3.5 KiB
C++

#include "mediasectionwidget.h"
#include "horizontallistviewgallery.h"
#include <qembycore.h>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPointer>
#include <QListView>
MediaSectionWidget::MediaSectionWidget(const QString& title, QEmbyCore* core, QWidget* parent)
: QWidget(parent), m_core(core)
{
setObjectName("media-section");
setStyleSheet("QWidget#media-section { background: transparent; }");
auto *layout = new QVBoxLayout(this);
layout->setContentsMargins(40, 20, 40, 0);
layout->setSpacing(0);
auto *headerContainer = new QWidget(this);
headerContainer->setObjectName("section-header");
headerContainer->setStyleSheet("#section-header { background: transparent; }");
m_headerLayout = new QHBoxLayout(headerContainer);
m_headerLayout->setContentsMargins(0, 0, 0, 0);
m_headerLayout->setSpacing(12);
m_titleLabel = new QLabel(title, headerContainer);
m_titleLabel->setObjectName("detail-section-title");
m_headerLayout->addWidget(m_titleLabel);
m_headerLayout->addStretch();
m_gallery = new HorizontalListViewGallery(core, this);
m_gallery->listView()->setProperty("isHorizontalListView", true);
connect(m_gallery, &HorizontalListViewGallery::itemClicked, this, &MediaSectionWidget::itemClicked);
connect(m_gallery, &HorizontalListViewGallery::playRequested, this, &MediaSectionWidget::playRequested);
connect(m_gallery, &HorizontalListViewGallery::favoriteRequested, this, &MediaSectionWidget::favoriteRequested);
connect(m_gallery, &HorizontalListViewGallery::moreMenuRequested, this, &MediaSectionWidget::moreMenuRequested);
layout->addWidget(headerContainer);
layout->addWidget(m_gallery);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
hide();
}
HorizontalListViewGallery* MediaSectionWidget::gallery() const {
return m_gallery;
}
void MediaSectionWidget::setTitle(const QString& title) {
m_titleLabel->setText(title);
}
void MediaSectionWidget::setHeaderWidget(QWidget* widget) {
if (m_headerWidget && m_headerWidget != widget) {
m_headerWidget->hide();
m_headerWidget = nullptr;
}
if (widget) {
m_headerWidget = widget;
if (m_headerLayout->indexOf(m_headerWidget) < 0) {
m_headerLayout->insertWidget(1, m_headerWidget);
}
m_headerWidget->show();
}
}
void MediaSectionWidget::setCardStyle(MediaCardDelegate::CardStyle style) {
m_gallery->setCardStyle(style);
}
void MediaSectionWidget::setGalleryHeight(int height) {
m_gallery->setFixedHeight(height);
}
void MediaSectionWidget::setTileSize(const QSize &size) {
m_gallery->setTileSize(size);
}
void MediaSectionWidget::clear() {
m_gallery->setItems(QList<MediaItem>());
hide();
}
void MediaSectionWidget::setItems(const QList<MediaItem>& items) {
if (items.isEmpty()) {
hide();
} else {
m_gallery->setItems(items);
show();
}
}
void MediaSectionWidget::updateItem(const MediaItem& item) {
m_gallery->updateItem(item);
}
QCoro::Task<void> MediaSectionWidget::loadAsync(FetchFunction fetcher) {
if (!fetcher) co_return;
QPointer<MediaSectionWidget> safeThis(this);
try {
QList<MediaItem> items = co_await fetcher();
if (safeThis) {
safeThis->setItems(items);
Q_EMIT safeThis->dataLoaded(items.size());
}
} catch(...) {
if (safeThis) {
safeThis->hide();
}
}
}