KiCad PCB EDA Suite
SYMBOL_PREVIEW_WIDGET Class Reference

#include <symbol_preview_widget.h>

Inheritance diagram for SYMBOL_PREVIEW_WIDGET:

Public Member Functions

 SYMBOL_PREVIEW_WIDGET (wxWindow *aParent, KIWAY &aKiway, EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
 Construct a symbol preview widget. More...
 
 ~SYMBOL_PREVIEW_WIDGET () override
 
void SetStatusText (const wxString &aText)
 Set the contents of the status label and display it. More...
 
void DisplaySymbol (const LIB_ID &aSymbolID, int aUnit, int aConvert=0)
 Set the currently displayed symbol. More...
 
void DisplayPart (LIB_SYMBOL *aSymbol, int aUnit, int aConvert=0)
 

Private Member Functions

void onSize (wxSizeEvent &aEvent)
 
void fitOnDrawArea ()
 

Private Attributes

KIWAYm_kiway
 
KIGFX::GAL_DISPLAY_OPTIONS m_galDisplayOptions
 
EDA_DRAW_PANEL_GALm_preview
 
wxStaticText * m_status
 
wxPanel * m_statusPanel
 
wxSizer * m_statusSizer
 
wxSizer * m_outerSizer
 
LIB_SYMBOLm_previewItem
 A local copy of the LIB_SYMBOL to display on the canvas. More...
 
BOX2I m_itemBBox
 The bounding box of the current item. More...
 

Detailed Description

Definition at line 35 of file symbol_preview_widget.h.

Constructor & Destructor Documentation

◆ SYMBOL_PREVIEW_WIDGET()

SYMBOL_PREVIEW_WIDGET::SYMBOL_PREVIEW_WIDGET ( wxWindow *  aParent,
KIWAY aKiway,
EDA_DRAW_PANEL_GAL::GAL_TYPE  aCanvasType 
)

Construct a symbol preview widget.

Parameters
aParent- parent window
aKiway- an active Kiway instance
aCanvasType= the type of canvas (GAL_TYPE_OPENGL or GAL_TYPE_CAIRO only)

Definition at line 34 of file symbol_preview_widget.cpp.

35  :
36  wxPanel( aParent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ),
37  m_kiway( aKiway ),
38  m_preview( nullptr ), m_status( nullptr ), m_statusSizer( nullptr ), m_previewItem( nullptr )
39 {
40  auto common_settings = Pgm().GetCommonSettings();
41  auto app_settings = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
42 
43  m_galDisplayOptions.ReadConfig( *common_settings, app_settings->m_Window, this );
45 
46  EDA_DRAW_PANEL_GAL::GAL_TYPE canvasType = aCanvasType;
47 
48  // Allows only a CAIRO or OPENGL canvas:
49  if( canvasType != EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL
50  && canvasType != EDA_DRAW_PANEL_GAL::GAL_FALLBACK )
51  {
53  }
54 
55  m_preview = new SCH_PREVIEW_PANEL( aParent, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ),
56  m_galDisplayOptions, canvasType );
57  m_preview->SetStealsFocus( false );
58  m_preview->ShowScrollbars( wxSHOW_SB_NEVER, wxSHOW_SB_NEVER );
59  m_preview->GetGAL()->SetAxesEnabled( false );
60 
61  // Do not display the grid: the look is not good for a small canvas area.
62  // But mainly, due to some strange bug I (JPC) was unable to fix, the grid creates
63  // strange artifacts on Windows when Eeschema is run from KiCad manager (but not in
64  // stand alone...).
65  m_preview->GetGAL()->SetGridVisibility( false );
66 
67  // Early initialization of the canvas background color,
68  // before any OnPaint event is fired for the canvas using a wrong bg color
69  KIGFX::VIEW* view = m_preview->GetView();
70  auto settings = static_cast<KIGFX::SCH_RENDER_SETTINGS*>( view->GetPainter()->GetSettings() );
71 
72  if( auto* theme = Pgm().GetSettingsManager().GetColorSettings( app_settings->m_ColorTheme ) )
73  settings->LoadColors( theme );
74 
75  const COLOR4D& backgroundColor = settings->GetBackgroundColor();
76  const COLOR4D& foregroundColor = settings->GetCursorColor();
77 
78  m_preview->GetGAL()->SetClearColor( backgroundColor );
79 
80  m_statusPanel = new wxPanel( this );
81  m_statusPanel->SetBackgroundColour( backgroundColor.ToColour() );
82  m_status = new wxStaticText( m_statusPanel, wxID_ANY, wxEmptyString );
83  m_status->SetForegroundColour( settings->GetLayerColor( LAYER_REFERENCEPART ).ToColour() );
84  m_statusSizer = new wxBoxSizer( wxVERTICAL );
85  m_statusSizer->Add( 0, 0, 1 ); // add a spacer
86  m_statusSizer->Add( m_status, 0, wxALIGN_CENTER );
87  m_statusSizer->Add( 0, 0, 1 ); // add a spacer
88  m_statusPanel->SetSizer( m_statusSizer );
89 
90  // Give the status panel the same color scheme as the canvas so it isn't jarring when
91  // switched to.
92  m_statusPanel->SetBackgroundColour( backgroundColor.ToColour() );
93  m_statusPanel->SetForegroundColour( foregroundColor.ToColour() );
94 
95  // Give the preview panel a small top border to align its top with the status panel,
96  // and give the status panel a small bottom border to align its bottom with the preview
97  // panel.
98  m_outerSizer = new wxBoxSizer( wxVERTICAL );
99  m_outerSizer->Add( m_preview, 1, wxTOP | wxEXPAND, 5 );
100  m_outerSizer->Add( m_statusPanel, 1, wxBOTTOM | wxEXPAND, 5 );
101 
102  // Hide the status panel to start
103  m_statusPanel->Hide();
104 
105  SetSizer( m_outerSizer );
106  Layout();
107 
108  Connect( wxEVT_SIZE, wxSizeEventHandler( SYMBOL_PREVIEW_WIDGET::onSize ), nullptr, this );
109 }
void SetClearColor(const COLOR4D &aColor)
void onSize(wxSizeEvent &aEvent)
LIB_SYMBOL * m_previewItem
A local copy of the LIB_SYMBOL to display on the canvas.
static constexpr GAL_TYPE GAL_FALLBACK
bool m_forceDisplayCursor
The pixel scale factor (>1 for hi-DPI scaled displays)
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:208
KIGFX::GAL_DISPLAY_OPTIONS m_galDisplayOptions
EDA_DRAW_PANEL_GAL * m_preview
void SetStealsFocus(bool aStealsFocus)
Set whether focus is taken on certain events (mouseover, keys, etc).
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
void SetAxesEnabled(bool aAxesEnabled)
Enable drawing the axes.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
void ReadConfig(COMMON_SETTINGS &aCommonConfig, WINDOW_SETTINGS &aWindowConfig, wxWindow *aWindow)
Read application and common configs.
void SetGridVisibility(bool aVisibility)
Set the visibility setting of the grid.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103

