1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2015 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QLabel>
#include <QLineEdit>
#include <QList>
#include <QPushButton>
#include <QStandardItemModel>
#include <QString>
#include <QVBoxLayout>
#include <QVector>
#include <QWidget>
#include "common/common_types.h"
#include "core/core.h"
#include "frontend_common/play_time_manager.h"
#include "qt_common/config/uisettings.h"
#include "qt_common/game_list/model.h"
#include "qt_common/util/game.h"
class QVariantAnimation;
class GameCard;
class GameListModel;
class GameTree;
class GameGrid;
class GameListSearchField;
class ControllerNavigation;
class GameListWorker;
class GameListDir;
class MainWindow;
enum class AmLaunchType;
enum class StartGameType;
class GameCarousel;
class QAbstractItemView;
namespace Core {
class System;
}
namespace FileSys {
class ManualContentProvider;
class VfsFilesystem;
} // namespace FileSys
enum class GameListOpenTarget {
SaveData,
ModData,
};
enum class DumpRomFSTarget {
Normal,
SDMC,
};
class GameList : public QWidget {
Q_OBJECT
public:
explicit GameList(std::shared_ptr<FileSys::VfsFilesystem> vfs_,
FileSys::ManualContentProvider* provider_,
PlayTime::PlayTimeManager& play_time_manager_, Core::System& system_,
MainWindow* parent = nullptr);
~GameList() override;
QString GetLastFilterResultItem() const;
void ClearFilter();
void SetFilterFocus();
void SetFilterVisible(bool visibility);
bool IsEmpty() const;
void PopulateAsync(QVector<UISettings::GameDir>& game_dirs);
void SetScanEnabled(bool enabled);
void SaveInterfaceLayout();
void LoadInterfaceLayout();
QStandardItemModel* GetModel() const;
/// Disables events from the emulated controller
void UnloadController();
void ResetViewMode();
public slots:
void SetNupConversionRunning(bool running);
void RefreshGameDirectory();
void RefreshExternalContent();
void UpdateIconSizes();
void OnPopulate();
signals:
void BootGame(const QString& game_path, StartGameType type);
void GameChosen(const QString& game_path, const u64 title_id = 0);
void OpenFolderRequested(u64 program_id, GameListOpenTarget target,
const std::string& game_path);
void OpenTransferableShaderCacheRequested(u64 program_id);
void RemoveInstalledEntryRequested(u64 program_id, QtCommon::Game::InstalledEntryType type);
void RemoveFileRequested(u64 program_id, QtCommon::Game::GameListRemoveTarget target,
const std::string& game_path);
void RemovePlayTimeRequested(u64 program_id);
void SetPlayTimeRequested(u64 program_id);
void DumpRomFSRequested(u64 program_id, const std::string& game_path, DumpRomFSTarget target);
void VerifyIntegrityRequested(const std::string& game_path);
void ConvertToNupRequested(const std::string& game_path);
void CopyTIDRequested(u64 program_id);
void CreateShortcut(u64 program_id, const std::string& game_path,
const QtCommon::Game::ShortcutTarget target);
void OpenPerGameGeneralRequested(const std::string& file);
void LinkToRyujinxRequested(const u64& program_id);
void OpenDirectory(const QString& directory);
void AddDirectory();
void ShowList(bool show);
void PopulatingCompleted();
void SaveConfig();
private slots:
void OnTextChanged(const QString& new_text);
void OnFilterCloseClicked();
void OnPopulatingCompleted(const QStringList& watch_list);
private:
void SetupViews();
void SetupScrollAnimation();
bool eventFilter(QObject* obj, QEvent* event) override;
void changeEvent(QEvent*) override;
void ValidateEntry(const QModelIndex& item);
void ToggleFavorite(u64 program_id);
void PopupContextMenu(const QPoint& menu_location);
void AddGamePopup(QMenu& context_menu, u64 program_id, const std::string& path);
void AddCustomDirPopup(QMenu& context_menu, QModelIndex selected);
void AddPermDirPopup(QMenu& context_menu, QModelIndex selected);
void AddFavoritesPopup(QMenu& context_menu);
void RetranslateUI();
friend class GameListSearchField;
std::shared_ptr<FileSys::VfsFilesystem> vfs;
FileSys::ManualContentProvider* provider;
GameListSearchField* search_field = nullptr;
MainWindow* main_window = nullptr;
QVBoxLayout* layout = nullptr;
GameTree* tree_view = nullptr;
GameGrid* grid_view = nullptr;
GameCarousel* carousel_view = nullptr;
GameListModel* item_model = nullptr;
Settings::GameListMode game_list_mode;
ControllerNavigation* controller_navigation = nullptr;
QVariantAnimation* vertical_scroll = nullptr;
QVariantAnimation* horizontal_scroll = nullptr;
int vertical_scroll_target = 0;
int horizontal_scroll_target = 0;
const PlayTime::PlayTimeManager& play_time_manager;
Core::System& system;
bool m_isTreeMode = true;
bool nup_conversion_running{};
QAbstractItemView* m_currentView = nullptr;
};
class GameListPlaceholder : public QWidget {
Q_OBJECT
public:
explicit GameListPlaceholder(MainWindow* parent = nullptr);
~GameListPlaceholder();
signals:
void AddDirectory();
protected:
void mouseDoubleClickEvent(QMouseEvent* event) override;
private:
void changeEvent(QEvent* event) override;
void RetranslateUI();
QVBoxLayout* layout = nullptr;
QLabel* image = nullptr;
QLabel* text = nullptr;
};
|