diff options
| author | crueter <crueter@eden-emu.dev> | 2026-06-22 21:04:47 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-06-22 21:04:47 +0200 |
| commit | 39be450fa3a7248f7dde73dfe91d2f0447a155dd (patch) | |
| tree | b508f83c056280b1d5fb5365c6ab4e551c5a1a95 /src/yuzu/game/carousel.cpp | |
| parent | 68aaea60855d7791480a546b8888e123e083ca1a (diff) | |
[desktop] Add basic carousel view (#4112)
Adds a basic carousel view, or essentially a horizontal list a la Android/Qt Quick.
Lacks a lot of niceties like autoscroll, smooth shifts, etc. Will work on those later
Also fixed a bug introduced recently that capped game icon size to 8 at the low end, breaking the None option
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4112
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src/yuzu/game/carousel.cpp')
| -rw-r--r-- | src/yuzu/game/carousel.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/yuzu/game/carousel.cpp b/src/yuzu/game/carousel.cpp new file mode 100644 index 0000000000..ac9c9947b5 --- /dev/null +++ b/src/yuzu/game/carousel.cpp @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "qt_common/config/uisettings.h" +#include "qt_common/game_list/model.h" +#include "yuzu/game/common.h" +#include "yuzu/game/game_card.h" +#include "yuzu/game/carousel.h" + +GameCarousel::GameCarousel(QWidget* parent) : QListView{parent} { + m_gameCard = new GameCard(this); + setItemDelegate(m_gameCard); + + setViewMode(QListView::IconMode); + setMovement(QListView::Static); + setUniformItemSizes(true); + setSelectionMode(QAbstractItemView::SingleSelection); + + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + setEditTriggers(QAbstractItemView::NoEditTriggers); + setContextMenuPolicy(Qt::CustomContextMenu); + + setSpacing(10); + setWordWrap(true); + setTextElideMode(Qt::ElideRight); + setFlow(QListView::LeftToRight); + setWrapping(false); +} + +void GameCarousel::SetModel(GameListModel* model) { + QListView::setModel(model); + UpdateIconSize(); +} + +void GameCarousel::ApplyFilter(const QString& edit_filter_text, GameListModel* model) { + int row_count = model->rowCount(); + + for (int i = 0; i < row_count; ++i) { + QStandardItem* item = model->item(i, 0); + if (!item) + continue; + + if (Yuzu::FilterMatches(edit_filter_text, item)) { + setRowHidden(i, false); + } else { + setRowHidden(i, true); + } + } +} + +void GameCarousel::UpdateIconSize() { + const u32 icon_size = UISettings::values.game_icon_size.GetValue(); + + int heightMargin = 0; + int widthMargin = 80; + + // TODO(crueter): get rid of this nonsense + if (UISettings::values.show_game_name) { + switch (icon_size) { + case 128: + heightMargin = 65; + break; + case 0: + widthMargin = 120; + heightMargin = 120; + break; + case 64: + heightMargin = 77; + break; + case 32: + case 256: + heightMargin = 81; + break; + } + } else { + widthMargin = 24; + heightMargin = 24; + } + + const int min_item_width = icon_size + widthMargin; + const int min_item_height = icon_size + heightMargin; + const int grid_height = std::max(min_item_height, viewport()->height()); + + QSize content_size(min_item_width, min_item_height); + QSize grid_size(min_item_width, grid_height); + if (gridSize() != grid_size) { + setUpdatesEnabled(false); + + setGridSize(grid_size); + m_gameCard->setSize(grid_size, content_size, 0, 0); + + setUpdatesEnabled(true); + } +} + +QModelIndex GameCarousel::indexAt(const QPoint& point) const { + QModelIndex index = QListView::indexAt(point); + if (!index.isValid()) + return {}; + if (m_gameCard && !m_gameCard->hitTest(point, index, this, visualRect(index))) + return {}; + return index; +} |
