* fix: don't rename target/names without numeric suffix on paste to non clashing namespace

This commit is contained in:
Garux 2021-11-24 18:00:37 +03:00
parent e62483970f
commit 1f7d0250b0
3 changed files with 21 additions and 22 deletions

View File

@ -29,15 +29,16 @@
#if 1 #if 1
class Postfix class Postfix
{ {
unsigned int m_value; int m_value; // -1 is special value to handle empty postfix
public: public:
Postfix( const char* postfix ) : m_value( atoi( postfix ) ){ Postfix( const char* postfix ) : m_value( string_empty( postfix )? -1 : atoi( postfix ) ){
} }
unsigned int number() const { int number() const {
return m_value; return m_value;
} }
void write( char* buffer ) const { void write( char* buffer ) const {
sprintf( buffer, "%u", m_value ); if( m_value != -1 )
sprintf( buffer, "%i", m_value );
} }
Postfix& operator++(){ Postfix& operator++(){
++m_value; ++m_value;

View File

@ -71,15 +71,15 @@ class NameKeys : public Entity::Observer, public Namespaced
} }
} }
void insertAll(){ void insertAll(){
for ( KeyValues::iterator i = m_keyValues.begin(); i != m_keyValues.end(); ++i ) for ( auto& [key, value] : m_keyValues )
{ {
insertName( ( *i ).first.c_str(), *( *i ).second ); insertName( key.c_str(), *value );
} }
} }
void eraseAll(){ void eraseAll(){
for ( KeyValues::iterator i = m_keyValues.begin(); i != m_keyValues.end(); ++i ) for ( auto& [key, value] : m_keyValues )
{ {
eraseName( ( *i ).first.c_str(), *( *i ).second ); eraseName( key.c_str(), *value );
} }
} }
public: public:

View File

@ -158,26 +158,24 @@ public:
UniqueNames uniqueNames( other.m_uniqueNames ); UniqueNames uniqueNames( other.m_uniqueNames );
for ( Names::const_iterator i = m_names.begin(); i != m_names.end(); ++i ) for ( const auto& [callback, observer] : m_names )
{ {
groups[( *i ).second.c_str()].push_back( ( *i ).first ); groups[observer.c_str()].push_back( callback );
} }
for ( NameGroups::iterator i = groups.begin(); i != groups.end(); ++i ) for ( const auto& [name, setNameCallbacks] : groups )
{ {
name_t uniqueName( uniqueNames.make_unique( name_read( ( *i ).first.c_str() ) ) ); name_t uniqueName( uniqueNames.make_unique( name_read( name.c_str() ) ) );
uniqueNames.insert( uniqueName ); uniqueNames.insert( uniqueName );
char buffer[1024]; char buffer[1024];
name_write( buffer, uniqueName ); name_write( buffer, uniqueName );
//globalOutputStream() << "renaming " << makeQuoted((*i).first.c_str()) << " to " << makeQuoted(buffer) << "\n"; //globalOutputStream() << "renaming " << makeQuoted(name.c_str()) << " to " << makeQuoted(buffer) << "\n";
SetNameCallbacks& setNameCallbacks = ( *i ).second; for ( const NameCallback& nameCallback : setNameCallbacks )
for ( SetNameCallbacks::const_iterator j = setNameCallbacks.begin(); j != setNameCallbacks.end(); ++j )
{ {
( *j )( buffer ); nameCallback( buffer );
} }
} }
} }
@ -206,7 +204,7 @@ typedef Static<NamespaceModule> StaticNamespaceModule;
StaticRegisterModule staticRegisterDefaultNamespace( StaticNamespaceModule::instance() ); StaticRegisterModule staticRegisterDefaultNamespace( StaticNamespaceModule::instance() );
std::list<Namespaced*> g_cloned; std::vector<Namespaced*> g_cloned;
inline Namespaced* Node_getNamespaced( scene::Node& node ){ inline Namespaced* Node_getNamespaced( scene::Node& node ){
return NodeTypeCast<Namespaced>::cast( node ); return NodeTypeCast<Namespaced>::cast( node );
@ -234,15 +232,15 @@ void Map_gatherNamespaced( scene::Node& root ){
void Map_mergeClonedNames( bool makeUnique /*= true*/ ){ void Map_mergeClonedNames( bool makeUnique /*= true*/ ){
if( makeUnique ){ if( makeUnique ){
for ( std::list<Namespaced*>::const_iterator i = g_cloned.begin(); i != g_cloned.end(); ++i ) for ( Namespaced *namespaced : g_cloned )
{ {
( *i )->setNamespace( g_cloneNamespace ); namespaced->setNamespace( g_cloneNamespace );
} }
g_cloneNamespace.mergeNames( g_defaultNamespace ); g_cloneNamespace.mergeNames( g_defaultNamespace );
} }
for ( std::list<Namespaced*>::const_iterator i = g_cloned.begin(); i != g_cloned.end(); ++i ) for ( Namespaced *namespaced : g_cloned )
{ {
( *i )->setNamespace( g_defaultNamespace ); namespaced->setNamespace( g_defaultNamespace );
} }
g_cloned.clear(); g_cloned.clear();