Commit f87f12e2 authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Added TOOL_ACTION for updating EDIT_POINTS.

EDIT_POINTs show up when there is only one item selected (now after deselection as well).
parent c5c83bd2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -99,6 +99,9 @@ TOOL_ACTION COMMON_ACTIONS::routerActivate( "pcbnew.InteractiveRouter",
        AS_GLOBAL, 0,
        "Run push & shove router", "Run push & shove router" );

TOOL_ACTION COMMON_ACTIONS::pointEditorUpdate( "pcbnew.PointEditor.update",
        AS_GLOBAL, 0, "", "" );    // No description, it is not supposed to be shown anywhere


std::string COMMON_ACTIONS::TranslateLegacyId( int aId )
{
+3 −0
Original line number Diff line number Diff line
@@ -87,6 +87,9 @@ public:
    /// Activation of the Push and Shove router
    static TOOL_ACTION routerActivate;

    /// Update edit points
    static TOOL_ACTION pointEditorUpdate;

    /**
     * Function TranslateLegacyId()
     * Translates legacy tool ids to the corresponding TOOL_ACTION name.
+20 −14
Original line number Diff line number Diff line
@@ -37,13 +37,13 @@ class EDIT_POINT;
class EDIT_POINT_CONSTRAINT
{
public:
    EDIT_POINT_CONSTRAINT( EDIT_POINT* aConstrained ) : m_constrained( aConstrained ) {};
    EDIT_POINT_CONSTRAINT( EDIT_POINT& aConstrained ) : m_constrained( aConstrained ) {};
    virtual ~EDIT_POINT_CONSTRAINT() {};

    virtual void Apply() = 0;

protected:
    EDIT_POINT* m_constrained;
    EDIT_POINT& m_constrained;
};


@@ -53,6 +53,7 @@ class EDIT_POINT
public:
    EDIT_POINT( const VECTOR2I& aPoint ) :
        m_point( aPoint ), m_constraint( NULL ) {};

    ~EDIT_POINT()
    {
        delete m_constraint;
@@ -121,6 +122,11 @@ public:
     */
    EDIT_POINT* FindPoint( const VECTOR2I& aLocation );

    EDA_ITEM* GetParent() const
    {
        return m_parent;
    }

    void Add( const EDIT_POINT& aPoint )
    {
        m_points.push_back( aPoint );
@@ -172,7 +178,7 @@ private:
class EPC_VERTICAL : public EDIT_POINT_CONSTRAINT
{
public:
    EPC_VERTICAL( EDIT_POINT* aConstrained, EDIT_POINT& aConstrainer ) :
    EPC_VERTICAL( EDIT_POINT& aConstrained, EDIT_POINT& aConstrainer ) :
        EDIT_POINT_CONSTRAINT( aConstrained ), m_constrainer( aConstrainer )
    {}

@@ -180,9 +186,9 @@ public:

    virtual void Apply()
    {
        VECTOR2I point = m_constrained->GetPosition();
        VECTOR2I point = m_constrained.GetPosition();
        point.x = m_constrainer.GetPosition().x;
        m_constrained->SetPosition( point );
        m_constrained.SetPosition( point );
    }

    virtual std::list<EDIT_POINT*> GetConstrainers() const
@@ -198,7 +204,7 @@ private:
class EPC_HORIZONTAL : public EDIT_POINT_CONSTRAINT
{
public:
    EPC_HORIZONTAL( EDIT_POINT* aConstrained, EDIT_POINT& aConstrainer ) :
    EPC_HORIZONTAL( EDIT_POINT& aConstrained, const EDIT_POINT& aConstrainer ) :
        EDIT_POINT_CONSTRAINT( aConstrained ), m_constrainer( aConstrainer )
    {}

@@ -206,20 +212,20 @@ public:

    virtual void Apply()
    {
        VECTOR2I point = m_constrained->GetPosition();
        VECTOR2I point = m_constrained.GetPosition();
        point.y = m_constrainer.GetPosition().y;
        m_constrained->SetPosition( point );
        m_constrained.SetPosition( point );
    }

private:
    EDIT_POINT& m_constrainer;
    const EDIT_POINT& m_constrainer;
};


class EPC_CIRCLE : public EDIT_POINT_CONSTRAINT
{
public:
    EPC_CIRCLE( EDIT_POINT* aConstrained, EDIT_POINT& aCenter, EDIT_POINT& aEnd ) :
    EPC_CIRCLE( EDIT_POINT& aConstrained, const EDIT_POINT& aCenter, const EDIT_POINT& aEnd ) :
        EDIT_POINT_CONSTRAINT( aConstrained ), m_center( aCenter ), m_end( aEnd )
    {}

@@ -228,7 +234,7 @@ public:
    virtual void Apply()
    {
        VECTOR2I centerToEnd = m_end.GetPosition() - m_center.GetPosition();
        VECTOR2I centerToPoint = m_constrained->GetPosition() - m_center.GetPosition();
        VECTOR2I centerToPoint = m_constrained.GetPosition() - m_center.GetPosition();

        int radius = centerToEnd.EuclideanNorm();
        double angle = centerToPoint.Angle();
@@ -236,12 +242,12 @@ public:
        VECTOR2I newLine( radius, 0 );
        newLine = newLine.Rotate( angle );

        m_constrained->SetPosition( m_center.GetPosition() + newLine );
        m_constrained.SetPosition( m_center.GetPosition() + newLine );
    }

private:
    EDIT_POINT& m_center;
    EDIT_POINT& m_end;
    const EDIT_POINT& m_center;
    const EDIT_POINT& m_end;
};

#endif /* EDIT_POINTS_H_ */
+13 −7
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ int EDIT_TOOL::Main( TOOL_EVENT& aEvent )

            selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
            dragPosition = controls->GetCursorPosition();
            m_toolMgr->RunAction( COMMON_ACTIONS::pointEditorUpdate );
        }

        else if( evt->IsMouseUp( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) )
@@ -233,6 +234,7 @@ int EDIT_TOOL::Properties( TOOL_EVENT& aEvent )
            m_toolMgr->RunAction( COMMON_ACTIONS::selectionClear );
    }

    m_toolMgr->RunAction( COMMON_ACTIONS::pointEditorUpdate );
    setTransitions();

    return 0;
@@ -268,9 +270,6 @@ int EDIT_TOOL::Rotate( TOOL_EVENT& aEvent )
            item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
    }

    setTransitions();
    updateRatsnest( true );

    if( m_dragging )
        selection.group->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
    else
