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.
280 lines
8.6 KiB
280 lines
8.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "dme_controls/DmePicker.h" |
|
#include "tier1/KeyValues.h" |
|
#include "vgui_controls/TextEntry.h" |
|
#include "vgui_controls/ListPanel.h" |
|
#include "vgui_controls/Button.h" |
|
#include "datamodel/dmelement.h" |
|
#include "vgui/ISurface.h" |
|
#include "vgui/iinput.h" |
|
#include "dme_controls/dmecontrols_utils.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
using namespace vgui; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// Dme Picker |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Sort by MDL name |
|
//----------------------------------------------------------------------------- |
|
static int __cdecl DmeBrowserSortFunc( vgui::ListPanel *pPanel, const ListPanelItem &item1, const ListPanelItem &item2 ) |
|
{ |
|
const char *string1 = item1.kv->GetString("dme"); |
|
const char *string2 = item2.kv->GetString("dme"); |
|
return stricmp( string1, string2 ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CDmePicker::CDmePicker( vgui::Panel *pParent ) : BaseClass( pParent, "DmePicker" ) |
|
{ |
|
// FIXME: Make this an image browser |
|
m_pDmeBrowser = new vgui::ListPanel( this, "DmeBrowser" ); |
|
m_pDmeBrowser->AddColumnHeader( 0, "dme", "Dme Elements", 52, 0 ); |
|
m_pDmeBrowser->SetSelectIndividualCells( true ); |
|
m_pDmeBrowser->SetEmptyListText( "No Dme Elements" ); |
|
m_pDmeBrowser->SetDragEnabled( true ); |
|
m_pDmeBrowser->AddActionSignalTarget( this ); |
|
m_pDmeBrowser->SetSortFunc( 0, DmeBrowserSortFunc ); |
|
m_pDmeBrowser->SetSortColumn( 0 ); |
|
|
|
// filter selection |
|
m_pFilterList = new TextEntry( this, "FilterList" ); |
|
m_pFilterList->AddActionSignalTarget( this ); |
|
m_pFilterList->RequestFocus(); |
|
|
|
LoadControlSettingsAndUserConfig( "resource/dmepicker.res" ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destructor |
|
//----------------------------------------------------------------------------- |
|
CDmePicker::~CDmePicker() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: called to open |
|
//----------------------------------------------------------------------------- |
|
void CDmePicker::Activate( const CUtlVector< DmePickerInfo_t >&vec ) |
|
{ |
|
m_pDmeBrowser->RemoveAll(); |
|
|
|
int nCount = vec.Count(); |
|
for ( int i = 0; i < nCount; ++i ) |
|
{ |
|
CDmElement *pElement = GetElement<CDmElement>( vec[i].m_hElement ); |
|
const char *pElementName = pElement ? pElement->GetName() : "<null element>"; |
|
const char *pItemName = vec[i].m_pChoiceString ? vec[i].m_pChoiceString : pElementName; |
|
|
|
KeyValues *kv = new KeyValues( "node", "dme", pItemName ); |
|
kv->SetInt( "dmeHandle", vec[i].m_hElement ); |
|
int nItemID = m_pDmeBrowser->AddItem( kv, 0, false, false ); |
|
|
|
KeyValues *pDrag = new KeyValues( "drag", "text", pElementName ); |
|
pDrag->SetString( "texttype", "dmeName" ); |
|
pDrag->SetInt( "dmeelement", vec[i].m_hElement ); |
|
m_pDmeBrowser->SetItemDragData( nItemID, pDrag ); |
|
} |
|
|
|
RefreshDmeList(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CDmePicker::OnKeyCodePressed( KeyCode code ) |
|
{ |
|
if (( code == KEY_UP ) || ( code == KEY_DOWN ) || ( code == KEY_PAGEUP ) || ( code == KEY_PAGEDOWN )) |
|
{ |
|
KeyValues *pMsg = new KeyValues("KeyCodePressed", "code", code); |
|
vgui::ipanel()->SendMessage( m_pDmeBrowser->GetVPanel(), pMsg, GetVPanel()); |
|
pMsg->deleteThis(); |
|
} |
|
else |
|
{ |
|
BaseClass::OnKeyCodePressed( code ); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: refreshes the file list |
|
//----------------------------------------------------------------------------- |
|
void CDmePicker::RefreshDmeList() |
|
{ |
|
// Check the filter matches |
|
int nMatchingElements = 0; |
|
int nTotalCount = 0; |
|
for ( int nItemID = m_pDmeBrowser->FirstItem(); nItemID != m_pDmeBrowser->InvalidItemID(); nItemID = m_pDmeBrowser->NextItem( nItemID ) ) |
|
{ |
|
KeyValues *kv = m_pDmeBrowser->GetItem( nItemID ); |
|
const char *pElementName = kv->GetString( "dme" ); |
|
bool bIsVisible = !m_Filter.Length() || Q_stristr( pElementName, m_Filter.Get() ); |
|
m_pDmeBrowser->SetItemVisible( nItemID, bIsVisible ); |
|
if ( bIsVisible ) |
|
{ |
|
++nMatchingElements; |
|
} |
|
++nTotalCount; |
|
} |
|
m_pDmeBrowser->SortList(); |
|
|
|
char pColumnTitle[512]; |
|
Q_snprintf( pColumnTitle, sizeof(pColumnTitle), "%s (%d/%d)", |
|
"Dme Elements", nMatchingElements, nTotalCount ); |
|
m_pDmeBrowser->SetColumnHeaderText( 0, pColumnTitle ); |
|
|
|
if ( ( m_pDmeBrowser->GetItemCount() > 0 ) && ( m_pDmeBrowser->GetSelectedItemsCount() == 0 ) ) |
|
{ |
|
int nItemID = m_pDmeBrowser->GetItemIDFromRow( 0 ); |
|
m_pDmeBrowser->SetSelectedCell( nItemID, 0 ); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: refreshes dialog on text changing |
|
//----------------------------------------------------------------------------- |
|
void CDmePicker::OnTextChanged( ) |
|
{ |
|
int nLength = m_pFilterList->GetTextLength(); |
|
m_Filter.SetLength( nLength ); |
|
if ( nLength > 0 ) |
|
{ |
|
m_pFilterList->GetText( m_Filter.GetForModify(), nLength+1 ); |
|
} |
|
RefreshDmeList(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Returns the selceted model name |
|
//----------------------------------------------------------------------------- |
|
CDmElement *CDmePicker::GetSelectedDme( ) |
|
{ |
|
if ( m_pDmeBrowser->GetSelectedItemsCount() == 0 ) |
|
return NULL; |
|
|
|
int nIndex = m_pDmeBrowser->GetSelectedItem( 0 ); |
|
KeyValues *pItemKeyValues = m_pDmeBrowser->GetItem( nIndex ); |
|
return GetElementKeyValue< CDmElement >( pItemKeyValues, "dmeHandle" ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// Purpose: Modal picker frame |
|
// |
|
//----------------------------------------------------------------------------- |
|
CDmePickerFrame::CDmePickerFrame( vgui::Panel *pParent, const char *pTitle ) : |
|
BaseClass( pParent, "DmePickerFrame" ) |
|
{ |
|
m_pContextKeyValues = NULL; |
|
SetDeleteSelfOnClose( true ); |
|
m_pPicker = new CDmePicker( this ); |
|
m_pPicker->AddActionSignalTarget( this ); |
|
m_pOpenButton = new Button( this, "OpenButton", "#FileOpenDialog_Open", this, "Open" ); |
|
m_pCancelButton = new Button( this, "CancelButton", "#FileOpenDialog_Cancel", this, "Cancel" ); |
|
SetBlockDragChaining( true ); |
|
|
|
LoadControlSettingsAndUserConfig( "resource/dmepickerframe.res" ); |
|
|
|
SetTitle( pTitle, false ); |
|
} |
|
|
|
CDmePickerFrame::~CDmePickerFrame() |
|
{ |
|
CleanUpMessage(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Deletes the message |
|
//----------------------------------------------------------------------------- |
|
void CDmePickerFrame::CleanUpMessage() |
|
{ |
|
if ( m_pContextKeyValues ) |
|
{ |
|
m_pContextKeyValues->deleteThis(); |
|
m_pContextKeyValues = NULL; |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Activate the dialog |
|
//----------------------------------------------------------------------------- |
|
void CDmePickerFrame::DoModal( const CUtlVector< DmePickerInfo_t >& vec, KeyValues *pKeyValues ) |
|
{ |
|
CleanUpMessage(); |
|
m_pContextKeyValues = pKeyValues; |
|
m_pPicker->Activate( vec ); |
|
m_pOpenButton->SetEnabled( vec.Count() != 0 ); |
|
BaseClass::DoModal(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// On command |
|
//----------------------------------------------------------------------------- |
|
void CDmePickerFrame::OnCommand( const char *pCommand ) |
|
{ |
|
if ( !Q_stricmp( pCommand, "Open" ) ) |
|
{ |
|
CDmElement *pElement = m_pPicker->GetSelectedDme( ); |
|
|
|
KeyValues *pActionKeys = new KeyValues( "DmeSelected" ); |
|
SetElementKeyValue( pActionKeys, "dme", pElement ); |
|
if ( m_pContextKeyValues ) |
|
{ |
|
pActionKeys->AddSubKey( m_pContextKeyValues ); |
|
|
|
// This prevents them from being deleted later |
|
m_pContextKeyValues = NULL; |
|
} |
|
|
|
PostActionSignal( pActionKeys ); |
|
CloseModal(); |
|
return; |
|
} |
|
|
|
if ( !Q_stricmp( pCommand, "Cancel" ) ) |
|
{ |
|
KeyValues *pActionKeys = new KeyValues( "DmeSelectionCancelled" ); |
|
if ( m_pContextKeyValues ) |
|
{ |
|
pActionKeys->AddSubKey( m_pContextKeyValues ); |
|
|
|
// This prevents them from being deleted later |
|
m_pContextKeyValues = NULL; |
|
} |
|
|
|
PostActionSignal( pActionKeys ); |
|
CloseModal(); |
|
return; |
|
} |
|
|
|
BaseClass::OnCommand( pCommand ); |
|
} |
|
|
|
|
|
|