mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Port multiplayer related PRs from yuzu (yuzu-emu/yuzu#9661 and yuzu-emu/yuzu#9713) (#6319)
Co-authored-by: SoRadGaming <sohorhab.azizdel@outlook.com> Co-authored-by: Luke Sawczak <luke@unfamiliarplace.com>
This commit is contained in:
		
							parent
							
								
									455a0198d9
								
							
						
					
					
						commit
						07e02a1acf
					
				
					 6 changed files with 65 additions and 33 deletions
				
			
		|  | @ -70,20 +70,13 @@ void DirectConnectWindow::Connect() { | |||
|             } | ||||
|         } | ||||
|     } | ||||
|     switch (static_cast<ConnectionType>(ui->connection_type->currentIndex())) { | ||||
|     case ConnectionType::TraversalServer: | ||||
|         break; | ||||
|     case ConnectionType::IP: | ||||
|         if (!ui->ip->hasAcceptableInput()) { | ||||
|             NetworkMessage::ErrorManager::ShowError( | ||||
|                 NetworkMessage::ErrorManager::IP_ADDRESS_NOT_VALID); | ||||
|             return; | ||||
|         } | ||||
|         if (!ui->port->hasAcceptableInput()) { | ||||
|             NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::PORT_NOT_VALID); | ||||
|             return; | ||||
|         } | ||||
|         break; | ||||
|     if (!ui->ip->hasAcceptableInput()) { | ||||
|         NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::IP_ADDRESS_NOT_VALID); | ||||
|         return; | ||||
|     } | ||||
|     if (!ui->port->hasAcceptableInput()) { | ||||
|         NetworkMessage::ErrorManager::ShowError(NetworkMessage::ErrorManager::PORT_NOT_VALID); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // Store settings
 | ||||
|  |  | |||
|  | @ -26,20 +26,11 @@ | |||
|          <property name="leftMargin"> | ||||
|           <number>0</number> | ||||
|          </property> | ||||
|          <item> | ||||
|           <widget class="QComboBox" name="connection_type"> | ||||
|            <item> | ||||
|             <property name="text"> | ||||
|              <string>IP Address</string> | ||||
|             </property> | ||||
|            </item> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QWidget" name="ip_container" native="true"> | ||||
|            <layout class="QHBoxLayout" name="ip_layout"> | ||||
|             <property name="leftMargin"> | ||||
|              <number>5</number> | ||||
|              <number>0</number> | ||||
|             </property> | ||||
|             <property name="topMargin"> | ||||
|              <number>0</number> | ||||
|  | @ -53,17 +44,17 @@ | |||
|             <item> | ||||
|              <widget class="QLabel" name="label_2"> | ||||
|               <property name="text"> | ||||
|                <string>IP</string> | ||||
|                <string>Server Address</string> | ||||
|               </property> | ||||
|              </widget> | ||||
|             </item> | ||||
|             <item> | ||||
|              <widget class="QLineEdit" name="ip"> | ||||
|               <property name="toolTip"> | ||||
|                <string><html><head/><body><p>IPv4 address of the host</p></body></html></string> | ||||
|                <string><html><head/><body><p>Server address of the host</p></body></html></string> | ||||
|               </property> | ||||
|               <property name="maxLength"> | ||||
|                <number>16</number> | ||||
|                <number>253</number> | ||||
|               </property> | ||||
|              </widget> | ||||
|             </item> | ||||
|  | @ -85,6 +76,12 @@ | |||
|               <property name="placeholderText"> | ||||
|                <string>24872</string> | ||||
|               </property> | ||||
|               <property name="maximumSize"> | ||||
|                <size> | ||||
|                 <width>65</width> | ||||
|                 <height>50</height> | ||||
|                </size> | ||||
|               </property> | ||||
|              </widget> | ||||
|             </item> | ||||
|            </layout> | ||||
|  |  | |||
|  | @ -66,6 +66,7 @@ Lobby::Lobby(QWidget* parent, QStandardItemModel* list, | |||
|     // UI Buttons
 | ||||
|     connect(ui->refresh_list, &QPushButton::clicked, this, &Lobby::RefreshLobby); | ||||
|     connect(ui->games_owned, &QCheckBox::toggled, proxy, &LobbyFilterProxyModel::SetFilterOwned); | ||||
|     connect(ui->hide_empty, &QCheckBox::toggled, proxy, &LobbyFilterProxyModel::SetFilterEmpty); | ||||
|     connect(ui->hide_full, &QCheckBox::toggled, proxy, &LobbyFilterProxyModel::SetFilterFull); | ||||
|     connect(ui->search, &QLineEdit::textChanged, proxy, &LobbyFilterProxyModel::SetFilterSearch); | ||||
|     connect(ui->room_list, &QTreeView::doubleClicked, this, &Lobby::OnJoinRoom); | ||||
|  | @ -282,12 +283,22 @@ bool LobbyFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& s | |||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     // filter by empty rooms
 | ||||
|     if (filter_empty) { | ||||
|         QModelIndex member_list = sourceModel()->index(sourceRow, Column::MEMBER, sourceParent); | ||||
|         const int player_count = | ||||
|             sourceModel()->data(member_list, LobbyItemMemberList::MemberListRole).toList().size(); | ||||
|         if (player_count == 0) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // filter by filled rooms
 | ||||
|     if (filter_full) { | ||||
|         QModelIndex member_list = sourceModel()->index(sourceRow, Column::MEMBER, sourceParent); | ||||
|         int player_count = | ||||
|         const int player_count = | ||||
|             sourceModel()->data(member_list, LobbyItemMemberList::MemberListRole).toList().size(); | ||||
|         int max_players = | ||||
|         const int max_players = | ||||
|             sourceModel()->data(member_list, LobbyItemMemberList::MaxPlayerRole).toInt(); | ||||
|         if (player_count >= max_players) { | ||||
|             return false; | ||||
|  | @ -352,6 +363,11 @@ void LobbyFilterProxyModel::SetFilterOwned(bool filter) { | |||
|     invalidate(); | ||||
| } | ||||
| 
 | ||||
| void LobbyFilterProxyModel::SetFilterEmpty(bool filter) { | ||||
|     filter_empty = filter; | ||||
|     invalidate(); | ||||
| } | ||||
| 
 | ||||
| void LobbyFilterProxyModel::SetFilterFull(bool filter) { | ||||
|     filter_full = filter; | ||||
|     invalidate(); | ||||
|  |  | |||
|  | @ -116,12 +116,14 @@ public: | |||
| 
 | ||||
| public slots: | ||||
|     void SetFilterOwned(bool); | ||||
|     void SetFilterEmpty(bool); | ||||
|     void SetFilterFull(bool); | ||||
|     void SetFilterSearch(const QString&); | ||||
| 
 | ||||
| private: | ||||
|     QStandardItemModel* game_list; | ||||
|     bool filter_owned = false; | ||||
|     bool filter_empty = false; | ||||
|     bool filter_full = false; | ||||
|     QString filter_search; | ||||
| }; | ||||
|  |  | |||
|  | @ -77,6 +77,13 @@ | |||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="hide_empty"> | ||||
|            <property name="text"> | ||||
|             <string>Hide Empty Rooms</string> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QCheckBox" name="hide_full"> | ||||
|            <property name="text"> | ||||
|  |  | |||
|  | @ -37,11 +37,28 @@ private: | |||
|     QRegExp nickname_regex = QRegExp(QStringLiteral("^[a-zA-Z0-9._- ]{4,20}$")); | ||||
|     QRegExpValidator nickname; | ||||
| 
 | ||||
|     /// ipv4 address only
 | ||||
|     // TODO remove this when we support hostnames in direct connect
 | ||||
|     /// ipv4 / ipv6 / hostnames
 | ||||
|     QRegExp ip_regex = QRegExp(QStringLiteral( | ||||
|         "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|" | ||||
|         "2[0-4][0-9]|25[0-5])")); | ||||
|         // IPv4 regex
 | ||||
|         "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$|" | ||||
|         // IPv6 regex
 | ||||
|         "^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|" | ||||
|         "(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-" | ||||
|         "5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|" | ||||
|         "(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)" | ||||
|         "(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|" | ||||
|         "(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]" | ||||
|         "\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|" | ||||
|         "(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[" | ||||
|         "0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|" | ||||
|         "(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[" | ||||
|         "0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|" | ||||
|         "(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[" | ||||
|         "0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|" | ||||
|         "(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?" | ||||
|         "\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?$|" | ||||
|         // Hostname regex
 | ||||
|         "^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\\.)+[a-zA-Z]{2,}$")); | ||||
|     QRegExpValidator ip; | ||||
| 
 | ||||
|     /// port must be between 0 and 65535
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue