Commit 28a3e584 authored by jean-pierre charras's avatar jean-pierre charras
Browse files

Added grag labels patch

parent 30a54500
Loading
Loading
Loading
Loading
+15 −16
Original line number Original line Diff line number Diff line
@@ -605,24 +605,11 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
    for( Struct = screen->EEDrawList; Struct != NULL; Struct = Struct->Next() )
    for( Struct = screen->EEDrawList; Struct != NULL; Struct = Struct->Next() )
        Struct->m_Flags = 0;
        Struct->m_Flags = 0;


    // Sel .m_Flags to selected for a wire or bus in selected area if there is
    // only one item:
    if( pickedlist->GetCount() == 1 )
    {
        Struct = (SCH_ITEM*) pickedlist->GetPickedItem( 0 );
        if( Struct->Type() == DRAW_SEGMENT_STRUCT_TYPE )
            Struct->m_Flags = SELECTED;
    }
    // Sel .m_Flags to selected for a wire or bus in selected area for a list
    // of items:
    else
    {
    for( unsigned ii = 0; ii < pickedlist->GetCount(); ii++ )
    for( unsigned ii = 0; ii < pickedlist->GetCount(); ii++ )
    {
    {
        Struct = (SCH_ITEM*) pickedlist->GetPickedItem( ii );
        Struct = (SCH_ITEM*) pickedlist->GetPickedItem( ii );
        Struct->m_Flags = SELECTED;
        Struct->m_Flags = SELECTED;
    }
    }
    }


    if( screen->m_BlockLocate.m_Command != BLOCK_DRAG )
    if( screen->m_BlockLocate.m_Command != BLOCK_DRAG )
        return;
        return;
