summaryrefslogtreecommitdiff
path: root/engine/cl_demoeditorpanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/cl_demoeditorpanel.cpp')
-rw-r--r--engine/cl_demoeditorpanel.cpp386
1 files changed, 386 insertions, 0 deletions
diff --git a/engine/cl_demoeditorpanel.cpp b/engine/cl_demoeditorpanel.cpp
new file mode 100644
index 0000000..3792a30
--- /dev/null
+++ b/engine/cl_demoeditorpanel.cpp
@@ -0,0 +1,386 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "client_pch.h"
+#include "cl_demoeditorpanel.h"
+#include "cl_demoactionmanager.h"
+#include "cl_demoaction.h"
+#include <vgui_controls/Button.h>
+#include <vgui_controls/CheckButton.h>
+#include <vgui_controls/Label.h>
+
+#include <vgui_controls/Controls.h>
+#include <vgui/ISystem.h>
+#include <vgui/ISurface.h>
+#include <vgui_controls/PropertySheet.h>
+#include <vgui/IVGui.h>
+#include <vgui_controls/FileOpenDialog.h>
+#include <vgui_controls/ProgressBar.h>
+#include <vgui_controls/ListPanel.h>
+#include <vgui_controls/MenuButton.h>
+#include <vgui_controls/Menu.h>
+#include "cl_demoactioneditors.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+using namespace vgui;
+
+// So new actions can have sequential/unique names
+static int g_nNewActionNumber = 1;
+
+//-----------------------------------------------------------------------------
+// Purpose: A menu button that knows how to parse cvar/command menu data from gamedir\scripts\debugmenu.txt
+//-----------------------------------------------------------------------------
+class CNewActionButton : public vgui::MenuButton
+{
+ typedef vgui::MenuButton BaseClass;
+
+public:
+ // Construction
+ CNewActionButton( vgui::Panel *parent, const char *panelName, const char *text );
+
+private:
+ // Menu associated with this button
+ Menu *m_pMenu;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CNewActionButton::CNewActionButton(Panel *parent, const char *panelName, const char *text)
+ : BaseClass( parent, panelName, text )
+{
+ // Assume no menu
+ m_pMenu = new Menu( this, "DemoEditNewAction" );
+
+ int count = NUM_DEMO_ACTIONS;
+ int i;
+ for ( i = 1 ; i < count; i++ )
+ {
+ char const *actionType = CBaseDemoAction::NameForType( (DEMOACTION)i );
+
+ m_pMenu->AddMenuItem( actionType, actionType, parent );
+ m_pMenu->SetItemEnabled( actionType, CBaseDemoAction::HasEditorFactory( (DEMOACTION)i ) );
+ }
+
+ m_pMenu->MakePopup();
+ MenuButton::SetMenu(m_pMenu);
+ SetOpenDirection(Menu::UP);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Basic help dialog
+//-----------------------------------------------------------------------------
+CDemoEditorPanel::CDemoEditorPanel( vgui::Panel *parent ) : Frame( parent, "DemoEditorPanel")
+{
+ int w = 440;
+ int h = 300;
+
+ SetSize( w, h );
+
+ SetTitle("Demo Editor", true);
+
+ m_pSave = new vgui::Button( this, "DemoEditSave", "Save" );
+ m_pRevert = new vgui::Button( this, "DemoEditRevert", "Revert" );;
+ m_pOK = new vgui::Button( this, "DemoEditOk", "OK" );
+ m_pCancel = new vgui::Button( this, "DemoEditCancel", "Cancel" );
+
+ m_pNew = new CNewActionButton( this, "DemoEditNew", "New->" );
+ m_pEdit = new vgui::Button( this, "DemoEditEdit", "Edit..." );
+ m_pDelete = new vgui::Button( this, "DemoEditDelete", "Delete" );
+
+ m_pCurrentDemo = new vgui::Label( this, "DemoName", "" );
+
+ m_pActions = new vgui::ListPanel( this, "DemoActionList" );
+
+ vgui::ivgui()->AddTickSignal( GetVPanel(), 0 );
+
+ LoadControlSettings("Resource\\DemoEditorPanel.res");
+
+ int xpos, ypos;
+ parent->GetPos( xpos, ypos );
+ ypos += parent->GetTall();
+
+ SetPos( xpos, ypos );
+
+ m_pActions->AddColumnHeader(0, "actionname", "Action", m_pActions->GetWide() / 3);
+ m_pActions->AddColumnHeader(1, "actiontype", "Type", m_pActions->GetWide() / 3);
+ m_pActions->AddColumnHeader(2, "actionstart", "Start", m_pActions->GetWide() / 3);
+ OnRefresh();
+
+ SetVisible( true );
+ SetSizeable( false );
+ SetMoveable( true );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CDemoEditorPanel::~CDemoEditorPanel()
+{
+}
+
+void CDemoEditorPanel::OnTick()
+{
+ BaseClass::OnTick();
+
+ m_pCurrentDemo->SetText( demoaction->GetCurrentDemoFile() );
+ bool hasdemo = demoaction->GetCurrentDemoFile()[0] ? true : false;
+
+ if ( !hasdemo )
+ {
+ m_pNew->SetEnabled( false );
+ m_pEdit->SetEnabled( false );
+ m_pDelete->SetEnabled( false );
+ m_pSave->SetEnabled( false );
+ m_pRevert->SetEnabled( false );
+
+ }
+ else
+ {
+ m_pNew->SetEnabled( true );
+
+ int count = demoaction->GetActionCount();
+
+ m_pEdit->SetEnabled( count > 0 );
+ m_pDelete->SetEnabled( count > 0 );
+
+ if ( m_pActions && m_pActions->GetSelectedItemsCount() != 1 )
+ {
+ m_pEdit->SetEnabled( false );
+ m_pDelete->SetEnabled( false );
+ }
+
+ m_pSave->SetEnabled( demoaction->IsDirty() );
+ m_pRevert->SetEnabled( demoaction->IsDirty() );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *command -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CDemoEditorPanel::IsNewActionCommand( char const *command )
+{
+ DEMOACTION type = CBaseDemoAction::TypeForName( command );
+ if ( type != DEMO_ACTION_UNKNOWN )
+ {
+ return true;
+ }
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *actiontype -
+//-----------------------------------------------------------------------------
+void CDemoEditorPanel::CreateNewAction( char const *actiontype )
+{
+ if ( m_hCurrentEditor != 0 )
+ return;
+
+ DEMOACTION type = CBaseDemoAction::TypeForName( actiontype );
+ if ( type == DEMO_ACTION_UNKNOWN )
+ return;
+
+ CBaseDemoAction *action = CBaseDemoAction::CreateDemoAction( type );
+ if ( action )
+ {
+ action->SetActionName( va( "Unnamed%i", g_nNewActionNumber++ ) );
+ demoaction->SetDirty( true );
+
+ m_hCurrentEditor = CBaseDemoAction::CreateActionEditor( action->GetType(), this, action, true );
+ if ( m_hCurrentEditor != 0 )
+ {
+ m_hCurrentEditor->SetVisible( true );
+ m_hCurrentEditor->SetSize( 400, 300 );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *command -
+//-----------------------------------------------------------------------------
+void CDemoEditorPanel::OnCommand(const char *command)
+{
+ if ( !Q_strcasecmp( command, "edit" ) )
+ {
+ OnEdit();
+ }
+ else if ( !Q_strcasecmp( command, "delete" ) )
+ {
+ OnDelete();
+ }
+ else if ( !Q_strcasecmp( command, "save" ) )
+ {
+ OnSave();
+ }
+ else if ( !Q_strcasecmp( command, "Close" ) )
+ {
+ OnSave();
+ MarkForDeletion();
+ OnClose();
+ }
+ else if ( !Q_strcasecmp( command, "cancel" ) )
+ {
+ OnRevert();
+ MarkForDeletion();
+ OnClose();
+ }
+ else if ( !Q_strcasecmp( command, "revert" ) )
+ {
+ OnRevert();
+ }
+ else if ( IsNewActionCommand( command ) )
+ {
+ CreateNewAction( command );
+ }
+ else
+ {
+ BaseClass::OnCommand( command );
+ }
+}
+
+void CDemoEditorPanel::OnVDMChanged( void )
+{
+ OnRefresh();
+}
+
+void CDemoEditorPanel::PurgeActionList()
+{
+ if ( !m_pActions )
+ {
+ Assert( 0 );
+ return;
+ }
+
+ m_pActions->DeleteAllItems();
+}
+
+void CDemoEditorPanel::PopulateActionList()
+{
+ PurgeActionList();
+
+ int count = demoaction->GetActionCount();
+ int i;
+ for ( i = 0; i < count; i++ )
+ {
+ CBaseDemoAction *action = demoaction->GetAction( i );
+ Assert( action );
+
+ KeyValues *item = new KeyValues( "data", "actionname", action->GetActionName() );
+ item->SetString( "actiontype", CBaseDemoAction::NameForType( action->GetType() ) );
+ switch ( action->GetTimingType() )
+ {
+ default:
+ case ACTION_USES_NEITHER:
+ break;
+ case ACTION_USES_TICK:
+ {
+ item->SetString( "actionstart", va( "Tick %i", action->GetStartTick() ) );
+ }
+ break;
+ case ACTION_USES_TIME:
+ {
+ item->SetString( "actionstart", va( "Time %.3f", action->GetStartTime() ) );
+ }
+ break;
+ }
+
+ m_pActions->AddItem( item , 0, false, false);
+ }
+}
+
+void CDemoEditorPanel::OnEdit()
+{
+ if ( m_hCurrentEditor != 0 )
+ return;
+
+ int numselected = m_pActions->GetSelectedItemsCount();
+ if ( numselected != 1 )
+ return;
+
+ int row = m_pActions->GetSelectedItem( 0 );
+ if ( row == -1 )
+ return;
+
+ CBaseDemoAction *action = demoaction->GetAction( row );
+
+ m_hCurrentEditor = CBaseDemoAction::CreateActionEditor( action->GetType(), this, action, false );
+ if ( m_hCurrentEditor != 0 )
+ {
+ m_hCurrentEditor->SetVisible( true );
+ m_hCurrentEditor->SetSize( 400, 300 );
+ }
+
+ // edit it
+
+// demoaction->SetDirty( true );
+
+// PopulateActionList();
+}
+
+void CDemoEditorPanel::OnDelete()
+{
+ int numselected = m_pActions->GetSelectedItemsCount();
+ if ( numselected < 1 )
+ return;
+
+ int i;
+ for ( i = 0; i < numselected; i++ )
+ {
+ int row = m_pActions->GetSelectedItem(0);
+ if ( row == -1 )
+ continue;
+
+ CBaseDemoAction *action = demoaction->GetAction( row );
+ if ( action )
+ {
+ // This sets dirty bit
+ demoaction->RemoveAction( action );
+ }
+ }
+
+ OnRefresh();
+}
+
+void CDemoEditorPanel::OnSave()
+{
+ demoaction->SaveToFile();
+}
+
+void CDemoEditorPanel::OnRevert()
+{
+ demoaction->ReloadFromDisk();
+ OnRefresh();
+}
+
+CBaseDemoAction *CDemoEditorPanel::FindActionByName( char const *name )
+{
+ int count = demoaction->GetActionCount();
+ int i;
+ for ( i = 0; i < count; i++ )
+ {
+ CBaseDemoAction *action = demoaction->GetAction( i );
+ Assert( action );
+ if ( !Q_strcasecmp( name, action->GetActionName() ) )
+ return action;
+ }
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CDemoEditorPanel::OnRefresh()
+{
+ PopulateActionList();
+}
+