diff --git a/eeschema/dialogs/panel_sym_editing_options.cpp b/eeschema/dialogs/panel_sym_editing_options.cpp index 2ae18ff696..e3123d1d28 100644 --- a/eeschema/dialogs/panel_sym_editing_options.cpp +++ b/eeschema/dialogs/panel_sym_editing_options.cpp @@ -56,6 +56,7 @@ void PANEL_SYM_EDITING_OPTIONS::loadSymEditorSettings( SYMBOL_EDITOR_SETTINGS* a m_pinPitch.SetValue( schIUScale.MilsToIU( aCfg->m_Repeat.pin_step ) ); m_spinRepeatLabel->SetValue( aCfg->m_Repeat.label_delta ); m_cbShowPinElectricalType->SetValue( aCfg->m_ShowPinElectricalType ); + m_dragPinsWithEdges->SetValue( aCfg->m_dragPinsAlongWithEdges ); } @@ -83,6 +84,7 @@ bool PANEL_SYM_EDITING_OPTIONS::TransferDataFromWindow() settings->m_Repeat.label_delta = m_spinRepeatLabel->GetValue(); settings->m_Repeat.pin_step = schIUScale.IUToMils( m_pinPitch.GetIntValue() ); settings->m_ShowPinElectricalType = m_cbShowPinElectricalType->GetValue(); + settings->m_dragPinsAlongWithEdges = m_dragPinsWithEdges->GetValue(); // Force pin_step to a grid multiple settings->m_Repeat.pin_step = KiROUND( double( settings->m_Repeat.pin_step ) / MIN_GRID ) * MIN_GRID; diff --git a/eeschema/dialogs/panel_sym_editing_options_base.cpp b/eeschema/dialogs/panel_sym_editing_options_base.cpp index 32f88ab53e..469a5d9d3e 100644 --- a/eeschema/dialogs/panel_sym_editing_options_base.cpp +++ b/eeschema/dialogs/panel_sym_editing_options_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) +// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -140,6 +140,25 @@ PANEL_SYM_EDITING_OPTIONS_BASE::PANEL_SYM_EDITING_OPTIONS_BASE( wxWindow* parent p1mainSizer->Add( leftColumn, 0, wxEXPAND, 5 ); + wxBoxSizer* rightColumn; + rightColumn = new wxBoxSizer( wxVERTICAL ); + + m_generalOption = new wxStaticText( this, wxID_ANY, _("General editing"), wxDefaultPosition, wxDefaultSize, 0 ); + m_generalOption->Wrap( -1 ); + rightColumn->Add( m_generalOption, 0, wxLEFT|wxTOP, 13 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + rightColumn->Add( m_staticline3, 0, wxEXPAND | wxALL, 5 ); + + m_dragPinsWithEdges = new wxCheckBox( this, wxID_ANY, _("Keep pins attached when dragging edges"), wxDefaultPosition, wxDefaultSize, 0 ); + rightColumn->Add( m_dragPinsWithEdges, 0, wxBOTTOM|wxLEFT, 10 ); + + + rightColumn->Add( 0, 15, 1, wxEXPAND, 5 ); + + + p1mainSizer->Add( rightColumn, 1, wxEXPAND, 5 ); + this->SetSizer( p1mainSizer ); this->Layout(); diff --git a/eeschema/dialogs/panel_sym_editing_options_base.fbp b/eeschema/dialogs/panel_sym_editing_options_base.fbp index c0f0d0c5f0..fca927c371 100644 --- a/eeschema/dialogs/panel_sym_editing_options_base.fbp +++ b/eeschema/dialogs/panel_sym_editing_options_base.fbp @@ -1,34 +1,36 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <wxFormBuilder_Project> - <FileVersion major="1" minor="17"/> + <FileVersion major="1" minor="18"/> <object class="Project" expanded="true"> - <property name="class_decoration"></property> <property name="code_generation">C++</property> - <property name="disconnect_events">1</property> - <property name="disconnect_mode">source_name</property> - <property name="disconnect_php_events">0</property> - <property name="disconnect_python_events">0</property> + <property name="cpp_class_decoration"></property> + <property name="cpp_disconnect_events">1</property> + <property name="cpp_event_generation">connect</property> + <property name="cpp_help_provider">none</property> + <property name="cpp_namespace"></property> + <property name="cpp_precompiled_header"></property> + <property name="cpp_use_array_enum">0</property> + <property name="cpp_use_enum">0</property> <property name="embedded_files_path">res</property> <property name="encoding">UTF-8</property> - <property name="event_generation">connect</property> <property name="file">panel_sym_editing_options_base</property> <property name="first_id">1000</property> - <property name="help_provider">none</property> - <property name="image_path_wrapper_function_name"></property> - <property name="indent_with_spaces"></property> <property name="internationalize">1</property> + <property name="lua_skip_events">1</property> + <property name="lua_ui_table">UI</property> <property name="name">PanelSymEditingOptionsBase</property> - <property name="namespace"></property> <property name="path">.</property> - <property name="precompiled_header"></property> + <property name="php_disconnect_events">0</property> + <property name="php_disconnect_mode">source_name</property> + <property name="php_skip_events">1</property> + <property name="python_disconnect_events">0</property> + <property name="python_disconnect_mode">source_name</property> + <property name="python_image_path_wrapper_function_name"></property> + <property name="python_indent_with_spaces"></property> + <property name="python_skip_events">1</property> <property name="relative_path">1</property> - <property name="skip_lua_events">1</property> - <property name="skip_php_events">1</property> - <property name="skip_python_events">1</property> - <property name="ui_table">UI</property> - <property name="use_array_enum">0</property> - <property name="use_enum">0</property> <property name="use_microsoft_bom">0</property> + <property name="use_native_eol">0</property> <object class="Panel" expanded="true"> <property name="aui_managed">0</property> <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property> @@ -76,10 +78,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -148,10 +150,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -225,10 +227,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -290,10 +292,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -317,7 +319,7 @@ <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> - <property name="maxlength"></property> + <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> <property name="minimum_size"></property> @@ -358,10 +360,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -423,10 +425,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -488,10 +490,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -553,10 +555,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -580,7 +582,7 @@ <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> - <property name="maxlength"></property> + <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> <property name="minimum_size"></property> @@ -621,10 +623,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -686,10 +688,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -751,10 +753,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -778,7 +780,7 @@ <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> - <property name="maxlength"></property> + <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> <property name="minimum_size"></property> @@ -819,10 +821,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -884,10 +886,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -949,10 +951,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -976,7 +978,7 @@ <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> - <property name="maxlength"></property> + <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> <property name="minimum_size"></property> @@ -1017,10 +1019,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1082,10 +1084,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1147,10 +1149,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1174,7 +1176,7 @@ <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> - <property name="maxlength"></property> + <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> <property name="minimum_size"></property> @@ -1215,10 +1217,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1279,10 +1281,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1354,10 +1356,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1426,10 +1428,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1503,10 +1505,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1568,10 +1570,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1595,7 +1597,7 @@ <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> - <property name="maxlength"></property> + <property name="maxlength">0</property> <property name="min_size"></property> <property name="minimize_button">0</property> <property name="minimum_size"></property> @@ -1637,10 +1639,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1702,10 +1704,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1767,10 +1769,10 @@ <property name="LeftDockable">1</property> <property name="RightDockable">1</property> <property name="TopDockable">1</property> - <property name="aui_layer"></property> + <property name="aui_layer">0</property> <property name="aui_name"></property> - <property name="aui_position"></property> - <property name="aui_row"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> <property name="best_size"></property> <property name="bg"></property> <property name="caption"></property> @@ -1825,6 +1827,213 @@ </object> </object> </object> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxEXPAND</property> + <property name="proportion">1</property> + <object class="wxBoxSizer" expanded="true"> + <property name="minimum_size"></property> + <property name="name">rightColumn</property> + <property name="orient">wxVERTICAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="true"> + <property name="border">13</property> + <property name="flag">wxLEFT|wxTOP</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="true"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer">0</property> + <property name="aui_name"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">General editing</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_generalOption</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxEXPAND | wxALL</property> + <property name="proportion">0</property> + <object class="wxStaticLine" expanded="true"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer">0</property> + <property name="aui_name"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_staticline3</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style">wxLI_HORIZONTAL</property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="true"> + <property name="border">10</property> + <property name="flag">wxBOTTOM|wxLEFT</property> + <property name="proportion">0</property> + <object class="wxCheckBox" expanded="true"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer">0</property> + <property name="aui_name"></property> + <property name="aui_position">0</property> + <property name="aui_row">0</property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="checked">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="drag_accept_files">0</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Keep pins attached when dragging edges</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_dragPinsWithEdges</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="validator_data_type"></property> + <property name="validator_style">wxFILTER_NONE</property> + <property name="validator_type">wxDefaultValidator</property> + <property name="validator_variable"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="true"> + <property name="border">5</property> + <property name="flag">wxEXPAND</property> + <property name="proportion">1</property> + <object class="spacer" expanded="true"> + <property name="height">15</property> + <property name="permission">protected</property> + <property name="width">0</property> + </object> + </object> + </object> + </object> </object> </object> </object> diff --git a/eeschema/dialogs/panel_sym_editing_options_base.h b/eeschema/dialogs/panel_sym_editing_options_base.h index 65d69f8477..80fb0a3141 100644 --- a/eeschema/dialogs/panel_sym_editing_options_base.h +++ b/eeschema/dialogs/panel_sym_editing_options_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) +// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -27,7 +27,6 @@ /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// /// Class PANEL_SYM_EDITING_OPTIONS_BASE /////////////////////////////////////////////////////////////////////////////// @@ -62,6 +61,9 @@ class PANEL_SYM_EDITING_OPTIONS_BASE : public RESETTABLE_PANEL wxStaticText* m_pinPitchUnits; wxStaticText* m_labelIncrementLabel1; wxSpinCtrl* m_spinRepeatLabel; + wxStaticText* m_generalOption; + wxStaticLine* m_staticline3; + wxCheckBox* m_dragPinsWithEdges; // Virtual event handlers, override them in your derived class virtual void onKillFocusPinPitch( wxFocusEvent& event ) { event.Skip(); } diff --git a/eeschema/symbol_editor/symbol_editor_settings.cpp b/eeschema/symbol_editor/symbol_editor_settings.cpp index fb0bcf929a..ee831d3ce5 100644 --- a/eeschema/symbol_editor/symbol_editor_settings.cpp +++ b/eeschema/symbol_editor/symbol_editor_settings.cpp @@ -109,6 +109,9 @@ SYMBOL_EDITOR_SETTINGS::SYMBOL_EDITOR_SETTINGS() : m_params.emplace_back( new PARAM<bool>( "show_hidden_lib_pins", &m_ShowHiddenPins, true ) ); + m_params.emplace_back( new PARAM<bool>( "drag_pins_along_with_edges", + &m_dragPinsAlongWithEdges, true ) ); + m_params.emplace_back( new PARAM<int>( "lib_table_width", &m_LibWidth, 250 ) ); diff --git a/eeschema/symbol_editor/symbol_editor_settings.h b/eeschema/symbol_editor/symbol_editor_settings.h index 1a377dcf65..a74c1afae2 100644 --- a/eeschema/symbol_editor/symbol_editor_settings.h +++ b/eeschema/symbol_editor/symbol_editor_settings.h @@ -21,8 +21,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef SYMBOL_EDITOR_SETTINGS_H -#define SYMBOL_EDITOR_SETTINGS_H +#pragma once #include <settings/app_settings.h> #include <project/sch_project_settings.h> @@ -84,6 +83,9 @@ public: bool m_ShowHiddenPins; bool m_ShowHiddenFields; + ///< When true, dragging an outline edge will drag pins rooted on it + bool m_dragPinsAlongWithEdges; + int m_LibWidth; int m_LibrarySortMode; @@ -100,5 +102,3 @@ protected: virtual std::string getLegacyFrameName() const override { return "LibeditFrame"; } }; - -#endif diff --git a/eeschema/tools/ee_point_editor.cpp b/eeschema/tools/ee_point_editor.cpp index 3ab120815d..f0848afa72 100644 --- a/eeschema/tools/ee_point_editor.cpp +++ b/eeschema/tools/ee_point_editor.cpp @@ -32,6 +32,7 @@ using namespace std::placeholders; #include <view/view_controls.h> #include <gal/graphics_abstraction_layer.h> #include <geometry/seg.h> +#include <geometry/shape_utils.h> #include <tools/ee_actions.h> #include <tools/ee_selection_tool.h> #include <sch_edit_frame.h> @@ -40,6 +41,7 @@ using namespace std::placeholders; #include <sch_sheet.h> #include <sch_textbox.h> #include <sch_table.h> +#include <symbol_editor/symbol_editor_settings.h> static const std::vector<KICAD_T> pointEditorTypes = { SCH_SHAPE_T, @@ -489,7 +491,7 @@ int EE_POINT_EDITOR::Main( const TOOL_EVENT& aEvent ) m_editedPoint->SetPosition( controls->GetCursorPosition( snap ) ); - updateParentItem( snap ); + updateParentItem( snap, commit ); updatePoints(); } else if( inDrag && evt->IsMouseUp( BUT_LEFT ) ) @@ -650,7 +652,76 @@ void EE_POINT_EDITOR::pinEditedCorner( int minWidth, int minHeight, VECTOR2I& to } -void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const +void EE_POINT_EDITOR::dragPinsOnEdge( const std::vector<SEG>& aOldEdges, + const std::vector<VECTOR2I>& aMoveVecs, int aEdgeUnit, + SCH_COMMIT& aCommit ) const +{ + wxCHECK( aOldEdges.size() == aMoveVecs.size(), /* void */ ); + + // This only make sense in the symbol editor + if( !m_frame->IsType( FRAME_SCH_SYMBOL_EDITOR ) ) + return; + + SYMBOL_EDIT_FRAME& editor = static_cast<SYMBOL_EDIT_FRAME&>( *m_frame ); + + // And only if the setting is enabled + if( !editor.GetSettings()->m_dragPinsAlongWithEdges ) + return; + + // Adjuting pins on a different unit to a unit-limited shape + // seems suspect. + wxCHECK( aEdgeUnit == 0 || aEdgeUnit == editor.GetUnit(), /* void */ ); + + /* + * Get a list of pins on a line segment + */ + const auto getPinsOnSeg = []( LIB_SYMBOL& aSymbol, int aUnit, const SEG& aSeg, + bool aIncludeEnds ) -> std::vector<SCH_PIN*> + { + // const BOX2I segBox = BOX2I::ByCorners( aSeg.A, aSeg.B ).GetInflated( 1 ); + // const EE_RTREE& rtree = m_frame->GetScreen()->Items().Overlapping( SCH_PIN_T, segBox ); + + std::vector<SCH_PIN*> pins; + + for( SCH_PIN* pin : aSymbol.GetPins( aUnit ) ) + { + // Figure out if the pin "connects" to the line + const VECTOR2I pinRootPos = pin->GetPinRoot(); + + if( aSeg.Contains( pinRootPos ) ) + { + if( aIncludeEnds || ( pinRootPos != aSeg.A && pinRootPos != aSeg.B ) ) + { + pins.push_back( pin ); + } + } + } + + return pins; + }; + + LIB_SYMBOL* const symbol = editor.GetCurSymbol(); + + for( std::size_t i = 0; i < aOldEdges.size(); ++i ) + { + if( aMoveVecs[i] == VECTOR2I( 0, 0 ) || !symbol ) + continue; + + const std::vector<SCH_PIN*> pins = getPinsOnSeg( *symbol, aEdgeUnit, aOldEdges[i], false ); + + for( SCH_PIN* pin : pins ) + { + // Move the pin + aCommit.Modify( pin, m_frame->GetScreen() ); + pin->Move( aMoveVecs[i] ); + + updateItem( pin, true ); + } + } +} + + +void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid, SCH_COMMIT& aCommit ) const { EDA_ITEM* item = m_editPoints->GetParent(); @@ -714,31 +785,49 @@ void EE_POINT_EDITOR::updateParentItem( bool aSnapToGrid ) const pinEditedCorner( schIUScale.MilsToIU( 1 ), schIUScale.MilsToIU( 1 ), topLeft, topRight, botLeft, botRight, &gridHelper ); + const BOX2I oldBox = BOX2I::ByCorners( shape->GetStart(), shape->GetEnd() ); + std::vector<SEG> oldSegs; + std::vector<VECTOR2I> moveVecs; + if( isModified( m_editPoints->Point( RECT_TOPLEFT ) ) || isModified( m_editPoints->Point( RECT_TOPRIGHT ) ) || isModified( m_editPoints->Point( RECT_BOTRIGHT ) ) || isModified( m_editPoints->Point( RECT_BOTLEFT ) ) ) { + // Corner drags don't update pins. Not only is it an escape hatch to avoid + // moving pins, it also avoids tricky problems when the pins "fall off" + // the ends of one of the two segments and get either left behind or + // "swept up" into the corner. shape->SetPosition( topLeft ); shape->SetEnd( botRight ); } else if( isModified( m_editPoints->Line( RECT_TOP ) ) ) { + oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::N ); + moveVecs.emplace_back( 0, topLeft.y - oldBox.GetTop() ); shape->SetStartY( topLeft.y ); } else if( isModified( m_editPoints->Line( RECT_LEFT ) ) ) { + oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::W ); + moveVecs.emplace_back( topLeft.x - oldBox.GetLeft(), 0 ); shape->SetStartX( topLeft.x ); } else if( isModified( m_editPoints->Line( RECT_BOT ) ) ) { + oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::S ); + moveVecs.emplace_back( 0, botRight.y - oldBox.GetBottom() ); shape->SetEndY( botRight.y ); } else if( isModified( m_editPoints->Line( RECT_RIGHT ) ) ) { + oldSegs = KIGEOM::GetSegsInDirection( oldBox, DIRECTION_45::Directions::E ); + moveVecs.emplace_back( botRight.x - oldBox.GetRight(), 0 ); shape->SetEndX( botRight.x ); } + dragPinsOnEdge( oldSegs, moveVecs, shape->GetUnit(), aCommit ); + for( unsigned i = 0; i < m_editPoints->LinesSize(); ++i ) { if( !isModified( m_editPoints->Line( i ) ) ) diff --git a/eeschema/tools/ee_point_editor.h b/eeschema/tools/ee_point_editor.h index b74367f7c0..2decd28400 100644 --- a/eeschema/tools/ee_point_editor.h +++ b/eeschema/tools/ee_point_editor.h @@ -31,6 +31,7 @@ class EE_SELECTION_TOOL; class SCH_BASE_FRAME; +class SCH_COMMIT; /** * Tool that displays edit points allowing to modify items by dragging the points. @@ -59,7 +60,11 @@ public: private: ///< Update item's points with edit points. - void updateParentItem( bool aSnapToGrid ) const; + void updateParentItem( bool aSnapToGrid, SCH_COMMIT& aCommit ) const; + + ///< When dragging a graphics edge, update pins too. + void dragPinsOnEdge( const std::vector<SEG>& aOldEdges, const std::vector<VECTOR2I>& aMoveVecs, + int aUnit, SCH_COMMIT& aCommit ) const; ///< Update edit points with item's points. void updatePoints(); diff --git a/libs/kimath/include/geometry/shape_utils.h b/libs/kimath/include/geometry/shape_utils.h index 6055dd8716..2a333fcdae 100644 --- a/libs/kimath/include/geometry/shape_utils.h +++ b/libs/kimath/include/geometry/shape_utils.h @@ -75,6 +75,15 @@ OPT_VECTOR2I GetSharedEndpoint( const SEG& aSegA, const SEG& aSegB ); */ std::array<SEG, 4> BoxToSegs( const BOX2I& aBox ); +/** + * Get the segments of a box that are in the given direction. + * + * N,E,S,W are the sides of the box. + * NE,SE,SW,NW are the corners of the box, which return the two segments that meet at the corner, + * in the order of the direction (e.g. NW = N, then W). + */ +std::vector<SEG> GetSegsInDirection( const BOX2I& aBox, DIRECTION_45::Directions aDir ); + /** * Get the segment of a half-line that is inside a box, if any. */ diff --git a/libs/kimath/src/geometry/shape_utils.cpp b/libs/kimath/src/geometry/shape_utils.cpp index 3dbff90e48..a872d29857 100644 --- a/libs/kimath/src/geometry/shape_utils.cpp +++ b/libs/kimath/src/geometry/shape_utils.cpp @@ -80,6 +80,53 @@ std::array<SEG, 4> KIGEOM::BoxToSegs( const BOX2I& aBox ) } +std::vector<SEG> KIGEOM::GetSegsInDirection( const BOX2I& aBox, DIRECTION_45::Directions aDir ) +{ + // clang-format off + switch( aDir ) + { + case DIRECTION_45::Directions::N: + return { SEG{ { aBox.GetLeft(), aBox.GetTop() }, + { aBox.GetRight(), aBox.GetTop() } } }; + case DIRECTION_45::Directions::E: + return { SEG{ { aBox.GetRight(), aBox.GetTop() }, + { aBox.GetRight(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::S: + return { SEG{ { aBox.GetLeft(), aBox.GetBottom() }, + { aBox.GetRight(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::W: + return { SEG{ { aBox.GetLeft(), aBox.GetTop() }, + { aBox.GetLeft(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::NE: + return { SEG{ { aBox.GetLeft(), aBox.GetTop() }, + { aBox.GetRight(), aBox.GetTop() } }, + SEG{ { aBox.GetRight(), aBox.GetTop() }, + { aBox.GetRight(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::SE: + return { SEG{ { aBox.GetLeft(), aBox.GetBottom() }, + { aBox.GetRight(), aBox.GetBottom() } }, + SEG{ { aBox.GetRight(), aBox.GetTop() }, + { aBox.GetRight(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::SW: + return { SEG{ { aBox.GetLeft(), aBox.GetBottom() }, + { aBox.GetRight(), aBox.GetBottom() } }, + SEG{ { aBox.GetLeft(), aBox.GetTop() }, + { aBox.GetLeft(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::NW: + return { SEG{ { aBox.GetLeft(), aBox.GetTop() }, + { aBox.GetRight(), aBox.GetTop() } }, + SEG{ { aBox.GetLeft(), aBox.GetTop() }, + { aBox.GetLeft(), aBox.GetBottom() } } }; + case DIRECTION_45::Directions::LAST: + case DIRECTION_45::Directions::UNDEFINED: break; + } + // clang-format on + + wxASSERT( false ); + return {}; +}; + + std::optional<SEG> KIGEOM::ClipHalfLineToBox( const HALF_LINE& aRay, const BOX2I& aBox ) { // Do the naive implementation - if this really is done in a tight loop,