Commit 7f18b883 authored by Wayne Stambaugh's avatar Wayne Stambaugh
Browse files

CvPcb filtering and other minor improvements.

* Change filtering from single selection to logically and each filter type.
* Remove clear filtering button and logic.
* Filter buttons now behave as true toggle buttons.
* Improve list control pane focus following when using arrow keys to change
  list pane.
* Remove unused parameters from list box constructors.
* Make tab key behave like right arrow key when moving focus to next list
  pane.
* Make list pane focus wrap around to next or previous control.
* Simplify component list filtering code.
* Improve status bar updating.
* Tell Bazaar to ignore .downloads-by-cmake instead of downloads-by-cmake.
parent 142306e2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
include/boost
downloads-by-cmake
.downloads-by-cmake
common/netlist_keywords.*
common/netlist_lexer.h
common/pcb_plot_params_lexer.h
+73 −60
Original line number Diff line number Diff line
/*************************************************************************/
/* listboxes.cpp: class for displaying footprint list and component list */
/*************************************************************************/
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

/**
 * @file class_components_listbox.h
 */

#include <fctsys.h>
#include <wxstruct.h>
@@ -8,15 +31,11 @@
#include <cvpcb.h>
#include <cvpcb_mainframe.h>
#include <cvstruct.h>
#include <cvpcb_id.h>


/**************************************************/
/* ListBox handling the schematic components list */
/**************************************************/

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


/* Build the events table for the schematic components list box
 */

BEGIN_EVENT_TABLE( COMPONENTS_LISTBOX, ITEMS_LISTBOX_BASE )
    EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
    EVT_CHAR( COMPONENTS_LISTBOX::OnChar )
    EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, COMPONENTS_LISTBOX::OnSelectComponent )
END_EVENT_TABLE()


@@ -53,6 +70,7 @@ void COMPONENTS_LISTBOX::SetString( unsigned linecount, const wxString& text )
{
    if( linecount >= m_ComponentList.Count() )
        linecount = m_ComponentList.Count() - 1;

    if( linecount >= 0 )
        m_ComponentList[linecount] = text;
}
@@ -65,19 +83,12 @@ void COMPONENTS_LISTBOX::AppendLine( const wxString& text )
}


/*
 * Overlaid function: MUST be provided in wxLC_VIRTUAL mode
 * because real data are not handled by ITEMS_LISTBOX_BASE
 */
wxString COMPONENTS_LISTBOX::OnGetItemText( long item, long column ) const
{
    return m_ComponentList.Item( item );
}


/*
 * Enable or disable an item
 */
