committed by
Wayne Stambaugh
8 changed files with 426 additions and 159 deletions
-
1cvpcb/CMakeLists.txt
-
6cvpcb/cvpcb_mainframe.cpp
-
8cvpcb/menubar.cpp
-
8cvpcb/tools/cvpcb_actions.cpp
-
293cvpcb/tools/cvpcb_association_tool.cpp
-
116cvpcb/tools/cvpcb_association_tool.h
-
111cvpcb/tools/cvpcb_control.cpp
-
42cvpcb/tools/cvpcb_control.h
@ -0,0 +1,293 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 Ian McInerney <Ian.S.McInerney@ieee.org> |
|||
* Copyright (C) 2019 KiCad Developers, see AUTHORS.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 3 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, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
|
|||
#include <confirm.h>
|
|||
#include <cstdint>
|
|||
#include <functional>
|
|||
#include <kiface_i.h>
|
|||
#include <kiway_express.h>
|
|||
#include <lib_id.h>
|
|||
#include <tool/actions.h>
|
|||
#include <tool/tool_manager.h>
|
|||
#include <wx/clipbrd.h>
|
|||
|
|||
#include <cvpcb_association.h>
|
|||
#include <cvpcb_mainframe.h>
|
|||
#include <dialogs/dialog_config_equfiles.h>
|
|||
#include <display_footprints_frame.h>
|
|||
#include <listboxes.h>
|
|||
#include <tools/cvpcb_actions.h>
|
|||
#include <tools/cvpcb_association_tool.h>
|
|||
|
|||
using namespace std::placeholders; |
|||
|
|||
|
|||
CVPCB_ASSOCIATION_TOOL::CVPCB_ASSOCIATION_TOOL() : |
|||
TOOL_INTERACTIVE( "cvpcb.Association" ), |
|||
m_frame( nullptr ) |
|||
{ |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::CopyAssoc( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
COMPONENT* comp; |
|||
LIB_ID fpid; |
|||
switch( m_frame->GetFocusedControl() ) |
|||
{ |
|||
case CVPCB_MAINFRAME::CONTROL_FOOTPRINT: |
|||
fpid.Parse( m_frame->GetSelectedFootprint(), LIB_ID::ID_PCB ); |
|||
break; |
|||
|
|||
case CVPCB_MAINFRAME::CONTROL_COMPONENT: |
|||
// Get the selection
|
|||
comp = m_frame->GetSelectedComponent(); |
|||
|
|||
if( !comp ) |
|||
return 0; |
|||
|
|||
// Get the fpid and save it to the clipboard
|
|||
fpid = comp->GetFPID(); |
|||
break; |
|||
|
|||
default: |
|||
// Do nothing
|
|||
break; |
|||
} |
|||
|
|||
// if no valid fpid, then skip
|
|||
if( !fpid.IsValid() ) |
|||
return 0; |
|||
|
|||
if( wxTheClipboard->Open() ) |
|||
{ |
|||
if( !wxTheClipboard->SetData( new wxTextDataObject( fpid.GetUniStringLibId() ) ) ) |
|||
wxLogDebug( "Failed to copy data to clipboard" ); |
|||
|
|||
wxTheClipboard->Flush(); |
|||
wxTheClipboard->Close(); |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::CutAssoc( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
// Only cut when in the component frame
|
|||
if( m_frame->GetFocusedControl() != CVPCB_MAINFRAME::CONTROL_COMPONENT ) |
|||
return 0; |
|||
|
|||
// Get the selection, but only use the first one
|
|||
COMPONENT* comp = m_frame->GetSelectedComponent(); |
|||
std::vector<unsigned int> idx = m_frame->GetComponentIndices( CVPCB_MAINFRAME::SEL_COMPONENTS ); |
|||
|
|||
if( idx.empty() || !comp ) |
|||
return 0; |
|||
|
|||
// Get the fpid
|
|||
LIB_ID fpid; |
|||
fpid = comp->GetFPID(); |
|||
|
|||
// if no valid fpid, then skip
|
|||
if( !fpid.IsValid() ) |
|||
return 0; |
|||
|
|||
// Save it to the clipboard
|
|||
if( wxTheClipboard->Open() ) |
|||
{ |
|||
if( !wxTheClipboard->SetData( new wxTextDataObject( fpid.GetUniStringLibId() ) ) ) |
|||
{ |
|||
wxLogDebug( "Failed to cut data to clipboard" ); |
|||
wxTheClipboard->Close(); |
|||
return 0; |
|||
} |
|||
|
|||
wxTheClipboard->Flush(); |
|||
wxTheClipboard->Close(); |
|||
} |
|||
|
|||
// Remove the association
|
|||
m_frame->AssociateFootprint( CVPCB_ASSOCIATION( idx.front(), "" ) ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::PasteAssoc( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
// Get the selection
|
|||
std::vector<unsigned int> idx = m_frame->GetComponentIndices( CVPCB_MAINFRAME::SEL_COMPONENTS ); |
|||
|
|||
if( idx.empty() ) |
|||
return 0; |
|||
|
|||
// Get the clipboard data and ensure it is valid
|
|||
LIB_ID fpid; |
|||
wxTextDataObject data; |
|||
|
|||
if( wxTheClipboard->Open() ) |
|||
{ |
|||
wxTheClipboard->GetData( data ); |
|||
wxTheClipboard->Close(); |
|||
} |
|||
|
|||
if( fpid.Parse( data.GetText(), LIB_ID::ID_PCB ) >= 0 ) |
|||
return 0; |
|||
|
|||
// Assign the fpid to the selections
|
|||
bool firstAssoc = true; |
|||
for( auto i : idx ) |
|||
{ |
|||
m_frame->AssociateFootprint( CVPCB_ASSOCIATION( i, fpid ), firstAssoc ); |
|||
firstAssoc = false; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
void CVPCB_ASSOCIATION_TOOL::Reset( RESET_REASON aReason ) |
|||
{ |
|||
m_frame = getEditFrame<CVPCB_MAINFRAME>(); |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::Undo( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
m_frame->UndoAssociation(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::Redo( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
m_frame->RedoAssociation(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::Associate( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
// Get the currently selected footprint
|
|||
LIB_ID fpid; |
|||
wxString fp = m_frame->GetSelectedFootprint(); |
|||
fpid.Parse( fp, LIB_ID::ID_PCB ); |
|||
|
|||
// Ignore the action if the footprint is empty (nothing selected)
|
|||
if( fpid.empty() ) |
|||
return 0; |
|||
|
|||
// Test for validity of the requested footprint
|
|||
if( !fpid.IsValid() ) |
|||
{ |
|||
wxString msg = |
|||
wxString::Format( _( "\"%s\" is not a valid footprint." ), fpid.Format().wx_str() ); |
|||
DisplayErrorMessage( m_frame, msg ); |
|||
} |
|||
|
|||
// Get all the components that are selected and associate them with the current footprint
|
|||
std::vector<unsigned int> sel = m_frame->GetComponentIndices( CVPCB_MAINFRAME::SEL_COMPONENTS ); |
|||
|
|||
bool firstAssoc = true; |
|||
for( auto i : sel ) |
|||
{ |
|||
CVPCB_ASSOCIATION newfp( i, fpid ); |
|||
m_frame->AssociateFootprint( newfp, firstAssoc ); |
|||
firstAssoc = false; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::AutoAssociate( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
m_frame->AutomaticFootprintMatching(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::DeleteAssoc( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
// Get all the components that are selected
|
|||
std::vector<unsigned int> sel = m_frame->GetComponentIndices( CVPCB_MAINFRAME::SEL_COMPONENTS ); |
|||
|
|||
// Delete the association
|
|||
bool firstAssoc = true; |
|||
for( auto i : sel ) |
|||
{ |
|||
m_frame->AssociateFootprint( CVPCB_ASSOCIATION( i, LIB_ID() ), firstAssoc ); |
|||
firstAssoc = false; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int CVPCB_ASSOCIATION_TOOL::DeleteAll( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
if( IsOK( m_frame, _( "Delete all associations?" ) ) ) |
|||
{ |
|||
// Remove all selections to avoid issues when setting the fpids
|
|||
m_frame->SetSelectedComponent( -1, true ); |
|||
std::vector<unsigned int> idx = |
|||
m_frame->GetComponentIndices( CVPCB_MAINFRAME::ALL_COMPONENTS ); |
|||
|
|||
bool firstAssoc = true; |
|||
for( auto i : idx ) |
|||
{ |
|||
m_frame->AssociateFootprint( CVPCB_ASSOCIATION( i, LIB_ID() ), firstAssoc ); |
|||
firstAssoc = false; |
|||
} |
|||
|
|||
// Remove all selections after setting the fpids and select the first component
|
|||
m_frame->SetSelectedComponent( -1, true ); |
|||
m_frame->SetSelectedComponent( 0 ); |
|||
} |
|||
|
|||
// Update the status display
|
|||
m_frame->DisplayStatus(); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
void CVPCB_ASSOCIATION_TOOL::setTransitions() |
|||
{ |
|||
// Association
|
|||
Go( &CVPCB_ASSOCIATION_TOOL::Associate, CVPCB_ACTIONS::associate.MakeEvent() ); |
|||
Go( &CVPCB_ASSOCIATION_TOOL::AutoAssociate, CVPCB_ACTIONS::autoAssociate.MakeEvent() ); |
|||
|
|||
// Deletion
|
|||
Go( &CVPCB_ASSOCIATION_TOOL::DeleteAll, CVPCB_ACTIONS::deleteAll.MakeEvent() ); |
|||
Go( &CVPCB_ASSOCIATION_TOOL::DeleteAssoc, CVPCB_ACTIONS::deleteAssoc.MakeEvent() ); |
|||
|
|||
// Helpers
|
|||
Go( &CVPCB_ASSOCIATION_TOOL::Undo, ACTIONS::undo.MakeEvent() ); |
|||
Go( &CVPCB_ASSOCIATION_TOOL::Redo, ACTIONS::redo.MakeEvent() ); |
|||
|
|||
// Clipboard
|
|||
Go( &CVPCB_ASSOCIATION_TOOL::CutAssoc, ACTIONS::cut.MakeEvent() ); |
|||
Go( &CVPCB_ASSOCIATION_TOOL::CopyAssoc, ACTIONS::copy.MakeEvent() ); |
|||
Go( &CVPCB_ASSOCIATION_TOOL::PasteAssoc, ACTIONS::paste.MakeEvent() ); |
|||
} |
@ -0,0 +1,116 @@ |
|||
/* |
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 Ian McInerney <Ian.S.McInerney@ieee.org> |
|||
* Copyright (C) 2019 KiCad Developers, see AUTHORS.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 3 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, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#ifndef CVPCB_ASSOCIATION_TOOL_H_ |
|||
#define CVPCB_ASSOCIATION_TOOL_H_ |
|||
|
|||
#include <tool/tool_interactive.h> |
|||
|
|||
#include <cvpcb_mainframe.h> |
|||
|
|||
|
|||
/** |
|||
* Class CVPCB_CONTROL |
|||
* |
|||
* Handles actions in main cvpcb window. |
|||
*/ |
|||
|
|||
class CVPCB_ASSOCIATION_TOOL : public TOOL_INTERACTIVE |
|||
{ |
|||
public: |
|||
CVPCB_ASSOCIATION_TOOL(); |
|||
~CVPCB_ASSOCIATION_TOOL() {} |
|||
|
|||
/// @copydoc TOOL_INTERACTIVE::Reset() |
|||
void Reset( RESET_REASON aReason ) override; |
|||
|
|||
/** |
|||
* Undo the footprint associations most recently done. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int Undo( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Redo the footprint associations most recently done. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int Redo( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Associate the selected footprint with the currently selected components. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int Associate( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Perform automatic footprint association. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int AutoAssociate( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Delete all associations. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int DeleteAll( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Delete the selected associations. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int DeleteAssoc( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Copy the selected associations to the clipboard. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int CopyAssoc( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Cut the selected associations to the clipboard. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int CutAssoc( const TOOL_EVENT& aEvent ); |
|||
|
|||
/** |
|||
* Paste the clipboard onto the current selection. |
|||
* |
|||
* @param aEvent is the event generated by the tool framework |
|||
*/ |
|||
int PasteAssoc( const TOOL_EVENT& aEvent ); |
|||
|
|||
/* |
|||
* Sets up handlers for various events. |
|||
*/ |
|||
void setTransitions() override; |
|||
|
|||
private: |
|||
CVPCB_MAINFRAME* m_frame; |
|||
}; |
|||
|
|||
#endif |
Write
Preview
Loading…
Cancel
Save
Reference in new issue