From 1ba839ca20811148711c4edbce818b2e163a67ce Mon Sep 17 00:00:00 2001 From: DawnFire42 Date: Fri, 7 Aug 2026 19:54:13 -0400 Subject: [PATCH] Add command zone visibility and filtering to game lobby --- .../interface/widgets/dialogs/dlg_create_game.cpp | 1 + .../interface/widgets/dialogs/dlg_filter_games.cpp | 5 +++++ .../interface/widgets/dialogs/dlg_filter_games.h | 1 + .../interface/widgets/server/game_filter_configs.h | 1 + .../src/interface/widgets/server/games_model.cpp | 13 ++++++++++--- .../network/server/remote/game/server_game.cpp | 1 + .../libcockatrice/protocol/pb/serverinfo_game.proto | 3 +++ .../settings/game_filters_settings.cpp | 11 +++++++++++ .../libcockatrice/settings/game_filters_settings.h | 2 ++ 9 files changed, 35 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp index 4f32d673c..d736bcf26 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp @@ -219,6 +219,7 @@ DlgCreateGame::DlgCreateGame(const ServerInfo_Game &gameInfo, const QMapsetChecked(gameInfo.spectators_can_chat()); spectatorsSeeEverythingCheckBox->setChecked(gameInfo.spectators_omniscient()); shareDecklistsOnLoadCheckBox->setChecked(gameInfo.share_decklists_on_load()); + enableCommandZoneCheckBox->setChecked(gameInfo.enable_command_zone()); QSet types; for (int i = 0; i < gameInfo.game_types_size(); ++i) { diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.cpp index 4e45f2c25..f1e6f7616 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.cpp @@ -45,6 +45,9 @@ DlgFilterGames::DlgFilterGames(const QMap &_allGameTypes, hideOpenDecklistGames = new QCheckBox(tr("Hide games with forced open decklists")); hideOpenDecklistGames->setChecked(filters.hideOpenDecklistGames); + hideCommandZoneGames = new QCheckBox(tr("Hide games with command zone enabled")); + hideCommandZoneGames->setChecked(filters.hideCommandZoneGames); + maxGameAgeComboBox = new QComboBox(); maxGameAgeComboBox->setEditable(false); maxGameAgeComboBox->addItems(gameAgeMap.values()); @@ -122,6 +125,7 @@ DlgFilterGames::DlgFilterGames(const QMap &_allGameTypes, restrictionsLayout->addWidget(hideIgnoredUserGames, 4, 0); restrictionsLayout->addWidget(hideNotBuddyCreatedGames, 5, 0); restrictionsLayout->addWidget(hideOpenDecklistGames, 6, 0); + restrictionsLayout->addWidget(hideCommandZoneGames, 7, 0); auto *restrictionsGroupBox = new QGroupBox(tr("Restrictions")); restrictionsGroupBox->setLayout(restrictionsLayout); @@ -192,6 +196,7 @@ GameFilterConfigs DlgFilterGames::getFilters() const hidePasswordProtectedGames->isChecked(), hideNotBuddyCreatedGames->isChecked(), hideOpenDecklistGames->isChecked(), + hideCommandZoneGames->isChecked(), gameNameFilterEdit->text(), getCreatorNameFilters(), getGameTypeFilter(), diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.h b/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.h index 447f9b16c..1da3a32ef 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.h +++ b/cockatrice/src/interface/widgets/dialogs/dlg_filter_games.h @@ -34,6 +34,7 @@ private: QCheckBox *hideIgnoredUserGames; QCheckBox *hideNotBuddyCreatedGames; QCheckBox *hideOpenDecklistGames; + QCheckBox *hideCommandZoneGames; QLineEdit *gameNameFilterEdit; QLineEdit *creatorNameFilterEdit; QMap gameTypeFilterCheckBoxes; diff --git a/cockatrice/src/interface/widgets/server/game_filter_configs.h b/cockatrice/src/interface/widgets/server/game_filter_configs.h index 0ece7e00c..1b2cfe91d 100644 --- a/cockatrice/src/interface/widgets/server/game_filter_configs.h +++ b/cockatrice/src/interface/widgets/server/game_filter_configs.h @@ -18,6 +18,7 @@ struct GameFilterConfigs bool hidePasswordProtectedGames = false; bool hideNotBuddyCreatedGames = false; bool hideOpenDecklistGames = false; + bool hideCommandZoneGames = false; QString gameNameFilter = ""; QStringList creatorNameFilters = {}; QSet gameTypeFilter = {}; diff --git a/cockatrice/src/interface/widgets/server/games_model.cpp b/cockatrice/src/interface/widgets/server/games_model.cpp index 8e623d392..992a23d52 100644 --- a/cockatrice/src/interface/widgets/server/games_model.cpp +++ b/cockatrice/src/interface/widgets/server/games_model.cpp @@ -158,6 +158,9 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const if (gameentry.share_decklists_on_load()) { result.append(tr("open decklists")); } + if (gameentry.enable_command_zone()) { + result.append(tr("command zone")); + } return result.join(", "); } case Qt::DecorationRole: { @@ -346,9 +349,9 @@ void GamesProxyModel::loadFilterParameters(const QMap &allGameType setGameFilters({gameFilters.isHideBuddiesOnlyGames(), gameFilters.isHideIgnoredUserGames(), gameFilters.isHideFullGames(), gameFilters.isHideGamesThatStarted(), gameFilters.isHidePasswordProtectedGames(), gameFilters.isHideNotBuddyCreatedGames(), - gameFilters.isHideOpenDecklistGames(), gameFilters.getGameNameFilter(), - gameFilters.getCreatorNameFilters(), newGameTypeFilter, gameFilters.getMinPlayers(), - gameFilters.getMaxPlayers(), gameFilters.getMaxGameAge(), + gameFilters.isHideOpenDecklistGames(), gameFilters.isHideCommandZoneGames(), + gameFilters.getGameNameFilter(), gameFilters.getCreatorNameFilters(), newGameTypeFilter, + gameFilters.getMinPlayers(), gameFilters.getMaxPlayers(), gameFilters.getMaxGameAge(), gameFilters.isShowOnlyIfSpectatorsCanWatch(), gameFilters.isShowSpectatorPasswordProtected(), gameFilters.isShowOnlyIfSpectatorsCanChat(), gameFilters.isShowOnlyIfSpectatorsCanSeeHands()}); } @@ -363,6 +366,7 @@ void GamesProxyModel::saveFilterParameters(const QMap &allGameType gameFilters.setHideIgnoredUserGames(filters.hideIgnoredUserGames); gameFilters.setHideNotBuddyCreatedGames(filters.hideNotBuddyCreatedGames); gameFilters.setHideOpenDecklistGames(filters.hideOpenDecklistGames); + gameFilters.setHideCommandZoneGames(filters.hideCommandZoneGames); gameFilters.setGameNameFilter(filters.gameNameFilter); gameFilters.setCreatorNameFilters(filters.creatorNameFilters); @@ -408,6 +412,9 @@ bool GamesProxyModel::filterAcceptsRow(int sourceRow) const if (filters.hideOpenDecklistGames && game.share_decklists_on_load()) { return false; } + if (filters.hideCommandZoneGames && game.enable_command_zone()) { + return false; + } if (filters.hideIgnoredUserGames && userListProxy->isUserIgnored(QString::fromStdString(game.creator_info().name()))) { return false; diff --git a/libcockatrice_network/libcockatrice/network/server/remote/game/server_game.cpp b/libcockatrice_network/libcockatrice/network/server/remote/game/server_game.cpp index f74458300..4c838d0bf 100644 --- a/libcockatrice_network/libcockatrice/network/server/remote/game/server_game.cpp +++ b/libcockatrice_network/libcockatrice/network/server/remote/game/server_game.cpp @@ -855,6 +855,7 @@ void Server_Game::getInfo(ServerInfo_Game &result) const result.set_spectators_can_chat(spectatorsCanTalk); result.set_spectators_omniscient(spectatorsSeeEverything); result.set_share_decklists_on_load(shareDecklistsOnLoad); + result.set_enable_command_zone(enableCommandZone); result.set_spectators_count(getSpectatorCount()); result.set_start_time(startTime.toSecsSinceEpoch()); } diff --git a/libcockatrice_protocol/libcockatrice/protocol/pb/serverinfo_game.proto b/libcockatrice_protocol/libcockatrice/protocol/pb/serverinfo_game.proto index 9a56e034c..6edd2372d 100644 --- a/libcockatrice_protocol/libcockatrice/protocol/pb/serverinfo_game.proto +++ b/libcockatrice_protocol/libcockatrice/protocol/pb/serverinfo_game.proto @@ -48,6 +48,9 @@ message ServerInfo_Game { // decklists are sent to all players when loaded optional bool share_decklists_on_load = 15; + // command zone is enabled for Commander format + optional bool enable_command_zone = 16; + // the current player count optional uint32 player_count = 30; diff --git a/libcockatrice_settings/libcockatrice/settings/game_filters_settings.cpp b/libcockatrice_settings/libcockatrice/settings/game_filters_settings.cpp index ad972b433..44b0e8e87 100644 --- a/libcockatrice_settings/libcockatrice/settings/game_filters_settings.cpp +++ b/libcockatrice_settings/libcockatrice/settings/game_filters_settings.cpp @@ -94,6 +94,17 @@ bool GameFiltersSettings::isHideOpenDecklistGames() const return previous == QVariant() ? false : previous.toBool(); } +void GameFiltersSettings::setHideCommandZoneGames(bool hide) +{ + setValue(hide, "hide_command_zone_games"); +} + +bool GameFiltersSettings::isHideCommandZoneGames() const +{ + QVariant previous = getValue("hide_command_zone_games"); + return previous == QVariant() ? false : previous.toBool(); +} + void GameFiltersSettings::setGameNameFilter(QString gameName) { setValue(gameName, "gameNameFilter"); diff --git a/libcockatrice_settings/libcockatrice/settings/game_filters_settings.h b/libcockatrice_settings/libcockatrice/settings/game_filters_settings.h index 24f582007..cdcea6dca 100644 --- a/libcockatrice_settings/libcockatrice/settings/game_filters_settings.h +++ b/libcockatrice_settings/libcockatrice/settings/game_filters_settings.h @@ -23,6 +23,7 @@ public: bool isHideIgnoredUserGames() const; bool isHideNotBuddyCreatedGames() const; bool isHideOpenDecklistGames() const; + bool isHideCommandZoneGames() const; QString getGameNameFilter() const; QStringList getCreatorNameFilters() const; int getMinPlayers() const; @@ -37,6 +38,7 @@ public: void setHideBuddiesOnlyGames(bool hide); void setHideIgnoredUserGames(bool hide); void setHideOpenDecklistGames(bool hide); + void setHideCommandZoneGames(bool hide); void setHideFullGames(bool hide); void setHideGamesThatStarted(bool hide); void setHidePasswordProtectedGames(bool hide);