@@ -279,6 +278,11 @@ int EDIT_TOOL::Rotate( TOOL_EVENT& aEvent )
    if( unselect )
        m_toolMgr->RunAction( COMMON_ACTIONS::selectionClear );

    m_toolMgr->RunAction( COMMON_ACTIONS::pointEditorUpdate );

    updateRatsnest( true );
    setTransitions();

    return 0;
}

@@ -312,9 +316,6 @@ int EDIT_TOOL::Flip( TOOL_EVENT& aEvent )
            item->ViewUpdate( KIGFX::VIEW_ITEM::LAYERS );
    }

    setTransitions();
    updateRatsnest( true );

    if( m_dragging )
        selection.group->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
    else
@@ -323,6 +324,11 @@ int EDIT_TOOL::Flip( TOOL_EVENT& aEvent )
    if( unselect )
        m_toolMgr->RunAction( COMMON_ACTIONS::selectionClear );

    m_toolMgr->RunAction( COMMON_ACTIONS::pointEditorUpdate );

    updateRatsnest( true );
    setTransitions();

    return 0;
}

@@ -359,8 +365,8 @@ int EDIT_TOOL::Remove( TOOL_EVENT& aEvent )
    if( !( board->m_Status_Pcb & NET_CODES_OK ) )
        board->BuildListOfNets();

    board->GetRatsnest()->Recalculate();        // TODO is it necessary?
    setTransitions();
    board->GetRatsnest()->Recalculate();

    return 0;
}
+63 −65
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

#include <boost/make_shared.hpp>

