From 2790530bbe3bdc07304a1e8816139ab5f7094861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 30 Mar 2024 11:26:28 +0100 Subject: [PATCH] Increase maximum number of favorite communities from 3 to 5 Simply hide the favorite community tabs in the offline server browser with screen resolutions where not enough width is available. The ingame server browser can always show at least 5 favorite community tabs with all screen resolutions. --- src/engine/client/serverbrowser.cpp | 8 +- src/engine/serverbrowser.h | 2 + src/engine/shared/config_variables.h | 2 +- src/game/client/components/menu_background.h | 3 +- src/game/client/components/menus.cpp | 311 ++++++++++--------- src/game/client/components/menus.h | 4 + src/game/client/components/menus_browser.cpp | 10 +- src/game/client/components/menus_ingame.cpp | 4 +- src/game/client/components/menus_start.cpp | 2 +- src/game/editor/proof_mode.cpp | 1 + 10 files changed, 184 insertions(+), 163 deletions(-) diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index afc099fe6..77b62f294 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -456,7 +456,7 @@ void CServerBrowser::Filter() Filtered = CommunitiesFilter().Filtered(Info.m_aCommunityId); } if(m_ServerlistType == IServerBrowser::TYPE_INTERNET || m_ServerlistType == IServerBrowser::TYPE_FAVORITES || - (m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_3)) + (m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5)) { Filtered = Filtered || CountriesFilter().Filtered(Info.m_aCommunityCountry); Filtered = Filtered || TypesFilter().Filtered(Info.m_aCommunityType); @@ -1079,7 +1079,7 @@ void CServerBrowser::UpdateFromHttp() return m_pFavorites->IsFavorite(pAddrs, NumAddrs) != TRISTATE::NONE; }; } - else if(m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_3) + else if(m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5) { const size_t CommunityIndex = m_ServerlistType - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1; std::vector vpFavoriteCommunities = FavoriteCommunities(); @@ -1704,7 +1704,7 @@ std::vector CServerBrowser::CurrentCommunities() const { return SelectedCommunities(); } - else if(m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_3) + else if(m_ServerlistType >= IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 && m_ServerlistType <= IServerBrowser::TYPE_FAVORITE_COMMUNITY_5) { const size_t CommunityIndex = m_ServerlistType - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1; std::vector vpFavoriteCommunities = FavoriteCommunities(); @@ -1737,7 +1737,7 @@ void CFavoriteCommunityFilterList::Add(const char *pCommunityId) // Ensure maximum number of favorite communities, by removing the least-recently // added community from the beginning, when the maximum number of favorite // communities has been reached. - constexpr size_t MaxFavoriteCommunities = 3; + constexpr size_t MaxFavoriteCommunities = IServerBrowser::TYPE_FAVORITE_COMMUNITY_5 - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + 1; if(m_vEntries.size() >= MaxFavoriteCommunities) { dbg_assert(m_vEntries.size() == MaxFavoriteCommunities, "Maximum number of communities can never be exceeded"); diff --git a/src/engine/serverbrowser.h b/src/engine/serverbrowser.h index 1cb4a0899..91b4b883b 100644 --- a/src/engine/serverbrowser.h +++ b/src/engine/serverbrowser.h @@ -279,6 +279,8 @@ public: TYPE_FAVORITE_COMMUNITY_1, TYPE_FAVORITE_COMMUNITY_2, TYPE_FAVORITE_COMMUNITY_3, + TYPE_FAVORITE_COMMUNITY_4, + TYPE_FAVORITE_COMMUNITY_5, NUM_TYPES, }; diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index adaf48860..37c33134b 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -134,7 +134,7 @@ MACRO_CONFIG_INT(ClPlayerDefaultEyes, player_default_eyes, 0, 0, 5, CFGFLAG_CLIE MACRO_CONFIG_STR(ClSkinPrefix, cl_skin_prefix, 12, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Replace the skins by skins with this prefix (e.g. kitty, santa)") MACRO_CONFIG_INT(ClFatSkins, cl_fat_skins, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable fat skins") -MACRO_CONFIG_INT(UiPage, ui_page, 6, 6, 11, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interface page") +MACRO_CONFIG_INT(UiPage, ui_page, 6, 6, 13, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interface page") MACRO_CONFIG_INT(UiSettingsPage, ui_settings_page, 0, 0, 9, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interface settings page") MACRO_CONFIG_INT(UiToolboxPage, ui_toolbox_page, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Toolbox page") MACRO_CONFIG_STR(UiServerAddress, ui_server_address, 1024, "localhost:8303", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Interface server address") diff --git a/src/game/client/components/menu_background.h b/src/game/client/components/menu_background.h index 5cc7e2066..926ca82d4 100644 --- a/src/game/client/components/menu_background.h +++ b/src/game/client/components/menu_background.h @@ -61,13 +61,14 @@ public: POS_BROWSER_CUSTOM1, POS_BROWSER_CUSTOM2, POS_BROWSER_CUSTOM3, + POS_BROWSER_CUSTOM4, POS_RESERVED0, POS_RESERVED1, POS_RESERVED2, NUM_POS, - POS_BROWSER_CUSTOM_NUM = (POS_BROWSER_CUSTOM3 - POS_BROWSER_CUSTOM0) + 1, + POS_BROWSER_CUSTOM_NUM = (POS_BROWSER_CUSTOM4 - POS_BROWSER_CUSTOM0) + 1, POS_SETTINGS_RESERVED_NUM = (POS_SETTINGS_RESERVED1 - POS_SETTINGS_RESERVED0) + 1, POS_RESERVED_NUM = (POS_RESERVED2 - POS_RESERVED0) + 1, }; diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index d2aca4a4a..ab1b573ea 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -548,165 +548,21 @@ void CMenus::RenderMenubar(CUIRect Box, IClient::EClientState ClientState) int NewPage = -1; int ActivePage = -1; - if(ClientState == IClient::STATE_OFFLINE) { ActivePage = m_MenuPage; - - Box.VSplitLeft(33.0f, &Button, &Box); - - TextRender()->SetFontPreset(EFontPreset::ICON_FONT); - TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); - - bool GotNewsOrUpdate = false; - -#if defined(CONF_AUTOUPDATE) - int State = Updater()->GetCurrentState(); - bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); - if(State == IUpdater::CLEAN && NeedUpdate) - { - GotNewsOrUpdate = true; - } -#endif - - GotNewsOrUpdate |= (bool)g_Config.m_UiUnreadNews; - - ColorRGBA HomeButtonColorAlert(0, 1, 0, 0.25f); - ColorRGBA HomeButtonColorAlertHover(0, 1, 0, 0.5f); - ColorRGBA *pHomeButtonColor = nullptr; - ColorRGBA *pHomeButtonColorHover = nullptr; - - const char *pHomeScreenButtonLabel = FONT_ICON_HOUSE; - if(GotNewsOrUpdate) - { - pHomeScreenButtonLabel = FONT_ICON_NEWSPAPER; - pHomeButtonColor = &HomeButtonColorAlert; - pHomeButtonColorHover = &HomeButtonColorAlertHover; - } - - static CButtonContainer s_StartButton; - if(DoButton_MenuTab(&s_StartButton, pHomeScreenButtonLabel, false, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_HOME], pHomeButtonColor, pHomeButtonColor, pHomeButtonColorHover, 10.0f)) - { - m_ShowStart = true; - } - GameClient()->m_Tooltips.DoToolTip(&s_StartButton, &Button, Localize("Main menu")); - - Box.VSplitLeft(10.0f, nullptr, &Box); - Box.VSplitLeft(75.0f, &Button, &Box); - static CButtonContainer s_InternetButton; - if(DoButton_MenuTab(&s_InternetButton, FONT_ICON_EARTH_AMERICAS, ActivePage == PAGE_INTERNET, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_INTERNET])) - { - if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_INTERNET) - { - if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - Client()->RequestDDNetInfo(); - ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); - } - NewPage = PAGE_INTERNET; - } - GameClient()->m_Tooltips.DoToolTip(&s_InternetButton, &Button, Localize("Internet")); - - Box.VSplitLeft(75.0f, &Button, &Box); - static CButtonContainer s_LanButton; - if(DoButton_MenuTab(&s_LanButton, FONT_ICON_NETWORK_WIRED, ActivePage == PAGE_LAN, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_LAN])) - { - if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_LAN) - ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); - NewPage = PAGE_LAN; - } - GameClient()->m_Tooltips.DoToolTip(&s_LanButton, &Button, Localize("LAN")); - - Box.VSplitLeft(75.0f, &Button, &Box); - static CButtonContainer s_FavoritesButton; - if(DoButton_MenuTab(&s_FavoritesButton, FONT_ICON_STAR, ActivePage == PAGE_FAVORITES, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_FAVORITES])) - { - if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_FAVORITES) - { - if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - Client()->RequestDDNetInfo(); - ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); - } - NewPage = PAGE_FAVORITES; - } - GameClient()->m_Tooltips.DoToolTip(&s_FavoritesButton, &Button, Localize("Favorites")); - - size_t FavoriteCommunityIndex = 0; - static CButtonContainer s_aFavoriteCommunityButtons[3]; - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)PAGE_FAVORITE_COMMUNITY_3 - PAGE_FAVORITE_COMMUNITY_1 + 1); - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)BIT_TAB_FAVORITE_COMMUNITY_3 - BIT_TAB_FAVORITE_COMMUNITY_1 + 1); - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)IServerBrowser::TYPE_FAVORITE_COMMUNITY_3 - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + 1); - for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) - { - Box.VSplitLeft(75.0f, &Button, &Box); - const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; - if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], FONT_ICON_ELLIPSIS, ActivePage == Page, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIT_TAB_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex], nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) - { - const int BrowserType = IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; - if(ServerBrowser()->GetCurrentType() != BrowserType) - { - if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) - Client()->RequestDDNetInfo(); - ServerBrowser()->Refresh(BrowserType); - } - NewPage = Page; - } - GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); - - ++FavoriteCommunityIndex; - if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) - break; - } - - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); } else if(ClientState == IClient::STATE_ONLINE) { ActivePage = m_GamePage; - - // online menus - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_GameButton; - if(DoButton_MenuTab(&s_GameButton, Localize("Game"), ActivePage == PAGE_GAME, &Button, IGraphics::CORNER_TL)) - NewPage = PAGE_GAME; - - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_PlayersButton; - if(DoButton_MenuTab(&s_PlayersButton, Localize("Players"), ActivePage == PAGE_PLAYERS, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_PLAYERS; - - Box.VSplitLeft(130.0f, &Button, &Box); - static CButtonContainer s_ServerInfoButton; - if(DoButton_MenuTab(&s_ServerInfoButton, Localize("Server info"), ActivePage == PAGE_SERVER_INFO, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_SERVER_INFO; - - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_NetworkButton; - if(DoButton_MenuTab(&s_NetworkButton, Localize("Browser"), ActivePage == PAGE_NETWORK, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_NETWORK; - - if(GameClient()->m_GameInfo.m_Race) - { - Box.VSplitLeft(90.0f, &Button, &Box); - static CButtonContainer s_GhostButton; - if(DoButton_MenuTab(&s_GhostButton, Localize("Ghost"), ActivePage == PAGE_GHOST, &Button, IGraphics::CORNER_NONE)) - NewPage = PAGE_GHOST; - } - - Box.VSplitLeft(100.0f, &Button, &Box); - Box.VSplitLeft(4.0f, nullptr, &Box); - static CButtonContainer s_CallVoteButton; - if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), ActivePage == PAGE_CALLVOTE, &Button, IGraphics::CORNER_TR)) - { - NewPage = PAGE_CALLVOTE; - m_ControlPageOpening = true; - } } else { dbg_assert(false, "Client state invalid for RenderMenubar"); } + // First render buttons aligned from right side so remaining + // width is known when rendering buttons from left side. TextRender()->SetFontPreset(EFontPreset::ICON_FONT); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); @@ -756,9 +612,164 @@ void CMenus::RenderMenubar(CUIRect Box, IClient::EClientState ClientState) GameClient()->m_Tooltips.DoToolTip(&s_DemoButton, &Button, Localize("Demos")); } + Box.VSplitRight(10.0f, &Box, nullptr); + TextRender()->SetRenderFlags(0); TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); + if(ClientState == IClient::STATE_OFFLINE) + { + Box.VSplitLeft(33.0f, &Button, &Box); + + TextRender()->SetFontPreset(EFontPreset::ICON_FONT); + TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); + + bool GotNewsOrUpdate = false; + +#if defined(CONF_AUTOUPDATE) + int State = Updater()->GetCurrentState(); + bool NeedUpdate = str_comp(Client()->LatestVersion(), "0"); + if(State == IUpdater::CLEAN && NeedUpdate) + { + GotNewsOrUpdate = true; + } +#endif + + GotNewsOrUpdate |= (bool)g_Config.m_UiUnreadNews; + + ColorRGBA HomeButtonColorAlert(0, 1, 0, 0.25f); + ColorRGBA HomeButtonColorAlertHover(0, 1, 0, 0.5f); + ColorRGBA *pHomeButtonColor = nullptr; + ColorRGBA *pHomeButtonColorHover = nullptr; + + const char *pHomeScreenButtonLabel = FONT_ICON_HOUSE; + if(GotNewsOrUpdate) + { + pHomeScreenButtonLabel = FONT_ICON_NEWSPAPER; + pHomeButtonColor = &HomeButtonColorAlert; + pHomeButtonColorHover = &HomeButtonColorAlertHover; + } + + static CButtonContainer s_StartButton; + if(DoButton_MenuTab(&s_StartButton, pHomeScreenButtonLabel, false, &Button, IGraphics::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_HOME], pHomeButtonColor, pHomeButtonColor, pHomeButtonColorHover, 10.0f)) + { + m_ShowStart = true; + } + GameClient()->m_Tooltips.DoToolTip(&s_StartButton, &Button, Localize("Main menu")); + + const float BrowserButtonWidth = 75.0f; + Box.VSplitLeft(10.0f, nullptr, &Box); + Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); + static CButtonContainer s_InternetButton; + if(DoButton_MenuTab(&s_InternetButton, FONT_ICON_EARTH_AMERICAS, ActivePage == PAGE_INTERNET, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_INTERNET])) + { + if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_INTERNET) + { + if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) + Client()->RequestDDNetInfo(); + ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); + } + NewPage = PAGE_INTERNET; + } + GameClient()->m_Tooltips.DoToolTip(&s_InternetButton, &Button, Localize("Internet")); + + Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); + static CButtonContainer s_LanButton; + if(DoButton_MenuTab(&s_LanButton, FONT_ICON_NETWORK_WIRED, ActivePage == PAGE_LAN, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_LAN])) + { + if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_LAN) + ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); + NewPage = PAGE_LAN; + } + GameClient()->m_Tooltips.DoToolTip(&s_LanButton, &Button, Localize("LAN")); + + Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); + static CButtonContainer s_FavoritesButton; + if(DoButton_MenuTab(&s_FavoritesButton, FONT_ICON_STAR, ActivePage == PAGE_FAVORITES, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_FAVORITES])) + { + if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_FAVORITES) + { + if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) + Client()->RequestDDNetInfo(); + ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); + } + NewPage = PAGE_FAVORITES; + } + GameClient()->m_Tooltips.DoToolTip(&s_FavoritesButton, &Button, Localize("Favorites")); + + size_t FavoriteCommunityIndex = 0; + static CButtonContainer s_aFavoriteCommunityButtons[5]; + static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)PAGE_FAVORITE_COMMUNITY_5 - PAGE_FAVORITE_COMMUNITY_1 + 1); + static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)BIT_TAB_FAVORITE_COMMUNITY_5 - BIT_TAB_FAVORITE_COMMUNITY_1 + 1); + static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)IServerBrowser::TYPE_FAVORITE_COMMUNITY_5 - IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + 1); + for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) + { + if(Box.w < BrowserButtonWidth) + break; + Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); + const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; + if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], FONT_ICON_ELLIPSIS, ActivePage == Page, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIT_TAB_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex], nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) + { + const int BrowserType = IServerBrowser::TYPE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; + if(ServerBrowser()->GetCurrentType() != BrowserType) + { + if(ServerBrowser()->GetCurrentType() == IServerBrowser::TYPE_LAN) + Client()->RequestDDNetInfo(); + ServerBrowser()->Refresh(BrowserType); + } + NewPage = Page; + } + GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); + + ++FavoriteCommunityIndex; + if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) + break; + } + + TextRender()->SetRenderFlags(0); + TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); + } + else + { + // online menus + Box.VSplitLeft(90.0f, &Button, &Box); + static CButtonContainer s_GameButton; + if(DoButton_MenuTab(&s_GameButton, Localize("Game"), ActivePage == PAGE_GAME, &Button, IGraphics::CORNER_TL)) + NewPage = PAGE_GAME; + + Box.VSplitLeft(90.0f, &Button, &Box); + static CButtonContainer s_PlayersButton; + if(DoButton_MenuTab(&s_PlayersButton, Localize("Players"), ActivePage == PAGE_PLAYERS, &Button, IGraphics::CORNER_NONE)) + NewPage = PAGE_PLAYERS; + + Box.VSplitLeft(130.0f, &Button, &Box); + static CButtonContainer s_ServerInfoButton; + if(DoButton_MenuTab(&s_ServerInfoButton, Localize("Server info"), ActivePage == PAGE_SERVER_INFO, &Button, IGraphics::CORNER_NONE)) + NewPage = PAGE_SERVER_INFO; + + Box.VSplitLeft(90.0f, &Button, &Box); + static CButtonContainer s_NetworkButton; + if(DoButton_MenuTab(&s_NetworkButton, Localize("Browser"), ActivePage == PAGE_NETWORK, &Button, IGraphics::CORNER_NONE)) + NewPage = PAGE_NETWORK; + + if(GameClient()->m_GameInfo.m_Race) + { + Box.VSplitLeft(90.0f, &Button, &Box); + static CButtonContainer s_GhostButton; + if(DoButton_MenuTab(&s_GhostButton, Localize("Ghost"), ActivePage == PAGE_GHOST, &Button, IGraphics::CORNER_NONE)) + NewPage = PAGE_GHOST; + } + + Box.VSplitLeft(100.0f, &Button, &Box); + Box.VSplitLeft(4.0f, nullptr, &Box); + static CButtonContainer s_CallVoteButton; + if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), ActivePage == PAGE_CALLVOTE, &Button, IGraphics::CORNER_TR)) + { + NewPage = PAGE_CALLVOTE; + m_ControlPageOpening = true; + } + } + if(NewPage != -1) { if(ClientState == IClient::STATE_OFFLINE) @@ -859,7 +870,7 @@ void CMenus::OnInit() m_CreateDefaultFavoriteCommunities = true; } - if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_3 && + if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 && (size_t)(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1) >= ServerBrowser()->FavoriteCommunities().size()) { // Reset page to internet when there is no favorite community for this page. @@ -1110,7 +1121,7 @@ void CMenus::Render() { RenderNews(MainView); } - else if(m_MenuPage >= PAGE_INTERNET && m_MenuPage <= PAGE_FAVORITE_COMMUNITY_3) + else if(m_MenuPage >= PAGE_INTERNET && m_MenuPage <= PAGE_FAVORITE_COMMUNITY_5) { RenderServerbrowser(MainView); } @@ -2353,7 +2364,7 @@ const CMenus::CMenuImage *CMenus::FindMenuImage(const char *pName) void CMenus::SetMenuPage(int NewPage) { m_MenuPage = NewPage; - if(NewPage >= PAGE_INTERNET && NewPage <= PAGE_FAVORITE_COMMUNITY_3) + if(NewPage >= PAGE_INTERNET && NewPage <= PAGE_FAVORITE_COMMUNITY_5) g_Config.m_UiPage = NewPage; } @@ -2373,7 +2384,7 @@ void CMenus::RefreshBrowserTab(int UiPage) Client()->RequestDDNetInfo(); ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); } - else if(UiPage >= PAGE_FAVORITE_COMMUNITY_1 && UiPage <= PAGE_FAVORITE_COMMUNITY_3) + else if(UiPage >= PAGE_FAVORITE_COMMUNITY_1 && UiPage <= PAGE_FAVORITE_COMMUNITY_5) { Client()->RequestDDNetInfo(); ServerBrowser()->Refresh(UiPage - PAGE_FAVORITE_COMMUNITY_1 + IServerBrowser::TYPE_FAVORITE_COMMUNITY_1); diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 9c2cef052..e0e72ef13 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -644,6 +644,8 @@ public: PAGE_FAVORITE_COMMUNITY_1, PAGE_FAVORITE_COMMUNITY_2, PAGE_FAVORITE_COMMUNITY_3, + PAGE_FAVORITE_COMMUNITY_4, + PAGE_FAVORITE_COMMUNITY_5, PAGE_DEMOS, PAGE_SETTINGS, PAGE_NETWORK, @@ -671,6 +673,8 @@ public: BIT_TAB_FAVORITE_COMMUNITY_1, BIT_TAB_FAVORITE_COMMUNITY_2, BIT_TAB_FAVORITE_COMMUNITY_3, + BIT_TAB_FAVORITE_COMMUNITY_4, + BIT_TAB_FAVORITE_COMMUNITY_5, BIG_TAB_DEMOS, BIG_TAB_LENGTH, diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index c7962640b..52c424d21 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -1718,6 +1718,8 @@ void CMenus::RenderServerbrowser(CUIRect MainView) case PAGE_FAVORITE_COMMUNITY_1: case PAGE_FAVORITE_COMMUNITY_2: case PAGE_FAVORITE_COMMUNITY_3: + case PAGE_FAVORITE_COMMUNITY_4: + case PAGE_FAVORITE_COMMUNITY_5: m_pBackground->ChangePosition(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1 + CMenuBackground::POS_BROWSER_CUSTOM0); break; default: @@ -1837,7 +1839,7 @@ void CMenus::ConchainCommunitiesUpdate(IConsole::IResult *pResult, void *pUserDa { pfnCallback(pResult, pCallbackUserData); CMenus *pThis = static_cast(pUserData); - if(pResult->NumArguments() >= 1 && (g_Config.m_UiPage == PAGE_INTERNET || g_Config.m_UiPage == PAGE_FAVORITES || (g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_3))) + if(pResult->NumArguments() >= 1 && (g_Config.m_UiPage == PAGE_INTERNET || g_Config.m_UiPage == PAGE_FAVORITES || (g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5))) { pThis->UpdateCommunityCache(true); pThis->Client()->ServerBrowserUpdate(); @@ -1851,7 +1853,7 @@ void CMenus::ConchainUiPageUpdate(IConsole::IResult *pResult, void *pUserData, I CMenus *pThis = static_cast(pUserData); if(pResult->NumArguments() >= 1) { - if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_3 && + if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 && (size_t)(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1) >= pThis->ServerBrowser()->FavoriteCommunities().size()) { // Reset page to internet when there is no favorite community for this page. @@ -1869,7 +1871,7 @@ void CMenus::ConchainUiPageUpdate(IConsole::IResult *pResult, void *pUserData, I void CMenus::UpdateCommunityCache(bool Force) { - if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_3 && + if(g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 && (size_t)(g_Config.m_UiPage - PAGE_FAVORITE_COMMUNITY_1) >= ServerBrowser()->FavoriteCommunities().size()) { // Reset page to internet when there is no favorite community for this page, @@ -1881,7 +1883,7 @@ void CMenus::UpdateCommunityCache(bool Force) const unsigned CommunitiesHash = ServerBrowser()->CurrentCommunitiesHash(); const bool PageChanged = m_CommunityCache.m_LastPage != 0 && m_CommunityCache.m_LastPage != g_Config.m_UiPage; const bool CurrentCommunitiesChanged = m_CommunityCache.m_LastPage != 0 && m_CommunityCache.m_LastPage == g_Config.m_UiPage && m_CommunityCache.m_SelectedCommunitiesHash != CommunitiesHash; - if(CurrentCommunitiesChanged && g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_3) + if(CurrentCommunitiesChanged && g_Config.m_UiPage >= PAGE_FAVORITE_COMMUNITY_1 && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5) { // Favorite community was changed while its page is active, // refresh to get correct serverlist for updated community. diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index def4c9487..668af84bf 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -882,8 +882,8 @@ void CMenus::RenderInGameNetwork(CUIRect MainView) GameClient()->m_Tooltips.DoToolTip(&s_FavoritesButton, &Button, Localize("Favorites")); size_t FavoriteCommunityIndex = 0; - static CButtonContainer s_aFavoriteCommunityButtons[3]; - static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)PAGE_FAVORITE_COMMUNITY_3 - PAGE_FAVORITE_COMMUNITY_1 + 1); + static CButtonContainer s_aFavoriteCommunityButtons[5]; + static_assert(std::size(s_aFavoriteCommunityButtons) == (size_t)PAGE_FAVORITE_COMMUNITY_5 - PAGE_FAVORITE_COMMUNITY_1 + 1); for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) { TabBar.VSplitLeft(75.0f, &Button, &TabBar); diff --git a/src/game/client/components/menus_start.cpp b/src/game/client/components/menus_start.cpp index fed08e550..40b13fa15 100644 --- a/src/game/client/components/menus_start.cpp +++ b/src/game/client/components/menus_start.cpp @@ -193,7 +193,7 @@ void CMenus::RenderStartMenu(CUIRect MainView) static CButtonContainer s_PlayButton; if(DoButton_Menu(&s_PlayButton, Localize("Play", "Start menu"), 0, &Button, g_Config.m_ClShowStartMenuImages ? "play_game" : 0, IGraphics::CORNER_ALL, Rounding, 0.5f, ColorRGBA(0.0f, 0.0f, 0.0f, 0.25f)) || Ui()->ConsumeHotkey(CUi::HOTKEY_ENTER) || CheckHotKey(KEY_P)) { - NewPage = g_Config.m_UiPage >= PAGE_INTERNET && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_3 ? g_Config.m_UiPage : PAGE_INTERNET; + NewPage = g_Config.m_UiPage >= PAGE_INTERNET && g_Config.m_UiPage <= PAGE_FAVORITE_COMMUNITY_5 ? g_Config.m_UiPage : PAGE_INTERNET; } // render version diff --git a/src/game/editor/proof_mode.cpp b/src/game/editor/proof_mode.cpp index 773e356d1..c03cb1f2f 100644 --- a/src/game/editor/proof_mode.cpp +++ b/src/game/editor/proof_mode.cpp @@ -47,6 +47,7 @@ void CProofMode::SetMenuBackgroundPositionNames() m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM1] = "custom(2)"; m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM2] = "custom(3)"; m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM3] = "custom(4)"; + m_vpMenuBackgroundPositionNames[CMenuBackground::POS_BROWSER_CUSTOM4] = "custom(5)"; m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_RESERVED0] = "reserved settings(1)"; m_vpMenuBackgroundPositionNames[CMenuBackground::POS_SETTINGS_RESERVED1] = "reserved settings(2)"; m_vpMenuBackgroundPositionNames[CMenuBackground::POS_RESERVED0] = "reserved(1)";