Commit 22f66571 authored by charras's avatar charras
Browse files

Fixed bad 3D png pictures (return to an old code). Seems specific to wxGTK.

enhancement in Cvpcb: fast selection of components or footprint by typing the first letter of reference or footprint name
parent b739b227
Loading
Loading
Loading
Loading
+10 −24
Original line number Original line Diff line number Diff line
@@ -77,12 +77,8 @@ Pcb3D_GLCanvas::Pcb3D_GLCanvas( WinEDA3D_DrawFrame* parent ) :
#if wxCHECK_VERSION( 2, 9, 0 )
#if wxCHECK_VERSION( 2, 9, 0 )
    // Explicitly create a new rendering context instance for this canvas.
    // Explicitly create a new rendering context instance for this canvas.
    m_glRC = new wxGLContext(this);
    m_glRC = new wxGLContext(this);

    // Make the new context current (activate it for use) with this canvas.
    SetCurrent(*m_glRC);
#else
    SetCurrent( );
#endif
#endif

    DisplayStatus();
    DisplayStatus();
}
}


@@ -636,25 +632,13 @@ void Pcb3D_GLCanvas::TakeScreenshot( wxCommandEvent& event )


    Redraw( true );
    Redraw( true );


    struct vieport_params
    wxSize     image_size = GetClientSize();
    {
    wxClientDC dc( this );
        GLint originx;
    wxBitmap   bitmap( image_size.x, image_size.y );
        GLint originy;
    wxMemoryDC memdc;
        GLint x;
    memdc.SelectObject( bitmap );
        GLint y;
    memdc.Blit( 0, 0, image_size.x, image_size.y, &dc, 0, 0 );
    } viewport;
    memdc.SelectObject( wxNullBitmap );

    glGetIntegerv( GL_VIEWPORT, (GLint*) &viewport );

    unsigned char* pixelbuffer = (unsigned char*) malloc( 3 * viewport.x * viewport.y );
    glReadPixels( 0, 0, viewport.x, viewport.y, GL_RGB, GL_UNSIGNED_BYTE, pixelbuffer );

    wxImage        image( viewport.x, viewport.y );

    image.SetData( pixelbuffer );
    image = image.Mirror();
    image = image.Rotate90().Rotate90();
    wxBitmap bitmap( image, -1 );


    if( event.GetId() == ID_TOOL_SCREENCOPY_TOCLIBBOARD )
    if( event.GetId() == ID_TOOL_SCREENCOPY_TOCLIBBOARD )
    {
    {
@@ -671,6 +655,8 @@ void Pcb3D_GLCanvas::TakeScreenshot( wxCommandEvent& event )
    }
    }
    else
    else
    {
    {
        wxImage image = bitmap.ConvertToImage();

        if( !image.SaveFile( FullFileName,
        if( !image.SaveFile( FullFileName,
                             fmt_is_jpeg ? wxBITMAP_TYPE_JPEG : wxBITMAP_TYPE_PNG ) )
                             fmt_is_jpeg ? wxBITMAP_TYPE_JPEG : wxBITMAP_TYPE_PNG ) )
            wxLogError( wxT( "Can't save file" ) );
            wxLogError( wxT( "Can't save file" ) );
+2 −1
Original line number Original line Diff line number Diff line
@@ -57,7 +57,8 @@ void Pcb3D_GLCanvas::Redraw( bool finish )
    // handler, changing the size of one canvas causes a viewport setting that
    // handler, changing the size of one canvas causes a viewport setting that
    // is wrong when next another canvas is repainted.
    // is wrong when next another canvas is repainted.
    const wxSize ClientSize = GetClientSize();
    const wxSize ClientSize = GetClientSize();
    // *MUST* be called after  SetCurrent( ):

    // *MUST* be called *after*  SetCurrent( ):
    glViewport( 0, 0, ClientSize.x, ClientSize.y );
    glViewport( 0, 0, ClientSize.x, ClientSize.y );


    InitGL();
    InitGL();
+2 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,8 @@ set(CVPCB_SRCS
    autosel.cpp
    autosel.cpp
    cfg.cpp
    cfg.cpp
    class_cvpcb.cpp
    class_cvpcb.cpp
	class_components_listbox.cpp
	class_footprints_listbox.cpp
    cvframe.cpp
    cvframe.cpp
    cvpcb.cpp
    cvpcb.cpp
    dialog_cvpcb_config.cpp
    dialog_cvpcb_config.cpp
+166 −0
Original line number Original line Diff line number Diff line
/*************************************************************************/
/* listboxes.cpp: class for displaying footprint list and component list */
/*************************************************************************/

#include "fctsys.h"
#include "wxstruct.h"
#include "common.h"
#include "id.h"

#include "cvpcb.h"
#include "protos.h"
#include "cvstruct.h"


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

COMPONENTS_LISTBOX::COMPONENTS_LISTBOX( WinEDA_CvpcbFrame* parent, wxWindowID id,
                                        const wxPoint& loc, const wxSize& size,
                                        int nbitems, wxString choice[] ) :
    ITEMS_LISTBOX_BASE( parent, id, loc, size )
{
}


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 )
END_EVENT_TABLE()


void COMPONENTS_LISTBOX::Clear()
{
    m_ComponentList.Clear();
    SetItemCount( 0 );
}


int COMPONENTS_LISTBOX::GetCount()
{
    return m_ComponentList.Count();
}


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;
}


void COMPONENTS_LISTBOX::AppendLine( const wxString& text )
{
    m_ComponentList.Add( text );
    SetItemCount( m_ComponentList.Count() );
}


/*
 * 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() )
        index = GetCount() - 1;

    if( (index >= 0) && (GetCount() > 0) )
    {
#ifndef __WXMAC__
        Select( index, State );
#endif
        EnsureVisible( index );
#ifdef __WXMAC__
        Refresh();
#endif
    }
}


/** 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_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;

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

        default:
             break;
    }

    // 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
        */
        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 );
            SetSelection( ii, true );   // Ensure visible
            break;
        }
    }

}
+361 −0
Original line number Original line Diff line number Diff line
/*************************************************************************/
/* listboxes.cpp: class for displaying footprint list and component list */
/*************************************************************************/