void COMPONENTS_LISTBOX::SetSelection( unsigned index, bool State )
{
    if( (int) index >= GetCount() )
@@ -87,6 +98,7 @@ void COMPONENTS_LISTBOX::SetSelection( unsigned index, bool State )
    {
        Select( index, State );
        EnsureVisible( index );

#ifdef __WXMAC__
        Update();
#endif
@@ -94,23 +106,23 @@ void COMPONENTS_LISTBOX::SetSelection( unsigned index, bool State )
}


/**
 * Function OnChar
 * called on a key pressed
 * Call default handler for some special keys,
 * and for "ascii" keys, select the first component
 * that the name starts by the letter.
 * This is the defaut behaviour of a listbox, but because we use
 * virtual lists, the listbox does not know anything to what is displayed,
 * we must handle this behaviour here.
 * Furthermore the reference of components is not at the beginning of
 * displayed lines (the first word is the line number)
 */
void COMPONENTS_LISTBOX::OnChar( wxKeyEvent& event )
{
    int key = event.GetKeyCode();

    switch( key )
    {
    case WXK_TAB:
    case WXK_RIGHT:
    case WXK_NUMPAD_RIGHT:
        GetParent()->m_FootprintList->SetFocus();
        return;

    case WXK_LEFT:
    case WXK_NUMPAD_LEFT:
        GetParent()->m_LibraryList->SetFocus();
        return;

    case WXK_HOME:
    case WXK_END:
    case WXK_UP:
@@ -120,15 +132,6 @@ void COMPONENTS_LISTBOX::OnChar( wxKeyEvent& event )
        event.Skip();
        return;

        case WXK_LEFT:
        case WXK_NUMPAD_LEFT:
            GetParent()->m_LibraryList->SetFocus();
            return;

        case WXK_RIGHT:
        case WXK_NUMPAD_RIGHT:
            GetParent()->m_FootprintList->SetFocus();
            return;

    default:
        break;
@@ -136,25 +139,29 @@ void COMPONENTS_LISTBOX::OnChar( wxKeyEvent& event )

    // Search for an item name starting by the key code:
    key = toupper( key );

    for( unsigned ii = 0; ii < m_ComponentList.GetCount(); ii++ )
    {
        wxString text = m_ComponentList.Item( ii );
        /* search for the start char of the footprint name.
         * we must skip the line number
        */

        // Search for the start char of the footprint name.  Skip the line number.
        text.Trim( false );      // Remove leading spaces in line
        unsigned jj = 0;

        for( ; jj < text.Len(); jj++ )
        {   // skip line number
            if( text[jj] == ' ' )
                break;
        }

        for( ; jj < text.Len(); jj++ )
        {   // skip blanks
            if( text[jj] != ' ' )
                break;
        }

        int start_char = toupper( text[jj] );

        if( key == start_char )
        {
            Focus( ii );
@@ -162,5 +169,11 @@ void COMPONENTS_LISTBOX::OnChar( wxKeyEvent& event )
            break;
        }
    }
}


void COMPONENTS_LISTBOX::OnSelectComponent( wxListEvent& event )
{
    SetFocus();
    GetParent()->OnSelectComponent( event );
}
+87 −237
Original line number Diff line number Diff line
@@ -36,21 +36,14 @@
#include <cvpcb.h>
#include <cvpcb_mainframe.h>
#include <cvstruct.h>
#include <cvpcb_id.h>


/***************************************/
/* ListBox handling the footprint list */
/***************************************/

FOOTPRINTS_LISTBOX::FOOTPRINTS_LISTBOX( CVPCB_MAINFRAME* parent,
                                        wxWindowID id, const wxPoint& loc,
                                        const wxSize& size,
                                        int nbitems, wxString choice[] ) :
                                        const wxSize& size ) :
    ITEMS_LISTBOX_BASE( parent, id, loc, size )
{
    m_UseFootprintFullList = true;
    m_ActiveFootprintList  = NULL;
    SetActiveFootprintList( true );
}


@@ -59,24 +52,19 @@ FOOTPRINTS_LISTBOX::~FOOTPRINTS_LISTBOX()
}


/*
 * Return number of items
 */
int FOOTPRINTS_LISTBOX::GetCount()
{
    return m_ActiveFootprintList->Count();
    return m_footprintList.Count();
}


/*
 * Change an item text
 */
void FOOTPRINTS_LISTBOX::SetString( unsigned linecount, const wxString& text )
{
    if( linecount >= m_ActiveFootprintList->Count() )
        linecount = m_ActiveFootprintList->Count() - 1;
    if( linecount >= m_footprintList.Count() )
        linecount = m_footprintList.Count() - 1;

    if( linecount >= 0 )
        (*m_ActiveFootprintList)[linecount] = text;
        m_footprintList[linecount] = text;
}