@@ -653,6 +640,18 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
    for( unsigned ii = 0; ii < pickedlist->GetCount(); ii++ )
    for( unsigned ii = 0; ii < pickedlist->GetCount(); ii++ )
    {
    {
        Struct = (SCH_ITEM*) (SCH_ITEM*) pickedlist->GetPickedItem( ii );
        Struct = (SCH_ITEM*) (SCH_ITEM*) pickedlist->GetPickedItem( ii );
    if( ( Struct->Type() == TYPE_SCH_LABEL )
        || ( Struct->Type() == TYPE_SCH_GLOBALLABEL )
        || ( Struct->Type() == TYPE_SCH_HIERLABEL ) )
    {
            #undef STRUCT
            #define STRUCT ( (SCH_TEXT*) Struct )
        if( !screen->m_BlockLocate.Inside( STRUCT->m_Pos ) )
        {
            AddPickedItem( screen, STRUCT->m_Pos );
        }
    }

        if( Struct->Type() == TYPE_SCH_COMPONENT )
        if( Struct->Type() == TYPE_SCH_COMPONENT )
        {
        {
            // Add all pins of the selected component to list
            // Add all pins of the selected component to list
+28 −52
Original line number Original line Diff line number Diff line
@@ -54,42 +54,21 @@ void TestLabelForDangling( SCH_TEXT* label,
DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList );
DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList );




/* Returns TRUE if the point P is on the segment S.
/* Returns true if the point P is on the segment S. */
 * The segment is assumed horizontal or vertical.
bool SegmentIntersect( wxPoint aSegStart, wxPoint aSegEnd, wxPoint aTestPoint )
 */
bool SegmentIntersect( int Sx1, int Sy1, int Sx2, int Sy2,
                       int Px1, int Py1 )
{
{
    int Sxmin, Sxmax, Symin, Symax;
    wxPoint vectSeg = aSegEnd - aSegStart;  // Vector from S1 to S2
    wxPoint vectPoint = aTestPoint - aSegStart; // Vector from S1 to P


    if( Sx1 == Sx2 )          /* Line S is vertical. */
    // Use long long here to avoid overflow in calculations
    {
    if( (long long)vectSeg.x * vectPoint.y - (long long)vectSeg.y * vectPoint.x )
        Symin = MIN( Sy1, Sy2 );
        return false;        /* Cross product non-zero, vectors not parallel */
        Symax = MAX( Sy1, Sy2 );


        if( Px1 != Sx1 )
    if( ((long long)vectSeg.x * vectPoint.x + (long long)vectSeg.y * vectPoint.y) <
            return FALSE;
        ((long long)vectPoint.x * vectPoint.x + (long long)vectPoint.y * vectPoint.y) )
        return false;          /* Point not on segment */


        if( Py1 >= Symin  &&  Py1 <= Symax )
    return true;
            return TRUE;
        else
            return FALSE;
    }
    else if( Sy1 == Sy2 )    /* Line S is horizontal. */
    {
        Sxmin = MIN( Sx1, Sx2 );
        Sxmax = MAX( Sx1, Sx2 );

        if( Py1 != Sy1 )
            return FALSE;

        if( Px1 >= Sxmin && Px1 <= Sxmax )
            return TRUE;
        else
            return FALSE;
    }
    else
        return FALSE;
}
}




@@ -133,7 +112,7 @@ void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC )
                break;
                break;
            if( STRUCT->GetLayer() == LAYER_BUS )
            if( STRUCT->GetLayer() == LAYER_BUS )
            {
            {
                STRUCT->m_StartIsDangling = STRUCT->m_EndIsDangling = FALSE;
                STRUCT->m_StartIsDangling = STRUCT->m_EndIsDangling = false;
                break;
                break;
            }
            }
            break;
            break;
@@ -182,7 +161,7 @@ void TestWireForDangling( SCH_LINE* DrawRef, WinEDA_SchematicFrame* frame,
                          wxDC* DC )
                          wxDC* DC )
{
{
    DanglingEndHandle* terminal_item;
    DanglingEndHandle* terminal_item;
    bool Sdangstate = TRUE, Edangstate = TRUE;
    bool Sdangstate = true, Edangstate = true;


    for( terminal_item = ItemList; terminal_item != NULL;
    for( terminal_item = ItemList; terminal_item != NULL;
         terminal_item = terminal_item->m_Pnext )
         terminal_item = terminal_item->m_Pnext )
@@ -192,13 +171,13 @@ void TestWireForDangling( SCH_LINE* DrawRef, WinEDA_SchematicFrame* frame,


        if( (DrawRef->m_Start.x == terminal_item->m_Pos.x)
        if( (DrawRef->m_Start.x == terminal_item->m_Pos.x)
           && (DrawRef->m_Start.y == terminal_item->m_Pos.y) )
           && (DrawRef->m_Start.y == terminal_item->m_Pos.y) )
            Sdangstate = FALSE;
            Sdangstate = false;


        if( (DrawRef->m_End.x == terminal_item->m_Pos.x)
        if( (DrawRef->m_End.x == terminal_item->m_Pos.x)
           && (DrawRef->m_End.y == terminal_item->m_Pos.y) )
           && (DrawRef->m_End.y == terminal_item->m_Pos.y) )
            Edangstate = FALSE;
            Edangstate = false;


        if( (Sdangstate == FALSE) && (Edangstate == FALSE) )
        if( (Sdangstate == false) && (Edangstate == false) )
            break;
            break;
    }
    }


@@ -220,7 +199,7 @@ void TestLabelForDangling( SCH_TEXT* label, WinEDA_SchematicFrame* frame,
                           wxDC* DC )
                           wxDC* DC )
{
{
    DanglingEndHandle* terminal_item;
    DanglingEndHandle* terminal_item;
    bool dangstate = TRUE;
    bool dangstate = true;


    for( terminal_item = ItemList; terminal_item != NULL;
    for( terminal_item = ItemList; terminal_item != NULL;
         terminal_item = terminal_item->m_Pnext )
         terminal_item = terminal_item->m_Pnext )
@@ -235,16 +214,14 @@ void TestLabelForDangling( SCH_TEXT* label, WinEDA_SchematicFrame* frame,
        case SHEET_LABEL_END:
        case SHEET_LABEL_END:
            if( ( label->m_Pos.x == terminal_item->m_Pos.x )
            if( ( label->m_Pos.x == terminal_item->m_Pos.x )
               && ( label->m_Pos.y == terminal_item->m_Pos.y ) )
               && ( label->m_Pos.y == terminal_item->m_Pos.y ) )
                dangstate = FALSE;
                dangstate = false;
            break;
            break;


        case WIRE_START_END:
        case WIRE_START_END:
        case BUS_START_END:
        case BUS_START_END:
            dangstate = !SegmentIntersect( terminal_item->m_Pos.x,
            dangstate = !SegmentIntersect( terminal_item->m_Pos,
                                           terminal_item->m_Pos.y,
                                           terminal_item->m_Pnext->m_Pos,
                                           terminal_item->m_Pnext->m_Pos.x,
                                           label->m_Pos );
                                           terminal_item->m_Pnext->m_Pos.y,
                                           label->m_Pos.x, label->m_Pos.y );
            terminal_item = terminal_item->m_Pnext;
            terminal_item = terminal_item->m_Pnext;
            break;
            break;


@@ -256,7 +233,7 @@ void TestLabelForDangling( SCH_TEXT* label, WinEDA_SchematicFrame* frame,
            break;
            break;
        }
        }


        if( dangstate == FALSE )
        if( dangstate == false )
            break;
            break;
    }
    }


@@ -417,8 +394,7 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList )
        {
        {
            SCH_SHEET* sheet = (SCH_SHEET*) DrawItem;
            SCH_SHEET* sheet = (SCH_SHEET*) DrawItem;


            BOOST_FOREACH( SCH_SHEET_PIN pinsheet, sheet->GetSheetPins() )
            BOOST_FOREACH( SCH_SHEET_PIN pinsheet, sheet->GetSheetPins() ) {
            {
                wxASSERT( pinsheet.Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE );
                wxASSERT( pinsheet.Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE );


                item = new DanglingEndHandle( SHEET_LABEL_END );
                item = new DanglingEndHandle( SHEET_LABEL_END );
+4 −1
Original line number Original line Diff line number Diff line
@@ -578,10 +578,13 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
                wxPostEvent( this, eventMoveOrDragComponent );
                wxPostEvent( this, eventMoveOrDragComponent );
                break;
                break;


            case TYPE_SCH_TEXT:
            case TYPE_SCH_LABEL:
            case TYPE_SCH_LABEL:
            case TYPE_SCH_GLOBALLABEL:
            case TYPE_SCH_GLOBALLABEL:
            case TYPE_SCH_HIERLABEL:
            case TYPE_SCH_HIERLABEL:
                wxPostEvent( this, eventMoveOrDragComponent );
            break;

            case TYPE_SCH_TEXT:
            case DRAW_PART_TEXT_STRUCT_TYPE:
            case DRAW_PART_TEXT_STRUCT_TYPE:
            case DRAW_BUSENTRY_STRUCT_TYPE:
            case DRAW_BUSENTRY_STRUCT_TYPE:
                if( HK_Descr->m_Idcommand != HK_DRAG )
                if( HK_Descr->m_Idcommand != HK_DRAG )
+1 −3
Original line number Original line Diff line number Diff line
@@ -1031,9 +1031,7 @@ static void SegmentToPointConnect( NETLIST_OBJECT* Jonction,
                continue;
                continue;
        }
        }


        if( SegmentIntersect( Segment->m_Start.x, Segment->m_Start.y,
        if( SegmentIntersect( Segment->m_Start, Segment->m_End, Jonction->m_Start ) )
                              Segment->m_End.x, Segment->m_End.y,
                              Jonction->m_Start.x, Jonction->m_Start.y ) )
        {
        {
            /* Propagation Netcode has all the objects of the same Netcode. */
            /* Propagation Netcode has all the objects of the same Netcode. */
            if( IsBus == 0 )
            if( IsBus == 0 )
+9 −0
Original line number Original line Diff line number Diff line
@@ -342,6 +342,9 @@ void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel )
        msg = AddHotkeyName( _( "Move Global Label" ), s_Schematic_Hokeys_Descr,
        msg = AddHotkeyName( _( "Move Global Label" ), s_Schematic_Hokeys_Descr,
                             HK_MOVE_COMPONENT_OR_ITEM );
                             HK_MOVE_COMPONENT_OR_ITEM );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm );
        msg = AddHotkeyName( _( "Drag Global Label" ), s_Schematic_Hokeys_Descr,
                             HK_DRAG );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_CMP_REQUEST, msg, move_text_xpm );
        msg = AddHotkeyName( _( "Copy Global Label" ), s_Schematic_Hokeys_Descr,
        msg = AddHotkeyName( _( "Copy Global Label" ), s_Schematic_Hokeys_Descr,
                             HK_COPY_COMPONENT_OR_LABEL );
                             HK_COPY_COMPONENT_OR_LABEL );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, copy_button );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, copy_button );