#include "fctsys.h"
#include "wxstruct.h"
#include "common.h"
#include "id.h"

#include "cvpcb.h"
#include "protos.h"
#include "cvstruct.h"


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

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


FOOTPRINTS_LISTBOX::~FOOTPRINTS_LISTBOX()
{
}


/*
 * Return number of items
 */
int FOOTPRINTS_LISTBOX::GetCount()
{
    return m_ActiveFootprintList->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 >= 0 )
        (*m_ActiveFootprintList)[linecount] = text;
}


wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint()
{
    wxString FootprintName;
    int      ii = GetFirstSelected();

    if( ii >= 0 )
    {
        wxString msg = (*m_ActiveFootprintList)[ii];
        msg.Trim( TRUE );
        msg.Trim( FALSE );
        FootprintName = msg.AfterFirst( wxChar( ' ' ) );
    }

    return FootprintName;
}


void FOOTPRINTS_LISTBOX::AppendLine( const wxString& text )
{
    m_ActiveFootprintList->Add( text );
    SetItemCount( m_ActiveFootprintList->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 );
}


/*
 * Enable or disable an item
 */
void FOOTPRINTS_LISTBOX::SetSelection( unsigned index, bool State )
{
    if( (int) index >= GetCount() )
        index = GetCount() - 1;

    if( (index >= 0)  && (GetCount() > 0) )
    {
#ifndef __WXMAC__
        Select( index, State );
#endif
        EnsureVisible( index );
#ifdef __WXMAC__
        Refresh();
#endif
    }
}


