Commit 393e0204 authored by Wayne Stambaugh's avatar Wayne Stambaugh
Browse files

Fix cursor warping out of client when zooming bug.

* Modify algorithm to correctly calculate the virtual drawing size and
  offset required to place the drawing correctly under all conditions.
* Ignore default wxWidgets scroll keys on Windows in EDA_DRAW_PANEL key
  event handler.
parent 7c171870
Loading
Loading
Loading
Loading
+3 −19
Original line number Diff line number Diff line
@@ -87,13 +87,6 @@ void BASE_SCREEN::InitDatas()
}


/**
 * Get screen units scalar.
 *
 * Default implementation returns scalar used for schematic screen.  The
 * internal units used by the schematic screen is 1 mil (0.001").  Override
 * this in derived classes that require internal units other than 1 mil.
 */
int BASE_SCREEN::GetInternalUnits( void )
{
    return EESCHEMA_INTERNAL_UNIT;
@@ -119,23 +112,13 @@ void BASE_SCREEN::SetPageSize( wxSize& aPageSize )
}


/**
 * Function GetScalingFactor
 * @return the the current scale used to draw items on screen
 * draw coordinates are user coordinates * GetScalingFactor( )
 */
double BASE_SCREEN::GetScalingFactor() const
{
    double scale = 1.0 / GetZoom();
    return scale;
}

/**
 * Function SetScalingFactor
 * calculates the .m_Zoom member to have a given scaling factor
 * @param aScale - the the current scale used to draw items on screen
 * draw coordinates are user coordinates * GetScalingFactor()
 */

void BASE_SCREEN::SetScalingFactor(double aScale )
{
    double zoom = aScale;
@@ -152,6 +135,7 @@ void BASE_SCREEN::SetScalingFactor(double aScale )
    SetZoom( zoom );
}


void BASE_SCREEN::SetZoomList( const wxArrayDouble& zoomlist )
{
    if( !m_ZoomList.IsEmpty() )
@@ -293,7 +277,6 @@ void BASE_SCREEN::SetGrid( const wxRealPoint& size )
}


/* Set grid size from command ID. */
void BASE_SCREEN::SetGrid( int id  )
{
    wxASSERT( !m_grids.empty() );
@@ -462,6 +445,7 @@ wxPoint BASE_SCREEN::GetCrossHairScreenPosition() const
    return pos;
}