@@ -87,7 +75,7 @@ wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint()

    if( ii >= 0 )
    {
        wxString msg = (*m_ActiveFootprintList)[ii];
        wxString msg = m_footprintList[ii];
        msg.Trim( true );
        msg.Trim( false );
        footprintName = msg.AfterFirst( wxChar( ' ' ) );
@@ -99,24 +87,20 @@ wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint()

void FOOTPRINTS_LISTBOX::AppendLine( const wxString& text )
{
    m_ActiveFootprintList->Add( text );
    SetItemCount( m_ActiveFootprintList->Count() );
    m_footprintList.Add( text );
    SetItemCount( m_footprintList.Count() );
}


/*
 * Overlaid function: MUST be provided in wxLC_VIRTUAL mode
 * because real data is not handled by ITEMS_LISTBOX_BASE
 */
wxString FOOTPRINTS_LISTBOX::OnGetItemText( long item, long column ) const
{
    return m_ActiveFootprintList->Item( item );
    if( item < 0 || item >= (long)m_footprintList.GetCount() )
        return wxEmptyString;

    return m_footprintList.Item( item );
}


/*
 * Enable or disable an item
 */
void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
{
    if( (int) index >= GetCount() )
@@ -127,7 +111,9 @@ void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
#ifndef __WXMAC__
        Select( index, State );
#endif

        EnsureVisible( index );

#ifdef __WXMAC__
        Refresh();
#endif
@@ -135,216 +121,79 @@ void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
}


void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list )
void FOOTPRINTS_LISTBOX::SetFootprints( FOOTPRINT_LIST& aList, const wxString& aLibName,
                                        COMPONENT* aComponent, int aFilterType )
{
    wxArrayString   newList;
    wxString        msg;
    int      oldSelection = GetSelection();
    wxString        oldSelection;

    m_FullFootprintList.Clear();
    if( GetSelection() >= 0 && GetSelection() < (int)m_footprintList.GetCount() )
        oldSelection = m_footprintList[ GetSelection() ];

    for( unsigned ii = 0; ii < list.GetCount(); ii++ )
    for( unsigned ii = 0; ii < aList.GetCount(); ii++ )
    {
        FOOTPRINT_INFO & footprint = list.GetItem(ii);
        msg.Printf( wxT( "%3zu %s" ), m_FullFootprintList.GetCount() + 1,
                   GetChars(footprint.m_Module) );
        m_FullFootprintList.Add( msg );
    }

    SetActiveFootprintList( true );

    if(  GetCount() == 0 || oldSelection < 0 || oldSelection >= GetCount() )
        SetSelection( 0, true );
    Refresh();
}


void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT*      aComponent,
                                                   FOOTPRINT_LIST& list )
        if( aFilterType == UNFILTERED )
        {
    wxString msg;
    unsigned jj;
    int      OldSelection = GetSelection();
    bool     hasItem = false;

    m_FilteredFootprintList.Clear();

    for( unsigned ii = 0; ii < list.GetCount(); ii++ )
    {
        FOOTPRINT_INFO& footprint = list.GetItem(ii);
        // Search for matching footprints
        // The search is case insensitive
        wxString module = footprint.m_Module.Upper();
        wxString candidate;

        for( jj = 0; jj < aComponent->GetFootprintFilters().GetCount(); jj++ )
        {
            candidate = aComponent->GetFootprintFilters()[jj].Upper();

            if( !module.Matches( candidate ) )
            msg.Printf( wxT( "%3zu %s" ), newList.GetCount() + 1,
                        GetChars( aList.GetItem( ii ).m_Module ) );
            newList.Add( msg );
            continue;

            msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1,
                        footprint.m_Module.GetData() );
            m_FilteredFootprintList.Add( msg );
            hasItem = true;
        }
    }

    if( hasItem )
        SetActiveFootprintList( false );
    else
        SetActiveFootprintList( true );

    if( ( GetCount() == 0 ) || ( OldSelection >= GetCount() ) )
        SetSelection( 0, true );

    Refresh();
}


void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT*      aComponent,
                                                         FOOTPRINT_LIST& list )
{
    wxString msg;
    int      oldSelection = GetSelection();
    bool     hasItem = false;

    m_FilteredFootprintList.Clear();

    for( unsigned ii = 0; ii < list.GetCount(); ii++ )
    {
        FOOTPRINT_INFO& footprint = list.GetItem(ii);

        if( aComponent->GetNetCount() == footprint.m_padCount )
        {
            msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1,
                        footprint.m_Module.GetData() );
            m_FilteredFootprintList.Add( msg );
            hasItem = true;
        }
        }

    if( hasItem )
        SetActiveFootprintList( false );
    else
        SetActiveFootprintList( true );

    if( ( GetCount() == 0 ) || ( oldSelection >= GetCount() ) )
        SetSelection( 0, true );

    Refresh();
}