References EDA_DRAW_PANEL_GAL::GAL_FALLBACK, EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL, EDA_DRAW_PANEL_GAL::GetGAL(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), EDA_DRAW_PANEL_GAL::GetView(), LAYER_REFERENCEPART, KIGFX::GAL_DISPLAY_OPTIONS::m_forceDisplayCursor, m_galDisplayOptions, m_outerSizer, m_preview, m_status, m_statusPanel, m_statusSizer, onSize(), Pgm(), KIGFX::GAL_DISPLAY_OPTIONS::ReadConfig(), KIGFX::GAL::SetAxesEnabled(), KIGFX::GAL::SetClearColor(), KIGFX::GAL::SetGridVisibility(), and EDA_DRAW_PANEL_GAL::SetStealsFocus().

◆ ~SYMBOL_PREVIEW_WIDGET()

SYMBOL_PREVIEW_WIDGET::~SYMBOL_PREVIEW_WIDGET ( )
override

Definition at line 112 of file symbol_preview_widget.cpp.

113 {
114  if( m_previewItem )
116 
117  delete m_previewItem;
118 }
LIB_SYMBOL * m_previewItem
A local copy of the LIB_SYMBOL to display on the canvas.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:348
EDA_DRAW_PANEL_GAL * m_preview
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.

References EDA_DRAW_PANEL_GAL::GetView(), m_preview, m_previewItem, and KIGFX::VIEW::Remove().

Member Function Documentation

