Split off pin number comparison
Pin numbers need to be ordered in more places in the future, so fold this out of the pin table dialog into a utility class.
This commit is contained in:
parent
991b9d509a
commit
88ccd787a4
|
@ -132,6 +132,7 @@ set( EESCHEMA_SRCS
|
|||
onrightclick.cpp
|
||||
operations_on_items_lists.cpp
|
||||
pinedit.cpp
|
||||
pin_number.cpp
|
||||
plot_schematic_DXF.cpp
|
||||
plot_schematic_HPGL.cpp
|
||||
plot_schematic_PS.cpp
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include "lib_pin.h"
|
||||
|
||||
#include "pin_number.h"
|
||||
|
||||
#include <boost/algorithm/string/join.hpp>
|
||||
#include <queue>
|
||||
|
||||
|
@ -283,118 +285,12 @@ unsigned int DIALOG_LIB_EDIT_PIN_TABLE::DataViewModel::GetChildren( const wxData
|
|||
|
||||
|
||||
namespace {
|
||||
wxString GetNextComponent( const wxString& str, wxString::size_type& cursor )
|
||||
{
|
||||
if( str.size() <= cursor )
|
||||
return wxEmptyString;
|
||||
|
||||
wxString::size_type begin = cursor;
|
||||
|
||||
wxUniChar c = str[cursor];
|
||||
|
||||
if( isdigit( c ) || c == '+' || c == '-' )
|
||||
{
|
||||
// number, possibly with sign
|
||||
while( ++cursor < str.size() )
|
||||
{
|
||||
c = str[cursor];
|
||||
|
||||
if( isdigit( c ) || c == 'v' || c == 'V' )
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while( ++cursor < str.size() )
|
||||
{
|
||||
c = str[cursor];
|
||||
|
||||
if( isdigit( c ) )
|
||||
break;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return str.substr( begin, cursor - begin );
|
||||
}
|
||||
|
||||
|
||||
int ComparePinNames( const wxString& lhs, const wxString& rhs )
|
||||
{
|
||||
wxString::size_type cursor1 = 0;
|
||||
wxString::size_type cursor2 = 0;
|
||||
|
||||
wxString comp1, comp2;
|
||||
|
||||
for( ; ; )
|
||||
{
|
||||
comp1 = GetNextComponent( lhs, cursor1 );
|
||||
comp2 = GetNextComponent( rhs, cursor2 );
|
||||
|
||||
if( comp1.empty() && comp2.empty() )
|
||||
return 0;
|
||||
|
||||
if( comp1.empty() )
|
||||
return -1;
|
||||
|
||||
if( comp2.empty() )
|
||||
return 1;
|
||||
|
||||
wxUniChar c1 = comp1[0];
|
||||
wxUniChar c2 = comp2[0];
|
||||
|
||||
if( isdigit( c1 ) || c1 == '-' || c1 == '+' )
|
||||
{
|
||||
if( isdigit( c2 ) || c2 == '-' || c2 == '+' )
|
||||
{
|
||||
// numeric comparison
|
||||
wxString::size_type v1 = comp1.find_first_of( "vV" );
|
||||
|
||||
if( v1 != wxString::npos )
|
||||
comp1[v1] = '.';
|
||||
|
||||
wxString::size_type v2 = comp2.find_first_of( "vV" );
|
||||
|
||||
if( v2 != wxString::npos )
|
||||
comp2[v2] = '.';
|
||||
|
||||
double val1, val2;
|
||||
|
||||
comp1.ToDouble( &val1 );
|
||||
comp2.ToDouble( &val2 );
|
||||
|
||||
if( val1 < val2 )
|
||||
return -1;
|
||||
|
||||
if( val1 > val2 )
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( isdigit( c2 ) || c2 == '-' || c2 == '+' )
|
||||
return 1;
|
||||
|
||||
int res = comp1.Cmp( comp2 );
|
||||
|
||||
if( res != 0 )
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CompareLess
|
||||
{
|
||||
public:
|
||||
bool operator()( const wxString& lhs, const wxString& rhs )
|
||||
{
|
||||
return ComparePinNames( lhs, rhs ) == -1;
|
||||
return PinNumbers::Compare( lhs, rhs ) == -1;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -413,7 +309,7 @@ int DIALOG_LIB_EDIT_PIN_TABLE::DataViewModel::Compare( const wxDataViewItem& aIt
|
|||
GetValue( var2, aItem2, aCol );
|
||||
wxString str2 = var2.GetString();
|
||||
|
||||
int res = ComparePinNames( str1, str2 );
|
||||
int res = PinNumbers::Compare( str1, str2 );
|
||||
|
||||
if( res == 0 )
|
||||
res = ( aItem1.GetID() < aItem2.GetID() ) ? -1 : 1;
|
||||
|
|
Loading…
Reference in New Issue