|
|
//========= Copyright � 1996-2005, 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() ); }
|