void FOOTPRINTS_LISTBOX::SetFootprintFilteredByLibraryList( FOOTPRINT_LIST& list,
                                                            wxString SelectedLibrary ) {
    wxString msg;
    int      oldSelection = GetSelection();
    bool     hasItem = false;

    wxFileName filename = SelectedLibrary;
    filename.SetExt( LegacyFootprintLibPathExtension );
    wxString FullLibraryName = wxGetApp().FindLibraryPath( filename );

    m_FilteredFootprintList.Clear();

    for( unsigned ii = 0; ii < list.GetCount(); ii++ )
    {
        FOOTPRINT_INFO& footprint = list.GetItem(ii);
        wxString LibName = footprint.m_libPath;
        if( LibName.Matches( FullLibraryName ) )
        {
            msg.Printf( wxT( "%3d %s" ), m_FilteredFootprintList.GetCount() + 1,
                     footprint.m_Module.GetData() );
            m_FilteredFootprintList.Add( msg );
            hasItem = true;
        }
    }
        if( (aFilterType & BY_LIBRARY) && !aLibName.IsEmpty()
          && (aList.GetItem( ii ).m_libName != aLibName) )
            continue;

    if( hasItem )
        SetActiveFootprintList( false );
    else
        SetActiveFootprintList( true );
        if( (aFilterType & BY_COMPONENT) && (aComponent != NULL)
          && !aComponent->MatchesFootprintFilters( aList.GetItem( ii ).m_Module ) )
            continue;

    if( ( GetCount() == 0 ) || ( oldSelection >= GetCount() ) )
        SetSelection( 0, true );
        if( (aFilterType & BY_PIN_COUNT) && (aComponent!= NULL)
          && (aComponent->GetNetCount() != aList.GetItem( ii ).m_padCount) )
            continue;

    Refresh();
        msg.Printf( wxT( "%3zu %s" ), newList.GetCount() + 1,
                    aList.GetItem( ii ).m_Module.GetData() );
        newList.Add( msg );
    }

/** Set the footprint list. We can have 2 footprint list:
 *  The full footprint list
 *  The filtered footprint list (if the current selected component has a
 * filter for footprints)
 *  @param FullList true = full footprint list, false = filtered footprint list
 *  @param Redraw = true to redraw the window
 */
void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw )
{
    bool old_selection = m_UseFootprintFullList;
    if( newList == m_footprintList )
        return;

#ifdef __WINDOWS__
    m_footprintList = newList;

    /* Workaround for a curious bug in wxWidgets:
     * if we switch from a long list of footprints to a short list (a
     * filtered footprint list), and if the selected item is near the end
     * of the long list,  the new list is not displayed from the top of
     * the list box
     */
    if( m_ActiveFootprintList )
    {
        bool new_selection;
    int selection = m_footprintList.Index( oldSelection );

        if( FullList )
            new_selection = true;
        else
            new_selection = false;
    if( selection == wxNOT_FOUND )
        selection = 0;

        if( new_selection != old_selection )
            SetSelection( 0, true );
    }
#endif
    if( FullList )
    {
        m_UseFootprintFullList = true;
        m_ActiveFootprintList  = &m_FullFootprintList;
        SetItemCount( m_FullFootprintList.GetCount() );
    }
    else
    {
        m_UseFootprintFullList = false;
        m_ActiveFootprintList  = &m_FilteredFootprintList;
        SetItemCount( m_FilteredFootprintList.GetCount() );
    }

    if( Redraw )
    {
        if( !m_UseFootprintFullList || ( m_UseFootprintFullList != old_selection ) )
        {
    DeleteAllItems();
    SetItemCount( m_footprintList.GetCount() );
    SetSelection( selection, true );
    Refresh();
}
    }

    GetParent()->DisplayStatus();
}


/**************************************/
/* Event table for the footprint list */
/**************************************/

BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE )
    EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
    EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar )
    EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftClick )
    EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftDClick )
END_EVENT_TABLE()