◆ DisplayPart()

void SYMBOL_PREVIEW_WIDGET::DisplayPart ( LIB_SYMBOL aSymbol,
int  aUnit,
int  aConvert = 0 
)

Definition at line 228 of file symbol_preview_widget.cpp.

229 {
230  KIGFX::VIEW* view = m_preview->GetView();
231 
232  if( m_previewItem )
233  {
234  view->Remove( m_previewItem );
235  delete m_previewItem;
236  m_previewItem = nullptr;
237  }
238 
239  if( aSymbol )
240  {
241  m_previewItem = new LIB_SYMBOL( *aSymbol );
242 
243  // For symbols having a De Morgan body style, use the first style
244  auto settings =
245  static_cast<KIGFX::SCH_RENDER_SETTINGS*>( view->GetPainter()->GetSettings() );
246 
247  // If unit isn't specified for a multi-unit part, pick the first. (Otherwise we'll
248  // draw all of them.)
249  settings->m_ShowUnit = ( m_previewItem->IsMulti() && aUnit == 0 ) ? 1 : aUnit;
250 
251  settings->m_ShowConvert =
252  ( m_previewItem->HasConversion() && aConvert == 0 ) ? 1 : aConvert;
253 
254  view->Add( m_previewItem );
255 
256  // Get the symbol size, in internal units
257  m_itemBBox = aSymbol->GetUnitBoundingBox( settings->m_ShowUnit, settings->m_ShowConvert );
258 
259  // Calculate the draw scale to fit the drawing area
260  fitOnDrawArea();
261  }
262 
264  m_preview->Show();
265  m_statusPanel->Hide();
266  Layout();
267 }
bool IsMulti() const
Definition: lib_symbol.h:501
void ForceRefresh()
Force a redraw.
LIB_SYMBOL * m_previewItem
A local copy of the LIB_SYMBOL to display on the canvas.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:348
Define a library symbol object.
Definition: lib_symbol.h:96
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:208
bool HasConversion() const
Test if symbol has more than one body conversion type (DeMorgan).
const EDA_RECT GetUnitBoundingBox(int aUnit, int aConvert) const
Get the bounding box for the symbol.
Definition: lib_symbol.cpp:818
EDA_DRAW_PANEL_GAL * m_preview
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
BOX2I m_itemBBox
The bounding box of the current item.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:318
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68

References KIGFX::VIEW::Add(), fitOnDrawArea(), EDA_DRAW_PANEL_GAL::ForceRefresh(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), LIB_SYMBOL::GetUnitBoundingBox(), EDA_DRAW_PANEL_GAL::GetView(), LIB_SYMBOL::HasConversion(), LIB_SYMBOL::IsMulti(), m_itemBBox, m_preview, m_previewItem, m_statusPanel, and KIGFX::VIEW::Remove().

Referenced by DIALOG_RESCUE_EACH::displayItemsInConflict().

◆ DisplaySymbol()

void SYMBOL_PREVIEW_WIDGET::DisplaySymbol ( const LIB_ID aSymbolID,
int  aUnit,
int  aConvert = 0 
)

Set the currently displayed symbol.

Definition at line 166 of file symbol_preview_widget.cpp.

