From 1ebaf1371a298435559059ab4c7553b75dc6b927 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Mon, 17 Nov 2014 14:55:26 +0100 Subject: [PATCH 01/11] Fix remark 1 in Bug #1393277 (the option "use absolute paths" acts reversed: ticked exports relative paths, unticked exports absolute paths) --- bitmap2component/bitmap2cmp_gui_base.cpp | 2 +- bitmap2component/bitmap2cmp_gui_base.fbp | 2 +- pcbnew/dialogs/dialog_export_vrml.cpp | 18 +++++++++--------- pcbnew/dialogs/dialog_export_vrml_base.cpp | 7 ++++--- pcbnew/dialogs/dialog_export_vrml_base.fbp | 8 ++++---- pcbnew/dialogs/dialog_export_vrml_base.h | 2 +- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/bitmap2component/bitmap2cmp_gui_base.cpp b/bitmap2component/bitmap2cmp_gui_base.cpp index be48e480d3..975f6ed2f9 100644 --- a/bitmap2component/bitmap2cmp_gui_base.cpp +++ b/bitmap2component/bitmap2cmp_gui_base.cpp @@ -151,7 +151,7 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS int m_radio_PCBLayerNChoices = sizeof( m_radio_PCBLayerChoices ) / sizeof( wxString ); m_radio_PCBLayer = new wxRadioBox( m_panelRight, wxID_ANY, _("Board Layer for Outline:"), wxDefaultPosition, wxDefaultSize, m_radio_PCBLayerNChoices, m_radio_PCBLayerChoices, 1, wxRA_SPECIFY_COLS ); m_radio_PCBLayer->SetSelection( 0 ); - m_radio_PCBLayer->SetToolTip( _("Choose the board layer to place the outline.\nThe 2 invisible fields reference and value and always placed on the silk screen layer.") ); + m_radio_PCBLayer->SetToolTip( _("Choose the board layer to place the outline.\nThe 2 invisible fields reference and value are always placed on the silk screen layer.") ); brightSizer->Add( m_radio_PCBLayer, 0, wxALL|wxEXPAND, 5 ); diff --git a/bitmap2component/bitmap2cmp_gui_base.fbp b/bitmap2component/bitmap2cmp_gui_base.fbp index 4c0193b481..5dc72324bf 100644 --- a/bitmap2component/bitmap2cmp_gui_base.fbp +++ b/bitmap2component/bitmap2cmp_gui_base.fbp @@ -2412,7 +2412,7 @@ wxRA_SPECIFY_COLS 0 - Choose the board layer to place the outline. The 2 invisible fields reference and value and always placed on the silk screen layer. + Choose the board layer to place the outline. The 2 invisible fields reference and value are always placed on the silk screen layer. wxFILTER_NONE wxDefaultValidator diff --git a/pcbnew/dialogs/dialog_export_vrml.cpp b/pcbnew/dialogs/dialog_export_vrml.cpp index 75598b3ecc..47b4cb1d34 100644 --- a/pcbnew/dialogs/dialog_export_vrml.cpp +++ b/pcbnew/dialogs/dialog_export_vrml.cpp @@ -40,7 +40,7 @@ #define OPTKEY_OUTPUT_UNIT wxT( "VrmlExportUnit" ) #define OPTKEY_3DFILES_OPT wxT( "VrmlExportCopyFiles" ) -#define OPTKEY_USE_ABS_PATHS wxT( "VrmlUseRelativePaths" ) +#define OPTKEY_USE_RELATIVE_PATHS wxT( "VrmlUseRelativePaths" ) class DIALOG_EXPORT_3DFILE : public DIALOG_EXPORT_3DFILE_BASE @@ -61,10 +61,10 @@ public: m_filePicker->SetFocus(); m_config->Read( OPTKEY_OUTPUT_UNIT, &m_unitsOpt ); m_config->Read( OPTKEY_3DFILES_OPT, &m_copy3DFilesOpt ); - m_config->Read( OPTKEY_USE_ABS_PATHS, &m_useRelativePathsOpt ); + m_config->Read( OPTKEY_USE_RELATIVE_PATHS, &m_useRelativePathsOpt ); m_rbSelectUnits->SetSelection( m_unitsOpt ); m_cbCopyFiles->SetValue( m_copy3DFilesOpt ); - m_cbUseAbsolutePaths->SetValue( m_useRelativePathsOpt ); + m_cbUseRelativePaths->SetValue( m_useRelativePathsOpt ); wxButton* okButton = (wxButton*) FindWindowByLabel( wxT( "OK" ) ); if( okButton ) @@ -74,7 +74,7 @@ public: Centre(); Connect( ID_USE_ABS_PATH, wxEVT_UPDATE_UI, - wxUpdateUIEventHandler( DIALOG_EXPORT_3DFILE::OnUpdateUseAbsolutPath ) ); + wxUpdateUIEventHandler( DIALOG_EXPORT_3DFILE::OnUpdateUseRelativePath ) ); } ~DIALOG_EXPORT_3DFILE() @@ -83,7 +83,7 @@ public: m_copy3DFilesOpt = GetCopyFilesOption(); m_config->Write( OPTKEY_OUTPUT_UNIT, m_unitsOpt ); m_config->Write( OPTKEY_3DFILES_OPT, m_copy3DFilesOpt ); - m_config->Write( OPTKEY_USE_ABS_PATHS, m_useRelativePathsOpt ); + m_config->Write( OPTKEY_USE_RELATIVE_PATHS, m_useRelativePathsOpt ); }; void SetSubdir( const wxString & aDir ) @@ -111,12 +111,12 @@ public: return m_copy3DFilesOpt = m_cbCopyFiles->GetValue(); } - bool GetUseAbsolutePathsOption() + bool GetUseRelativePathsOption() { - return m_useRelativePathsOpt = m_cbUseAbsolutePaths->GetValue(); + return m_useRelativePathsOpt = m_cbUseRelativePaths->GetValue(); } - void OnUpdateUseAbsolutPath( wxUpdateUIEvent& event ) + void OnUpdateUseRelativePath( wxUpdateUIEvent& event ) { // Making path relative or absolute has no meaning when VRML files are not copied. event.Enable( m_cbCopyFiles->GetValue() ); @@ -157,7 +157,7 @@ void PCB_EDIT_FRAME::OnExportVRML( wxCommandEvent& event ) double scale = scaleList[dlg.GetUnits()]; // final scale export bool export3DFiles = dlg.GetCopyFilesOption(); - bool useRelativePaths = dlg.GetUseAbsolutePathsOption(); + bool useRelativePaths = dlg.GetUseRelativePathsOption(); wxString fullFilename = dlg.FilePicker()->GetPath(); wxFileName modelPath = fullFilename; wxBusyCursor dummy; diff --git a/pcbnew/dialogs/dialog_export_vrml_base.cpp b/pcbnew/dialogs/dialog_export_vrml_base.cpp index c9bf5afbbd..ba37d8fdcf 100644 --- a/pcbnew/dialogs/dialog_export_vrml_base.cpp +++ b/pcbnew/dialogs/dialog_export_vrml_base.cpp @@ -47,9 +47,10 @@ DIALOG_EXPORT_3DFILE_BASE::DIALOG_EXPORT_3DFILE_BASE( wxWindow* parent, wxWindow m_cbCopyFiles->SetValue(true); bSizer4->Add( m_cbCopyFiles, 0, wxALL, 5 ); - m_cbUseAbsolutePaths = new wxCheckBox( this, ID_USE_ABS_PATH, _("Use absolute paths to model files in board VRML file"), wxDefaultPosition, wxDefaultSize, 0 ); - m_cbUseAbsolutePaths->SetValue(true); - bSizer4->Add( m_cbUseAbsolutePaths, 0, wxALL, 5 ); + m_cbUseRelativePaths = new wxCheckBox( this, ID_USE_ABS_PATH, _("Use relative paths to model files in board VRML file"), wxDefaultPosition, wxDefaultSize, 0 ); + m_cbUseRelativePaths->SetToolTip( _("Use paths for model files in board VRML file relative to the vrml file") ); + + bSizer4->Add( m_cbUseRelativePaths, 0, wxALL, 5 ); bLowerSizer->Add( bSizer4, 3, wxEXPAND, 5 ); diff --git a/pcbnew/dialogs/dialog_export_vrml_base.fbp b/pcbnew/dialogs/dialog_export_vrml_base.fbp index 39c1b430d4..8e056bc0a8 100644 --- a/pcbnew/dialogs/dialog_export_vrml_base.fbp +++ b/pcbnew/dialogs/dialog_export_vrml_base.fbp @@ -574,7 +574,7 @@ 1 0 - 1 + 0 1 1 @@ -589,7 +589,7 @@ 0 0 ID_USE_ABS_PATH - Use absolute paths to model files in board VRML file + Use relative paths to model files in board VRML file 0 @@ -597,7 +597,7 @@ 0 1 - m_cbUseAbsolutePaths + m_cbUseRelativePaths 1 @@ -610,7 +610,7 @@ 0 - + Use paths for model files in board VRML file relative to the vrml file wxFILTER_NONE wxDefaultValidator diff --git a/pcbnew/dialogs/dialog_export_vrml_base.h b/pcbnew/dialogs/dialog_export_vrml_base.h index e1af897a06..2116ff82cb 100644 --- a/pcbnew/dialogs/dialog_export_vrml_base.h +++ b/pcbnew/dialogs/dialog_export_vrml_base.h @@ -49,7 +49,7 @@ class DIALOG_EXPORT_3DFILE_BASE : public DIALOG_SHIM wxStaticText* m_staticText3; wxTextCtrl* m_SubdirNameCtrl; wxCheckBox* m_cbCopyFiles; - wxCheckBox* m_cbUseAbsolutePaths; + wxCheckBox* m_cbUseRelativePaths; wxRadioBox* m_rbSelectUnits; wxStaticLine* m_staticline1; wxStdDialogButtonSizer* m_sdbSizer1; From 1a550b8ef164af0bd26e355cdd761ce60793d72f Mon Sep 17 00:00:00 2001 From: TomCC Date: Mon, 17 Nov 2014 13:03:56 -0500 Subject: [PATCH 02/11] Fix Python BOM script bug when output file cannot be opened. (fixes:lp:1391904) --- scripts/bom-in-python/bom_csv_grouped_by_value.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/bom-in-python/bom_csv_grouped_by_value.py b/scripts/bom-in-python/bom_csv_grouped_by_value.py index 29203e33f2..3051b93bba 100644 --- a/scripts/bom-in-python/bom_csv_grouped_by_value.py +++ b/scripts/bom-in-python/bom_csv_grouped_by_value.py @@ -26,8 +26,9 @@ net = kicad_netlist_reader.netlist(sys.argv[1]) try: f = open(sys.argv[2], 'w') except IOError: + e = "Can't open output file for writing: " + sys.argv[2] print(__file__, ":", e, file=sys.stderr) - f = stdout + f = sys.stdout # subset the components to those wanted in the BOM, controlled # by block in kicad_netlist_reader.py From 2ab98f76c1febda5d32ec760eaf84fa2cf2b3ffb Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 19 Nov 2014 15:22:47 +0100 Subject: [PATCH 03/11] Try to fix an issue on Ubuntu/Unity for some dialogs which are not displayed. For most, adding GetSizer()->Fit( this ) in dialog constructor fix the issue, but at least one dialog still is not displayed. --- common/dialogs/dialog_list_selector_base.cpp | 5 +-- common/dialogs/dialog_list_selector_base.fbp | 6 +-- common/dialogs/dialog_list_selector_base.h | 4 +- common/displlst.cpp | 37 ++++++++++++------- eeschema/dialogs/dialog_bom.cpp | 2 +- eeschema/dialogs/dialog_bom_base.cpp | 2 +- eeschema/dialogs/dialog_bom_base.fbp | 4 +- eeschema/dialogs/dialog_bom_base.h | 2 +- eeschema/dialogs/dialog_choose_component.cpp | 17 +++++---- eeschema/dialogs/dialog_choose_component.h | 4 +- eeschema/dialogs/dialog_sch_sheet_props.cpp | 2 + eeschema/dialogs/dialog_sch_sheet_props.fbp | 10 ++--- .../dialogs/dialog_sch_sheet_props_base.cpp | 8 ++-- .../dialogs/dialog_sch_sheet_props_base.h | 4 +- include/dialog_helpers.h | 4 +- 15 files changed, 65 insertions(+), 46 deletions(-) diff --git a/common/dialogs/dialog_list_selector_base.cpp b/common/dialogs/dialog_list_selector_base.cpp index d8598769b2..d38d417487 100644 --- a/common/dialogs/dialog_list_selector_base.cpp +++ b/common/dialogs/dialog_list_selector_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 5 2013) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -11,7 +11,7 @@ EDA_LIST_DIALOG_BASE::EDA_LIST_DIALOG_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetSizeHints( wxSize( 400,400 ), wxDefaultSize ); wxBoxSizer* bSizerMain; bSizerMain = new wxBoxSizer( wxVERTICAL ); @@ -55,7 +55,6 @@ EDA_LIST_DIALOG_BASE::EDA_LIST_DIALOG_BASE( wxWindow* parent, wxWindowID id, con this->SetSizer( bSizerMain ); this->Layout(); - bSizerMain->Fit( this ); this->Centre( wxBOTH ); diff --git a/common/dialogs/dialog_list_selector_base.fbp b/common/dialogs/dialog_list_selector_base.fbp index 7e13578477..1d1d0e229e 100644 --- a/common/dialogs/dialog_list_selector_base.fbp +++ b/common/dialogs/dialog_list_selector_base.fbp @@ -1,6 +1,6 @@ - + C++ @@ -41,10 +41,10 @@ 0 wxID_ANY - + 400,400 EDA_LIST_DIALOG_BASE - -1,-1 + 400,400 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER DIALOG_SHIM; dialog_shim.h diff --git a/common/dialogs/dialog_list_selector_base.h b/common/dialogs/dialog_list_selector_base.h index 162e43785d..c274c2c9b4 100644 --- a/common/dialogs/dialog_list_selector_base.h +++ b/common/dialogs/dialog_list_selector_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 5 2013) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -58,7 +58,7 @@ class EDA_LIST_DIALOG_BASE : public DIALOG_SHIM public: - EDA_LIST_DIALOG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + EDA_LIST_DIALOG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 400,400 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~EDA_LIST_DIALOG_BASE(); }; diff --git a/common/displlst.cpp b/common/displlst.cpp index e41081de63..0201ce345f 100644 --- a/common/displlst.cpp +++ b/common/displlst.cpp @@ -47,6 +47,27 @@ EDA_LIST_DIALOG::EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitl m_cb_data = aCallBackFunctionData; m_itemsListCp = &aItemList; + initDialog( aItemHeaders, aSelection ); + + // DIALOG_SHIM needs a unique hash_key because classname is not sufficient + // because so many dialogs share this same class, with different numbers of + // columns, different column names, and column widths. + m_hash_key = TO_UTF8( aTitle ); + + m_filterBox->SetFocus(); + + // this line fixes an issue on Linux Ubuntu using Unity (dialog not shown), + // and works fine on all systems + GetSizer()->Fit( this ); + + Centre(); +} + + +void EDA_LIST_DIALOG::initDialog( const wxArrayString& aItemHeaders, + const wxString& aSelection) +{ + for( unsigned i = 0; i < aItemHeaders.Count(); i++ ) { wxListItem column; @@ -57,7 +78,7 @@ EDA_LIST_DIALOG::EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitl m_listBox->InsertColumn( i, column ); } - InsertItems( aItemList, 0 ); + InsertItems( *m_itemsListCp, 0 ); if( m_cb_func == NULL ) { @@ -112,14 +133,11 @@ EDA_LIST_DIALOG::EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitl } #endif - Fit(); - Centre(); - if( !!aSelection ) { - for( unsigned row = 0; row < aItemList.size(); ++row ) + for( unsigned row = 0; row < m_itemsListCp->size(); ++row ) { - if( aItemList[row][0] == aSelection ) + if( (*m_itemsListCp)[row][0] == aSelection ) { m_listBox->SetItemState( row, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); m_listBox->EnsureVisible( row ); @@ -127,13 +145,6 @@ EDA_LIST_DIALOG::EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitl } } } - - // DIALOG_SHIM needs a unique hash_key because classname is not sufficient - // because so many dialogs share this same class, with different numbers of - // columns, different column names, and column widths. - m_hash_key = TO_UTF8( aTitle ); - - m_filterBox->SetFocus(); } diff --git a/eeschema/dialogs/dialog_bom.cpp b/eeschema/dialogs/dialog_bom.cpp index dbfbab4e60..6a3bbe66dd 100644 --- a/eeschema/dialogs/dialog_bom.cpp +++ b/eeschema/dialogs/dialog_bom.cpp @@ -199,7 +199,7 @@ DIALOG_BOM::DIALOG_BOM( SCH_EDIT_FRAME* parent ) : m_config = Kiface().KifaceSettings(); installPluginsList(); - GetSizer()->SetSizeHints( this ); + GetSizer()->Fit( this ); Centre(); } diff --git a/eeschema/dialogs/dialog_bom_base.cpp b/eeschema/dialogs/dialog_bom_base.cpp index 03151f1232..e8888467a5 100644 --- a/eeschema/dialogs/dialog_bom_base.cpp +++ b/eeschema/dialogs/dialog_bom_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 8 2012) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! diff --git a/eeschema/dialogs/dialog_bom_base.fbp b/eeschema/dialogs/dialog_bom_base.fbp index 2174dc853f..49b6273625 100644 --- a/eeschema/dialogs/dialog_bom_base.fbp +++ b/eeschema/dialogs/dialog_bom_base.fbp @@ -1,6 +1,6 @@ - + C++ @@ -20,8 +20,10 @@ . 1 + 1 1 1 + UI 1 0 diff --git a/eeschema/dialogs/dialog_bom_base.h b/eeschema/dialogs/dialog_bom_base.h index 7d4579e81b..2ba54c81f9 100644 --- a/eeschema/dialogs/dialog_bom_base.h +++ b/eeschema/dialogs/dialog_bom_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 8 2012) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! diff --git a/eeschema/dialogs/dialog_choose_component.cpp b/eeschema/dialogs/dialog_choose_component.cpp index f491e4f9cd..9229944388 100644 --- a/eeschema/dialogs/dialog_choose_component.cpp +++ b/eeschema/dialogs/dialog_choose_component.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include @@ -36,15 +35,14 @@ static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& ite static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle, - COMPONENT_TREE_SEARCH_CONTAINER* aContainer, + COMPONENT_TREE_SEARCH_CONTAINER* const aContainer, int aDeMorganConvert ) - : DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ), - m_search_container( aContainer ), - m_deMorganConvert( aDeMorganConvert >= 0 ? aDeMorganConvert : 0 ), - m_external_browser_requested( false ), - m_received_doubleclick_in_tree( false ) + : DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ), m_search_container( aContainer ) { m_parent = aParent; + m_deMorganConvert = aDeMorganConvert >= 0 ? aDeMorganConvert : 0; + m_external_browser_requested = false; + m_received_doubleclick_in_tree = false; m_search_container->SetTree( m_libraryComponentTree ); m_searchBox->SetFocus(); m_componentDetails->SetEditable( false ); @@ -59,6 +57,11 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxFont font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); m_libraryComponentTree->SetFont( wxFont( font.GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL ) ); + + // this line fixes an issue on Linux Ubuntu using Unity (dialog not shown), + // and works fine on all systems + GetSizer()->Fit( this ); + Centre(); } diff --git a/eeschema/dialogs/dialog_choose_component.h b/eeschema/dialogs/dialog_choose_component.h index 2cd5af4f32..8d8ac24edb 100644 --- a/eeschema/dialogs/dialog_choose_component.h +++ b/eeschema/dialogs/dialog_choose_component.h @@ -36,7 +36,7 @@ class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE { SCH_BASE_FRAME* m_parent; COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container; - const int m_deMorganConvert; + int m_deMorganConvert; bool m_external_browser_requested; bool m_received_doubleclick_in_tree; @@ -51,7 +51,7 @@ public: * @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog) */ DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle, - COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer, + COMPONENT_TREE_SEARCH_CONTAINER* const aSearchContainer, int aDeMorganConvert ); virtual ~DIALOG_CHOOSE_COMPONENT(); diff --git a/eeschema/dialogs/dialog_sch_sheet_props.cpp b/eeschema/dialogs/dialog_sch_sheet_props.cpp index 83ab8d4b89..8de6984bd6 100644 --- a/eeschema/dialogs/dialog_sch_sheet_props.cpp +++ b/eeschema/dialogs/dialog_sch_sheet_props.cpp @@ -33,6 +33,8 @@ DIALOG_SCH_SHEET_PROPS::DIALOG_SCH_SHEET_PROPS( wxWindow* parent ) : m_textFileName->SetValidator( FILE_NAME_WITH_PATH_CHAR_VALIDATOR() ); m_textFileName->SetFocus(); m_sdbSizer1OK->SetDefault(); + + GetSizer()->Fit( this ); } diff --git a/eeschema/dialogs/dialog_sch_sheet_props.fbp b/eeschema/dialogs/dialog_sch_sheet_props.fbp index a2f5db4cc0..3b8b661cd8 100644 --- a/eeschema/dialogs/dialog_sch_sheet_props.fbp +++ b/eeschema/dialogs/dialog_sch_sheet_props.fbp @@ -1,6 +1,6 @@ - + C++ @@ -41,10 +41,10 @@ 0 wxID_ANY - + 500,150 DIALOG_SCH_SHEET_PROPS_BASE - 519,198 + 519,187 wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER DIALOG_SHIM; dialog_shim.h Schematic Sheet Properties @@ -103,7 +103,7 @@ wxVERTICAL none - 12 + 5 wxALL|wxEXPAND 1 @@ -1472,7 +1472,7 @@ - 12 + 5 wxALL|wxEXPAND 0 diff --git a/eeschema/dialogs/dialog_sch_sheet_props_base.cpp b/eeschema/dialogs/dialog_sch_sheet_props_base.cpp index f8096707ee..60608965cb 100644 --- a/eeschema/dialogs/dialog_sch_sheet_props_base.cpp +++ b/eeschema/dialogs/dialog_sch_sheet_props_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -11,7 +11,7 @@ DIALOG_SCH_SHEET_PROPS_BASE::DIALOG_SCH_SHEET_PROPS_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetSizeHints( wxSize( 500,150 ), wxDefaultSize ); wxBoxSizer* mainSizer; mainSizer = new wxBoxSizer( wxVERTICAL ); @@ -99,7 +99,7 @@ DIALOG_SCH_SHEET_PROPS_BASE::DIALOG_SCH_SHEET_PROPS_BASE( wxWindow* parent, wxWi fgSizer1->Add( m_textCtrlTimeStamp, 0, wxEXPAND|wxTOP|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 5 ); - bupperSizer->Add( fgSizer1, 1, wxALL|wxEXPAND, 12 ); + bupperSizer->Add( fgSizer1, 1, wxALL|wxEXPAND, 5 ); mainSizer->Add( bupperSizer, 0, wxEXPAND, 5 ); @@ -117,7 +117,7 @@ DIALOG_SCH_SHEET_PROPS_BASE::DIALOG_SCH_SHEET_PROPS_BASE( wxWindow* parent, wxWi m_sdbSizer1->AddButton( m_sdbSizer1Cancel ); m_sdbSizer1->Realize(); - mainSizer->Add( m_sdbSizer1, 0, wxALL|wxEXPAND, 12 ); + mainSizer->Add( m_sdbSizer1, 0, wxALL|wxEXPAND, 5 ); this->SetSizer( mainSizer ); diff --git a/eeschema/dialogs/dialog_sch_sheet_props_base.h b/eeschema/dialogs/dialog_sch_sheet_props_base.h index 2260e9fc77..1b96203ddc 100644 --- a/eeschema/dialogs/dialog_sch_sheet_props_base.h +++ b/eeschema/dialogs/dialog_sch_sheet_props_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -57,7 +57,7 @@ class DIALOG_SCH_SHEET_PROPS_BASE : public DIALOG_SHIM public: - DIALOG_SCH_SHEET_PROPS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Schematic Sheet Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 519,198 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + DIALOG_SCH_SHEET_PROPS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Schematic Sheet Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 519,187 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~DIALOG_SCH_SHEET_PROPS_BASE(); }; diff --git a/include/dialog_helpers.h b/include/dialog_helpers.h index a6c1cf9777..657470a466 100644 --- a/include/dialog_helpers.h +++ b/include/dialog_helpers.h @@ -94,8 +94,10 @@ private: void onListItemSelected( wxListEvent& event ); void onListItemActivated( wxListEvent& event ); void textChangeInFilterBox(wxCommandEvent& event); - void sortList(); + void initDialog( const wxArrayString& aItemHeaders, + const wxString& aSelection); + void sortList(); bool m_sortList; void (* m_cb_func)( wxString& text, void* data ); void* m_cb_data; From ca2b9cee573eb2f0784ccf10f69874261c6896ef Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 19 Nov 2014 16:54:36 +0100 Subject: [PATCH 04/11] Try to fix issues on Ubuntu/Unity for dialogs which are not displayed: adding GetSizer()->Fit( this ) in some other dialogs --- eeschema/dialogs/dialog_print_using_printer.cpp | 3 +++ eeschema/sheet.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/eeschema/dialogs/dialog_print_using_printer.cpp b/eeschema/dialogs/dialog_print_using_printer.cpp index 0b3fec6c38..a8e63e5394 100644 --- a/eeschema/dialogs/dialog_print_using_printer.cpp +++ b/eeschema/dialogs/dialog_print_using_printer.cpp @@ -197,7 +197,10 @@ void DIALOG_PRINT_USING_PRINTER::OnInitDialog( wxInitDialogEvent& event ) pageSetupDialogData.GetPrintData().SetOrientation( pageInfo.GetWxOrientation() ); if ( GetSizer() ) + { GetSizer()->SetSizeHints( this ); + GetSizer()->Fit( this ); + } // Rely on the policy in class DIALOG_SHIM, which centers the dialog // initially during a runtime session but gives user the ability to move it in diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp index d902fe0111..d0e143d2b1 100644 --- a/eeschema/sheet.cpp +++ b/eeschema/sheet.cpp @@ -62,10 +62,12 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, wxDC* aDC ) * column from being sized correctly. It doesn't cause any problems * on win32 so it doesn't need to wrapped in ugly #ifdef __WXGTK__ * #endif. + * Still presen in wxWidgets 3.0.2 */ dlg.Layout(); dlg.Fit(); dlg.SetMinSize( dlg.GetSize() ); + dlg.GetSizer()->Fit( &dlg ); if( dlg.ShowModal() == wxID_CANCEL ) return false; From 8a1c8a91f4e7553cadc3041cb08bfd2b2799ba24 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 19 Nov 2014 18:13:55 +0100 Subject: [PATCH 05/11] More fixes on Ubuntu/Unity for dialogs which are not displayed. --- eeschema/dialogs/dialog_print_using_printer.cpp | 8 +++++--- eeschema/dialogs/dialog_schematic_find.cpp | 2 ++ gerbview/dialogs/dialog_print_using_printer.cpp | 5 +++++ pcbnew/dialogs/dialog_print_for_modedit.cpp | 5 ++++- pcbnew/dialogs/dialog_print_using_printer.cpp | 12 +++++------- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/eeschema/dialogs/dialog_print_using_printer.cpp b/eeschema/dialogs/dialog_print_using_printer.cpp index a8e63e5394..390b875103 100644 --- a/eeschema/dialogs/dialog_print_using_printer.cpp +++ b/eeschema/dialogs/dialog_print_using_printer.cpp @@ -165,6 +165,8 @@ DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( SCH_EDIT_FRAME* aParent // Problems with modal on wx-2.9 - Anyway preview is standard for OSX m_buttonPreview->Hide(); #endif + + GetSizer()->Fit( this ); } @@ -197,10 +199,7 @@ void DIALOG_PRINT_USING_PRINTER::OnInitDialog( wxInitDialogEvent& event ) pageSetupDialogData.GetPrintData().SetOrientation( pageInfo.GetWxOrientation() ); if ( GetSizer() ) - { GetSizer()->SetSizeHints( this ); - GetSizer()->Fit( this ); - } // Rely on the policy in class DIALOG_SHIM, which centers the dialog // initially during a runtime session but gives user the ability to move it in @@ -277,6 +276,7 @@ void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event ) preview->SetZoom( 100 ); SCH_PREVIEW_FRAME* frame = new SCH_PREVIEW_FRAME( preview, this, title ); + frame->SetMinSize( wxSize( 550, 350 ) ); // on first invocation in this runtime session, set to 2/3 size of my parent, // but will be changed in Show() if not first time as will position. @@ -284,6 +284,8 @@ void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event ) frame->Center(); frame->Initialize(); + + frame->Raise(); // Needed on Ubuntu/Unity to display the frame frame->Show( true ); } diff --git a/eeschema/dialogs/dialog_schematic_find.cpp b/eeschema/dialogs/dialog_schematic_find.cpp index d5d23ec283..63800ef534 100644 --- a/eeschema/dialogs/dialog_schematic_find.cpp +++ b/eeschema/dialogs/dialog_schematic_find.cpp @@ -90,6 +90,8 @@ DIALOG_SCH_FIND::DIALOG_SCH_FIND( wxWindow* aParent, wxFindReplaceData* aData, } SetSize( size ); + + GetSizer()->Fit( this ); // Needed on Ubuntu/Unity to display the dialog } diff --git a/gerbview/dialogs/dialog_print_using_printer.cpp b/gerbview/dialogs/dialog_print_using_printer.cpp index dd0bbf90a2..2baa22cc3a 100644 --- a/gerbview/dialogs/dialog_print_using_printer.cpp +++ b/gerbview/dialogs/dialog_print_using_printer.cpp @@ -133,6 +133,8 @@ DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( GERBVIEW_FRAME* parent ) /* Problems with modal on wx-2.9 - Anyway preview is standard for OSX */ m_buttonPreview->Hide(); #endif + + GetSizer()->Fit( this ); } @@ -368,8 +370,11 @@ void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event ) wxSize WSize = m_Parent->GetSize(); wxPreviewFrame* frame = new wxPreviewFrame( preview, this, title, WPos, WSize ); + frame->SetMinSize( wxSize( 550, 350 ) ); frame->Initialize(); + + frame->Raise(); // Needed on Ubuntu/Unity to display the frame frame->Show( true ); } diff --git a/pcbnew/dialogs/dialog_print_for_modedit.cpp b/pcbnew/dialogs/dialog_print_for_modedit.cpp index a0a19250a8..72504d547c 100644 --- a/pcbnew/dialogs/dialog_print_for_modedit.cpp +++ b/pcbnew/dialogs/dialog_print_for_modedit.cpp @@ -25,7 +25,6 @@ /* File: dialog_print_for_modedit.cpp */ #include -//#include #include #include #include @@ -116,6 +115,7 @@ DIALOG_PRINT_FOR_MODEDIT::DIALOG_PRINT_FOR_MODEDIT( PCB_BASE_FRAME* parent ) : m_buttonPrint->SetDefault(); GetSizer()->SetSizeHints( this ); + GetSizer()->Fit( this ); // Needed on Ubuntu/Unity to display the dialog } @@ -188,8 +188,11 @@ void DIALOG_PRINT_FOR_MODEDIT::OnPrintPreview( wxCommandEvent& event ) wxSize WSize = m_parent->GetSize(); wxPreviewFrame* frame = new wxPreviewFrame( preview, this, title, WPos, WSize ); + frame->SetMinSize( wxSize( 550, 350 ) ); frame->Initialize(); + + frame->Raise(); // Needed on Ubuntu/Unity to display the frame frame->Show( true ); } diff --git a/pcbnew/dialogs/dialog_print_using_printer.cpp b/pcbnew/dialogs/dialog_print_using_printer.cpp index 6334e1ca52..222c98ecfa 100644 --- a/pcbnew/dialogs/dialog_print_using_printer.cpp +++ b/pcbnew/dialogs/dialog_print_using_printer.cpp @@ -26,7 +26,6 @@ //#define wxTEST_POSTSCRIPT_IN_MSW 1 #include -//#include #include #include #include @@ -146,22 +145,18 @@ DIALOG_PRINT_USING_PRINTER::DIALOG_PRINT_USING_PRINTER( PCB_EDIT_FRAME* parent ) { m_parent = parent; m_config = Kiface().KifaceSettings(); - memset( m_BoxSelectLayer, 0, sizeof( m_BoxSelectLayer ) ); initValues( ); - if( GetSizer() ) - { - GetSizer()->SetSizeHints( this ); - } - + GetSizer()->SetSizeHints( this ); Center(); #ifdef __WXMAC__ /* Problems with modal on wx-2.9 - Anyway preview is standard for OSX */ m_buttonPreview->Hide(); #endif + GetSizer()->Fit( this ); } @@ -469,8 +464,11 @@ void DIALOG_PRINT_USING_PRINTER::OnPrintPreview( wxCommandEvent& event ) preview->SetZoom( 100 ); wxPreviewFrame* frame = new wxPreviewFrame( preview, this, title, WPos, WSize ); + frame->SetMinSize( wxSize( 550, 350 ) ); frame->Initialize(); + + frame->Raise(); // Needed on Ubuntu/Unity to display the frame frame->Show( true ); } From 149a04f3310df94f15c9d2aa9e3ca6819792ec5a Mon Sep 17 00:00:00 2001 From: Blair Bonnett Date: Wed, 19 Nov 2014 13:39:02 -0500 Subject: [PATCH 06/11] Fix crash in footprint editor when SMD pad diameter is zero. (fixes lp:1378917) --- pcbnew/dialogs/dialog_pad_properties.cpp | 54 +++++++++++++++++++----- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index cf16ff964c..48426322a6 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -151,6 +151,7 @@ private: void PadPropertiesAccept( wxCommandEvent& event ); }; + void PCB_BASE_FRAME::InstallPadOptionsFrame( D_PAD* aPad ) { DIALOG_PAD_PROPERTIES dlg( this, aPad ); @@ -245,14 +246,41 @@ void DIALOG_PAD_PROPERTIES::OnPaintShowPanel( wxPaintEvent& event ) dc.SetDeviceOrigin( dc_size.x / 2, dc_size.y / 2 ); // Calculate a suitable scale to fit the available draw area - int dim = m_dummyPad->GetSize().x + std::abs( m_dummyPad->GetDelta().y); + int dim = m_dummyPad->GetSize().x + std::abs( m_dummyPad->GetDelta().y ); + + // Invalid x size. User could enter zero, or have deleted all text prior to + // entering a new value; this is also treated as zero. If dim is left at + // zero, the drawing scale is zero and we get a crash. + if( dim == 0 ) + { + // If drill size has been set, use that. Otherwise default to 1mm. + dim = m_dummyPad->GetDrillSize().x; + if( dim == 0 ) + dim = 1000000; + } if( m_dummyPad->GetLocalClearance() > 0 ) dim += m_dummyPad->GetLocalClearance() * 2; double scale = (double) dc_size.x / dim; - dim = m_dummyPad->GetSize().y + std::abs( m_dummyPad->GetDelta().x); + // If the pad is a circle, use the x size here instead. + int ysize; + if( m_dummyPad->GetShape() == PAD_CIRCLE ) + ysize = m_dummyPad->GetSize().x; + else + ysize = m_dummyPad->GetSize().y; + + dim = ysize + std::abs( m_dummyPad->GetDelta().x ); + + // Invalid y size. See note about x size above. + if( dim == 0 ) + { + dim = m_dummyPad->GetDrillSize().y; + if( dim == 0 ) + dim = 1000000; + } + if( m_dummyPad->GetLocalClearance() > 0 ) dim += m_dummyPad->GetLocalClearance() * 2; @@ -666,13 +694,13 @@ void DIALOG_PAD_PROPERTIES::setPadLayersList( LSET layer_mask ) LSET cu_set = layer_mask & LSET::AllCuMask(); if( cu_set == LSET( F_Cu ) ) - m_rbCopperLayersSel->SetSelection(0); + m_rbCopperLayersSel->SetSelection( 0 ); else if( cu_set == LSET( B_Cu ) ) - m_rbCopperLayersSel->SetSelection(1); + m_rbCopperLayersSel->SetSelection( 1 ); else if( cu_set.any() ) - m_rbCopperLayersSel->SetSelection(2); + m_rbCopperLayersSel->SetSelection( 2 ); else - m_rbCopperLayersSel->SetSelection(3); + m_rbCopperLayersSel->SetSelection( 3 ); m_PadLayerAdhCmp->SetValue( layer_mask[F_Adhes] ); m_PadLayerAdhCu->SetValue( layer_mask[B_Adhes] ); @@ -710,6 +738,12 @@ bool DIALOG_PAD_PROPERTIES::padValuesOK() wxString msg; // Test for incorrect values + if( (m_dummyPad->GetSize().x <= 0) || + ((m_dummyPad->GetSize().y <= 0) && (m_dummyPad->GetShape() != PAD_CIRCLE)) ) + { + error_msgs.Add( _( "Pad size must be greater than zero" ) ); + } + if( (m_dummyPad->GetSize().x < m_dummyPad->GetDrillSize().x) || (m_dummyPad->GetSize().y < m_dummyPad->GetDrillSize().y) ) { @@ -730,10 +764,10 @@ bool DIALOG_PAD_PROPERTIES::padValuesOK() if( m_dummyPad->GetAttribute() == PAD_HOLE_NOT_PLATED ) { - msg += wxT("

