Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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
|