KiCad PCB EDA Suite
Loading...
Searching...
No Matches
toolbars_pcb_editor.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2012 Wayne Stambaugh <[email protected]>
7 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
23#include <memory>
24#include <string>
25
26#include <advanced_config.h>
28#include <bitmaps.h>
29#include <board.h>
31#include <eda_text.h>
32#include <footprint.h>
33#include <pcb_field.h>
34#include <kiface_base.h>
35#include <kiplatform/ui.h>
36#include <macros.h>
37#include <pcb_edit_frame.h>
38#include <pcb_field.h>
40#include <pcbnew_id.h>
41#include <pcbnew_settings.h>
42#include <eda_text.h>
43#include <pcb_field.h>
44#include <pgm_base.h>
47#include <router/router_tool.h>
49#include <tool/action_menu.h>
50#include <tool/action_toolbar.h>
51#include <tool/actions.h>
52#include <tool/common_tools.h>
53#include <tool/tool_manager.h>
55#include <tools/pcb_actions.h>
65#include <wx/wupdlock.h>
66#include <wx/combobox.h>
67#include <toolbars_pcb_editor.h>
69#include <eda_text.h>
70#include <tools/pcb_control.h>
71#include <pcb_draw_panel_gal.h>
73
74/* Data to build the layer pair indicator button */
75static wxBitmapBundle LayerPairBitmap;
76
77
78void PCB_EDIT_FRAME::PrepareLayerIndicator( bool aForceRebuild )
79{
80 COLOR4D top_color, bottom_color, background_color;
81 bool change = aForceRebuild;
82
84
85 if( m_prevIconVal.previous_icon_size != icon_size )
86 {
87 m_prevIconVal.previous_icon_size = icon_size;
88 change = true;
89 }
90
91 top_color = GetColorSettings()->GetColor( GetScreen()->m_Route_Layer_TOP );
92
93 if( m_prevIconVal.previous_Route_Layer_TOP_color != top_color )
94 {
95 m_prevIconVal.previous_Route_Layer_TOP_color = top_color;
96 change = true;
97 }
98
99 bottom_color = GetColorSettings()->GetColor( GetScreen()->m_Route_Layer_BOTTOM );
100
101 if( m_prevIconVal.previous_Route_Layer_BOTTOM_color != bottom_color )
102 {
103 m_prevIconVal.previous_Route_Layer_BOTTOM_color = bottom_color;
104 change = true;
105 }
106
107 if( change || !LayerPairBitmap.IsOk() )
108 {
109 LayerPairBitmap = LAYER_PRESENTATION::CreateLayerPairIcon( top_color, bottom_color, icon_size );
110
111 if( m_tbTopAux )
112 {
114 m_tbTopAux->Refresh();
115 }
116 }
117}
118
119
121 _( "Track width selector" ),
122 _( "Control to select the track width" ),
123 { FRAME_PCB_EDITOR } );
125 _( "Via diameter selector" ),
126 _( "Control to select the via diameter" ),
127 { FRAME_PCB_EDITOR } );
129 _( "Current variant" ),
130 _( "Control to select the current variant" ),
131 { FRAME_PCB_EDITOR } );
132
133
134std::optional<TOOLBAR_CONFIGURATION> PCB_EDIT_TOOLBAR_SETTINGS::DefaultToolbarConfig( TOOLBAR_LOC aToolbar )
135{
137
138 // clang-format off
139 switch( aToolbar )
140 {
142 config.AppendAction( ACTIONS::toggleGrid )
143 .WithContextMenu(
144 []( TOOL_MANAGER* aMgr ) -> std::unique_ptr<ACTION_MENU>
145 {
147 std::unique_ptr<ACTION_MENU> menu =
148 std::make_unique<ACTION_MENU>( false, selTool );
149
150 menu->Add( ACTIONS::gridProperties );
151 menu->Add( ACTIONS::gridOrigin );
152
153 return menu;
154 } )
155 .AppendAction( ACTIONS::toggleGridOverrides )
156 .AppendAction( PCB_ACTIONS::togglePolarCoords )
157 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Units" ) )
158 .AddAction( ACTIONS::millimetersUnits )
159 .AddAction( ACTIONS::inchesUnits )
160 .AddAction( ACTIONS::milsUnits ) )
161 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Crosshair modes" ) )
164 .AddAction( ACTIONS::cursor45Crosshairs ) );
165
166 config.AppendSeparator()
167 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Line modes" ) )
168 .AddAction( PCB_ACTIONS::lineModeFree )
169 .AddAction( PCB_ACTIONS::lineMode90 )
170 .AddAction( PCB_ACTIONS::lineMode45 ) )
171 .AppendAction( PCB_ACTIONS::toggleAutoConstraints );
172
173 config.AppendSeparator()
174 .AppendAction( PCB_ACTIONS::showRatsnest )
175 .AppendAction( PCB_ACTIONS::ratsnestLineMode );
176
177 config.AppendSeparator()
178 .AppendAction( ACTIONS::highContrastMode )
179 .AppendAction( PCB_ACTIONS::toggleNetHighlight );
180
181 config.AppendSeparator()
182 .AppendAction( PCB_ACTIONS::zoneDisplayFilled )
183 .AppendAction( PCB_ACTIONS::zoneDisplayOutline );
184
185 if( ADVANCED_CFG::GetCfg().m_ExtraZoneDisplayModes )
186 {
189 }
190
191 config.AppendSeparator()
192 .AppendAction( PCB_ACTIONS::padDisplayMode )
193 .AppendAction( PCB_ACTIONS::viaDisplayMode )
194 .AppendAction( PCB_ACTIONS::trackDisplayMode );
195
196 if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes )
197 config.AppendAction( ACTIONS::toggleBoundingBoxes );
198
199 // Tools to show/hide toolbars:
200 config.AppendSeparator()
201 .AppendAction( PCB_ACTIONS::showLayersManager )
202 .AppendAction( ACTIONS::showProperties );
203
204 break;
205
207 config.AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Selection modes" ) )
208 .AddAction( ACTIONS::selectSetRect )
209 .AddAction( ACTIONS::selectSetLasso ) )
210 .AppendAction( PCB_ACTIONS::localRatsnestTool );
211
212 config.AppendSeparator()
213 .AppendAction( PCB_ACTIONS::placeFootprint )
214 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Track routing tools" ) )
216 .AddAction( PCB_ACTIONS::routeDiffPair )
217 .AddContextMenu(
218 []( TOOL_MANAGER* aMgr ) -> std::unique_ptr<ACTION_MENU>
219 {
221 std::unique_ptr<ACTION_MENU> menu =
222 std::make_unique<ACTION_MENU>( false, selTool );
223
227 menu->AppendSeparator();
229
230 return menu;
231 } ) )
232 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Track tuning tools" ) )
233 .AddAction( PCB_ACTIONS::tuneSingleTrack )
234 .AddAction( PCB_ACTIONS::tuneDiffPair )
235 .AddAction( PCB_ACTIONS::tuneSkew ) )
236 .AppendAction( PCB_ACTIONS::showDiffPhaseSkew )
237 .AppendAction( PCB_ACTIONS::drawVia )
238 .AppendAction( PCB_ACTIONS::drawZone )
239 .WithContextMenu(
240 []( TOOL_MANAGER* aMgr ) -> std::unique_ptr<ACTION_MENU>
241 {
243 std::unique_ptr<ACTION_MENU> menu =
244 std::make_unique<ACTION_MENU>( false, selTool );
245
246 menu->Add( PCB_ACTIONS::zoneFillAll );
247 menu->Add( PCB_ACTIONS::zoneUnfillAll );
248 menu->AppendSeparator();
249 menu->Add( PCB_ACTIONS::zonesManager );
250
251 return menu;
252 } )
253 .AppendAction( PCB_ACTIONS::drawRuleArea );
254
255 config.AppendSeparator()
256 .AppendAction( PCB_ACTIONS::drawLine )
257 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Arc" ) )
258 .AddAction( PCB_ACTIONS::drawArc )
259 .AddAction( PCB_ACTIONS::drawEllipseArc )
260 .AddContextMenu(
261 []( TOOL_MANAGER* aMgr ) -> std::unique_ptr<ACTION_MENU>
262 {
264 std::unique_ptr<ACTION_MENU> menu =
265 std::make_unique<ACTION_MENU>( false, selTool );
266
270
271 return menu;
272 } ) )
273 .AppendAction( PCB_ACTIONS::drawRectangle )
274 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Circle" ) )
275 .AddAction( PCB_ACTIONS::drawCircle )
276 .AddAction( PCB_ACTIONS::drawEllipse ) )
277 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Constraints" ) )
296 .AppendAction( PCB_ACTIONS::drawPolygon )
297 .AppendAction( PCB_ACTIONS::drawBezier )
298 .AppendAction( PCB_ACTIONS::placeReferenceImage )
299 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Text objects" ) )
300 .AddAction( PCB_ACTIONS::placeText )
301 .AddAction( PCB_ACTIONS::drawTextBox ) )
302 .AppendAction( PCB_ACTIONS::drawTable )
303 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "Dimension objects" ) )
308 .AddAction( PCB_ACTIONS::drawLeader ) )
309 .AppendAction( PCB_ACTIONS::placeBarcode )
310 .AppendAction( ACTIONS::deleteTool );
311
312 config.AppendSeparator()
313 .AppendGroup( TOOLBAR_GROUP_CONFIG( _( "PCB origins and points" ) )
314 .AddAction( ACTIONS::gridSetOrigin )
315 .AddAction( PCB_ACTIONS::drillOrigin ) )
316 .AppendAction( PCB_ACTIONS::placePoint )
317 .AppendAction( ACTIONS::measureTool );
318
319 break;
320
322 if( Kiface().IsSingle() )
323 {
324 config.AppendAction( ACTIONS::doNew );
325 config.AppendAction( ACTIONS::open );
326 }
327
328 config.AppendAction( ACTIONS::save );
329
330 config.AppendSeparator()
331 .AppendAction( PCB_ACTIONS::boardSetup );
332
333 config.AppendSeparator()
334 .AppendAction( ACTIONS::pageSettings )
335 .AppendAction( ACTIONS::print )
336 .AppendAction( ACTIONS::plot );
337
338 config.AppendSeparator()
339 .AppendAction( ACTIONS::undo )
340 .AppendAction( ACTIONS::redo );
341
342 config.AppendSeparator()
343 .AppendAction( ACTIONS::find );
344
345 config.AppendSeparator()
346 .AppendAction( ACTIONS::zoomRedraw )
347 .AppendAction( ACTIONS::zoomInCenter )
348 .AppendAction( ACTIONS::zoomOutCenter )
349 .AppendAction( ACTIONS::zoomFitScreen )
350 .AppendAction( ACTIONS::zoomFitObjects )
351 .AppendAction( ACTIONS::zoomTool );
352
353 config.AppendSeparator()
354 .AppendAction( PCB_ACTIONS::rotateCcw )
355 .AppendAction( PCB_ACTIONS::rotateCw )
356 .AppendAction( PCB_ACTIONS::mirrorV )
357 .AppendAction( PCB_ACTIONS::mirrorH )
358 .AppendAction( ACTIONS::group )
359 .AppendAction( ACTIONS::ungroup )
360 .AppendAction( PCB_ACTIONS::lock )
361 .AppendAction( PCB_ACTIONS::unlock );
362
363 config.AppendSeparator()
364 .AppendAction( ACTIONS::showFootprintEditor )
365 .AppendAction( ACTIONS::showFootprintBrowser )
366 .AppendAction( ACTIONS::show3DViewer );
367
368 config.AppendSeparator();
369
370 if( !Kiface().IsSingle() )
372 else
373 config.AppendAction( PCB_ACTIONS::importNetlist );
374
375 config.AppendAction( PCB_ACTIONS::runDRC );
376
377 config.AppendSeparator();
378 config.AppendAction( PCB_ACTIONS::showEeschema );
381
382 break;
383
386 .AppendAction( PCB_ACTIONS::autoTrackWidth );
387
388 config.AppendSeparator()
390
391 config.AppendSeparator()
393 .AppendAction( PCB_ACTIONS::selectLayerPair );
394
395 config.AppendSeparator()
396 .AppendControl( ACTION_TOOLBAR_CONTROLS::gridSelect );
397
398 config.AppendSeparator()
399 .AppendControl( ACTION_TOOLBAR_CONTROLS::zoomSelect );
400
401 config.AppendSeparator()
403
404 break;
405 }
406
407 // clang-format on
408 return config;
409}
410
411
413{
415
416 // Box to display and choose track widths
417 auto trackWidthSelectorFactory =
418 [this]( ACTION_TOOLBAR* aToolbar )
419 {
420 if( !m_SelTrackWidthBox )
421 {
422 m_SelTrackWidthBox = new wxChoice( aToolbar, ID_AUX_TOOLBAR_PCB_TRACK_WIDTH,
423 wxDefaultPosition, wxDefaultSize, 0, nullptr );
424 }
425
426 m_SelTrackWidthBox->SetToolTip( _( "Select the default width for new tracks. Note that this "
427 "width can be overridden by the board minimum width, or by "
428 "the width of an existing track if the 'Use Existing Track "
429 "Width' feature is enabled." ) );
430
432
433 aToolbar->Add( m_SelTrackWidthBox );
434 };
435
437
438
439 // Box to display and choose vias diameters
440 auto viaDiaSelectorFactory =
441 [this]( ACTION_TOOLBAR* aToolbar )
442 {
443 if( !m_SelViaSizeBox )
444 {
445 m_SelViaSizeBox = new wxChoice( aToolbar, ID_AUX_TOOLBAR_PCB_VIA_SIZE,
446 wxDefaultPosition, wxDefaultSize, 0, nullptr );
447 }
448
450 aToolbar->Add( m_SelViaSizeBox );
451 };
452
454
455 // Variant selection drop down control on main tool bar
456 auto variantSelectionCtrlFactory =
457 [this]( ACTION_TOOLBAR* aToolbar )
458 {
460 {
462 wxDefaultPosition, wxDefaultSize, 0, nullptr );
463 }
464
465 m_CurrentVariantCtrl->SetToolTip( _( "Select the current variant to display and edit." ) );
466
468
469 aToolbar->Add( m_CurrentVariantCtrl );
470 };
471
473
474 // IPC/Scripting plugin control
475 // TODO (ISM): Clean this up to make IPC actions just normal tool actions to get rid of this entire
476 // control
477 auto pluginControlFactory =
478 [this]( ACTION_TOOLBAR* aToolbar )
479 {
480 bool haveApiPlugins = Pgm().GetCommonSettings()->m_Api.enable_server
482
483 if( haveApiPlugins )
484 {
485 aToolbar->AddScaledSeparator( aToolbar->GetParent() );
486 AddApiPluginTools( aToolbar );
487 }
488 };
489
491}
492
493
495{
497
498 switch( aId )
499 {
501 case ID_AUX_TOOLBAR_PCB_VIA_SIZE: m_SelViaSizeBox = nullptr; break;
503 }
504}
505
506
508{
510 return;
511
512 if( !GetBoard() )
513 return;
514
515 wxArrayString variantNames = GetBoard()->GetVariantNamesForUI();
516
517 m_CurrentVariantCtrl->Set( variantNames );
518
519 int selectionIndex = 0;
520 wxString currentVariant = GetBoard()->GetCurrentVariant();
521
522 if( !currentVariant.IsEmpty() )
523 {
524 int foundIndex = m_CurrentVariantCtrl->FindString( currentVariant );
525
526 if( foundIndex != wxNOT_FOUND )
527 selectionIndex = foundIndex;
528 }
529
530 if( m_CurrentVariantCtrl->GetCount() > 0 )
531 m_CurrentVariantCtrl->SetSelection( selectionIndex );
532}
533
534
535void PCB_EDIT_FRAME::SetCurrentVariant( const wxString& aVariantName )
536{
537 GetBoard()->SetCurrentVariant( aVariantName );
538
539 if( PCB_DRAW_PANEL_GAL* canvas = dynamic_cast<PCB_DRAW_PANEL_GAL*>( GetCanvas() ) )
540 {
541 DS_PROXY_VIEW_ITEM* ds = canvas->GetDrawingSheet();
542
543 if( ds )
544 {
545 wxString currentVariant = GetBoard()->GetCurrentVariant();
546 wxString variantDesc = GetBoard()->GetVariantDescription( currentVariant );
547
548 ds->SetVariantName( currentVariant.ToStdString() );
549 ds->SetVariantDesc( variantDesc.ToStdString() );
550 }
551 }
552}
553
554
555void PCB_EDIT_FRAME::onVariantSelected( wxCommandEvent& aEvent )
556{
558 return;
559
560 int selection = m_CurrentVariantCtrl->GetSelection();
561
562 if( selection == wxNOT_FOUND || selection == 0 )
563 {
564 // "<Default>" selected - clear the current variant
565 SetCurrentVariant( wxEmptyString );
566 }
567 else
568 {
569 wxString selectedVariant = m_CurrentVariantCtrl->GetString( selection );
570 SetCurrentVariant( selectedVariant );
571 }
572
573 // Refresh the view and properties panel to show the new variant state
575
577 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
578 {
579 if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
580 {
581 if( text->HasTextVars() )
582 {
583 text->ClearRenderCache();
584 text->ClearBoundingBoxCache();
586 }
587 }
588
589 if( PCB_FIELD* field = dynamic_cast<PCB_FIELD*>( aItem ) )
590 {
591 if( FOOTPRINT* fp = field->GetParentFootprint() )
592 {
593 if( !fp->GetVariants().empty() )
594 {
595 field->ClearRenderCache();
596 field->ClearBoundingBoxCache();
598 }
599 }
600 }
601
602 return 0;
603 } );
604
605 GetCanvas()->Refresh();
606
607 Update3DView( true, GetPcbNewSettings()->m_Display.m_Live3DRefresh );
609}
610
611
612static wxString ComboBoxUnits( EDA_UNITS aUnits, double aValue, bool aIncludeLabel = true )
613{
614 wxString text;
615 const wxChar* format;
616
617 switch( aUnits )
618 {
619 default:
620 wxASSERT_MSG( false, wxT( "Invalid unit" ) );
622 case EDA_UNITS::UNSCALED: format = wxT( "%.0f" ); break;
623 case EDA_UNITS::MM: format = wxT( "%.3f" ); break;
624 case EDA_UNITS::MILS: format = wxT( "%.2f" ); break;
625 case EDA_UNITS::INCH: format = wxT( "%.5f" ); break;
626 }
627
628 text.Printf( format, EDA_UNIT_UTILS::UI::ToUserUnit( pcbIUScale, aUnits, aValue ) );
629
630 if( aIncludeLabel )
632
633 return text;
634}
635
636
637void PCB_EDIT_FRAME::UpdateTrackWidthSelectBox( wxChoice* aTrackWidthSelectBox, bool aShowNetclass,
638 bool aShowEdit )
639{
640 if( aTrackWidthSelectBox == nullptr )
641 return;
642
643 EDA_UNITS primaryUnit;
644 EDA_UNITS secondaryUnit;
645
646 GetUnitPair( primaryUnit, secondaryUnit );
647
648 wxString msg;
649
650 aTrackWidthSelectBox->Clear();
651
652 if( aShowNetclass )
653 aTrackWidthSelectBox->Append( _( "Track: use netclass width" ) );
654
655 for( unsigned ii = 1; ii < GetDesignSettings().m_TrackWidthList.size(); ii++ )
656 {
657 int size = GetDesignSettings().m_TrackWidthList[ii];
658
659 msg.Printf( _( "Track: %s (%s)" ), ComboBoxUnits( primaryUnit, size ),
660 ComboBoxUnits( secondaryUnit, size ) );
661
662 aTrackWidthSelectBox->Append( msg );
663 }
664
665 if( aShowEdit )
666 {
667 aTrackWidthSelectBox->Append( wxT( "---" ) );
668 aTrackWidthSelectBox->Append( _( "Edit Pre-defined Sizes..." ) );
669 }
670
671 if( GetDesignSettings().GetTrackWidthIndex() >= (int) GetDesignSettings().m_TrackWidthList.size() )
673
674 // GetDesignSettings().GetTrackWidthIndex() can be < 0 if no board loaded
675 // So in this case select the first select box item available (use netclass)
676 aTrackWidthSelectBox->SetSelection( std::max( 0, GetDesignSettings().GetTrackWidthIndex() ) );
677}
678
679
680void PCB_EDIT_FRAME::UpdateViaSizeSelectBox( wxChoice* aViaSizeSelectBox, bool aShowNetclass,
681 bool aShowEdit )
682{
683 if( aViaSizeSelectBox == nullptr )
684 return;
685
686 aViaSizeSelectBox->Clear();
687
688 COMMON_TOOLS* cmnTool = m_toolManager->GetTool<COMMON_TOOLS>();
689 EDA_UNITS primaryUnit = GetUserUnits();
690 EDA_UNITS secondaryUnit = EDA_UNITS::MILS;
691
692 if( EDA_UNIT_UTILS::IsImperialUnit( primaryUnit ) )
693 secondaryUnit = cmnTool ? cmnTool->GetLastMetricUnits() : EDA_UNITS::MM;
694 else
695 secondaryUnit = cmnTool ? cmnTool->GetLastImperialUnits() : EDA_UNITS::MILS;
696
697 if( aShowNetclass )
698 aViaSizeSelectBox->Append( _( "Via: use netclass sizes" ) );
699
700 for( unsigned ii = 1; ii < GetDesignSettings().m_ViasDimensionsList.size(); ii++ )
701 {
703 wxString msg, priStr, secStr;
704
705 double diam = viaDimension.m_Diameter;
706 double hole = viaDimension.m_Drill;
707
708 if( hole > 0 )
709 {
710 priStr = ComboBoxUnits( primaryUnit, diam, false ) + wxT( " / " )
711 + ComboBoxUnits( primaryUnit, hole, true );
712 secStr = ComboBoxUnits( secondaryUnit, diam, false ) + wxT( " / " )
713 + ComboBoxUnits( secondaryUnit, hole, true );
714 }
715 else
716 {
717 priStr = ComboBoxUnits( primaryUnit, diam, true );
718 secStr = ComboBoxUnits( secondaryUnit, diam, true );
719 }
720
721 msg.Printf( _( "Via: %s (%s)" ), priStr, secStr );
722
723 aViaSizeSelectBox->Append( msg );
724 }
725
726 if( aShowEdit )
727 {
728 aViaSizeSelectBox->Append( wxT( "---" ) );
729 aViaSizeSelectBox->Append( _( "Edit Pre-defined Sizes..." ) );
730 }
731
732 if( GetDesignSettings().GetViaSizeIndex() >= (int) GetDesignSettings().m_ViasDimensionsList.size() )
734
735 // GetDesignSettings().GetViaSizeIndex() can be < 0 if no board loaded
736 // So in this case select the first select box item available (use netclass)
737 aViaSizeSelectBox->SetSelection( std::max( 0, GetDesignSettings().GetViaSizeIndex() ) );
738}
739
740
741void PCB_EDIT_FRAME::ReCreateLayerBox( bool aForceResizeToolbar )
742{
743 if( m_SelLayerBox == nullptr || m_tbTopAux == nullptr )
744 return;
745
746 m_SelLayerBox->SetToolTip( _( "+/- to switch" ) );
747 m_SelLayerBox->Resync();
748
749 if( aForceResizeToolbar )
751}
752
753
755{
757 wxAuiPaneInfo& layersManager = m_auimgr.GetPane( AppearancePanelName() );
758 wxAuiPaneInfo& selectionFilter = m_auimgr.GetPane( "SelectionFilter" );
759
760 // show auxiliary Vertical layers and visibility manager toolbar
761 m_ShowLayerManagerTools = layersManager.IsShown();
762
764
765 layersManager.Show( m_ShowLayerManagerTools );
766 selectionFilter.Show( m_ShowLayerManagerTools );
767
769 {
770 SetAuiPaneSize( m_auimgr, layersManager, settings->m_AuiPanels.right_panel_width, -1 );
771 }
772 else
773 {
774 settings->m_AuiPanels.right_panel_width = m_appearancePanel->GetSize().x;
775 m_auimgr.Update();
776 }
777}
778
779
781{
783 wxAuiPaneInfo& netInspectorPanel = m_auimgr.GetPane( NetInspectorPanelName() );
784
785 m_ShowNetInspector = netInspectorPanel.IsShown();
786
788
789 netInspectorPanel.Show( m_ShowNetInspector );
790
792 {
793 SetAuiPaneSize( m_auimgr, netInspectorPanel, settings->m_AuiPanels.net_inspector_width, -1 );
794 m_netInspectorPanel->OnShowPanel();
795 }
796 else
797 {
798 m_netInspectorPanel->SaveSettings();
799 settings->m_AuiPanels.net_inspector_width = m_netInspectorPanel->GetSize().x;
800 m_auimgr.Update();
801 }
802}
803
804
806{
808
809 // Ensure m_ShowSearch is up to date (the pane can be closed outside the menu)
810 m_ShowSearch = m_auimgr.GetPane( SearchPaneName() ).IsShown();
811
813
814 wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() );
815 searchPaneInfo.Show( m_ShowSearch );
816
817 if( m_ShowSearch )
818 {
819 searchPaneInfo.Direction( settings->m_AuiPanels.search_panel_dock_direction );
820
821 if( settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP
822 || settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM )
823 {
824 SetAuiPaneSize( m_auimgr, searchPaneInfo,
825 -1, settings->m_AuiPanels.search_panel_height );
826 }
827 else if( settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT
828 || settings->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT )
829 {
830 SetAuiPaneSize( m_auimgr, searchPaneInfo,
831 settings->m_AuiPanels.search_panel_width, -1 );
832 }
833 m_searchPane->FocusSearch();
834 m_searchPane->RefreshSearch();
835 }
836 else
837 {
838 settings->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y;
839 settings->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x;
840 settings->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction;
841 m_auimgr.Update();
842 GetCanvas()->SetFocus();
843 }
844}
845
846
852
853
854void PCB_EDIT_FRAME::OnUpdateSelectTrackWidth( wxUpdateUIEvent& aEvent )
855{
856 if( aEvent.GetId() == ID_AUX_TOOLBAR_PCB_TRACK_WIDTH )
857 {
859 int sel;
860
861 if( bds.UseCustomTrackViaSize() )
862 sel = wxNOT_FOUND;
863 else
864 // if GetTrackWidthIndex() < 0, display the "use netclass" option
865 sel = std::max( 0, bds.GetTrackWidthIndex() );
866
867 if( m_SelTrackWidthBox->GetSelection() != sel )
868 m_SelTrackWidthBox->SetSelection( sel );
869 }
870}
871
872
873void PCB_EDIT_FRAME::OnUpdateSelectViaSize( wxUpdateUIEvent& aEvent )
874{
875 if( aEvent.GetId() == ID_AUX_TOOLBAR_PCB_VIA_SIZE )
876 {
878 int sel = 0;
879
880 if( bds.UseCustomTrackViaSize() )
881 sel = wxNOT_FOUND;
882 else
883 // if GetViaSizeIndex() < 0, display the "use netclass" option
884 sel = std::max( 0, bds.GetViaSizeIndex() );
885
886 if( m_SelViaSizeBox->GetSelection() != sel )
887 m_SelViaSizeBox->SetSelection( sel );
888 }
889}
890
891
893{
895
896 wxCHECK( cfg, /* void */ );
897
898 wxAuiPaneInfo& db_library_pane = m_auimgr.GetPane( DesignBlocksPaneName() );
899
900 db_library_pane.Show( !db_library_pane.IsShown() );
901
902 if( db_library_pane.IsShown() )
903 {
904 if( db_library_pane.IsFloating() )
905 {
906 db_library_pane.FloatingSize( cfg->m_AuiPanels.design_blocks_panel_float_width,
908 m_auimgr.Update();
909 }
910 else
911 {
912 // SetAuiPaneSize also updates m_auimgr
914 }
915 }
916 else
917 {
918 if( db_library_pane.IsFloating() )
919 {
920 cfg->m_AuiPanels.design_blocks_panel_float_width = db_library_pane.floating_size.x;
921 cfg->m_AuiPanels.design_blocks_panel_float_height = db_library_pane.floating_size.y;
922 }
923 else
924 {
926 }
927
928 m_auimgr.Update();
929 }
930}
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static TOOL_ACTION gridProperties
Definition actions.h:196
static TOOL_ACTION updatePcbFromSchematic
Definition actions.h:260
static TOOL_ACTION toggleGrid
Definition actions.h:194
static TOOL_ACTION zoomRedraw
Definition actions.h:128
static TOOL_ACTION millimetersUnits
Definition actions.h:202
static TOOL_ACTION show3DViewer
Definition actions.h:254
static TOOL_ACTION cursorSmallCrosshairs
Definition actions.h:148
static TOOL_ACTION zoomOutCenter
Definition actions.h:132
static TOOL_ACTION togglePolarCoords
Definition actions.h:205
static TOOL_ACTION selectSetLasso
Definition actions.h:217
static TOOL_ACTION selectSetRect
Set lasso selection mode.
Definition actions.h:216
static TOOL_ACTION group
Definition actions.h:235
static TOOL_ACTION pointEditorArcKeepCenter
Definition actions.h:271
static TOOL_ACTION milsUnits
Definition actions.h:201
static TOOL_ACTION ungroup
Definition actions.h:236
static TOOL_ACTION toggleBoundingBoxes
Definition actions.h:153
static TOOL_ACTION plot
Definition actions.h:61
static TOOL_ACTION pointEditorArcKeepRadius
Definition actions.h:273
static TOOL_ACTION open
Definition actions.h:53
static TOOL_ACTION pageSettings
Definition actions.h:59
static TOOL_ACTION undo
Definition actions.h:71
static TOOL_ACTION inchesUnits
Definition actions.h:200
static TOOL_ACTION highContrastMode
Definition actions.h:151
static TOOL_ACTION gridOrigin
Definition actions.h:197
static TOOL_ACTION measureTool
Definition actions.h:248
static TOOL_ACTION save
Definition actions.h:54
static TOOL_ACTION zoomFitScreen
Definition actions.h:138
static TOOL_ACTION redo
Definition actions.h:72
static TOOL_ACTION deleteTool
Definition actions.h:82
static TOOL_ACTION zoomTool
Definition actions.h:142
static TOOL_ACTION cursor45Crosshairs
Definition actions.h:150
static TOOL_ACTION showFootprintEditor
Definition actions.h:258
static TOOL_ACTION print
Definition actions.h:60
static TOOL_ACTION showProperties
Definition actions.h:262
static TOOL_ACTION doNew
Definition actions.h:50
static TOOL_ACTION zoomFitObjects
Definition actions.h:139
static TOOL_ACTION zoomInCenter
Definition actions.h:131
static TOOL_ACTION gridSetOrigin
Definition actions.h:191
static TOOL_ACTION showFootprintBrowser
Definition actions.h:257
static TOOL_ACTION toggleGridOverrides
Definition actions.h:195
static TOOL_ACTION pointEditorArcKeepEndpoint
Definition actions.h:272
static TOOL_ACTION cursorFullCrosshairs
Definition actions.h:149
static TOOL_ACTION find
Definition actions.h:113
static constexpr bool CHECK
static ACTION_TOOLBAR_CONTROL gridSelect
static ACTION_TOOLBAR_CONTROL overrideLocks
static ACTION_TOOLBAR_CONTROL layerSelector
static ACTION_TOOLBAR_CONTROL zoomSelect
static ACTION_TOOLBAR_CONTROL ipcScripting
Class to hold basic information about controls that can be added to the toolbars.
Define the structure of a toolbar with buttons that invoke ACTIONs.
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
std::vector< const PLUGIN_ACTION * > GetActionsForScope(PLUGIN_ACTION_SCOPE aScope)
Container for design settings for a BOARD object.
void UseCustomTrackViaSize(bool aEnabled)
Enables/disables custom track/via size settings.
void SetViaSizeIndex(int aIndex)
Set the current via size list index to aIndex.
void SetTrackWidthIndex(int aIndex)
Set the current track width list index to aIndex.
std::vector< int > m_TrackWidthList
std::vector< VIA_DIMENSION > m_ViasDimensionsList
FOOTPRINT * GetParentFootprint() const
void SetCurrentVariant(const wxString &aVariant)
Definition board.cpp:2949
wxArrayString GetVariantNamesForUI() const
Return the variant names for UI display.
Definition board.cpp:3104
wxString GetVariantDescription(const wxString &aVariantName) const
Definition board.cpp:3068
wxString GetCurrentVariant() const
Definition board.h:473
COLOR4D GetColor(int aLayer) const
APPEARANCE m_Appearance
Handles action that are shared between different applications.
EDA_UNITS GetLastImperialUnits()
EDA_UNITS GetLastMetricUnits()
void SetVariantName(const std::string &aVariant)
Set the current variant name and description to be shown on the drawing sheet.
void SetVariantDesc(const std::string &aVariantDesc)
virtual void UpdateToolbarControlSizes()
Update the sizes of any controls in the toolbars of the frame.
void RegisterCustomToolbarControlFactory(const ACTION_TOOLBAR_CONTROL &aControlDesc, const ACTION_TOOLBAR_CONTROL_FACTORY &aControlFactory)
Register a creation factory for toolbar controls that are present in this frame.
wxAuiManager m_auimgr
ACTION_TOOLBAR * m_tbTopAux
static const wxString AppearancePanelName()
NET_INSPECTOR_PANEL * m_netInspectorPanel
virtual void AddApiPluginTools(ACTION_TOOLBAR *aToolbar)
Append actions from API plugins to the given toolbar.
static const wxString NetInspectorPanelName()
void GetUnitPair(EDA_UNITS &aPrimaryUnit, EDA_UNITS &aSecondaryUnits) override
Get the pair or units in current use.
SEARCH_PANE * m_searchPane
static const wxString DesignBlocksPaneName()
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetFocus() override
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:89
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition actions.h:350
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
An abstract base class for deriving all objects that can be added to a VIEW.
Definition view_item.h:82
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
Definition view.cpp:1702
static wxBitmapBundle CreateLayerPairIcon(const COLOR4D &aTopColor, const COLOR4D &aBottomColor, int aDefSize=24)
Create a layer pair "side-by-side swatch" icon.
AUI_PANELS m_AuiPanels
static TOOL_ACTION lineModeFree
Unconstrained angle mode (icon lines_any)
static TOOL_ACTION drawRuleArea
static TOOL_ACTION drawBezier
static TOOL_ACTION placeText
static TOOL_ACTION zonesManager
static TOOL_ACTION drawOrthogonalDimension
static TOOL_ACTION drawRectangle
static TOOL_ACTION padDisplayMode
static TOOL_ACTION placeReferenceImage
static TOOL_ACTION routerSettingsDialog
Activation of the Push and Shove settings dialogs.
static TOOL_ACTION showRatsnest
static TOOL_ACTION zoneFillAll
static TOOL_ACTION showLayersManager
static TOOL_ACTION toggleNetHighlight
static TOOL_ACTION addConstraintVertical
static TOOL_ACTION drawCircle
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION routeDiffPair
Activation of the Push and Shove router (differential pair mode)
static TOOL_ACTION tuneDiffPair
static TOOL_ACTION drawEllipseArc
static TOOL_ACTION autoTrackWidth
static TOOL_ACTION drawTable
static TOOL_ACTION drawTextBox
static TOOL_ACTION addConstraintPerpendicular
static TOOL_ACTION routerHighlightMode
Actions to enable switching modes via hotkey assignments.
static TOOL_ACTION routerWalkaroundMode
static TOOL_ACTION routerShoveMode
static TOOL_ACTION drawPolygon
static TOOL_ACTION zoneDisplayFilled
static TOOL_ACTION drawRadialDimension
static TOOL_ACTION tuneSingleTrack
static TOOL_ACTION viaDisplayMode
static TOOL_ACTION drawLeader
static TOOL_ACTION addConstraintAngular
static TOOL_ACTION lineMode45
45-degree-or-orthogonal mode (icon hv45mode)
static TOOL_ACTION addConstraintArcAngle
static TOOL_ACTION drillOrigin
static TOOL_ACTION tuneSkew
static TOOL_ACTION addConstraintHorizontal
static TOOL_ACTION trackDisplayMode
static TOOL_ACTION selectLayerPair
static TOOL_ACTION drawEllipse
static TOOL_ACTION zoneDisplayTriangulated
static TOOL_ACTION zoneDisplayFractured
static TOOL_ACTION addConstraintCollinear
static TOOL_ACTION drawVia
static TOOL_ACTION drawArc
static TOOL_ACTION runDRC
static TOOL_ACTION importNetlist
static TOOL_ACTION addConstraintEqualRadius
static TOOL_ACTION addConstraintTangent
static TOOL_ACTION boardSetup
static TOOL_ACTION showEeschema
static TOOL_ACTION drawCenterDimension
static TOOL_ACTION zoneUnfillAll
static TOOL_ACTION addConstraintFixedLength
static TOOL_ACTION lineMode90
90-degree-only mode (icon lines90)
static TOOL_ACTION zoneDisplayOutline
static TOOL_ACTION ratsnestLineMode
static TOOL_ACTION toggleAutoConstraints
Toggle authoring constraints automatically while drawing.
static TOOL_ACTION placeBarcode
static TOOL_ACTION placePoint
static TOOL_ACTION addConstraintSymmetric
static TOOL_ACTION addConstraintFixedPosition
Ground a point, and the cluster holding it.
static TOOL_ACTION mirrorV
static TOOL_ACTION unlock
static TOOL_ACTION addConstraintPointOnLine
static TOOL_ACTION placeFootprint
static TOOL_ACTION routeSingleTrack
Activation of the Push and Shove router.
static TOOL_ACTION showDiffPhaseSkew
Display of phase skew between differential pair tracks.
static TOOL_ACTION addConstraintCoincident
static TOOL_ACTION drawLine
static TOOL_ACTION localRatsnestTool
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
static TOOL_ACTION addConstraintParallel
static TOOL_ACTION drawAlignedDimension
static TOOL_ACTION addConstraintFixedRadius
static TOOL_ACTION addConstraintEqualLength
static TOOL_ACTION drawZone
static TOOL_ACTION addConstraintMidpoint
static TOOL_ACTION lock
static TOOL_ACTION addConstraintConcentric
static ACTION_TOOLBAR_CONTROL trackWidth
static ACTION_TOOLBAR_CONTROL viaDiameter
static ACTION_TOOLBAR_CONTROL currentVariant
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
PCB_LAYER_BOX_SELECTOR * m_SelLayerBox
void configureToolbars() override
void ClearToolbarControl(int aId) override
APPEARANCE_CONTROLS * m_appearancePanel
PCBNEW_SETTINGS * GetPcbNewSettings() const
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void OnUpdateSelectTrackWidth(wxUpdateUIEvent &aEvent)
void UpdateVariantSelectionCtrl()
Update the variant selection dropdown with the current board's variant names.
void UpdateTrackWidthSelectBox(wxChoice *aTrackWidthSelectBox, bool aShowNetclass, bool aShowEdit)
void UpdateViaSizeSelectBox(wxChoice *aViaSizeSelectBox, bool aShowNetclass, bool aShowEdit)
void SetCurrentVariant(const wxString &aVariantName)
Set the current variant on the board and update the drawing sheet's cached variant name and descripti...
LAYER_TOOLBAR_ICON_VALUES m_prevIconVal
void ClearToolbarControl(int aId) override
void ReCreateLayerBox(bool aForceResizeToolbar=true)
Recreate the layer box by clearing the old list and building a new one from the new layer names and c...
void PrepareLayerIndicator(bool aForceRebuild=false)
wxChoice * m_CurrentVariantCtrl
void UpdateProperties() override
PLUGIN_ACTION_SCOPE PluginActionScope() const override
void ReCreateAuxiliaryToolbar() override
void ToggleLibraryTree() override
void OnUpdateSelectViaSize(wxUpdateUIEvent &aEvent)
wxChoice * m_SelViaSizeBox
void onVariantSelected(wxCommandEvent &aEvent)
Event handler for variant selection changes in the toolbar.
void configureToolbars() override
PCB_DESIGN_BLOCK_PANE * m_designBlocksPane
static const wxString SearchPaneName()
wxChoice * m_SelTrackWidthBox
std::optional< TOOLBAR_CONFIGURATION > DefaultToolbarConfig(TOOLBAR_LOC aToolbar) override
Get the default tools to show on the specified canvas toolbar.
The selection tool: currently supports:
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:562
virtual API_PLUGIN_MANAGER & GetPluginManager() const
Definition pgm_base.h:140
TOOL_MANAGER * m_toolManager
Master controller class:
EDA_UNITS GetUserUnits() const
#define _(s)
EDA_UNITS
Definition eda_units.h:44
@ FRAME_PCB_EDITOR
Definition frame_type.h:38
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition macros.h:79
KICOMMON_API double ToUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Convert aValue in internal units to the appropriate user units defined by aUnit.
KICOMMON_API wxString GetText(EDA_UNITS aUnits, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Get the units string for a given units type.
KICOMMON_API bool IsImperialUnit(EDA_UNITS aUnit)
Definition eda_units.cpp:43
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:54
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:51
@ ID_AUX_TOOLBAR_PCB_VARIANT_SELECT
Definition pcbnew_id.h:19
@ ID_AUX_TOOLBAR_PCB_VIA_SIZE
Definition pcbnew_id.h:17
@ ID_AUX_TOOLBAR_PCB_TRACK_WIDTH
Definition pcbnew_id.h:18
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
Container to handle a stock of specific vias each with unique diameter and drill sizes in the BOARD c...
@ RIGHT
Toolbar on the right side of the canvas.
@ LEFT
Toolbar on the left side of the canvas.
@ TOP_AUX
Toolbar on the top of the canvas.
@ TOP_MAIN
Toolbar on the top of the canvas.
static wxBitmapBundle LayerPairBitmap
static wxString ComboBoxUnits(EDA_UNITS aUnits, double aValue, bool aIncludeLabel=true)
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.