From d69ebfae49c423a493cc1d9e2c85090adce910fd Mon Sep 17 00:00:00 2001
From: Jeff Young
Date: Tue, 24 Mar 2020 01:01:23 +0000
Subject: [PATCH] Push tool framework base down into TOOL_HOLDER.
This allows us to use it outside of EDA_BASE_FRAMEs (in this case, in
PANEL_PREVIEW_3D.)
---
...panel_prev_model.cpp => panel_prev_3d.cpp} | 109 +++---
.../{panel_prev_model.h => panel_prev_3d.h} | 21 +-
.../{cinfo3d_visu.cpp => 3d_settings.cpp} | 66 ++--
.../{cinfo3d_visu.h => 3d_settings.h} | 67 ++--
.../3d_canvas/create_3Dgraphic_brd_items.cpp | 86 ++---
3d-viewer/3d_canvas/create_layer_items.cpp | 173 ++++-----
3d-viewer/3d_canvas/create_layer_poly.cpp | 28 +-
3d-viewer/3d_canvas/eda_3d_canvas.cpp | 7 +-
3d-viewer/3d_canvas/eda_3d_canvas.h | 6 +-
.../c3d_render_ogl_legacy.cpp | 2 +-
.../c3d_render_ogl_legacy.h | 2 +-
.../c3d_render_raytracing.cpp | 2 +-
.../c3d_render_raytracing.h | 2 +-
3d-viewer/3d_rendering/c3d_render_base.cpp | 2 +-
3d-viewer/3d_rendering/c3d_render_base.h | 6 +-
.../dialogs/dialog_3D_view_option.cpp | 68 ++--
3d-viewer/3d_viewer/eda_3d_viewer.cpp | 19 +-
3d-viewer/3d_viewer/eda_3d_viewer.h | 12 +-
3d-viewer/3d_viewer/tools/3d_controller.cpp | 327 ++++++++++++++++++
.../{3d_viewer_control.h => 3d_controller.h} | 22 +-
.../3d_viewer/tools/3d_viewer_control.cpp | 318 -----------------
3d-viewer/CMakeLists.txt | 8 +-
bitmap2component/bitmap2cmp_gui.cpp | 15 +-
bitmap2component/bitmap2cmp_gui.h | 41 +--
common/CMakeLists.txt | 1 +
common/bitmap.cpp | 8 +-
common/eda_base_frame.cpp | 143 +-------
common/lib_tree_model_adapter.h | 2 +
common/tool/action_manager.cpp | 4 +-
common/tool/action_menu.cpp | 2 +-
common/tool/action_toolbar.cpp | 12 +-
common/tool/tool_base.cpp | 4 +-
common/tool/tool_dispatcher.cpp | 56 ++-
common/tool/tool_manager.cpp | 17 +-
common/tools_holder.cpp | 128 +++++++
cvpcb/cvpcb_mainframe.cpp | 8 +-
cvpcb/cvpcb_mainframe.h | 4 +-
eeschema/sim/sim_plot_frame.h | 3 +
eeschema/tools/sch_editor_control.cpp | 2 +-
eeschema/tools/sch_line_wire_bus_tool.cpp | 2 +-
include/bitmap_types.h | 7 +-
include/eda_base_frame.h | 74 +---
include/eda_draw_frame.h | 2 +
include/tool/action_toolbar.h | 2 +-
include/tool/tool_base.h | 7 +-
include/tool/tool_manager.h | 15 +-
include/tools_holder.h | 112 ++++++
kicad/kicad_manager_frame.cpp | 6 +
kicad/kicad_manager_frame.h | 2 +
pcb_calculator/pcb_calculator.h | 2 +
pcbnew/board_commit.cpp | 2 +-
.../dialog_edit_footprint_for_BoardEditor.cpp | 2 +-
.../dialog_edit_footprint_for_fp_editor.cpp | 2 +-
pcbnew/dialogs/dialog_position_relative.cpp | 2 +-
54 files changed, 1069 insertions(+), 973 deletions(-)
rename 3d-viewer/3d_cache/dialogs/{panel_prev_model.cpp => panel_prev_3d.cpp} (88%)
rename 3d-viewer/3d_cache/dialogs/{panel_prev_model.h => panel_prev_3d.h} (90%)
rename 3d-viewer/3d_canvas/{cinfo3d_visu.cpp => 3d_settings.cpp} (89%)
rename 3d-viewer/3d_canvas/{cinfo3d_visu.h => 3d_settings.h} (96%)
create mode 100644 3d-viewer/3d_viewer/tools/3d_controller.cpp
rename 3d-viewer/3d_viewer/tools/{3d_viewer_control.h => 3d_controller.h} (86%)
delete mode 100644 3d-viewer/3d_viewer/tools/3d_viewer_control.cpp
create mode 100644 common/tools_holder.cpp
create mode 100644 include/tools_holder.h
diff --git a/3d-viewer/3d_cache/dialogs/panel_prev_model.cpp b/3d-viewer/3d_cache/dialogs/panel_prev_3d.cpp
similarity index 88%
rename from 3d-viewer/3d_cache/dialogs/panel_prev_model.cpp
rename to 3d-viewer/3d_cache/dialogs/panel_prev_3d.cpp
index 250312dd6d..7a12e9bc81 100644
--- a/3d-viewer/3d_cache/dialogs/panel_prev_model.cpp
+++ b/3d-viewer/3d_cache/dialogs/panel_prev_3d.cpp
@@ -4,7 +4,7 @@
* Copyright (C) 2016 Mario Luzeiro
* Copyright (C) 2015 Cirilo Bernardo
* Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
- * Copyright (C) 2015-2018 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2015-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -24,8 +24,12 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "panel_prev_model.h"
+#include "panel_prev_3d.h"
#include <3d_canvas/eda_3d_canvas.h>
+#include
+#include
+#include
+#include
#include
#include
#include
@@ -37,42 +41,11 @@
PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE* aModule,
- std::vector *aParentModelList ) :
- PANEL_PREV_3D_BASE( aParent, wxID_ANY )
+ std::vector* aParentModelList ) :
+ PANEL_PREV_3D_BASE( aParent, wxID_ANY )
{
m_userUnits = aFrame->GetUserUnits();
- initPanel();
-
- m_parentModelList = aParentModelList;
-
- m_dummyModule = new MODULE( *aModule );
- m_dummyBoard->Add( m_dummyModule );
-
- // Set 3d viewer configuration for preview
- m_settings3Dviewer = new CINFO3D_VISU();
-
- // Create the 3D canvas
- m_previewPane = new EDA_3D_CANVAS( this, COGL_ATT_LIST::GetAttributesList( true ),
- m_dummyBoard, *m_settings3Dviewer,
- aFrame->Prj().Get3DCacheManager() );
-
- loadCommonSettings();
-
- m_SizerPanelView->Add( m_previewPane, 1, wxEXPAND, 5 );
-}
-
-
-PANEL_PREV_3D::~PANEL_PREV_3D()
-{
- delete m_settings3Dviewer;
- delete m_dummyBoard;
- delete m_previewPane;
-}
-
-
-void PANEL_PREV_3D::initPanel()
-{
m_dummyBoard = new BOARD();
m_selected = -1;
@@ -100,6 +73,58 @@ void PANEL_PREV_3D::initPanel()
for( wxSpinButton* button : spinButtonList )
button->SetRange(INT_MIN, INT_MAX );
+
+ m_parentModelList = aParentModelList;
+
+ m_dummyModule = new MODULE( *aModule );
+ m_dummyBoard->Add( m_dummyModule );
+
+ // Set 3d viewer configuration for preview
+ m_settings3Dviewer = new EDA_3D_SETTINGS();
+
+ // Create the 3D canvas
+ m_previewPane = new EDA_3D_CANVAS( this, COGL_ATT_LIST::GetAttributesList( true ),
+ m_dummyBoard, *m_settings3Dviewer,
+ aFrame->Prj().Get3DCacheManager() );
+
+ loadCommonSettings();
+
+ // Create the manager
+ m_toolManager = new TOOL_MANAGER;
+ m_toolManager->SetEnvironment( m_dummyBoard, nullptr, nullptr, this );
+
+ m_actions = new EDA_3D_ACTIONS();
+ m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager, m_actions );
+ m_previewPane->SetEventDispatcher( m_toolDispatcher );
+
+ // Register tools
+ m_toolManager->RegisterTool( new EDA_3D_CONTROLLER );
+ m_toolManager->InitTools();
+
+ // Run the viewer control tool, it is supposed to be always active
+ m_toolManager->InvokeTool( "3DViewer.Control" );
+
+ m_SizerPanelView->Add( m_previewPane, 1, wxEXPAND, 5 );
+
+ for( wxEventType eventType : { wxEVT_MENU_OPEN, wxEVT_MENU_CLOSE, wxEVT_MENU_HIGHLIGHT } )
+ Connect( eventType, wxMenuEventHandler( PANEL_PREV_3D::OnMenuEvent ), NULL, this );
+}
+
+
+PANEL_PREV_3D::~PANEL_PREV_3D()
+{
+ delete m_settings3Dviewer;
+ delete m_dummyBoard;
+ delete m_previewPane;
+}
+
+
+void PANEL_PREV_3D::OnMenuEvent( wxMenuEvent& aEvent )
+{
+ if( !m_toolDispatcher )
+ aEvent.Skip();
+ else
+ m_toolDispatcher->DispatchWxEvent( aEvent );
}
@@ -127,12 +152,12 @@ static double rotationFromString( const wxString& aValue )
if( rotation > MAX_ROTATION )
{
- int n = rotation / MAX_ROTATION;
+ int n = KiROUND( rotation / MAX_ROTATION );
rotation -= MAX_ROTATION * n;
}
else if( rotation < -MAX_ROTATION )
{
- int n = -rotation / MAX_ROTATION;
+ int n = KiROUND( -rotation / MAX_ROTATION );
rotation += MAX_ROTATION * n;
}
@@ -351,6 +376,7 @@ void PANEL_PREV_3D::onMouseWheelOffset( wxMouseEvent& event )
if( m_userUnits == EDA_UNITS::INCHES )
{
step = OFFSET_INCREMENT_MIL/1000.0;
+
if( event.ShiftDown( ) )
step = OFFSET_INCREMENT_MIL_FINE/1000.0;
}
@@ -372,13 +398,10 @@ void PANEL_PREV_3D::UpdateDummyModule( bool aReloadRequired )
{
m_dummyModule->Models().clear();
- for( size_t i = 0; i < m_parentModelList->size(); ++i )
+ for( MODULE_3D_SETTINGS& model : *m_parentModelList)
{
- if( m_parentModelList->at( i ).m_Preview )
- {
- m_dummyModule->Models().insert( m_dummyModule->Models().end(),
- m_parentModelList->at( i ) );
- }
+ if( model.m_Preview )
+ m_dummyModule->Models().push_back( model );
}
if( aReloadRequired )
diff --git a/3d-viewer/3d_cache/dialogs/panel_prev_model.h b/3d-viewer/3d_cache/dialogs/panel_prev_3d.h
similarity index 90%
rename from 3d-viewer/3d_cache/dialogs/panel_prev_model.h
rename to 3d-viewer/3d_cache/dialogs/panel_prev_3d.h
index 922c35ac78..2908c945c0 100644
--- a/3d-viewer/3d_cache/dialogs/panel_prev_model.h
+++ b/3d-viewer/3d_cache/dialogs/panel_prev_3d.h
@@ -39,7 +39,7 @@
#include "panel_prev_3d_base.h"
#include
-
+#include
#include <3d_canvas/eda_3d_canvas.h>
#include <3d_viewer_id.h>
@@ -66,20 +66,20 @@
class S3D_CACHE;
class FILENAME_RESOLVER;
class BOARD;
-class CINFO3D_VISU;
+class EDA_3D_SETTINGS;
class MODULE;
-class PANEL_PREV_3D: public PANEL_PREV_3D_BASE
+class PANEL_PREV_3D: public EDA_3D_SETTINGS_HOLDER, public TOOLS_HOLDER, public PANEL_PREV_3D_BASE
{
public:
PANEL_PREV_3D( wxWindow* aParent, PCB_BASE_FRAME* aFrame, MODULE* aModule,
- std::vector *aParentModelList );
+ std::vector* aParentModelList );
~PANEL_PREV_3D();
private:
EDA_3D_CANVAS* m_previewPane;
- CINFO3D_VISU* m_settings3Dviewer;
+ EDA_3D_SETTINGS* m_settings3Dviewer;
BOARD* m_dummyBoard;
MODULE* m_dummyModule;
@@ -91,8 +91,6 @@ private:
// Methods of the class
private:
- void initPanel();
-
/**
* Load 3D relevant settings from the user configuration
*/
@@ -184,6 +182,15 @@ private:
}
public:
+ /**
+ * The TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu
+ * events aren't captured by the menus themselves.
+ */
+ void OnMenuEvent( wxMenuEvent& aEvent );
+
+ wxWindow* GetToolCanvas() const override { return m_previewPane; }
+ EDA_3D_SETTINGS* GetSettings() override { return m_settings3Dviewer; }
+
/**
* @brief SetModelDataIdx - Sets the currently selected index in the model list so that
* the scale/rotation/offset controls can be updated.
diff --git a/3d-viewer/3d_canvas/cinfo3d_visu.cpp b/3d-viewer/3d_canvas/3d_settings.cpp
similarity index 89%
rename from 3d-viewer/3d_canvas/cinfo3d_visu.cpp
rename to 3d-viewer/3d_canvas/3d_settings.cpp
index 8b238a0140..ae466ef0a7 100644
--- a/3d-viewer/3d_canvas/cinfo3d_visu.cpp
+++ b/3d-viewer/3d_canvas/3d_settings.cpp
@@ -28,7 +28,7 @@
*/
#include "../3d_rendering/ccamera.h"
-#include "cinfo3d_visu.h"
+#include "3d_settings.h"
#include <3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.h>
#include
#include <3d_math.h>
@@ -44,17 +44,17 @@
* "KI_TRACE_EDA_CINFO3D_VISU". See the wxWidgets documentation on wxLogTrace for
* more information.
*/
-const wxChar *CINFO3D_VISU::m_logTrace = wxT( "KI_TRACE_EDA_CINFO3D_VISU" );
+const wxChar *EDA_3D_SETTINGS::m_logTrace = wxT( "KI_TRACE_EDA_CINFO3D_VISU" );
-CINFO3D_VISU G_null_CINFO3D_VISU;
+EDA_3D_SETTINGS G_null_EDA_3D_SETTINGS;
-CINFO3D_VISU::CINFO3D_VISU() :
+EDA_3D_SETTINGS::EDA_3D_SETTINGS() :
m_currentCamera( m_trackBallCamera ),
m_trackBallCamera( RANGE_SCALE_3D )
{
- wxLogTrace( m_logTrace, wxT( "CINFO3D_VISU::CINFO3D_VISU" ) );
+ wxLogTrace( m_logTrace, wxT( "EDA_3D_SETTINGS::EDA_3D_SETTINGS" ) );
m_board = NULL;
m_3d_model_manager = NULL;
@@ -73,8 +73,6 @@ CINFO3D_VISU::CINFO3D_VISU() :
m_boardBoundingBox.Reset();
- m_layers_container2D.clear();
- m_layers_holes2D.clear();
m_through_holes_inner.Clear();
m_through_holes_outer.Clear();
@@ -94,7 +92,6 @@ CINFO3D_VISU::CINFO3D_VISU() :
m_calc_seg_min_factor3DU = 0.0f;
m_calc_seg_max_factor3DU = 0.0f;
-
memset( m_layerZcoordTop, 0, sizeof( m_layerZcoordTop ) );
memset( m_layerZcoordBottom, 0, sizeof( m_layerZcoordBottom ) );
@@ -122,13 +119,13 @@ CINFO3D_VISU::CINFO3D_VISU() :
}
-CINFO3D_VISU::~CINFO3D_VISU()
+EDA_3D_SETTINGS::~EDA_3D_SETTINGS()
{
destroyLayers();
}
-bool CINFO3D_VISU::Is3DLayerEnabled( PCB_LAYER_ID aLayer ) const
+bool EDA_3D_SETTINGS::Is3DLayerEnabled( PCB_LAYER_ID aLayer ) const
{
wxASSERT( aLayer < PCB_LAYER_ID_COUNT );
@@ -211,7 +208,7 @@ bool CINFO3D_VISU::Is3DLayerEnabled( PCB_LAYER_ID aLayer ) const
}
-bool CINFO3D_VISU::GetFlag( DISPLAY3D_FLG aFlag ) const
+bool EDA_3D_SETTINGS::GetFlag( DISPLAY3D_FLG aFlag ) const
{
wxASSERT( aFlag < FL_LAST );
@@ -219,14 +216,14 @@ bool CINFO3D_VISU::GetFlag( DISPLAY3D_FLG aFlag ) const
}
-void CINFO3D_VISU::SetFlag( DISPLAY3D_FLG aFlag, bool aState )
+void EDA_3D_SETTINGS::SetFlag( DISPLAY3D_FLG aFlag, bool aState )
{
wxASSERT( aFlag < FL_LAST );
m_drawFlags[aFlag] = aState;
}
-bool CINFO3D_VISU::ShouldModuleBeDisplayed( MODULE_ATTR_T aModuleAttributs ) const
+bool EDA_3D_SETTINGS::ShouldModuleBeDisplayed( MODULE_ATTR_T aModuleAttributs ) const
{
if( ( ( aModuleAttributs == MOD_DEFAULT ) &&
GetFlag( FL_MODULE_ATTRIBUTES_NORMAL ) ) ||
@@ -246,12 +243,12 @@ bool CINFO3D_VISU::ShouldModuleBeDisplayed( MODULE_ATTR_T aModuleAttributs ) con
#define COPPER_THICKNESS KiROUND( 0.035 * IU_PER_MM ) // for 35 um
#define TECH_LAYER_THICKNESS KiROUND( 0.04 * IU_PER_MM )
-int CINFO3D_VISU::GetCopperThicknessBIU() const
+int EDA_3D_SETTINGS::GetCopperThicknessBIU() const
{
return COPPER_THICKNESS;
}
-unsigned int CINFO3D_VISU::GetNrSegmentsCircle( float aDiameter3DU ) const
+unsigned int EDA_3D_SETTINGS::GetNrSegmentsCircle( float aDiameter3DU ) const
{
wxASSERT( aDiameter3DU > 0.0f );
@@ -259,7 +256,7 @@ unsigned int CINFO3D_VISU::GetNrSegmentsCircle( float aDiameter3DU ) const
}
-unsigned int CINFO3D_VISU::GetNrSegmentsCircle( int aDiameterBIU ) const
+unsigned int EDA_3D_SETTINGS::GetNrSegmentsCircle( int aDiameterBIU ) const
{
wxASSERT( aDiameterBIU > 0 );
@@ -268,7 +265,7 @@ unsigned int CINFO3D_VISU::GetNrSegmentsCircle( int aDiameterBIU ) const
}
-double CINFO3D_VISU::GetCircleCorrectionFactor( int aNrSides ) const
+double EDA_3D_SETTINGS::GetCircleCorrectionFactor( int aNrSides ) const
{
wxASSERT( aNrSides >= 3 );
@@ -276,9 +273,9 @@ double CINFO3D_VISU::GetCircleCorrectionFactor( int aNrSides ) const
}
-void CINFO3D_VISU::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarningTextReporter )
+void EDA_3D_SETTINGS::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarningTextReporter )
{
- wxLogTrace( m_logTrace, wxT( "CINFO3D_VISU::InitSettings" ) );
+ wxLogTrace( m_logTrace, wxT( "EDA_3D_SETTINGS::InitSettings" ) );
// Calculates the board bounding box
// First, use only the board outlines
@@ -309,8 +306,7 @@ void CINFO3D_VISU::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarni
// Calculate the convertion to apply to all positions.
m_biuTo3Dunits = RANGE_SCALE_3D / std::max( m_boardSize.x, m_boardSize.y );
- m_epoxyThickness3DU = m_board->GetDesignSettings().GetBoardThickness() *
- m_biuTo3Dunits;
+ m_epoxyThickness3DU = m_board->GetDesignSettings().GetBoardThickness() * m_biuTo3Dunits;
// !TODO: use value defined by user (currently use default values by ctor
m_copperThickness3DU = COPPER_THICKNESS * m_biuTo3Dunits;
@@ -450,7 +446,7 @@ void CINFO3D_VISU::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarni
#ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_stopCreateLayersTime = GetRunningMicroSecs();
- printf( "CINFO3D_VISU::InitSettings times\n" );
+ printf( "EDA_3D_SETTINGS::InitSettings times\n" );
printf( " CreateBoardPoly: %.3f ms\n",
(float)( stats_stopCreateBoardPolyTime - stats_startCreateBoardPolyTime ) / 1e3 );
printf( " CreateLayers and holes: %.3f ms\n",
@@ -460,7 +456,7 @@ void CINFO3D_VISU::InitSettings( REPORTER* aStatusTextReporter, REPORTER* aWarni
}
-bool CINFO3D_VISU::createBoardPolygon()
+bool EDA_3D_SETTINGS::createBoardPolygon()
{
m_board_poly.RemoveAllContours();
@@ -470,7 +466,7 @@ bool CINFO3D_VISU::createBoardPolygon()
}
-float CINFO3D_VISU::GetModulesZcoord3DIU( bool aIsFlipped ) const
+float EDA_3D_SETTINGS::GetModulesZcoord3DIU( bool aIsFlipped ) const
{
if( aIsFlipped )
{
@@ -489,23 +485,7 @@ float CINFO3D_VISU::GetModulesZcoord3DIU( bool aIsFlipped ) const
}
-void CINFO3D_VISU::CameraSetType( CAMERA_TYPE aCameraType )
-{
- switch( aCameraType )
- {
- case CAMERA_TYPE::TRACKBALL:
- m_currentCamera = m_trackBallCamera;
- break;
-
- default:
- wxLogMessage( wxT( "CINFO3D_VISU::CameraSetType() error: unknown camera type %d" ),
- (int)aCameraType );
- break;
- }
-}
-
-
-SFVEC3F CINFO3D_VISU::GetLayerColor( PCB_LAYER_ID aLayerId ) const
+SFVEC3F EDA_3D_SETTINGS::GetLayerColor( PCB_LAYER_ID aLayerId ) const
{
wxASSERT( aLayerId < PCB_LAYER_ID_COUNT );
@@ -515,13 +495,13 @@ SFVEC3F CINFO3D_VISU::GetLayerColor( PCB_LAYER_ID aLayerId ) const
}
-SFVEC3F CINFO3D_VISU::GetItemColor( int aItemId ) const
+SFVEC3F EDA_3D_SETTINGS::GetItemColor( int aItemId ) const
{
return GetColor( m_colors->GetColor( aItemId ) );
}
-SFVEC3F CINFO3D_VISU::GetColor( COLOR4D aColor ) const
+SFVEC3F EDA_3D_SETTINGS::GetColor( COLOR4D aColor ) const
{
return SFVEC3F( aColor.r, aColor.g, aColor.b );
}
diff --git a/3d-viewer/3d_canvas/cinfo3d_visu.h b/3d-viewer/3d_canvas/3d_settings.h
similarity index 96%
rename from 3d-viewer/3d_canvas/cinfo3d_visu.h
rename to 3d-viewer/3d_canvas/3d_settings.h
index b43504ea66..a5601f412b 100644
--- a/3d-viewer/3d_canvas/cinfo3d_visu.h
+++ b/3d-viewer/3d_canvas/3d_settings.h
@@ -22,13 +22,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-/**
- * @file cinfo3d_visu.h
- * @brief Handles data related with the board to be visualized
- */
-
-#ifndef CINFO3D_VISU_H
-#define CINFO3D_VISU_H
+#ifndef EDA_3D_SETTINGS_H
+#define EDA_3D_SETTINGS_H
#include
#include "../3d_rendering/3d_render_raytracing/accelerators/ccontainer2d.h"
@@ -67,16 +62,16 @@ typedef std::map< PCB_LAYER_ID, SHAPE_POLY_SET *> MAP_POLY;
/**
- * Class CINFO3D_VISU
+ * Class EDA_3D_SETTINGS
* Helper class to handle information needed to display 3D board
*/
-class CINFO3D_VISU
+class EDA_3D_SETTINGS
{
public:
- CINFO3D_VISU();
+ EDA_3D_SETTINGS();
- ~CINFO3D_VISU();
+ ~EDA_3D_SETTINGS();
/**
* @brief Set3DCacheManager - Update the Cache manager pointer
@@ -203,12 +198,6 @@ class CINFO3D_VISU
*/
float GetModulesZcoord3DIU( bool aIsFlipped ) const ;
- /**
- * @brief CameraSetType - Set the camera type to use
- * @param aCameraType: camera type to use in this canvas
- */
- void CameraSetType( CAMERA_TYPE aCameraType );
-
/**
* @brief CameraGet - get current camera in use
* @return a camera
@@ -283,14 +272,20 @@ class CINFO3D_VISU
* @param aLayerId: layer id
* @return position in 3D unities
*/
- float GetLayerTopZpos3DU( PCB_LAYER_ID aLayerId ) const { return m_layerZcoordTop[aLayerId]; }
+ float GetLayerTopZpos3DU( PCB_LAYER_ID aLayerId ) const
+ {
+ return m_layerZcoordTop[aLayerId];
+ }
/**
* @brief GetLayerBottomZpos3DU - Get the bottom z position
* @param aLayerId: layer id
* @return position in 3D unities
*/
- float GetLayerBottomZpos3DU( PCB_LAYER_ID aLayerId ) const { return m_layerZcoordBottom[aLayerId]; }
+ float GetLayerBottomZpos3DU( PCB_LAYER_ID aLayerId ) const
+ {
+ return m_layerZcoordBottom[aLayerId];
+ }
/**
* @brief GetMapLayers - Get the map of container that have the objects per layer
@@ -320,8 +315,10 @@ class CINFO3D_VISU
* @brief GetThroughHole_Outer_poly_NPTH -
* @return
*/
- const SHAPE_POLY_SET &GetThroughHole_Outer_poly_NPTH() const {
- return m_through_outer_holes_poly_NPTH; }
+ const SHAPE_POLY_SET &GetThroughHole_Outer_poly_NPTH() const
+ {
+ return m_through_outer_holes_poly_NPTH;
+ }
/**
* @brief GetThroughHole_Vias_Outer -
@@ -337,17 +334,19 @@ class CINFO3D_VISU
/**
* @brief GetThroughHole_Vias_Outer_poly -
- * @return
*/
- const SHAPE_POLY_SET &GetThroughHole_Vias_Outer_poly() const {
- return m_through_outer_holes_vias_poly; }
+ const SHAPE_POLY_SET &GetThroughHole_Vias_Outer_poly() const
+ {
+ return m_through_outer_holes_vias_poly;
+ }
/**
* @brief GetThroughHole_Vias_Inner_poly -
- * @return
*/
- const SHAPE_POLY_SET &GetThroughHole_Vias_Inner_poly() const {
- return m_through_inner_holes_vias_poly; }
+ const SHAPE_POLY_SET &GetThroughHole_Vias_Inner_poly() const
+ {
+ return m_through_inner_holes_vias_poly;
+ }
/**
* @brief GetThroughHole_Inner - Get the ThroughHole container
@@ -680,7 +679,15 @@ private:
};
-/// This is a dummy visualization configuration
-extern CINFO3D_VISU G_null_CINFO3D_VISU;
-#endif // CINFO3D_VISU_H
+/// This is a dummy visualization configuration
+extern EDA_3D_SETTINGS G_null_EDA_3D_SETTINGS;
+
+
+class EDA_3D_SETTINGS_HOLDER
+{
+public:
+ virtual EDA_3D_SETTINGS* GetSettings() = 0;
+};
+
+#endif // EDA_3D_SETTINGS_H
diff --git a/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp b/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp
index a47e59876e..23f837e589 100644
--- a/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp
+++ b/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp
@@ -30,7 +30,7 @@
* board_items_to_polygon_shape_transform.cpp
*/
-#include "cinfo3d_visu.h"
+#include "3d_settings.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cring2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cfilledcircle2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/croundsegment2d.h"
@@ -87,10 +87,10 @@ void addTextSegmToContainer( int x0, int y0, int xf, int yf, void* aData )
// Based on
// void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet
// board_items_to_polygon_shape_transform.cpp
-void CINFO3D_VISU::AddShapeWithClearanceToContainer( const TEXTE_PCB* aText,
- CGENERICCONTAINER2D *aDstContainer,
- PCB_LAYER_ID aLayerId,
- int aClearanceValue )
+void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const TEXTE_PCB* aText,
+ CGENERICCONTAINER2D *aDstContainer,
+ PCB_LAYER_ID aLayerId,
+ int aClearanceValue )
{
wxSize size = aText->GetTextSize();
@@ -131,10 +131,10 @@ void CINFO3D_VISU::AddShapeWithClearanceToContainer( const TEXTE_PCB* aText,
}
-void CINFO3D_VISU::AddShapeWithClearanceToContainer( const DIMENSION* aDimension,
- CGENERICCONTAINER2D *aDstContainer,
- PCB_LAYER_ID aLayerId,
- int aClearanceValue )
+void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const DIMENSION* aDimension,
+ CGENERICCONTAINER2D *aDstContainer,
+ PCB_LAYER_ID aLayerId,
+ int aClearanceValue )
{
AddShapeWithClearanceToContainer(&aDimension->Text(), aDstContainer, aLayerId, aClearanceValue);
@@ -168,10 +168,10 @@ void CINFO3D_VISU::AddShapeWithClearanceToContainer( const DIMENSION* aDimension
// Based on
// void MODULE::TransformGraphicShapesWithClearanceToPolygonSet
// board_items_to_polygon_shape_transform.cpp#L204
-void CINFO3D_VISU::AddGraphicsShapesWithClearanceToContainer( const MODULE* aModule,
- CGENERICCONTAINER2D *aDstContainer,
- PCB_LAYER_ID aLayerId,
- int aInflateValue )
+void EDA_3D_SETTINGS::AddGraphicsShapesWithClearanceToContainer( const MODULE* aModule,
+ CGENERICCONTAINER2D *aDstContainer,
+ PCB_LAYER_ID aLayerId,
+ int aInflateValue )
{
std::vector texts; // List of TEXTE_MODULE to convert
EDGE_MODULE* outline;
@@ -234,8 +234,8 @@ void CINFO3D_VISU::AddGraphicsShapesWithClearanceToContainer( const MODULE* aMod
}
-COBJECT2D *CINFO3D_VISU::createNewTrack( const TRACK* aTrack,
- int aClearanceValue ) const
+COBJECT2D *EDA_3D_SETTINGS::createNewTrack( const TRACK* aTrack,
+ int aClearanceValue ) const
{
SFVEC2F start3DU( aTrack->GetStart().x * m_biuTo3Dunits,
-aTrack->GetStart().y * m_biuTo3Dunits ); // y coord is inverted
@@ -281,9 +281,9 @@ COBJECT2D *CINFO3D_VISU::createNewTrack( const TRACK* aTrack,
// Based on:
// void D_PAD:: TransformShapeWithClearanceToPolygon(
// board_items_to_polygon_shape_transform.cpp
-void CINFO3D_VISU::createNewPadWithClearance( const D_PAD* aPad,
- CGENERICCONTAINER2D *aDstContainer,
- wxSize aClearanceValue ) const
+void EDA_3D_SETTINGS::createNewPadWithClearance( const D_PAD* aPad,
+ CGENERICCONTAINER2D *aDstContainer,
+ wxSize aClearanceValue ) const
{
// note: for most of shapes, aClearanceValue.x = aClearanceValue.y
// only rectangular and oval shapes can have different values
@@ -295,7 +295,7 @@ void CINFO3D_VISU::createNewPadWithClearance( const D_PAD* aPad,
if( !dx || !dy )
{
wxLogTrace( m_logTrace,
- wxT( "CINFO3D_VISU::createNewPadWithClearance - found an invalid pad" ) );
+ wxT( "EDA_3D_SETTINGS::createNewPadWithClearance - found an invalid pad" ) );
return;
}
@@ -517,13 +517,13 @@ void CINFO3D_VISU::createNewPadWithClearance( const D_PAD* aPad,
// Based on:
// BuildPadDrillShapePolygon
// board_items_to_polygon_shape_transform.cpp
-COBJECT2D *CINFO3D_VISU::createNewPadDrill( const D_PAD* aPad, int aInflateValue )
+COBJECT2D *EDA_3D_SETTINGS::createNewPadDrill( const D_PAD* aPad, int aInflateValue )
{
wxSize drillSize = aPad->GetDrillSize();
if( !drillSize.x || !drillSize.y )
{
- wxLogTrace( m_logTrace, wxT( "CINFO3D_VISU::createNewPadDrill - found an invalid pad" ) );
+ wxLogTrace( m_logTrace, wxT( "EDA_3D_SETTINGS::createNewPadDrill - found an invalid pad" ) );
return NULL;
}
@@ -568,11 +568,11 @@ COBJECT2D *CINFO3D_VISU::createNewPadDrill( const D_PAD* aPad, int aInflateValue
}
-void CINFO3D_VISU::AddPadsShapesWithClearanceToContainer( const MODULE* aModule,
- CGENERICCONTAINER2D *aDstContainer,
- PCB_LAYER_ID aLayerId,
- int aInflateValue,
- bool aSkipNPTHPadsWihNoCopper )
+void EDA_3D_SETTINGS::AddPadsShapesWithClearanceToContainer( const MODULE* aModule,
+ CGENERICCONTAINER2D *aDstContainer,
+ PCB_LAYER_ID aLayerId,
+ int aInflateValue,
+ bool aSkipNPTHPadsWihNoCopper )
{
wxSize margin;
@@ -631,13 +631,13 @@ void CINFO3D_VISU::AddPadsShapesWithClearanceToContainer( const MODULE* aModule,
// based on TransformArcToPolygon function from
// common/convert_basic_shapes_to_polygon.cpp
-void CINFO3D_VISU::TransformArcToSegments( const wxPoint &aCentre,
- const wxPoint &aStart,
- double aArcAngle,
- int aCircleToSegmentsCount,
- int aWidth,
- CGENERICCONTAINER2D *aDstContainer,
- const BOARD_ITEM &aBoardItem )
+void EDA_3D_SETTINGS::TransformArcToSegments( const wxPoint &aCentre,
+ const wxPoint &aStart,
+ double aArcAngle,
+ int aCircleToSegmentsCount,
+ int aWidth,
+ CGENERICCONTAINER2D *aDstContainer,
+ const BOARD_ITEM &aBoardItem )
{
wxPoint arc_start, arc_end;
int delta = 3600 / aCircleToSegmentsCount; // rotate angle in 0.1 degree
@@ -708,10 +708,10 @@ void CINFO3D_VISU::TransformArcToSegments( const wxPoint &aCentre,
// Based on
// TransformShapeWithClearanceToPolygon
// board_items_to_polygon_shape_transform.cpp#L431
-void CINFO3D_VISU::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSegment,
- CGENERICCONTAINER2D *aDstContainer,
- PCB_LAYER_ID aLayerId,
- int aClearanceValue )
+void EDA_3D_SETTINGS::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSegment,
+ CGENERICCONTAINER2D *aDstContainer,
+ PCB_LAYER_ID aLayerId,
+ int aClearanceValue )
{
// The full width of the lines to create
// The extra 1 protects the inner/outer radius values from degeneracy
@@ -799,9 +799,9 @@ void CINFO3D_VISU::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSeg
// Based on
// TransformSolidAreasShapesToPolygonSet
// board_items_to_polygon_shape_transform.cpp
-void CINFO3D_VISU::AddSolidAreasShapesToContainer( const ZONE_CONTAINER* aZoneContainer,
- CGENERICCONTAINER2D *aDstContainer,
- PCB_LAYER_ID aLayerId )
+void EDA_3D_SETTINGS::AddSolidAreasShapesToContainer( const ZONE_CONTAINER* aZoneContainer,
+ CGENERICCONTAINER2D *aDstContainer,
+ PCB_LAYER_ID aLayerId )
{
// Copy the polys list because we have to simplify it
SHAPE_POLY_SET polyList = SHAPE_POLY_SET( aZoneContainer->GetFilledPolysList(), true );
@@ -880,9 +880,9 @@ void CINFO3D_VISU::AddSolidAreasShapesToContainer( const ZONE_CONTAINER* aZoneCo
-void CINFO3D_VISU::buildPadShapeThickOutlineAsSegments( const D_PAD* aPad,
- CGENERICCONTAINER2D *aDstContainer,
- int aWidth )
+void EDA_3D_SETTINGS::buildPadShapeThickOutlineAsSegments( const D_PAD* aPad,
+ CGENERICCONTAINER2D *aDstContainer,
+ int aWidth )
{
if( aPad->GetShape() == PAD_SHAPE_CIRCLE ) // Draw a ring
{
diff --git a/3d-viewer/3d_canvas/create_layer_items.cpp b/3d-viewer/3d_canvas/create_layer_items.cpp
index 4ed2cd6442..fa4dd59d9a 100644
--- a/3d-viewer/3d_canvas/create_layer_items.cpp
+++ b/3d-viewer/3d_canvas/create_layer_items.cpp
@@ -30,7 +30,7 @@
* board_items_to_polygon_shape_transform.cpp
*/
-#include "cinfo3d_visu.h"
+#include "3d_settings.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cring2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/cfilledcircle2d.h"
#include "../3d_rendering/3d_render_raytracing/shapes2D/croundsegment2d.h"
@@ -58,69 +58,44 @@
#include
-void CINFO3D_VISU::destroyLayers()
+void EDA_3D_SETTINGS::destroyLayers()
{
if( !m_layers_poly.empty() )
{
- for( MAP_POLY::iterator ii = m_layers_poly.begin();
- ii != m_layers_poly.end();
- ++ii )
- {
- delete ii->second;
- ii->second = NULL;
- }
+ for( auto& poly : m_layers_poly )
+ delete poly.second;
m_layers_poly.clear();
}
if( !m_layers_inner_holes_poly.empty() )
{
- for( MAP_POLY::iterator ii = m_layers_inner_holes_poly.begin();
- ii != m_layers_inner_holes_poly.end();
- ++ii )
- {
- delete ii->second;
- ii->second = NULL;
- }
+ for( auto& poly : m_layers_inner_holes_poly )
+ delete poly.second;
m_layers_inner_holes_poly.clear();
}
if( !m_layers_outer_holes_poly.empty() )
{
- for( MAP_POLY::iterator ii = m_layers_outer_holes_poly.begin();
- ii != m_layers_outer_holes_poly.end();
- ++ii )
- {
- delete ii->second;
- ii->second = NULL;
- }
+ for( auto& poly : m_layers_outer_holes_poly )
+ delete poly.second;
m_layers_outer_holes_poly.clear();
}
if( !m_layers_container2D.empty() )
{
- for( MAP_CONTAINER_2D::iterator ii = m_layers_container2D.begin();
- ii != m_layers_container2D.end();
- ++ii )
- {
- delete ii->second;
- ii->second = NULL;
- }
+ for( auto& poly : m_layers_container2D )
+ delete poly.second;
m_layers_container2D.clear();
}
if( !m_layers_holes2D.empty() )
{
- for( MAP_CONTAINER_2D::iterator ii = m_layers_holes2D.begin();
- ii != m_layers_holes2D.end();
- ++ii )
- {
- delete ii->second;
- ii->second = NULL;
- }
+ for( auto& poly : m_layers_holes2D )
+ delete poly.second;
m_layers_holes2D.clear();
}
@@ -138,7 +113,7 @@ void CINFO3D_VISU::destroyLayers()
}
-void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
+void EDA_3D_SETTINGS::createLayers( REPORTER *aStatusTextReporter )
{
destroyLayers();
@@ -146,14 +121,14 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Based on: https://github.com/KiCad/kicad-source-mirror/blob/master/3d-viewer/3d_draw.cpp#L692
// /////////////////////////////////////////////////////////////////////////
- #ifdef PRINT_STATISTICS_3D_VIEWER
+#ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_startCopperLayersTime = GetRunningMicroSecs();
unsigned start_Time = stats_startCopperLayersTime;
#endif
PCB_LAYER_ID cu_seq[MAX_CU_LAYERS];
- LSET cu_set = LSET::AllCuMask( m_copperLayersCount );
+ LSET cu_set = LSET::AllCuMask( m_copperLayersCount );
m_stats_nr_tracks = 0;
m_stats_track_med_width = 0;
@@ -168,7 +143,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
trackList.clear();
trackList.reserve( m_board->Tracks().size() );
- for( auto track : m_board->Tracks() )
+ for( TRACK* track : m_board->Tracks() )
{
if( !Is3DLayerEnabled( track->GetLayer() ) ) // Skip non enabled layers
continue;
@@ -241,10 +216,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Create tracks as objects and add it to container
// /////////////////////////////////////////////////////////////////////////
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
wxASSERT( m_layers_container2D.find( curr_layer_id ) != m_layers_container2D.end() );
CBVHCONTAINER2D *layerContainer = m_layers_container2D[curr_layer_id];
@@ -272,10 +245,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Create VIAS and THTs objects and add it to holes containers
// /////////////////////////////////////////////////////////////////////////
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
// ADD TRACKS
unsigned int nTracks = trackList.size();
@@ -324,7 +295,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
hole_inner_radius + thickness,
*track ) );
}
- else if( lIdx == 0 ) // it only adds once the THT holes
+ else if( curr_layer_id == layer_id[0] ) // it only adds once the THT holes
{
// Add through hole object
// /////////////////////////////////////////////////////////
@@ -356,10 +327,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Create VIAS and THTs objects and add it to holes containers
// /////////////////////////////////////////////////////////////////////////
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
// ADD TRACKS
const unsigned int nTracks = trackList.size();
@@ -420,7 +389,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
TransformCircleToPolygon( *layerInnerHolesPoly, via->GetStart(),
holediameter / 2, ARC_HIGH_DEF );
}
- else if( lIdx == 0 ) // it only adds once the THT holes
+ else if( curr_layer_id == layer_id[0] ) // it only adds once the THT holes
{
const int holediameter = via->GetDrillValue();
const int hole_outer_radius = (holediameter / 2)+ GetCopperThicknessBIU();
@@ -457,10 +426,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS )
&& ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) )
{
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
wxASSERT( m_layers_poly.find( curr_layer_id ) != m_layers_poly.end() );
SHAPE_POLY_SET *layerPoly = m_layers_poly[curr_layer_id];
@@ -488,9 +455,9 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add holes of modules
// /////////////////////////////////////////////////////////////////////////
- for( auto module : m_board->Modules() )
+ for( MODULE* module : m_board->Modules() )
{
- for( auto pad : module->Pads() )
+ for( D_PAD* pad : module->Pads() )
{
const wxSize padHole = pad->GetDrillSize();
@@ -520,9 +487,9 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add contours of the pad holes (pads can be Circle or Segment holes)
// /////////////////////////////////////////////////////////////////////////
- for( auto module : m_board->Modules() )
+ for( MODULE* module : m_board->Modules() )
{
- for( auto pad : module->Pads() )
+ for( D_PAD* pad : module->Pads() )
{
const wxSize padHole = pad->GetDrillSize();
@@ -535,7 +502,6 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( pad->GetAttribute () != PAD_ATTRIB_HOLE_NOT_PLATED )
{
pad->BuildPadDrillShapePolygon( m_through_outer_holes_poly, inflate );
-
pad->BuildPadDrillShapePolygon( m_through_inner_holes_poly, 0 );
}
else
@@ -553,16 +519,14 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add modules PADs objects to containers
// /////////////////////////////////////////////////////////////////////////
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
wxASSERT( m_layers_container2D.find( curr_layer_id ) != m_layers_container2D.end() );
CBVHCONTAINER2D *layerContainer = m_layers_container2D[curr_layer_id];
// ADD PADS
- for( auto module : m_board->Modules() )
+ for( MODULE* module : m_board->Modules() )
{
// Note: NPTH pads are not drawn on copper layers when the pad
// has same shape as its hole
@@ -590,10 +554,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS )
&& ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) )
{
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
wxASSERT( m_layers_poly.find( curr_layer_id ) != m_layers_poly.end() );
SHAPE_POLY_SET *layerPoly = m_layers_poly[curr_layer_id];
@@ -613,8 +575,9 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
true );
// Micro-wave modules may have items on copper layers
- module->TransformGraphicTextWithClearanceToPolygonSet(
- curr_layer_id, *layerPoly, 0 );
+ module->TransformGraphicTextWithClearanceToPolygonSet( curr_layer_id,
+ *layerPoly,
+ 0 );
transformGraphicModuleEdgeToPolygonSet( module, curr_layer_id, *layerPoly );
}
@@ -628,10 +591,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add graphic item on copper layers to object containers
// /////////////////////////////////////////////////////////////////////////
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID curr_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
wxASSERT( m_layers_container2D.find( curr_layer_id ) != m_layers_container2D.end() );
CBVHCONTAINER2D *layerContainer = m_layers_container2D[curr_layer_id];
@@ -686,18 +647,16 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS )
&& ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) )
{
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID cur_layer_id : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
+ wxASSERT( m_layers_poly.find( cur_layer_id ) != m_layers_poly.end() );
- wxASSERT( m_layers_poly.find( curr_layer_id ) != m_layers_poly.end() );
-
- SHAPE_POLY_SET *layerPoly = m_layers_poly[curr_layer_id];
+ SHAPE_POLY_SET *layerPoly = m_layers_poly[cur_layer_id];
// ADD GRAPHIC ITEMS ON COPPER LAYERS (texts)
- for( auto item : m_board->Drawings() )
+ for( BOARD_ITEM* item : m_board->Drawings() )
{
- if( !item->IsOnLayer( curr_layer_id ) )
+ if( !item->IsOnLayer( cur_layer_id ) )
continue;
switch( item->Type() )
@@ -712,7 +671,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
default:
wxLogTrace( m_logTrace, wxT( "createLayers: item type: %d not implemented" ),
- item->Type() );
+ item->Type() );
break;
}
}
@@ -775,10 +734,8 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
&& ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) )
{
// ADD COPPER ZONES
- for( int ii = 0; ii < m_board->GetAreaCount(); ++ii )
+ for( ZONE_CONTAINER* zone : m_board->Zones() )
{
- const ZONE_CONTAINER* zone = m_board->GetArea( ii );
-
if( zone == nullptr )
break;
@@ -844,21 +801,17 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( aStatusTextReporter )
aStatusTextReporter->Report( _( "Simplify holes contours" ) );
- for( unsigned int lIdx = 0; lIdx < layer_id.size(); ++lIdx )
+ for( PCB_LAYER_ID layer : layer_id )
{
- const PCB_LAYER_ID curr_layer_id = layer_id[lIdx];
-
- if( m_layers_outer_holes_poly.find( curr_layer_id ) !=
- m_layers_outer_holes_poly.end() )
+ if( m_layers_outer_holes_poly.find( layer ) != m_layers_outer_holes_poly.end() )
{
// found
- SHAPE_POLY_SET *polyLayer = m_layers_outer_holes_poly[curr_layer_id];
+ SHAPE_POLY_SET *polyLayer = m_layers_outer_holes_poly[layer];
polyLayer->Simplify( SHAPE_POLY_SET::PM_FAST );
- wxASSERT( m_layers_inner_holes_poly.find( curr_layer_id ) !=
- m_layers_inner_holes_poly.end() );
+ wxASSERT( m_layers_inner_holes_poly.find( layer ) != m_layers_inner_holes_poly.end() );
- polyLayer = m_layers_inner_holes_poly[curr_layer_id];
+ polyLayer = m_layers_inner_holes_poly[layer];
polyLayer->Simplify( SHAPE_POLY_SET::PM_FAST );
}
}
@@ -919,7 +872,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
const PCB_LAYER_ID curr_layer_id = *seq;
if( !Is3DLayerEnabled( curr_layer_id ) )
- continue;
+ continue;
CBVHCONTAINER2D *layerContainer = new CBVHCONTAINER2D;
m_layers_container2D[curr_layer_id] = layerContainer;
@@ -929,7 +882,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add drawing objects
// /////////////////////////////////////////////////////////////////////
- for( auto item : m_board->Drawings() )
+ for( BOARD_ITEM* item : m_board->Drawings() )
{
if( !item->IsOnLayer( curr_layer_id ) )
continue;
@@ -965,7 +918,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add drawing contours
// /////////////////////////////////////////////////////////////////////
- for( auto item : m_board->Drawings() )
+ for( BOARD_ITEM* item : m_board->Drawings() )
{
if( !item->IsOnLayer( curr_layer_id ) )
continue;
@@ -988,13 +941,13 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add modules tech layers - objects
// /////////////////////////////////////////////////////////////////////
- for( auto module : m_board->Modules() )
+ for( MODULE* module : m_board->Modules() )
{
if( (curr_layer_id == F_SilkS) || (curr_layer_id == B_SilkS) )
{
int linewidth = g_DrawDefaultLineThickness;
- for( auto pad : module->Pads() )
+ for( D_PAD* pad : module->Pads() )
{
if( !pad->IsOnLayer( curr_layer_id ) )
continue;
@@ -1014,13 +967,13 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
// Add modules tech layers - contours
// /////////////////////////////////////////////////////////////////////
- for( auto module : m_board->Modules() )
+ for( MODULE* module : m_board->Modules() )
{
if( (curr_layer_id == F_SilkS) || (curr_layer_id == B_SilkS) )
{
const int linewidth = g_DrawDefaultLineThickness;
- for( auto pad : module->Pads() )
+ for( D_PAD* pad : module->Pads() )
{
if( !pad->IsOnLayer( curr_layer_id ) )
continue;
@@ -1053,9 +1006,7 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( !zone->IsOnLayer( curr_layer_id ) )
continue;
- AddSolidAreasShapesToContainer( zone,
- layerContainer,
- curr_layer_id );
+ AddSolidAreasShapesToContainer( zone, layerContainer, curr_layer_id );
}
for( int ii = 0; ii < m_board->GetAreaCount(); ++ii )
@@ -1093,26 +1044,22 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
if( !m_layers_holes2D.empty() )
{
- for( MAP_CONTAINER_2D::iterator ii = m_layers_holes2D.begin();
- ii != m_layers_holes2D.end();
- ++ii )
- {
- ((CBVHCONTAINER2D *)(ii->second))->BuildBVH();
- }
+ for( auto& hole : m_layers_holes2D)
+ hole.second->BuildBVH();
}
// We only need the Solder mask to initialize the BVH
// because..?
- if( (CBVHCONTAINER2D *)m_layers_container2D[B_Mask] )
- ((CBVHCONTAINER2D *)m_layers_container2D[B_Mask])->BuildBVH();
+ if( m_layers_container2D[B_Mask] )
+ m_layers_container2D[B_Mask]->BuildBVH();
- if( (CBVHCONTAINER2D *)m_layers_container2D[F_Mask] )
- ((CBVHCONTAINER2D *)m_layers_container2D[F_Mask])->BuildBVH();
+ if( m_layers_container2D[F_Mask] )
+ m_layers_container2D[F_Mask]->BuildBVH();
#ifdef PRINT_STATISTICS_3D_VIEWER
unsigned stats_endHolesBVHTime = GetRunningMicroSecs();
- printf( "CINFO3D_VISU::createLayers times\n" );
+ printf( "EDA_3D_SETTINGS::createLayers times\n" );
printf( " Copper Layers: %.3f ms\n",
(float)( stats_endCopperLayersTime - stats_startCopperLayersTime ) / 1e3 );
printf( " Holes BVH creation: %.3f ms\n",
diff --git a/3d-viewer/3d_canvas/create_layer_poly.cpp b/3d-viewer/3d_canvas/create_layer_poly.cpp
index 132a4eab82..3b19d8d5b5 100644
--- a/3d-viewer/3d_canvas/create_layer_poly.cpp
+++ b/3d-viewer/3d_canvas/create_layer_poly.cpp
@@ -30,7 +30,7 @@
* board_items_to_polygon_shape_transform.cpp
*/
-#include "cinfo3d_visu.h"
+#include "3d_settings.h"
#include
#include
#include
@@ -38,9 +38,9 @@
// This is the same function as in board_items_to_polygon_shape_transform.cpp
// but it adds the rect/trapezoid shapes with a different winding
-void CINFO3D_VISU::buildPadShapePolygon( const D_PAD* aPad,
- SHAPE_POLY_SET& aCornerBuffer,
- wxSize aInflateValue ) const
+void EDA_3D_SETTINGS::buildPadShapePolygon( const D_PAD* aPad,
+ SHAPE_POLY_SET& aCornerBuffer,
+ wxSize aInflateValue ) const
{
wxPoint corners[4];
wxPoint PadShapePos = aPad->ShapePos(); /* Note: for pad having a shape offset,
@@ -105,9 +105,9 @@ void CINFO3D_VISU::buildPadShapePolygon( const D_PAD* aPad,
}
-void CINFO3D_VISU::buildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
- SHAPE_POLY_SET& aCornerBuffer,
- int aWidth ) const
+void EDA_3D_SETTINGS::buildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
+ SHAPE_POLY_SET& aCornerBuffer,
+ int aWidth ) const
{
if( aPad->GetShape() == PAD_SHAPE_CIRCLE ) // Draw a ring
{
@@ -139,10 +139,10 @@ void CINFO3D_VISU::buildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
// Based on the same function name in board_items_to_polyshape_transform.cpp
// It was implemented here to allow dynamic segments count per pad shape
-void CINFO3D_VISU::transformPadsShapesWithClearanceToPolygon( const PADS& aPads, PCB_LAYER_ID aLayer,
- SHAPE_POLY_SET& aCornerBuffer,
- int aInflateValue,
- bool aSkipNPTHPadsWihNoCopper ) const
+void EDA_3D_SETTINGS::transformPadsShapesWithClearanceToPolygon( const PADS& aPads, PCB_LAYER_ID aLayer,
+ SHAPE_POLY_SET& aCornerBuffer,
+ int aInflateValue,
+ bool aSkipNPTHPadsWihNoCopper ) const
{
wxSize margin;
for( auto pad : aPads )
@@ -198,9 +198,9 @@ void CINFO3D_VISU::transformPadsShapesWithClearanceToPolygon( const PADS& aPads,
}
}
-void CINFO3D_VISU::transformGraphicModuleEdgeToPolygonSet( const MODULE *aModule,
- PCB_LAYER_ID aLayer,
- SHAPE_POLY_SET& aCornerBuffer ) const
+void EDA_3D_SETTINGS::transformGraphicModuleEdgeToPolygonSet( const MODULE *aModule,
+ PCB_LAYER_ID aLayer,
+ SHAPE_POLY_SET& aCornerBuffer ) const
{
for( auto item : aModule->GraphicalItems() )
{
diff --git a/3d-viewer/3d_canvas/eda_3d_canvas.cpp b/3d-viewer/3d_canvas/eda_3d_canvas.cpp
index 31a1e1db2f..396d8f4c45 100644
--- a/3d-viewer/3d_canvas/eda_3d_canvas.cpp
+++ b/3d-viewer/3d_canvas/eda_3d_canvas.cpp
@@ -85,7 +85,7 @@ END_EVENT_TABLE()
EDA_3D_CANVAS::EDA_3D_CANVAS( wxWindow *aParent, const int *aAttribList, BOARD *aBoard,
- CINFO3D_VISU &aSettings , S3D_CACHE *a3DCachePointer ) :
+ EDA_3D_SETTINGS &aSettings , S3D_CACHE *a3DCachePointer ) :
HIDPI_GL_CANVAS( aParent, wxID_ANY, aAttribList, wxDefaultPosition, wxDefaultSize,
wxFULL_REPAINT_ON_RESIZE ),
m_eventDispatcher( nullptr ),
@@ -153,10 +153,11 @@ EDA_3D_CANVAS::EDA_3D_CANVAS( wxWindow *aParent, const int *aAttribList, BOARD *
wxEVT_LEFT_UP, wxEVT_LEFT_DOWN, wxEVT_LEFT_DCLICK,
wxEVT_RIGHT_UP, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_DCLICK,
wxEVT_MIDDLE_UP, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_DCLICK,
- wxEVT_MOTION, wxEVT_MOUSEWHEEL, wxEVT_CHAR, wxEVT_CHAR_HOOK
+ wxEVT_MOTION, wxEVT_MOUSEWHEEL, wxEVT_CHAR, wxEVT_CHAR_HOOK,
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
- , wxEVT_MAGNIFY
+ wxEVT_MAGNIFY,
#endif
+ wxEVT_MENU_OPEN, wxEVT_MENU_CLOSE, wxEVT_MENU_HIGHLIGHT
};
for( wxEventType eventType : events )
diff --git a/3d-viewer/3d_canvas/eda_3d_canvas.h b/3d-viewer/3d_canvas/eda_3d_canvas.h
index 858e3c4318..b5ae7c57c1 100644
--- a/3d-viewer/3d_canvas/eda_3d_canvas.h
+++ b/3d-viewer/3d_canvas/eda_3d_canvas.h
@@ -26,7 +26,7 @@
#define EDA_3D_CANVAS_H
-#include "cinfo3d_visu.h"
+#include "3d_settings.h"
#include "3d_rendering/c3d_render_base.h"
#include "3d_cache/3d_cache.h"
#include
@@ -56,7 +56,7 @@ class EDA_3D_CANVAS : public HIDPI_GL_CANVAS
EDA_3D_CANVAS( wxWindow *aParent,
const int *aAttribList = 0,
BOARD *aBoard = NULL,
- CINFO3D_VISU &aSettings = G_null_CINFO3D_VISU,
+ EDA_3D_SETTINGS &aSettings = G_null_EDA_3D_SETTINGS,
S3D_CACHE *a3DCachePointer = NULL );
~EDA_3D_CANVAS();
@@ -212,7 +212,7 @@ private:
float m_camera_moving_speed; // 1.0f will be 1:1
unsigned m_strtime_camera_movement; // Ticktime of camera movement start
- CINFO3D_VISU& m_settings; // Pre-computed 3D information and visual
+ EDA_3D_SETTINGS& m_settings; // Pre-computed 3D information and visual
// settings to render the board
C3D_RENDER_BASE* m_3d_render;
C3D_RENDER_RAYTRACING* m_3d_render_raytracing;
diff --git a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
index 48a0b21b7b..1a844ad8c6 100644
--- a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
+++ b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
@@ -44,7 +44,7 @@
*/
#define UNITS3D_TO_UNITSPCB (IU_PER_MM)
-C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY( CINFO3D_VISU &aSettings ) :
+C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY( EDA_3D_SETTINGS &aSettings ) :
C3D_RENDER_BASE( aSettings )
{
wxLogTrace( m_logTrace, wxT( "C3D_RENDER_OGL_LEGACY::C3D_RENDER_OGL_LEGACY" ) );
diff --git a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.h b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.h
index 4ded536c0e..494ec1dac1 100644
--- a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.h
+++ b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.h
@@ -59,7 +59,7 @@ typedef std::map< wxString, C_OGL_3DMODEL * > MAP_3DMODEL;
class C3D_RENDER_OGL_LEGACY : public C3D_RENDER_BASE
{
public:
- explicit C3D_RENDER_OGL_LEGACY( CINFO3D_VISU &aSettings );
+ explicit C3D_RENDER_OGL_LEGACY( EDA_3D_SETTINGS &aSettings );
~C3D_RENDER_OGL_LEGACY();
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
index fdc57031a5..144231960d 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
@@ -46,7 +46,7 @@
// convertLinearToSRGB
//#include
-C3D_RENDER_RAYTRACING::C3D_RENDER_RAYTRACING( CINFO3D_VISU &aSettings ) :
+C3D_RENDER_RAYTRACING::C3D_RENDER_RAYTRACING( EDA_3D_SETTINGS &aSettings ) :
C3D_RENDER_BASE( aSettings ),
m_postshader_ssao( aSettings.CameraGet() )
{
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.h b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.h
index 70b2162534..bee7466a81 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.h
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.h
@@ -59,7 +59,7 @@ typedef enum
class C3D_RENDER_RAYTRACING : public C3D_RENDER_BASE
{
public:
- explicit C3D_RENDER_RAYTRACING( CINFO3D_VISU &aSettings );
+ explicit C3D_RENDER_RAYTRACING( EDA_3D_SETTINGS &aSettings );
~C3D_RENDER_RAYTRACING();
diff --git a/3d-viewer/3d_rendering/c3d_render_base.cpp b/3d-viewer/3d_rendering/c3d_render_base.cpp
index dc1f9edd21..0f885f5beb 100644
--- a/3d-viewer/3d_rendering/c3d_render_base.cpp
+++ b/3d-viewer/3d_rendering/c3d_render_base.cpp
@@ -40,7 +40,7 @@
const wxChar * C3D_RENDER_BASE::m_logTrace = wxT( "KI_TRACE_3D_RENDER" );
-C3D_RENDER_BASE::C3D_RENDER_BASE(CINFO3D_VISU &aSettings) :
+C3D_RENDER_BASE::C3D_RENDER_BASE( EDA_3D_SETTINGS &aSettings) :
m_settings( aSettings )
{
wxLogTrace( m_logTrace, wxT( "C3D_RENDER_BASE::C3D_RENDER_BASE" ) );
diff --git a/3d-viewer/3d_rendering/c3d_render_base.h b/3d-viewer/3d_rendering/c3d_render_base.h
index 99820a214a..57f1e0c87b 100644
--- a/3d-viewer/3d_rendering/c3d_render_base.h
+++ b/3d-viewer/3d_rendering/c3d_render_base.h
@@ -32,7 +32,7 @@
#include
-#include "../3d_canvas/cinfo3d_visu.h"
+#include "3d_canvas/3d_settings.h"
#include
#include
@@ -47,7 +47,7 @@ class C3D_RENDER_BASE
// Operations
public:
- explicit C3D_RENDER_BASE( CINFO3D_VISU &aSettings );
+ explicit C3D_RENDER_BASE( EDA_3D_SETTINGS &aSettings );
virtual ~C3D_RENDER_BASE() = 0;
@@ -107,7 +107,7 @@ protected:
std::unique_ptr CreateBusyIndicator() const;
/// settings refrence in use for this render
- CINFO3D_VISU &m_settings;
+ EDA_3D_SETTINGS &m_settings;
/// flag if the opengl specific for this render was already initialized
bool m_is_opengl_initialized;
diff --git a/3d-viewer/3d_viewer/dialogs/dialog_3D_view_option.cpp b/3d-viewer/3d_viewer/dialogs/dialog_3D_view_option.cpp
index 602bcb63bf..cb93be6ab3 100644
--- a/3d-viewer/3d_viewer/dialogs/dialog_3D_view_option.cpp
+++ b/3d-viewer/3d_viewer/dialogs/dialog_3D_view_option.cpp
@@ -24,7 +24,7 @@
#include "dialog_3D_view_option_base.h"
#include <3d_viewer/eda_3d_viewer.h>
-#include <3d_canvas/cinfo3d_visu.h>
+#include <3d_canvas/3d_settings.h>
#include
class DIALOG_3D_VIEW_OPTIONS : public DIALOG_3D_VIEW_OPTIONS_BASE
@@ -33,8 +33,8 @@ public:
explicit DIALOG_3D_VIEW_OPTIONS( EDA_3D_VIEWER* parent );
private:
- EDA_3D_VIEWER* m_parent;
- CINFO3D_VISU& m_3Dprms;
+ EDA_3D_VIEWER* m_parent;
+ EDA_3D_SETTINGS& m_settings;
void initDialog();
@@ -58,7 +58,7 @@ void EDA_3D_VIEWER::Install3DViewOptionDialog( wxCommandEvent& event )
DIALOG_3D_VIEW_OPTIONS::DIALOG_3D_VIEW_OPTIONS( EDA_3D_VIEWER* parent )
- :DIALOG_3D_VIEW_OPTIONS_BASE( parent ), m_3Dprms( parent->GetSettings() )
+ : DIALOG_3D_VIEW_OPTIONS_BASE( parent ), m_settings( *parent->GetSettings() )
{
m_parent = parent;
@@ -94,23 +94,23 @@ void DIALOG_3D_VIEW_OPTIONS::initDialog()
bool DIALOG_3D_VIEW_OPTIONS::TransferDataToWindow()
{
// Check/uncheck checkboxes
- m_checkBoxRealisticMode->SetValue( m_3Dprms.GetFlag( FL_USE_REALISTIC_MODE ) );
- m_checkBoxBoardBody->SetValue( m_3Dprms.GetFlag( FL_SHOW_BOARD_BODY ) );
- m_checkBoxCuThickness->SetValue( m_3Dprms.GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS ) );
- m_checkBoxAreas->SetValue( m_3Dprms.GetFlag( FL_ZONE ) );
- m_checkBoxBoundingBoxes->SetValue( m_3Dprms.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) );
+ m_checkBoxRealisticMode->SetValue( m_settings.GetFlag( FL_USE_REALISTIC_MODE ) );
+ m_checkBoxBoardBody->SetValue( m_settings.GetFlag( FL_SHOW_BOARD_BODY ) );
+ m_checkBoxCuThickness->SetValue( m_settings.GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS ) );
+ m_checkBoxAreas->SetValue( m_settings.GetFlag( FL_ZONE ) );
+ m_checkBoxBoundingBoxes->SetValue( m_settings.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) );
- m_checkBox3DshapesTH->SetValue( m_3Dprms.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL ) );
- m_checkBox3DshapesSMD->SetValue( m_3Dprms.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT ) );
- m_checkBox3DshapesVirtual->SetValue( m_3Dprms.GetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL ) );
+ m_checkBox3DshapesTH->SetValue( m_settings.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL ) );
+ m_checkBox3DshapesSMD->SetValue( m_settings.GetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT ) );
+ m_checkBox3DshapesVirtual->SetValue( m_settings.GetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL ) );
- m_checkBoxSilkscreen->SetValue( m_3Dprms.GetFlag( FL_SILKSCREEN ) );
- m_checkBoxSolderMask->SetValue( m_3Dprms.GetFlag( FL_SOLDERMASK ) );
- m_checkBoxSolderpaste->SetValue( m_3Dprms.GetFlag( FL_SOLDERPASTE ) );
- m_checkBoxAdhesive->SetValue( m_3Dprms.GetFlag( FL_ADHESIVE ) );
- m_checkBoxComments->SetValue( m_3Dprms.GetFlag( FL_COMMENTS ) );
- m_checkBoxECO->SetValue( m_3Dprms.GetFlag( FL_ECO ) );
- m_checkBoxSubtractMaskFromSilk->SetValue( m_3Dprms.GetFlag( FL_SUBTRACT_MASK_FROM_SILK ) );
+ m_checkBoxSilkscreen->SetValue( m_settings.GetFlag( FL_SILKSCREEN ) );
+ m_checkBoxSolderMask->SetValue( m_settings.GetFlag( FL_SOLDERMASK ) );
+ m_checkBoxSolderpaste->SetValue( m_settings.GetFlag( FL_SOLDERPASTE ) );
+ m_checkBoxAdhesive->SetValue( m_settings.GetFlag( FL_ADHESIVE ) );
+ m_checkBoxComments->SetValue( m_settings.GetFlag( FL_COMMENTS ) );
+ m_checkBoxECO->SetValue( m_settings.GetFlag( FL_ECO ) );
+ m_checkBoxSubtractMaskFromSilk->SetValue( m_settings.GetFlag( FL_SUBTRACT_MASK_FROM_SILK ) );
return true;
}
@@ -119,27 +119,27 @@ bool DIALOG_3D_VIEW_OPTIONS::TransferDataToWindow()
bool DIALOG_3D_VIEW_OPTIONS::TransferDataFromWindow()
{
// Set render mode
- m_3Dprms.SetFlag( FL_USE_REALISTIC_MODE, m_checkBoxRealisticMode->GetValue() );
+ m_settings.SetFlag( FL_USE_REALISTIC_MODE, m_checkBoxRealisticMode->GetValue() );
// Set visibility of items
- m_3Dprms.SetFlag( FL_SHOW_BOARD_BODY, m_checkBoxBoardBody->GetValue() );
- m_3Dprms.SetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS, m_checkBoxCuThickness->GetValue() );
- m_3Dprms.SetFlag( FL_ZONE, m_checkBoxAreas->GetValue() );
- m_3Dprms.SetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX, m_checkBoxBoundingBoxes->GetValue() );
- m_3Dprms.SetFlag( FL_SUBTRACT_MASK_FROM_SILK, m_checkBoxSubtractMaskFromSilk->GetValue() );
+ m_settings.SetFlag( FL_SHOW_BOARD_BODY, m_checkBoxBoardBody->GetValue() );
+ m_settings.SetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS, m_checkBoxCuThickness->GetValue() );
+ m_settings.SetFlag( FL_ZONE, m_checkBoxAreas->GetValue() );
+ m_settings.SetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX, m_checkBoxBoundingBoxes->GetValue() );
+ m_settings.SetFlag( FL_SUBTRACT_MASK_FROM_SILK, m_checkBoxSubtractMaskFromSilk->GetValue() );
// Set 3D shapes visibility
- m_3Dprms.SetFlag( FL_MODULE_ATTRIBUTES_NORMAL, m_checkBox3DshapesTH->GetValue() );
- m_3Dprms.SetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT, m_checkBox3DshapesSMD->GetValue() );
- m_3Dprms.SetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL, m_checkBox3DshapesVirtual->GetValue() );
+ m_settings.SetFlag( FL_MODULE_ATTRIBUTES_NORMAL, m_checkBox3DshapesTH->GetValue() );
+ m_settings.SetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT, m_checkBox3DshapesSMD->GetValue() );
+ m_settings.SetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL, m_checkBox3DshapesVirtual->GetValue() );
// Set Layer visibility
- m_3Dprms.SetFlag( FL_SILKSCREEN, m_checkBoxSilkscreen->GetValue() );
- m_3Dprms.SetFlag( FL_SOLDERMASK, m_checkBoxSolderMask->GetValue() );
- m_3Dprms.SetFlag( FL_SOLDERPASTE, m_checkBoxSolderpaste->GetValue() );
- m_3Dprms.SetFlag( FL_ADHESIVE, m_checkBoxAdhesive->GetValue() );
- m_3Dprms.SetFlag( FL_COMMENTS, m_checkBoxComments->GetValue() );
- m_3Dprms.SetFlag( FL_ECO, m_checkBoxECO->GetValue( ) );
+ m_settings.SetFlag( FL_SILKSCREEN, m_checkBoxSilkscreen->GetValue() );
+ m_settings.SetFlag( FL_SOLDERMASK, m_checkBoxSolderMask->GetValue() );
+ m_settings.SetFlag( FL_SOLDERPASTE, m_checkBoxSolderpaste->GetValue() );
+ m_settings.SetFlag( FL_ADHESIVE, m_checkBoxAdhesive->GetValue() );
+ m_settings.SetFlag( FL_COMMENTS, m_checkBoxComments->GetValue() );
+ m_settings.SetFlag( FL_ECO, m_checkBoxECO->GetValue( ) );
return true;
}
diff --git a/3d-viewer/3d_viewer/eda_3d_viewer.cpp b/3d-viewer/3d_viewer/eda_3d_viewer.cpp
index a608968f6a..d8770e4147 100644
--- a/3d-viewer/3d_viewer/eda_3d_viewer.cpp
+++ b/3d-viewer/3d_viewer/eda_3d_viewer.cpp
@@ -33,13 +33,12 @@
#include <3d_viewer_id.h>
#include "../common_ogl/cogl_att_list.h"
#include <3d_viewer/tools/3d_actions.h>
-#include <3d_viewer/tools/3d_viewer_control.h>
+#include <3d_viewer/tools/3d_controller.h>
#include
#include
#include
#include
#include
-#include
#include
#include
#include
@@ -131,7 +130,7 @@ EDA_3D_VIEWER::EDA_3D_VIEWER( KIWAY *aKiway, PCB_BASE_FRAME *aParent, const wxSt
// Register tools
m_toolManager->RegisterTool( new COMMON_CONTROL );
- m_toolManager->RegisterTool( new EDA_3D_VIEWER_CONTROL );
+ m_toolManager->RegisterTool( new EDA_3D_CONTROLLER );
m_toolManager->InitTools();
// Run the viewer control tool, it is supposed to be always active
@@ -218,8 +217,7 @@ void EDA_3D_VIEWER::Process_Special_Functions( wxCommandEvent &event )
int id = event.GetId();
bool isChecked = event.IsChecked();
- wxLogTrace( m_logTrace,
- "EDA_3D_VIEWER::Process_Special_Functions id %d isChecked %d",
+ wxLogTrace( m_logTrace, "EDA_3D_VIEWER::Process_Special_Functions id %d isChecked %d",
id, isChecked );
if( m_canvas == NULL )
@@ -332,9 +330,7 @@ void EDA_3D_VIEWER::OnRenderEngineSelection( wxCommandEvent &event )
"OpenGL Legacy" );
if( old_engine != m_settings.RenderEngineGet() )
- {
RenderEngineChanged();
- }
}
@@ -433,25 +429,16 @@ void EDA_3D_VIEWER::LoadSettings( APP_SETTINGS_BASE *aCfg )
m_settings.SetFlag( FL_AXIS, cfg->m_Render.show_axis );
m_settings.SetFlag( FL_MODULE_ATTRIBUTES_NORMAL, cfg->m_Render.show_footprints_normal );
-
m_settings.SetFlag( FL_MODULE_ATTRIBUTES_NORMAL_INSERT, cfg->m_Render.show_footprints_insert );
-
m_settings.SetFlag( FL_MODULE_ATTRIBUTES_VIRTUAL, cfg->m_Render.show_footprints_virtual );
m_settings.SetFlag( FL_ZONE, cfg->m_Render.show_zones );
-
m_settings.SetFlag( FL_ADHESIVE, cfg->m_Render.show_adhesive );
-
m_settings.SetFlag( FL_SILKSCREEN, cfg->m_Render.show_silkscreen );
-
m_settings.SetFlag( FL_SOLDERMASK, cfg->m_Render.show_soldermask );
-
m_settings.SetFlag( FL_SOLDERPASTE, cfg->m_Render.show_solderpaste );
-
m_settings.SetFlag( FL_COMMENTS, cfg->m_Render.show_comments );
-
m_settings.SetFlag( FL_ECO, cfg->m_Render.show_eco );
-
m_settings.SetFlag( FL_SHOW_BOARD_BODY, cfg->m_Render.show_board_body );
m_settings.GridSet( static_cast( cfg->m_Render.grid_type ) );
diff --git a/3d-viewer/3d_viewer/eda_3d_viewer.h b/3d-viewer/3d_viewer/eda_3d_viewer.h
index 7b87cebb3e..6e0977cd27 100644
--- a/3d-viewer/3d_viewer/eda_3d_viewer.h
+++ b/3d-viewer/3d_viewer/eda_3d_viewer.h
@@ -4,7 +4,7 @@
* Copyright (C) 2015-2016 Mario Luzeiro
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2011 Wayne Stambaugh
- * Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -32,7 +32,7 @@
#ifndef EDA_3D_VIEWER_H
#define EDA_3D_VIEWER_H
-#include "../3d_canvas/cinfo3d_visu.h"
+#include "3d_canvas/3d_settings.h"
#include "../3d_canvas/eda_3d_canvas.h"
#include
#include
@@ -62,7 +62,7 @@ enum EDA_3D_VIEWER_STATUSBAR
/**
* Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard
*/
-class EDA_3D_VIEWER : public KIWAY_PLAYER
+class EDA_3D_VIEWER : public EDA_3D_SETTINGS_HOLDER, public KIWAY_PLAYER
{
public:
@@ -77,7 +77,7 @@ class EDA_3D_VIEWER : public KIWAY_PLAYER
BOARD* GetBoard() { return Parent()->GetBoard(); }
- EDA_3D_CANVAS* GetCanvas() { return m_canvas; }
+ wxWindow* GetToolCanvas() const override { return m_canvas; }
/**
* Request reloading the 3D view. However the request will be executed
@@ -104,7 +104,7 @@ class EDA_3D_VIEWER : public KIWAY_PLAYER
/**
* @return current settings
*/
- CINFO3D_VISU &GetSettings() { return m_settings; }
+ EDA_3D_SETTINGS* GetSettings() override { return &m_settings; }
/**
* Get a SFVEC3D from a wx colour dialog
@@ -209,7 +209,7 @@ private:
ACTION_TOOLBAR* m_mainToolBar;
EDA_3D_CANVAS* m_canvas;
- CINFO3D_VISU m_settings;
+ EDA_3D_SETTINGS m_settings;
TOOL_DISPATCHER* m_toolDispatcher;
diff --git a/3d-viewer/3d_viewer/tools/3d_controller.cpp b/3d-viewer/3d_viewer/tools/3d_controller.cpp
new file mode 100644
index 0000000000..29b5dd67fd
--- /dev/null
+++ b/3d-viewer/3d_viewer/tools/3d_controller.cpp
@@ -0,0 +1,327 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include <3d_viewer_id.h>
+#include
+#include "3d_actions.h"
+
+
+bool EDA_3D_CONTROLLER::Init()
+{
+ CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu();
+
+ ctxMenu.AddItem( ACTIONS::zoomIn, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( ACTIONS::zoomOut, SELECTION_CONDITIONS::ShowAlways );
+
+ ctxMenu.AddSeparator();
+ ctxMenu.AddItem( EDA_3D_ACTIONS::viewTop, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( EDA_3D_ACTIONS::viewBottom, SELECTION_CONDITIONS::ShowAlways );
+
+ ctxMenu.AddSeparator();
+ ctxMenu.AddItem( EDA_3D_ACTIONS::viewRight, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( EDA_3D_ACTIONS::viewLeft, SELECTION_CONDITIONS::ShowAlways );
+
+ ctxMenu.AddSeparator();
+ ctxMenu.AddItem( EDA_3D_ACTIONS::viewFront, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( EDA_3D_ACTIONS::viewBack, SELECTION_CONDITIONS::ShowAlways );
+
+ ctxMenu.AddSeparator();
+ ctxMenu.AddItem( EDA_3D_ACTIONS::moveLeft, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( EDA_3D_ACTIONS::moveRight, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( EDA_3D_ACTIONS::moveUp, SELECTION_CONDITIONS::ShowAlways );
+ ctxMenu.AddItem( EDA_3D_ACTIONS::moveDown, SELECTION_CONDITIONS::ShowAlways );
+
+ return true;
+}
+
+
+void EDA_3D_CONTROLLER::Reset( RESET_REASON aReason )
+{
+ TOOLS_HOLDER* holder = m_toolMgr->GetToolHolder();
+
+ m_canvas = dynamic_cast( holder->GetToolCanvas() );
+ m_settings = dynamic_cast( holder )->GetSettings();
+}
+
+
+int EDA_3D_CONTROLLER::UpdateMenu( const TOOL_EVENT& aEvent )
+{
+ ACTION_MENU* actionMenu = aEvent.Parameter();
+ CONDITIONAL_MENU* conditionalMenu = dynamic_cast( actionMenu );
+ SELECTION dummySel;
+
+ if( conditionalMenu )
+ conditionalMenu->Evaluate( dummySel );
+
+ if( actionMenu )
+ actionMenu->UpdateAll();
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::Main( const TOOL_EVENT& aEvent )
+{
+ // Main loop: keep receiving events
+ while( TOOL_EVENT* evt = Wait() )
+ {
+ if( evt->IsClick( BUT_RIGHT ) )
+ m_menu.ShowContextMenu();
+ else
+ evt->SetPassEvent();
+ }
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::ViewControl( const TOOL_EVENT& aEvent )
+{
+ m_canvas->SetView3D( aEvent.Parameter() );
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::PanControl( const TOOL_EVENT& aEvent )
+{
+ switch( aEvent.Parameter() )
+ {
+ case ACTIONS::CURSOR_UP: m_canvas->SetView3D( WXK_UP ); break;
+ case ACTIONS::CURSOR_DOWN: m_canvas->SetView3D( WXK_DOWN ); break;
+ case ACTIONS::CURSOR_LEFT: m_canvas->SetView3D( WXK_LEFT ); break;
+ case ACTIONS::CURSOR_RIGHT: m_canvas->SetView3D( WXK_RIGHT ); break;
+ default: wxFAIL; break;
+ }
+
+ return 0;
+}
+
+
+#define ROT_ANGLE 10.0
+
+int EDA_3D_CONTROLLER::RotateView( const TOOL_EVENT& aEvent )
+{
+ switch( aEvent.Parameter() )
+ {
+ case ID_ROTATE3D_X_NEG: m_settings->CameraGet().RotateX( -glm::radians( ROT_ANGLE ) ); break;
+ case ID_ROTATE3D_X_POS: m_settings->CameraGet().RotateX( glm::radians( ROT_ANGLE ) ); break;
+ case ID_ROTATE3D_Y_NEG: m_settings->CameraGet().RotateY( -glm::radians( ROT_ANGLE ) ); break;
+ case ID_ROTATE3D_Y_POS: m_settings->CameraGet().RotateY( glm::radians( ROT_ANGLE ) ); break;
+ case ID_ROTATE3D_Z_NEG: m_settings->CameraGet().RotateZ( -glm::radians( ROT_ANGLE ) ); break;
+ case ID_ROTATE3D_Z_POS: m_settings->CameraGet().RotateZ( glm::radians( ROT_ANGLE ) ); break;
+ default: wxFAIL; break;
+ }
+
+ if( m_settings->RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
+ m_canvas->Request_refresh();
+ else
+ m_canvas->RenderRaytracingRequest();
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::ToggleOrtho( const TOOL_EVENT& aEvent )
+{
+ m_settings->CameraGet().ToggleProjection();
+
+ if( m_settings->RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
+ m_canvas->Request_refresh();
+ else
+ m_canvas->RenderRaytracingRequest();
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::ToggleVisibility( const TOOL_EVENT& aEvent )
+{
+ DISPLAY3D_FLG flag = aEvent.Parameter();
+
+ m_settings->SetFlag( flag, !m_settings->GetFlag( flag ) );
+
+ switch( flag )
+ {
+ case FL_RENDER_OPENGL_SHOW_MODEL_BBOX:
+ case FL_RENDER_RAYTRACING_SHADOWS:
+ case FL_RENDER_RAYTRACING_REFRACTIONS:
+ case FL_RENDER_RAYTRACING_REFLECTIONS:
+ case FL_RENDER_RAYTRACING_ANTI_ALIASING:
+ case FL_AXIS:
+ m_canvas->Request_refresh();
+ break;
+
+ default:
+ {
+ EDA_3D_VIEWER* viewer = dynamic_cast( m_toolMgr->GetToolHolder() );
+
+ if( viewer )
+ viewer->NewDisplay( true );
+ else
+ m_canvas->Request_refresh();
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::On3DGridSelection( const TOOL_EVENT& aEvent )
+{
+ GRID3D_TYPE grid = aEvent.Parameter();
+ m_settings->GridSet( grid );
+
+ if( m_canvas )
+ m_canvas->Request_refresh();
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::ZoomRedraw( const TOOL_EVENT& aEvent )
+{
+ m_canvas->Request_refresh();
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::ZoomInOut( const TOOL_EVENT& aEvent )
+{
+ bool direction = aEvent.IsAction( &ACTIONS::zoomIn );
+ return doZoomInOut( direction, true );
+}
+
+
+int EDA_3D_CONTROLLER::ZoomInOutCenter( const TOOL_EVENT& aEvent )
+{
+ bool direction = aEvent.IsAction( &ACTIONS::zoomInCenter );
+ return doZoomInOut( direction, false );
+}
+
+
+int EDA_3D_CONTROLLER::doZoomInOut( bool aDirection, bool aCenterOnCursor )
+{
+ if( m_canvas )
+ {
+ m_canvas->SetView3D( aDirection ? WXK_F1 : WXK_F2 );
+ m_canvas->DisplayStatus();
+ }
+
+ return 0;
+}
+
+
+int EDA_3D_CONTROLLER::ZoomFitScreen( const TOOL_EVENT& aEvent )
+{
+ if( m_canvas )
+ {
+ m_canvas->SetView3D( WXK_HOME );
+ m_canvas->DisplayStatus();
+ }
+
+ return 0;
+}
+
+
+void EDA_3D_CONTROLLER::setTransitions()
+{
+ Go( &EDA_3D_CONTROLLER::Main, EDA_3D_ACTIONS::controlActivate.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::UpdateMenu, ACTIONS::updateMenu.MakeEvent() );
+
+ // Pan control
+ Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panUp.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panDown.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panLeft.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, ACTIONS::panRight.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveUp.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveDown.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveLeft.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::PanControl, EDA_3D_ACTIONS::moveRight.MakeEvent() );
+
+ // View rotation
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewTop.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewBottom.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewLeft.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewRight.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewFront.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::viewBack.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::pivotCenter.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::homeView.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ViewControl, EDA_3D_ACTIONS::resetView.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateXCW.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateXCCW.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateYCW.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateYCCW.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateZCW.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::RotateView, EDA_3D_ACTIONS::rotateZCCW.MakeEvent() );
+
+ // Zoom control
+ Go( &EDA_3D_CONTROLLER::ZoomRedraw, ACTIONS::zoomRedraw.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ZoomInOut, ACTIONS::zoomIn.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ZoomInOut, ACTIONS::zoomOut.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ZoomInOutCenter, ACTIONS::zoomInCenter.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ZoomInOutCenter, ACTIONS::zoomOutCenter.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ZoomFitScreen, ACTIONS::zoomFitScreen.MakeEvent() );
+
+ // Grid
+ Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::noGrid.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show10mmGrid.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show5mmGrid.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show2_5mmGrid.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::On3DGridSelection, EDA_3D_ACTIONS::show1mmGrid.MakeEvent() );
+
+ // Visibility
+ Go( &EDA_3D_CONTROLLER::ToggleOrtho, EDA_3D_ACTIONS::toggleOrtho.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::attributesTHT.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::attributesSMD.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::attributesVirtual.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showCopperThickness.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showBoundingBoxes.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::renderShadows.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::proceduralTextures.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::addFloor.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showRefractions.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showReflections.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::antiAliasing.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::postProcessing.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleRealisticMode.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleBoardBody.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::showAxis.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleZones.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleAdhesive.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleSilk.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleSolderMask.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleSolderPaste.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleComments.MakeEvent() );
+ Go( &EDA_3D_CONTROLLER::ToggleVisibility, EDA_3D_ACTIONS::toggleECO.MakeEvent() );
+}
+
+
diff --git a/3d-viewer/3d_viewer/tools/3d_viewer_control.h b/3d-viewer/3d_viewer/tools/3d_controller.h
similarity index 86%
rename from 3d-viewer/3d_viewer/tools/3d_viewer_control.h
rename to 3d-viewer/3d_viewer/tools/3d_controller.h
index 9237db90aa..7dfdbffcd5 100644
--- a/3d-viewer/3d_viewer/tools/3d_viewer_control.h
+++ b/3d-viewer/3d_viewer/tools/3d_controller.h
@@ -27,22 +27,25 @@
#include
class EDA_3D_VIEWER;
+class EDA_3D_SETTINGS;
+
/**
- * 3D_VIEWER_CONTROL
+ * EDA_3D_CONTROLLER
*
- * Handles actions that are shared between different applications
+ * Handles view actions for various 3D canvases.
*/
-class EDA_3D_VIEWER_CONTROL : public TOOL_INTERACTIVE
+class EDA_3D_CONTROLLER : public TOOL_INTERACTIVE
{
public:
- EDA_3D_VIEWER_CONTROL() :
+ EDA_3D_CONTROLLER() :
TOOL_INTERACTIVE( "3DViewer.Control" ),
- m_frame( nullptr )
+ m_canvas( nullptr ),
+ m_settings( nullptr )
{ }
- ~EDA_3D_VIEWER_CONTROL() override { }
+ ~EDA_3D_CONTROLLER() override { }
/// @copydoc TOOL_INTERACTIVE::Init()
bool Init() override;
@@ -73,10 +76,11 @@ private:
///> Sets up handlers for various events.
void setTransitions() override;
- ///> Pointer to the currently used edit frame.
- EDA_3D_VIEWER* m_frame;
-
int doZoomInOut( bool aDirection, bool aCenterOnCursor );
+
+private:
+ EDA_3D_CANVAS* m_canvas;
+ EDA_3D_SETTINGS* m_settings;
};
#endif
diff --git a/3d-viewer/3d_viewer/tools/3d_viewer_control.cpp b/3d-viewer/3d_viewer/tools/3d_viewer_control.cpp
deleted file mode 100644
index 274e37524a..0000000000
--- a/3d-viewer/3d_viewer/tools/3d_viewer_control.cpp
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * This program source code file is part of KiCad, a free EDA CAD application.
- *
- * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you may find one here:
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- * or you may search the http://www.gnu.org website for the version 2 license,
- * or you may write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include
-#include
-#include
-#include
-#include
-#include <3d_viewer_id.h>
-#include "3d_viewer_control.h"
-#include "3d_actions.h"
-
-
-bool EDA_3D_VIEWER_CONTROL::Init()
-{
- CONDITIONAL_MENU& ctxMenu = m_menu.GetMenu();
-
- ctxMenu.AddItem( ACTIONS::zoomIn, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( ACTIONS::zoomOut, SELECTION_CONDITIONS::ShowAlways );
-
- ctxMenu.AddSeparator();
- ctxMenu.AddItem( EDA_3D_ACTIONS::viewTop, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( EDA_3D_ACTIONS::viewBottom, SELECTION_CONDITIONS::ShowAlways );
-
- ctxMenu.AddSeparator();
- ctxMenu.AddItem( EDA_3D_ACTIONS::viewRight, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( EDA_3D_ACTIONS::viewLeft, SELECTION_CONDITIONS::ShowAlways );
-
- ctxMenu.AddSeparator();
- ctxMenu.AddItem( EDA_3D_ACTIONS::viewFront, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( EDA_3D_ACTIONS::viewBack, SELECTION_CONDITIONS::ShowAlways );
-
- ctxMenu.AddSeparator();
- ctxMenu.AddItem( EDA_3D_ACTIONS::moveLeft, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( EDA_3D_ACTIONS::moveRight, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( EDA_3D_ACTIONS::moveUp, SELECTION_CONDITIONS::ShowAlways );
- ctxMenu.AddItem( EDA_3D_ACTIONS::moveDown, SELECTION_CONDITIONS::ShowAlways );
-
- return true;
-}
-
-
-void EDA_3D_VIEWER_CONTROL::Reset( RESET_REASON aReason )
-{
- m_frame = getEditFrame();
-}
-
-
-int EDA_3D_VIEWER_CONTROL::UpdateMenu( const TOOL_EVENT& aEvent )
-{
- ACTION_MENU* actionMenu = aEvent.Parameter();
- CONDITIONAL_MENU* conditionalMenu = dynamic_cast( actionMenu );
- SELECTION dummySel;
-
- if( conditionalMenu )
- conditionalMenu->Evaluate( dummySel );
-
- if( actionMenu )
- actionMenu->UpdateAll();
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::Main( const TOOL_EVENT& aEvent )
-{
- // Main loop: keep receiving events
- while( TOOL_EVENT* evt = Wait() )
- {
- if( evt->IsClick( BUT_RIGHT ) )
- m_menu.ShowContextMenu();
- else
- evt->SetPassEvent();
- }
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ViewControl( const TOOL_EVENT& aEvent )
-{
- m_frame->GetCanvas()->SetView3D( aEvent.Parameter() );
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::PanControl( const TOOL_EVENT& aEvent )
-{
- switch( aEvent.Parameter() )
- {
- case ACTIONS::CURSOR_UP: m_frame->GetCanvas()->SetView3D( WXK_UP ); break;
- case ACTIONS::CURSOR_DOWN: m_frame->GetCanvas()->SetView3D( WXK_DOWN ); break;
- case ACTIONS::CURSOR_LEFT: m_frame->GetCanvas()->SetView3D( WXK_LEFT ); break;
- case ACTIONS::CURSOR_RIGHT: m_frame->GetCanvas()->SetView3D( WXK_RIGHT ); break;
- default: wxFAIL; break;
- }
-
- return 0;
-}
-
-
-#define ROT_ANGLE 10.0
-
-int EDA_3D_VIEWER_CONTROL::RotateView( const TOOL_EVENT& aEvent )
-{
- CINFO3D_VISU& settings = m_frame->GetSettings();
-
- switch( aEvent.Parameter() )
- {
- case ID_ROTATE3D_X_NEG: settings.CameraGet().RotateX( -glm::radians( ROT_ANGLE ) ); break;
- case ID_ROTATE3D_X_POS: settings.CameraGet().RotateX( glm::radians( ROT_ANGLE ) ); break;
- case ID_ROTATE3D_Y_NEG: settings.CameraGet().RotateY( -glm::radians( ROT_ANGLE ) ); break;
- case ID_ROTATE3D_Y_POS: settings.CameraGet().RotateY( glm::radians( ROT_ANGLE ) ); break;
- case ID_ROTATE3D_Z_NEG: settings.CameraGet().RotateZ( -glm::radians( ROT_ANGLE ) ); break;
- case ID_ROTATE3D_Z_POS: settings.CameraGet().RotateZ( glm::radians( ROT_ANGLE ) ); break;
- default: wxFAIL; break;
- }
-
- if( settings.RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
- m_frame->GetCanvas()->Request_refresh();
- else
- m_frame->GetCanvas()->RenderRaytracingRequest();
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ToggleOrtho( const TOOL_EVENT& aEvent )
-{
- m_frame->GetSettings().CameraGet().ToggleProjection();
-
- if( m_frame->GetSettings().RenderEngineGet() == RENDER_ENGINE::OPENGL_LEGACY )
- m_frame->GetCanvas()->Request_refresh();
- else
- m_frame->GetCanvas()->RenderRaytracingRequest();
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ToggleVisibility( const TOOL_EVENT& aEvent )
-{
- DISPLAY3D_FLG flag = aEvent.Parameter();
- CINFO3D_VISU& settings = m_frame->GetSettings();
-
- settings.SetFlag( flag, !settings.GetFlag( flag ) );
-
- switch( flag )
- {
- case FL_RENDER_OPENGL_SHOW_MODEL_BBOX:
- case FL_RENDER_RAYTRACING_SHADOWS:
- case FL_RENDER_RAYTRACING_REFRACTIONS:
- case FL_RENDER_RAYTRACING_REFLECTIONS:
- case FL_RENDER_RAYTRACING_ANTI_ALIASING:
- case FL_AXIS:
- m_frame->GetCanvas()->Request_refresh();
- break;
- default:
- m_frame->NewDisplay( true );
- break;
- }
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::On3DGridSelection( const TOOL_EVENT& aEvent )
-{
- GRID3D_TYPE grid = aEvent.Parameter();
- m_frame->GetSettings().GridSet( grid );
-
- if( m_frame->GetCanvas() )
- m_frame->GetCanvas()->Request_refresh();
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ZoomRedraw( const TOOL_EVENT& aEvent )
-{
- m_frame->GetCanvas()->Request_refresh();
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ZoomInOut( const TOOL_EVENT& aEvent )
-{
- bool direction = aEvent.IsAction( &ACTIONS::zoomIn );
- return doZoomInOut( direction, true );
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ZoomInOutCenter( const TOOL_EVENT& aEvent )
-{
- bool direction = aEvent.IsAction( &ACTIONS::zoomInCenter );
- return doZoomInOut( direction, false );
-}
-
-
-int EDA_3D_VIEWER_CONTROL::doZoomInOut( bool aDirection, bool aCenterOnCursor )
-{
- if( m_frame->GetCanvas() )
- {
- m_frame->GetCanvas()->SetView3D( aDirection ? WXK_F1 : WXK_F2 );
- m_frame->GetCanvas()->DisplayStatus();
- }
-
- return 0;
-}
-
-
-int EDA_3D_VIEWER_CONTROL::ZoomFitScreen( const TOOL_EVENT& aEvent )
-{
- if( m_frame->GetCanvas() )
- {
- m_frame->GetCanvas()->SetView3D( WXK_HOME );
- m_frame->GetCanvas()->DisplayStatus();
- }
-
- return 0;
-}
-
-
-void EDA_3D_VIEWER_CONTROL::setTransitions()
-{
- Go( &EDA_3D_VIEWER_CONTROL::Main, EDA_3D_ACTIONS::controlActivate.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::UpdateMenu, ACTIONS::updateMenu.MakeEvent() );
-
- // Pan control
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, ACTIONS::panUp.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, ACTIONS::panDown.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, ACTIONS::panLeft.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, ACTIONS::panRight.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, EDA_3D_ACTIONS::moveUp.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, EDA_3D_ACTIONS::moveDown.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, EDA_3D_ACTIONS::moveLeft.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::PanControl, EDA_3D_ACTIONS::moveRight.MakeEvent() );
-
- // View rotation
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::viewTop.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::viewBottom.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::viewLeft.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::viewRight.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::viewFront.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::viewBack.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::pivotCenter.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::homeView.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ViewControl, EDA_3D_ACTIONS::resetView.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::RotateView, EDA_3D_ACTIONS::rotateXCW.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::RotateView, EDA_3D_ACTIONS::rotateXCCW.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::RotateView, EDA_3D_ACTIONS::rotateYCW.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::RotateView, EDA_3D_ACTIONS::rotateYCCW.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::RotateView, EDA_3D_ACTIONS::rotateZCW.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::RotateView, EDA_3D_ACTIONS::rotateZCCW.MakeEvent() );
-
- // Zoom control
- Go( &EDA_3D_VIEWER_CONTROL::ZoomRedraw, ACTIONS::zoomRedraw.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ZoomInOut, ACTIONS::zoomIn.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ZoomInOut, ACTIONS::zoomOut.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ZoomInOutCenter, ACTIONS::zoomInCenter.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ZoomInOutCenter, ACTIONS::zoomOutCenter.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ZoomFitScreen, ACTIONS::zoomFitScreen.MakeEvent() );
-
- // Grid
- Go( &EDA_3D_VIEWER_CONTROL::On3DGridSelection, EDA_3D_ACTIONS::noGrid.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::On3DGridSelection, EDA_3D_ACTIONS::show10mmGrid.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::On3DGridSelection, EDA_3D_ACTIONS::show5mmGrid.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::On3DGridSelection, EDA_3D_ACTIONS::show2_5mmGrid.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::On3DGridSelection, EDA_3D_ACTIONS::show1mmGrid.MakeEvent() );
-
- // Visibility
- Go( &EDA_3D_VIEWER_CONTROL::ToggleOrtho, EDA_3D_ACTIONS::toggleOrtho.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::attributesTHT.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::attributesSMD.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::attributesVirtual.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::showCopperThickness.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::showBoundingBoxes.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::renderShadows.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::proceduralTextures.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::addFloor.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::showRefractions.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::showReflections.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::antiAliasing.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::postProcessing.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleRealisticMode.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleBoardBody.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::showAxis.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleZones.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleAdhesive.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleSilk.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleSolderMask.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleSolderPaste.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleComments.MakeEvent() );
- Go( &EDA_3D_VIEWER_CONTROL::ToggleVisibility, EDA_3D_ACTIONS::toggleECO.MakeEvent() );
-}
-
-
diff --git a/3d-viewer/CMakeLists.txt b/3d-viewer/CMakeLists.txt
index 48f2e49be4..7f4a6d3374 100644
--- a/3d-viewer/CMakeLists.txt
+++ b/3d-viewer/CMakeLists.txt
@@ -34,8 +34,8 @@ set(3D-VIEWER_SRCS
${DIR_DLG}/3d_cache_dialogs.cpp
${DIR_DLG}/dlg_select_3dmodel.cpp
${DIR_DLG}/panel_prev_3d_base.cpp
- ${DIR_DLG}/panel_prev_model.cpp
- 3d_canvas/cinfo3d_visu.cpp
+ ${DIR_DLG}/panel_prev_3d.cpp
+ 3d_canvas/3d_settings.cpp
3d_canvas/create_layer_items.cpp
3d_canvas/create_3Dgraphic_brd_items.cpp
3d_canvas/create_layer_poly.cpp
@@ -86,14 +86,14 @@ set(3D-VIEWER_SRCS
3d_rendering/cpostshader.cpp
3d_rendering/cpostshader_ssao.cpp
3d_rendering/ctrack_ball.cpp
- 3d_viewer/3d_menubar.cpp
3d_rendering/test_cases.cpp
3d_rendering/trackball.cpp
+ 3d_viewer/3d_menubar.cpp
3d_viewer/3d_toolbar.cpp
3d_viewer/dialogs/dialog_3D_view_option.cpp
3d_viewer/dialogs/dialog_3D_view_option_base.cpp
3d_viewer/tools/3d_actions.cpp
- 3d_viewer/tools/3d_viewer_control.cpp
+ 3d_viewer/tools/3d_controller.cpp
3d_viewer/eda_3d_viewer.cpp
3d_viewer/3d_viewer_settings.cpp
common_ogl/cogl_att_list.cpp
diff --git a/bitmap2component/bitmap2cmp_gui.cpp b/bitmap2component/bitmap2cmp_gui.cpp
index 75078121e1..47d7de78ac 100644
--- a/bitmap2component/bitmap2cmp_gui.cpp
+++ b/bitmap2component/bitmap2cmp_gui.cpp
@@ -151,13 +151,8 @@ BM2CMP_FRAME::BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
{
SetKiway( this, aKiway );
- wxString unitList[] =
- {
- _("mm"), _("Inch"), _("DPI")
- };
-
- for( int ii = 0; ii < 3; ii++ )
- m_PixelUnit->Append( unitList[ii] );
+ for( wxString unit : { _( "mm" ), _( "Inch" ), _( "DPI" ) } )
+ m_PixelUnit->Append( unit );
LoadSettings( config() );
@@ -202,6 +197,12 @@ BM2CMP_FRAME::~BM2CMP_FRAME()
}
+wxWindow* BM2CMP_FRAME::GetToolCanvas() const
+{
+ return m_Notebook->GetCurrentPage();
+}
+
+
void BM2CMP_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
{
EDA_BASE_FRAME::LoadSettings( aCfg );
diff --git a/bitmap2component/bitmap2cmp_gui.h b/bitmap2component/bitmap2cmp_gui.h
index e390761c72..716d9e01b7 100644
--- a/bitmap2component/bitmap2cmp_gui.h
+++ b/bitmap2component/bitmap2cmp_gui.h
@@ -75,16 +75,15 @@ public:
int GetOutputDPI();
private:
- EDA_UNITS m_unit; // The units for m_outputSize (mm, inch, dpi)
- double m_outputSize; // The size in m_unit of the output image, depending on
- // the user settings. Set to the initial image size
- int m_originalDPI; // The image DPI if specified in file, or 0 if unknown
- int m_originalSizePixels; // The original image size read from file, in pixels
+ EDA_UNITS m_unit; // The units for m_outputSize (mm, inch, dpi)
+ double m_outputSize; // The size in m_unit of the output image, depending on
+ // the user settings. Set to the initial image size
+ int m_originalDPI; // The image DPI if specified in file, or 0 if unknown
+ int m_originalSizePixels; // The original image size read from file, in pixels
};
class BM2CMP_FRAME : public BM2CMP_FRAME_BASE
{
-
public:
BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent );
~BM2CMP_FRAME();
@@ -155,20 +154,22 @@ private:
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
+ wxWindow* GetToolCanvas() const override;
+
private:
- wxImage m_Pict_Image;
- wxBitmap m_Pict_Bitmap;
- wxImage m_Greyscale_Image;
- wxBitmap m_Greyscale_Bitmap;
- wxImage m_NB_Image;
- wxBitmap m_BN_Bitmap;
- IMAGE_SIZE m_outputSizeX;
- IMAGE_SIZE m_outputSizeY;
- bool m_Negative;
- wxString m_BitmapFileName;
- wxString m_ConvertedFileName;
- bool m_exportToClipboard;
- bool m_AspectRatioLocked;
- double m_AspectRatio;
+ wxImage m_Pict_Image;
+ wxBitmap m_Pict_Bitmap;
+ wxImage m_Greyscale_Image;
+ wxBitmap m_Greyscale_Bitmap;
+ wxImage m_NB_Image;
+ wxBitmap m_BN_Bitmap;
+ IMAGE_SIZE m_outputSizeX;
+ IMAGE_SIZE m_outputSizeY;
+ bool m_Negative;
+ wxString m_BitmapFileName;
+ wxString m_ConvertedFileName;
+ bool m_exportToClipboard;
+ bool m_AspectRatioLocked;
+ double m_AspectRatio;
};
#endif// BITMOP2CMP_GUI_H_
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index c0a76d04e0..84a251b304 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -335,6 +335,7 @@ set( COMMON_SRCS
searchhelpfilefullpath.cpp
status_popup.cpp
systemdirsappend.cpp
+ tools_holder.cpp
trace_helpers.cpp
undo_redo_container.cpp
utf8.cpp
diff --git a/common/bitmap.cpp b/common/bitmap.cpp
index c10d29a6c2..73ad0c7e0c 100644
--- a/common/bitmap.cpp
+++ b/common/bitmap.cpp
@@ -102,7 +102,7 @@ int KiIconScale( wxWindow* aWindow )
}
-static int get_scale_factor( EDA_BASE_FRAME* aWindow )
+static int get_scale_factor( wxWindow* aWindow )
{
int requested_scale = Pgm().GetCommonSettings()->m_Appearance.icon_scale;
@@ -113,7 +113,7 @@ static int get_scale_factor( EDA_BASE_FRAME* aWindow )
}
-wxBitmap KiScaledBitmap( BITMAP_DEF aBitmap, EDA_BASE_FRAME* aWindow )
+wxBitmap KiScaledBitmap( BITMAP_DEF aBitmap, wxWindow* aWindow )
{
// Bitmap conversions are cached because they can be slow.
static std::unordered_map bitmap_cache;
@@ -145,7 +145,7 @@ wxBitmap KiScaledBitmap( BITMAP_DEF aBitmap, EDA_BASE_FRAME* aWindow )
}
-wxBitmap KiScaledBitmap( const wxBitmap& aBitmap, EDA_BASE_FRAME* aWindow )
+wxBitmap KiScaledBitmap( const wxBitmap& aBitmap, wxWindow* aWindow )
{
const int scale = get_scale_factor( aWindow );
@@ -164,7 +164,7 @@ wxBitmap KiScaledBitmap( const wxBitmap& aBitmap, EDA_BASE_FRAME* aWindow )
}
-void KiScaledSeparator( wxAuiToolBar* aToolbar, EDA_BASE_FRAME* aWindow )
+void KiScaledSeparator( wxAuiToolBar* aToolbar, wxWindow* aWindow )
{
const int scale = get_scale_factor( aWindow );
diff --git a/common/eda_base_frame.cpp b/common/eda_base_frame.cpp
index e26f6a8483..8f06e8b25c 100644
--- a/common/eda_base_frame.cpp
+++ b/common/eda_base_frame.cpp
@@ -40,6 +40,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -57,9 +58,9 @@ BEGIN_EVENT_TABLE( EDA_BASE_FRAME, wxFrame )
EVT_MENU( wxID_PREFERENCES, EDA_BASE_FRAME::OnPreferences )
EVT_CHAR_HOOK( EDA_BASE_FRAME::OnCharHook )
- EVT_MENU_OPEN( EDA_BASE_FRAME::OnMenuOpen )
- EVT_MENU_CLOSE( EDA_BASE_FRAME::OnMenuOpen )
- EVT_MENU_HIGHLIGHT_ALL( EDA_BASE_FRAME::OnMenuOpen )
+ EVT_MENU_OPEN( EDA_BASE_FRAME::OnMenuEvent )
+ EVT_MENU_CLOSE( EDA_BASE_FRAME::OnMenuEvent )
+ EVT_MENU_HIGHLIGHT_ALL( EDA_BASE_FRAME::OnMenuEvent )
EVT_MOVE( EDA_BASE_FRAME::OnMove )
END_EVENT_TABLE()
@@ -68,10 +69,6 @@ EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
long aStyle, const wxString& aFrameName, KIWAY* aKiway ) :
wxFrame( aParent, wxID_ANY, aTitle, aPos, aSize, aStyle, aFrameName ),
KIWAY_HOLDER( aKiway, KIWAY_HOLDER::FRAME ),
- m_actions( nullptr ),
- m_immediateActions( true ),
- m_dragSelects( true ),
- m_moveWarpsCursor( true ),
m_userUnits( EDA_UNITS::MILLIMETRES )
{
m_Ident = aFrameType;
@@ -193,80 +190,6 @@ void EDA_BASE_FRAME::SetShutdownBlockReason( const wxString& aReason )
}
-// TODO: Implement an RAII mechanism for the stack PushTool/PopTool pairs
-void EDA_BASE_FRAME::PushTool( const std::string& actionName )
-{
- m_toolStack.push_back( actionName );
-
- // Human cognitive stacking is very shallow; deeper tool stacks just get annoying
- if( m_toolStack.size() > 3 )
- m_toolStack.erase( m_toolStack.begin() );
-
- TOOL_ACTION* action = m_toolManager->GetActionManager()->FindAction( actionName );
-
- if( action )
- DisplayToolMsg( action->GetLabel() );
- else
- DisplayToolMsg( actionName );
-}
-
-
-void EDA_BASE_FRAME::PopTool( const std::string& actionName )
-{
- // Push/pop events can get out of order (such as when they're generated by the Simulator
- // frame but not processed until the mouse is back in the Schematic frame), so make sure
- // we're popping the right stack frame.
-
- for( int i = m_toolStack.size() - 1; i >= 0; --i )
- {
- if( m_toolStack[ i ] == actionName )
- {
- m_toolStack.erase( m_toolStack.begin() + i );
-
- // If there's something underneath us, and it's now the top of the stack, then
- // re-activate it
- if( ( --i ) >= 0 && i == (int)m_toolStack.size() - 1 )
- {
- std::string back = m_toolStack[ i ];
- TOOL_ACTION* action = m_toolManager->GetActionManager()->FindAction( back );
-
- if( action )
- {
- // Pop the action as running it will push it back onto the stack
- m_toolStack.pop_back();
-
- TOOL_EVENT evt = action->MakeEvent();
- evt.SetHasPosition( false );
- GetToolManager()->PostEvent( evt );
- }
- }
- else
- DisplayToolMsg( ACTIONS::selectionTool.GetLabel() );
-
- return;
- }
- }
-}
-
-
-std::string EDA_BASE_FRAME::CurrentToolName() const
-{
- if( m_toolStack.empty() )
- return ACTIONS::selectionTool.GetName();
- else
- return m_toolStack.back();
-}
-
-
-bool EDA_BASE_FRAME::IsCurrentTool( const TOOL_ACTION& aAction ) const
-{
- if( m_toolStack.empty() )
- return &aAction == &ACTIONS::selectionTool;
- else
- return m_toolStack.back() == aAction.GetName();
-}
-
-
bool EDA_BASE_FRAME::ProcessEvent( wxEvent& aEvent )
{
#ifdef __WXMAC__
@@ -347,45 +270,12 @@ void EDA_BASE_FRAME::OnCharHook( wxKeyEvent& event )
}
-void EDA_BASE_FRAME::OnMenuOpen( wxMenuEvent& event )
+void EDA_BASE_FRAME::OnMenuEvent( wxMenuEvent& aEvent )
{
- //
- // wxWidgets has several issues that we have to work around:
- //
- // 1) wxWidgets 3.0.x Windows has a bug where wxEVT_MENU_OPEN and wxEVT_MENU_HIGHLIGHT
- // events are not captured by the ACTON_MENU menus. So we forward them here.
- // (FWIW, this one is fixed in wxWidgets 3.1.x.)
- //
- // 2) wxWidgets doesn't pass the menu pointer for wxEVT_MENU_HIGHLIGHT events. So we
- // store the menu pointer from the wxEVT_MENU_OPEN call.
- //
- // 3) wxWidgets has no way to tell whether a command is from a menu selection or a
- // hotkey. So we keep track of menu highlighting so we can differentiate.
- //
-
- static ACTION_MENU* currentMenu;
-
- if( event.GetEventType() == wxEVT_MENU_OPEN )
- {
- currentMenu = dynamic_cast( event.GetMenu() );
-
- if( currentMenu )
- currentMenu->OnMenuEvent( event );
- }
- else if( event.GetEventType() == wxEVT_MENU_HIGHLIGHT )
- {
- if( currentMenu )
- currentMenu->OnMenuEvent( event );
- }
- else if( event.GetEventType() == wxEVT_MENU_CLOSE )
- {
- if( currentMenu )
- currentMenu->OnMenuEvent( event );
-
- currentMenu = nullptr;
- }
-
- event.Skip();
+ if( !m_toolDispatcher )
+ aEvent.Skip();
+ else
+ m_toolDispatcher->DispatchWxEvent( aEvent );
}
@@ -425,8 +315,7 @@ void EDA_BASE_FRAME::ShowChangedLanguage()
void EDA_BASE_FRAME::CommonSettingsChanged( bool aEnvVarsChanged )
{
- if( GetToolManager() )
- GetToolManager()->GetActionManager()->UpdateHotKeys( false );
+ TOOLS_HOLDER::CommonSettingsChanged( aEnvVarsChanged );
if( GetMenuBar() )
{
@@ -434,12 +323,6 @@ void EDA_BASE_FRAME::CommonSettingsChanged( bool aEnvVarsChanged )
ReCreateMenuBar();
GetMenuBar()->Refresh();
}
-
- COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
-
- m_moveWarpsCursor = settings->m_Input.warp_mouse_on_move;
- m_dragSelects = settings->m_Input.prefer_select_to_drag;
- m_immediateActions = settings->m_Input.immediate_actions;
}
@@ -512,11 +395,7 @@ void EDA_BASE_FRAME::LoadWindowSettings( WINDOW_SETTINGS* aCfg )
m_perspective = aCfg->perspective;
m_mruPath = aCfg->mru_path;
- COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
-
- m_moveWarpsCursor = settings->m_Input.warp_mouse_on_move;
- m_dragSelects = settings->m_Input.prefer_select_to_drag;
- m_immediateActions = settings->m_Input.immediate_actions;
+ TOOLS_HOLDER::CommonSettingsChanged( false );
}
diff --git a/common/lib_tree_model_adapter.h b/common/lib_tree_model_adapter.h
index a1e2c9c8da..6262a258da 100644
--- a/common/lib_tree_model_adapter.h
+++ b/common/lib_tree_model_adapter.h
@@ -92,6 +92,8 @@
class APP_SETTINGS_BASE;
class TOOL_INTERACTIVE;
class PARAM_CFG;
+class EDA_BASE_FRAME;
+
class LIB_TREE_MODEL_ADAPTER: public wxDataViewModel
{
diff --git a/common/tool/action_manager.cpp b/common/tool/action_manager.cpp
index df85b9621c..2c151eedbf 100644
--- a/common/tool/action_manager.cpp
+++ b/common/tool/action_manager.cpp
@@ -200,9 +200,9 @@ void ACTION_MANAGER::UpdateHotKeys( bool aFullUpdate )
m_actionHotKeys.clear();
m_hotkeys.clear();
- if( aFullUpdate && m_toolMgr->GetEditFrame() )
+ if( aFullUpdate && m_toolMgr->GetToolHolder() )
{
- ReadLegacyHotkeyConfig( m_toolMgr->GetEditFrame()->ConfigBaseName(), legacyHotKeyMap );
+ ReadLegacyHotkeyConfig( m_toolMgr->GetToolHolder()->ConfigBaseName(), legacyHotKeyMap );
ReadHotKeyConfig( wxEmptyString, userHotKeyMap );
}
diff --git a/common/tool/action_menu.cpp b/common/tool/action_menu.cpp
index 836cf40db8..79a48a0f0d 100644
--- a/common/tool/action_menu.cpp
+++ b/common/tool/action_menu.cpp
@@ -73,7 +73,7 @@ void ACTION_MENU::SetIcon( const BITMAP_OPAQUE* aIcon )
void ACTION_MENU::setupEvents()
{
-// See wxWidgets hack in EDA_BASE_FRAME::OnMenuOpen().
+// See wxWidgets hack in TOOL_DISPATCHER::DispatchWxEvent().
// Connect( wxEVT_MENU_OPEN, wxMenuEventHandler( ACTION_MENU::OnMenuEvent ), NULL, this );
// Connect( wxEVT_MENU_HIGHLIGHT, wxMenuEventHandler( ACTION_MENU::OnMenuEvent ), NULL, this );
// Connect( wxEVT_MENU_CLOSE, wxMenuEventHandler( ACTION_MENU::OnMenuEvent ), NULL, this );
diff --git a/common/tool/action_toolbar.cpp b/common/tool/action_toolbar.cpp
index c2ce76d051..9fd4e0fb35 100644
--- a/common/tool/action_toolbar.cpp
+++ b/common/tool/action_toolbar.cpp
@@ -42,10 +42,10 @@ ACTION_TOOLBAR::ACTION_TOOLBAR( EDA_BASE_FRAME* parent, wxWindowID id, const wxP
void ACTION_TOOLBAR::Add( const TOOL_ACTION& aAction, bool aIsToggleEntry )
{
- EDA_BASE_FRAME* editFrame = m_toolManager->GetEditFrame();
- int toolId = aAction.GetId() + ACTION_ID;
+ wxWindow* parent = dynamic_cast( m_toolManager->GetToolHolder() );
+ int toolId = aAction.GetId() + ACTION_ID;
- AddTool( toolId, wxEmptyString, KiScaledBitmap( aAction.GetIcon(), editFrame ),
+ AddTool( toolId, wxEmptyString, KiScaledBitmap( aAction.GetIcon(), parent ),
aAction.GetDescription(), aIsToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL );
m_toolKinds[ toolId ] = aIsToggleEntry;
@@ -55,10 +55,10 @@ void ACTION_TOOLBAR::Add( const TOOL_ACTION& aAction, bool aIsToggleEntry )
void ACTION_TOOLBAR::AddButton( const TOOL_ACTION& aAction )
{
- EDA_BASE_FRAME* editFrame = m_toolManager->GetEditFrame();
- int toolId = aAction.GetId() + ACTION_ID;
+ wxWindow* parent = dynamic_cast( m_toolManager->GetToolHolder() );
+ int toolId = aAction.GetId() + ACTION_ID;
- AddTool( toolId, wxEmptyString, KiScaledBitmap( aAction.GetIcon(), editFrame ),
+ AddTool( toolId, wxEmptyString, KiScaledBitmap( aAction.GetIcon(), parent ),
aAction.GetName(), wxITEM_NORMAL );
m_toolKinds[ toolId ] = false;
diff --git a/common/tool/tool_base.cpp b/common/tool/tool_base.cpp
index edc04f8bc3..22d59eeb56 100644
--- a/common/tool/tool_base.cpp
+++ b/common/tool/tool_base.cpp
@@ -45,9 +45,9 @@ KIGFX::VIEW_CONTROLS* TOOL_BASE::getViewControls() const
}
-EDA_BASE_FRAME* TOOL_BASE::getEditFrameInt() const
+TOOLS_HOLDER* TOOL_BASE::getToolHolderInt() const
{
- return m_toolMgr->GetEditFrame();
+ return m_toolMgr->GetToolHolder();
}
diff --git a/common/tool/tool_dispatcher.cpp b/common/tool/tool_dispatcher.cpp
index 4ca3863b74..675e10edd1 100644
--- a/common/tool/tool_dispatcher.cpp
+++ b/common/tool/tool_dispatcher.cpp
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include
#include
@@ -340,7 +341,12 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
// In this case, give the focus to the parent frame (GAL canvas itself does not accept the
// focus when iconized for some obscure reason)
if( wxWindow::FindFocus() == nullptr )
- m_toolMgr->GetEditFrame()->SetFocus();
+ {
+ wxWindow* window = dynamic_cast( m_toolMgr->GetToolHolder() );
+
+ if( window )
+ window->SetFocus();
+ }
// Mouse handling
// Note: wxEVT_LEFT_DOWN event must always be skipped.
@@ -387,10 +393,8 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
// after second LMB click and currently I have no means to do better debugging
if( type == wxEVT_LEFT_UP )
{
- EDA_DRAW_FRAME* drawFrame = dynamic_cast( m_toolMgr->GetEditFrame() );
-
- if( drawFrame )
- drawFrame->GetCanvas()->SetFocus();
+ if( m_toolMgr->GetToolHolder() && m_toolMgr->GetToolHolder()->GetToolCanvas() )
+ m_toolMgr->GetToolHolder()->GetToolCanvas()->SetFocus();
}
#endif /* __APPLE__ */
}
@@ -470,6 +474,48 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
else
evt = TOOL_EVENT( TC_KEYBOARD, TA_KEY_PRESSED, key | mods );
}
+ else if( type == wxEVT_MENU_OPEN || type == wxEVT_MENU_CLOSE || type == wxEVT_MENU_HIGHLIGHT )
+ {
+ //
+ // wxWidgets has several issues that we have to work around:
+ //
+ // 1) wxWidgets 3.0.x Windows has a bug where wxEVT_MENU_OPEN and wxEVT_MENU_HIGHLIGHT
+ // events are not captured by the ACTON_MENU menus. So we forward them here.
+ // (FWIW, this one is fixed in wxWidgets 3.1.x.)
+ //
+ // 2) wxWidgets doesn't pass the menu pointer for wxEVT_MENU_HIGHLIGHT events. So we
+ // store the menu pointer from the wxEVT_MENU_OPEN call.
+ //
+ // 3) wxWidgets has no way to tell whether a command is from a menu selection or a
+ // hotkey. So we keep track of menu highlighting so we can differentiate.
+ //
+
+ static ACTION_MENU* currentMenu;
+
+ wxMenuEvent& menuEvent = *dynamic_cast( &aEvent );
+
+ if( type == wxEVT_MENU_OPEN )
+ {
+ currentMenu = dynamic_cast( menuEvent.GetMenu() );
+
+ if( currentMenu )
+ currentMenu->OnMenuEvent( menuEvent );
+ }
+ else if( type == wxEVT_MENU_HIGHLIGHT )
+ {
+ if( currentMenu )
+ currentMenu->OnMenuEvent( menuEvent );
+ }
+ else if( type == wxEVT_MENU_CLOSE )
+ {
+ if( currentMenu )
+ currentMenu->OnMenuEvent( menuEvent );
+
+ currentMenu = nullptr;
+ }
+
+ aEvent.Skip();
+ }
bool handled = false;
diff --git a/common/tool/tool_manager.cpp b/common/tool/tool_manager.cpp
index c0c6f1964b..3d3ceb9aaa 100644
--- a/common/tool/tool_manager.cpp
+++ b/common/tool/tool_manager.cpp
@@ -846,7 +846,7 @@ void TOOL_MANAGER::DispatchContextMenu( const TOOL_EVENT& aEvent )
m_menuOwner = toolId;
m_menuActive = true;
- if( auto frame = dynamic_cast( m_frame ) )
+ if( wxWindow* frame = dynamic_cast( m_frame ) )
frame->PopupMenu( menu.get() );
// Warp the cursor if a menu item was selected
@@ -937,11 +937,8 @@ bool TOOL_MANAGER::ProcessEvent( const TOOL_EVENT& aEvent )
if( m_view && m_view->IsDirty() )
{
- auto frame = GetEditFrame();
- if( frame )
- {
- frame->RefreshCanvas();
- }
+ if( GetToolHolder() )
+ GetToolHolder()->RefreshCanvas();
#if defined( __WXMAC__ ) || defined( __WINDOWS__ )
wxTheApp->ProcessPendingEvents(); // required for updating brightening behind a popup menu
@@ -1017,7 +1014,7 @@ TOOL_ID TOOL_MANAGER::MakeToolId( const std::string& aToolName )
void TOOL_MANAGER::SetEnvironment( EDA_ITEM* aModel, KIGFX::VIEW* aView,
- KIGFX::VIEW_CONTROLS* aViewControls, EDA_BASE_FRAME* aFrame )
+ KIGFX::VIEW_CONTROLS* aViewControls, TOOLS_HOLDER* aFrame )
{
m_model = aModel;
m_view = aView;
@@ -1094,11 +1091,11 @@ bool TOOL_MANAGER::processEvent( const TOOL_EVENT& aEvent )
TOOL_EVENT mod_event( aEvent );
// Only immediate actions get the position. Otherwise clear for tool activation
- if( GetEditFrame() && !GetEditFrame()->GetDoImmediateActions() )
+ if( GetToolHolder() && !GetToolHolder()->GetDoImmediateActions() )
{
// An tool-selection-event has no position
if( mod_event.GetCommandStr().is_initialized()
- && mod_event.GetCommandStr().get() != GetEditFrame()->CurrentToolName() )
+ && mod_event.GetCommandStr().get() != GetToolHolder()->CurrentToolName() )
{
mod_event.SetHasPosition( false );
}
@@ -1149,7 +1146,7 @@ bool TOOL_MANAGER::IsToolActive( TOOL_ID aId ) const
void TOOL_MANAGER::UpdateUI( const TOOL_EVENT& aEvent )
{
- EDA_BASE_FRAME* frame = GetEditFrame();
+ EDA_BASE_FRAME* frame = dynamic_cast( GetToolHolder() );
if( frame )
{
diff --git a/common/tools_holder.cpp b/common/tools_holder.cpp
new file mode 100644
index 0000000000..e018ed8432
--- /dev/null
+++ b/common/tools_holder.cpp
@@ -0,0 +1,128 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+TOOLS_HOLDER::TOOLS_HOLDER() :
+ m_toolManager( nullptr ),
+ m_actions( nullptr ),
+ m_toolDispatcher( nullptr ),
+ m_immediateActions( true ),
+ m_dragSelects( true ),
+ m_moveWarpsCursor( true )
+{ }
+
+
+// TODO: Implement an RAII mechanism for the stack PushTool/PopTool pairs
+void TOOLS_HOLDER::PushTool( const std::string& actionName )
+{
+ m_toolStack.push_back( actionName );
+
+ // Human cognitive stacking is very shallow; deeper tool stacks just get annoying
+ if( m_toolStack.size() > 3 )
+ m_toolStack.erase( m_toolStack.begin() );
+
+ TOOL_ACTION* action = m_toolManager->GetActionManager()->FindAction( actionName );
+
+ if( action )
+ DisplayToolMsg( action->GetLabel() );
+ else
+ DisplayToolMsg( actionName );
+}
+
+
+void TOOLS_HOLDER::PopTool( const std::string& actionName )
+{
+ // Push/pop events can get out of order (such as when they're generated by the Simulator
+ // frame but not processed until the mouse is back in the Schematic frame), so make sure
+ // we're popping the right stack frame.
+
+ for( int i = (int) m_toolStack.size() - 1; i >= 0; --i )
+ {
+ if( m_toolStack[ i ] == actionName )
+ {
+ m_toolStack.erase( m_toolStack.begin() + i );
+
+ // If there's something underneath us, and it's now the top of the stack, then
+ // re-activate it
+ if( ( --i ) >= 0 && i == (int)m_toolStack.size() - 1 )
+ {
+ std::string back = m_toolStack[ i ];
+ TOOL_ACTION* action = m_toolManager->GetActionManager()->FindAction( back );
+
+ if( action )
+ {
+ // Pop the action as running it will push it back onto the stack
+ m_toolStack.pop_back();
+
+ TOOL_EVENT evt = action->MakeEvent();
+ evt.SetHasPosition( false );
+ GetToolManager()->PostEvent( evt );
+ }
+ }
+ else
+ DisplayToolMsg( ACTIONS::selectionTool.GetLabel() );
+
+ return;
+ }
+ }
+}
+
+
+std::string TOOLS_HOLDER::CurrentToolName() const
+{
+ if( m_toolStack.empty() )
+ return ACTIONS::selectionTool.GetName();
+ else
+ return m_toolStack.back();
+}
+
+
+bool TOOLS_HOLDER::IsCurrentTool( const TOOL_ACTION& aAction ) const
+{
+ if( m_toolStack.empty() )
+ return &aAction == &ACTIONS::selectionTool;
+ else
+ return m_toolStack.back() == aAction.GetName();
+}
+
+
+void TOOLS_HOLDER::CommonSettingsChanged( bool aEnvVarsChanged )
+{
+ if( GetToolManager() )
+ GetToolManager()->GetActionManager()->UpdateHotKeys( false );
+
+ COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
+
+ m_moveWarpsCursor = settings->m_Input.warp_mouse_on_move;
+ m_dragSelects = settings->m_Input.prefer_select_to_drag;
+ m_immediateActions = settings->m_Input.immediate_actions;
+}
+
diff --git a/cvpcb/cvpcb_mainframe.cpp b/cvpcb/cvpcb_mainframe.cpp
index 0309ae413b..eb0f76569e 100644
--- a/cvpcb/cvpcb_mainframe.cpp
+++ b/cvpcb/cvpcb_mainframe.cpp
@@ -958,7 +958,7 @@ std::vector CVPCB_MAINFRAME::GetComponentIndices(
}
-DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFootprintViewerFrame()
+DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFootprintViewerFrame() const
{
// returns the Footprint Viewer frame, if exists, or NULL
return dynamic_cast
@@ -966,6 +966,12 @@ DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFootprintViewerFrame()
}
+wxWindow* CVPCB_MAINFRAME::GetToolCanvas() const
+{
+ return GetFootprintViewerFrame();
+}
+
+
CVPCB_MAINFRAME::CONTROL_TYPE CVPCB_MAINFRAME::GetFocusedControl()
{
if( m_libListBox->HasFocus() )
diff --git a/cvpcb/cvpcb_mainframe.h b/cvpcb/cvpcb_mainframe.h
index b769175e82..03132ee13f 100644
--- a/cvpcb/cvpcb_mainframe.h
+++ b/cvpcb/cvpcb_mainframe.h
@@ -150,7 +150,9 @@ public:
/**
* @return a pointer on the Footprint Viewer frame, if exists, or NULL
*/
- DISPLAY_FOOTPRINTS_FRAME* GetFootprintViewerFrame();
+ DISPLAY_FOOTPRINTS_FRAME* GetFootprintViewerFrame() const;
+
+ wxWindow* GetToolCanvas() const override;
/**
* Find out which control currently has focus.
diff --git a/eeschema/sim/sim_plot_frame.h b/eeschema/sim/sim_plot_frame.h
index 0e5ead9fe7..f8a2146278 100644
--- a/eeschema/sim/sim_plot_frame.h
+++ b/eeschema/sim/sim_plot_frame.h
@@ -196,6 +196,9 @@ public:
WINDOW_SETTINGS* GetWindowSettings( APP_SETTINGS_BASE* aCfg ) override;
+ // Simulator doesn't host a tool framework
+ wxWindow* GetToolCanvas() const override { return nullptr; }
+
private:
/** Give icons to menuitems of the main menubar
diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp
index 95a6323878..89c5b38402 100644
--- a/eeschema/tools/sch_editor_control.cpp
+++ b/eeschema/tools/sch_editor_control.cpp
@@ -696,7 +696,7 @@ static VECTOR2D CLEAR;
// TODO(JE) Probably use netcode rather than connection name here eventually
static bool highlightNet( TOOL_MANAGER* aToolMgr, const VECTOR2D& aPosition )
{
- SCH_EDIT_FRAME* editFrame = static_cast( aToolMgr->GetEditFrame() );
+ SCH_EDIT_FRAME* editFrame = static_cast( aToolMgr->GetToolHolder() );
EE_SELECTION_TOOL* selTool = aToolMgr->GetTool();
SCH_EDITOR_CONTROL* editorControl = aToolMgr->GetTool();
wxString netName;
diff --git a/eeschema/tools/sch_line_wire_bus_tool.cpp b/eeschema/tools/sch_line_wire_bus_tool.cpp
index f94f5cc061..59f06ebd74 100644
--- a/eeschema/tools/sch_line_wire_bus_tool.cpp
+++ b/eeschema/tools/sch_line_wire_bus_tool.cpp
@@ -106,7 +106,7 @@ protected:
private:
void update() override
{
- SCH_EDIT_FRAME* frame = (SCH_EDIT_FRAME*) getToolManager()->GetEditFrame();
+ SCH_EDIT_FRAME* frame = (SCH_EDIT_FRAME*) getToolManager()->GetToolHolder();
EE_SELECTION_TOOL* selTool = getToolManager()->GetTool();
KICAD_T busType[] = { SCH_LINE_LOCATE_BUS_T, EOT };
EE_SELECTION& selection = selTool->RequestSelection( busType );
diff --git a/include/bitmap_types.h b/include/bitmap_types.h
index c3855b9538..50308e6394 100644
--- a/include/bitmap_types.h
+++ b/include/bitmap_types.h
@@ -30,7 +30,6 @@
// test if it works under stable release
// #include // only to define wxBitmap
class wxBitmap; // only to define wxBitmap
-class EDA_BASE_FRAME;
class EDA_DRAW_FRAME;
class wxWindow;
class wxAuiToolBar;
@@ -55,7 +54,7 @@ wxBitmap KiBitmap( BITMAP_DEF aBitmap );
* @param aBitmap bitmap definition
* @param aWindow target window for scaling context
*/
-wxBitmap KiScaledBitmap( BITMAP_DEF aBitmap, EDA_BASE_FRAME* aWindow );
+wxBitmap KiScaledBitmap( BITMAP_DEF aBitmap, wxWindow* aWindow );
/**
* Overload of the above function that takes another wxBitmap as a parameter.
@@ -63,12 +62,12 @@ wxBitmap KiScaledBitmap( BITMAP_DEF aBitmap, EDA_BASE_FRAME* aWindow );
* @param aBitmap bitmap definition
* @param aWindow target window for scaling context
*/
-wxBitmap KiScaledBitmap( const wxBitmap& aBitmap, EDA_BASE_FRAME* aWindow );
+wxBitmap KiScaledBitmap( const wxBitmap& aBitmap, wxWindow* aWindow );
/**
* Add a separator to the given toolbar scaled the same way as KiScaledBitmap.
*/
-void KiScaledSeparator( wxAuiToolBar* aToolbar, EDA_BASE_FRAME* aWindow );
+void KiScaledSeparator( wxAuiToolBar* aToolbar, wxWindow* aWindow );
/**
* Return the automatic scale factor that would be used for a given window by
diff --git a/include/eda_base_frame.h b/include/eda_base_frame.h
index d0bf1924b2..b0b5f2de3e 100644
--- a/include/eda_base_frame.h
+++ b/include/eda_base_frame.h
@@ -46,6 +46,7 @@
#include
#include
#include
+#include
#include
// Option for main frames
@@ -100,7 +101,7 @@ enum id_librarytype {
* and that class is not a player.
*
*/
-class EDA_BASE_FRAME : public wxFrame, public KIWAY_HOLDER
+class EDA_BASE_FRAME : public wxFrame, public TOOLS_HOLDER, public KIWAY_HOLDER
{
/**
* (with its unexpected name so it does not collide with the real OnWindowClose()
@@ -124,35 +125,21 @@ protected:
wxString m_AboutTitle; // Name of program displayed in About.
wxAuiManager m_auimgr;
+ wxString m_perspective; // wxAuiManager perspective.
wxString m_configName; // Prefix used to identify some params (frame size...)
// and to name some config files (legacy hotkey files)
SETTINGS_MANAGER* m_settingsManager;
- TOOL_MANAGER* m_toolManager;
- ACTIONS* m_actions;
-
- std::vector m_toolStack; // Stack of user-level "tools". Not to be confused
- // with TOOL_BASE-derived instances, many of which
- // implement multiple user-level "tools". The user-
- // level "tools" are TOOL_ACTIONSs internally.
-
- bool m_immediateActions; // Preference for immediate actions. If false, the
- // first invocation of a hotkey will just select the
- // relevant tool.
- bool m_dragSelects; // Prefer selection to dragging.
- bool m_moveWarpsCursor; // cursor is warped to move/drag origin
bool m_hasAutoSave;
bool m_autoSaveState;
int m_autoSaveInterval; // The auto save interval time in seconds.
wxTimer* m_autoSaveTimer;
- wxString m_perspective; // wxAuiManager perspective.
-
wxString m_mruPath; // Most recently used path.
- EDA_UNITS m_userUnits;
+ EDA_UNITS m_userUnits;
///> Default style flags used for wxAUI toolbars
static constexpr int KICAD_AUI_TB_STYLE = wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_PLAIN_BACKGROUND;
@@ -232,44 +219,6 @@ public:
virtual int GetSeverity( int aErrorCode ) const { return RPT_SEVERITY_UNDEFINED; }
- /**
- * Return the MVC controller.
- */
- TOOL_MANAGER* GetToolManager() const { return m_toolManager; }
-
- /**
- * NB: the definition of "tool" is different at the user level. The implementation uses
- * a single TOOL_BASE derived class to implement several user "tools", such as rectangle
- * and circle, or wire and bus. So each user-level tool is actually a TOOL_ACTION.
- */
- virtual void PushTool( const std::string& actionName );
- virtual void PopTool( const std::string& actionName );
-
- bool ToolStackIsEmpty() { return m_toolStack.empty(); }
-
- std::string CurrentToolName() const;
- bool IsCurrentTool( const TOOL_ACTION& aAction ) const;
-
- virtual void DisplayToolMsg( const wxString& msg ) {};
-
- /**
- * Indicates that hotkeys should perform an immediate action even if another tool is
- * currently active. If false, the first hotkey should select the relevant tool.
- */
- bool GetDoImmediateActions() const { return m_immediateActions; }
-
- /**
- * Indicates that a drag should draw a selection rectangle, even when started over an
- * item.
- */
- bool GetDragSelects() const { return m_dragSelects; }
-
- /**
- * Indicates that a move operation should warp the mouse pointer to the origin of the
- * move object. This improves snapping, but some users are alergic to mouse warping.
- */
- bool GetMoveWarpsCursor() const { return m_moveWarpsCursor; }
-
/**
* Override the default process event handler to implement the auto save feature.
*
@@ -288,10 +237,10 @@ public:
virtual void OnCharHook( wxKeyEvent& event );
/**
- * Workaround some issues in wxWidgets where the menu events aren't captured by the
- * menus themselves.
+ * The TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu
+ * events aren't captured by the menus themselves.
*/
- void OnMenuOpen( wxMenuEvent& event );
+ void OnMenuEvent( wxMenuEvent& event );
virtual void OnMove( wxMoveEvent& aEvent )
{
@@ -376,7 +325,7 @@ public:
* modes in which case the m_configName must be set to the base name so that a single
* config can be used.
*/
- wxString ConfigBaseName()
+ wxString ConfigBaseName() override
{
wxString baseCfgName = m_configName.IsEmpty() ? GetName() : m_configName;
return baseCfgName;
@@ -507,12 +456,7 @@ public:
* Notification event that some of the common (suite-wide) settings have changed.
* Update menus, toolbars, local variables, etc.
*/
- virtual void CommonSettingsChanged( bool aEnvVarsChanged );
-
- /**
- * Notification to refresh the drawing canvas (if any).
- */
- virtual void RefreshCanvas() { };
+ void CommonSettingsChanged( bool aEnvVarsChanged ) override;
const wxString& GetAboutTitle() const { return m_AboutTitle; }
diff --git a/include/eda_draw_frame.h b/include/eda_draw_frame.h
index fd50930b8d..a282ccc3ee 100644
--- a/include/eda_draw_frame.h
+++ b/include/eda_draw_frame.h
@@ -470,6 +470,8 @@ public:
virtual EDA_DRAW_PANEL_GAL* GetCanvas() const { return m_canvas; }
void SetCanvas( EDA_DRAW_PANEL_GAL* aPanel ) { m_canvas = aPanel; }
+ wxWindow* GetToolCanvas() const override { return GetCanvas(); }
+
/**
* Return a reference to the gal rendering options used by GAL for rendering.
*/
diff --git a/include/tool/action_toolbar.h b/include/tool/action_toolbar.h
index 6be31170ed..a74291d531 100644
--- a/include/tool/action_toolbar.h
+++ b/include/tool/action_toolbar.h
@@ -29,7 +29,7 @@
#include
#include
-class EDA_DRAW_FRAME;
+class EDA_BASE_FRAME;
class TOOL_MANAGER;
class TOOL_ACTION;
diff --git a/include/tool/tool_base.h b/include/tool/tool_base.h
index c6fcf3a45e..5d5483ff60 100644
--- a/include/tool/tool_base.h
+++ b/include/tool/tool_base.h
@@ -35,6 +35,7 @@
class EDA_ITEM;
class TOOL_MANAGER;
+class TOOLS_HOLDER;
namespace KIGFX
{
@@ -186,9 +187,9 @@ protected:
T* getEditFrame() const
{
#if !defined( QA_TEST ) // Dynamic casts give the linker a siezure in the test framework
- wxASSERT( dynamic_cast( getEditFrameInt() ) );
+ wxASSERT( dynamic_cast( getToolHolderInt() ) );
#endif
- return static_cast( getEditFrameInt() );
+ return static_cast( getToolHolderInt() );
}
/**
@@ -222,7 +223,7 @@ private:
// hide the implementation to avoid spreading half of
// kicad and wxWidgets headers to the tools that may not need them at all!
EDA_ITEM* getModelInt() const;
- EDA_BASE_FRAME* getEditFrameInt() const;
+ TOOLS_HOLDER* getToolHolderInt() const;
};
#endif
diff --git a/include/tool/tool_manager.h b/include/tool/tool_manager.h
index c24650c407..1349c58d0c 100644
--- a/include/tool/tool_manager.h
+++ b/include/tool/tool_manager.h
@@ -34,10 +34,10 @@
#include
#include
+class TOOLS_HOLDER;
class TOOL_BASE;
class ACTION_MANAGER;
class ACTION_MENU;
-class EDA_BASE_FRAME;
/**
@@ -274,7 +274,7 @@ public:
* These are made available to the tool. Called by the parent frame when it is set up.
*/
void SetEnvironment( EDA_ITEM* aModel, KIGFX::VIEW* aView,
- KIGFX::VIEW_CONTROLS* aViewControls, EDA_BASE_FRAME* aFrame );
+ KIGFX::VIEW_CONTROLS* aViewControls, TOOLS_HOLDER* aFrame );
/* Accessors for the environment objects (view, model, etc.) */
KIGFX::VIEW* GetView() const
@@ -295,10 +295,7 @@ public:
return m_model;
}
- inline EDA_BASE_FRAME* GetEditFrame() const
- {
- return m_frame;
- }
+ inline TOOLS_HOLDER* GetToolHolder() const { return m_frame; }
/**
* Returns id of the tool that is on the top of the active tools stack
@@ -561,10 +558,10 @@ private:
/// Original cursor position, if overridden by the context menu handler
std::map> m_cursorSettings;
- EDA_ITEM* m_model;
- KIGFX::VIEW* m_view;
+ EDA_ITEM* m_model;
+ KIGFX::VIEW* m_view;
KIGFX::VIEW_CONTROLS* m_viewControls;
- EDA_BASE_FRAME* m_frame;
+ TOOLS_HOLDER* m_frame;
/// Queue that stores events to be processed at the end of the event processing cycle.
std::list m_eventQueue;
diff --git a/include/tools_holder.h b/include/tools_holder.h
new file mode 100644
index 0000000000..699d961e41
--- /dev/null
+++ b/include/tools_holder.h
@@ -0,0 +1,112 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef TOOL_HOLDER_H
+#define TOOL_HOLDER_H
+
+#include
+#include
+#include
+#include
+
+
+class TOOL_MANAGER;
+class TOOL_DISPATCHER;
+class ACTIONS;
+
+
+class TOOLS_HOLDER
+{
+protected:
+ TOOL_MANAGER* m_toolManager;
+ ACTIONS* m_actions;
+ TOOL_DISPATCHER* m_toolDispatcher;
+
+ std::vector m_toolStack; // Stack of user-level "tools". Not to be confused
+ // with TOOL_BASE-derived instances, many of which
+ // implement multiple user-level "tools". The user-
+ // level "tools" are TOOL_ACTIONSs internally.
+
+ bool m_immediateActions; // Preference for immediate actions. If false, the
+ // first invocation of a hotkey will just select the
+ // relevant tool.
+ bool m_dragSelects; // Prefer selection to dragging.
+ bool m_moveWarpsCursor; // cursor is warped to move/drag origin
+
+public:
+ TOOLS_HOLDER();
+
+ /**
+ * Return the MVC controller.
+ */
+ TOOL_MANAGER* GetToolManager() const { return m_toolManager; }
+
+ /**
+ * NB: the definition of "tool" is different at the user level. The implementation uses
+ * a single TOOL_BASE derived class to implement several user "tools", such as rectangle
+ * and circle, or wire and bus. So each user-level tool is actually a TOOL_ACTION.
+ */
+ virtual void PushTool( const std::string& actionName );
+ virtual void PopTool( const std::string& actionName );
+
+ bool ToolStackIsEmpty() { return m_toolStack.empty(); }
+
+ std::string CurrentToolName() const;
+ bool IsCurrentTool( const TOOL_ACTION& aAction ) const;
+
+ virtual void DisplayToolMsg( const wxString& msg ) {};
+
+ /**
+ * Indicates that hotkeys should perform an immediate action even if another tool is
+ * currently active. If false, the first hotkey should select the relevant tool.
+ */
+ bool GetDoImmediateActions() const { return m_immediateActions; }
+
+ /**
+ * Indicates that a drag should draw a selection rectangle, even when started over an
+ * item.
+ */
+ bool GetDragSelects() const { return m_dragSelects; }
+
+ /**
+ * Indicates that a move operation should warp the mouse pointer to the origin of the
+ * move object. This improves snapping, but some users are alergic to mouse warping.
+ */
+ bool GetMoveWarpsCursor() const { return m_moveWarpsCursor; }
+
+ /**
+ * Notification event that some of the common (suite-wide) settings have changed.
+ * Update hotkeys, preferences, etc.
+ */
+ virtual void CommonSettingsChanged( bool aEnvVarsChanged );
+
+ /**
+ * Canvas access.
+ */
+ virtual wxWindow* GetToolCanvas() const = 0;
+ virtual void RefreshCanvas() { }
+
+ virtual wxString ConfigBaseName() { return wxEmptyString; }
+};
+
+#endif // TOOL_HOLDER_H
diff --git a/kicad/kicad_manager_frame.cpp b/kicad/kicad_manager_frame.cpp
index b63ae4c856..0135da5222 100644
--- a/kicad/kicad_manager_frame.cpp
+++ b/kicad/kicad_manager_frame.cpp
@@ -179,6 +179,12 @@ KICAD_MANAGER_FRAME::~KICAD_MANAGER_FRAME()
}
+wxWindow* KICAD_MANAGER_FRAME::GetToolCanvas() const
+{
+ return m_leftWin;
+}
+
+
APP_SETTINGS_BASE* KICAD_MANAGER_FRAME::config()
{
APP_SETTINGS_BASE* ret = PgmTop().PgmSettings();
diff --git a/kicad/kicad_manager_frame.h b/kicad/kicad_manager_frame.h
index 60b3ad0e2c..a83a45a328 100644
--- a/kicad/kicad_manager_frame.h
+++ b/kicad/kicad_manager_frame.h
@@ -161,6 +161,8 @@ public:
void ReCreateTreePrj();
+ wxWindow* GetToolCanvas() const override;
+
DECLARE_EVENT_TABLE()
private:
diff --git a/pcb_calculator/pcb_calculator.h b/pcb_calculator/pcb_calculator.h
index 6ee32e1e92..aa08e3270a 100644
--- a/pcb_calculator/pcb_calculator.h
+++ b/pcb_calculator/pcb_calculator.h
@@ -379,6 +379,8 @@ public:
void OnBoardClassesUnitsSelection( wxCommandEvent& event ) override;
void BoardClassesUpdateData( double aUnitScale );
+ // Calculator doesn't host a tool framework
+ wxWindow* GetToolCanvas() const override { return nullptr; }
};
diff --git a/pcbnew/board_commit.cpp b/pcbnew/board_commit.cpp
index e2093a7ad2..047829690a 100644
--- a/pcbnew/board_commit.cpp
+++ b/pcbnew/board_commit.cpp
@@ -87,7 +87,7 @@ void BOARD_COMMIT::Push( const wxString& aMessage, bool aCreateUndoEntry, bool a
PICKED_ITEMS_LIST undoList;
KIGFX::VIEW* view = m_toolMgr->GetView();
BOARD* board = (BOARD*) m_toolMgr->GetModel();
- PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) m_toolMgr->GetEditFrame();
+ PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) m_toolMgr->GetToolHolder();
auto connectivity = board->GetConnectivity();
std::set savedModules;
SELECTION_TOOL* selTool = m_toolMgr->GetTool();
diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_BoardEditor.cpp b/pcbnew/dialogs/dialog_edit_footprint_for_BoardEditor.cpp
index 8035c94196..f6b657fc7f 100644
--- a/pcbnew/dialogs/dialog_edit_footprint_for_BoardEditor.cpp
+++ b/pcbnew/dialogs/dialog_edit_footprint_for_BoardEditor.cpp
@@ -44,7 +44,7 @@
#include
#include "3d_cache/dialogs/3d_cache_dialogs.h"
-#include "3d_cache/dialogs/panel_prev_model.h"
+#include "3d_cache/dialogs/panel_prev_3d.h"
#include
diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp
index 6d7e76ee06..6ee1570f59 100644
--- a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp
+++ b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp
@@ -43,7 +43,7 @@
#include
#include "filename_resolver.h"
#include
-#include "3d_cache/dialogs/panel_prev_model.h"
+#include "3d_cache/dialogs/panel_prev_3d.h"
#include "3d_cache/dialogs/3d_cache_dialogs.h"
#include
diff --git a/pcbnew/dialogs/dialog_position_relative.cpp b/pcbnew/dialogs/dialog_position_relative.cpp
index 9534f85daf..cea5f9f512 100644
--- a/pcbnew/dialogs/dialog_position_relative.cpp
+++ b/pcbnew/dialogs/dialog_position_relative.cpp
@@ -237,7 +237,7 @@ void DIALOG_POSITION_RELATIVE::OnUseGridOriginClick( wxCommandEvent& event )
void DIALOG_POSITION_RELATIVE::OnUseUserOriginClick( wxCommandEvent& event )
{
- PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) m_toolMgr->GetEditFrame();
+ PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) m_toolMgr->GetToolHolder();
m_anchor_position = (wxPoint) frame->GetScreen()->m_LocalOrigin;
m_referenceInfo->SetLabel( _( "Reference location: local coordinates origin" ) );