| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #pragma once
- #include <memory>
- #include <QDialog>
- #include <QFutureWatcher>
- #include <QSortFilterProxyModel>
- #include <QStandardItemModel>
- #include "common/announce_multiplayer_room.h"
- #include "network/announce_multiplayer_session.h"
- #include "network/network.h"
- #include "yuzu/multiplayer/validation.h"
- namespace Ui {
- class Lobby;
- }
- class LobbyModel;
- class LobbyFilterProxyModel;
- namespace Core {
- class System;
- }
- namespace Service::Account {
- class ProfileManager;
- }
- /**
- * Listing of all public games pulled from services. The lobby should be simple enough for users to
- * find the game they want to play, and join it.
- */
- class Lobby : public QDialog {
- Q_OBJECT
- public:
- explicit Lobby(QWidget* parent, QStandardItemModel* list,
- std::shared_ptr<Core::AnnounceMultiplayerSession> session,
- Core::System& system_);
- ~Lobby() override;
- /**
- * Updates the lobby with a new game list model.
- * This model should be the original model of the game list.
- */
- void UpdateGameList(QStandardItemModel* list);
- void RetranslateUi();
- public slots:
- /**
- * Begin the process to pull the latest room list from web services. After the listing is
- * returned from web services, `LobbyRefreshed` will be signalled
- */
- void RefreshLobby();
- private slots:
- /**
- * Pulls the list of rooms from network and fills out the lobby model with the results
- */
- void OnRefreshLobby();
- /**
- * Handler for single clicking on a room in the list. Expands the treeitem to show player
- * information for the people in the room
- *
- * index - The row of the proxy model that the user wants to join.
- */
- void OnExpandRoom(const QModelIndex&);
- /**
- * Handler for double clicking on a room in the list. Gathers the host ip and port and attempts
- * to connect. Will also prompt for a password in case one is required.
- *
- * index - The row of the proxy model that the user wants to join.
- */
- void OnJoinRoom(const QModelIndex&);
- signals:
- void StateChanged(const Network::RoomMember::State&);
- void SaveConfig();
- private:
- std::string GetProfileUsername();
- /**
- * Removes all entries in the Lobby before refreshing.
- */
- void ResetModel();
- /**
- * Prompts for a password. Returns an empty QString if the user either did not provide a
- * password or if the user closed the window.
- */
- QString PasswordPrompt();
- std::unique_ptr<Ui::Lobby> ui;
- QStandardItemModel* model{};
- QStandardItemModel* game_list{};
- LobbyFilterProxyModel* proxy{};
- QFutureWatcher<AnnounceMultiplayerRoom::RoomList> room_list_watcher;
- std::weak_ptr<Core::AnnounceMultiplayerSession> announce_multiplayer_session;
- std::unique_ptr<Service::Account::ProfileManager> profile_manager;
- QFutureWatcher<void>* watcher;
- Validation validation;
- Core::System& system;
- Network::RoomNetwork& room_network;
- };
- /**
- * Proxy Model for filtering the lobby
- */
- class LobbyFilterProxyModel : public QSortFilterProxyModel {
- Q_OBJECT;
- public:
- explicit LobbyFilterProxyModel(QWidget* parent, QStandardItemModel* list);
- /**
- * Updates the filter with a new game list model.
- * This model should be the processed one created by the Lobby.
- */
- void UpdateGameList(QStandardItemModel* list);
- bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;
- void sort(int column, Qt::SortOrder order) override;
- public slots:
- void SetFilterOwned(bool);
- void SetFilterFull(bool);
- void SetFilterSearch(const QString&);
- private:
- QStandardItemModel* game_list;
- bool filter_owned = false;
- bool filter_full = false;
- QString filter_search;
- };
|