427 lines
14 KiB
C
427 lines
14 KiB
C
|
//========= 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
|