"); - msg += _( "For NPTH pad, set pad size value to pad drill value," - " if you do not want this pad plotted in gerber files" - ); + msg += wxT( "

" ); + msg += _( "For NPTH pad, set pad size value to pad drill value," + " if you do not want this pad plotted in gerber files" + ); } error_msgs.Add( msg ); From 383fec1510310ac3fd5a1ba4c419107ccbd7bab0 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 19 Nov 2014 21:45:57 +0100 Subject: [PATCH 07/11] More about fix issue on Ubuntu/Unity. --- common/kiway_player.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/kiway_player.cpp b/common/kiway_player.cpp index 5e735e5a3c..f3735672b2 100644 --- a/common/kiway_player.cpp +++ b/common/kiway_player.cpp @@ -96,7 +96,10 @@ bool KIWAY_PLAYER::ShowModal( wxString* aResult, wxWindow* aResultantFocusWindow m_modal_resultant_parent = aResultantFocusWindow; + + Raise(); // Needed on Ubuntu-14/Unity to display the frame Show( true ); + SetFocus(); { From 18898fe807aa5f57bbed9e410498c0872c71f68a Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Fri, 21 Nov 2014 11:28:34 +0100 Subject: [PATCH 08/11] tool: Added a generic parameter for RunAction(). --- common/tool/tool_manager.cpp | 24 ++++++++++-------------- include/tool/tool_event.h | 33 ++++++++++++++++++++++++++++++--- include/tool/tool_manager.h | 8 ++++++-- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/common/tool/tool_manager.cpp b/common/tool/tool_manager.cpp index 6aec0a9002..f3705d8ac8 100644 --- a/common/tool/tool_manager.cpp +++ b/common/tool/tool_manager.cpp @@ -292,21 +292,19 @@ void TOOL_MANAGER::UnregisterAction( TOOL_ACTION* aAction ) } -bool TOOL_MANAGER::RunAction( const std::string& aActionName, bool aNow ) +bool TOOL_MANAGER::RunAction( const std::string& aActionName, bool aNow, void* aParam ) { TOOL_ACTION* action = m_actionMgr->FindAction( aActionName ); if( action ) { + TOOL_EVENT event = action->MakeEvent(); + event.SetParameter( aParam ); + if( aNow ) - { - TOOL_EVENT event = action->MakeEvent(); ProcessEvent( event ); - } else - { - PostEvent( action->MakeEvent() ); - } + PostEvent( event ); return true; } @@ -315,17 +313,15 @@ bool TOOL_MANAGER::RunAction( const std::string& aActionName, bool aNow ) } -void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow ) +void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow, void* aParam ) { + TOOL_EVENT event = aAction.MakeEvent(); + event.SetParameter( aParam ); + if( aNow ) - { - TOOL_EVENT event = aAction.MakeEvent(); ProcessEvent( event ); - } else - { - PostEvent( aAction.MakeEvent() ); - } + PostEvent( event ); } diff --git a/include/tool/tool_event.h b/include/tool/tool_event.h index 21ee2afd68..435451b676 100644 --- a/include/tool/tool_event.h +++ b/include/tool/tool_event.h @@ -165,7 +165,8 @@ public: m_scope( aScope ), m_mouseButtons( 0 ), m_keyCode( 0 ), - m_modifiers( 0 ) {} + m_modifiers( 0 ), + m_param( NULL ) {} TOOL_EVENT( TOOL_EVENT_CATEGORY aCategory, TOOL_ACTIONS aAction, int aExtraParam, TOOL_ACTION_SCOPE aScope = AS_GLOBAL ) : @@ -174,7 +175,8 @@ public: m_scope( aScope ), m_mouseButtons( 0 ), m_keyCode( 0 ), - m_modifiers( 0 ) + m_modifiers( 0 ), + m_param( NULL ) { if( aCategory == TC_MOUSE ) { @@ -202,7 +204,8 @@ public: m_scope( aScope ), m_mouseButtons( 0 ), m_keyCode( 0 ), - m_modifiers( 0 ) + m_modifiers( 0 ), + m_param( NULL ) { if( aCategory == TC_COMMAND || aCategory == TC_MESSAGE ) m_commandStr = aExtraParam; @@ -352,6 +355,27 @@ public: */ bool IsAction( const TOOL_ACTION* aAction ) const; + /** + * Function Parameter() + * Returns a non-standard parameter assigned to the event. Its meaning depends on the + * target tool. + */ + void* Parameter() const + { + return m_param; + } + + /** + * Function SetParameter() + * Sets a non-standard parameter assigned to the event. Its meaning depends on the + * target tool. + * @param aParam is the new parameter. + */ + void SetParameter(void* aParam) + { + m_param = aParam; + } + boost::optional GetCommandId() const { return m_commandId; @@ -388,6 +412,9 @@ private: ///> State of key modifierts (Ctrl/Alt/etc.) int m_modifiers; + ///> Generic parameter used for passing non-standard data. + void* m_param; + boost::optional m_commandId; boost::optional m_commandStr; }; diff --git a/include/tool/tool_manager.h b/include/tool/tool_manager.h index 9e2dfdee50..3805fe85a8 100644 --- a/include/tool/tool_manager.h +++ b/include/tool/tool_manager.h @@ -108,9 +108,11 @@ public: * @param aActionName is the name of action to be invoked. * @param aNow decides if the action has to be run immediately or after the current coroutine * is preemptied. + * @param aParam is an optional parameter that might be used by the invoked action. Its meaning + * depends on the action. * @return False if the action was not found. */ - bool RunAction( const std::string& aActionName, bool aNow = false ); + bool RunAction( const std::string& aActionName, bool aNow = false, void* aParam = NULL ); /** * Function RunAction() @@ -119,8 +121,10 @@ public: * @param aAction is the action to be invoked. * @param aNow decides if the action has to be run immediately or after the current coroutine * is preemptied. + * @param aParam is an optional parameter that might be used by the invoked action. Its meaning + * depends on the action. */ - void RunAction( const TOOL_ACTION& aAction, bool aNow = false ); + void RunAction( const TOOL_ACTION& aAction, bool aNow = false, void* aParam = NULL ); /** * Function FindTool() From 62e2537e737bf9ed71002a507d9a90776552deb0 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Fri, 21 Nov 2014 11:49:28 +0100 Subject: [PATCH 09/11] selection_tool: Renamed selectSingle to selectCursor. --- pcbnew/tools/common_actions.cpp | 2 +- pcbnew/tools/common_actions.h | 2 +- pcbnew/tools/edit_tool.cpp | 2 +- pcbnew/tools/selection_tool.cpp | 20 ++++++++++---------- pcbnew/tools/selection_tool.h | 10 +++++----- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pcbnew/tools/common_actions.cpp b/pcbnew/tools/common_actions.cpp index c73fdaf16c..7d39c44310 100644 --- a/pcbnew/tools/common_actions.cpp +++ b/pcbnew/tools/common_actions.cpp @@ -32,7 +32,7 @@ TOOL_ACTION COMMON_ACTIONS::selectionActivate( "pcbnew.InteractiveSelection", AS_GLOBAL, 0, "", "", AF_ACTIVATE ); // No description, it is not supposed to be shown anywhere -TOOL_ACTION COMMON_ACTIONS::selectionSingle( "pcbnew.InteractiveSelection.Single", +TOOL_ACTION COMMON_ACTIONS::selectionCursor( "pcbnew.InteractiveSelection.Cursor", AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere diff --git a/pcbnew/tools/common_actions.h b/pcbnew/tools/common_actions.h index c24bc0910f..0489c6f101 100644 --- a/pcbnew/tools/common_actions.h +++ b/pcbnew/tools/common_actions.h @@ -41,7 +41,7 @@ public: static TOOL_ACTION selectionActivate; /// Select a single item under the cursor position - static TOOL_ACTION selectionSingle; + static TOOL_ACTION selectionCursor; /// Clears the current selection static TOOL_ACTION selectionClear; diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp index 177191e444..be76326bf2 100644 --- a/pcbnew/tools/edit_tool.cpp +++ b/pcbnew/tools/edit_tool.cpp @@ -581,7 +581,7 @@ wxPoint EDIT_TOOL::getModificationPoint( const SELECTION& aSelection ) bool EDIT_TOOL::makeSelection( const SELECTION& aSelection ) { if( aSelection.Empty() ) // Try to find an item that could be modified - m_toolMgr->RunAction( COMMON_ACTIONS::selectionSingle, true ); + m_toolMgr->RunAction( COMMON_ACTIONS::selectionCursor, true ); return !aSelection.Empty(); } diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index 3ee9968fb4..461b74a17c 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -111,7 +111,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) if( !m_additive ) clearSelection(); - selectSingle( evt->Position() ); + selectCursor( evt->Position() ); } } @@ -119,7 +119,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else if( evt->IsClick( BUT_RIGHT ) ) { if( m_selection.Empty() ) - selectSingle( evt->Position() ); + selectCursor( evt->Position() ); generateMenu(); } @@ -128,7 +128,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else if( evt->IsDblClick( BUT_LEFT ) ) { if( m_selection.Empty() ) - selectSingle( evt->Position() ); + selectCursor( evt->Position() ); m_toolMgr->RunAction( COMMON_ACTIONS::properties ); } @@ -143,7 +143,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else if( m_selection.Empty() ) { // There is nothing selected, so try to select something - if( !selectSingle( getView()->ToWorld( getViewControls()->GetMousePosition() ), false ) ) + if( !selectCursor( getView()->ToWorld( getViewControls()->GetMousePosition() ), false ) ) { // If nothings has been selected or user wants to select more // draw the selection box @@ -171,10 +171,10 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) } } - else if( evt->IsAction( &COMMON_ACTIONS::selectionSingle ) ) + else if( evt->IsAction( &COMMON_ACTIONS::selectionCursor ) ) { // GetMousePosition() is used, as it is independent of snapping settings - selectSingle( getView()->ToWorld( getViewControls()->GetMousePosition() ) ); + selectCursor( getView()->ToWorld( getViewControls()->GetMousePosition() ) ); } else if( evt->IsAction( &COMMON_ACTIONS::find ) ) @@ -245,7 +245,7 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem ) } -bool SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere, bool aAllowDisambiguation ) +bool SELECTION_TOOL::selectCursor( const VECTOR2I& aWhere, bool aAllowDisambiguation ) { BOARD_ITEM* item; GENERAL_COLLECTORS_GUIDE guide = m_frame->GetCollectorsGuide(); @@ -395,7 +395,7 @@ bool SELECTION_TOOL::selectMultiple() void SELECTION_TOOL::setTransitions() { Go( &SELECTION_TOOL::Main, COMMON_ACTIONS::selectionActivate.MakeEvent() ); - Go( &SELECTION_TOOL::SingleSelection, COMMON_ACTIONS::selectionSingle.MakeEvent() ); + Go( &SELECTION_TOOL::CursorSelection, COMMON_ACTIONS::selectionCursor.MakeEvent() ); Go( &SELECTION_TOOL::ClearSelection, COMMON_ACTIONS::selectionClear.MakeEvent() ); Go( &SELECTION_TOOL::find, COMMON_ACTIONS::find.MakeEvent() ); Go( &SELECTION_TOOL::findMove, COMMON_ACTIONS::findMove.MakeEvent() ); @@ -444,9 +444,9 @@ bool SELECTION_TOOL::CheckLock() } -int SELECTION_TOOL::SingleSelection( TOOL_EVENT& aEvent ) +int SELECTION_TOOL::CursorSelection( TOOL_EVENT& aEvent ) { - selectSingle( getView()->ToWorld( getViewControls()->GetMousePosition() ) ); + selectCursor( getView()->ToWorld( getViewControls()->GetMousePosition() ) ); setTransitions(); return 0; diff --git a/pcbnew/tools/selection_tool.h b/pcbnew/tools/selection_tool.h index 70e18cd7bd..e5d82f5b3d 100644 --- a/pcbnew/tools/selection_tool.h +++ b/pcbnew/tools/selection_tool.h @@ -151,8 +151,8 @@ public: ///> Checks if the user has agreed to modify locked items for the given selection. bool CheckLock(); - ///> Select single item event handler. - int SingleSelection( TOOL_EVENT& aEvent ); + ///> Select a single item under cursor event handler. + int CursorSelection( TOOL_EVENT& aEvent ); ///> Clear current selection event handler. int ClearSelection( TOOL_EVENT& aEvent ); @@ -168,7 +168,7 @@ public: private: /** - * Function selectSingle() + * Function selectCursor() * Selects an item pointed by the parameter aWhere. If there is more than one item at that * place, there is a menu displayed that allows to choose the item. * @@ -177,7 +177,7 @@ private: * a menu is shown, otherise function finishes without selecting anything. * @return True if an item was selected, false otherwise. */ - bool selectSingle( const VECTOR2I& aWhere, bool aAllowDisambiguation = true ); + bool selectCursor( const VECTOR2I& aWhere, bool aAllowDisambiguation = true ); /** * Function selectMultiple() @@ -208,7 +208,7 @@ private: /** * Function disambiguationMenu() * Handles the menu that allows to select one of many items in case there is more than one - * item at the selected point (@see selectSingle()). + * item at the selected point (@see selectCursor()). * * @param aItems contains list of items that are displayed to the user. */ From 823623acb8a2c73b710d6ffc20a645ce5e77c9b1 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Fri, 21 Nov 2014 11:49:54 +0100 Subject: [PATCH 10/11] selection_tool: Renamed deselect* to unselect* for naming consistency. --- pcbnew/tools/point_editor.cpp | 4 ++-- pcbnew/tools/selection_tool.cpp | 22 +++++++++++----------- pcbnew/tools/selection_tool.h | 18 +++++++++--------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pcbnew/tools/point_editor.cpp b/pcbnew/tools/point_editor.cpp index d409804b26..023e491fc1 100644 --- a/pcbnew/tools/point_editor.cpp +++ b/pcbnew/tools/point_editor.cpp @@ -233,7 +233,7 @@ int POINT_EDITOR::OnSelectionChange( TOOL_EVENT& aEvent ) { if( !m_editPoints || evt->Matches( m_selectionTool->ClearedEvent ) || - evt->Matches( m_selectionTool->DeselectedEvent ) || + evt->Matches( m_selectionTool->UnselectedEvent ) || evt->Matches( m_selectionTool->SelectedEvent ) ) { break; @@ -783,7 +783,7 @@ void POINT_EDITOR::breakOutline( const VECTOR2I& aBreakPoint ) void POINT_EDITOR::setTransitions() { Go( &POINT_EDITOR::OnSelectionChange, m_selectionTool->SelectedEvent ); - Go( &POINT_EDITOR::OnSelectionChange, m_selectionTool->DeselectedEvent ); + Go( &POINT_EDITOR::OnSelectionChange, m_selectionTool->UnselectedEvent ); } diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index 461b74a17c..e4903f2d9d 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -52,7 +52,7 @@ SELECTION_TOOL::SELECTION_TOOL() : TOOL_INTERACTIVE( "pcbnew.InteractiveSelection" ), SelectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.selected" ), - DeselectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.deselected" ), + UnselectedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.unselected" ), ClearedEvent( TC_MESSAGE, TA_ACTION, "pcbnew.InteractiveSelection.cleared" ), m_frame( NULL ), m_additive( false ), m_multiple( false ), m_editModules( false ), m_locked( true ) @@ -221,11 +221,11 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem ) { if( aItem->IsSelected() ) { - deselect( aItem ); + unselect( aItem ); // Inform other potentially interested tools - TOOL_EVENT deselectEvent( DeselectedEvent ); - m_toolMgr->ProcessEvent( deselectEvent ); + TOOL_EVENT unselectEvent( UnselectedEvent ); + m_toolMgr->ProcessEvent( unselectEvent ); } else { @@ -734,17 +734,17 @@ void SELECTION_TOOL::select( BOARD_ITEM* aItem ) } -void SELECTION_TOOL::deselect( BOARD_ITEM* aItem ) +void SELECTION_TOOL::unselect( BOARD_ITEM* aItem ) { // Modules are treated in a special way - when they are selected, we have to - // deselect all the parts that make the module, not the module itself + // unselect all the parts that make the module, not the module itself if( aItem->Type() == PCB_MODULE_T ) { MODULE* module = static_cast( aItem ); - module->RunOnChildren( boost::bind( &SELECTION_TOOL::deselectVisually, this, _1 ) ); + module->RunOnChildren( boost::bind( &SELECTION_TOOL::unselectVisually, this, _1 ) ); } - deselectVisually( aItem ); + unselectVisually( aItem ); int itemIdx = m_selection.items.FindItem( aItem ); if( itemIdx >= 0 ) @@ -757,8 +757,8 @@ void SELECTION_TOOL::deselect( BOARD_ITEM* aItem ) } // Inform other potentially interested tools - TOOL_EVENT deselected( DeselectedEvent ); - m_toolMgr->ProcessEvent( deselected ); + TOOL_EVENT unselected( UnselectedEvent ); + m_toolMgr->ProcessEvent( unselected ); } @@ -772,7 +772,7 @@ void SELECTION_TOOL::selectVisually( BOARD_ITEM* aItem ) const } -void SELECTION_TOOL::deselectVisually( BOARD_ITEM* aItem ) const +void SELECTION_TOOL::unselectVisually( BOARD_ITEM* aItem ) const { m_selection.group->Remove( aItem ); diff --git a/pcbnew/tools/selection_tool.h b/pcbnew/tools/selection_tool.h index e5d82f5b3d..11b1d57df6 100644 --- a/pcbnew/tools/selection_tool.h +++ b/pcbnew/tools/selection_tool.h @@ -160,8 +160,8 @@ public: ///> Event sent after an item is selected. const TOOL_EVENT SelectedEvent; - ///> Event sent after an item is deselected. - const TOOL_EVENT DeselectedEvent; + ///> Event sent after an item is unselected. + const TOOL_EVENT UnselectedEvent; ///> Event sent after selection is cleared. const TOOL_EVENT ClearedEvent; @@ -247,26 +247,26 @@ private: void select( BOARD_ITEM* aItem ); /** - * Function deselectItem() - * Takes necessary action mark an item as deselected. + * Function unselectItem() + * Takes necessary action mark an item as unselected. * - * @param aItem is an item to be deselected. + * @param aItem is an item to be unselected. */ - void deselect( BOARD_ITEM* aItem ); + void unselect( BOARD_ITEM* aItem ); /** - * Function deselectVisually() + * Function unselectVisually() * Marks item as selected, but does not add it to the ITEMS_PICKED_LIST. * @param aItem is an item to be be marked. */ void selectVisually( BOARD_ITEM* aItem ) const; /** - * Function deselectVisually() + * Function unselectVisually() * Marks item as selected, but does not add it to the ITEMS_PICKED_LIST. * @param aItem is an item to be be marked. */ - void deselectVisually( BOARD_ITEM* aItem ) const; + void unselectVisually( BOARD_ITEM* aItem ) const; /** * Function containsSelected() From 0c1a87ca56afe47099bc1d04c25758455181ed2e Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Fri, 21 Nov 2014 11:50:13 +0100 Subject: [PATCH 11/11] selection_tool: Added SelectItem and UnselectItem actions. --- pcbnew/tools/common_actions.cpp | 8 ++++++ pcbnew/tools/common_actions.h | 6 ++++ pcbnew/tools/selection_tool.cpp | 51 +++++++++++++++++++++++++++++++-- pcbnew/tools/selection_tool.h | 6 ++++ 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/pcbnew/tools/common_actions.cpp b/pcbnew/tools/common_actions.cpp index 7d39c44310..456a0219af 100644 --- a/pcbnew/tools/common_actions.cpp +++ b/pcbnew/tools/common_actions.cpp @@ -36,6 +36,14 @@ TOOL_ACTION COMMON_ACTIONS::selectionCursor( "pcbnew.InteractiveSelection.Cursor AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere +TOOL_ACTION COMMON_ACTIONS::selectItem( "pcbnew.InteractiveSelection.SelectItem", + AS_GLOBAL, 0, + "", "" ); // No description, it is not supposed to be shown anywhere + +TOOL_ACTION COMMON_ACTIONS::unselectItem( "pcbnew.InteractiveSelection.UnselectItem", + AS_GLOBAL, 0, + "", "" ); // No description, it is not supposed to be shown anywhere + TOOL_ACTION COMMON_ACTIONS::selectionClear( "pcbnew.InteractiveSelection.Clear", AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere diff --git a/pcbnew/tools/common_actions.h b/pcbnew/tools/common_actions.h index 0489c6f101..366f4440dd 100644 --- a/pcbnew/tools/common_actions.h +++ b/pcbnew/tools/common_actions.h @@ -46,6 +46,12 @@ public: /// Clears the current selection static TOOL_ACTION selectionClear; + /// Selects an item (specified as the event parameter). + static TOOL_ACTION selectItem; + + /// Unselects an item (specified as the event parameter). + static TOOL_ACTION unselectItem; + // Edit Tool /// Activation of the edit tool static TOOL_ACTION editActivate; diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index e4903f2d9d..df5709aae5 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -187,6 +187,16 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) findMove( *evt ); } + else if( evt->IsAction( &COMMON_ACTIONS::selectItem ) ) + { + SelectItem( *evt ); + } + + else if( evt->IsAction( &COMMON_ACTIONS::unselectItem ) ) + { + UnselectItem( *evt ); + } + else if( evt->IsCancel() || evt->Action() == TA_UNDO_REDO || evt->IsAction( &COMMON_ACTIONS::selectionClear ) ) { @@ -397,6 +407,8 @@ void SELECTION_TOOL::setTransitions() Go( &SELECTION_TOOL::Main, COMMON_ACTIONS::selectionActivate.MakeEvent() ); Go( &SELECTION_TOOL::CursorSelection, COMMON_ACTIONS::selectionCursor.MakeEvent() ); Go( &SELECTION_TOOL::ClearSelection, COMMON_ACTIONS::selectionClear.MakeEvent() ); + Go( &SELECTION_TOOL::SelectItem, COMMON_ACTIONS::selectItem.MakeEvent() ); + Go( &SELECTION_TOOL::UnselectItem, COMMON_ACTIONS::unselectItem.MakeEvent() ); Go( &SELECTION_TOOL::find, COMMON_ACTIONS::find.MakeEvent() ); Go( &SELECTION_TOOL::findMove, COMMON_ACTIONS::findMove.MakeEvent() ); } @@ -461,6 +473,43 @@ int SELECTION_TOOL::ClearSelection( TOOL_EVENT& aEvent ) return 0; } +int SELECTION_TOOL::SelectItem( TOOL_EVENT& aEvent ) +{ + // Check if there is an item to be selected + BOARD_ITEM* item = static_cast( aEvent.Parameter() ); + + if( item ) + { + select( item ); + + // Inform other potentially interested tools + TOOL_EVENT select( SelectedEvent ); + m_toolMgr->ProcessEvent( select ); + } + + setTransitions(); + + return 0; +} + +int SELECTION_TOOL::UnselectItem( TOOL_EVENT& aEvent ) +{ + // Check if there is an item to be selected + BOARD_ITEM* item = static_cast( aEvent.Parameter() ); + + if( item ) + { + unselect( item ); + + // Inform other potentially interested tools + TOOL_EVENT unselect( UnselectedEvent ); + m_toolMgr->ProcessEvent( unselect ); + } + + setTransitions(); + + return 0; +} void SELECTION_TOOL::findCallback( BOARD_ITEM* aItem ) { @@ -525,8 +574,6 @@ void SELECTION_TOOL::clearSelection() // Inform other potentially interested tools TOOL_EVENT clearEvent( ClearedEvent ); m_toolMgr->ProcessEvent( clearEvent ); - - return; } diff --git a/pcbnew/tools/selection_tool.h b/pcbnew/tools/selection_tool.h index 11b1d57df6..89cb40b4ec 100644 --- a/pcbnew/tools/selection_tool.h +++ b/pcbnew/tools/selection_tool.h @@ -157,6 +157,12 @@ public: ///> Clear current selection event handler. int ClearSelection( TOOL_EVENT& aEvent ); + ///> Item selection event handler. + int SelectItem( TOOL_EVENT& aEvent ); + + ///> Item unselection event handler. + int UnselectItem( TOOL_EVENT& aEvent ); + ///> Event sent after an item is selected. const TOOL_EVENT SelectedEvent;