From fdcca3c3e6dfc4b8dfc8a314b9f6eb6b888befc5 Mon Sep 17 00:00:00 2001 From: Alexander Akulich Date: Sat, 13 Jul 2024 21:27:51 +0300 Subject: [PATCH] Reimplement legacy DDNet and KoG tabs --- src/engine/client/serverbrowser.cpp | 22 ++++++ src/game/client/components/menus.cpp | 84 +++++++++++++++------ src/game/client/components/menus_ingame.cpp | 59 +++++++++++---- 3 files changed, 125 insertions(+), 40 deletions(-) diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp index 0e42267ec4f..fe74974f66b 100644 --- a/src/engine/client/serverbrowser.cpp +++ b/src/engine/client/serverbrowser.cpp @@ -1734,6 +1734,28 @@ std::vector CServerBrowser::SelectedCommunities() const std::vector CServerBrowser::FavoriteCommunities() const { + if(g_Config.m_ClEnableCommunities == 0) + { + std::vector vpFavorites; + auto FindCommunity = [this](const char *pCommunityId) -> const CCommunity * { + const auto CommunityIt = std::find_if(Communities().begin(), Communities().end(), [pCommunityId](const auto &Elem) { + return str_comp(Elem.Id(), pCommunityId) == 0; + }); + return CommunityIt == Communities().end() ? nullptr : &(*CommunityIt); + }; + static const std::vector vHardcoded{CCommunityId(IServerBrowser::COMMUNITY_DDNET), CCommunityId("kog")}; + + for(const auto &CommunityId : vHardcoded) + { + const CCommunity *pCommunity = FindCommunity(CommunityId.Id()); + if(pCommunity) + { + vpFavorites.push_back(pCommunity); + } + } + return vpFavorites; + } + // This is done differently than SelectedCommunities because the favorite // communities should be returned in the order specified by the user. std::vector vpFavorites; diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 7ee5084a37b..3d052da421d 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -229,7 +229,7 @@ int CMenus::DoButton_MenuTab(CButtonContainer *pButtonContainer, const char *pTe } } - if(pCommunityIcon) + if(pCommunityIcon && g_Config.m_ClPreferIconButtons) { CUIRect CommunityIcon; Rect.Margin(2.0f, &CommunityIcon); @@ -662,6 +662,31 @@ void CMenus::RenderMenubar(CUIRect Box, IClient::EClientState ClientState) 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()))) + { + 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 { @@ -688,34 +713,43 @@ void CMenus::RenderMenubar(CUIRect Box, IClient::EClientState ClientState) { NewPage = PAGE_FAVORITES; } - 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); - } - 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()))) + 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()) { - NewPage = Page; - } - GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); + if(Box.w < BrowserButtonWidth) + break; + Box.VSplitLeft(BrowserButtonWidth, &Button, &Box); + const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; + const char *pName = pCommunity->Name(); - ++FavoriteCommunityIndex; - if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) - break; - } + if(g_Config.m_ClEnableCommunities == 0) + { + if(str_comp(pCommunity->Id(), IServerBrowser::COMMUNITY_DDNET) == 0) + { + pName = "DDNet"; + } + else if(str_comp(pCommunity->Id(), "kog") == 0) + { + pName = "KoG"; + } + } - TextRender()->SetRenderFlags(0); - TextRender()->SetFontPreset(EFontPreset::DEFAULT_FONT); + if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], pName, ActivePage == Page, &Button, IGraphics::CORNER_T, &m_aAnimatorsBigPage[BIT_TAB_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex], nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) + { + NewPage = Page; + } + GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); + + ++FavoriteCommunityIndex; + if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) + break; + } + } } else { diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index 00130d6f850..6a8b2da6e53 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -869,6 +869,24 @@ void CMenus::RenderInGameNetwork(CUIRect MainView) 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); + for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) + { + TabBar.VSplitLeft(75.0f, &Button, &TabBar); + const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; + if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], FONT_ICON_ELLIPSIS, g_Config.m_UiPage == Page, &Button, IGraphics::CORNER_NONE, nullptr, nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) + { + NewPage = Page; + } + GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); + + ++FavoriteCommunityIndex; + if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) + break; + } } else { @@ -895,24 +913,35 @@ void CMenus::RenderInGameNetwork(CUIRect MainView) { NewPage = PAGE_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); - for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) - { - TabBar.VSplitLeft(75.0f, &Button, &TabBar); - const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; - if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], FONT_ICON_ELLIPSIS, g_Config.m_UiPage == Page, &Button, IGraphics::CORNER_NONE, nullptr, nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) + 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); + for(const CCommunity *pCommunity : ServerBrowser()->FavoriteCommunities()) { - NewPage = Page; - } - GameClient()->m_Tooltips.DoToolTip(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], &Button, pCommunity->Name()); + TabBar.VSplitLeft(75.0f, &Button, &TabBar); + const int Page = PAGE_FAVORITE_COMMUNITY_1 + FavoriteCommunityIndex; + const char *pName = pCommunity->Name(); + if(g_Config.m_ClEnableCommunities == 0) + { + if(str_comp(pCommunity->Id(), IServerBrowser::COMMUNITY_DDNET) == 0) + { + pName = "DDNet"; + } + else if(str_comp(pCommunity->Id(), "kog") == 0) + { + pName = "KoG"; + } + } + if(DoButton_MenuTab(&s_aFavoriteCommunityButtons[FavoriteCommunityIndex], pName, g_Config.m_UiPage == Page, &Button, IGraphics::CORNER_NONE, nullptr, nullptr, nullptr, nullptr, 10.0f, FindCommunityIcon(pCommunity->Id()))) + { + NewPage = Page; + } - ++FavoriteCommunityIndex; - if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) - break; + ++FavoriteCommunityIndex; + if(FavoriteCommunityIndex >= std::size(s_aFavoriteCommunityButtons)) + break; + } } TextRender()->SetRenderFlags(0);