diff options
Diffstat (limited to 'game/shared/tf/tf_quest_editor_panel.h')
| -rw-r--r-- | game/shared/tf/tf_quest_editor_panel.h | 520 |
1 files changed, 520 insertions, 0 deletions
diff --git a/game/shared/tf/tf_quest_editor_panel.h b/game/shared/tf/tf_quest_editor_panel.h new file mode 100644 index 0000000..3d3d0a8 --- /dev/null +++ b/game/shared/tf/tf_quest_editor_panel.h @@ -0,0 +1,520 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TF_QUEST_EDITOR_PANEL_H +#define TF_QUEST_EDITOR_PANEL_H + +#include "cbase.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/Frame.h" +#include "vgui_controls/ComboBox.h" +#include "tf_quest_restriction.h" +#include "clientmode_tf.h" +#include "vgui_controls/ScrollableEditablePanel.h" +#include "tf_controls.h" + + +#ifdef STAGING_ONLY + +using namespace vgui; + +#define MAX_QUEST_NAME_LENGTH 256 +#define MAX_QUEST_DESC_LENGTH 4096 + +class CEditorQuest; +class IEditorObjectParameter; +class IEditableDataType; + +struct EditorObjectInitStruct +{ + Panel *pParent; + const char* m_pszKeyName; + int nFlags; +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class IEditorObject : public EditablePanel +{ +public: + + DECLARE_CLASS_SIMPLE( IEditorObject, EditablePanel ); + IEditorObject( EditorObjectInitStruct init ); + + virtual int GetContentTall() const = 0; + virtual void PerformLayout() OVERRIDE; + virtual void OnSizeChanged( int newWide, int newTall ) OVERRIDE; + + virtual void OnThink() OVERRIDE; + + void SetOwningEditable( const IEditableDataType* pEditable ) { m_pOwningEditable = pEditable; } + void SetFlag( int nFlag, bool bValue ) { bValue ? m_Flags |= nFlag : m_Flags &= (~nFlag); } + bool IsFlagSet( int nFlag, bool bCheckUpTree = false ) const; + + enum ESerializeAction + { + WRITE_THIS_AND_CONTINUE, + SKIP_THIS_AND_CONTINUE, + SKIP_THIS_AND_CHILDREN + }; + + virtual void SerializeToKVs( KeyValues* pKV, const IEditableDataType* pCallingEditable ) const = 0; + ESerializeAction ShouldWrite( const IEditableDataType* pCallingEditable ) const; + + const char* GetKeyName() const { return m_szKeyName; } + virtual void ClearPendingChangesFlag(); + + virtual bool HasChanges( bool bCheckChildren ) const { return m_bHasChanges; } + +protected: + + const IEditableDataType* GetOwningEditable() const; + void InvalidateChain(); + + mutable bool m_bHasChanges; + uint32 m_Flags; + + char m_szKeyName[MAX_QUEST_DESC_LENGTH]; + +private: + const IEditableDataType* m_pOwningEditable; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class IEditableDataType +{ +public: + + enum EType + { + TYPE_QUEST = 0, + TYPE_OBJECTIVE_CONDITIONS, + NUM_TYPES + }; + + IEditableDataType( KeyValues* pKVData ); + virtual ~IEditableDataType(); + void CreatePanels( Panel* pParent ); + void DestroyPanels(); + bool MatchesCriteria( EType type, const char* pszName ) const; + void SaveChangesToDisk(); // Writes all changes to disk + void SaveEdits(); // Saves any changes that have been made with the controls. Does NOT write to disk. + void DeleteEntry(); + void RevertChanges(); + void SetButton( Button* pButton ) { m_hButton = pButton; } + Panel* GetButton() const { return m_hButton.Get(); } + void CheckForChanges(); + + KeyValues* GetLiveData() const { return m_pKVLiveData; } + virtual EType GetType() const = 0; + +protected: + virtual void WriteDataToDisk( bool bDelete ) = 0; + void WriteObjectToKeyValues( bool bDelete, KeyValues* pKVExistingFileData ); + virtual IEditorObject* CreateEditableObject_Internal( Panel* pParent ) const = 0; + void UpdateButton(); + + IEditorObject* m_pCurrentObject; + KeyValues* m_pKVLiveData; + KeyValues* m_pKVSavedData; + bool m_bHasUnsavedChanges; + mutable PHandle m_hButton; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CEditableQuestDataType : public IEditableDataType +{ +public: + CEditableQuestDataType( KeyValues *pKV ) : IEditableDataType( pKV ) {} +private: + virtual void WriteDataToDisk( bool bDelete ) OVERRIDE; + virtual EType GetType() const { return IEditableDataType::TYPE_QUEST; } + virtual IEditorObject* CreateEditableObject_Internal( Panel* pParent ) const OVERRIDE; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CEditableObjectiveConditionDataType : public IEditableDataType +{ +public: + CEditableObjectiveConditionDataType( KeyValues *pKV ) : IEditableDataType( pKV ) {} +private: + virtual void WriteDataToDisk( bool bDelete ) OVERRIDE; + virtual EType GetType() const { return IEditableDataType::TYPE_OBJECTIVE_CONDITIONS; } + virtual IEditorObject* CreateEditableObject_Internal( Panel* pParent ) const OVERRIDE; +}; + +//----------------------------------------------------------------------------- +// Purpose: Contains children +//----------------------------------------------------------------------------- +class CEditorObjectNode : public IEditorObject +{ +public: + DECLARE_CLASS_SIMPLE( CEditorObjectNode, IEditorObject ); + CEditorObjectNode( EditorObjectInitStruct init ); + virtual ~CEditorObjectNode(); + + virtual void PerformLayout() OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + virtual void MarkForDeletion() OVERRIDE; + + virtual int GetContentTall() const OVERRIDE; + virtual void SerializeToKVs( KeyValues* pKV, const IEditableDataType* pCallingEditable ) const OVERRIDE; + + void AddChild( IEditorObject* pChild ); + void RemoveChild( IEditorObject* pChild ); + + const CUtlVector< IEditorObject* >& GetChildren() const { return m_vecChildren; } + int GetNextAvailableKeyNumber() const; + + virtual bool HasChanges( bool bCheckChildren ) const OVERRIDE; + +protected: + + virtual void RemoveNode(); + virtual void ClearPendingChangesFlag() OVERRIDE; + + CUtlVector< IEditorObject* > m_vecChildren; + +private: + + Button *m_pDeleteButton; + Button *m_pToggleCollapseButton; +}; + +//----------------------------------------------------------------------------- +// Purpose: Contains a single parameter that can be edited +//----------------------------------------------------------------------------- +class IEditorObjectParameter : public IEditorObject +{ +public: + DECLARE_CLASS_SIMPLE( IEditorObjectParameter, IEditorObject ); + IEditorObjectParameter( EditorObjectInitStruct init, const char *pszLabelText ); + ~IEditorObjectParameter(); + + virtual void PerformLayout(); + + virtual int GetContentTall() const = 0; + virtual const char *GetValue() const = 0; + virtual void SerializeToKVs( KeyValues* pKV, const IEditableDataType* pCallingEditable ) const OVERRIDE; + void UpdateSavedValue( const char* pszNewValue ) const; + + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); +protected: + + mutable char m_szSavedValueBuff[MAX_QUEST_DESC_LENGTH]; // This is the value that's saved to disk + +private: + virtual bool CheckForChanges() const; + + Label *m_pLabel; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CTextEntryEditorParam : public IEditorObjectParameter +{ +public: + + DECLARE_CLASS_SIMPLE( CTextEntryEditorParam, IEditorObjectParameter ); + CTextEntryEditorParam( EditorObjectInitStruct init, const char *pszLabelText, const char *pszValue ); + + virtual void PerformLayout() OVERRIDE; + + virtual int GetContentTall() const OVERRIDE; + TextEntry* GetTextEntry() const { return m_pTextEntry; } + void SetTextEntryValue( const char* pszValue ); + const char *GetValue() const OVERRIDE; + +private: + + TextEntry *m_pTextEntry; + mutable char m_szValueBuff[MAX_QUEST_DESC_LENGTH]; +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +DECLARE_AUTO_LIST( ILocalizationEditorParamAutoList ); +class CLocalizationEditorParam : public CTextEntryEditorParam, public ILocalizationEditorParamAutoList +{ +public: + DECLARE_CLASS_SIMPLE( CLocalizationEditorParam, CTextEntryEditorParam ); + CLocalizationEditorParam( EditorObjectInitStruct init, const char *pszLabelText, const char *pszLocalizationToken ); + + const char *GetValue() const OVERRIDE; + const char *GetLocalizationValue() const; + +private: + virtual bool CheckForChanges() const OVERRIDE; + + char m_szLocalizationToken[MAX_QUEST_NAME_LENGTH]; +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CComboBoxEditorParam : public IEditorObjectParameter +{ +public: + DECLARE_CLASS_SIMPLE( CComboBoxEditorParam, IEditorObjectParameter ); + CComboBoxEditorParam( EditorObjectInitStruct init, const char *pszLabelText ); + + virtual void PerformLayout() OVERRIDE; + const char *GetValue() const OVERRIDE; + + virtual int GetContentTall() const OVERRIDE; + void ClearComboBoxEntries() { m_pComboBox->RemoveAll(); } + void AddComboBoxEntry( const char* pszText, bool bSelected, const char* pszWriteValue, const char* pszCommand ); + ComboBox* GetComboBox() const { return m_pComboBox; } + + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); + +protected: + + ComboBox *m_pComboBox; + mutable char m_szValueBuff[MAX_QUEST_DESC_LENGTH]; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CNewQuestObjectiveParam : public CComboBoxEditorParam +{ +public: + DECLARE_CLASS_SIMPLE( CNewQuestObjectiveParam, CComboBoxEditorParam ); + CNewQuestObjectiveParam( EditorObjectInitStruct init, const char *pszLabelText ); + + virtual void PerformLayout() OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + +private: + Button *m_pAddButton; +}; + +class CQuestObjectiveNode : public CEditorObjectNode +{ +public: + DECLARE_CLASS_SIMPLE( CQuestObjectiveNode, CEditorObjectNode ); + CQuestObjectiveNode( CEditorObjectNode* pParentNode, KeyValues* pKVObjective ); + + virtual void OnCommand( const char *command ) OVERRIDE; + virtual void PerformLayout() OVERRIDE; + + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); + MESSAGE_FUNC_PARAMS( OnObjectiveSelected, "ObjectiveSelected", data ); +private: + void PopulateAndSelectConditionsCombobox( int nSelectedDefIndex ); + + CComboBoxEditorParam* m_pDefIndexComboBox; + Button* m_pSelectObjectiveButton; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class IOptionalExpandableBlock : public CEditorObjectNode +{ +public: + DECLARE_CLASS_SIMPLE( IOptionalExpandableBlock, CEditorObjectNode ); + IOptionalExpandableBlock( EditorObjectInitStruct init, const char* pszButtonText ); + + virtual void InitControls( KeyValues* pKVBlock ); + + virtual void PerformLayout() OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + +protected: + virtual void CreateNewControl( KeyValues* pKV ); + +private: + virtual void CreateNewDefaultControl() = 0; + virtual int GetMinCount() const = 0; + + Button *m_pAddButton; + int m_nMinCount; +}; + + +class CQuestDescriptionNode : public IOptionalExpandableBlock +{ +public: + DECLARE_CLASS_SIMPLE( CQuestDescriptionNode, IOptionalExpandableBlock ); + CQuestDescriptionNode( EditorObjectInitStruct init ) : IOptionalExpandableBlock( init, "Add new Description" ) {} + +private: + virtual void CreateNewControl( KeyValues* pKV ) OVERRIDE; + virtual void CreateNewDefaultControl() OVERRIDE; + virtual int GetMinCount() const OVERRIDE { return 1; } +}; + +class CQuestNameNode : public IOptionalExpandableBlock +{ +public: + DECLARE_CLASS_SIMPLE( CQuestNameNode, IOptionalExpandableBlock ); + CQuestNameNode( EditorObjectInitStruct init ) : IOptionalExpandableBlock( init, "Add new Name" ) {} + +private: + virtual void CreateNewControl( KeyValues* pKV ) OVERRIDE; + virtual void CreateNewDefaultControl() OVERRIDE; + virtual int GetMinCount() const OVERRIDE { return 1; } +}; + +class CRequiredItemsParam : public IOptionalExpandableBlock +{ +public: + DECLARE_CLASS_SIMPLE( CRequiredItemsParam, IOptionalExpandableBlock ); + CRequiredItemsParam( EditorObjectInitStruct init ) : IOptionalExpandableBlock( init, "Add new Loaner Item Set" ) {} + +private: + virtual void CreateNewControl( KeyValues* pKV ) OVERRIDE; + virtual void CreateNewDefaultControl() OVERRIDE; + virtual int GetMinCount() const OVERRIDE { return 0; } +}; + +class CQualifyingItemsParam : public IOptionalExpandableBlock +{ +public: + DECLARE_CLASS_SIMPLE( CQualifyingItemsParam, IOptionalExpandableBlock ); + CQualifyingItemsParam( EditorObjectInitStruct init ) : IOptionalExpandableBlock( init, "Add new Qualifying Item" ) {} + +private: + virtual void CreateNewControl( KeyValues* pKV ) OVERRIDE; + virtual void CreateNewDefaultControl() OVERRIDE; + virtual int GetMinCount() const OVERRIDE { return 0; } +}; + +class CObjectiveExpandable : public IOptionalExpandableBlock +{ +public: + DECLARE_CLASS_SIMPLE( CObjectiveExpandable, IOptionalExpandableBlock ); + CObjectiveExpandable( EditorObjectInitStruct init ) : IOptionalExpandableBlock( init, "Add new Objective" ) {} + +private: + virtual void CreateNewControl( KeyValues* pKV ) OVERRIDE; + virtual void CreateNewDefaultControl() OVERRIDE; + virtual int GetMinCount() const OVERRIDE { return 1; } +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CQuestObjectiveRestrictionNode : public CEditorObjectNode +{ +public: + DECLARE_CLASS_SIMPLE( CQuestObjectiveRestrictionNode, CEditorObjectNode ); + CQuestObjectiveRestrictionNode( EditorObjectInitStruct init, CTFQuestCondition *pCondition ); + + virtual void PerformLayout() OVERRIDE; + + CTFQuestCondition *GetCondition() { return m_pCondition; } + + void SetNewType( const char *pszType ); + void SetNewEvent( const char *pszEvent ); + +private: + + virtual void RemoveNode() OVERRIDE; + void CreateControlsForCondition(); + void CreateAddOpportunityParam(); + + char m_szEventName[MAX_QUEST_NAME_LENGTH]; + + CTFQuestCondition *m_pCondition; + CNewQuestObjectiveParam *m_pNewCondition; +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CEditorQuest : public CEditorObjectNode +{ +public: + CEditorQuest( KeyValues *pKV, Panel* pParent, const IEditableDataType* pEditable ); + ~CEditorQuest(); + +private: +}; + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CQuestEditorPanel : public Frame +{ +public: + DECLARE_CLASS_SIMPLE( CQuestEditorPanel, Frame ); + + CQuestEditorPanel( Panel *pParent, const char *pszName ); + ~CQuestEditorPanel() {} + + virtual void ApplySchemeSettings( IScheme *pScheme ) OVERRIDE; + virtual void ApplySettings( KeyValues *inResourceData ); + virtual void PerformLayout() OVERRIDE; + virtual void OnCommand( const char *command ) OVERRIDE; + + virtual void OnThink() OVERRIDE; + + void Deploy(); + + IEditableDataType* OpenForEdit( IEditableDataType::EType type, const char* pszName, Panel* pParent ); + void CloseEdit( IEditableDataType* pEditable ); + bool IsOpenForEdit( const IEditableDataType* pEditable ) const; + + const CUtlVector< IEditableDataType* >& GetEditableData() const { return m_vecEditableData; } + + IEditableDataType* CreateNewQuest(); + IEditableDataType* CreateNewObjectiveCondition(); + + Button* GetButtonForEditable( const IEditableDataType* pEditable ) const; + + void CheckForChanges(); + + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); + MESSAGE_FUNC_PARAMS( OnSelectQuestObjective, "SelectQuestObjective", data ); +private: + + void UpdateButtons( IEditableDataType::EType type ); + void ResetQuestSelectionState() { m_eCurrentSelectionMode = SELECTION_MODE_NONE; } + + template< typename T > + IEditableDataType* AddNewEditableKVData( KeyValues* pKVConditionsData, const char* pszName ); + + void PopulateExistingQuests(); + void OpenEditContextMenu(); + + CExScrollingEditablePanel* m_pButtonsContainers[ IEditableDataType::NUM_TYPES ]; + CUtlVector< Button* > m_vecEditableButtons[ IEditableDataType::NUM_TYPES ]; + TextEntry* m_pButtonsFilterTextEntry[ IEditableDataType::NUM_TYPES ]; + + CExScrollingEditablePanel *m_pEditingPanel; + + IEditableDataType* m_pCurrentOpenEdit; + CUtlVector< IEditableDataType* > m_vecEditableData; + CUtlVector< IEditableDataType* > m_vecOpenEdits; + + enum ESelectionMode_t + { + SELECTION_MODE_NONE = 0, + SELECTION_MODE_QUEST_OBJECTIVE, + }; + + ESelectionMode_t m_eCurrentSelectionMode; + PHandle m_hSelectionPanel; +}; + +#endif // STAGING_ONLY +#endif // TF_QUEST_EDITOR_PANEL_H |