void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
{
    if( m_footprintList.IsEmpty() )
        return;

    FOOTPRINT_INFO* Module;
    wxString        footprintName = GetSelectedFootprint();

    Module = GetParent()->m_footprints.GetModuleInfo( footprintName );
    wxASSERT( Module );

    if( GetParent()->m_DisplayFootprintFrame )
    {
        // Refresh current selected footprint view:
@@ -354,11 +203,10 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
    if( Module )
    {
        wxString msg;
        msg = Module->m_Doc;
        msg = _( "Description: " ) + Module->m_Doc;
        GetParent()->SetStatusText( msg, 0 );

        msg  = wxT( "KeyW: " );
        msg += Module->m_KeyWord;
        msg  = _( "Key words: " ) + Module->m_KeyWord;
        GetParent()->SetStatusText( msg, 1 );
    }
}
@@ -378,6 +226,12 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )

    switch( key )
    {
    case WXK_TAB:
    case WXK_RIGHT:
    case WXK_NUMPAD_RIGHT:
        GetParent()->m_LibraryList->SetFocus();
        return;

    case WXK_LEFT:
    case WXK_NUMPAD_LEFT:
        GetParent()->m_ListCmp->SetFocus();
@@ -389,8 +243,6 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
    case WXK_DOWN:
    case WXK_PAGEUP:
    case WXK_PAGEDOWN:
        case WXK_RIGHT:
        case WXK_NUMPAD_RIGHT:
        event.Skip();
        return;

@@ -401,13 +253,11 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
    // Search for an item name starting by the key code:
    key = toupper( key );

    for( unsigned ii = 0; ii < m_ActiveFootprintList->GetCount(); ii++ )
    for( unsigned ii = 0; ii < m_footprintList.GetCount(); ii++ )
    {
        wxString text = m_ActiveFootprintList->Item(ii);
        wxString text = m_footprintList.Item( ii );

        /* search for the start char of the footprint name.
         * we must skip the line number
         */
        // Search for the start char of the footprint name. Skip the line number.
        text.Trim( false );      // Remove leading spaces in line
        unsigned jj = 0;

+58 −77
Original line number Diff line number Diff line
@@ -33,19 +33,17 @@
#include <cvpcb.h>
#include <cvpcb_mainframe.h>
#include <cvstruct.h>
#include <cvpcb_id.h>


/***************************************/
/* ListBox handling the library list */
/***************************************/

LIBRARY_LISTBOX::LIBRARY_LISTBOX( CVPCB_MAINFRAME* parent,
                                        wxWindowID id, const wxPoint& loc,
                                        const wxSize& size,
                                        int nbitems, wxString choice[] ) :
LIBRARY_LISTBOX::LIBRARY_LISTBOX( CVPCB_MAINFRAME* parent, wxWindowID id,
                                  const wxPoint& loc, const wxSize& size ) :
    ITEMS_LISTBOX_BASE( parent, id, loc, size )
{
    //ListLibraries();
}


@@ -54,24 +52,19 @@ LIBRARY_LISTBOX::~LIBRARY_LISTBOX()
}


/*
 * Return number of items
 */
int LIBRARY_LISTBOX::GetCount()
{
    return m_LibraryList.Count();
    return m_libraryList.Count();
}


/*
 * Change an item text
 */
void LIBRARY_LISTBOX::SetString( unsigned linecount, const wxString& text )
{
    if( linecount >= m_LibraryList.Count() )
        linecount = m_LibraryList.Count() - 1;
    if( linecount >= m_libraryList.Count() )
        linecount = m_libraryList.Count() - 1;

    if( linecount >= 0 )
        m_LibraryList[linecount] = text;
        m_libraryList[linecount] = text;
}


@@ -82,7 +75,7 @@ wxString LIBRARY_LISTBOX::GetSelectedLibrary()

    if( ii >= 0 )
    {
        libraryName = m_LibraryList[ii];
        libraryName = m_libraryList[ii];
    }

    return libraryName;
@@ -91,23 +84,17 @@ wxString LIBRARY_LISTBOX::GetSelectedLibrary()

void LIBRARY_LISTBOX::AppendLine( const wxString& text )
{
    m_LibraryList.Add( text );
    SetItemCount( m_LibraryList.Count() );
    m_libraryList.Add( text );
    SetItemCount( m_libraryList.Count() );
}


/*
 * Overlaid function: MUST be provided in wxLC_VIRTUAL mode
 * because real data is not handled by ITEMS_LISTBOX_BASE
 */
wxString LIBRARY_LISTBOX::OnGetItemText( long item, long column ) const
{
    return m_LibraryList.Item( item );
    return m_libraryList.Item( item );
}

/*
 * Enable or disable an item
 */

void LIBRARY_LISTBOX::SetSelection( unsigned index, bool State )
{
    if( (int) index >= GetCount() )
@@ -126,83 +113,69 @@ void LIBRARY_LISTBOX::SetSelection( unsigned index, bool State )
}


void LIBRARY_LISTBOX::SetLibraryList( wxArrayString list )
void LIBRARY_LISTBOX::SetLibraryList( const wxArrayString& aList )
{
    wxString msg;
    int oldSelection = GetSelection();

    m_LibraryList.Clear();

    for( unsigned ii = 0; ii < list.GetCount(); ii++ )
    {
        msg = list.Item(ii);
        m_LibraryList.Add( msg );
    }
    m_libraryList = aList;

    SetItemCount(list.GetCount());
    SetItemCount( m_libraryList.GetCount() );

    if(  GetCount() == 0 || oldSelection < 0 || oldSelection >= GetCount() )
        SetSelection( 0, true );

    Refresh();
}


/**************************************/
/* Event table for the library list */
/**************************************/

BEGIN_EVENT_TABLE( LIBRARY_LISTBOX, ITEMS_LISTBOX_BASE )
    EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize )
    EVT_CHAR( LIBRARY_LISTBOX::OnChar )
    EVT_LIST_ITEM_SELECTED( ID_CVPCB_LIBRARY_LIST, LIBRARY_LISTBOX::OnSelectLibrary )
