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.

225 lines
7.0 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================
  7. #include "VarListPropertyPage.h"
  8. #include "RemoteServer.h"
  9. #include "VarEditDialog.h"
  10. #include <KeyValues.h>
  11. #include <vgui/KeyCode.h>
  12. #include <vgui_controls/ListPanel.h>
  13. #include <vgui_controls/Button.h>
  14. #include "filesystem.h"
  15. using namespace vgui;
  16. //-----------------------------------------------------------------------------
  17. // Purpose: Constructor
  18. //-----------------------------------------------------------------------------
  19. CVarListPropertyPage::CVarListPropertyPage(vgui::Panel *parent, const char *name) : vgui::PropertyPage(parent, name)
  20. {
  21. m_pRulesList = new ListPanel(this, "RulesList");
  22. m_pRulesList->AddColumnHeader(0, "name", "Variable", 256);
  23. m_pRulesList->AddColumnHeader(1, "value", "Value", 256);
  24. m_pEditButton = new Button(this, "EditButton", "Edit...");
  25. m_pEditButton->SetCommand(new KeyValues("EditVariable"));
  26. }
  27. //-----------------------------------------------------------------------------
  28. // Purpose: Destructor
  29. //-----------------------------------------------------------------------------
  30. CVarListPropertyPage::~CVarListPropertyPage()
  31. {
  32. // remove from callback list
  33. RemoteServer().RemoveServerDataResponseTarget(this);
  34. }
  35. //-----------------------------------------------------------------------------
  36. // Purpose: loads a list of variables from the file
  37. //-----------------------------------------------------------------------------
  38. bool CVarListPropertyPage::LoadVarList(const char *varfile)
  39. {
  40. bool bSuccess = false;
  41. // clear the current list
  42. m_pRulesList->DeleteAllItems();
  43. // load list from file
  44. KeyValues *dat = new KeyValues("VarList");
  45. if (dat->LoadFromFile( g_pFullFileSystem, varfile, NULL))
  46. {
  47. // enter into list
  48. for (KeyValues *rule = dat->GetFirstSubKey(); rule != NULL; rule = rule->GetNextKey())
  49. {
  50. m_pRulesList->AddItem(rule, 0, false, false);
  51. }
  52. bSuccess = true;
  53. }
  54. dat->deleteThis();
  55. return bSuccess;
  56. }
  57. //-----------------------------------------------------------------------------
  58. // Purpose: configures layout
  59. //-----------------------------------------------------------------------------
  60. void CVarListPropertyPage::PerformLayout()
  61. {
  62. BaseClass::PerformLayout();
  63. OnItemSelected();
  64. }
  65. //-----------------------------------------------------------------------------
  66. // Purpose: Handles edit button press
  67. //-----------------------------------------------------------------------------
  68. void CVarListPropertyPage::EditVariable()
  69. {
  70. // get rule from the list
  71. int itemID = m_pRulesList->GetSelectedItem(0);
  72. KeyValues *rule = m_pRulesList->GetItem(itemID);
  73. if (!rule)
  74. return;
  75. OnEditVariable(rule);
  76. }
  77. //-----------------------------------------------------------------------------
  78. // Purpose: Edits var
  79. //-----------------------------------------------------------------------------
  80. void CVarListPropertyPage::OnEditVariable(KeyValues *rule)
  81. {
  82. // open an edit box appropriate
  83. CVarEditDialog *box = new CVarEditDialog(this, "VarEditDialog");
  84. box->Activate(this, rule);
  85. }
  86. //-----------------------------------------------------------------------------
  87. // Purpose: refreshes all the values of cvars in the list
  88. //-----------------------------------------------------------------------------
  89. void CVarListPropertyPage::RefreshVarList()
  90. {
  91. // iterate the vars
  92. for (int i = 0; i < m_pRulesList->GetItemCount(); i++)
  93. {
  94. KeyValues *row = m_pRulesList->GetItem(i);
  95. if (!row)
  96. continue;
  97. // request the info from the server on each one of them
  98. RemoteServer().RequestValue(this, row->GetName());
  99. }
  100. RemoteServer().ProcessServerResponse();
  101. }
  102. //-----------------------------------------------------------------------------
  103. // Purpose: sets the value of a variable in the list
  104. //-----------------------------------------------------------------------------
  105. void CVarListPropertyPage::SetVarString(const char *varName, const char *value)
  106. {
  107. // find the item by name
  108. int itemID = m_pRulesList->GetItem(varName);
  109. KeyValues *rule = m_pRulesList->GetItem(itemID);
  110. if (!rule)
  111. return;
  112. // parse the rule
  113. const char *type = rule->GetString("type");
  114. if (!stricmp(type, "enumeration"))
  115. {
  116. // look up the value in the enumeration
  117. int iValue = atoi(value);
  118. const char *result = rule->FindKey("list", true)->GetString(value, "");
  119. rule->SetString("value", result);
  120. rule->SetInt("enum", iValue);
  121. }
  122. else
  123. {
  124. // no special type, treat it as a string
  125. rule->SetString("value", value);
  126. }
  127. m_pRulesList->ApplyItemChanges(itemID);
  128. }
  129. //-----------------------------------------------------------------------------
  130. // Purpose: Sets a custom string list
  131. //-----------------------------------------------------------------------------
  132. void CVarListPropertyPage::SetCustomStringList(const char *varName, const char *stringList)
  133. {
  134. // find the item by name
  135. int itemID = m_pRulesList->GetItem(varName);
  136. KeyValues *rule = m_pRulesList->GetItem(itemID);
  137. if (!rule)
  138. return;
  139. rule->SetString("stringlist", stringList);
  140. }
  141. //-----------------------------------------------------------------------------
  142. // Purpose: gets back the value of a variable
  143. //-----------------------------------------------------------------------------
  144. const char *CVarListPropertyPage::GetVarString(const char *varName)
  145. {
  146. int itemID = m_pRulesList->GetItem(varName);
  147. KeyValues *rule = m_pRulesList->GetItem(itemID);
  148. if (!rule)
  149. return "";
  150. return rule->GetString("value");
  151. }
  152. //-----------------------------------------------------------------------------
  153. // Purpose: Causes values to refresh on the user hitting F5
  154. //-----------------------------------------------------------------------------
  155. void CVarListPropertyPage::OnKeyCodeTyped(KeyCode code)
  156. {
  157. if (code == KEY_F5)
  158. {
  159. OnResetData();
  160. }
  161. else
  162. {
  163. BaseClass::OnKeyCodeTyped(code);
  164. }
  165. }
  166. //-----------------------------------------------------------------------------
  167. // Purpose: Enables the edit button if any rows in the list are selected
  168. //-----------------------------------------------------------------------------
  169. void CVarListPropertyPage::OnItemSelected()
  170. {
  171. if (m_pRulesList->GetSelectedItemsCount() > 0)
  172. {
  173. m_pEditButton->SetEnabled(true);
  174. }
  175. else
  176. {
  177. m_pEditButton->SetEnabled(false);
  178. }
  179. }
  180. //-----------------------------------------------------------------------------
  181. // Purpose: Called when a var gets edited
  182. //-----------------------------------------------------------------------------
  183. void CVarListPropertyPage::OnVarChanged(const char *var)
  184. {
  185. // request new value from server
  186. RemoteServer().RequestValue(this, var);
  187. // process the queue immediately, since if we're running a local server there will already be a reply
  188. RemoteServer().ProcessServerResponse();
  189. }
  190. //-----------------------------------------------------------------------------
  191. // Purpose: handles responses from the server
  192. //-----------------------------------------------------------------------------
  193. void CVarListPropertyPage::OnServerDataResponse(const char *value, const char *response)
  194. {
  195. SetVarString(value, response);
  196. }