From 0bdf5bac7217d326807e9d568416cbac35eebe48 Mon Sep 17 00:00:00 2001 From: Emmeran Date: Sat, 2 Feb 2013 20:10:48 +0100 Subject: [PATCH] added option to allow zooming around the crosshair instead of the center; can be enabled via options or by holding alt while using the mousewheel --- common/drawframe.cpp | 1 + common/drawpanel.cpp | 25 +++++++++++++++++++ common/zoom.cpp | 25 +++++++++++++++++++ cvpcb/dialogs/dialog_display_options.cpp | 2 ++ cvpcb/dialogs/dialog_display_options_base.cpp | 3 +++ cvpcb/dialogs/dialog_display_options_base.h | 1 + eeschema/dialogs/dialog_eeschema_options.h | 9 +++++++ .../dialogs/dialog_eeschema_options_base.cpp | 5 ++++ .../dialogs/dialog_eeschema_options_base.h | 1 + eeschema/eeschema_config.cpp | 2 ++ .../gerbview_dialog_display_options_frame.cpp | 3 +++ ...view_dialog_display_options_frame_base.cpp | 3 +++ ...rbview_dialog_display_options_frame_base.h | 1 + include/class_drawpanel.h | 17 +++++++++++++ include/id.h | 4 +++ include/wxstruct.h | 7 ++++++ pcbnew/dialogs/dialog_general_options.cpp | 2 ++ ...ialog_general_options_BoardEditor_base.cpp | 5 ++++ .../dialog_general_options_BoardEditor_base.h | 2 ++ 19 files changed, 118 insertions(+) diff --git a/common/drawframe.cpp b/common/drawframe.cpp index 03d6fad7ea..e67d5996ff 100644 --- a/common/drawframe.cpp +++ b/common/drawframe.cpp @@ -66,6 +66,7 @@ BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, EDA_BASE_FRAME ) EVT_MENU_OPEN( EDA_DRAW_FRAME::OnMenuOpen ) EVT_ACTIVATE( EDA_DRAW_FRAME::OnActivate ) EVT_MENU_RANGE( ID_ZOOM_IN, ID_ZOOM_REDRAW, EDA_DRAW_FRAME::OnZoom ) + EVT_MENU_RANGE( ID_OFFCENTER_ZOOM_IN, ID_OFFCENTER_ZOOM_OUT, EDA_DRAW_FRAME::OnZoom ) EVT_MENU_RANGE( ID_POPUP_ZOOM_START_RANGE, ID_POPUP_ZOOM_END_RANGE, EDA_DRAW_FRAME::OnZoom ) EVT_MENU_RANGE( ID_POPUP_GRID_LEVEL_1000, ID_POPUP_GRID_USER, diff --git a/common/drawpanel.cpp b/common/drawpanel.cpp index 33e2214c6f..a6ad825537 100644 --- a/common/drawpanel.cpp +++ b/common/drawpanel.cpp @@ -44,6 +44,7 @@ static const int CURSOR_SIZE = 12; ///< Cursor size in pixels #define CLIP_BOX_PADDING 2 // keys to store options in config: +#define ENBL_ZOOM_NO_CENTER_KEY wxT( "ZoomNoCenter" ) #define ENBL_MIDDLE_BUTT_PAN_KEY wxT( "MiddleButtonPAN" ) #define MIDDLE_BUTT_PAN_LIMITED_KEY wxT( "MiddleBtnPANLimited" ) #define ENBL_AUTO_PAN_KEY wxT( "AutoPAN" ) @@ -102,6 +103,7 @@ EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id, m_canStartBlock = -1; // Command block can start if >= 0 m_abortRequest = false; m_enableMiddleButtonPan = false; + m_enableZoomNoCenter = false; m_panScrollbarLimits = false; m_enableAutoPan = true; m_ignoreMouseEvents = false; @@ -113,6 +115,7 @@ EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id, if( wxGetApp().GetSettings() ) { wxGetApp().GetSettings()->Read( ENBL_MIDDLE_BUTT_PAN_KEY, &m_enableMiddleButtonPan, false ); + wxGetApp().GetSettings()->Read( ENBL_ZOOM_NO_CENTER_KEY, &m_enableZoomNoCenter, false ); wxGetApp().GetSettings()->Read( MIDDLE_BUTT_PAN_LIMITED_KEY, &m_panScrollbarLimits, false ); wxGetApp().GetSettings()->Read( ENBL_AUTO_PAN_KEY, &m_enableAutoPan, true ); } @@ -137,6 +140,7 @@ EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id, EDA_DRAW_PANEL::~EDA_DRAW_PANEL() { wxGetApp().GetSettings()->Write( ENBL_MIDDLE_BUTT_PAN_KEY, m_enableMiddleButtonPan ); + wxGetApp().GetSettings()->Write( ENBL_ZOOM_NO_CENTER_KEY, m_enableZoomNoCenter ); wxGetApp().GetSettings()->Write( MIDDLE_BUTT_PAN_LIMITED_KEY, m_panScrollbarLimits ); wxGetApp().GetSettings()->Write( ENBL_AUTO_PAN_KEY, m_enableAutoPan ); } @@ -154,6 +158,23 @@ BASE_SCREEN* EDA_DRAW_PANEL::GetScreen() return parentFrame->GetScreen(); } +wxPoint EDA_DRAW_PANEL::ToDeviceXY( const wxPoint& pos ) +{ + wxPoint ret; + INSTALL_UNBUFFERED_DC( dc, this ); + ret.x = dc.LogicalToDeviceX( pos.x ); + ret.y = dc.LogicalToDeviceY( pos.y ); + return ret; +} + +wxPoint EDA_DRAW_PANEL::ToLogicalXY( const wxPoint& pos ) +{ + wxPoint ret; + INSTALL_UNBUFFERED_DC( dc, this ); + ret.x = dc.DeviceToLogicalX( pos.x ); + ret.y = dc.DeviceToLogicalY( pos.y ); + return ret; +} void EDA_DRAW_PANEL::DrawCrossHair( wxDC* aDC, EDA_COLOR_T aColor ) { @@ -856,6 +877,8 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) cmd.SetId( ID_PAN_UP ); else if( event.ControlDown() && !event.ShiftDown() ) cmd.SetId( ID_PAN_LEFT ); + else if( event.AltDown() || m_enableZoomNoCenter) + cmd.SetId( ID_OFFCENTER_ZOOM_IN ); else cmd.SetId( ID_POPUP_ZOOM_IN ); } @@ -865,6 +888,8 @@ void EDA_DRAW_PANEL::OnMouseWheel( wxMouseEvent& event ) cmd.SetId( ID_PAN_DOWN ); else if( event.ControlDown() && !event.ShiftDown() ) cmd.SetId( ID_PAN_RIGHT ); + else if( event.AltDown() || m_enableZoomNoCenter) + cmd.SetId( ID_OFFCENTER_ZOOM_OUT ); else cmd.SetId( ID_POPUP_ZOOM_OUT ); } diff --git a/common/zoom.cpp b/common/zoom.cpp index 6cd768d03b..ef36d7567f 100644 --- a/common/zoom.cpp +++ b/common/zoom.cpp @@ -41,6 +41,7 @@ #include + void EDA_DRAW_FRAME::RedrawScreen( const wxPoint& aCenterPoint, bool aWarpPointer ) { AdjustScrollBars( aCenterPoint ); @@ -53,6 +54,18 @@ void EDA_DRAW_FRAME::RedrawScreen( const wxPoint& aCenterPoint, bool aWarpPointe m_canvas->Update(); } +void EDA_DRAW_FRAME::RedrawScreen2( const wxPoint& posBefore ) +{ + wxPoint dPos = posBefore - m_canvas->GetClientSize() / 2; // relative screen position to center before zoom + wxPoint newScreenPos = m_canvas->ToDeviceXY( GetScreen()->GetCrossHairPosition() ); // screen position of crosshair after zoom + wxPoint newCenter = m_canvas->ToLogicalXY( newScreenPos - dPos ); + + AdjustScrollBars( newCenter ); + + m_canvas->Refresh(); + m_canvas->Update(); +} + void EDA_DRAW_FRAME::Zoom_Automatique( bool aWarpPointer ) { @@ -111,6 +124,12 @@ void EDA_DRAW_FRAME::OnZoom( wxCommandEvent& event ) switch( id ) { + case ID_OFFCENTER_ZOOM_IN: + center = m_canvas->ToDeviceXY( screen->GetCrossHairPosition() ); + if( screen->SetPreviousZoom() ) + RedrawScreen2( center ); + break; + case ID_POPUP_ZOOM_IN: zoom_at_cursor = true; center = screen->GetCrossHairPosition(); @@ -121,6 +140,12 @@ void EDA_DRAW_FRAME::OnZoom( wxCommandEvent& event ) RedrawScreen( center, zoom_at_cursor ); break; + case ID_OFFCENTER_ZOOM_OUT: + center = m_canvas->ToDeviceXY( screen->GetCrossHairPosition() ); + if( screen->SetNextZoom() ) + RedrawScreen2( center ); + break; + case ID_POPUP_ZOOM_OUT: zoom_at_cursor = true; center = screen->GetCrossHairPosition(); diff --git a/cvpcb/dialogs/dialog_display_options.cpp b/cvpcb/dialogs/dialog_display_options.cpp index 670c77d57b..3d8d890615 100644 --- a/cvpcb/dialogs/dialog_display_options.cpp +++ b/cvpcb/dialogs/dialog_display_options.cpp @@ -77,6 +77,7 @@ void DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::initDialog() m_TextDisplayOption->SetSelection( m_Parent->m_DisplayModText ); m_IsShowPadFill->SetValue( m_Parent->m_DisplayPadFill ); m_IsShowPadNum->SetValue( m_Parent->m_DisplayPadNum ); + m_IsZoomNoCenter->SetValue( m_Parent->GetCanvas()->GetEnableZoomNoCenter() ); m_IsMiddleButtonPan->SetValue( m_Parent->GetCanvas()->GetEnableMiddleButtonPan() ); m_IsMiddleButtonPanLimited->SetValue( m_Parent->GetCanvas()->GetMiddleButtonPanLimited() ); m_IsMiddleButtonPanLimited->Enable( m_IsMiddleButtonPan->GetValue() ); @@ -94,6 +95,7 @@ void DIALOG_FOOTPRINTS_DISPLAY_OPTIONS::UpdateObjectSettings( void ) m_Parent->m_DisplayModText = m_TextDisplayOption->GetSelection(); m_Parent->m_DisplayPadNum = m_IsShowPadNum->GetValue(); m_Parent->m_DisplayPadFill = m_IsShowPadFill->GetValue(); + m_Parent->GetCanvas()->SetEnableZoomNoCenter( m_IsZoomNoCenter->GetValue() ); m_Parent->GetCanvas()->SetEnableMiddleButtonPan( m_IsMiddleButtonPan->GetValue() ); m_Parent->GetCanvas()->SetMiddleButtonPanLimited( m_IsMiddleButtonPanLimited->GetValue() ); m_Parent->GetCanvas()->Refresh(); diff --git a/cvpcb/dialogs/dialog_display_options_base.cpp b/cvpcb/dialogs/dialog_display_options_base.cpp index 7c3c24d344..ae0e8c8e2a 100644 --- a/cvpcb/dialogs/dialog_display_options_base.cpp +++ b/cvpcb/dialogs/dialog_display_options_base.cpp @@ -54,6 +54,9 @@ DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE::DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE( wxStaticBoxSizer* sbSizerViewOpt; sbSizerViewOpt = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Pan:") ), wxVERTICAL ); + + m_IsZoomNoCenter = new wxCheckBox( this, wxID_ANY, _("Zoom off center"), wxDefaultPosition, wxDefaultSize, 0 ); + sbSizerViewOpt->Add( m_IsZoomNoCenter, 0, wxALL|wxEXPAND, 5 ); m_IsMiddleButtonPan = new wxCheckBox( this, wxID_ANY, _("Middle Button PAN Enabled"), wxDefaultPosition, wxDefaultSize, 0 ); sbSizerViewOpt->Add( m_IsMiddleButtonPan, 0, wxALL|wxEXPAND, 5 ); diff --git a/cvpcb/dialogs/dialog_display_options_base.h b/cvpcb/dialogs/dialog_display_options_base.h index f3beb8b4ea..8131f45011 100644 --- a/cvpcb/dialogs/dialog_display_options_base.h +++ b/cvpcb/dialogs/dialog_display_options_base.h @@ -43,6 +43,7 @@ class DIALOG_FOOTPRINTS_DISPLAY_OPTIONS_BASE : public DIALOG_SHIM wxRadioBox* m_TextDisplayOption; wxCheckBox* m_IsShowPadFill; wxCheckBox* m_IsShowPadNum; + wxCheckBox* m_IsZoomNoCenter; wxCheckBox* m_IsMiddleButtonPan; wxCheckBox* m_IsMiddleButtonPanLimited; wxStaticLine* m_staticline1; diff --git a/eeschema/dialogs/dialog_eeschema_options.h b/eeschema/dialogs/dialog_eeschema_options.h index d8c3ad6f92..f7f1354824 100644 --- a/eeschema/dialogs/dialog_eeschema_options.h +++ b/eeschema/dialogs/dialog_eeschema_options.h @@ -81,6 +81,15 @@ public: void SetShowHiddenPins( bool show ) { m_checkShowHiddenPins->SetValue( show ); } bool GetShowHiddenPins( void ) { return m_checkShowHiddenPins->GetValue(); } + void SetEnableZoomNoCenter( bool enable ) + { + m_checkEnableZoomNoCenter->SetValue( enable ); + } + + bool GetEnableZoomNoCenter( void ) + { + return m_checkEnableZoomNoCenter->GetValue(); + } void SetEnableMiddleButtonPan( bool enable ) { m_checkEnableMiddleButtonPan->SetValue( enable ); diff --git a/eeschema/dialogs/dialog_eeschema_options_base.cpp b/eeschema/dialogs/dialog_eeschema_options_base.cpp index 7c00cc425b..11e2d37b4e 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.cpp +++ b/eeschema/dialogs/dialog_eeschema_options_base.cpp @@ -155,6 +155,11 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx m_checkShowHiddenPins = new wxCheckBox( m_panel1, wxID_ANY, _("Show hi&dden pins"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer2->Add( m_checkShowHiddenPins, 0, wxALL|wxEXPAND, 3 ); + m_checkEnableZoomNoCenter = new wxCheckBox( m_panel1, xwID_ANY, _("Enable zooming off center"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkEnableZoomNoCenter->SetToolTip( _("Keep the cursor at its current location when zooming") ); + + bSizer2->Add( m_checkEnableZoomNoCenter, 0, wxALL, 3 ); + m_checkEnableMiddleButtonPan = new wxCheckBox( m_panel1, xwID_ANY, _("Enable middle mouse button panning"), wxDefaultPosition, wxDefaultSize, 0 ); m_checkEnableMiddleButtonPan->SetToolTip( _("Use middle mouse button dragging to pan") ); diff --git a/eeschema/dialogs/dialog_eeschema_options_base.h b/eeschema/dialogs/dialog_eeschema_options_base.h index 9fe360bc14..09b57db803 100644 --- a/eeschema/dialogs/dialog_eeschema_options_base.h +++ b/eeschema/dialogs/dialog_eeschema_options_base.h @@ -81,6 +81,7 @@ class DIALOG_EESCHEMA_OPTIONS_BASE : public wxDialog wxStaticText* m_staticText23; wxCheckBox* m_checkShowGrid; wxCheckBox* m_checkShowHiddenPins; + wxCheckBox* m_checkEnableZoomNoCenter; wxCheckBox* m_checkEnableMiddleButtonPan; wxCheckBox* m_checkMiddleButtonPanLimited; wxCheckBox* m_checkAutoPan; diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp index c02750d2c7..1ec9a4e2fa 100644 --- a/eeschema/eeschema_config.cpp +++ b/eeschema/eeschema_config.cpp @@ -275,6 +275,7 @@ void SCH_EDIT_FRAME::OnSetOptions( wxCommandEvent& event ) dlg.SetShowGrid( IsGridVisible() ); dlg.SetShowHiddenPins( m_showAllPins ); dlg.SetEnableMiddleButtonPan( m_canvas->GetEnableMiddleButtonPan() ); + dlg.SetEnableZoomNoCenter( m_canvas->GetEnableZoomNoCenter() ); dlg.SetMiddleButtonPanLimited( m_canvas->GetMiddleButtonPanLimited() ); dlg.SetEnableAutoPan( m_canvas->GetEnableAutoPan() ); dlg.SetEnableHVBusOrientation( GetForceHVLines() ); @@ -309,6 +310,7 @@ void SCH_EDIT_FRAME::OnSetOptions( wxCommandEvent& event ) SetGridVisibility( dlg.GetShowGrid() ); m_showAllPins = dlg.GetShowHiddenPins(); m_canvas->SetEnableMiddleButtonPan( dlg.GetEnableMiddleButtonPan() ); + m_canvas->SetEnableZoomNoCenter( dlg.GetEnableZoomNoCenter() ); m_canvas->SetMiddleButtonPanLimited( dlg.GetMiddleButtonPanLimited() ); m_canvas->SetEnableAutoPan( dlg.GetEnableAutoPan() ); SetForceHVLines( dlg.GetEnableHVBusOrientation() ); diff --git a/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp b/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp index d467a9da8d..70312afccc 100644 --- a/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp +++ b/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp @@ -98,6 +98,8 @@ void DIALOG_DISPLAY_OPTIONS::initOptDialog( ) m_OptDisplayDCodes->SetValue( m_Parent->IsElementVisible( DCODES_VISIBLE ) ); + + m_OptZoomNoCenter->SetValue( m_Parent->GetCanvas()->GetEnableZoomNoCenter() ); m_OptMiddleButtonPan->SetValue( m_Parent->GetCanvas()->GetEnableMiddleButtonPan() ); m_OptMiddleButtonPanLimited->SetValue( m_Parent->GetCanvas()->GetMiddleButtonPanLimited() ); m_OptMiddleButtonPanLimited->Enable( m_OptMiddleButtonPan->GetValue() ); @@ -141,6 +143,7 @@ void DIALOG_DISPLAY_OPTIONS::OnOKBUttonClick( wxCommandEvent& event ) m_Parent->SetPageSettings( pageInfo ); + m_Parent->GetCanvas()->SetEnableZoomNoCenter( m_OptZoomNoCenter->GetValue() ); m_Parent->GetCanvas()->SetEnableMiddleButtonPan( m_OptMiddleButtonPan->GetValue() ); m_Parent->GetCanvas()->SetMiddleButtonPanLimited( m_OptMiddleButtonPanLimited->GetValue() ); diff --git a/gerbview/dialogs/gerbview_dialog_display_options_frame_base.cpp b/gerbview/dialogs/gerbview_dialog_display_options_frame_base.cpp index 9bfb92a757..bd7af48f2f 100644 --- a/gerbview/dialogs/gerbview_dialog_display_options_frame_base.cpp +++ b/gerbview/dialogs/gerbview_dialog_display_options_frame_base.cpp @@ -86,6 +86,9 @@ DIALOG_DISPLAY_OPTIONS_BASE::DIALOG_DISPLAY_OPTIONS_BASE( wxWindow* parent, wxWi wxStaticBoxSizer* bLeftBottomSizer; bLeftBottomSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Pan:") ), wxVERTICAL ); + m_OptZoomNoCenter = new wxCheckBox( this, wxID_ANY, _("Zoom off center"), wxDefaultPosition, wxDefaultSize, 0 ); + bLeftBottomSizer->Add( m_OptZoomNoCenter, 0, wxALL, 5 ); + m_OptMiddleButtonPan = new wxCheckBox( this, wxID_ANY, _("Middle Button PAN Enabled"), wxDefaultPosition, wxDefaultSize, 0 ); bLeftBottomSizer->Add( m_OptMiddleButtonPan, 0, wxALL, 5 ); diff --git a/gerbview/dialogs/gerbview_dialog_display_options_frame_base.h b/gerbview/dialogs/gerbview_dialog_display_options_frame_base.h index 6b0e9c69e2..e81b066493 100644 --- a/gerbview/dialogs/gerbview_dialog_display_options_frame_base.h +++ b/gerbview/dialogs/gerbview_dialog_display_options_frame_base.h @@ -44,6 +44,7 @@ class DIALOG_DISPLAY_OPTIONS_BASE : public DIALOG_SHIM wxRadioBox* m_OptDisplayFlashedItems; wxRadioBox* m_OptDisplayPolygons; wxRadioBox* m_ShowPageLimits; + wxCheckBox* m_OptZoomNoCenter; wxCheckBox* m_OptMiddleButtonPan; wxCheckBox* m_OptMiddleButtonPanLimited; wxStaticLine* m_staticline1; diff --git a/include/class_drawpanel.h b/include/class_drawpanel.h index 2faa11e934..0e3fe4cf22 100644 --- a/include/class_drawpanel.h +++ b/include/class_drawpanel.h @@ -71,6 +71,7 @@ private: bool m_abortRequest; ///< Flag used to abort long commands. + bool m_enableZoomNoCenter; ///< True to enable zooming around the crosshair instead of the center bool m_enableMiddleButtonPan; ///< True to enable middle mouse button panning. bool m_panScrollbarLimits; ///< has meaning only if m_enableMiddleButtonPan = true ///< true to limit panning to scrollbar current limits @@ -134,6 +135,10 @@ public: void SetEnableMiddleButtonPan( bool aEnable ) { m_enableMiddleButtonPan = aEnable; } + bool GetEnableZoomNoCenter() const { return m_enableZoomNoCenter; } + + void SetEnableZoomNoCenter( bool aEnable ) { m_enableZoomNoCenter = aEnable; } + bool GetMiddleButtonPanLimited() const { return m_panScrollbarLimits; } void SetMiddleButtonPanLimited( bool aEnable ) { m_panScrollbarLimits = aEnable; } @@ -319,6 +324,18 @@ public: * warps the cursor to the current cross hair position. */ void MoveCursorToCrossHair(); + + /** + * Function ToDeviceXY + * transforms logical to device coordinates + */ + wxPoint ToDeviceXY( const wxPoint& pos ); + + /** + * Function ToLogicalXY + * transforms device to logical coordinates + */ + wxPoint ToLogicalXY( const wxPoint& pos ); /** * Function MoveCursor diff --git a/include/id.h b/include/id.h index 51389bc8da..4d517474af 100644 --- a/include/id.h +++ b/include/id.h @@ -241,6 +241,10 @@ enum main_id ID_TB_OPTIONS_SHOW_MODULE_TEXT_SKETCH, ID_TB_OPTIONS_SHOW_MODULE_EDGE_SKETCH, ID_TB_OPTIONS_SHOW_PADS_SKETCH, + + // zoom commands for non center zooming + ID_OFFCENTER_ZOOM_IN, + ID_OFFCENTER_ZOOM_OUT, ID_END_LIST }; diff --git a/include/wxstruct.h b/include/wxstruct.h index 6ad3791bc2..0b086423d7 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -674,6 +674,13 @@ public: */ void RedrawScreen( const wxPoint& aCenterPoint, bool aWarpPointer ); + /** + * Function RedrawScreen2 + * puts the crosshair back to the screen position it had before zooming + * @param beforePos The screen position of the crosshair before zooming + */ + void RedrawScreen2( const wxPoint& posBefore ); + /** * Function Zoom_Automatique * redraws the screen with best zoom level and the best centering diff --git a/pcbnew/dialogs/dialog_general_options.cpp b/pcbnew/dialogs/dialog_general_options.cpp index 5ef7f86559..329c9fae3d 100644 --- a/pcbnew/dialogs/dialog_general_options.cpp +++ b/pcbnew/dialogs/dialog_general_options.cpp @@ -88,6 +88,7 @@ void DIALOG_GENERALOPTIONS::init() m_TrackAutodel->SetValue( g_AutoDeleteOldTrack ); m_Track_45_Only_Ctrl->SetValue( g_Track_45_Only_Allowed ); m_Segments_45_Only_Ctrl->SetValue( Segments_45_Only ); + m_ZoomNoCenterOpt->SetValue( GetParent()->GetCanvas()->GetEnableZoomNoCenter() ); m_MiddleButtonPANOpt->SetValue( GetParent()->GetCanvas()->GetEnableMiddleButtonPan() ); m_OptMiddleButtonPanLimited->SetValue( GetParent()->GetCanvas()->GetMiddleButtonPanLimited() ); m_OptMiddleButtonPanLimited->Enable( m_MiddleButtonPANOpt->GetValue() ); @@ -137,6 +138,7 @@ void DIALOG_GENERALOPTIONS::OnOkClick( wxCommandEvent& event ) Segments_45_Only = m_Segments_45_Only_Ctrl->GetValue(); g_Track_45_Only_Allowed = m_Track_45_Only_Ctrl->GetValue(); + GetParent()->GetCanvas()->SetEnableZoomNoCenter( m_ZoomNoCenterOpt->GetValue() ); GetParent()->GetCanvas()->SetEnableMiddleButtonPan( m_MiddleButtonPANOpt->GetValue() ); GetParent()->GetCanvas()->SetMiddleButtonPanLimited( m_OptMiddleButtonPanLimited->GetValue() ); diff --git a/pcbnew/dialogs/dialog_general_options_BoardEditor_base.cpp b/pcbnew/dialogs/dialog_general_options_BoardEditor_base.cpp index 580a7e0238..800ef02716 100644 --- a/pcbnew/dialogs/dialog_general_options_BoardEditor_base.cpp +++ b/pcbnew/dialogs/dialog_general_options_BoardEditor_base.cpp @@ -149,6 +149,11 @@ DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE::DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE( wxStaticBoxSizer* sbSizer2PAN; sbSizer2PAN = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Pan:") ), wxVERTICAL ); + m_ZoomNoCenterOpt = new wxCheckBox( this, wxID_ZOOMNOCENTER, _("Zoom off center"), wxDefaultPosition, wxDefaultSize, 0 ); + m_ZoomNoCenterOpt->SetToolTip( _("Keep the cursor at its current location when zooming") ); + + sbSizer2PAN->Add( m_ZoomNoCenterOpt, 0, wxALL, 5 ); + m_MiddleButtonPANOpt = new wxCheckBox( this, wxID_MIDDLEBUTTONPAN, _("Middle Button PAN Enabled"), wxDefaultPosition, wxDefaultSize, 0 ); m_MiddleButtonPANOpt->SetToolTip( _("Use middle mouse button dragging to pan") ); diff --git a/pcbnew/dialogs/dialog_general_options_BoardEditor_base.h b/pcbnew/dialogs/dialog_general_options_BoardEditor_base.h index 1fb3caf993..e180af8c8c 100644 --- a/pcbnew/dialogs/dialog_general_options_BoardEditor_base.h +++ b/pcbnew/dialogs/dialog_general_options_BoardEditor_base.h @@ -50,6 +50,7 @@ class DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE : public DIALOG_SHIM wxID_TRACKS45, wxID_SEGMENTS45, wxID_MAGNETIC_TRACKS, + wxID_ZOOMNOCENTER, wxID_MIDDLEBUTTONPAN, wxID_AUTOPAN }; @@ -72,6 +73,7 @@ class DIALOG_GENERALOPTIONS_BOARDEDITOR_BASE : public DIALOG_SHIM wxCheckBox* m_Track_DoubleSegm_Ctrl; wxRadioBox* m_MagneticPadOptCtrl; wxRadioBox* m_MagneticTrackOptCtrl; + wxCheckBox* m_ZoomNoCenterOpt; wxCheckBox* m_MiddleButtonPANOpt; wxCheckBox* m_OptMiddleButtonPanLimited; wxCheckBox* m_AutoPANOpt;