void BASE_SCREEN::SetCrossHairPosition( const wxPoint& aPosition, bool aSnapToGrid )
{
    if( aSnapToGrid )
+175 −95
Original line number Diff line number Diff line
/*****************/
/* drawframe.cpp */
/*****************/
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
 * Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
 * Copyright (C) 2004-2011 KiCad Developers, see change_log.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
 */

#ifdef __GNUG__
#pragma implementation
#endif
/**
 * @file drawframe.cpp
 */

#include "fctsys.h"
#include "appl_wxstruct.h"
@@ -23,10 +44,11 @@
#include <wx/fontdlg.h>


/* Definitions for enabling and disabling extra debugging output.  Please
 * remember to set these to 0 before committing changes to SVN.
/**
 * Definition for enabling and disabling scroll bar setting trace output.  See the
 * wxWidgets documentation on useing the WXTRACE environment variable.
 */
#define DEBUG_DUMP_SCROLLBAR_SETTINGS 0   // Set to 1 to print scroll bar settings.
static const wxString traceScrollSettings( wxT( "KicadScrollSettings" ) );


/* Configuration entry names. */
@@ -83,7 +105,7 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( wxWindow* father, int idtype, const wxString& ti
    m_Draw_Axis           = FALSE;  // TRUE to draw axis.
    m_Draw_Sheet_Ref      = FALSE;  // TRUE to display reference sheet.
    m_Print_Sheet_Ref     = TRUE;   // TRUE to print reference sheet.
    m_Draw_Auxiliary_Axis = FALSE;  // TRUE draw auxilary axis.
    m_Draw_Auxiliary_Axis = FALSE;  // TRUE draw auxiliary axis.
    m_Draw_Grid_Axis      = FALSE;  // TRUE to draw the grid axis
    m_CursorShape         = 0;
    m_LastGridSizeId      = 0;
@@ -253,44 +275,32 @@ void EDA_DRAW_FRAME::OnUpdateCrossHairStyle( wxUpdateUIEvent& aEvent )
}


// Virtual function
void EDA_DRAW_FRAME::ReCreateAuxiliaryToolbar()
{
}


// Virtual function
void EDA_DRAW_FRAME::ReCreateMenuBar()
{
}


// Virtual function
void EDA_DRAW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
{
}


// Virtual function
void EDA_DRAW_FRAME::ToolOnRightClick( wxCommandEvent& event )
{
}


/**
 * Function PrintPage (virtual)
 * used to print a page
 * this basic function must be derived to be used for printing
 * because EDA_DRAW_FRAME does not know how to print a page
 * This is the reason it is a virtual function
 */
void EDA_DRAW_FRAME::PrintPage( wxDC* aDC,int aPrintMask, bool aPrintMirrorMode, void* aData )
{
    wxMessageBox( wxT("EDA_DRAW_FRAME::PrintPage() error") );
}


// Virtual function
void EDA_DRAW_FRAME::OnSelectGrid( wxCommandEvent& event )
{
    int* clientData;
@@ -352,14 +362,6 @@ void EDA_DRAW_FRAME::OnSelectGrid( wxCommandEvent& event )
}


/**
 * Set the zoom when selected by the Zoom List Box
 *  Note:
 *      position 0 = Fit in Page
 *      position >= 1 = zoom (1 to zoom max)
 *      last position : special zoom
 *      virtual function
 */
void EDA_DRAW_FRAME::OnSelectZoom( wxCommandEvent& event )
{
    if( m_SelZoomBox == NULL )
@@ -388,7 +390,6 @@ void EDA_DRAW_FRAME::OnSelectZoom( wxCommandEvent& event )
}


/* Return the current zoom level */
double EDA_DRAW_FRAME::GetZoom( void )
{
    return GetScreen()->GetZoom();
@@ -401,7 +402,6 @@ void EDA_DRAW_FRAME::OnMouseEvent( wxMouseEvent& event )
}


// Virtual
void EDA_DRAW_FRAME::OnLeftDClick( wxDC* DC, const wxPoint& MousePos )
{
}
@@ -413,8 +413,6 @@ void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
}


/* Display current unit Selection on Statusbar
 */
