source-engine/datamodel/undomanager.h
FluorescentCIAAfricanAmerican 3bf9df6b27 1
2020-04-22 12:56:21 -04:00

125 lines
3.3 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef UNDOMANAGER_H
#define UNDOMANAGER_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/utlsymbol.h"
#include "tier1/utllinkedlist.h"
#include "tier1/utlstack.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class IUndoElement;
struct UndoInfo_t;
class IDmNotify;
//-----------------------------------------------------------------------------
// Undo/Redo stuff:
//-----------------------------------------------------------------------------
class CUndoManager
{
public:
CUndoManager();
~CUndoManager();
void Shutdown();
void SetUndoDepth( int nMaxUndoDepth );
void AddUndoElement( IUndoElement *pElement );
void Undo();
void Redo();
void TraceUndo( bool state );
void EnableUndo();
void DisableUndo();
bool IsEnabled() const;
bool HasUndoData() const;
bool UndoDataDiscarded() const;
bool HasRedoData() const;
void WipeUndo();
void WipeRedo();
const char *UndoDesc() const;
const char *RedoDesc() const;
void PushUndo( char const *udesc, char const *rdesc, int nChainingID );
void PushRedo();
void AbortUndoableOperation();
UtlSymId_t GetUndoDescInternal( const char *context );
UtlSymId_t GetRedoDescInternal( const char *context );
void GetUndoInfo( CUtlVector< UndoInfo_t >& list );
bool InstallNotificationCallback( IDmNotify *pNotify );
void RemoveNotificationCallback( IDmNotify *pNotify );
bool IsSuppressingNotify( ) const;
void SetSuppressingNotify( bool bSuppress );
void PushNotificationScope( const char *pReason, int nNotifySource, int nNotifyFlags );
void PopNotificationScope( bool bAbort );
void NotifyState( int nNotifyFlags );
static const char *GetUndoString( CUtlSymbol sym );
private:
void Trace( PRINTF_FORMAT_STRING const char *fmt, ... );
CUtlLinkedList< IUndoElement *, int > m_UndoList;
CUtlStack< IUndoElement * > m_RedoStack;
CUtlVector< IDmNotify* > m_Notifiers;
int m_nMaxUndoDepth;
int m_nNesting;
int m_nNotifyNesting;
CUtlSymbol m_UndoDesc;
CUtlSymbol m_RedoDesc;
int m_nNotifySource;
int m_nNotifyFlags;
const char* m_pNotifyReason;
int m_nItemsAddedSinceStartOfStream;
// Signals that next undo operation is the "Start" of a stream
bool m_bStreamStart : 1;
bool m_bTrace : 1;
bool m_bDiscarded : 1;
bool m_bEnabled : 1;
bool m_bSuppressingNotify : 1;
static CUtlSymbolTableMT s_UndoSymbolTable;
int m_nChainingID;
int m_PreviousChainingID;
};
//-----------------------------------------------------------------------------
// Is undo enabled
//-----------------------------------------------------------------------------
inline bool CUndoManager::IsEnabled() const
{
return m_bEnabled;
}
inline void CUndoManager::NotifyState( int nNotifyFlags )
{
// FIXME: Should suppress prevent notification being sent,
// or prevent notification flags from being set in the first place?
m_nNotifyFlags |= nNotifyFlags;
}
inline const char *CUndoManager::GetUndoString( CUtlSymbol sym )
{
return s_UndoSymbolTable.String( sym );
}
#endif // UNDOMANAGER_H