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.
203 lines
5.4 KiB
203 lines
5.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//============================================================================= |
|
|
|
#include "VarEditDialog.h" |
|
#include "RemoteServer.h" |
|
|
|
#include <stdio.h> |
|
|
|
#include <vgui/IInput.h> |
|
|
|
#include <vgui_controls/Button.h> |
|
#include <vgui_controls/ComboBox.h> |
|
#include <vgui_controls/TextEntry.h> |
|
#include <KeyValues.h> |
|
|
|
using namespace vgui; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CVarEditDialog::CVarEditDialog(vgui::Panel *parent, const char *name) : Frame(parent, name) |
|
{ |
|
SetSize(280, 180); |
|
SetSizeable(false); |
|
m_pOKButton = new Button(this, "OKButton", "OK"); |
|
m_pCancelButton = new Button(this, "CancelButton", "Cancel"); |
|
m_pStringEdit = new TextEntry(this, "StringEdit"); |
|
m_pComboEdit = new ComboBox(this, "ComboEdit", 12, false); |
|
m_pRules = NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destructor |
|
//----------------------------------------------------------------------------- |
|
CVarEditDialog::~CVarEditDialog() |
|
{ |
|
// input()->ReleaseAppModalSurface(); |
|
if (m_pRules) |
|
{ |
|
m_pRules->deleteThis(); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Configures and shows the var edit dialog |
|
//----------------------------------------------------------------------------- |
|
void CVarEditDialog::Activate(vgui::Panel *actionSignalTarget, KeyValues *rules) |
|
{ |
|
// configure |
|
AddActionSignalTarget(actionSignalTarget); |
|
m_pRules = rules->MakeCopy(); |
|
|
|
const char *type = m_pRules->GetString("type"); |
|
if (!stricmp(type, "enumeration")) |
|
{ |
|
LoadControlSettings("Admin/VarEditDialog_ComboBox.res", "PLATFORM"); |
|
m_pStringEdit->SetVisible(false); |
|
|
|
// fill in the combo box |
|
for (KeyValues *kv = m_pRules->FindKey("list", true)->GetFirstSubKey(); kv != NULL; kv = kv->GetNextKey()) |
|
{ |
|
Assert( 0 ); |
|
// FIXME: This Assert doesn't compile |
|
// Assert(index++ == atoi(kv->GetName())); |
|
m_pComboEdit->AddItem(kv->GetString(), NULL); |
|
} |
|
|
|
// activate the current item |
|
m_pComboEdit->ActivateItemByRow(m_pRules->GetInt("enum")); |
|
} |
|
else if (!stricmp(type, "customlist")) |
|
{ |
|
LoadControlSettings("Admin/VarEditDialog_ComboBox.res", "PLATFORM"); |
|
m_pStringEdit->SetVisible(false); |
|
|
|
// fill in the combo box |
|
int index = 0; |
|
const char *currentValue = m_pRules->GetString("value"); |
|
const char *parse = m_pRules->GetString("stringlist"); |
|
while (*parse) |
|
{ |
|
// newline-seperated map list |
|
if (*parse == '\n') |
|
{ |
|
parse++; |
|
continue; |
|
} |
|
|
|
// pull out the map name |
|
const char *end = strstr(parse, "\n"); |
|
if (!end) |
|
break; |
|
|
|
char customString[64]; |
|
int nameSize = end - parse; |
|
if (nameSize >= sizeof(customString)) |
|
{ |
|
nameSize = sizeof(customString) - 1; |
|
} |
|
|
|
// copy in the name |
|
strncpy(customString, parse, nameSize); |
|
customString[nameSize] = 0; |
|
parse = end; |
|
|
|
// add to dropdown |
|
int itemID = m_pComboEdit->AddItem(customString, NULL); |
|
index++; |
|
|
|
// activate the current item |
|
if (!stricmp(customString, currentValue)) |
|
{ |
|
m_pComboEdit->ActivateItem(itemID); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
// normal string edit |
|
LoadControlSettings("Admin/VarEditDialog_String.res", "PLATFORM"); |
|
m_pComboEdit->SetVisible(false); |
|
m_pStringEdit->SelectAllOnFirstFocus(true); |
|
m_pStringEdit->SetText(m_pRules->GetString("value")); |
|
} |
|
|
|
// set value |
|
char title[256]; |
|
_snprintf(title, sizeof(title) - 1, "Change %s", m_pRules->GetString("name")); |
|
SetTitle(title, false); |
|
|
|
// bring to front |
|
// input()->SetAppModalSurface(GetVPanel()); |
|
MoveToCenterOfScreen(); |
|
BaseClass::Activate(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: button command handler |
|
//----------------------------------------------------------------------------- |
|
void CVarEditDialog::OnCommand(const char *command) |
|
{ |
|
if (!stricmp(command, "OK")) |
|
{ |
|
// change the value |
|
ApplyChanges(); |
|
Close(); |
|
} |
|
else if (!stricmp(command, "Cancel")) |
|
{ |
|
Close(); |
|
} |
|
else |
|
{ |
|
BaseClass::OnCommand(command); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Applies changes |
|
//----------------------------------------------------------------------------- |
|
void CVarEditDialog::ApplyChanges() |
|
{ |
|
const char *type = m_pRules->GetString("type"); |
|
if (!stricmp(type, "enumeration")) |
|
{ |
|
// get the enumeration position from the combo box |
|
int iVal = m_pComboEdit->GetActiveItem(); |
|
char value[32]; |
|
_snprintf(value, sizeof(value) - 1, "%d", iVal); |
|
RemoteServer().SetValue(m_pRules->GetName(), value); |
|
|
|
} |
|
else if (!stricmp(type, "customlist")) |
|
{ |
|
char value[512]; |
|
m_pComboEdit->GetText(value, sizeof(value)); |
|
RemoteServer().SetValue(m_pRules->GetName(), value); |
|
} |
|
else |
|
{ |
|
// normal string |
|
char value[512]; |
|
m_pStringEdit->GetText(value, sizeof(value)); |
|
RemoteServer().SetValue(m_pRules->GetName(), value); |
|
} |
|
|
|
// tell the caller the var changed |
|
PostActionSignal(new KeyValues("VarChanged", "var", m_pRules->GetName())); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Deletes on close |
|
//----------------------------------------------------------------------------- |
|
void CVarEditDialog::OnClose() |
|
{ |
|
BaseClass::OnClose(); |
|
MarkForDeletion(); |
|
} |
|
|
|
|