Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
7.8 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================
  7. #include "BaseGamesPage.h"
  8. #include "ServerListCompare.h"
  9. #include "util.h"
  10. #include "serverpage.h"
  11. #include <VGUI_Controls.h>
  12. #include <VGUI_CheckButton.h>
  13. #include <VGUI_ComboBox.h>
  14. #include <VGUI_ImagePanel.h>
  15. #include <VGUI_IScheme.h>
  16. #include <VGUI_IVGui.h>
  17. #include <VGUI_ListPanel.h>
  18. #include <VGUI_MenuButton.h>
  19. #include <VGUI_Menu.h>
  20. #include <VGUI_KeyValues.h>
  21. #include <VGUI_MouseCode.h>
  22. #include <stdio.h>
  23. using namespace vgui;
  24. //-----------------------------------------------------------------------------
  25. // Purpose: Constructor
  26. //-----------------------------------------------------------------------------
  27. CBaseGamesPage::CBaseGamesPage(vgui::Panel *parent, const char *name) : Frame(parent, name), m_Servers(this)
  28. {
  29. ivgui()->AddTickSignal(GetVPanel());
  30. //SetSize(500, 500);
  31. //SetParent(parent); // doesn't have any effect....
  32. m_pParent=parent;
  33. // load the password icon
  34. m_pPasswordIcon = new ImagePanel(NULL, NULL);
  35. m_pPasswordIcon->SetImage(scheme()->GetImage(scheme()->GetDefaultScheme(), "server/icon_password"));
  36. // Init UI
  37. // m_pConnect = new Button(this, "ConnectButton", "Connect");
  38. m_pRefresh = new Button(this, "RefreshButton", "Refresh");
  39. m_pRefresh->SetCommand("refresh");
  40. //m_pRefresh->AddActionSignalTarget(this);
  41. m_pAddIP = new Button(this, "AddIPButton", "Add IP");
  42. m_pManage = new Button(this, "ManageButton", "Manage");
  43. m_pManage->SetCommand(new KeyValues("Manage"));
  44. m_pManage->AddActionSignalTarget(this);
  45. // m_pRefreshMenu = new Menu(this, "RefreshMenu");
  46. // m_pRefreshMenu->MakePopup();
  47. //m_pRefresh->SetMenu(m_pRefreshMenu);
  48. //m_pRefresh->SetOpenDirection(MenuButton::UP);
  49. //m_pRefreshMenu->AddMenuItem("Refresh", "Get new info for servers in current list ", "refresh", this);
  50. //m_pRefreshMenu->AddMenuItem("GetNewList", "Get new server list ", "getnewlist", this);
  51. //m_pRefreshMenu->AddMenuItem("StopRefresh", "Stop refreshing server list ", "stoprefresh", this);
  52. m_pGameList = new OurListPanel(this, "gamelist");
  53. // Add the column headers
  54. m_pGameList->AddColumnHeader(0, "Password", util->GetString(""), 20, false, NOT_RESIZABLE, NOT_RESIZABLE );
  55. m_pGameList->AddColumnHeader(1, "Name", util->GetString(" Servers"), 50, true, RESIZABLE, RESIZABLE);
  56. m_pGameList->AddColumnHeader(2, "GameDesc", util->GetString(" Game"), 80, true, RESIZABLE, NOT_RESIZABLE);
  57. m_pGameList->AddColumnHeader(3, "Players", util->GetString(" Players"), 55, true, RESIZABLE, NOT_RESIZABLE);
  58. m_pGameList->AddColumnHeader(4, "Map", util->GetString(" Map" ), 90, true, RESIZABLE, NOT_RESIZABLE);
  59. m_pGameList->AddColumnHeader(5, "Ping", util->GetString(" Latency" ), 55, true, RESIZABLE, NOT_RESIZABLE);
  60. // setup fast sort functions
  61. m_pGameList->SetSortFunc(0, PasswordCompare);
  62. m_pGameList->SetSortFunc(1, ServerNameCompare);
  63. m_pGameList->SetSortFunc(2, GameCompare);
  64. m_pGameList->SetSortFunc(3, PlayersCompare);
  65. m_pGameList->SetSortFunc(4, MapCompare);
  66. m_pGameList->SetSortFunc(5, PingCompare);
  67. // Sort by ping time by default
  68. m_pGameList->SetSortColumn(5);
  69. m_pGameList->AddActionSignalTarget(this);
  70. // LoadControlSettings("Admin\\DialogAdminServerPage.res");
  71. }
  72. //-----------------------------------------------------------------------------
  73. // Purpose: Destructor
  74. //-----------------------------------------------------------------------------
  75. CBaseGamesPage::~CBaseGamesPage()
  76. {
  77. }
  78. //-----------------------------------------------------------------------------
  79. // Purpose:
  80. //-----------------------------------------------------------------------------
  81. void CBaseGamesPage::PerformLayout()
  82. {
  83. BaseClass::PerformLayout();
  84. /* // game list in middle
  85. int x = 0, y = 0, wide, tall;
  86. GetSize(wide, tall);
  87. m_pGameList->SetBounds(10, 30, wide - 20, tall - 200);
  88. Repaint();
  89. */
  90. }
  91. //-----------------------------------------------------------------------------
  92. // Purpose:
  93. //-----------------------------------------------------------------------------
  94. void CBaseGamesPage::OnTick()
  95. {
  96. m_Servers.RunFrame();
  97. }
  98. //-----------------------------------------------------------------------------
  99. // Purpose:
  100. //-----------------------------------------------------------------------------
  101. void CBaseGamesPage::ApplySchemeSettings(vgui::IScheme *pScheme)
  102. {
  103. BaseClass::ApplySchemeSettings(pScheme);
  104. m_pGameList->SetFont(scheme()->GetFont(scheme()->GetDefaultScheme(), "DefaultSmall"));
  105. }
  106. //-----------------------------------------------------------------------------
  107. // Purpose: gets information about specified server
  108. //-----------------------------------------------------------------------------
  109. serveritem_t &CBaseGamesPage::GetServer(unsigned int serverID)
  110. {
  111. return m_Servers.GetServer(serverID);
  112. }
  113. //-----------------------------------------------------------------------------
  114. // Purpose: call to let the UI now whether the game list is currently refreshing
  115. //-----------------------------------------------------------------------------
  116. void CBaseGamesPage::SetRefreshing(bool state)
  117. {
  118. if(!CServerPage::GetInstance())
  119. {
  120. return;
  121. }
  122. if (state)
  123. {
  124. CServerPage::GetInstance()->UpdateStatusText("Refreshing server list...");
  125. }
  126. else
  127. {
  128. CServerPage::GetInstance()->UpdateStatusText("");
  129. }
  130. // m_pRefreshMenu->FindChildByName("Refresh")->SetVisible(!state);
  131. //m_pRefreshMenu->FindChildByName("GetNewList")->SetVisible(!state);
  132. // m_pRefreshMenu->FindChildByName("StopRefresh")->SetVisible(state);
  133. }
  134. //-----------------------------------------------------------------------------
  135. // Purpose:
  136. //-----------------------------------------------------------------------------
  137. void CBaseGamesPage::OnCommand(const char *command)
  138. {
  139. if (!stricmp(command, "Connect"))
  140. {
  141. OnBeginConnect();
  142. }
  143. else if (!stricmp(command, "stoprefresh"))
  144. {
  145. // cancel the existing refresh
  146. StopRefresh();
  147. }
  148. else if (!stricmp(command, "refresh"))
  149. {
  150. // start a new refresh
  151. StartRefresh();
  152. }
  153. else if (!stricmp(command, "GetNewList"))
  154. {
  155. GetNewServerList();
  156. }
  157. else if (!stricmp(command, "addip"))
  158. {
  159. PostMessage(this,new KeyValues("AddServerByName")); // CFavorites handles this message
  160. }
  161. else if (!stricmp(command, "config"))
  162. {
  163. CServerPage::GetInstance()->ConfigPanel();
  164. }
  165. else
  166. {
  167. BaseClass::OnCommand(command);
  168. }
  169. }
  170. //-----------------------------------------------------------------------------
  171. // Purpose: Called when the game dir combo box is changed
  172. //-----------------------------------------------------------------------------
  173. void CBaseGamesPage::OnTextChanged(Panel *panel, const char *text)
  174. {
  175. }
  176. //-----------------------------------------------------------------------------
  177. // Purpose: Handles filter dropdown being toggled
  178. //-----------------------------------------------------------------------------
  179. void CBaseGamesPage::OnButtonToggled(Panel *panel, int state)
  180. {
  181. // treat changing these buttons like any other filter has changed
  182. OnTextChanged(panel, "");
  183. }
  184. void CBaseGamesPage::OnManage()
  185. {
  186. if (m_pGameList->GetNumSelectedRows())
  187. {
  188. // get the server
  189. unsigned int serverID = m_pGameList->GetDataItem(m_pGameList->GetSelectedRow(0))->userData;
  190. PostMessage(m_pParent->GetVPanel(), new KeyValues("Manage", "serverID", serverID));
  191. }
  192. }
  193. void CBaseGamesPage::OurListPanel::OnMouseDoublePressed( vgui::MouseCode code )
  194. {
  195. PostMessage(m_pParent->GetVPanel(), new KeyValues("Manage"));
  196. }
  197. //-----------------------------------------------------------------------------
  198. // Purpose: Message map
  199. //-----------------------------------------------------------------------------
  200. MessageMapItem_t CBaseGamesPage::m_MessageMap[] =
  201. {
  202. MAP_MESSAGE_PTR_INT( CBaseGamesPage, "ButtonToggled", OnButtonToggled, "panel", "state" ),
  203. MAP_MESSAGE_PTR_CONSTCHARPTR( CBaseGamesPage, "TextChanged", OnTextChanged, "panel", "text" ),
  204. MAP_MESSAGE( CBaseGamesPage , "Manage",OnManage ),
  205. };
  206. IMPLEMENT_PANELMAP(CBaseGamesPage, BaseClass);