void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list )
{
    wxString msg;
    int      OldSelection = GetSelection();

    m_FullFootprintList.Clear();

    BOOST_FOREACH( FOOTPRINT & footprint, list ) {
        msg.Printf( wxT( "%3d %s" ), m_FullFootprintList.GetCount() + 1,
                   footprint.m_Module.GetData() );
        m_FullFootprintList.Add( msg );
    }

    SetActiveFootprintList( TRUE );

    if( ( GetCount() == 0 )
       || ( OldSelection < 0 ) || ( OldSelection >= GetCount() ) )
        SetSelection( 0, TRUE );
    Refresh();
}


void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT*      Component,
                                                   FOOTPRINT_LIST& list )
{
    FOOTPRINT_LIST::iterator i;
    wxString msg;
    unsigned jj;
    int      OldSelection = GetSelection();
    bool     HasItem = FALSE;

    m_FilteredFootprintList.Clear();

    BOOST_FOREACH( FOOTPRINT & footprint, list ) {
        /* Search for matching footprints */
        for( jj = 0; jj < Component->m_FootprintFilter.GetCount(); jj++ )
        {
            if( !footprint.m_Module.Matches( Component->m_FootprintFilter[jj] ) )
                continue;
            msg.Printf( wxT( "%3d %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();
}


/** 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;

#ifdef __WINDOWS__

    /* 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;
        if( FullList )
            new_selection = TRUE;
        else
            new_selection = FALSE;
        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 ) )
        {
            Refresh();
        }
    }

    if( !m_UseFootprintFullList || ( m_UseFootprintFullList != old_selection ) )
    {
        GetParent()->SetStatusText( wxEmptyString, 0 );
        GetParent()->SetStatusText( wxEmptyString, 1 );
    }

    wxString msg;
    if( FullList )
        msg.Printf( _( "Footprints (All): %d" ),
                   m_ActiveFootprintList->GetCount() );
    else
        msg.Printf( _( "Footprints (filtered): %d" ),
                   m_ActiveFootprintList->GetCount() );
    GetParent()->SetStatusText( msg, 2 );
}


/**************************************/
/* 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 )
END_EVENT_TABLE()


/********************************************************/
void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
/********************************************************/
{
    FOOTPRINT* Module;
    wxString   FootprintName = GetSelectedFootprint();

    Module = GetModuleDescrByName( FootprintName, GetParent()->m_footprints );
    if( GetParent()->DrawFrame )
    {
        GetParent()->CreateScreenCmp(); /* refresh general */
    }

    if( Module )
    {
        wxString msg;
        msg = Module->m_Doc;
        GetParent()->SetStatusText( msg, 0 );

        msg  = wxT( "KeyW: " );
        msg += Module->m_KeyWord;
        GetParent()->SetStatusText( msg, 1 );
    }
}


/******************************************************/
void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event )
/******************************************************/
{
    wxString FootprintName = GetSelectedFootprint();

    GetParent()->SetNewPkg( FootprintName );
}


FOOTPRINT* GetModuleDescrByName( const wxString& FootprintName,
                                 FOOTPRINT_LIST& list )
{
    BOOST_FOREACH( FOOTPRINT & footprint, list ) {
        if( footprint.m_Module == FootprintName )
            return &footprint;
    }

    return NULL;
}


/** 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 FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event )
{
    int key = event.GetKeyCode();
    switch( key )
    {
        case WXK_LEFT:
        case WXK_NUMPAD_LEFT:
            GetParent()->m_ListCmp->SetFocus();
            return;

        case WXK_HOME:
        case WXK_END:
        case WXK_UP:
        case WXK_DOWN:
        case WXK_PAGEUP:
        case WXK_PAGEDOWN:
        case WXK_RIGHT:
        case WXK_NUMPAD_RIGHT:
            event.Skip();
            return;

        default:
            break;
    }
    // Search for an item name starting by the key code:
    key = toupper(key);
    for( unsigned ii = 0; ii < m_ActiveFootprintList->GetCount(); ii++ )
    {
        wxString text = m_ActiveFootprintList->Item(ii);
        /* search for the start char of the footprint name.
         * we must 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 );
            SetSelection( ii, true );   // Ensure visible
            break;
        }
    }

}
Loading