diff --git a/cvpcb/CMakeLists.txt b/cvpcb/CMakeLists.txt index 534e284432..14236f8ec6 100644 --- a/cvpcb/CMakeLists.txt +++ b/cvpcb/CMakeLists.txt @@ -34,6 +34,7 @@ set( CVPCB_SRCS ../pcbnew/board_items_to_polygon_shape_transform.cpp ../pcbnew/pcb_general_settings.cpp ../pcbnew/drc_item.cpp + ../pcbnew/tools/grid_helper.cpp auto_associate.cpp cfg.cpp components_listbox.cpp @@ -45,6 +46,9 @@ set( CVPCB_SRCS menubar.cpp readwrite_dlgs.cpp tool_cvpcb.cpp + tools/cvpcb_actions.cpp + tools/cvpcb_control.cpp + tools/cvpcb_selection_tool.cpp ) diff --git a/cvpcb/cvpcb_id.h b/cvpcb/cvpcb_id.h index 987bed3129..b1c8bb6bb2 100644 --- a/cvpcb/cvpcb_id.h +++ b/cvpcb/cvpcb_id.h @@ -55,5 +55,6 @@ enum id_cvpcb_frm ID_CVPCB_LIBRARY_LIST, ID_CVPCB_EQUFILES_LIST_EDIT, ID_CVPCB_LIB_TABLE_EDIT, - ID_CVPCB_FILTER_TEXT_EDIT + ID_CVPCB_FILTER_TEXT_EDIT, + ID_TB_MEASUREMENT_TOOL }; diff --git a/cvpcb/cvpcb_mainframe.cpp b/cvpcb/cvpcb_mainframe.cpp index 86cb7925dc..2223914010 100644 --- a/cvpcb/cvpcb_mainframe.cpp +++ b/cvpcb/cvpcb_mainframe.cpp @@ -968,7 +968,7 @@ void CVPCB_MAINFRAME::KiwayMailIn( KIWAY_EXPRESS& mail ) { const std::string& payload = mail.GetPayload(); - DBG(printf( "%s: %s\n", __func__, payload.c_str() );) + //DBG(printf( "%s: %s\n", __func__, payload.c_str() );) switch( mail.Command() ) { diff --git a/cvpcb/dialogs/dialog_display_options.cpp b/cvpcb/dialogs/dialog_display_options.cpp index e04cc0ec71..7f8e32d568 100644 --- a/cvpcb/dialogs/dialog_display_options.cpp +++ b/cvpcb/dialogs/dialog_display_options.cpp @@ -39,23 +39,21 @@ void DISPLAY_FOOTPRINTS_FRAME::InstallOptionsDisplay( wxCommandEvent& event ) { - DIALOG_FOOTPRINTS_DISPLAY_OPTIONS* OptionWindow = - new DIALOG_FOOTPRINTS_DISPLAY_OPTIONS( this ); + DIALOG_FOOTPRINTS_DISPLAY_OPTIONS OptionWindow( this ); - OptionWindow->ShowModal(); - OptionWindow->Destroy(); + OptionWindow.ShowModal(); } -DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::DIALOG_FOOTPRINTS_DISPLAY_OPTIONS( PCB_BASE_FRAME* parent ) +DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::DIALOG_FOOTPRINTS_DISPLAY_OPTIONS( DISPLAY_FOOTPRINTS_FRAME* parent ) : DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE( parent ) { m_Parent = parent; initDialog(); - m_sdbSizer1OK->SetDefault(); - GetSizer()->SetSizeHints( this ); - Centre(); + m_sdbSizerOK->SetDefault(); + + FinishDialogSettings();; } DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::~DIALOG_FOOTPRINTS_DISPLAY_OPTIONS( ) @@ -103,35 +101,18 @@ void DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::UpdateObjectSettings( void ) m_Parent->GetCanvas()->SetEnableMousewheelPan( m_enableMousewheelPan->GetValue() ); m_Parent->GetCanvas()->SetEnableAutoPan( m_enableAutoPan->GetValue() ); + m_Parent->applyDisplaySettingsToGAL(); m_Parent->GetCanvas()->Refresh(); } -/*! - * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK - */ - -void DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::OnOkClick( wxCommandEvent& event ) +bool DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::TransferDataFromWindow() { UpdateObjectSettings(); - EndModal( 1 ); + return true; } -/*! - * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL - */ - -void DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::OnCancelClick( wxCommandEvent& event ) -{ - EndModal( -1 ); -} - - -/*! - * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_APPLY - */ - void DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::OnApplyClick( wxCommandEvent& event ) { UpdateObjectSettings(); diff --git a/cvpcb/dialogs/dialog_display_options.h b/cvpcb/dialogs/dialog_display_options.h index 92fb8468fe..a902b5d653 100644 --- a/cvpcb/dialogs/dialog_display_options.h +++ b/cvpcb/dialogs/dialog_display_options.h @@ -39,19 +39,18 @@ class DIALOG_FOOTPRINTS_DISPLAY_OPTIONS : public DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE { private: -PCB_BASE_FRAME * m_Parent; + DISPLAY_FOOTPRINTS_FRAME * m_Parent; public: - DIALOG_FOOTPRINTS_DISPLAY_OPTIONS( PCB_BASE_FRAME* parent ); + DIALOG_FOOTPRINTS_DISPLAY_OPTIONS( DISPLAY_FOOTPRINTS_FRAME* parent ); ~DIALOG_FOOTPRINTS_DISPLAY_OPTIONS(); private: - void initDialog( ); + void initDialog(); void UpdateObjectSettings( void ); void OnApplyClick( wxCommandEvent& event ) override; - void OnCancelClick( wxCommandEvent& event ) override; - void OnOkClick( wxCommandEvent& event ) override; + bool TransferDataFromWindow() override; }; #endif // _DIALOG_DISPLAY_OPTIONS_H_ diff --git a/cvpcb/dialogs/dialog_display_options_base.cpp b/cvpcb/dialogs/dialog_display_options_base.cpp index b74e4fcc9a..e29059ae6d 100644 --- a/cvpcb/dialogs/dialog_display_options_base.cpp +++ b/cvpcb/dialogs/dialog_display_options_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 19 2018) +// C++ code generated with wxFormBuilder (version Jul 11 2018) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -64,16 +64,16 @@ DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE( m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerMain->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); - m_sdbSizer1 = new wxStdDialogButtonSizer(); - m_sdbSizer1OK = new wxButton( this, wxID_OK ); - m_sdbSizer1->AddButton( m_sdbSizer1OK ); - m_sdbSizer1Apply = new wxButton( this, wxID_APPLY ); - m_sdbSizer1->AddButton( m_sdbSizer1Apply ); - m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL ); - m_sdbSizer1->AddButton( m_sdbSizer1Cancel ); - m_sdbSizer1->Realize(); + m_sdbSizer = new wxStdDialogButtonSizer(); + m_sdbSizerOK = new wxButton( this, wxID_OK ); + m_sdbSizer->AddButton( m_sdbSizerOK ); + m_sdbSizerApply = new wxButton( this, wxID_APPLY ); + m_sdbSizer->AddButton( m_sdbSizerApply ); + m_sdbSizerCancel = new wxButton( this, wxID_CANCEL ); + m_sdbSizer->AddButton( m_sdbSizerCancel ); + m_sdbSizer->Realize(); - bSizerMain->Add( m_sdbSizer1, 0, wxEXPAND|wxALL, 5 ); + bSizerMain->Add( m_sdbSizer, 0, wxEXPAND|wxALL, 5 ); this->SetSizer( bSizerMain ); @@ -81,16 +81,12 @@ DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE( bSizerMain->Fit( this ); // Connect Events - m_sdbSizer1Apply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnApplyClick ), NULL, this ); - m_sdbSizer1Cancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnCancelClick ), NULL, this ); - m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnOkClick ), NULL, this ); + m_sdbSizerApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnApplyClick ), NULL, this ); } DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::~DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE() { // Disconnect Events - m_sdbSizer1Apply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnApplyClick ), NULL, this ); - m_sdbSizer1Cancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnCancelClick ), NULL, this ); - m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnOkClick ), NULL, this ); + m_sdbSizerApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::OnApplyClick ), NULL, this ); } diff --git a/cvpcb/dialogs/dialog_display_options_base.fbp b/cvpcb/dialogs/dialog_display_options_base.fbp index d75602890d..fb1844fa09 100644 --- a/cvpcb/dialogs/dialog_display_options_base.fbp +++ b/cvpcb/dialogs/dialog_display_options_base.fbp @@ -1,6 +1,6 @@ - + C++ @@ -55,13 +55,20 @@ - + + + + + + + + @@ -76,17 +83,23 @@ + + + + + + @@ -178,7 +191,14 @@ + + + + + + + @@ -266,7 +286,14 @@ + + + + + + + @@ -354,7 +381,14 @@ + + + + + + + @@ -442,7 +476,14 @@ + + + + + + + @@ -545,7 +586,14 @@ + + + + + + + @@ -633,7 +681,14 @@ + + + + + + + @@ -721,7 +776,14 @@ + + + + + + + @@ -807,7 +869,14 @@ + + + + + + + @@ -846,14 +915,14 @@ 0 0 - m_sdbSizer1 + m_sdbSizer protected OnApplyClick - OnCancelClick + - OnOkClick + diff --git a/cvpcb/dialogs/dialog_display_options_base.h b/cvpcb/dialogs/dialog_display_options_base.h index c992dd2f48..88fb332b50 100644 --- a/cvpcb/dialogs/dialog_display_options_base.h +++ b/cvpcb/dialogs/dialog_display_options_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 19 2018) +// C++ code generated with wxFormBuilder (version Jul 11 2018) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -44,15 +44,13 @@ class DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE : public DIALOG_SHIM wxCheckBox* m_enableMousewheelPan; wxCheckBox* m_enableAutoPan; wxStaticLine* m_staticline1; - wxStdDialogButtonSizer* m_sdbSizer1; - wxButton* m_sdbSizer1OK; - wxButton* m_sdbSizer1Apply; - wxButton* m_sdbSizer1Cancel; + wxStdDialogButtonSizer* m_sdbSizer; + wxButton* m_sdbSizerOK; + wxButton* m_sdbSizerApply; + wxButton* m_sdbSizerCancel; // Virtual event handlers, overide them in your derived class virtual void OnApplyClick( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); } public: diff --git a/cvpcb/display_footprints_frame.cpp b/cvpcb/display_footprints_frame.cpp index db8f92a358..f964bd7479 100644 --- a/cvpcb/display_footprints_frame.cpp +++ b/cvpcb/display_footprints_frame.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2015 Wayne Stambaugh * Copyright (C) 2007-2018 KiCad Developers, see AUTHORS.txt for contributors. * @@ -29,8 +29,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -42,6 +44,7 @@ #include #include #include +#include #include #include @@ -49,6 +52,12 @@ #include #include <3d_viewer/eda_3d_viewer.h> +#include + +#include +#include +#include +#include "tools/cvpcb_actions.h" // Colors for layers and items COLORS_DESIGN_SETTINGS g_ColorsSettings( FRAME_CVPCB_DISPLAY ); @@ -56,19 +65,16 @@ COLORS_DESIGN_SETTINGS g_ColorsSettings( FRAME_CVPCB_DISPLAY ); BEGIN_EVENT_TABLE( DISPLAY_FOOTPRINTS_FRAME, PCB_BASE_FRAME ) EVT_CLOSE( DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow ) - EVT_SIZE( DISPLAY_FOOTPRINTS_FRAME::OnSize ) EVT_TOOL( ID_OPTIONS_SETUP, DISPLAY_FOOTPRINTS_FRAME::InstallOptionsDisplay ) EVT_TOOL( ID_CVPCB_SHOW3D_FRAME, DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame ) - EVT_TOOL( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, - DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar) - EVT_TOOL( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, - DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar) - - EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, - DISPLAY_FOOTPRINTS_FRAME::OnUpdateTextDrawMode ) - EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, - DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode ) + /* + EVT_TOOL and EVT_UPDATE_UI for: + ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, + ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, + ID_TB_OPTIONS_SHOW_PADS_SKETCH + are managed in PCB_BASE_FRAME + */ END_EVENT_TABLE() @@ -107,6 +113,13 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa ReCreateVToolbar(); ReCreateOptToolbar(); + // Create GAL canvas + EDA_DRAW_PANEL_GAL::GAL_TYPE backend = EDA_DRAW_PANEL_GAL::GAL_TYPE_CAIRO; + //EDA_DRAW_PANEL_GAL::GAL_TYPE backend = EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE; + PCB_DRAW_PANEL_GAL* gal_drawPanel = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_FrameSize, + GetGalDisplayOptions(), backend ); + SetGalCanvas( gal_drawPanel ); + m_auimgr.SetManagedWindow( this ); EDA_PANEINFO horiz; @@ -125,8 +138,13 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa m_auimgr.AddPane( m_drawToolBar, wxAuiPaneInfo( vert ).Name( wxT( "m_drawToolBar" ) ).Right() ); - m_auimgr.AddPane( m_canvas, - wxAuiPaneInfo().Name( wxT( "DisplayFrame" ) ).CentrePane() ); + if( m_canvas ) + m_auimgr.AddPane( m_canvas, + wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() ); + + if( GetGalCanvas() ) + m_auimgr.AddPane( (wxWindow*) GetGalCanvas(), + wxAuiPaneInfo().Name( wxT( "DrawFrameGal" ) ).CentrePane().Hide() ); m_auimgr.AddPane( m_messagePanel, wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom().Layer(10) ); @@ -136,12 +154,38 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa m_auimgr.Update(); + // Create the manager and dispatcher & route draw panel events to the dispatcher + m_toolManager = new TOOL_MANAGER; + m_toolManager->SetEnvironment( GetBoard(), gal_drawPanel->GetView(), + gal_drawPanel->GetViewControls(), this ); + m_actions = new CVPCB_ACTIONS(); + m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager, m_actions ); + gal_drawPanel->SetEventDispatcher( m_toolDispatcher ); + + m_actions->RegisterAllTools( m_toolManager ); + m_toolManager->InitTools(); + + // Run the control tool, it is supposed to be always active + m_toolManager->InvokeTool( "cvpcb.InteractiveSelection" ); + + auto& galOpts = GetGalDisplayOptions(); + galOpts.m_fullscreenCursor = true; + galOpts.m_forceDisplayCursor = true; + galOpts.m_axesEnabled = true; + + UseGalCanvas( backend != EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE ); + updateView(); + + Show( true ); } DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME() { + if( IsGalCanvasActive() ) + GetGalCanvas()->StopDrawing(); + delete GetScreen(); SetScreen( NULL ); // Be sure there is no double deletion } @@ -248,31 +292,20 @@ void DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar() } -void DISPLAY_FOOTPRINTS_FRAME::OnUpdateTextDrawMode( wxUpdateUIEvent& aEvent ) +void DISPLAY_FOOTPRINTS_FRAME::UseGalCanvas( bool aEnable ) { - auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); - - wxString msgTextsFill[2] = { _( "Show texts in filled mode" ), - _( "Show texts in sketch mode" ) }; - - unsigned i = displ_opts->m_DisplayModTextFill == SKETCH ? 0 : 1; - - aEvent.Check( displ_opts->m_DisplayModTextFill == SKETCH ); - m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, msgTextsFill[i] ); + PCB_BASE_FRAME::UseGalCanvas( aEnable ); } -void DISPLAY_FOOTPRINTS_FRAME::OnUpdateLineDrawMode( wxUpdateUIEvent& aEvent ) +void DISPLAY_FOOTPRINTS_FRAME::applyDisplaySettingsToGAL() { - auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); + auto view = GetGalCanvas()->GetView(); + auto painter = static_cast( view->GetPainter() ); + KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings(); + settings->LoadDisplayOptions( &m_DisplayOptions, false ); - wxString msgEdgesFill[2] = { _( "Show outlines in filled mode" ), - _( "Show outlines in sketch mode" ) }; - - int i = displ_opts->m_DisplayModEdgeFill == SKETCH ? 0 : 1; - - aEvent.Check( displ_opts->m_DisplayModEdgeFill == SKETCH ); - m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, msgEdgesFill[i] ); + view->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); } @@ -292,31 +325,6 @@ bool DISPLAY_FOOTPRINTS_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* Po } -void DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) -{ - int id = event.GetId(); - auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); - - switch( id ) - { - case ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH: - displ_opts->m_DisplayModTextFill = displ_opts->m_DisplayModTextFill == FILLED ? SKETCH : FILLED; - m_canvas->Refresh( ); - break; - - case ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH: - displ_opts->m_DisplayModEdgeFill = displ_opts->m_DisplayModEdgeFill == FILLED ? SKETCH : FILLED; - m_canvas->Refresh(); - break; - - default: - DisplayError( this, - wxT( "DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar error" ) ); - break; - } -} - - bool DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey ) { @@ -500,6 +508,8 @@ void DISPLAY_FOOTPRINTS_FRAME::InitDisplay() else SetStatusText( wxEmptyString, 0 ); + updateView(); + UpdateStatusBar(); Zoom_Automatique( false ); GetCanvas()->Refresh(); @@ -507,6 +517,34 @@ void DISPLAY_FOOTPRINTS_FRAME::InitDisplay() } +void DISPLAY_FOOTPRINTS_FRAME::updateView() +{ + if( IsGalCanvasActive() ) + { + PCB_DRAW_PANEL_GAL* dp = static_cast( GetGalCanvas() ); + dp->UseColorScheme( &Settings().Colors() ); + dp->DisplayBoard( GetBoard() ); + m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD ); + m_toolManager->RunAction( ACTIONS::zoomFitScreen, true ); + UpdateMsgPanel(); + } +} + + +void DISPLAY_FOOTPRINTS_FRAME::UpdateMsgPanel() +{ + MODULE* footprint = GetBoard()->m_Modules; + MSG_PANEL_ITEMS items; + + if( footprint ) + { + footprint->GetMsgPanelInfo( m_UserUnits, items ); + } + + SetMsgPanel( items ); +} + + void DISPLAY_FOOTPRINTS_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) { if( !GetBoard() ) @@ -515,14 +553,7 @@ void DISPLAY_FOOTPRINTS_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) m_canvas->DrawBackGround( DC ); GetBoard()->Draw( m_canvas, DC, GR_COPY ); - MODULE* Module = GetBoard()->m_Modules; - - if ( Module ) - { - MSG_PANEL_ITEMS items; - Module->GetMsgPanelInfo( m_UserUnits, items ); - SetMsgPanel( items ); - } + UpdateMsgPanel(); m_canvas->DrawCrossHair( DC ); } diff --git a/cvpcb/display_footprints_frame.h b/cvpcb/display_footprints_frame.h index 6246de1b04..748304bb60 100644 --- a/cvpcb/display_footprints_frame.h +++ b/cvpcb/display_footprints_frame.h @@ -1,8 +1,8 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2007 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 2007-2011 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2018 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 2007-2018 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 @@ -25,7 +25,8 @@ /** * @file display_footprints_frame.h */ - +#ifndef DISPLAY_FOOTPRINTS_FRAME_H +#define DISPLAY_FOOTPRINTS_FRAME_H #include @@ -56,11 +57,6 @@ public: void ReCreateVToolbar() override; void ReCreateOptToolbar() override; - void OnSelectOptionToolbar( wxCommandEvent& event ); - - void OnUpdateTextDrawMode( wxUpdateUIEvent& aEvent ); - void OnUpdateLineDrawMode( wxUpdateUIEvent& aEvent ); - /** * Function InitDisplay * Refresh the full display for this frame: @@ -69,6 +65,20 @@ public: */ void InitDisplay(); + /** + * update the gal canvas (view, colors ...) + */ + void updateView(); + + /// Updates the GAL with display settings changes + void applyDisplaySettingsToGAL(); + + ///> @copydoc EDA_DRAW_FRAME::UseGalCanvas() + void UseGalCanvas( bool aEnable ) override; + + ///> @copydoc EDA_DRAW_FRAME::UpdateMsgPanel() + void UpdateMsgPanel() override; + /** * Function IsGridVisible() , virtual * @return true if the grid must be shown @@ -131,3 +141,5 @@ public: DECLARE_EVENT_TABLE() }; + +#endif // DISPLAY_FOOTPRINTS_FRAME_H diff --git a/cvpcb/tools/cvpcb_actions.cpp b/cvpcb/tools/cvpcb_actions.cpp new file mode 100644 index 0000000000..b4279be54b --- /dev/null +++ b/cvpcb/tools/cvpcb_actions.cpp @@ -0,0 +1,65 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013-2016 CERN + * Copyright (C) 2018 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 "cvpcb_actions.h" +#include "cvpcb_control.h" +#include "cvpcb_selection_tool.h" +#include + + +void CVPCB_ACTIONS::RegisterAllTools( TOOL_MANAGER* aToolManager ) +{ + aToolManager->RegisterTool( new COMMON_TOOLS ); + aToolManager->RegisterTool( new ZOOM_TOOL ); + aToolManager->RegisterTool( new CVPCB_SELECTION_TOOL ); + aToolManager->RegisterTool( new CVPCB_CONTROL ); +} + +OPT CVPCB_ACTIONS::TranslateLegacyId( int aId ) +{ + switch( aId ) + { + case ID_ZOOM_IN: // toolbar button "Zoom In" + case ID_VIEWER_ZOOM_IN: + return ACTIONS::zoomInCenter.MakeEvent(); + + case ID_ZOOM_OUT: // toolbar button "Zoom In" + case ID_VIEWER_ZOOM_OUT: + return ACTIONS::zoomOutCenter.MakeEvent(); + + case ID_ZOOM_PAGE: // toolbar button "Fit on Screen" + case ID_VIEWER_ZOOM_PAGE: + return ACTIONS::zoomFitScreen.MakeEvent(); + + case ID_ZOOM_SELECTION: + return ACTIONS::zoomTool.MakeEvent(); + + } + + return OPT(); +} diff --git a/cvpcb/tools/cvpcb_actions.h b/cvpcb/tools/cvpcb_actions.h new file mode 100644 index 0000000000..8ae9df983f --- /dev/null +++ b/cvpcb/tools/cvpcb_actions.h @@ -0,0 +1,86 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013-2016 CERN + * Copyright (C) 2018 KiCad Developers, see AUTHORS.txt for contributors. + * @author Maciej Suminski + * + * 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 CVPCB_ACTIONS_H +#define CVPCB_ACTIONS_H + +#include +#include +#include + +class TOOL_EVENT; +class TOOL_MANAGER; + +/** + * Class CVPCB_ACTIONS + * + * Gathers all the actions that are shared by tools. The instance of CVPCB_ACTIONS is created + * inside of ACTION_MANAGER object that registers the actions. + */ +class CVPCB_ACTIONS : public ACTIONS +{ +public: + // Selection Tool + /// Activation of the selection tool + static TOOL_ACTION selectionActivate; + + static TOOL_ACTION measureTool; + + /// Cursor control with keyboard + static TOOL_ACTION cursorUp; + static TOOL_ACTION cursorDown; + static TOOL_ACTION cursorLeft; + static TOOL_ACTION cursorRight; + + static TOOL_ACTION cursorUpFast; + static TOOL_ACTION cursorDownFast; + static TOOL_ACTION cursorLeftFast; + static TOOL_ACTION cursorRightFast; + + static TOOL_ACTION cursorClick; + + // Panning with keyboard + static TOOL_ACTION panUp; + static TOOL_ACTION panDown; + static TOOL_ACTION panLeft; + static TOOL_ACTION panRight; + + // Miscellaneous + static TOOL_ACTION zoomTool; + static TOOL_ACTION resetCoords; + static TOOL_ACTION switchCursor; + static TOOL_ACTION switchUnits; + static TOOL_ACTION showHelp; + static TOOL_ACTION toBeDone; + + + ///> @copydoc COMMON_ACTIONS::TranslateLegacyId() + virtual OPT TranslateLegacyId( int aId ) override; + + ///> @copydoc COMMON_ACTIONS::RegisterAllTools() + virtual void RegisterAllTools( TOOL_MANAGER* aToolManager ) override; +}; + +#endif diff --git a/cvpcb/tools/cvpcb_control.cpp b/cvpcb/tools/cvpcb_control.cpp new file mode 100644 index 0000000000..3f3fd0057f --- /dev/null +++ b/cvpcb/tools/cvpcb_control.cpp @@ -0,0 +1,288 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2014-2016 CERN + * @author Maciej Suminski + * Copyright (C) 2007-2018 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 "cvpcb_actions.h" +#include "cvpcb_control.h" + +#include + +#include +#include + +#include +#include +//#include +#include +//#include +#include // from pcbnew + +#include +using namespace std::placeholders; + +// Cursor control +TOOL_ACTION CVPCB_ACTIONS::cursorUp( "cvpcb.Control.cursorUp", + AS_GLOBAL, WXK_UP, "", "", NULL, AF_NONE, (void*) CURSOR_UP ); +TOOL_ACTION CVPCB_ACTIONS::cursorDown( "cvpcb.Control.cursorDown", + AS_GLOBAL, WXK_DOWN, "", "" , NULL, AF_NONE, (void*) CURSOR_DOWN ); +TOOL_ACTION CVPCB_ACTIONS::cursorLeft( "cvpcb.Control.cursorLeft", + AS_GLOBAL, WXK_LEFT, "", "" , NULL, AF_NONE, (void*) CURSOR_LEFT ); +TOOL_ACTION CVPCB_ACTIONS::cursorRight( "cvpcb.Control.cursorRight", + AS_GLOBAL, WXK_RIGHT, "", "" , NULL, AF_NONE, (void*) CURSOR_RIGHT ); + +TOOL_ACTION CVPCB_ACTIONS::cursorUpFast( "cvpcb.Control.cursorUpFast", + AS_GLOBAL, MD_CTRL + WXK_UP, "", "", NULL, AF_NONE, (void*) ( CURSOR_UP | CURSOR_FAST_MOVE ) ); +TOOL_ACTION CVPCB_ACTIONS::cursorDownFast( "cvpcb.Control.cursorDownFast", + AS_GLOBAL, MD_CTRL + WXK_DOWN, "", "" , NULL, AF_NONE, (void*) ( CURSOR_DOWN | CURSOR_FAST_MOVE ) ); +TOOL_ACTION CVPCB_ACTIONS::cursorLeftFast( "cvpcb.Control.cursorLeftFast", + AS_GLOBAL, MD_CTRL + WXK_LEFT, "", "" , NULL, AF_NONE, (void*) ( CURSOR_LEFT | CURSOR_FAST_MOVE ) ); +TOOL_ACTION CVPCB_ACTIONS::cursorRightFast( "cvpcb.Control.cursorRightFast", + AS_GLOBAL, MD_CTRL + WXK_RIGHT, "", "" , NULL, AF_NONE, (void*) ( CURSOR_RIGHT | CURSOR_FAST_MOVE ) ); + +TOOL_ACTION CVPCB_ACTIONS::cursorClick( "cvpcb.Control.cursorClick", + AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_LEFT_CLICK ), + "", "", NULL, AF_NONE, (void*) CURSOR_CLICK ); + +TOOL_ACTION CVPCB_ACTIONS::panUp( "cvpcb.Control.panUp", + AS_GLOBAL, MD_SHIFT + WXK_UP, "", "", NULL, AF_NONE, (void*) CURSOR_UP ); +TOOL_ACTION CVPCB_ACTIONS::panDown( "cvpcb.Control.panDown", + AS_GLOBAL, MD_SHIFT + WXK_DOWN, "", "" , NULL, AF_NONE, (void*) CURSOR_DOWN ); +TOOL_ACTION CVPCB_ACTIONS::panLeft( "cvpcb.Control.panLeft", + AS_GLOBAL, MD_SHIFT + WXK_LEFT, "", "" , NULL, AF_NONE, (void*) CURSOR_LEFT ); +TOOL_ACTION CVPCB_ACTIONS::panRight( "cvpcb.Control.panRight", + AS_GLOBAL, MD_SHIFT + WXK_RIGHT, "", "" , NULL, AF_NONE, (void*) CURSOR_RIGHT ); + +// Miscellaneous +TOOL_ACTION CVPCB_ACTIONS::resetCoords( "cvpcb.Control.resetCoords", + AS_GLOBAL, ' ',//TOOL_ACTION::LegacyHotKey( HK_RESET_LOCAL_COORD ), + "", "" ); + +TOOL_ACTION CVPCB_ACTIONS::switchCursor( "cvpcb.Control.switchCursor", + AS_GLOBAL, 0, + "", "" ); + +TOOL_ACTION CVPCB_ACTIONS::switchUnits( "cvpcb.Control.switchUnits", + AS_GLOBAL, 'U',//TOOL_ACTION::LegacyHotKey( HK_SWITCH_UNITS ), + "", "" ); + +CVPCB_CONTROL::CVPCB_CONTROL() : + TOOL_INTERACTIVE( "cvpcb.Control" ), m_frame( NULL ) +{ +} + + +CVPCB_CONTROL::~CVPCB_CONTROL() +{ +} + + +void CVPCB_CONTROL::Reset( RESET_REASON aReason ) +{ + m_frame = getEditFrame(); +} + + +// Cursor control +int CVPCB_CONTROL::CursorControl( const TOOL_EVENT& aEvent ) +{ + long type = aEvent.Parameter(); + bool fastMove = type & CVPCB_ACTIONS::CURSOR_FAST_MOVE; + type &= ~CVPCB_ACTIONS::CURSOR_FAST_MOVE; + bool mirroredX = getView()->IsMirroredX(); + + GRID_HELPER gridHelper( m_frame ); + VECTOR2D cursor = getViewControls()->GetRawCursorPosition( true ); + VECTOR2I gridSize = gridHelper.GetGrid(); + + if( fastMove ) + gridSize = gridSize * 10; + + switch( type ) + { + case CVPCB_ACTIONS::CURSOR_UP: + cursor -= VECTOR2D( 0, gridSize.y ); + break; + + case CVPCB_ACTIONS::CURSOR_DOWN: + cursor += VECTOR2D( 0, gridSize.y ); + break; + + case CVPCB_ACTIONS::CURSOR_LEFT: + cursor -= VECTOR2D( mirroredX ? -gridSize.x : gridSize.x, 0 ); + break; + + case CVPCB_ACTIONS::CURSOR_RIGHT: + cursor += VECTOR2D( mirroredX ? -gridSize.x : gridSize.x, 0 ); + break; + + case CVPCB_ACTIONS::CURSOR_CLICK: // fall through + case CVPCB_ACTIONS::CURSOR_DBL_CLICK: + { + TOOL_ACTIONS action = TA_NONE; + int modifiers = 0; + + modifiers |= wxGetKeyState( WXK_SHIFT ) ? MD_SHIFT : 0; + modifiers |= wxGetKeyState( WXK_CONTROL ) ? MD_CTRL : 0; + modifiers |= wxGetKeyState( WXK_ALT ) ? MD_ALT : 0; + + if( type == CVPCB_ACTIONS::CURSOR_CLICK ) + action = TA_MOUSE_CLICK; + else if( type == CVPCB_ACTIONS::CURSOR_DBL_CLICK ) + action = TA_MOUSE_DBLCLICK; + else + wxFAIL; + + TOOL_EVENT evt( TC_MOUSE, action, BUT_LEFT | modifiers ); + evt.SetMousePosition( getViewControls()->GetCursorPosition() ); + m_toolMgr->ProcessEvent( evt ); + + return 0; + } + break; + } + + getViewControls()->SetCursorPosition( cursor ); + + return 0; +} + + +int CVPCB_CONTROL::PanControl( const TOOL_EVENT& aEvent ) +{ + long type = aEvent.Parameter(); + KIGFX::VIEW* view = getView(); + GRID_HELPER gridHelper( m_frame ); + VECTOR2D center = view->GetCenter(); + VECTOR2I gridSize = gridHelper.GetGrid() * 10; + bool mirroredX = view->IsMirroredX(); + + switch( type ) + { + case CVPCB_ACTIONS::CURSOR_UP: + center -= VECTOR2D( 0, gridSize.y ); + break; + + case CVPCB_ACTIONS::CURSOR_DOWN: + center += VECTOR2D( 0, gridSize.y ); + break; + + case CVPCB_ACTIONS::CURSOR_LEFT: + center -= VECTOR2D( mirroredX ? -gridSize.x : gridSize.x, 0 ); + break; + + case CVPCB_ACTIONS::CURSOR_RIGHT: + center += VECTOR2D( mirroredX ? -gridSize.x : gridSize.x, 0 ); + break; + + default: + wxFAIL; + break; + } + + view->SetCenter( center ); + + return 0; +} + + +// Miscellaneous +int CVPCB_CONTROL::ResetCoords( const TOOL_EVENT& aEvent ) +{ + auto vcSettings = m_toolMgr->GetCurrentToolVC(); + + // Use either the active tool forced cursor position or the general settings + VECTOR2I cursorPos = vcSettings.m_forceCursorPosition ? vcSettings.m_forcedPosition : + getViewControls()->GetCursorPosition(); + + m_frame->GetScreen()->m_O_Curseur = wxPoint( cursorPos.x, cursorPos.y ); + m_frame->UpdateStatusBar(); + + return 0; +} + + +int CVPCB_CONTROL::SwitchCursor( const TOOL_EVENT& aEvent ) +{ + auto& galOpts = m_frame->GetGalDisplayOptions(); + + galOpts.m_fullscreenCursor = !galOpts.m_fullscreenCursor; + galOpts.NotifyChanged(); + + return 0; +} + + +int CVPCB_CONTROL::SwitchUnits( const TOOL_EVENT& aEvent ) +{ + // TODO should not it be refactored to pcb_frame member function? + wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED ); + + if( m_frame->GetUserUnits() == INCHES ) + evt.SetId( ID_TB_OPTIONS_SELECT_UNIT_MM ); + else + evt.SetId( ID_TB_OPTIONS_SELECT_UNIT_INCH ); + + m_frame->ProcessEvent( evt ); + + return 0; +} + + +void CVPCB_CONTROL::setTransitions() +{ + // Cursor control + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorUp.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorDown.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorLeft.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorRight.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorUpFast.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorDownFast.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorLeftFast.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorRightFast.MakeEvent() ); + Go( &CVPCB_CONTROL::CursorControl, CVPCB_ACTIONS::cursorClick.MakeEvent() ); + + // Pan control + Go( &CVPCB_CONTROL::PanControl, CVPCB_ACTIONS::panUp.MakeEvent() ); + Go( &CVPCB_CONTROL::PanControl, CVPCB_ACTIONS::panDown.MakeEvent() ); + Go( &CVPCB_CONTROL::PanControl, CVPCB_ACTIONS::panLeft.MakeEvent() ); + Go( &CVPCB_CONTROL::PanControl, CVPCB_ACTIONS::panRight.MakeEvent() ); + + // Miscellaneous + Go( &CVPCB_CONTROL::ResetCoords, CVPCB_ACTIONS::resetCoords.MakeEvent() ); + Go( &CVPCB_CONTROL::SwitchCursor, CVPCB_ACTIONS::switchCursor.MakeEvent() ); + Go( &CVPCB_CONTROL::SwitchUnits, CVPCB_ACTIONS::switchUnits.MakeEvent() ); +} + +/* +void CVPCB_CONTROL::updateGrid() +{ + BASE_SCREEN* screen = m_frame->GetScreen(); + //GRID_TYPE grid = screen->GetGrid( idx ); + getView()->GetGAL()->SetGridSize( VECTOR2D( screen->GetGridSize() ) ); + getView()->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); +} +*/ \ No newline at end of file diff --git a/cvpcb/tools/cvpcb_control.h b/cvpcb/tools/cvpcb_control.h new file mode 100644 index 0000000000..0937ccc90e --- /dev/null +++ b/cvpcb/tools/cvpcb_control.h @@ -0,0 +1,78 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2014-2016 CERN + * @author Maciej Suminski + * Copyright (C) 2007-2018 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 CVPCB_CONTROL_H +#define CVPCB_CONTROL_H + +#include +#include + +namespace KIGFX { + class ORIGIN_VIEWITEM; +} + +/** + * Class CVPCB_CONTROL + * + * Handles actions in cvpcb display frame. + */ + +class CVPCB_CONTROL : public TOOL_INTERACTIVE +{ +public: + CVPCB_CONTROL(); + ~CVPCB_CONTROL(); + + /// @copydoc TOOL_INTERACTIVE::Reset() + void Reset( RESET_REASON aReason ) override; + + int CursorControl( const TOOL_EVENT& aEvent ); + int PanControl( const TOOL_EVENT& aEvent ); + + // Miscellaneous + int ResetCoords( const TOOL_EVENT& aEvent ); + int SwitchCursor( const TOOL_EVENT& aEvent ); + int SwitchUnits( const TOOL_EVENT& aEvent ); + + ///> Sets up handlers for various events. + void setTransitions() override; + +private: + ///> Pointer to the currently used edit/draw frame. + DISPLAY_FOOTPRINTS_FRAME* m_frame; + + ///> Grid origin marker. + std::unique_ptr m_gridOrigin; + + ///> Applies the legacy canvas grid settings for GAL. + void updateGrid(); + + KIGFX::VIEW* view() + { + return m_frame->GetGalCanvas()->GetView(); + } +}; + +#endif diff --git a/cvpcb/tools/cvpcb_selection_tool.cpp b/cvpcb/tools/cvpcb_selection_tool.cpp new file mode 100644 index 0000000000..e62252a086 --- /dev/null +++ b/cvpcb/tools/cvpcb_selection_tool.cpp @@ -0,0 +1,290 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2018 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 3 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, see . + */ + +#include + +#include +using namespace std::placeholders; + +#include +#include +#include + +#include +#include +#include + +#include + +#include "cvpcb_selection_tool.h" +#include "cvpcb_actions.h" + +// Selection tool actions +TOOL_ACTION CVPCB_ACTIONS::selectionActivate( "cvpcb.InteractiveSelection", + AS_GLOBAL, 0, + "", "", NULL, AF_ACTIVATE ); // No description, it is not supposed to be shown anywhere + + +TOOL_ACTION CVPCB_ACTIONS::measureTool( "cvpcb.InteractiveSelection.measureTool", + AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_MEASURE_TOOL ), + _( "Measure Tool" ), _( "Interactively measure distance between points" ), + nullptr, AF_ACTIVATE ); + + +CVPCB_SELECTION_TOOL::CVPCB_SELECTION_TOOL() : + TOOL_INTERACTIVE( "cvpcb.InteractiveSelection" ), + m_frame( NULL ), m_menu( *this ) +{ +} + + +CVPCB_SELECTION_TOOL::~CVPCB_SELECTION_TOOL() +{ + getView()->Remove( &m_selection ); +} + + +bool CVPCB_SELECTION_TOOL::Init() +{ + m_menu.AddStandardSubMenus( *getEditFrame() ); + + return true; +} + + +void CVPCB_SELECTION_TOOL::Reset( RESET_REASON aReason ) +{ + m_frame = getEditFrame(); +} + + +int CVPCB_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) +{ + // Main loop: keep receiving events + while( OPT_TOOL_EVENT evt = Wait() ) + { + // This is kind of hacky: activate RMB drag on any event. + // There doesn't seem to be any other good way to tell when another tool + // is canceled and control returns to the selection tool, except by the + // fact that the selection tool starts to get events again. + if( m_frame->GetToolId() == ID_NO_TOOL_SELECTED) + { + getViewControls()->SetAdditionalPanButtons( false, true ); + } + + // Disable RMB pan for other tools; they can re-enable if desired + if( evt->IsActivate() ) + { + getViewControls()->SetAdditionalPanButtons( false, false ); + } + + // single click? Select single object + if( evt->IsClick( BUT_LEFT ) ) + { + clearSelection(); + } + + // right click? if there is any object - show the context menu + else if( evt->IsClick( BUT_RIGHT ) ) + { + m_menu.ShowContextMenu( m_selection ); + } + + else if( evt->IsCancel() || evt->Action() == TA_UNDO_REDO_PRE ) + { + clearSelection(); + } + + else if( evt->Action() == TA_CONTEXT_MENU_CLOSED ) + { + m_menu.CloseContextMenu( evt ); + } + } + + // This tool is supposed to be active forever + wxASSERT( false ); + + return 0; +} + + +SELECTION& CVPCB_SELECTION_TOOL::GetSelection() +{ + return m_selection; +} + + +void CVPCB_SELECTION_TOOL::setTransitions() +{ + Go( &CVPCB_SELECTION_TOOL::Main, CVPCB_ACTIONS::selectionActivate.MakeEvent() ); + Go( &CVPCB_SELECTION_TOOL::MeasureTool, CVPCB_ACTIONS::measureTool.MakeEvent() ); +} + + +void CVPCB_SELECTION_TOOL::zoomFitSelection( void ) +{ + //Should recalculate the view to zoom in on the selection + auto selectionBox = m_selection.ViewBBox(); + auto canvas = m_frame->GetGalCanvas(); + auto view = getView(); + + VECTOR2D screenSize = view->ToWorld( canvas->GetClientSize(), false ); + + if( !( selectionBox.GetWidth() == 0 ) || !( selectionBox.GetHeight() == 0 ) ) + { + VECTOR2D vsize = selectionBox.GetSize(); + double scale = view->GetScale() / std::max( fabs( vsize.x / screenSize.x ), + fabs( vsize.y / screenSize.y ) ); + view->SetScale( scale ); + view->SetCenter( selectionBox.Centre() ); + view->Add( &m_selection ); + } + + m_frame->GetGalCanvas()->ForceRefresh(); +} + + +int CVPCB_SELECTION_TOOL::MeasureTool( const TOOL_EVENT& aEvent ) +{ + auto& view = *getView(); + auto& controls = *getViewControls(); + auto previous_settings = controls.GetSettings(); + + Activate(); + m_frame->SetToolID( ID_TB_MEASUREMENT_TOOL, wxCURSOR_PENCIL, + _( "Measure distance" ) ); + + KIGFX::PREVIEW::TWO_POINT_GEOMETRY_MANAGER twoPtMgr; + KIGFX::PREVIEW::RULER_ITEM ruler( twoPtMgr, m_frame->GetUserUnits() ); + + view.Add( &ruler ); + view.SetVisible( &ruler, false ); + + bool originSet = false; + + controls.ShowCursor( true ); + controls.SetSnapping( true ); + controls.SetAdditionalPanButtons( false, true ); + + while( auto evt = Wait() ) + { + const VECTOR2I cursorPos = controls.GetCursorPosition(); + + if( evt->IsCancel() || evt->IsActivate() ) + { + break; + } + + // click or drag starts + else if( !originSet && + ( evt->IsDrag( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) ) ) + { + if( !evt->IsDrag( BUT_LEFT ) ) + { + twoPtMgr.SetOrigin( cursorPos ); + twoPtMgr.SetEnd( cursorPos ); + } + + controls.CaptureCursor( true ); + controls.SetAutoPan( true ); + + originSet = true; + } + + else if( !originSet && evt->IsMotion() ) + { + // make sure the origin is set before a drag starts + // otherwise you can miss a step + twoPtMgr.SetOrigin( cursorPos ); + twoPtMgr.SetEnd( cursorPos ); + } + + // second click or mouse up after drag ends + else if( originSet && + ( evt->IsClick( BUT_LEFT ) || evt->IsMouseUp( BUT_LEFT ) ) ) + { + originSet = false; + + controls.SetAutoPan( false ); + controls.CaptureCursor( false ); + + view.SetVisible( &ruler, false ); + } + + // move or drag when origin set updates rules + else if( originSet && + ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) ) + { + twoPtMgr.SetAngleSnap( evt->Modifier( MD_CTRL ) ); + twoPtMgr.SetEnd( cursorPos ); + + view.SetVisible( &ruler, true ); + view.Update( &ruler, KIGFX::GEOMETRY ); + } + + else if( evt->IsClick( BUT_RIGHT ) ) + { + m_menu.ShowContextMenu( m_selection ); + } + } + + view.SetVisible( &ruler, false ); + view.Remove( &ruler ); + + controls.ApplySettings( previous_settings ); + + m_frame->SetNoToolSelected(); + + return 0; +} + + +const BOX2I SELECTION::ViewBBox() const +{ + EDA_RECT eda_bbox; + + if( Size() == 1 ) + { + eda_bbox = Front()->GetBoundingBox(); + } + else if( Size() > 1 ) + { + eda_bbox = Front()->GetBoundingBox(); + auto i = m_items.begin(); + ++i; + + for( ; i != m_items.end(); ++i ) + { + eda_bbox.Merge( (*i)->GetBoundingBox() ); + } + } + + return BOX2I( eda_bbox.GetOrigin(), eda_bbox.GetSize() ); +} + + +const KIGFX::VIEW_GROUP::ITEMS SELECTION::updateDrawList() const +{ + std::vector items; + + for( auto item : m_items ) + items.push_back( item ); + + return items; +} diff --git a/cvpcb/tools/cvpcb_selection_tool.h b/cvpcb/tools/cvpcb_selection_tool.h new file mode 100644 index 0000000000..57f0322a18 --- /dev/null +++ b/cvpcb/tools/cvpcb_selection_tool.h @@ -0,0 +1,99 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2018 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 3 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, see . + */ + +#ifndef CVPCB_SELECTION_TOOL_H +#define CVPCB_SELECTION_TOOL_H + + +#include +#include +#include +#include +#include + +#include + +class SELECTION_AREA; +class GERBER_COLLECTOR; + +namespace KIGFX +{ + class GAL; +} + + +/** + * Class CVPCB_SELECTION_TOOL + * + * Selection tool for GerbView, based on the one in PcbNew + */ +class CVPCB_SELECTION_TOOL : public TOOL_INTERACTIVE +{ +public: + CVPCB_SELECTION_TOOL(); + ~CVPCB_SELECTION_TOOL(); + + /// @copydoc TOOL_BASE::Init() + bool Init() override; + + /// @copydoc TOOL_BASE::Reset() + void Reset( RESET_REASON aReason ) override; + + /** + * Function Main() + * + * The main loop. + */ + int Main( const TOOL_EVENT& aEvent ); + + /** Returns the set of currently selected items. + */ + SELECTION& GetSelection(); + + inline TOOL_MENU& GetToolMenu() + { + return m_menu; + } + + /** Clears the current selection. + */ + void clearSelection() {}; + + ///> Launches a tool to measure between points + int MeasureTool( const TOOL_EVENT& aEvent ); + + ///> Sets up handlers for various events. + void setTransitions() override; + + ///> Zooms the screen to center and fit the current selection. + void zoomFitSelection( void ); + +private: + + /// Pointer to the parent frame. + DISPLAY_FOOTPRINTS_FRAME* m_frame; + + /// Current state of selection (not really used: no selection in display footprints frame). + SELECTION m_selection; + + /// Menu model displayed by the tool. + TOOL_MENU m_menu; +}; + +#endif diff --git a/pcbnew/pcb_base_frame.cpp b/pcbnew/pcb_base_frame.cpp index d7c87f64de..5d762089ad 100644 --- a/pcbnew/pcb_base_frame.cpp +++ b/pcbnew/pcb_base_frame.cpp @@ -568,7 +568,7 @@ void PCB_BASE_FRAME::OnTogglePadDrawMode( wxCommandEvent& aEvent ) if( gal ) { - // Apply new display options to the GAL canvas + // Apply new display options to the GAL canvas auto view = static_cast( gal->GetView() ); view->UpdateDisplayOptions( displ_opts ); @@ -597,6 +597,16 @@ void PCB_BASE_FRAME::OnToggleEdgeDrawMode( wxCommandEvent& aEvent ) { auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); displ_opts->m_DisplayModEdgeFill = !displ_opts->m_DisplayModEdgeFill; + EDA_DRAW_PANEL_GAL* gal = GetGalCanvas(); + + if( gal ) + { + // Apply new display options to the GAL canvas + auto view = static_cast( gal->GetView() ); + view->UpdateDisplayOptions( displ_opts ); + view->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); + } + m_canvas->Refresh(); } @@ -605,6 +615,16 @@ void PCB_BASE_FRAME::OnToggleTextDrawMode( wxCommandEvent& aEvent ) { auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); displ_opts->m_DisplayModTextFill = !displ_opts->m_DisplayModTextFill; + EDA_DRAW_PANEL_GAL* gal = GetGalCanvas(); + + if( gal ) + { + // Apply new display options to the GAL canvas + auto view = static_cast( gal->GetView() ); + view->UpdateDisplayOptions( displ_opts ); + view->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); + } + m_canvas->Refresh(); } @@ -663,6 +683,12 @@ void PCB_BASE_FRAME::OnUpdateEdgeDrawMode( wxUpdateUIEvent& aEvent ) { auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); aEvent.Check( !displ_opts->m_DisplayModEdgeFill ); + + wxString msgEdgesFill[2] = { _( "Show outlines in filled mode" ), + _( "Show outlines in sketch mode" ) }; + + unsigned i = displ_opts->m_DisplayModTextFill == SKETCH ? 0 : 1; + m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, msgEdgesFill[i] ); } @@ -670,6 +696,11 @@ void PCB_BASE_FRAME::OnUpdateTextDrawMode( wxUpdateUIEvent& aEvent ) { auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); aEvent.Check( !displ_opts->m_DisplayModTextFill ); + + wxString msgTextsFill[2] = { _( "Show texts in filled mode" ), + _( "Show texts in sketch mode" ) }; + unsigned i = displ_opts->m_DisplayModTextFill == SKETCH ? 0 : 1; + m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, msgTextsFill[i] ); } diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index a4c0f2d9d1..3f71e87a3e 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -55,6 +55,7 @@ PCB_RENDER_SETTINGS::PCB_RENDER_SETTINGS() m_clearance = CL_NONE; m_sketchBoardGfx = false; m_sketchFpGfx = false; + m_sketchFpTxtfx = false; m_selectionCandidateColor = COLOR4D( 0.0, 1.0, 0.0, 0.75 ); // By default everything should be displayed as filled @@ -133,6 +134,7 @@ void PCB_RENDER_SETTINGS::LoadDisplayOptions( const PCB_DISPLAY_OPTIONS* aOption m_padNumbers = aOptions->m_DisplayPadNum; m_sketchBoardGfx = !aOptions->m_DisplayDrawItemsFill; m_sketchFpGfx = !aOptions->m_DisplayModEdgeFill; + m_sketchFpTxtfx = !aOptions->m_DisplayModTextFill; // Whether to draw tracks, vias & pads filled or as outlines m_sketchMode[LAYER_PADS_TH] = !aOptions->m_DisplayPadFill; @@ -1020,10 +1022,14 @@ void PCB_PAINTER::draw( const TEXTE_MODULE* aText, int aLayer ) if( shownText.Length() == 0 ) return; + bool sketch = m_pcbSettings.m_sketchFpTxtfx; + const COLOR4D& color = m_pcbSettings.GetColor( aText, aLayer ); VECTOR2D position( aText->GetTextPos().x, aText->GetTextPos().y ); - if( m_pcbSettings.m_sketchMode[aLayer] ) + // Currently, draw text routines do not know the true outline mode. + // so draw the text in "line" mode (no thickness) + if( sketch ) { // Outline mode m_gal->SetLineWidth( m_pcbSettings.m_outlineWidth ); @@ -1041,7 +1047,7 @@ void PCB_PAINTER::draw( const TEXTE_MODULE* aText, int aLayer ) m_gal->StrokeText( shownText, position, aText->GetDrawRotationRadians() ); // Draw the umbilical line - if( aText->IsSelected() && aText->GetType() != TEXTE_MODULE::TEXT_is_DIVERS ) + if( aText->IsSelected() ) { m_gal->SetLineWidth( m_pcbSettings.m_outlineWidth ); m_gal->SetStrokeColor( COLOR4D( 0.0, 0.0, 1.0, 1.0 ) ); diff --git a/pcbnew/pcb_painter.h b/pcbnew/pcb_painter.h index 29c91c48ad..c1df40a07b 100644 --- a/pcbnew/pcb_painter.h +++ b/pcbnew/pcb_painter.h @@ -153,6 +153,9 @@ protected: ///> Flag determining if footprint graphic items should be outlined or stroked bool m_sketchFpGfx; + ///> Flag determining if footprint text items should be outlined or stroked + bool m_sketchFpTxtfx; + ///> Flag determining if pad numbers should be visible bool m_padNumbers;