167 {
168  KIGFX::VIEW* view = m_preview->GetView();
169  auto settings = static_cast<KIGFX::SCH_RENDER_SETTINGS*>( view->GetPainter()->GetSettings() );
170  std::unique_ptr< LIB_SYMBOL > symbol;
171 
172  try
173  {
174  LIB_SYMBOL* tmp = m_kiway.Prj().SchSymbolLibTable()->LoadSymbol( aSymbolID );
175 
176  if( tmp )
177  symbol = tmp->Flatten();
178  }
179  catch( const IO_ERROR& ioe )
180  {
181  wxLogError( _( "Error loading symbol %s from library '%s'." ) + wxS( "\n%s" ),
182  aSymbolID.GetLibItemName().wx_str(),
183  aSymbolID.GetLibNickname().wx_str(),
184  ioe.What() );
185  }
186 
187  if( m_previewItem )
188  {
189  view->Remove( m_previewItem );
190  delete m_previewItem;
191  m_previewItem = nullptr;
192  }
193 
194  if( symbol )
195  {
196  // This will flatten derived parts so that the correct final symbol can be shown.
197  m_previewItem = symbol.release();
198 
199  // If unit isn't specified for a multi-unit part, pick the first. (Otherwise we'll
200  // draw all of them.)
201  settings->m_ShowUnit = ( m_previewItem->IsMulti() && aUnit == 0 ) ? 1 : aUnit;
202 
203  // For symbols having a De Morgan body style, use the first style
204  settings->m_ShowConvert =
205  ( m_previewItem->HasConversion() && aConvert == 0 ) ? 1 : aConvert;
206 
207  view->Add( m_previewItem );
208 
209  // Get the symbol size, in internal units
210  m_itemBBox = m_previewItem->GetUnitBoundingBox( settings->m_ShowUnit,
211  settings->m_ShowConvert );
212 
213  if( !m_preview->IsShown() )
214  {
215  m_preview->Show();
216  m_statusPanel->Hide();
217  Layout(); // Ensure panel size is up to date.
218  }
219 
220  // Calculate the draw scale to fit the drawing area
221  fitOnDrawArea();
222  }
223 
225 }
bool IsMulti() const
Definition: lib_symbol.h:501
const UTF8 & GetLibItemName() const
Definition: lib_id.h:104
void ForceRefresh()
Force a redraw.
LIB_SYMBOL * m_previewItem
A local copy of the LIB_SYMBOL to display on the canvas.
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
Definition: kiway.cpp:190
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:348
Define a library symbol object.
Definition: lib_symbol.h:96
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Definition: lib_symbol.cpp:331
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:208
bool HasConversion() const
Test if symbol has more than one body conversion type (DeMorgan).
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
const EDA_RECT GetUnitBoundingBox(int aUnit, int aConvert) const
Get the bounding box for the symbol.
Definition: lib_symbol.cpp:818
EDA_DRAW_PANEL_GAL * m_preview
#define _(s)
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:90
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
wxString wx_str() const
Definition: utf8.cpp:46
BOX2I m_itemBBox
The bounding box of the current item.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:318
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:75

References _, KIGFX::VIEW::Add(), fitOnDrawArea(), LIB_SYMBOL::Flatten(), EDA_DRAW_PANEL_GAL::ForceRefresh(), LIB_ID::GetLibItemName(), LIB_ID::GetLibNickname(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), LIB_SYMBOL::GetUnitBoundingBox(), EDA_DRAW_PANEL_GAL::GetView(), LIB_SYMBOL::HasConversion(), LIB_SYMBOL::IsMulti(), m_itemBBox, m_kiway, m_preview, m_previewItem, m_statusPanel, KIWAY::Prj(), KIGFX::VIEW::Remove(), IO_ERROR::What(), and UTF8::wx_str().

Referenced by DIALOG_CHOOSE_SYMBOL::OnComponentPreselected().

◆ fitOnDrawArea()

void SYMBOL_PREVIEW_WIDGET::fitOnDrawArea ( )
private

Definition at line 142 of file symbol_preview_widget.cpp.

143 {
144  if( !m_previewItem )
145  return;
146 
147  // set the view scale to fit the item on screen
148  KIGFX::VIEW* view = m_preview->GetView();
149 
150  // Calculate the drawing area size, in internal units, for a scaling factor = 1.0
151  view->SetScale( 1.0 );
152  VECTOR2D clientSize = view->ToWorld( m_preview->GetClientSize(), false );
153  // Calculate the draw scale to fit the drawing area
154  double scale = std::min( fabs( clientSize.x / m_itemBBox.GetWidth() ),
155  fabs( clientSize.y / m_itemBBox.GetHeight() ) );
156 
157  // Above calculation will yield an exact fit; add a bit of whitespace around symbol
158  scale /= 1.2;
159 
160  // Now fix the best scale
161  view->SetScale( scale );
162  view->SetCenter( m_itemBBox.Centre() );
163 }
VECTOR2D ToWorld(const VECTOR2D &aCoord, bool aAbsolute=true) const
Converts a screen space point/vector to a point/vector in world space coordinates.
Definition: view.cpp:447
LIB_SYMBOL * m_previewItem
A local copy of the LIB_SYMBOL to display on the canvas.
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition: view.cpp:576
coord_type GetWidth() const
Definition: box2.h:180
EDA_DRAW_PANEL_GAL * m_preview
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 })
Set the scaling factor, zooming around a given anchor point.
Definition: view.cpp:550
const int scale
Vec Centre() const
Definition: box2.h:63
coord_type GetHeight() const
Definition: box2.h:181
BOX2I m_itemBBox
The bounding box of the current item.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68

