summaryrefslogtreecommitdiff
path: root/tools/vcdblock/infotargetpropertiespanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/vcdblock/infotargetpropertiespanel.cpp')
-rw-r--r--tools/vcdblock/infotargetpropertiespanel.cpp225
1 files changed, 225 insertions, 0 deletions
diff --git a/tools/vcdblock/infotargetpropertiespanel.cpp b/tools/vcdblock/infotargetpropertiespanel.cpp
new file mode 100644
index 0000000..1ba56f4
--- /dev/null
+++ b/tools/vcdblock/infotargetpropertiespanel.cpp
@@ -0,0 +1,225 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Singleton dialog that generates and presents the entity report.
+//
+//===========================================================================//
+
+#include "InfoTargetPropertiesPanel.h"
+#include "tier1/KeyValues.h"
+#include "tier1/utlbuffer.h"
+#include "iregistry.h"
+#include "vgui/ivgui.h"
+#include "vgui_controls/listpanel.h"
+#include "vgui_controls/textentry.h"
+#include "vgui_controls/checkbutton.h"
+#include "vgui_controls/combobox.h"
+#include "vgui_controls/radiobutton.h"
+#include "vgui_controls/messagebox.h"
+#include "vgui_controls/scrollbar.h"
+#include "vcdblockdoc.h"
+#include "vcdblocktool.h"
+#include "datamodel/dmelement.h"
+#include "dmevmfentity.h"
+#include "dme_controls/soundpicker.h"
+#include "dme_controls/soundrecordpanel.h"
+#include "matsys_controls/picker.h"
+#include "vgui_controls/fileopendialog.h"
+#include "filesystem.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+using namespace vgui;
+
+class CScrollableEditablePanel : public vgui::EditablePanel
+{
+ DECLARE_CLASS_SIMPLE( CScrollableEditablePanel, vgui::EditablePanel );
+
+public:
+ CScrollableEditablePanel( vgui::Panel *pParent, vgui::EditablePanel *pChild, const char *pName );
+ virtual ~CScrollableEditablePanel() {}
+ virtual void PerformLayout();
+
+ MESSAGE_FUNC( OnScrollBarSliderMoved, "ScrollBarSliderMoved" );
+
+private:
+ vgui::ScrollBar *m_pScrollBar;
+ vgui::EditablePanel *m_pChild;
+};
+
+
+CScrollableEditablePanel::CScrollableEditablePanel( vgui::Panel *pParent, vgui::EditablePanel *pChild, const char *pName ) :
+ BaseClass( pParent, pName )
+{
+ m_pChild = pChild;
+ m_pChild->SetParent( this );
+
+ m_pScrollBar = new vgui::ScrollBar( this, "VerticalScrollBar", true );
+ m_pScrollBar->SetWide( 16 );
+ m_pScrollBar->SetAutoResize( PIN_TOPRIGHT, AUTORESIZE_DOWN, 0, 0, -16, 0 );
+ m_pScrollBar->AddActionSignalTarget( this );
+}
+
+void CScrollableEditablePanel::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ m_pChild->SetWide( GetWide() - 16 );
+ m_pScrollBar->SetRange( 0, m_pChild->GetTall() );
+ m_pScrollBar->SetRangeWindow( GetTall() );
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when the scroll bar moves
+//-----------------------------------------------------------------------------
+void CScrollableEditablePanel::OnScrollBarSliderMoved()
+{
+ InvalidateLayout();
+
+ int nScrollAmount = m_pScrollBar->GetValue();
+ m_pChild->SetPos( 0, -nScrollAmount );
+}
+
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CInfoTargetPropertiesPanel::CInfoTargetPropertiesPanel( CVcdBlockDoc *pDoc, vgui::Panel* pParent )
+ : BaseClass( pParent, "InfoTargetPropertiesPanel" ), m_pDoc( pDoc )
+{
+ SetPaintBackgroundEnabled( true );
+ SetKeyBoardInputEnabled( true );
+
+ m_pInfoTarget = new vgui::EditablePanel( (vgui::Panel*)NULL, "InfoTarget" );
+
+ m_pTargetName = new vgui::TextEntry( m_pInfoTarget, "TargetName" );
+ m_pTargetName->AddActionSignalTarget( this );
+
+ m_pTargetPosition[0] = new vgui::TextEntry( m_pInfoTarget, "PositionX" );
+ m_pTargetPosition[0]->AddActionSignalTarget( this );
+ m_pTargetPosition[1] = new vgui::TextEntry( m_pInfoTarget, "PositionY" );
+ m_pTargetPosition[1]->AddActionSignalTarget( this );
+ m_pTargetPosition[2] = new vgui::TextEntry( m_pInfoTarget, "PositionZ" );
+ m_pTargetPosition[2]->AddActionSignalTarget( this );
+
+ m_pTargetOrientation[0] = new vgui::TextEntry( m_pInfoTarget, "Pitch" );
+ m_pTargetOrientation[0]->AddActionSignalTarget( this );
+ m_pTargetOrientation[1] = new vgui::TextEntry( m_pInfoTarget, "Yaw" );
+ m_pTargetOrientation[1]->AddActionSignalTarget( this );
+ m_pTargetOrientation[2] = new vgui::TextEntry( m_pInfoTarget, "Roll" );
+ m_pTargetOrientation[2]->AddActionSignalTarget( this );
+
+ m_pInfoTarget->LoadControlSettings( "resource/infotargetpropertiessubpanel_target.res" );
+
+ m_pInfoTargetScroll = new CScrollableEditablePanel( this, m_pInfoTarget, "InfoTargetScroll" );
+
+ LoadControlSettings( "resource/infotargetpropertiespanel.res" );
+
+ m_pInfoTargetScroll->SetVisible( false );
+}
+
+
+//-----------------------------------------------------------------------------
+// Text to attribute...
+//-----------------------------------------------------------------------------
+void CInfoTargetPropertiesPanel::TextEntryToAttribute( vgui::TextEntry *pEntry, const char *pAttributeName )
+{
+ int nLen = pEntry->GetTextLength();
+ char *pBuf = (char*)_alloca( nLen+1 );
+ pEntry->GetText( pBuf, nLen+1 );
+ m_hEntity->SetValue( pAttributeName, pBuf );
+}
+
+void CInfoTargetPropertiesPanel::TextEntriesToVector( vgui::TextEntry *pEntry[3], const char *pAttributeName )
+{
+ Vector vec;
+ for ( int i = 0; i < 3; ++i )
+ {
+ int nLen = pEntry[i]->GetTextLength();
+ char *pBuf = (char*)_alloca( nLen+1 );
+ pEntry[i]->GetText( pBuf, nLen+1 );
+ vec[i] = atof( pBuf );
+ }
+ m_hEntity->SetValue( pAttributeName, vec );
+ clienttools->MarkClientRenderableDirty( m_hEntity );
+}
+
+
+//-----------------------------------------------------------------------------
+// Updates entity state when text fields change
+//-----------------------------------------------------------------------------
+void CInfoTargetPropertiesPanel::UpdateInfoTarget()
+{
+ if ( !m_hEntity.Get() )
+ return;
+
+ CAppUndoScopeGuard guard( NOTIFY_SETDIRTYFLAG, "Info Target Change", "Info Target Change" );
+ TextEntryToAttribute( m_pTargetName, "targetname" );
+ TextEntriesToVector( m_pTargetPosition, "origin" );
+ TextEntriesToVector( m_pTargetOrientation, "angles" );
+ m_hEntity->MarkDirty();
+}
+
+
+//-----------------------------------------------------------------------------
+// Populates the info_target fields
+//-----------------------------------------------------------------------------
+void CInfoTargetPropertiesPanel::PopulateInfoTargetFields()
+{
+ if ( !m_hEntity.Get() )
+ return;
+
+ m_pTargetName->SetText( m_hEntity->GetTargetName() );
+
+ Vector vecPosition = m_hEntity->GetRenderOrigin();
+ QAngle vecAngles = m_hEntity->GetRenderAngles();
+
+ for ( int i = 0; i < 3; ++i )
+ {
+ char pTemp[512];
+ Q_snprintf( pTemp, sizeof(pTemp), "%.2f", vecPosition[i] );
+ m_pTargetPosition[i]->SetText( pTemp );
+
+ Q_snprintf( pTemp, sizeof(pTemp), "%.2f", vecAngles[i] );
+ m_pTargetOrientation[i]->SetText( pTemp );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets the object to look at
+//-----------------------------------------------------------------------------
+void CInfoTargetPropertiesPanel::SetObject( CDmeVMFEntity *pEntity )
+{
+ m_hEntity = pEntity;
+ m_pInfoTargetScroll->SetVisible( false );
+
+ if ( pEntity )
+ {
+ if ( !Q_stricmp( pEntity->GetClassName(), "info_target" ) )
+ {
+ PopulateInfoTargetFields();
+ m_pInfoTargetScroll->SetVisible( true );
+ m_pTargetName->RequestFocus();
+ return;
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when text is changed
+//-----------------------------------------------------------------------------
+void CInfoTargetPropertiesPanel::OnTextChanged( KeyValues *pParams )
+{
+ vgui::Panel *pPanel = (vgui::Panel*)pParams->GetPtr( "panel" );
+ if ( pPanel->GetParent() == m_pInfoTarget )
+ {
+ UpdateInfoTarget();
+ return;
+ }
+}
+
+
+