void EDA_DRAW_FRAME::DisplayUnitsMsg()
{
    wxString msg;
@@ -439,8 +437,6 @@ void EDA_DRAW_FRAME::DisplayUnitsMsg()



/* Recalculate the size of toolbars and display panel.
 */
void EDA_DRAW_FRAME::OnSize( wxSizeEvent& SizeEv )
{
    m_FrameSize = GetClientSize( );
@@ -470,10 +466,6 @@ void EDA_DRAW_FRAME::SetToolID( int aId, int aCursor, const wxString& aToolMsg )
}


/*****************************/
/* default virtual functions */
/*****************************/

void EDA_DRAW_FRAME::OnGrid( int grid_type )
{
}
@@ -517,41 +509,134 @@ bool EDA_DRAW_FRAME::HandleBlockEnd( wxDC* DC )
void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPosition )
{
    int     unitsX, unitsY, posX, posY;
    wxSize  drawingSize, clientSize;
    wxSize  clientSize, logicalClientSize, virtualSize;
    BASE_SCREEN* screen = GetScreen();
    bool noRefresh = true;

    if( screen == NULL || DrawPanel == NULL )
        return;

    // The drawing size is twice the current page size.
    drawingSize = screen->ReturnPageSize() * 2;
    double scalar = screen->GetScalingFactor();

    wxLogTrace( traceScrollSettings, wxT( "Center Position = ( %d, %d ), scalar = %0.5f." ),
                aCenterPosition.x, aCenterPosition.y, scalar );

    // Calculate the portion of the drawing that can be displayed in the
    // client area at the current zoom level.
    clientSize = DrawPanel->GetClientSize();

    double scalar = screen->GetScalingFactor();
    clientSize.x = wxRound( (double) clientSize.x / scalar );
    clientSize.y = wxRound( (double) clientSize.y / scalar );
    // The logical size of the client window.
    logicalClientSize.x = wxRound( (double) clientSize.x / scalar );
    logicalClientSize.y = wxRound( (double) clientSize.y / scalar );

    // The upper left corner of the drawing in device units.
    int w = screen->ReturnPageSize().x;
    int h = screen->ReturnPageSize().y;

    /* Adjust drawing size when zooming way out to prevent centering around
     * cursor problems. */
    if( clientSize.x > drawingSize.x || clientSize.y > drawingSize.y )
        drawingSize = clientSize;
    // The drawing rectangle logical units
    wxRect drawingRect( wxPoint( 0, 0 ),  wxSize( w, h ) );

    wxLogTrace( traceScrollSettings, wxT( "Logical drawing rect = ( %d, %d, %d, %d )." ),
                drawingRect.x, drawingRect.y, drawingRect.width, drawingRect.height );
    wxLogTrace( traceScrollSettings, wxT( "   left %d, right %d, top %d, bottome %d" ),
                drawingRect.GetLeft(), drawingRect.GetRight(),
                drawingRect.GetTop(), drawingRect.GetBottom() );

    // The size of the client rectangle in logical units.
    int x = wxRound( (double) aCenterPosition.x - ( (double) logicalClientSize.x / 2.0 ) );
    int y = wxRound( (double) aCenterPosition.y - ( (double) logicalClientSize.y / 2.0 ) );

    // If drawn around the center, adjust the client rectangle accordingly.
    if( screen->m_Center )
    {
        x += wxRound( (double) drawingRect.width / 2.0 );
        y += wxRound( (double) drawingRect.height / 2.0 );
    }

    wxRect logicalClientRect( wxPoint( x, y ), logicalClientSize );

    wxLogTrace( traceScrollSettings, wxT( "Logical client rect = ( %d, %d, %d, %d )." ),
                logicalClientRect.x, logicalClientRect.y,
                logicalClientRect.width, logicalClientRect.height );
    wxLogTrace( traceScrollSettings, wxT( "   left %d, right %d, top %d, bottome %d" ),
                logicalClientRect.GetLeft(), logicalClientRect.GetRight(),
                logicalClientRect.GetTop(), logicalClientRect.GetBottom() );

    if( drawingRect == logicalClientRect )
    {
        virtualSize = drawingRect.GetSize();
    }
    else if( drawingRect.Contains( logicalClientRect ) )
    {
        virtualSize = drawingRect.GetSize();
    }
    else
    {
        int drawingCenterX = drawingRect.x + ( drawingRect.width / 2 );
        int clientCenterX = logicalClientRect.x + ( logicalClientRect.width / 2 );
        int drawingCenterY = drawingRect.y + ( drawingRect.height / 2 );
        int clientCenterY = logicalClientRect.y + ( logicalClientRect.height / 2 );

        if( logicalClientRect.width > drawingRect.width )
        {
            if( drawingCenterX > clientCenterX )
                virtualSize.x = ( drawingCenterX - logicalClientRect.GetLeft() ) * 2;
            else if( drawingCenterX < clientCenterX )
                virtualSize.x = ( logicalClientRect.GetRight() - drawingCenterX ) * 2;
            else
                virtualSize.x = logicalClientRect.width;
        }
        else if( logicalClientRect.width < drawingRect.width )
        {
            if( drawingCenterX > clientCenterX )
                virtualSize.x = drawingRect.width +
                                ( (drawingRect.GetLeft() - logicalClientRect.GetLeft() ) * 2 );
            else if( drawingCenterX < clientCenterX )
                virtualSize.x = drawingRect.width +
                                ( (logicalClientRect.GetRight() - drawingRect.GetRight() ) * 2 );
            else
                virtualSize.x = drawingRect.width;
        }
        else
        {
            virtualSize.x = drawingRect.width;
        }

    drawingSize.x += wxRound( (double) clientSize.x / 2.0 );
    drawingSize.y += wxRound( (double) clientSize.y / 2.0 );
        if( logicalClientRect.height > drawingRect.height )
        {
            if( drawingCenterY > clientCenterY )
                virtualSize.y = ( drawingCenterY - logicalClientRect.GetTop() ) * 2;
            else if( drawingCenterY < clientCenterY )
                virtualSize.y = ( logicalClientRect.GetBottom() - drawingCenterY ) * 2;
            else
                virtualSize.y = logicalClientRect.height;
        }
        else if( logicalClientRect.height < drawingRect.height )
        {
            if( drawingCenterY > clientCenterY )
                virtualSize.y = drawingRect.height +
                                ( ( drawingRect.GetTop() - logicalClientRect.GetTop() ) * 2 );
            else if( drawingCenterY < clientCenterY )
                virtualSize.y = drawingRect.height +
                                ( ( logicalClientRect.GetBottom() - drawingRect.GetBottom() ) * 2 );
            else
                virtualSize.y = drawingRect.height;
        }
        else
        {
            virtualSize.y = drawingRect.height;
        }
    }

    if( screen->m_Center )
    {
        screen->m_DrawOrg.x = -wxRound( (double) drawingSize.x / 2.0 );
        screen->m_DrawOrg.y = -wxRound( (double) drawingSize.y / 2.0 );
        screen->m_DrawOrg.x = -( wxRound( (double) virtualSize.x / 2.0 ) );
        screen->m_DrawOrg.y = -( wxRound( (double) virtualSize.y / 2.0 ) );
    }
    else
    {
        screen->m_DrawOrg.x = -wxRound( (double) clientSize.x / 2.0 );
        screen->m_DrawOrg.y = -wxRound( (double) clientSize.y / 2.0 );
        screen->m_DrawOrg.x = -( wxRound( (double) (virtualSize.x - drawingRect.width) / 2.0 ) );
        screen->m_DrawOrg.y = -( wxRound( (double) (virtualSize.y - drawingRect.height) / 2.0 ) );
    }

    /* Always set scrollbar pixels per unit to 1 unless you want the zoom
@@ -562,36 +647,57 @@ void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPosition )
     */
    screen->m_ScrollPixelsPerUnitX = screen->m_ScrollPixelsPerUnitY = 1;

    // Calculate the number of scroll bar units for the given zoom level. */
    unitsX = wxRound( (double) drawingSize.x * scalar );
    unitsY = wxRound( (double) drawingSize.y * scalar );
    // Calculate the number of scroll bar units for the given zoom level in device units.
    unitsX = wxRound( (double) virtualSize.x * scalar );
    unitsY = wxRound( (double) virtualSize.y * scalar );

    // Calculate the position, place the cursor at the center of screen.
    // Calculate the scroll bar position in logical units to place the center position at
    // the center of client rectangle.
    screen->SetScrollCenterPosition( aCenterPosition );
    posX = aCenterPosition.x - screen->m_DrawOrg.x;
    posY = aCenterPosition.y - screen->m_DrawOrg.y;
    posX = aCenterPosition.x - wxRound( (double) logicalClientRect.width / 2.0 ) -
           screen->m_DrawOrg.x;
    posY = aCenterPosition.y - wxRound( (double) logicalClientRect.height / 2.0 ) -
           screen->m_DrawOrg.y;

    posX -= wxRound( (double) clientSize.x / 2.0 );
    posY -= wxRound( (double) clientSize.y / 2.0 );
    // Convert scroll bar position to device units.
    posX = wxRound( (double) posX * scalar );
    posY = wxRound( (double) posY * scalar );

    if( posX < 0 )
    {
        wxLogTrace( traceScrollSettings, wxT( "Required scroll bar X position %d" ), posX );
        posX = 0;
    }

    if( posX > unitsX )
    {
        wxLogTrace( traceScrollSettings, wxT( "Required scroll bar X position %d" ), posX );
        posX = unitsX;
    }

    if( posY < 0 )
    {
        wxLogTrace( traceScrollSettings, wxT( "Required scroll bar Y position %d" ), posY );
        posY = 0;
    }

    posX = wxRound( (double) posX * scalar );
    posY = wxRound( (double) posY * scalar );
    if( posY > unitsY )
    {
        wxLogTrace( traceScrollSettings, wxT( "Required scroll bar Y position %d" ), posY );
        posY = unitsY;
    }

    screen->m_ScrollbarPos = wxPoint( posX, posY );
    screen->m_ScrollbarNumber = wxSize( unitsX, unitsY );

#if DEBUG_DUMP_SCROLLBAR_SETTINGS
    wxLogDebug( wxT( "SetScrollbars(%d, %d, %d, %d, %d, %d)" ),
    wxLogTrace( traceScrollSettings,
                wxT( "Drawing = (%d, %d), Client = (%d, %d), Offset = (%d, %d), \
SetScrollbars(%d, %d, %d, %d, %d, %d)" ),
                virtualSize.x, virtualSize.y, logicalClientSize.x, logicalClientSize.y,
                screen->m_DrawOrg.x, screen->m_DrawOrg.y,
                screen->m_ScrollPixelsPerUnitX, screen->m_ScrollPixelsPerUnitY,
                screen->m_ScrollbarNumber.x, screen->m_ScrollbarNumber.y,
                screen->m_ScrollbarPos.x, screen->m_ScrollbarPos.y );
#endif

    DrawPanel->SetScrollbars( screen->m_ScrollPixelsPerUnitX,
                              screen->m_ScrollPixelsPerUnitY,
@@ -602,11 +708,6 @@ void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPosition )
}


/**
 * Function SetLanguage
 * called on a language menu selection
 * when using a derived function, do not forget to call this one
 */
void EDA_DRAW_FRAME::SetLanguage( wxCommandEvent& event )
{
    EDA_BASE_FRAME::SetLanguage( event );
@@ -644,15 +745,6 @@ double RoundTo0( double x, double precision )
}


/**
 * Function UpdateStatusBar
 * Displays in the bottom of the main window a stust:
 *  - Absolute Cursor coordinates
 *  - Relative Cursor coordinates (relative to the last coordinate stored
 *     when actiavte the space bar)
 * ( in this status is also displayed the zoom level, but this is not made
 *   by this function )
 */
void EDA_DRAW_FRAME::UpdateStatusBar()
{
    wxString        Line;
@@ -740,12 +832,6 @@ void EDA_DRAW_FRAME::UpdateStatusBar()
}


/**
 * Load draw frame specific configuration settings.
 *
 * Don't forget to call this base method from any derived classes or the
 * settings will not get loaded.
 */
void EDA_DRAW_FRAME::LoadSettings()
{
    wxASSERT( wxGetApp().m_EDA_Config != NULL );
@@ -768,12 +854,6 @@ void EDA_DRAW_FRAME::LoadSettings()
}


/**
 * Save draw frame specific configuration settings.
 *
 * Don't forget to call this base method from any derived classes or the
 * settings will not get saved.
 */
void EDA_DRAW_FRAME::SaveSettings()
{
    wxASSERT( wxGetApp().m_EDA_Config != NULL );
+18 −1
Original line number Diff line number Diff line
@@ -1162,7 +1162,24 @@ void EDA_DRAW_PANEL::OnKeyEvent( wxKeyEvent& event )
    GetParent()->GeneralControl( &DC, pos, localkey );

#ifdef __WINDOWS__
    // Disable the default scrolling command keys which break KiCad's zooming and
    // panning.  This is also likely the reason skip was disabled for other platforms.
    // There probably needs to be some more investigation done here.
    switch( event.GetKeyCode() )
    {
    case WXK_HOME:
    case WXK_END:
    case WXK_PAGEUP:
    case WXK_PAGEDOWN:
    case WXK_UP:
    case WXK_DOWN:
    case WXK_LEFT:
    case WXK_RIGHT:
        break;

    default:
        event.Skip();   // Allow menu shortcut processing on Windows.
    }
#endif
}

+34 −37
Original line number Diff line number Diff line
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
 * Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
 * Copyright (C) 2004-2011 KiCad Developers, see change_log.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 viewlib_frame.cpp
 */
@@ -24,13 +49,11 @@ wxString LIB_VIEW_FRAME::m_entryName;
int LIB_VIEW_FRAME::m_unit = 1;
int LIB_VIEW_FRAME::m_convert = 1;

// When the viewer is used to select a component in schematic, the selected component is here.

/// When the viewer is used to select a component in schematic, the selected component is here.
wxString LIB_VIEW_FRAME::m_exportToEeschemaCmpName;


/*****************************/
/* class WinEDA_ViewlibFrame */
/*****************************/
BEGIN_EVENT_TABLE( LIB_VIEW_FRAME, EDA_DRAW_FRAME )
    /* Window events */
    EVT_CLOSE( LIB_VIEW_FRAME::OnCloseWindow )
@@ -212,7 +235,7 @@ LIB_VIEW_FRAME::LIB_VIEW_FRAME( wxWindow* father, CMP_LIBRARY* Library, wxSemaph
                      wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom().Layer(10) );

    /* Now the minimum windows are fixed, set library list
    and component list of the previous values from last viewlib use
     * and component list of the previous values from last viewlib use
     */
    if( m_LibListWindow )
    {
@@ -253,15 +276,13 @@ void LIB_VIEW_FRAME::OnCloseWindow( wxCloseEvent& Event )
        // This window will be destroyed by the calling function,
        // to avoid side effects
    }

    else
    {
        Destroy();
    }
}