END_EVENT_TABLE()


/**
 * Function OnChar
 * called on a key pressed
 * Call default handler for some special keys,
 * and for "ascii" keys, select the first footprint
 * that the name starts by the letter.
 * This is the defaut behaviour of a listbox, but because we use
 * virtual lists, the listbox does not know anything to what is displayed,
 * we must handle this behaviour here.
 * Furthermore the footprint name is not at the beginning of
 * displayed lines (the first word is the line number)
 */
void LIBRARY_LISTBOX::OnChar( wxKeyEvent& event )
{
    int key = event.GetKeyCode();

    switch( key )
    {
    case WXK_TAB:
    case WXK_RIGHT:
    case WXK_NUMPAD_RIGHT:
        GetParent()->m_ListCmp->SetFocus();
        return;

    case WXK_LEFT:
    case WXK_NUMPAD_LEFT:
        GetParent()->m_FootprintList->SetFocus();
        return;

    case WXK_HOME:
    case WXK_END:
    case WXK_UP:
    case WXK_DOWN:
    case WXK_PAGEUP:
    case WXK_PAGEDOWN:
        case WXK_LEFT:
        case WXK_NUMPAD_LEFT:
        event.Skip();
        return;

    default:
        break;
    }

    // Search for an item name starting by the key code:
    key = toupper(key);
    for( unsigned ii = 0; ii < m_LibraryList.GetCount(); ii++ )

    for( unsigned ii = 0; ii < m_libraryList.GetCount(); ii++ )
    {
        wxString text = m_LibraryList.Item(ii);
        /* search for the start char of the footprint name.
         * we must skip the line number
        */
        wxString text = m_libraryList.Item( ii );

        // Search for the start char of the footprint name.  Skip the line number.
        text.Trim( false );      // Remove leading spaces in line
        unsigned jj = 0;

        for( ; jj < text.Len(); jj++ )
        {
            // skip line number
@@ -217,6 +190,7 @@ void LIBRARY_LISTBOX::OnChar( wxKeyEvent& event )
        }

        int start_char = toupper( text[jj] );

        if( key == start_char )
        {
            Focus( ii );
@@ -225,3 +199,10 @@ void LIBRARY_LISTBOX::OnChar( wxKeyEvent& event )
        }
    }
}


void LIBRARY_LISTBOX::OnSelectLibrary( wxListEvent& event )
{
    SetFocus();
    GetParent()->OnSelectComponent( event );
}
+180 −147

File changed.

Preview size limit exceeded, changes collapsed.

Loading