summaryrefslogtreecommitdiff
path: root/vgui2/dme_controls/presetpicker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vgui2/dme_controls/presetpicker.cpp')
-rw-r--r--vgui2/dme_controls/presetpicker.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/vgui2/dme_controls/presetpicker.cpp b/vgui2/dme_controls/presetpicker.cpp
new file mode 100644
index 0000000..5e85211
--- /dev/null
+++ b/vgui2/dme_controls/presetpicker.cpp
@@ -0,0 +1,194 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Dialog allowing users to select presets from within a preset group
+//
+//===========================================================================//
+
+#include "dme_controls/presetpicker.h"
+#include "tier1/KeyValues.h"
+#include "tier1/utlbuffer.h"
+#include "vgui/IVGui.h"
+#include "vgui_controls/button.h"
+#include "vgui_controls/listpanel.h"
+#include "vgui_controls/splitter.h"
+#include "vgui_controls/messagebox.h"
+#include "movieobjects/dmeanimationset.h"
+#include "datamodel/dmelement.h"
+#include "matsys_controls/picker.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;
+
+static int __cdecl PresetNameSortFunc( vgui::ListPanel *pPanel, const vgui::ListPanelItem &item1, const vgui::ListPanelItem &item2 )
+{
+ const char *string1 = item1.kv->GetString( "name" );
+ const char *string2 = item2.kv->GetString( "name" );
+ return Q_stricmp( string1, string2 );
+}
+
+CPresetPickerFrame::CPresetPickerFrame( vgui::Panel *pParent, const char *pTitle, bool bAllowMultiSelect ) :
+ BaseClass( pParent, "PresetPickerFrame" )
+{
+ SetDeleteSelfOnClose( true );
+ m_pContextKeyValues = NULL;
+
+ m_pPresetList = new vgui::ListPanel( this, "PresetList" );
+ m_pPresetList->AddColumnHeader( 0, "name", "Preset Name", 52, 0 );
+ m_pPresetList->SetSelectIndividualCells( false );
+ m_pPresetList->SetMultiselectEnabled( bAllowMultiSelect );
+ m_pPresetList->SetEmptyListText( "No presets" );
+ m_pPresetList->AddActionSignalTarget( this );
+ m_pPresetList->SetSortFunc( 0, PresetNameSortFunc );
+ m_pPresetList->SetSortColumn( 0 );
+
+ m_pOpenButton = new vgui::Button( this, "OkButton", "#MessageBox_OK", this, "Ok" );
+ m_pCancelButton = new vgui::Button( this, "CancelButton", "#MessageBox_Cancel", this, "Cancel" );
+ SetBlockDragChaining( true );
+
+ LoadControlSettingsAndUserConfig( "resource/presetpicker.res" );
+
+ SetTitle( pTitle, false );
+}
+
+CPresetPickerFrame::~CPresetPickerFrame()
+{
+ CleanUpMessage();
+}
+
+
+//-----------------------------------------------------------------------------
+// Refreshes the list of presets
+//-----------------------------------------------------------------------------
+void CPresetPickerFrame::RefreshPresetList( CDmElement *pPresetGroup, bool bSelectAll )
+{
+ m_pPresetList->RemoveAll();
+
+ const CDmrElementArray< CDmePreset > presets( pPresetGroup, "presets" );
+ if ( !presets.IsValid() )
+ return;
+
+ int nCount = presets.Count();
+ if ( nCount == 0 )
+ return;
+
+ for ( int i = 0; i < nCount; ++i )
+ {
+ CDmePreset *pPreset = presets[i];
+
+ const char *pName = pPreset->GetName();
+ if ( !pName || !pName[0] )
+ {
+ pName = "<no name>";
+ }
+
+ KeyValues *kv = new KeyValues( "node" );
+ kv->SetString( "name", pName );
+ SetElementKeyValue( kv, "preset", pPreset );
+
+ int nItemID = m_pPresetList->AddItem( kv, 0, false, false );
+ if ( bSelectAll )
+ {
+ m_pPresetList->AddSelectedItem( nItemID );
+ }
+ }
+ m_pPresetList->SortList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Deletes the message
+//-----------------------------------------------------------------------------
+void CPresetPickerFrame::CleanUpMessage()
+{
+ if ( m_pContextKeyValues )
+ {
+ m_pContextKeyValues->deleteThis();
+ m_pContextKeyValues = NULL;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets the current scene + animation list
+//-----------------------------------------------------------------------------
+void CPresetPickerFrame::DoModal( CDmElement *pPresetGroup, bool bSelectAll, KeyValues *pContextKeyValues )
+{
+ CleanUpMessage();
+ RefreshPresetList( pPresetGroup, bSelectAll );
+ m_pContextKeyValues = pContextKeyValues;
+ BaseClass::DoModal();
+}
+
+
+//-----------------------------------------------------------------------------
+// On command
+//-----------------------------------------------------------------------------
+void CPresetPickerFrame::OnCommand( const char *pCommand )
+{
+ if ( !Q_stricmp( pCommand, "Ok" ) )
+ {
+ int nSelectedItemCount = m_pPresetList->GetSelectedItemsCount();
+ if ( nSelectedItemCount == 0 )
+ return;
+
+ KeyValues *pActionKeys = new KeyValues( "PresetPicked" );
+
+ if ( m_pPresetList->IsMultiselectEnabled() )
+ {
+ pActionKeys->SetInt( "count", nSelectedItemCount );
+
+ // Adds them in selection order
+ for ( int i = 0; i < nSelectedItemCount; ++i )
+ {
+ char pBuf[32];
+ Q_snprintf( pBuf, sizeof(pBuf), "%d", i );
+
+ int nItemID = m_pPresetList->GetSelectedItem( i );
+ KeyValues *pKeyValues = m_pPresetList->GetItem( nItemID );
+ CDmePreset *pPreset = GetElementKeyValue<CDmePreset>( pKeyValues, "preset" );
+
+ SetElementKeyValue( pActionKeys, pBuf, pPreset );
+ }
+ }
+ else
+ {
+ int nItemID = m_pPresetList->GetSelectedItem( 0 );
+ KeyValues *pKeyValues = m_pPresetList->GetItem( nItemID );
+ CDmePreset *pPreset = GetElementKeyValue<CDmePreset>( pKeyValues, "preset" );
+ SetElementKeyValue( pActionKeys, "preset", pPreset );
+ }
+
+ 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( "PresetPickCancelled" );
+ if ( m_pContextKeyValues )
+ {
+ pActionKeys->AddSubKey( m_pContextKeyValues );
+
+ // This prevents them from being deleted later
+ m_pContextKeyValues = NULL;
+ }
+ PostActionSignal( pActionKeys );
+ CloseModal();
+ return;
+ }
+
+ BaseClass::OnCommand( pCommand );
+}
+