diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /vgui2/dme_controls/dmepicker.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'vgui2/dme_controls/dmepicker.cpp')
| -rw-r--r-- | vgui2/dme_controls/dmepicker.cpp | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/vgui2/dme_controls/dmepicker.cpp b/vgui2/dme_controls/dmepicker.cpp new file mode 100644 index 0000000..749ea9e --- /dev/null +++ b/vgui2/dme_controls/dmepicker.cpp @@ -0,0 +1,280 @@ +//========= 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 ); +} + + |