Browse Source
Push tool framework base down into TOOL_HOLDER.
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.)pull/16/head
54 changed files with 1069 additions and 973 deletions
-
1073d-viewer/3d_cache/dialogs/panel_prev_3d.cpp
-
213d-viewer/3d_cache/dialogs/panel_prev_3d.h
-
663d-viewer/3d_canvas/3d_settings.cpp
-
653d-viewer/3d_canvas/3d_settings.h
-
863d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp
-
1733d-viewer/3d_canvas/create_layer_items.cpp
-
283d-viewer/3d_canvas/create_layer_poly.cpp
-
73d-viewer/3d_canvas/eda_3d_canvas.cpp
-
63d-viewer/3d_canvas/eda_3d_canvas.h
-
23d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
-
23d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.h
-
23d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
-
23d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.h
-
23d-viewer/3d_rendering/c3d_render_base.cpp
-
63d-viewer/3d_rendering/c3d_render_base.h
-
723d-viewer/3d_viewer/dialogs/dialog_3D_view_option.cpp
-
193d-viewer/3d_viewer/eda_3d_viewer.cpp
-
123d-viewer/3d_viewer/eda_3d_viewer.h
-
3273d-viewer/3d_viewer/tools/3d_controller.cpp
-
223d-viewer/3d_viewer/tools/3d_controller.h
-
3183d-viewer/3d_viewer/tools/3d_viewer_control.cpp
-
83d-viewer/CMakeLists.txt
-
15bitmap2component/bitmap2cmp_gui.cpp
-
41bitmap2component/bitmap2cmp_gui.h
-
1common/CMakeLists.txt
-
8common/bitmap.cpp
-
143common/eda_base_frame.cpp
-
2common/lib_tree_model_adapter.h
-
4common/tool/action_manager.cpp
-
2common/tool/action_menu.cpp
-
12common/tool/action_toolbar.cpp
-
4common/tool/tool_base.cpp
-
56common/tool/tool_dispatcher.cpp
-
17common/tool/tool_manager.cpp
-
128common/tools_holder.cpp
-
8cvpcb/cvpcb_mainframe.cpp
-
4cvpcb/cvpcb_mainframe.h
-
3eeschema/sim/sim_plot_frame.h
-
2eeschema/tools/sch_editor_control.cpp
-
2eeschema/tools/sch_line_wire_bus_tool.cpp
-
7include/bitmap_types.h
-
74include/eda_base_frame.h
-
2include/eda_draw_frame.h
-
2include/tool/action_toolbar.h
-
7include/tool/tool_base.h
-
15include/tool/tool_manager.h
-
112include/tools_holder.h
-
6kicad/kicad_manager_frame.cpp
-
2kicad/kicad_manager_frame.h
-
2pcb_calculator/pcb_calculator.h
-
2pcbnew/board_commit.cpp
-
2pcbnew/dialogs/dialog_edit_footprint_for_BoardEditor.cpp
-
2pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp
-
2pcbnew/dialogs/dialog_position_relative.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 <tool/actions.h>
|
|||
#include <tool/tool_manager.h>
|
|||
#include <eda_3d_canvas.h>
|
|||
#include <eda_3d_viewer.h>
|
|||
#include <id.h>
|
|||
#include <kiface_i.h>
|
|||
#include <3d_viewer_id.h>
|
|||
#include <tools/3d_controller.h>
|
|||
#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<EDA_3D_CANVAS*>( holder->GetToolCanvas() ); |
|||
m_settings = dynamic_cast<EDA_3D_SETTINGS_HOLDER*>( holder )->GetSettings(); |
|||
} |
|||
|
|||
|
|||
int EDA_3D_CONTROLLER::UpdateMenu( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>(); |
|||
CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( 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<intptr_t>() ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int EDA_3D_CONTROLLER::PanControl( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
switch( aEvent.Parameter<intptr_t>() ) |
|||
{ |
|||
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<intptr_t>() ) |
|||
{ |
|||
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<DISPLAY3D_FLG>(); |
|||
|
|||
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<EDA_3D_VIEWER*>( 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<GRID3D_TYPE>(); |
|||
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() ); |
|||
} |
|||
|
|||
|
|||
@ -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 <tool/actions.h>
|
|||
#include <tool/tool_manager.h>
|
|||
#include <eda_3d_viewer.h>
|
|||
#include <id.h>
|
|||
#include <kiface_i.h>
|
|||
#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<EDA_3D_VIEWER>(); |
|||
} |
|||
|
|||
|
|||
int EDA_3D_VIEWER_CONTROL::UpdateMenu( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
ACTION_MENU* actionMenu = aEvent.Parameter<ACTION_MENU*>(); |
|||
CONDITIONAL_MENU* conditionalMenu = dynamic_cast<CONDITIONAL_MENU*>( 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<intptr_t>() ); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int EDA_3D_VIEWER_CONTROL::PanControl( const TOOL_EVENT& aEvent ) |
|||
{ |
|||
switch( aEvent.Parameter<intptr_t>() ) |
|||
{ |
|||
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<intptr_t>() ) |
|||
{ |
|||
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<DISPLAY3D_FLG>(); |
|||
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<GRID3D_TYPE>(); |
|||
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() ); |
|||
} |
|||
|
|||
|
|||
@ -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 <pgm_base.h>
|
|||
#include <settings/common_settings.h>
|
|||
#include <tool/action_manager.h>
|
|||
#include <tool/action_menu.h>
|
|||
#include <tool/actions.h>
|
|||
#include <tool/tool_manager.h>
|
|||
#include <tools_holder.h>
|
|||
|
|||
|
|||
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; |
|||
} |
|||
|
|||
@ -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 <vector> |
|||
#include <fctsys.h> |
|||
#include <common.h> |
|||
#include <tool/tool_action.h> |
|||
|
|||
|
|||
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<std::string> 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 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue