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.
211 lines
4.8 KiB
211 lines
4.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Defines the interface to the Undo system. |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef HISTORY_H |
|
#define HISTORY_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "MapClass.h" // For CMapObjectList |
|
|
|
class CMapClass; |
|
class CMapDoc; |
|
class CHistory; |
|
|
|
// |
|
// Holds undo information for a single object, due to a single operation. Held by a CHistoryTrack. |
|
// |
|
class CTrackEntry |
|
{ |
|
public: |
|
|
|
enum TrackType_t |
|
{ |
|
ttNone = -1, |
|
ttCopy, |
|
ttDelete, |
|
ttCreate, |
|
}; |
|
|
|
CTrackEntry(); |
|
CTrackEntry(TrackType_t eType, ...); |
|
~CTrackEntry(); |
|
|
|
void Undo(CHistory *Opposite); |
|
void DispatchUndoNotify(void); |
|
|
|
void SetKeptChildren(bool bSet); |
|
|
|
inline int GetSize(void) { return(m_nDataSize); } |
|
|
|
void OnRemoveVisGroup(CVisGroup *pGroup); |
|
|
|
bool m_bAutoDestruct; |
|
|
|
protected: |
|
|
|
size_t m_nDataSize; |
|
|
|
TrackType_t m_eType; // What type of event this entry can undo. |
|
|
|
// |
|
// Based on the event type, one of these structs will be filled out: |
|
// |
|
union |
|
{ |
|
struct |
|
{ |
|
CMapClass *pCurrent; // Pointer to the object as it currently exists in the world. |
|
CMapClass *pKeptObject; // Pointer to a copy of the object at the time it was kept. |
|
} m_Copy; |
|
|
|
struct |
|
{ |
|
CMapClass *pDeleted; // Pointer to the object that was deleted from the world. |
|
CMapClass *pKeptParent; // Pointer to the object's parent at the time of deletion. |
|
} m_Delete; |
|
|
|
struct |
|
{ |
|
CMapClass *pCreated; // Pointer to the object that was created and added to the world. |
|
} m_Create; |
|
}; |
|
|
|
bool m_bKeptChildren; |
|
bool m_bUndone; // Set to true after this entry is undone. |
|
}; |
|
|
|
|
|
// |
|
// Tracks all the objects changed by a single operation, such as "Nudge Objects" or "Delete". Each |
|
// track contains one track entry per object affected by the operation. |
|
// |
|
class CHistoryTrack |
|
{ |
|
public: |
|
CHistoryTrack(CHistory *pParent, const CMapObjectList *pSelection); |
|
~CHistoryTrack(); |
|
|
|
void Keep(CMapClass *pObject, bool bKeepChildren); |
|
void KeepForDestruction(CMapClass *pObject); |
|
void KeepNew(CMapClass *pObject); |
|
|
|
void Undo(); |
|
|
|
void SetName(LPCTSTR pszName) { if(pszName) strcpy(szName, pszName); } |
|
|
|
void OnRemoveVisGroup(CVisGroup *pGroup); |
|
|
|
private: |
|
|
|
BOOL CheckObjectFlag(CMapClass *pObject, int iFlag); |
|
|
|
CUtlVector<CTrackEntry> Data; |
|
|
|
CHistory *Parent; |
|
DWORD dwID; // id of this tracker.. |
|
char szName[128]; |
|
CMapObjectList Selected; |
|
bool m_bAutoDestruct; |
|
size_t uDataSize; // approx |
|
|
|
friend class CHistory; |
|
}; |
|
|
|
|
|
class CHistory |
|
{ |
|
public: |
|
CHistory(); |
|
~CHistory(); |
|
|
|
static void SetHistory(CHistory *pHistory); |
|
|
|
void SetOpposite(BOOL bUndo, CHistory*); |
|
inline void SetDocument(CMapDoc *pDoc); |
|
inline CMapDoc *GetDocument(void); |
|
|
|
// mark undo position: |
|
void MarkUndoPosition(const CMapObjectList* pSelection = NULL, LPCTSTR pszName = NULL, BOOL = FALSE); |
|
|
|
// |
|
// Keep this object so we can undo changes to it: |
|
// |
|
void Keep(CMapClass *pObject); |
|
void KeepNoChildren(CMapClass *pObject); |
|
void Keep(const CMapObjectList *pList); |
|
|
|
// |
|
// Store this pointer for destruction if it cycles off the undo stack: |
|
// |
|
void KeepForDestruction(CMapClass *pObject); |
|
|
|
// |
|
// Store this object for destruction if 'undone': |
|
// |
|
void KeepNew(CMapClass *pObject, bool bKeepChildren = true); |
|
void KeepNew(const CMapObjectList *pList, bool bKeepChildren = true); |
|
|
|
void Undo(CMapObjectList *pNewSelection); |
|
|
|
BOOL IsUndoable(); // anything to undo? |
|
|
|
void OnRemoveVisGroup(CVisGroup *pVisGroup); |
|
|
|
// returns current name |
|
LPCTSTR GetCurTrackName() { return CurTrack ? CurTrack->szName : ""; } |
|
|
|
// total override: |
|
void SetActive(BOOL bActive); |
|
BOOL IsActive() { return m_bActive; } |
|
|
|
// temporary shutdown/resume: |
|
inline void Pause() { bPaused = TRUE; } |
|
inline void Resume() { if(bPaused == TRUE) bPaused = FALSE; } |
|
inline BOOL IsPaused() { return bPaused || !IsActive(); } |
|
|
|
private: |
|
|
|
CHistoryTrack *CurTrack; |
|
CUtlVector<CHistoryTrack*> Tracks; |
|
|
|
CMapDoc *m_pDoc; // Associated document. |
|
|
|
// opposite tracker: |
|
CHistory *Opposite; |
|
BOOL bUndo; // is this the undo tracker? |
|
|
|
BOOL bPaused; |
|
size_t uDataSize; |
|
BOOL m_bActive; // veto control |
|
|
|
friend class CHistoryTrack; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Sets the document that this undo history belongs to. |
|
//----------------------------------------------------------------------------- |
|
void CHistory::SetDocument(CMapDoc *pDoc) |
|
{ |
|
m_pDoc = pDoc; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns the document that this undo history belongs to. |
|
//----------------------------------------------------------------------------- |
|
CMapDoc *CHistory::GetDocument(void) |
|
{ |
|
return(m_pDoc); |
|
} |
|
|
|
|
|
CHistory *GetHistory(); |
|
|
|
|
|
#endif // HISTORY_H
|
|
|