41#include <wx/bmpbuttn.h>
43#include <wx/textdlg.h>
44#include <wx/checkbox.h>
46#include <../3d_rendering/opengl/render_3d_opengl.h>
49#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
95 wxWindow* aFocusOwner ) :
98 m_focusOwner( aFocusOwner ),
99 m_lastSelectedViewport( nullptr )
104 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
105 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
125 _(
"Use board stackup colors" ) );
129 [
this]( wxCommandEvent& aEvent )
141 m_cbLayerPresets->SetToolTip( wxString::Format(
_(
"Save and restore color and visibility "
143 "Use %s+Tab to activate selector.\n"
144 "Successive Tabs while holding %s down will "
145 "cycle through presets in the popup." ),
149 m_cbViewports->SetToolTip( wxString::Format(
_(
"Save and restore camera position and zoom.\n"
150 "Use %s+Tab to activate selector.\n"
151 "Successive Tabs while holding %s down will "
152 "cycle through viewports in the popup." ),
156 if( screenHeight <= 900 && m_pointSize >= indicatorSize )
162 KiBitmap( BITMAPS::visibility_off ) );
187 if( wxBitmapButton* btn =
dynamic_cast<wxBitmapButton*
>( aEvent.GetEventObject() ) )
189 wxCommandEvent evt( wxEVT_BUTTON );
190 wxPostEvent( btn, evt );
242 if( child && child->GetWindow() )
271 if(
m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
282 std::vector<VIEWPORT3D> ret;
285 ret.emplace_back( viewport );
295 for(
const VIEWPORT3D& viewport : aViewportList )
342 bool killFollow =
false;
343 bool doFastRefresh =
false;
368 visibleLayers.set( aLayer, isVisible );
385 visibleLayers.set( aLayer, isVisible );
394 doFastRefresh =
true;
395 visibleLayers.set( aLayer, isVisible );
399 visibleLayers.set( aLayer, isVisible );
435 int layer = aSwatch->GetId();
438 colors[ layer ] = newColor;
455 int swatchWidth =
m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
468 [&](
const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
470 wxBoxSizer* sizer =
new wxBoxSizer( wxHORIZONTAL );
471 int layer = aSetting->m_Id;
473 aSetting->m_Visible = visibleLayers.test( layer );
475 if( colors.count( layer ) )
478 COLOR4D::WHITE, defaultColors[ layer ],
480 swatch->SetToolTip(
_(
"Left double click or middle click to change color" ) );
491 "allow color editing." ),
492 10000, wxICON_INFORMATION );
495 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
496 aSetting->m_Ctl_color = swatch;
498 swatch->Bind( COLOR_SWATCH_CHANGED,
499 [
this]( wxCommandEvent& event )
501 auto swatch =
static_cast<COLOR_SWATCH*
>(
event.GetEventObject() );
509 sizer->AddSpacer( swatchWidth );
512 sizer->AddSpacer( 5 );
514 wxStaticText* label =
new wxStaticText(
m_windowLayers, layer, aSetting->GetLabel() );
516 label->SetToolTip( aSetting->GetTooltip() );
520 sizer->AddSpacer( swatchWidth );
526 KiBitmap( BITMAPS::visibility_off ),
527 aSetting->m_Visible );
529 btn_visible->Bind( TOGGLE_CHANGED,
530 [
this]( wxCommandEvent& aEvent )
532 int id =
static_cast<wxWindow*
>( aEvent.GetEventObject() )->GetId();
533 bool isVisible = aEvent.GetInt();
540 tip.Printf(
_(
"Show or hide %s" ), aSetting->GetLabel().Lower() );
541 btn_visible->SetToolTip( tip );
543 aSetting->m_Ctl_visibility = btn_visible;
544 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
547 sizer->AddSpacer( 5 );
548 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
556 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
557 std::unique_ptr<APPEARANCE_SETTING_3D>& setting =
m_layerSettings.back();
559 if( setting->m_Spacer )
562 appendLayer( setting );
577 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting :
m_layerSettings )
579 if( setting->m_Spacer )
582 if( setting->m_Ctl_visibility )
583 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
585 if( setting->m_Ctl_color )
587 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ],
false );
636 auto it = std::find_if(
637 presets.begin(), presets.end(),
640 if( aPreset.name.Lower() == _(
"legacy colors" )
641 && m_cbUseBoardStackupColors->GetValue() )
648 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
652 for(
int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
654 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
660 auto it1 = aPreset.colors.find( layer );
661 auto it2 = colors.find( layer );
663 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
670 if( it != presets.end() )
672 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
673 m_cbLayerPresets->SetStringSelection( it->name );
677 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 );
700 auto resetSelection =
713 else if( index == 1 )
720 else if( index == count - 3 )
726 else if( index == count - 2 )
728 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Layer preset name:" ),
729 _(
"Save Layer Preset" ) );
731 if( dlg.ShowModal() != wxID_OK )
740 name = dlg.GetValue();
744 if( !
IsOK( wxGetTopLevelParent(
this ),
_(
"Overwrite existing preset?" ) ) )
750 preset->layers = visibleLayers;
751 preset->colors = colors;
765 else if( index == count - 1 )
767 wxArrayString headers;
768 std::vector<wxArrayString> items;
770 headers.Add(
_(
"Presets" ) );
775 item.Add( preset.
name );
776 items.emplace_back( item );
782 if( dlg.ShowModal() == wxID_OK )
792 return preset.name == name;
828 if( aPreset.
name.Lower() ==
_(
"legacy colors" ) )
843 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
844 m_cbViewports->Append( pair.first,
static_cast<void*
>( &pair.second ) );
860 if( index >= 0 && index < count - 3 )
864 wxCHECK( viewport, );
868 if( !viewport->
name.IsEmpty() )
874 else if( index == count - 2 )
879 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Viewport name:" ),
880 _(
"Save Viewport" ),
name );
882 if( dlg.ShowModal() != wxID_OK )
892 name = dlg.GetValue();
913 else if( index == count - 1 )
916 wxArrayString headers;
917 std::vector<wxArrayString> items;
919 headers.Add(
_(
"Viewports" ) );
921 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
924 item.Add( pair.first );
925 items.emplace_back( item );
931 if( dlg.ShowModal() == wxID_OK )
936 if( idx != wxNOT_FOUND )
961 if( index >= 0 && index < count - 3 )
965 wxCHECK( viewport, );
static std::vector< int > inStackupColors
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Container for an appearance setting (can control a layer class, object type, etc.)
Class APPEARANCE_CONTROLS_3D_BASE.
wxScrolledCanvas * m_windowLayers
wxBoxSizer * m_panelLayersSizer
wxChoice * m_cbLayerPresets
wxBoxSizer * m_sizerOuter
wxStaticText * m_presetsLabel
wxStaticText * m_viewportsLabel
void OnLanguageChanged(wxCommandEvent &aEvent)
void CommonSettingsChanged()
VIEWPORT3D * m_lastSelectedViewport
wxArrayString m_viewportMRU
~APPEARANCE_CONTROLS_3D()
GRID_BITMAP_TOGGLE_RENDERER * m_toggleGridRenderer
wxCheckBox * m_cbUseBoardStackupColors
void onLayerPresetChanged(wxCommandEvent &aEvent) override
wxArrayString m_presetMRU
void updateLayerPresetWidget(const wxString &aName)
wxSize GetBestSize() const
std::vector< VIEWPORT3D > GetUserViewports() const
Update the current viewports from those saved in the project file.
wxColour m_layerPanelColour
void ApplyViewport(const wxString &aPresetName)
void syncLayerPresetSelection()
void rebuildLayerPresetsWidget()
void onColorSwatchChanged(COLOR_SWATCH *aSwatch)
wxBoxSizer * m_envOuterSizer
APPEARANCE_CONTROLS_3D(EDA_3D_VIEWER_FRAME *aParent, wxWindow *aFocusOwner)
std::vector< std::unique_ptr< APPEARANCE_SETTING_3D > > m_layerSettings
std::map< int, APPEARANCE_SETTING_3D * > m_layerSettingsMap
static const APPEARANCE_SETTING_3D s_layerSettings[]
Template for object appearance settings.
void doApplyLayerPreset(const LAYER_PRESET_3D &aPreset)
EDA_3D_VIEWER_FRAME * m_frame
void onUpdateViewportsCb(wxUpdateUIEvent &aEvent) override
void OnSetFocus(wxFocusEvent &aEvent) override
void OnLayerVisibilityChanged(int aLayer, bool isVisible)
void OnSize(wxSizeEvent &aEvent) override
void doApplyViewport(const VIEWPORT3D &aViewport)
std::map< wxString, VIEWPORT3D > m_viewports
wxBoxSizer * m_layersOuterSizer
void ApplyLayerPreset(const wxString &aPresetName)
void rebuildViewportsWidget()
void onViewportChanged(wxCommandEvent &aEvent) override
void SetUserViewports(std::vector< VIEWPORT3D > &aPresetList)
A checkbox control except with custom bitmaps for the checked and unchecked states.
Helper class to handle information needed to display 3D board.
void SetVisibleLayers(const std::bitset< LAYER_3D_END > &aLayers)
std::map< int, COLOR4D > GetLayerColors() const
std::bitset< LAYER_3D_END > GetVisibleLayers() const
void SetLayerColors(const std::map< int, COLOR4D > &aColors)
EDA_3D_VIEWER_SETTINGS * m_Cfg
std::map< int, COLOR4D > GetDefaultColors() const
const glm::mat4 & GetViewMatrix() const
void SetViewMatrix(glm::mat4 aViewMatrix)
Set the affine matrix to be applied to a transformation camera.
A simple color swatch of the kind used to set layer colors.
KIGFX::COLOR4D GetSwatchColor() const
void SetReadOnlyCallback(std::function< void()> aCallback)
Registers a handler for when the user tries to interact with a read-only swatch.
Class to handle configuration and automatic determination of the DPI scale to use for canvases.
double GetContentScaleFactor() const override
Get the content scale factor, which may be different from the scale factor on some platforms.
double GetScaleFactor() const override
Get the DPI scale from all known sources in order:
static TOOL_ACTION showNotInPosFile
static TOOL_ACTION showTHT
static TOOL_ACTION showDNP
static TOOL_ACTION showSMD
static TOOL_ACTION showVirtual
static TOOL_ACTION showBBoxes
static TOOL_ACTION showAxis
RENDER_3D_BASE * GetCurrentRender() const
void RenderRaytracingRequest()
Request to render the current view in Raytracing mode.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
BOARD_ADAPTER & GetAdapter() override
void NewDisplay(bool aForceImmediateRedraw=false)
Reload and refresh (rebuild) the 3D scene.
CAMERA & GetCurrentCamera() override
EDA_3D_CANVAS * GetCanvas()
LAYER_PRESET_3D * FindPreset(const wxString &aName)
std::vector< LAYER_PRESET_3D > m_LayerPresets
WX_INFOBAR * GetInfoBar()
wxString GetTextSelection(int aColumn=0)
Return the selected text from aColumn in the wxListCtrl in the dialog.
void SetListLabel(const wxString &aLabel)
A toggle button renderer for a wxGrid, similar to BITMAP_TOGGLE.
A color representation with 4 components: red, green, blue, alpha.
Object to render the board using openGL.
void Load3dModelsIfNeeded()
Load footprint models if they are not already loaded, i.e.
A modified version of the wxInfoBar class that allows us to:
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
void SetBorders(bool aLeft, bool aRight, bool aTop, bool aBottom)
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
This file is part of the common library.
Declaration of the eda_3d_viewer class.
#define FOLLOW_PLOT_SETTINGS
#define VIEWPORT_SWITCH_KEY
#define PRESET_SWITCH_KEY
wxString KeyNameFromKeyCode(int aKeycode, bool *aIsFound)
Return the key name from the key code.
@ LAYER_3D_SOLDERMASK_TOP
@ LAYER_3D_BOUNDING_BOXES
@ LAYER_3D_BACKGROUND_TOP
@ LAYER_3D_SOLDERMASK_BOTTOM
@ LAYER_3D_SILKSCREEN_TOP
@ LAYER_3D_VIRTUAL_MODELS
@ LAYER_3D_MODELS_MARKED_DNP
@ LAYER_3D_OFF_BOARD_SILK
@ LAYER_3D_MODELS_NOT_IN_POS
@ LAYER_3D_BACKGROUND_BOTTOM
@ LAYER_3D_SILKSCREEN_BOTTOM
@ LAYER_FP_REFERENCES
show footprints references (when texts are visible)
@ LAYER_FP_VALUES
show footprints values (when texts are visible)
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
void delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
wxString name
A name for this layer set.
std::bitset< LAYER_3D_END > layers
std::map< int, KIGFX::COLOR4D > colors