mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 06:06:50 +00:00
125 lines
3.3 KiB
C++
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
|