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.
426 lines
14 KiB
426 lines
14 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef OP_ENTITY_H |
|
#define OP_ENTITY_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "AutoSelCombo.h" |
|
#include "ChunkFile.h" |
|
#include "ListBoxEx.h" |
|
#include "AngleBox.h" |
|
#include "fgdlib/WCKeyValues.h" |
|
#include "MapFace.h" |
|
#include "ObjectPage.h" |
|
#include "ToolPickAngles.h" |
|
#include "ToolPickEntity.h" |
|
#include "ToolPickFace.h" |
|
#include "FilteredComboBox.h" |
|
#include "AnchorMgr.h" |
|
#include "ModelBrowser.h" |
|
|
|
class CEditGameClass; |
|
class COP_Entity; |
|
class COP_Flags; |
|
class CMyComboBox; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Owner-draw list control that uses cool colors to show |
|
// the state of items. |
|
//----------------------------------------------------------------------------- |
|
class CColoredListCtrl : public CListCtrl |
|
{ |
|
public: |
|
|
|
class IItemColorCallback |
|
{ |
|
public: |
|
// This is called for every item to get its colors. |
|
virtual void GetItemColor( int iItem, COLORREF *pBackgroundColor, COLORREF *pTextColor ) = 0; |
|
|
|
// This is called for every item so you can draw custom stuff in its value column. |
|
// The RECT inside the DRAWITEMSTRUCT contains the whole row, and pRect contains the rect for the value column only. |
|
// Return true if you don't want CColoredListControl to draw its value. |
|
virtual bool CustomDrawItemValue( const LPDRAWITEMSTRUCT p, const RECT *pRect ) = 0; |
|
}; |
|
|
|
public: |
|
CColoredListCtrl( IItemColorCallback *pCallback ); |
|
|
|
virtual void DrawItem( LPDRAWITEMSTRUCT p ); |
|
|
|
private: |
|
IItemColorCallback *m_pCallback; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: A little glue object that connects the angles picker tool to our dialog. |
|
//----------------------------------------------------------------------------- |
|
class CPickAnglesTarget : public IPickAnglesTarget |
|
{ |
|
public: |
|
|
|
void AttachEntityDlg(COP_Entity *pDlg) { m_pDlg = pDlg; } |
|
void OnNotifyPickAngles(const Vector &vecPos); |
|
|
|
private: |
|
|
|
COP_Entity *m_pDlg; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: A little glue object that connects the entity picker tool to our dialog. |
|
// Currently this gets the value of a given key and puts that into the smart |
|
// control. |
|
//----------------------------------------------------------------------------- |
|
class CPickEntityTarget : public IPickEntityTarget |
|
{ |
|
public: |
|
|
|
inline CPickEntityTarget(); |
|
void AttachEntityDlg(COP_Entity *pDlg) { m_pDlg = pDlg; } |
|
inline void SetKeyToRetrieve(const char *pszKey); |
|
void OnNotifyPickEntity(CToolPickEntity *pTool); |
|
|
|
private: |
|
|
|
char m_szKey[MAX_KEYVALUE_LEN]; // The name of the key we are going to slurp out of the entity. |
|
COP_Entity *m_pDlg; // The dialog to receive the key value. |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CPickEntityTarget::CPickEntityTarget() |
|
{ |
|
m_szKey[0] = '\0'; |
|
m_pDlg = NULL; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : pszKey - |
|
//----------------------------------------------------------------------------- |
|
void CPickEntityTarget::SetKeyToRetrieve(const char *pszKey) |
|
{ |
|
strncpy(m_szKey, pszKey, sizeof(m_szKey) - 1); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: A little glue object that connects the face picker tool to our dialog. |
|
//----------------------------------------------------------------------------- |
|
class CPickFaceTarget : public IPickFaceTarget |
|
{ |
|
public: |
|
|
|
void AttachEntityDlg(COP_Entity *pDlg) { m_pDlg = pDlg; } |
|
void OnNotifyPickFace(CToolPickFace *pTool); |
|
|
|
private: |
|
|
|
COP_Entity *m_pDlg; |
|
}; |
|
|
|
|
|
enum EKeyState |
|
{ |
|
k_EKeyState_DefaultFGDValue=0, // This key is unmodified from its default value in the FGD. |
|
k_EKeyState_Modified=1, // This key is in the FGD, and its value has been modified. |
|
k_EKeyState_AddedManually, // This key was added manually (i.e. it does not exist in the FGD). |
|
k_EKeyState_InstanceParm, |
|
}; |
|
|
|
|
|
class CInstanceParmData |
|
{ |
|
public: |
|
GDinputvariable *m_ParmVariable; |
|
CString m_ParmKey; |
|
CString m_VariableName; |
|
}; |
|
|
|
|
|
// This class just routes the OnTextChanged call into COP_Entity. |
|
class CSmartControlTargetNameRouter : public CFilteredComboBox::ICallbacks |
|
{ |
|
public: |
|
CSmartControlTargetNameRouter( COP_Entity *pDlg ); |
|
|
|
virtual void OnTextChanged( const char *pText ); |
|
|
|
private: |
|
COP_Entity *m_pDlg; |
|
}; |
|
|
|
|
|
class COP_Entity : public CObjectPage, CFilteredComboBox::ICallbacks, public CColoredListCtrl::IItemColorCallback |
|
{ |
|
DECLARE_DYNCREATE(COP_Entity) |
|
typedef CObjectPage BaseClass; |
|
|
|
friend int InternalSortByColumn( COP_Entity *pDlg, const char *pShortName1, const char *pShortName2, int iColumn ); |
|
friend int CALLBACK SortByItemEditedState( LPARAM iItem1, LPARAM iItem2, LPARAM lpParam ); |
|
friend class CColoredListCtrl; |
|
|
|
// Construction |
|
public: |
|
|
|
COP_Entity(); |
|
~COP_Entity(); |
|
|
|
virtual void MarkDataDirty(); |
|
|
|
// |
|
// Interface for property sheet. |
|
// |
|
virtual bool SaveData(void); |
|
virtual void UpdateData( int Mode, PVOID pData, bool bCanEdit ); |
|
virtual void RememberState(void); |
|
|
|
// |
|
// Interface for custom edit control. |
|
// |
|
void SetNextVar(int cmd); |
|
|
|
void SetFlagsPage( COP_Flags *pFlagsPage ); |
|
void OnUpdateSpawnFlags( unsigned long preserveMask, unsigned long newValues ); |
|
|
|
//{{AFX_DATA(COP_Entity) |
|
enum { IDD = IDD_OBJPAGE_ENTITYKV }; |
|
CAngleCombo m_AngleEdit; |
|
CAngleCombo m_SmartAngleEdit; |
|
CEdit m_cValue; |
|
CColoredListCtrl m_VarList; |
|
CEdit m_cKey; |
|
CFilteredComboBox m_cClasses; |
|
CEdit m_Comments; |
|
CEdit m_KeyValueHelpText; |
|
CButton m_PasteControl; |
|
//}}AFX_DATA |
|
|
|
// ClassWizard generate virtual function overrides |
|
//{{AFX_VIRTUAL(COP_Entity) |
|
protected: |
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support |
|
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult); |
|
//}}AFX_VIRTUAL |
|
|
|
protected: |
|
|
|
// Implementation of CFilteredComboBox::ICallbacks for m_cClasses. |
|
|
|
virtual void OnTextChanged( const char *pText ); |
|
virtual bool OnUnknownEntry( const char *pText ); |
|
|
|
// This gets routed from m_pSmartControl (for target names). |
|
|
|
virtual void OnSmartControlTargetNameChanged( const char *pText ); |
|
|
|
// Implementation of CColoredListCtrl::IItemColorCallback. |
|
|
|
virtual void GetItemColor( int iItem, COLORREF *pBackgroundColor, COLORREF *pTextColor ); |
|
virtual bool CustomDrawItemValue( const LPDRAWITEMSTRUCT p, const RECT *pRect ); |
|
|
|
|
|
// Other functions. |
|
|
|
// If pMissingTarget is set to true, then it is a |
|
void GetKeyState( const char *pShortName, EKeyState *pState, bool *pMissingTarget ); |
|
void ResortItems(); |
|
void LoadClassList(); |
|
void SetSmartedit(bool bSet); |
|
void RemoveBlankKeys(); |
|
|
|
void EnableAnglesControl(bool bEnable); |
|
|
|
void CreateSmartControls(GDinputvariable *pVar, CUtlVector<const char *> *pHelperType); |
|
void DestroySmartControls(void); |
|
|
|
CRect CalculateSmartControlRect(); |
|
void CreateSmartControls_Angle( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont, bool *bShowSmartAngles ); |
|
void CreateSmartControls_Choices( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
void CreateSmartControls_TargetName( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
void CreateSmartControls_BasicEditControl( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont, CUtlVector<const char *> *pHelperType ); |
|
void CreateSmartControls_BrowseAndPlayButtons( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
void CreateSmartControls_MarkAndEyedropperButtons( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
void CreateSmartControls_PickButton( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
void CreateSmartControls_InstanceVariable( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
void CreateSmartControls_InstanceParm( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont ); |
|
|
|
void UpdateDisplayClass(const char *pszClass); |
|
void UpdateDisplayClass(GDclass *pClass); |
|
|
|
void UpdateEditClass(const char *pszClass, bool bForce); |
|
void UpdateKeyValue(const char *szKey, const char *szValue); |
|
|
|
virtual void UpdatePickFaceText(CToolPickFace *pTool); |
|
void GetFaceIDListsForKey(CMapFaceIDList &FullFaces, CMapFaceIDList &PartialFaces, const char *pszKey); |
|
void GetFaceListsForKey(CMapFaceList &FullFaces, CMapFaceList &PartialFaces, const char *pszKey); |
|
void ApplyKeyValueToObject(CEditGameClass *pObject, const char *pszKey, const char *pszValue); |
|
|
|
void InternalOnChangeSmartcontrol( const char *szValue ); |
|
|
|
// Generated message map functions |
|
//{{AFX_MSG(COP_Entity) |
|
afx_msg void OnAddkeyvalue(); |
|
afx_msg BOOL OnApply(void); |
|
afx_msg void OnBrowse(void); |
|
afx_msg void OnBrowseInstance(void); |
|
afx_msg void OnPlaySound(void); |
|
virtual BOOL OnInitDialog(); |
|
afx_msg void OnSelchangeKeyvalues(); |
|
afx_msg void OnRemovekeyvalue(); |
|
afx_msg void OnSelChangeAngleEdit(void); |
|
afx_msg void OnChangeAngleedit(); |
|
afx_msg void OnSmartedit(); |
|
afx_msg void OnChangeKeyorValue(); |
|
afx_msg void OnCopy(); |
|
afx_msg void OnPaste(); |
|
afx_msg void OnSetfocusKey(); |
|
afx_msg void OnKillfocusKey(); |
|
afx_msg LRESULT OnChangeAngleBox(WPARAM, LPARAM); |
|
afx_msg void OnChangeSmartcontrol(); |
|
afx_msg void OnChangeSmartcontrolSel(); |
|
afx_msg void OnChangeInstanceVariableControl(); |
|
afx_msg void OnChangeInstanceParmControl(); |
|
afx_msg void OnPickFaces(void); |
|
afx_msg void OnPickColor(); |
|
afx_msg void OnMark(); |
|
afx_msg void OnSize( UINT nType, int cx, int cy ); |
|
afx_msg void OnMarkAndAdd(); |
|
afx_msg void OnEntityHelp(void); |
|
afx_msg void OnPickAngles(void); |
|
afx_msg void OnPickEntity(void); |
|
afx_msg void OnCameraDistance(void); |
|
afx_msg void OnItemChangedKeyValues(NMHDR* pNMHDR, LRESULT* pResult); |
|
afx_msg void OnDblClickKeyValues(NMHDR* pNMHDR, LRESULT* pResult); |
|
//}}AFX_MSG |
|
|
|
void BrowseTextures( const char *szFilter, bool bIsSprite = false ); |
|
bool BrowseModels( char *szModelName, int length, int &nSkin ); |
|
void MergeObjectKeyValues(CEditGameClass *pEdit); |
|
void MergeKeyValue(char const *pszKey); |
|
void SetCurKey(LPCTSTR pszKey); |
|
void GetCurKey(CString& strKey); |
|
|
|
void SetCurVarListSelection( int iSel ); |
|
int GetCurVarListSelection(); |
|
|
|
void OnShowPropertySheet(BOOL bShow, UINT nStatus); |
|
void StopPicking(void); |
|
|
|
DECLARE_MESSAGE_MAP() |
|
|
|
private: |
|
|
|
void UpdateAnchors(); |
|
void AssignClassDefaults(GDclass *pClass, GDclass *pOldClass); |
|
|
|
int GetKeyValueRowByShortName( const char *pShortName ); // Find the row in the listctrl that the var is at. Returns -1 if not found. |
|
|
|
void RefreshKVListValues( const char *pOnlyThisVar = NULL ); |
|
void PresentProperties(); |
|
void ClearVarList(); |
|
void SetReadOnly(bool bReadOnly); |
|
|
|
void SetSmartControlText(const char *pszText); |
|
void PerformMark(const char *pTargetName, bool bClear, bool bNameOrClass); |
|
|
|
void LoadCustomColors(); |
|
void SaveCustomColors(); |
|
|
|
GDinputvariable *GetVariableAt( int index ); |
|
|
|
private: |
|
|
|
CAnchorMgr m_AnchorMgr; |
|
|
|
CString m_szOldKeyName; |
|
bool m_bWantSmartedit; |
|
bool m_bEnableControlUpdate; // Whether to reflect changes to the edit control into other controls. |
|
|
|
CAngleBox m_Angle; |
|
CAngleBox m_SmartAngle; |
|
|
|
CButton m_cPickColor; |
|
bool m_bSmartedit; |
|
int m_nNewKeyCount; |
|
|
|
CEdit *m_pEditInstanceVariable, *m_pEditInstanceValue; |
|
CMyComboBox *m_pComboInstanceParmType; |
|
|
|
// Used to prevent unnecessary calls to PresentProperties. |
|
int m_nPresentPropertiesCalls; |
|
bool m_bAllowPresentProperties; |
|
|
|
GDclass *m_pDisplayClass; // The class that the dialog is showing. Can be different from m_pEditClass |
|
// until the user hits Apply. |
|
GDinputvariable *m_pInstanceVar; |
|
|
|
short m_VarMap[GD_MAX_VARIABLES]; |
|
|
|
CWnd *m_pSmartControl; // current smartedit control |
|
CButton *m_pSmartBrowseButton; |
|
CUtlVector<CWnd *> m_SmartControls; |
|
|
|
// The last variable we setup smart controls for. |
|
GDinputvariable *m_pLastSmartControlVar; |
|
CString m_LastSmartControlVarValue; |
|
|
|
CString m_strLastKey; // Active key when SaveData was called. |
|
|
|
GDclass *m_pEditClass; // The class of the object that we are editing. |
|
WCKeyValues m_kv; // Our kv storage. Holds merged keyvalues for multiselect. |
|
WCKeyValues m_kvAdded; // Corresponding keys set to value "1" if they were added |
|
|
|
GDIV_TYPE m_eEditType; // The type of the currently selected key when SmartEdit is enabled. |
|
|
|
bool m_bIgnoreKVChange; // Set to ignore Windows notifications when setting up controls. |
|
bool m_bChangingKeyName; |
|
|
|
int m_iLastClassListSolidClasses; // Used to prevent reinitializing the class list unnecessarily. |
|
|
|
bool m_bPicking; // A picking tool is currently active. |
|
ToolID_t m_ToolPrePick; // The tool that was active before we activated the picking tool. |
|
|
|
int m_iSortColumn; // Which column we're sorting the keyvalues by. |
|
|
|
CPickAnglesTarget m_PickAnglesTarget; |
|
CPickEntityTarget m_PickEntityTarget; |
|
CPickFaceTarget m_PickFaceTarget; |
|
|
|
COP_Flags *m_pFlagsPage; |
|
|
|
CSmartControlTargetNameRouter m_SmartControlTargetNameRouter; |
|
|
|
CUtlMap<CString, CInstanceParmData> m_InstanceParmData; |
|
|
|
// Used when multiselecting classes to remember whether they've selected a class |
|
// or not yet. |
|
bool m_bClassSelectionEmpty; |
|
CModelBrowser *pModelBrowser; |
|
|
|
friend class CPickAnglesTarget; |
|
friend class CPickEntityTarget; |
|
friend class CPickFaceTarget; |
|
friend class CSmartControlTargetNameRouter; |
|
|
|
COLORREF CustomColors[16]; |
|
bool m_bCustomColorsLoaded; |
|
}; |
|
|
|
// These are used to load the filesystem open dialog. |
|
void LoadFileSystemDialogModule(); |
|
void UnloadFileSystemDialogModule(); |
|
|
|
#endif // OP_ENTITY_H
|
|
|