#include <tool/tool_manager.h>
#include <view/view_controls.h>
#include <confirm.h>
@@ -41,10 +43,10 @@
class EDIT_POINTS_FACTORY
{
public:
    static EDIT_POINTS Make( EDA_ITEM* aItem )
    static boost::shared_ptr<EDIT_POINTS> Make( EDA_ITEM* aItem )
    {
        // TODO generate list of points basing on the type
        EDIT_POINTS points( aItem );
        boost::shared_ptr<EDIT_POINTS> points = boost::make_shared<EDIT_POINTS>( aItem );

        switch( aItem->Type() )
        {
@@ -55,19 +57,19 @@ public:
                switch( segment->GetShape() )
                {
                case S_SEGMENT:
                    points.Add( segment->GetStart() );
                    points.Add( segment->GetEnd() );
                    points->Add( segment->GetStart() );
                    points->Add( segment->GetEnd() );

                    break;

                case S_ARC:
                    points.Add( segment->GetCenter() );         // points[0]
                    points.Add( segment->GetArcStart() );       // points[1]
                    points.Add( segment->GetArcEnd() );         // points[2]
                    points->Add( segment->GetCenter() );         // points[0]
                    points->Add( segment->GetArcStart() );       // points[1]
                    points->Add( segment->GetArcEnd() );         // points[2]

                    // Set constraints
                    // Arc end has to stay at the same radius as the start
                    points[2].SetConstraint( new EPC_CIRCLE( &points[2], points[0], points[1] ) );
                    (*points)[2].SetConstraint( new EPC_CIRCLE( (*points)[2], (*points)[0], (*points)[1] ) );
                    break;

                default:        // suppress warnings
@@ -111,11 +113,8 @@ bool POINT_EDITOR::Init()
}


int POINT_EDITOR::OnSelected( TOOL_EVENT& aEvent )
int POINT_EDITOR::OnSelectionChange( TOOL_EVENT& aEvent )
{
    std::cout << "point editor activated" << std::endl;
    std::cout << aEvent.Format() << std::endl;

    const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection();
    KIGFX::VIEW_CONTROLS* controls = getViewControls();
    m_dragPoint = NULL;
@@ -125,24 +124,15 @@ int POINT_EDITOR::OnSelected( TOOL_EVENT& aEvent )
        Activate();

        EDA_ITEM* item = selection.items.GetPickedItem( 0 );
        EDIT_POINTS editPoints = EDIT_POINTS_FACTORY::Make( item );
        m_toolMgr->GetView()->Add( &editPoints );
        m_editPoints = EDIT_POINTS_FACTORY::Make( item );
        m_toolMgr->GetView()->Add( m_editPoints.get() );

        // Main loop: keep receiving events
        while( OPT_TOOL_EVENT evt = Wait() )
        {
            if( evt->IsCancel() ||
                evt->Matches( m_selectionTool->ClearedEvent ) ||
                evt->Matches( m_selectionTool->DeselectedEvent ) ||
                evt->Matches( m_selectionTool->SelectedEvent ) )
            if( evt->IsMotion() )
            {
                m_toolMgr->PassEvent();
                break;
            }

            else if( evt->IsMotion() )
            {
                EDIT_POINT* point = editPoints.FindPoint( evt->Position() );
                EDIT_POINT* point = m_editPoints->FindPoint( evt->Position() );

                if( m_dragPoint != point )
                {
@@ -163,30 +153,37 @@ int POINT_EDITOR::OnSelected( TOOL_EVENT& aEvent )
                m_dragPoint = point;
            }

            else if( evt->IsDrag( BUT_LEFT ) )
            {
                if( m_dragPoint )
            else if( evt->IsDrag( BUT_LEFT ) && m_dragPoint )
            {
                m_dragPoint->SetPosition( controls->GetCursorPosition() );
                m_dragPoint->ApplyConstraint();
                    updateItem( item, editPoints );
                    updatePoints( item, editPoints );
                updateItem();
                updatePoints();

                    editPoints.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
                m_editPoints->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
            }
                else

            else if( evt->IsAction( &COMMON_ACTIONS::pointEditorUpdate ) )
            {
                    m_toolMgr->PassEvent();
                updatePoints();
            }

            else if( evt->IsCancel() ||
                evt->Matches( m_selectionTool->ClearedEvent ) ||
                evt->Matches( m_selectionTool->DeselectedEvent ) ||
                evt->Matches( m_selectionTool->SelectedEvent ) )
            {
                break;
            }

            else if( evt->IsClick( BUT_LEFT ) )
            else
            {
                m_toolMgr->PassEvent();
            }
        }

        m_toolMgr->GetView()->Remove( &editPoints );
        m_toolMgr->GetView()->Remove( m_editPoints.get() );
        m_editPoints.reset();
        item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
    }

@@ -200,42 +197,38 @@ int POINT_EDITOR::OnSelected( TOOL_EVENT& aEvent )
}


void POINT_EDITOR::setTransitions()
void POINT_EDITOR::updateItem() const
{
    Go( &POINT_EDITOR::OnSelected, m_selectionTool->SelectedEvent );
}
    EDA_ITEM* item = m_editPoints->GetParent();


void POINT_EDITOR::updateItem( EDA_ITEM* aItem, EDIT_POINTS& aPoints ) const
{
    switch( aItem->Type() )
    switch( item->Type() )
    {
    case PCB_LINE_T:
    {
        DRAWSEGMENT* segment = static_cast<DRAWSEGMENT*>( aItem );
        DRAWSEGMENT* segment = static_cast<DRAWSEGMENT*>( item );
        switch( segment->GetShape() )
        {
        case S_SEGMENT:
            if( &aPoints[0] == m_dragPoint )
                segment->SetStart( wxPoint( aPoints[0].GetPosition().x, aPoints[0].GetPosition().y ) );
            else if( &aPoints[1] == m_dragPoint )
                segment->SetEnd( wxPoint( aPoints[1].GetPosition().x, aPoints[1].GetPosition().y ) );
            if( &(*m_editPoints)[0] == m_dragPoint )
                segment->SetStart( wxPoint( (*m_editPoints)[0].GetPosition().x, (*m_editPoints)[0].GetPosition().y ) );
            else if( &(*m_editPoints)[1] == m_dragPoint )
                segment->SetEnd( wxPoint( (*m_editPoints)[1].GetPosition().x, (*m_editPoints)[1].GetPosition().y ) );

            break;

        case S_ARC:
        {
            const VECTOR2I& center = aPoints[0].GetPosition();
            const VECTOR2I& start = aPoints[1].GetPosition();
            const VECTOR2I& end = aPoints[2].GetPosition();
            const VECTOR2I& center = (*m_editPoints)[0].GetPosition();
            const VECTOR2I& start = (*m_editPoints)[1].GetPosition();
            const VECTOR2I& end = (*m_editPoints)[2].GetPosition();

            if( center != segment->GetCenter() )
            {
                wxPoint moveVector = wxPoint( center.x, center.y ) - segment->GetCenter();
                segment->Move( moveVector );

                aPoints[1].SetPosition( segment->GetArcStart() );
                aPoints[2].SetPosition( segment->GetArcEnd() );
                (*m_editPoints)[1].SetPosition( segment->GetArcStart() );
                (*m_editPoints)[2].SetPosition( segment->GetArcEnd() );
            }

            else
@@ -270,25 +263,30 @@ void POINT_EDITOR::updateItem( EDA_ITEM* aItem, EDIT_POINTS& aPoints ) const
}


void POINT_EDITOR::updatePoints( const EDA_ITEM* aItem, EDIT_POINTS& aPoints ) const
void POINT_EDITOR::updatePoints() const
{
    switch( aItem->Type() )
    if( !m_editPoints )
        return;

    EDA_ITEM* item = m_editPoints->GetParent();

    switch( item->Type() )
    {
    case PCB_LINE_T:
    {
        const DRAWSEGMENT* segment = static_cast<const DRAWSEGMENT*>( aItem );
        const DRAWSEGMENT* segment = static_cast<const DRAWSEGMENT*>( item );
        {
            switch( segment->GetShape() )
            {
            case S_SEGMENT:
                aPoints[0].SetPosition( segment->GetStart() );
                aPoints[1].SetPosition( segment->GetEnd() );
                (*m_editPoints)[0].SetPosition( segment->GetStart() );
                (*m_editPoints)[1].SetPosition( segment->GetEnd() );
                break;

            case S_ARC:
                aPoints[0].SetPosition( segment->GetCenter() );
                aPoints[1].SetPosition( segment->GetArcStart() );
                aPoints[2].SetPosition( segment->GetArcEnd() );
                (*m_editPoints)[0].SetPosition( segment->GetCenter() );
                (*m_editPoints)[1].SetPosition( segment->GetArcStart() );
                (*m_editPoints)[2].SetPosition( segment->GetArcEnd() );
                break;

            default:        // suppress warnings
Loading