References BOX2< Vec >::Centre(), BOX2< Vec >::GetHeight(), EDA_DRAW_PANEL_GAL::GetView(), BOX2< Vec >::GetWidth(), m_itemBBox, m_preview, m_previewItem, scale, KIGFX::VIEW::SetCenter(), KIGFX::VIEW::SetScale(), KIGFX::VIEW::ToWorld(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by DisplayPart(), DisplaySymbol(), and onSize().

◆ onSize()

void SYMBOL_PREVIEW_WIDGET::onSize ( wxSizeEvent &  aEvent)
private

Definition at line 130 of file symbol_preview_widget.cpp.

131 {
132  if( m_previewItem )
133  {
134  fitOnDrawArea();
136  }
137 
138  aEvent.Skip();
139 }
void ForceRefresh()
Force a redraw.
LIB_SYMBOL * m_previewItem
A local copy of the LIB_SYMBOL to display on the canvas.
EDA_DRAW_PANEL_GAL * m_preview

References fitOnDrawArea(), EDA_DRAW_PANEL_GAL::ForceRefresh(), m_preview, and m_previewItem.

Referenced by SYMBOL_PREVIEW_WIDGET().

◆ SetStatusText()

void SYMBOL_PREVIEW_WIDGET::SetStatusText ( const wxString &  aText)

Set the contents of the status label and display it.

Definition at line 121 of file symbol_preview_widget.cpp.

122 {
123  m_status->SetLabel( aText );
124  m_preview->Hide();
125  m_statusPanel->Show();
126  Layout();
127 }
EDA_DRAW_PANEL_GAL * m_preview

References m_preview, m_status, and m_statusPanel.

Referenced by DIALOG_CHOOSE_SYMBOL::OnComponentPreselected().

Member Data Documentation

◆ m_galDisplayOptions

KIGFX::GAL_DISPLAY_OPTIONS SYMBOL_PREVIEW_WIDGET::m_galDisplayOptions
private

Definition at line 70 of file symbol_preview_widget.h.

Referenced by SYMBOL_PREVIEW_WIDGET().

◆ m_itemBBox

BOX2I SYMBOL_PREVIEW_WIDGET::m_itemBBox
private

The bounding box of the current item.

Definition at line 84 of file symbol_preview_widget.h.

Referenced by DisplayPart(), DisplaySymbol(), and fitOnDrawArea().

◆ m_kiway

KIWAY& SYMBOL_PREVIEW_WIDGET::m_kiway
private

Definition at line 68 of file symbol_preview_widget.h.

Referenced by DisplaySymbol().

◆ m_outerSizer

wxSizer* SYMBOL_PREVIEW_WIDGET::m_outerSizer
private

Definition at line 76 of file symbol_preview_widget.h.

Referenced by SYMBOL_PREVIEW_WIDGET().

◆ m_preview

EDA_DRAW_PANEL_GAL* SYMBOL_PREVIEW_WIDGET::m_preview
private

◆ m_previewItem

LIB_SYMBOL* SYMBOL_PREVIEW_WIDGET::m_previewItem
private

A local copy of the LIB_SYMBOL to display on the canvas.

Definition at line 81 of file symbol_preview_widget.h.

Referenced by DisplayPart(), DisplaySymbol(), fitOnDrawArea(), onSize(), and ~SYMBOL_PREVIEW_WIDGET().

◆ m_status

wxStaticText* SYMBOL_PREVIEW_WIDGET::m_status
private

Definition at line 73 of file symbol_preview_widget.h.

Referenced by SetStatusText(), and SYMBOL_PREVIEW_WIDGET().

◆ m_statusPanel

wxPanel* SYMBOL_PREVIEW_WIDGET::m_statusPanel
private

◆ m_statusSizer

wxSizer* SYMBOL_PREVIEW_WIDGET::m_statusSizer
private

Definition at line 75 of file symbol_preview_widget.h.

Referenced by SYMBOL_PREVIEW_WIDGET().


The documentation for this class was generated from the following files: