summaryrefslogtreecommitdiff
path: root/tracker/AdminServer/VarListPropertyPage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tracker/AdminServer/VarListPropertyPage.cpp')
-rw-r--r--tracker/AdminServer/VarListPropertyPage.cpp225
1 files changed, 225 insertions, 0 deletions
diff --git a/tracker/AdminServer/VarListPropertyPage.cpp b/tracker/AdminServer/VarListPropertyPage.cpp
new file mode 100644
index 0000000..15ee3f4
--- /dev/null
+++ b/tracker/AdminServer/VarListPropertyPage.cpp
@@ -0,0 +1,225 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "VarListPropertyPage.h"
+#include "RemoteServer.h"
+#include "VarEditDialog.h"
+
+#include <KeyValues.h>
+#include <vgui/KeyCode.h>
+
+#include <vgui_controls/ListPanel.h>
+#include <vgui_controls/Button.h>
+
+#include "filesystem.h"
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CVarListPropertyPage::CVarListPropertyPage(vgui::Panel *parent, const char *name) : vgui::PropertyPage(parent, name)
+{
+ m_pRulesList = new ListPanel(this, "RulesList");
+ m_pRulesList->AddColumnHeader(0, "name", "Variable", 256);
+ m_pRulesList->AddColumnHeader(1, "value", "Value", 256);
+
+ m_pEditButton = new Button(this, "EditButton", "Edit...");
+ m_pEditButton->SetCommand(new KeyValues("EditVariable"));
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CVarListPropertyPage::~CVarListPropertyPage()
+{
+ // remove from callback list
+ RemoteServer().RemoveServerDataResponseTarget(this);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: loads a list of variables from the file
+//-----------------------------------------------------------------------------
+bool CVarListPropertyPage::LoadVarList(const char *varfile)
+{
+ bool bSuccess = false;
+ // clear the current list
+ m_pRulesList->DeleteAllItems();
+
+ // load list from file
+ KeyValues *dat = new KeyValues("VarList");
+ if (dat->LoadFromFile( g_pFullFileSystem, varfile, NULL))
+ {
+ // enter into list
+ for (KeyValues *rule = dat->GetFirstSubKey(); rule != NULL; rule = rule->GetNextKey())
+ {
+ m_pRulesList->AddItem(rule, 0, false, false);
+ }
+ bSuccess = true;
+ }
+
+ dat->deleteThis();
+ return bSuccess;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: configures layout
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::PerformLayout()
+{
+ BaseClass::PerformLayout();
+ OnItemSelected();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles edit button press
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::EditVariable()
+{
+ // get rule from the list
+ int itemID = m_pRulesList->GetSelectedItem(0);
+ KeyValues *rule = m_pRulesList->GetItem(itemID);
+ if (!rule)
+ return;
+
+ OnEditVariable(rule);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Edits var
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::OnEditVariable(KeyValues *rule)
+{
+ // open an edit box appropriate
+ CVarEditDialog *box = new CVarEditDialog(this, "VarEditDialog");
+ box->Activate(this, rule);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: refreshes all the values of cvars in the list
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::RefreshVarList()
+{
+ // iterate the vars
+ for (int i = 0; i < m_pRulesList->GetItemCount(); i++)
+ {
+ KeyValues *row = m_pRulesList->GetItem(i);
+ if (!row)
+ continue;
+
+ // request the info from the server on each one of them
+ RemoteServer().RequestValue(this, row->GetName());
+ }
+
+ RemoteServer().ProcessServerResponse();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: sets the value of a variable in the list
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::SetVarString(const char *varName, const char *value)
+{
+ // find the item by name
+ int itemID = m_pRulesList->GetItem(varName);
+ KeyValues *rule = m_pRulesList->GetItem(itemID);
+ if (!rule)
+ return;
+
+ // parse the rule
+ const char *type = rule->GetString("type");
+ if (!stricmp(type, "enumeration"))
+ {
+ // look up the value in the enumeration
+ int iValue = atoi(value);
+ const char *result = rule->FindKey("list", true)->GetString(value, "");
+ rule->SetString("value", result);
+ rule->SetInt("enum", iValue);
+ }
+ else
+ {
+ // no special type, treat it as a string
+ rule->SetString("value", value);
+ }
+
+ m_pRulesList->ApplyItemChanges(itemID);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Sets a custom string list
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::SetCustomStringList(const char *varName, const char *stringList)
+{
+ // find the item by name
+ int itemID = m_pRulesList->GetItem(varName);
+ KeyValues *rule = m_pRulesList->GetItem(itemID);
+ if (!rule)
+ return;
+
+ rule->SetString("stringlist", stringList);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: gets back the value of a variable
+//-----------------------------------------------------------------------------
+const char *CVarListPropertyPage::GetVarString(const char *varName)
+{
+ int itemID = m_pRulesList->GetItem(varName);
+ KeyValues *rule = m_pRulesList->GetItem(itemID);
+ if (!rule)
+ return "";
+
+ return rule->GetString("value");
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Causes values to refresh on the user hitting F5
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::OnKeyCodeTyped(KeyCode code)
+{
+ if (code == KEY_F5)
+ {
+ OnResetData();
+ }
+ else
+ {
+ BaseClass::OnKeyCodeTyped(code);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Enables the edit button if any rows in the list are selected
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::OnItemSelected()
+{
+ if (m_pRulesList->GetSelectedItemsCount() > 0)
+ {
+ m_pEditButton->SetEnabled(true);
+ }
+ else
+ {
+ m_pEditButton->SetEnabled(false);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Called when a var gets edited
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::OnVarChanged(const char *var)
+{
+ // request new value from server
+ RemoteServer().RequestValue(this, var);
+ // process the queue immediately, since if we're running a local server there will already be a reply
+ RemoteServer().ProcessServerResponse();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: handles responses from the server
+//-----------------------------------------------------------------------------
+void CVarListPropertyPage::OnServerDataResponse(const char *value, const char *response)
+{
+ SetVarString(value, response);
+}