indent classes, align by spaces
This commit is contained in:
320
libs/maplib.h
320
libs/maplib.h
@@ -36,192 +36,192 @@
|
||||
|
||||
class NameableString : public Nameable
|
||||
{
|
||||
CopiedString m_name;
|
||||
CopiedString m_name;
|
||||
public:
|
||||
NameableString( const char* name )
|
||||
: m_name( name ){
|
||||
}
|
||||
NameableString( const char* name )
|
||||
: m_name( name ){
|
||||
}
|
||||
|
||||
const char* name() const {
|
||||
return m_name.c_str();
|
||||
}
|
||||
void attach( const NameCallback& callback ){
|
||||
}
|
||||
void detach( const NameCallback& callback ){
|
||||
}
|
||||
const char* name() const {
|
||||
return m_name.c_str();
|
||||
}
|
||||
void attach( const NameCallback& callback ){
|
||||
}
|
||||
void detach( const NameCallback& callback ){
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class UndoFileChangeTracker : public UndoTracker, public MapFile
|
||||
{
|
||||
std::size_t m_size;
|
||||
std::size_t m_saved;
|
||||
typedef void ( UndoFileChangeTracker::*Pending )();
|
||||
Pending m_pending;
|
||||
Callback m_changed;
|
||||
std::size_t m_size;
|
||||
std::size_t m_saved;
|
||||
typedef void ( UndoFileChangeTracker::*Pending )();
|
||||
Pending m_pending;
|
||||
Callback m_changed;
|
||||
|
||||
public:
|
||||
UndoFileChangeTracker() : m_size( 0 ), m_saved( MAPFILE_MAX_CHANGES ), m_pending( 0 ){
|
||||
}
|
||||
void print(){
|
||||
globalOutputStream() << "saved: " << Unsigned( m_saved ) << " size: " << Unsigned( m_size ) << "\n";
|
||||
}
|
||||
|
||||
void push(){
|
||||
++m_size;
|
||||
m_changed();
|
||||
//print();
|
||||
}
|
||||
void pop(){
|
||||
--m_size;
|
||||
m_changed();
|
||||
//print();
|
||||
}
|
||||
void pushOperation(){
|
||||
if ( m_size < m_saved ) {
|
||||
// redo queue has been flushed.. it is now impossible to get back to the saved state via undo/redo
|
||||
m_saved = MAPFILE_MAX_CHANGES;
|
||||
UndoFileChangeTracker() : m_size( 0 ), m_saved( MAPFILE_MAX_CHANGES ), m_pending( 0 ){
|
||||
}
|
||||
push();
|
||||
}
|
||||
void clear(){
|
||||
m_size = 0;
|
||||
m_changed();
|
||||
//print();
|
||||
}
|
||||
void begin(){
|
||||
m_pending = Pending( &UndoFileChangeTracker::pushOperation );
|
||||
}
|
||||
void undo(){
|
||||
m_pending = Pending( &UndoFileChangeTracker::pop );
|
||||
}
|
||||
void redo(){
|
||||
m_pending = Pending( &UndoFileChangeTracker::push );
|
||||
}
|
||||
|
||||
void changed(){
|
||||
if ( m_pending != 0 ) {
|
||||
( ( *this ).*m_pending )();
|
||||
m_pending = 0;
|
||||
void print(){
|
||||
globalOutputStream() << "saved: " << Unsigned( m_saved ) << " size: " << Unsigned( m_size ) << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void save(){
|
||||
m_saved = m_size;
|
||||
m_changed();
|
||||
}
|
||||
bool saved() const {
|
||||
return m_saved == m_size;
|
||||
}
|
||||
void push(){
|
||||
++m_size;
|
||||
m_changed();
|
||||
//print();
|
||||
}
|
||||
void pop(){
|
||||
--m_size;
|
||||
m_changed();
|
||||
//print();
|
||||
}
|
||||
void pushOperation(){
|
||||
if ( m_size < m_saved ) {
|
||||
// redo queue has been flushed.. it is now impossible to get back to the saved state via undo/redo
|
||||
m_saved = MAPFILE_MAX_CHANGES;
|
||||
}
|
||||
push();
|
||||
}
|
||||
void clear(){
|
||||
m_size = 0;
|
||||
m_changed();
|
||||
//print();
|
||||
}
|
||||
void begin(){
|
||||
m_pending = Pending( &UndoFileChangeTracker::pushOperation );
|
||||
}
|
||||
void undo(){
|
||||
m_pending = Pending( &UndoFileChangeTracker::pop );
|
||||
}
|
||||
void redo(){
|
||||
m_pending = Pending( &UndoFileChangeTracker::push );
|
||||
}
|
||||
|
||||
void setChangedCallback( const Callback& changed ){
|
||||
m_changed = changed;
|
||||
m_changed();
|
||||
}
|
||||
void changed(){
|
||||
if ( m_pending != 0 ) {
|
||||
( ( *this ).*m_pending )();
|
||||
m_pending = 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::size_t changes() const {
|
||||
return m_size;
|
||||
}
|
||||
void save(){
|
||||
m_saved = m_size;
|
||||
m_changed();
|
||||
}
|
||||
bool saved() const {
|
||||
return m_saved == m_size;
|
||||
}
|
||||
|
||||
void setChangedCallback( const Callback& changed ){
|
||||
m_changed = changed;
|
||||
m_changed();
|
||||
}
|
||||
|
||||
std::size_t changes() const {
|
||||
return m_size;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class MapRoot : public scene::Node::Symbiot, public scene::Instantiable, public scene::Traversable::Observer
|
||||
{
|
||||
class TypeCasts
|
||||
{
|
||||
NodeTypeCastTable m_casts;
|
||||
class TypeCasts
|
||||
{
|
||||
NodeTypeCastTable m_casts;
|
||||
public:
|
||||
TypeCasts(){
|
||||
NodeStaticCast<MapRoot, scene::Instantiable>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, scene::Traversable>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, TransformNode>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, Nameable>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, MapFile>::install( m_casts );
|
||||
}
|
||||
NodeTypeCastTable& get(){
|
||||
return m_casts;
|
||||
}
|
||||
};
|
||||
|
||||
scene::Node m_node;
|
||||
IdentityTransform m_transform;
|
||||
TraversableNodeSet m_traverse;
|
||||
InstanceSet m_instances;
|
||||
typedef SelectableInstance Instance;
|
||||
NameableString m_name;
|
||||
UndoFileChangeTracker m_changeTracker;
|
||||
public:
|
||||
TypeCasts(){
|
||||
NodeStaticCast<MapRoot, scene::Instantiable>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, scene::Traversable>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, TransformNode>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, Nameable>::install( m_casts );
|
||||
NodeContainedCast<MapRoot, MapFile>::install( m_casts );
|
||||
}
|
||||
NodeTypeCastTable& get(){
|
||||
return m_casts;
|
||||
}
|
||||
};
|
||||
typedef LazyStatic<TypeCasts> StaticTypeCasts;
|
||||
|
||||
scene::Node m_node;
|
||||
IdentityTransform m_transform;
|
||||
TraversableNodeSet m_traverse;
|
||||
InstanceSet m_instances;
|
||||
typedef SelectableInstance Instance;
|
||||
NameableString m_name;
|
||||
UndoFileChangeTracker m_changeTracker;
|
||||
public:
|
||||
typedef LazyStatic<TypeCasts> StaticTypeCasts;
|
||||
|
||||
scene::Traversable& get( NullType<scene::Traversable>){
|
||||
return m_traverse;
|
||||
}
|
||||
TransformNode& get( NullType<TransformNode>){
|
||||
return m_transform;
|
||||
}
|
||||
Nameable& get( NullType<Nameable>){
|
||||
return m_name;
|
||||
}
|
||||
MapFile& get( NullType<MapFile>){
|
||||
return m_changeTracker;
|
||||
}
|
||||
|
||||
MapRoot( const char* name ) : m_node( this, this, StaticTypeCasts::instance().get() ), m_name( name ){
|
||||
m_node.m_isRoot = true;
|
||||
|
||||
m_traverse.attach( this );
|
||||
|
||||
GlobalUndoSystem().trackerAttach( m_changeTracker );
|
||||
}
|
||||
~MapRoot(){
|
||||
}
|
||||
void release(){
|
||||
GlobalUndoSystem().trackerDetach( m_changeTracker );
|
||||
|
||||
m_traverse.detach( this );
|
||||
delete this;
|
||||
}
|
||||
scene::Node& node(){
|
||||
return m_node;
|
||||
}
|
||||
|
||||
InstanceCounter m_instanceCounter;
|
||||
void instanceAttach( const scene::Path& path ){
|
||||
if ( ++m_instanceCounter.m_count == 1 ) {
|
||||
m_traverse.instanceAttach( path_find_mapfile( path.begin(), path.end() ) );
|
||||
scene::Traversable& get( NullType<scene::Traversable>){
|
||||
return m_traverse;
|
||||
}
|
||||
}
|
||||
void instanceDetach( const scene::Path& path ){
|
||||
if ( --m_instanceCounter.m_count == 0 ) {
|
||||
m_traverse.instanceDetach( path_find_mapfile( path.begin(), path.end() ) );
|
||||
TransformNode& get( NullType<TransformNode>){
|
||||
return m_transform;
|
||||
}
|
||||
Nameable& get( NullType<Nameable>){
|
||||
return m_name;
|
||||
}
|
||||
MapFile& get( NullType<MapFile>){
|
||||
return m_changeTracker;
|
||||
}
|
||||
}
|
||||
|
||||
void insert( scene::Node& child ){
|
||||
m_instances.insert( child );
|
||||
}
|
||||
void erase( scene::Node& child ){
|
||||
m_instances.erase( child );
|
||||
}
|
||||
MapRoot( const char* name ) : m_node( this, this, StaticTypeCasts::instance().get() ), m_name( name ){
|
||||
m_node.m_isRoot = true;
|
||||
|
||||
scene::Node& clone() const {
|
||||
return ( new MapRoot( *this ) )->node();
|
||||
}
|
||||
m_traverse.attach( this );
|
||||
|
||||
scene::Instance* create( const scene::Path& path, scene::Instance* parent ){
|
||||
return new Instance( path, parent );
|
||||
}
|
||||
void forEachInstance( const scene::Instantiable::Visitor& visitor ){
|
||||
m_instances.forEachInstance( visitor );
|
||||
}
|
||||
void insert( scene::Instantiable::Observer* observer, const scene::Path& path, scene::Instance* instance ){
|
||||
m_instances.insert( observer, path, instance );
|
||||
instanceAttach( path );
|
||||
}
|
||||
scene::Instance* erase( scene::Instantiable::Observer* observer, const scene::Path& path ){
|
||||
instanceDetach( path );
|
||||
return m_instances.erase( observer, path );
|
||||
}
|
||||
GlobalUndoSystem().trackerAttach( m_changeTracker );
|
||||
}
|
||||
~MapRoot(){
|
||||
}
|
||||
void release(){
|
||||
GlobalUndoSystem().trackerDetach( m_changeTracker );
|
||||
|
||||
m_traverse.detach( this );
|
||||
delete this;
|
||||
}
|
||||
scene::Node& node(){
|
||||
return m_node;
|
||||
}
|
||||
|
||||
InstanceCounter m_instanceCounter;
|
||||
void instanceAttach( const scene::Path& path ){
|
||||
if ( ++m_instanceCounter.m_count == 1 ) {
|
||||
m_traverse.instanceAttach( path_find_mapfile( path.begin(), path.end() ) );
|
||||
}
|
||||
}
|
||||
void instanceDetach( const scene::Path& path ){
|
||||
if ( --m_instanceCounter.m_count == 0 ) {
|
||||
m_traverse.instanceDetach( path_find_mapfile( path.begin(), path.end() ) );
|
||||
}
|
||||
}
|
||||
|
||||
void insert( scene::Node& child ){
|
||||
m_instances.insert( child );
|
||||
}
|
||||
void erase( scene::Node& child ){
|
||||
m_instances.erase( child );
|
||||
}
|
||||
|
||||
scene::Node& clone() const {
|
||||
return ( new MapRoot( *this ) )->node();
|
||||
}
|
||||
|
||||
scene::Instance* create( const scene::Path& path, scene::Instance* parent ){
|
||||
return new Instance( path, parent );
|
||||
}
|
||||
void forEachInstance( const scene::Instantiable::Visitor& visitor ){
|
||||
m_instances.forEachInstance( visitor );
|
||||
}
|
||||
void insert( scene::Instantiable::Observer* observer, const scene::Path& path, scene::Instance* instance ){
|
||||
m_instances.insert( observer, path, instance );
|
||||
instanceAttach( path );
|
||||
}
|
||||
scene::Instance* erase( scene::Instantiable::Observer* observer, const scene::Path& path ){
|
||||
instanceDetach( path );
|
||||
return m_instances.erase( observer, path );
|
||||
}
|
||||
};
|
||||
|
||||
inline void MapRoot_construct(){
|
||||
|
||||
Reference in New Issue
Block a user