Added COMMIT::GetStatus() and minor refactor
Moved duplicated code to a new function and added an assert to warn against possible memory leak.
This commit is contained in:
+46
-22
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2016 CERN
|
||||
* Copyright 2016-2017 CERN
|
||||
* @author Tomasz Wlostowski <[email protected]>
|
||||
* @author Maciej Suminski <[email protected]>
|
||||
*
|
||||
@@ -52,7 +52,7 @@ COMMIT& COMMIT::Stage( EDA_ITEM* aItem, CHANGE_TYPE aChangeType )
|
||||
{
|
||||
case CHT_ADD:
|
||||
assert( m_changedItems.find( aItem ) == m_changedItems.end() );
|
||||
makeEntry( aItem, CHT_ADD | flag );
|
||||
makeEntry( aItem, CHT_ADD | flag );
|
||||
return *this;
|
||||
|
||||
case CHT_REMOVE:
|
||||
@@ -62,13 +62,7 @@ COMMIT& COMMIT::Stage( EDA_ITEM* aItem, CHANGE_TYPE aChangeType )
|
||||
case CHT_MODIFY:
|
||||
{
|
||||
EDA_ITEM* parent = parentObject( aItem );
|
||||
|
||||
if( m_changedItems.find( parent ) != m_changedItems.end() )
|
||||
return *this; // item has been already modified once
|
||||
|
||||
makeEntry( parent, CHT_MODIFY | flag, parent->Clone() );
|
||||
|
||||
return *this;
|
||||
return createModified( parent, parent->Clone(), flag );
|
||||
}
|
||||
|
||||
default:
|
||||
@@ -79,19 +73,6 @@ COMMIT& COMMIT::Stage( EDA_ITEM* aItem, CHANGE_TYPE aChangeType )
|
||||
}
|
||||
|
||||
|
||||
COMMIT& COMMIT::Modified( EDA_ITEM* aItem, EDA_ITEM* aCopy )
|
||||
{
|
||||
EDA_ITEM* parent = parentObject( aItem );
|
||||
|
||||
if( m_changedItems.find( parent ) != m_changedItems.end() )
|
||||
return *this; // item has been already modified once
|
||||
|
||||
makeEntry( parent, CHT_MODIFY, aCopy );
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
COMMIT& COMMIT::Stage( std::vector<EDA_ITEM*>& container, CHANGE_TYPE aChangeType )
|
||||
{
|
||||
for( EDA_ITEM* item : container )
|
||||
@@ -133,6 +114,15 @@ COMMIT& COMMIT::Stage( const PICKED_ITEMS_LIST& aItems, UNDO_REDO_T aModFlag )
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
int COMMIT::GetStatus( EDA_ITEM* aItem )
|
||||
{
|
||||
COMMIT_LINE* entry = findEntry( parentObject( aItem ) );
|
||||
|
||||
return entry ? entry->m_type : 0;
|
||||
}
|
||||
|
||||
|
||||
template <class Container, class F>
|
||||
void eraseIf( Container& c, F&& f )
|
||||
{
|
||||
@@ -142,6 +132,28 @@ void eraseIf( Container& c, F&& f )
|
||||
c.end() );
|
||||
}
|
||||
|
||||
|
||||
COMMIT& COMMIT::createModified( EDA_ITEM* aItem, EDA_ITEM* aCopy, int aExtraFlags )
|
||||
{
|
||||
EDA_ITEM* parent = parentObject( aItem );
|
||||
auto entryIt = m_changedItems.find( parent );
|
||||
|
||||
if( entryIt != m_changedItems.end() )
|
||||
{
|
||||
#ifdef DEBUG
|
||||
const COMMIT_LINE* entry = findEntry( parent );
|
||||
wxASSERT_MSG( entry->m_copy == aCopy, "Staging a different copy, possible memleak" );
|
||||
#endif
|
||||
|
||||
return *this; // item has been already modified once
|
||||
}
|
||||
|
||||
makeEntry( parent, CHT_MODIFY | aExtraFlags, aCopy );
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
void COMMIT::makeEntry( EDA_ITEM* aItem, CHANGE_TYPE aType, EDA_ITEM* aCopy )
|
||||
{
|
||||
// Expect an item copy if it is going to be modified
|
||||
@@ -165,6 +177,18 @@ void COMMIT::makeEntry( EDA_ITEM* aItem, CHANGE_TYPE aType, EDA_ITEM* aCopy )
|
||||
}
|
||||
|
||||
|
||||
COMMIT::COMMIT_LINE* COMMIT::findEntry( EDA_ITEM* aItem )
|
||||
{
|
||||
for( COMMIT_LINE& change : m_changes )
|
||||
{
|
||||
if( change.m_item == aItem )
|
||||
return &change;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
CHANGE_TYPE COMMIT::convert( UNDO_REDO_T aType ) const
|
||||
{
|
||||
switch( aType )
|
||||
|
||||
Reference in New Issue
Block a user