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.
174 lines
4.2 KiB
174 lines
4.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "client_pch.h" |
|
|
|
#include "vgui_helpers.h" |
|
#include <vgui_controls/TreeView.h> |
|
#include <vgui_controls/ListPanel.h> |
|
#include <vgui/ILocalize.h> |
|
#include <vgui/ISystem.h> |
|
#include "KeyValues.h" |
|
#include "convar.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
CConVarCheckButton::CConVarCheckButton( vgui::Panel *parent, const char *panelName, const char *text ) : |
|
vgui::CheckButton( parent, panelName, text ) |
|
{ |
|
m_pConVar = NULL; |
|
} |
|
|
|
void CConVarCheckButton::SetConVar( ConVar *pVar ) |
|
{ |
|
m_pConVar = pVar; |
|
SetSelected( m_pConVar->GetBool() ); |
|
} |
|
|
|
void CConVarCheckButton::SetSelected( bool state ) |
|
{ |
|
BaseClass::SetSelected( state ); |
|
|
|
m_pConVar->SetValue( state ); |
|
} |
|
|
|
|
|
void IncrementalUpdateTree_R( |
|
vgui::TreeView *pTree, |
|
int iCurTreeNode, |
|
KeyValues *pValues, |
|
bool &bChanges, |
|
UpdateItemStateFn fn ) |
|
{ |
|
// Add new items. |
|
int iCurChild = 0; |
|
int nChildren = pTree->GetNumChildren( iCurTreeNode ); |
|
KeyValues *pSub = pValues->GetFirstSubKey(); |
|
|
|
while ( iCurChild < nChildren || pSub ) |
|
{ |
|
// The items in the tree are keyed by the panel pointer. |
|
if ( pSub ) |
|
{ |
|
const char *pSubText = pSub->GetString( "Text", NULL ); |
|
if ( pSubText ) |
|
{ |
|
if ( iCurChild < nChildren ) |
|
{ |
|
// Compare the items here. |
|
int iChildItemId = pTree->GetChild( iCurTreeNode, iCurChild ); |
|
|
|
if ( fn( pTree, iChildItemId, pSub ) ) |
|
bChanges = true; |
|
|
|
IncrementalUpdateTree_R( pTree, iChildItemId, pSub, bChanges, fn ); |
|
} |
|
else |
|
{ |
|
// This means that the KeyValues has an extra node.. |
|
bChanges = true; |
|
int iChildItemId = pTree->AddItem( pSub, iCurTreeNode ); |
|
|
|
if ( fn( pTree, iChildItemId, pSub ) ) |
|
bChanges = true; |
|
|
|
IncrementalUpdateTree_R( pTree, iChildItemId, pSub, bChanges, fn ); |
|
} |
|
|
|
++iCurChild; |
|
} |
|
|
|
pSub = pSub->GetNextKey(); |
|
} |
|
else |
|
{ |
|
// This means that the tree view has extra ones at the end. Get rid of them. |
|
int iChildItemId = pTree->GetChild( iCurTreeNode, iCurChild ); |
|
--nChildren; |
|
bChanges = true; |
|
|
|
// HACK: I put a hack in there so if you give a negative number for the item, it'll |
|
// delete the panels immediately. This gets around a bug in the TreeView where the |
|
// panels don't always get deleted when using MarkPanelForDeletion. |
|
pTree->RemoveItem( -iChildItemId, false ); |
|
} |
|
} |
|
} |
|
|
|
|
|
bool IncrementalUpdateTree( |
|
vgui::TreeView *pTree, |
|
KeyValues *pValues, |
|
UpdateItemStateFn fn, |
|
int iRoot ) |
|
{ |
|
if ( iRoot == -1 ) |
|
{ |
|
iRoot = pTree->GetRootItemIndex(); |
|
if ( iRoot == -1 ) |
|
{ |
|
// Add a root if there isn't one yet. |
|
KeyValues *pTempValues = new KeyValues( "" ); |
|
pTempValues->SetString( "Text", "" ); |
|
iRoot = pTree->AddItem( pTempValues, iRoot ); |
|
pTempValues->deleteThis(); |
|
} |
|
} |
|
|
|
bool bChanges = false; |
|
IncrementalUpdateTree_R( pTree, iRoot, pValues, bChanges, fn ); |
|
return bChanges; |
|
} |
|
|
|
|
|
void CopyListPanelToClipboard( vgui::ListPanel *pListPanel ) |
|
{ |
|
CUtlVector<char> textBuf; |
|
|
|
// Write the headers. |
|
int nColumns = pListPanel->GetNumColumnHeaders(); |
|
for ( int i=0; i < nColumns; i++ ) |
|
{ |
|
if ( i != 0 ) |
|
textBuf.AddToTail( '\t' ); |
|
|
|
char tempText[512]; |
|
if ( !pListPanel->GetColumnHeaderText( i, tempText, sizeof( tempText ) ) ) |
|
Error( "GetColumHeaderText( %d ) failed", i ); |
|
|
|
textBuf.AddMultipleToTail( strlen( tempText ), tempText ); |
|
} |
|
textBuf.AddToTail( '\n' ); |
|
|
|
// Now write the rows. |
|
int iCur = pListPanel->FirstItem(); |
|
while ( iCur != pListPanel->InvalidItemID() ) |
|
{ |
|
// Write the columns for this row. |
|
for ( int i=0; i < nColumns; i++ ) |
|
{ |
|
if ( i != 0 ) |
|
textBuf.AddToTail( '\t' ); |
|
|
|
wchar_t tempTextWC[512]; |
|
char tempText[512]; |
|
|
|
pListPanel->GetCellText( iCur, i, tempTextWC, sizeof( tempTextWC ) ); |
|
g_pVGuiLocalize->ConvertUnicodeToANSI( tempTextWC, tempText, sizeof( tempText ) ); |
|
|
|
textBuf.AddMultipleToTail( strlen( tempText ), tempText ); |
|
} |
|
textBuf.AddToTail( '\n' ); |
|
|
|
iCur = pListPanel->NextItem( iCur ); |
|
} |
|
textBuf.AddToTail( 0 ); |
|
|
|
// Set the clipboard text. |
|
vgui::system()->SetClipboardText( textBuf.Base(), textBuf.Count() ); |
|
}
|
|
|