/*
 * Resize sub windows when dragging a sash window border
 */
void LIB_VIEW_FRAME::OnSashDrag( wxSashEvent& event )
{
    if( event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE )
@@ -358,12 +379,6 @@ double LIB_VIEW_FRAME::BestZoom()
}


/**
 * Function ReCreateListLib
 *
 * Creates or recreates the list of current loaded libraries.
 * This list is sorted, with the library cache always at end of the list
 */
void LIB_VIEW_FRAME::ReCreateListLib()
{
    if( m_LibList == NULL )
@@ -475,10 +490,6 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event )
}



/*
 * Export the current component to schematic and close the library browser
 */
void LIB_VIEW_FRAME::ExportToSchematicLibraryPart( wxCommandEvent& event )
{
    int ii = m_CmpList->GetSelection();
@@ -496,12 +507,6 @@ void LIB_VIEW_FRAME::ExportToSchematicLibraryPart( wxCommandEvent& event )
#define CMPLIST_WIDTH_KEY wxT( "Cmplist_width" )


/**
 * Load library viewer frame specific configuration settings.
 *
 * Don't forget to call this base method from any derived classes or the
 * settings will not get loaded.
 */
void LIB_VIEW_FRAME::LoadSettings( )
{
    wxConfig* cfg ;
@@ -526,12 +531,6 @@ void LIB_VIEW_FRAME::LoadSettings( )
}


/**
 * Save library viewer frame specific configuration settings.
 *
 * Don't forget to call this base method from any derived classes or the
 * settings will not get saved.
 */
void LIB_VIEW_FRAME::SaveSettings()
{
    wxConfig* cfg;
@@ -547,9 +546,7 @@ void LIB_VIEW_FRAME::SaveSettings()
    cfg->Write( CMPLIST_WIDTH_KEY, m_CmpListSize.x );
}

/** Called on activate the frame.
 * Reload the libraries lists that can be changed by the schematic editor or the library editor
 */

void LIB_VIEW_FRAME::OnActivate( wxActivateEvent& event )
{
    EDA_DRAW_FRAME::OnActivate( event );
+68 −2
Original line number Diff line number Diff line
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
 * Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
 * Copyright (C) 2004-2011 KiCad Developers, see change_log.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 viewlib_frame.h
 */

#ifndef __LIBVIEWFRM_H__
#define __LIBVIEWFRM_H__

@@ -50,8 +79,22 @@ public:
    ~LIB_VIEW_FRAME();

    void OnSize( wxSizeEvent& event );

    /**
     * Function OnSashDrag
     * resizes the child windows when dragging a sash window border.
     */

    void OnSashDrag( wxSashEvent& event );

    /**
     * Function ReCreateListLib
     *
     * Creates or recreates the list of current loaded libraries.
     * This list is sorted, with the library cache always at end of the list
     */
    void ReCreateListLib();

    void ReCreateListCmp();
    void Process_Special_Functions( wxCommandEvent& event );
    void DisplayLibInfos();
@@ -69,7 +112,22 @@ public:

    void GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey = 0 );

    /**
     * Function LoadSettings
     * loads the library viewer frame specific configuration settings.
     *
     * Don't forget to call this base method from any derived classes or the
     * settings will not get loaded.
     */
    void LoadSettings();

    /**
     * Function SaveSettings
     * save library viewer frame specific configuration settings.
     *
     * Don't forget to call this base method from any derived classes or the
     * settings will not get saved.
     */
    void SaveSettings();

    wxString& GetEntryName( void ) const { return m_entryName; }
@@ -79,12 +137,20 @@ public:
    int  GetConvert( void ) { return m_convert; }

private:
    /** OnActivate event funtion( virtual )
    /**
     * Function OnActivate
     * is called when the frame frame is activate to reload the libraries and component lists
     * that can be changed by the schematic editor or the library editor.
     */
    virtual void OnActivate( wxActivateEvent& event );

    void SelectCurrentLibrary();
    void SelectAndViewLibraryPart( int option );

    /**
     * Function ExportToSchematicLibraryPart
     * exports the current component to schematic and close the library browser.
     */
    void ExportToSchematicLibraryPart( wxCommandEvent& event );
    void ViewOneLibraryContent( CMP_LIBRARY* Lib, int Flag );
    bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu );
Loading