@@ -376,6 +379,9 @@ void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel )
        msg = AddHotkeyName( _( "Move Hierarchical Label" ), s_Schematic_Hokeys_Descr,
        msg = AddHotkeyName( _( "Move Hierarchical Label" ), s_Schematic_Hokeys_Descr,
                             HK_MOVE_COMPONENT_OR_ITEM );
                             HK_MOVE_COMPONENT_OR_ITEM );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm );
        msg = AddHotkeyName( _( "Drag Hierarchical Label" ), s_Schematic_Hokeys_Descr,
                             HK_DRAG );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_CMP_REQUEST, msg, move_text_xpm );
        msg = AddHotkeyName( _( "Copy Hierarchical Label" ), s_Schematic_Hokeys_Descr,
        msg = AddHotkeyName( _( "Copy Hierarchical Label" ), s_Schematic_Hokeys_Descr,
                             HK_COPY_COMPONENT_OR_LABEL );
                             HK_COPY_COMPONENT_OR_LABEL );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, copy_button );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, copy_button );
@@ -409,6 +415,9 @@ void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label )
        msg = AddHotkeyName( _( "Move Label" ), s_Schematic_Hokeys_Descr,
        msg = AddHotkeyName( _( "Move Label" ), s_Schematic_Hokeys_Descr,
                             HK_MOVE_COMPONENT_OR_ITEM );
                             HK_MOVE_COMPONENT_OR_ITEM );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm );
        msg = AddHotkeyName( _( "Drag Label" ), s_Schematic_Hokeys_Descr,
                             HK_DRAG );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_CMP_REQUEST, msg, move_text_xpm );
        msg = AddHotkeyName( _( "Copy Label" ), s_Schematic_Hokeys_Descr,
        msg = AddHotkeyName( _( "Copy Label" ), s_Schematic_Hokeys_Descr,
                             HK_COPY_COMPONENT_OR_LABEL );
                             HK_COPY_COMPONENT_OR_LABEL );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, copy_button );
        ADD_MENUITEM( PopMenu, ID_POPUP_SCH_COPY_ITEM, msg, copy_button );
Loading