Added support for multi-selection and multi-editing in cvpcb.

This commit is contained in:
Felix Morgner 2012-09-26 15:57:58 -05:00 committed by Dick Hollenbeck
commit 21dbfef350
4 changed files with 57 additions and 33 deletions

View File

@ -17,7 +17,7 @@
COMPONENTS_LISTBOX::COMPONENTS_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id, COMPONENTS_LISTBOX::COMPONENTS_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
const wxPoint& loc, const wxSize& size, const wxPoint& loc, const wxSize& size,
int nbitems, wxString choice[] ) : int nbitems, wxString choice[] ) :
ITEMS_LISTBOX_BASE( parent, id, loc, size ) ITEMS_LISTBOX_BASE( parent, id, loc, size, ~wxLC_SINGLE_SEL)
{ {
} }

View File

@ -18,7 +18,8 @@ class ITEMS_LISTBOX_BASE : public wxListView
{ {
public: public:
ITEMS_LISTBOX_BASE( CVPCB_MAINFRAME* aParent, wxWindowID aId, ITEMS_LISTBOX_BASE( CVPCB_MAINFRAME* aParent, wxWindowID aId,
const wxPoint& aLocation, const wxSize& aSize ); const wxPoint& aLocation, const wxSize& aSize,
long aStyle = wxLC_SINGLE_SEL);
~ITEMS_LISTBOX_BASE(); ~ITEMS_LISTBOX_BASE();

View File

@ -19,11 +19,12 @@
******************************************************************************/ ******************************************************************************/
#define LISTB_STYLE wxSUNKEN_BORDER | wxLC_NO_HEADER | \ #define LISTB_STYLE wxSUNKEN_BORDER | wxLC_NO_HEADER | \
wxLC_SINGLE_SEL | wxLC_REPORT | wxLC_VIRTUAL wxLC_REPORT | wxLC_VIRTUAL
ITEMS_LISTBOX_BASE::ITEMS_LISTBOX_BASE( CVPCB_MAINFRAME* aParent, wxWindowID aId, ITEMS_LISTBOX_BASE::ITEMS_LISTBOX_BASE( CVPCB_MAINFRAME* aParent, wxWindowID aId,
const wxPoint& aLocation, const wxSize& aSize ) : const wxPoint& aLocation, const wxSize& aSize,
wxListView( aParent, aId, aLocation, aSize, LISTB_STYLE ) long aStyle) :
wxListView( aParent, aId, aLocation, aSize, LISTB_STYLE | aStyle )
{ {
InsertColumn( 0, wxEmptyString ); InsertColumn( 0, wxEmptyString );
SetColumnWidth( 0, wxLIST_AUTOSIZE ); SetColumnWidth( 0, wxLIST_AUTOSIZE );

View File

@ -39,52 +39,74 @@
#define titleComponentLibErr _( "Component Library Error" ) #define titleComponentLibErr _( "Component Library Error" )
void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
{ {
COMPONENT_INFO* Component; COMPONENT_INFO* component;
bool isUndefined = false; bool hasFootprint = false;
int NumCmp; int componentIndex;
wxString msg; wxString description;
if( m_components.empty() ) if( m_components.empty() )
return; return;
NumCmp = m_ListCmp->GetSelection(); // if no component is selected, select the first one
if( NumCmp < 0 ) if(m_ListCmp->GetFirstSelected() < 0)
{ {
NumCmp = 0; componentIndex = 0;
m_ListCmp->SetSelection( NumCmp, true ); m_ListCmp->SetSelection( componentIndex, true );
} }
Component = &m_components[ NumCmp ]; // iterate over the selection
if( Component == NULL ) while( m_ListCmp->GetFirstSelected() != -1)
{
// get the component for the current iteration
componentIndex = m_ListCmp->GetFirstSelected();
component = &m_components[componentIndex];
if( component == NULL )
return; return;
isUndefined = Component->m_Footprint.IsEmpty(); // check to see if the component has allready a footprint set.
Component->m_Footprint = aFootprintName; hasFootprint = !(component->m_Footprint.IsEmpty());
msg.Printf( CMP_FORMAT, NumCmp + 1, component->m_Footprint = aFootprintName;
GetChars( Component->m_Reference ),
GetChars( Component->m_Value ), // create the new component description
GetChars( Component->m_Footprint ) );
description.Printf( CMP_FORMAT, componentIndex + 1,
GetChars( component->m_Reference ),
GetChars( component->m_Value ),
GetChars( component->m_Footprint ) );
// if the component hasn't had a footprint associated with it
// it now has, so we decrement the count of components without
// a footprint assigned.
if( !hasFootprint )
{
hasFootprint = true;
m_undefinedComponentCnt -= 1;
}
// set the new description and deselect the processed component
m_ListCmp->SetString( componentIndex, description );
m_ListCmp->SetSelection( componentIndex, false );
}
// mark this "session" as modified
m_modified = true; m_modified = true;
if( isUndefined ) // select the next component, if there is one
m_undefinedComponentCnt -= 1; if( componentIndex < (m_ListCmp->GetCount() - 1) )
componentIndex++;
m_ListCmp->SetString( NumCmp, msg ); m_ListCmp->SetSelection( componentIndex, true );
m_ListCmp->SetSelection( NumCmp, false );
// We activate next component:
if( NumCmp < (m_ListCmp->GetCount() - 1) )
NumCmp++;
m_ListCmp->SetSelection( NumCmp, true );
// update the statusbar
DisplayStatus(); DisplayStatus();
} }