// SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include #include #include #include #include #include #include "common/common_types.h" #include "core/core.h" #include "uisettings.h" #include "yuzu/compatibility_list.h" namespace Core { class System; } class ControllerNavigation; class GameListWorker; class GameListSearchField; class GameListDir; class GMainWindow; enum class StartGameType; namespace FileSys { class ManualContentProvider; class VfsFilesystem; } // namespace FileSys enum class GameListOpenTarget { SaveData, ModData, }; enum class GameListRemoveTarget { GlShaderCache, VkShaderCache, AllShaderCache, CustomConfiguration, CacheStorage, }; enum class DumpRomFSTarget { Normal, SDMC, }; enum class GameListShortcutTarget { Desktop, Applications, }; enum class InstalledEntryType { Game, Update, AddOnContent, }; class GameList : public QWidget { Q_OBJECT public: enum { COLUMN_NAME, COLUMN_COMPATIBILITY, COLUMN_ADD_ONS, COLUMN_FILE_TYPE, COLUMN_SIZE, COLUMN_COUNT, // Number of columns }; explicit GameList(std::shared_ptr vfs_, FileSys::ManualContentProvider* provider_, Core::System& system_, GMainWindow* parent = nullptr); ~GameList() override; QString GetLastFilterResultItem() const; void ClearFilter(); void SetFilterFocus(); void SetFilterVisible(bool visibility); bool IsEmpty() const; void LoadCompatibilityList(); void PopulateAsync(QVector& game_dirs); void SaveInterfaceLayout(); void LoadInterfaceLayout(); QStandardItemModel* GetModel() const; /// Disables events from the emulated controller void UnloadController(); static const QStringList supported_file_extensions; signals: void BootGame(const QString& game_path, u64 program_id, std::size_t program_index, StartGameType type); void GameChosen(const QString& game_path, const u64 title_id = 0); void ShouldCancelWorker(); void OpenFolderRequested(u64 program_id, GameListOpenTarget target, const std::string& game_path); void OpenTransferableShaderCacheRequested(u64 program_id); void RemoveInstalledEntryRequested(u64 program_id, InstalledEntryType type); void RemoveFileRequested(u64 program_id, GameListRemoveTarget target, const std::string& game_path); void DumpRomFSRequested(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void CopyTIDRequested(u64 program_id); void CreateShortcut(u64 program_id, const std::string& game_path, GameListShortcutTarget target); void NavigateToGamedbEntryRequested(u64 program_id, const CompatibilityList& compatibility_list); void OpenPerGameGeneralRequested(const std::string& file); void OpenDirectory(const QString& directory); void AddDirectory(); void ShowList(bool show); void PopulatingCompleted(); void SaveConfig(); private slots: void OnItemExpanded(const QModelIndex& item); void OnTextChanged(const QString& new_text); void OnFilterCloseClicked(); void OnUpdateThemedIcons(); private: void AddDirEntry(GameListDir* entry_items); void AddEntry(const QList& entry_items, GameListDir* parent); void ValidateEntry(const QModelIndex& item); void DonePopulating(const QStringList& watch_list); void RefreshGameDirectory(); void ToggleFavorite(u64 program_id); void AddFavorite(u64 program_id); void RemoveFavorite(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 changeEvent(QEvent*) override; void RetranslateUI(); std::shared_ptr vfs; FileSys::ManualContentProvider* provider; GameListSearchField* search_field; GMainWindow* main_window = nullptr; QVBoxLayout* layout = nullptr; QTreeView* tree_view = nullptr; QStandardItemModel* item_model = nullptr; GameListWorker* current_worker = nullptr; QFileSystemWatcher* watcher = nullptr; ControllerNavigation* controller_navigation = nullptr; CompatibilityList compatibility_list; friend class GameListSearchField; Core::System& system; }; class GameListPlaceholder : public QWidget { Q_OBJECT public: explicit GameListPlaceholder(GMainWindow* parent = nullptr); ~GameListPlaceholder(); signals: void AddDirectory(); private slots: void onUpdateThemedIcons(); protected: void mouseDoubleClickEvent(QMouseEvent* event) override; private: void changeEvent(QEvent* event) override; void RetranslateUI(); QVBoxLayout* layout = nullptr; QLabel* image = nullptr; QLabel* text = nullptr; };