示例#1
0
/* Move selected sheet with the cursor.
 * Callback function use by m_mouseCaptureCallback.
 */
static void MoveOrResizeSheet( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
                               bool aErase )
{
    wxPoint        moveVector;
    BASE_SCREEN*   screen = aPanel->GetScreen();
    SCH_SHEET*     sheet = (SCH_SHEET*) screen->GetCurItem();

    if( aErase )
        sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode );

    wxPoint pos = sheet->GetPosition();

    if( sheet->IsResized() )
    {
        int width  = aPanel->GetParent()->GetCrossHairPosition().x - sheet->GetPosition().x;
        int height = aPanel->GetParent()->GetCrossHairPosition().y - sheet->GetPosition().y;

        // If the sheet doesn't have any pins, clamp the minimum size to the default values.
        width = ( width < MIN_SHEET_WIDTH ) ? MIN_SHEET_WIDTH : width;
        height = ( height < MIN_SHEET_HEIGHT ) ? MIN_SHEET_HEIGHT : height;

        if( sheet->HasPins() )
        {
            int gridSizeX = KiROUND( screen->GetGridSize().x );
            int gridSizeY = KiROUND( screen->GetGridSize().y );

            // If the sheet has pins, use the pin positions to clamp the minimum height.
            height = ( height < sheet->GetMinHeight() + gridSizeY ) ?
                     sheet->GetMinHeight() + gridSizeY : height;
            width = ( width < sheet->GetMinWidth() + gridSizeX ) ?
                    sheet->GetMinWidth() + gridSizeX : width;
        }

        wxPoint grid = aPanel->GetParent()->GetNearestGridPosition(
                        wxPoint( pos.x + width, pos.y + height ) );
        sheet->Resize( wxSize( grid.x - pos.x, grid.y - pos.y ) );
    }
    else if( sheet->IsMoving() )
    {
        moveVector = aPanel->GetParent()->GetCrossHairPosition() - pos;
        sheet->Move( moveVector );
    }

    sheet->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode );
}