Hi all, The attached patch refactors ZOOM_TOOL to common so that it can be used in GerbView, and adds a new behavior where you can use the right mouse button to zoom out when the zoom to selection tool is active. I find this behavior useful when using a 2-button mouse.
Best, Jon
From 21d6d116c4157f0cec132e2c9f64b9c4c1895de7 Mon Sep 17 00:00:00 2001 From: Jon Evans <j...@craftyjon.com> Date: Wed, 30 Aug 2017 22:35:30 -0400 Subject: [PATCH] Move ZOOM_TOOL to common; add RMB-drag to zoom out --- common/CMakeLists.txt | 1 + common/tool/actions.cpp | 4 ++++ {pcbnew/tools => common/tool}/zoom_tool.cpp | 36 ++++++++++++++++++----------- {pcbnew/tools => common/tool}/zoom_tool.h | 6 ++--- include/draw_frame.h | 14 +++++++++++ include/tool/actions.h | 1 + pcbnew/CMakeLists.txt | 1 - pcbnew/moduleframe.cpp | 2 +- pcbnew/tools/pcb_actions.cpp | 2 +- pcbnew/tools/pcb_actions.h | 3 +-- pcbnew/tools/pcbnew_control.cpp | 4 ---- pcbnew/tools/tools_common.cpp | 2 +- 12 files changed, 50 insertions(+), 26 deletions(-) rename {pcbnew/tools => common/tool}/zoom_tool.cpp (75%) rename {pcbnew/tools => common/tool}/zoom_tool.h (91%) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 13f2f9871..42fa4ddb2 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -337,6 +337,7 @@ set( COMMON_SRCS tool/tool_menu.cpp tool/conditional_menu.cpp tool/selection_conditions.cpp + tool/zoom_tool.cpp geometry/seg.cpp geometry/shape.cpp diff --git a/common/tool/actions.cpp b/common/tool/actions.cpp index 2bd8661d3..0aa24e8cb 100644 --- a/common/tool/actions.cpp +++ b/common/tool/actions.cpp @@ -35,6 +35,10 @@ TOOL_ACTION ACTIONS::zoomFitScreen( "common.Control.zoomFitScreen", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_AUTO ), _( "Zoom Auto" ), "", zoom_fit_in_page_xpm ); +TOOL_ACTION ACTIONS::zoomTool( "common.Control.zoomTool", + AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_SELECTION ), + _( "Zoom to Selection" ), "", NULL, AF_ACTIVATE ); + TOOL_ACTION ACTIONS::zoomPreset( "common.Control.zoomPreset", AS_GLOBAL, 0, "", "" ); diff --git a/pcbnew/tools/zoom_tool.cpp b/common/tool/zoom_tool.cpp similarity index 75% rename from pcbnew/tools/zoom_tool.cpp rename to common/tool/zoom_tool.cpp index 685a0be0e..1180dde64 100644 --- a/pcbnew/tools/zoom_tool.cpp +++ b/common/tool/zoom_tool.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2017 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 @@ -23,14 +23,13 @@ #include <view/view_controls.h> #include <view/view.h> #include <tool/tool_manager.h> +#include <tool/actions.h> +#include <tool/zoom_tool.h> #include <preview_items/selection_area.h> -#include "zoom_tool.h" -#include "pcb_actions.h" - ZOOM_TOOL::ZOOM_TOOL() : - TOOL_INTERACTIVE( "pcbnew.Control.zoomTool" ) + TOOL_INTERACTIVE( "common.Control.zoomTool" ) { m_frame = NULL; } @@ -41,14 +40,14 @@ ZOOM_TOOL::~ZOOM_TOOL() {} void ZOOM_TOOL::Reset( RESET_REASON aReason ) { - m_frame = getEditFrame<PCB_EDIT_FRAME>(); + m_frame = getEditFrame<EDA_DRAW_FRAME>(); } int ZOOM_TOOL::Main( const TOOL_EVENT& aEvent ) { // This method is called both when the zoom tool is activated (on) or deactivated (off) - bool zoom_tool_is_on = m_frame->GetMainToolBar()->GetToolToggled( ID_ZOOM_SELECTION ); + bool zoom_tool_is_on = m_frame->GetToolToggled( ID_ZOOM_SELECTION ); if( !zoom_tool_is_on ) // This is a tool deselection: do nothing return 0; @@ -60,7 +59,7 @@ int ZOOM_TOOL::Main( const TOOL_EVENT& aEvent ) if( evt->IsCancel() || evt->IsActivate() ) break; - else if( evt->IsDrag( BUT_LEFT ) ) + else if( evt->IsDrag( BUT_LEFT ) || evt->IsDrag( BUT_RIGHT ) ) { if( selectRegion() ) break; @@ -94,7 +93,7 @@ bool ZOOM_TOOL::selectRegion() break; } - if( evt->IsDrag( BUT_LEFT ) ) + if( evt->IsDrag( BUT_LEFT ) || evt->IsDrag( BUT_RIGHT ) ) { area.SetOrigin( evt->DragOrigin() ); area.SetEnd( evt->Position() ); @@ -102,7 +101,7 @@ bool ZOOM_TOOL::selectRegion() view->Update( &area, KIGFX::GEOMETRY ); } - if( evt->IsMouseUp( BUT_LEFT ) ) + if( evt->IsMouseUp( BUT_LEFT ) || evt->IsMouseUp( BUT_RIGHT ) ) { view->SetVisible( &area, false ); auto selectionBox = area.ViewBBox(); @@ -116,8 +115,19 @@ bool ZOOM_TOOL::selectRegion() else { VECTOR2D vsize = selectionBox.GetSize(); - double scale = view->GetScale() / std::max( fabs( vsize.x / screenSize.x ), - fabs( vsize.y / screenSize.y ) ); + double scale; + double ratio = std::max( fabs( vsize.x / screenSize.x ), + fabs( vsize.y / screenSize.y ) ); + + if( evt->IsMouseUp( BUT_LEFT ) ) + { + scale = view->GetScale() / ratio; + } + else + { + scale = view->GetScale() * ratio; + } + view->SetScale( scale ); view->SetCenter( selectionBox.Centre() ); @@ -136,5 +146,5 @@ bool ZOOM_TOOL::selectRegion() void ZOOM_TOOL::setTransitions() { - Go( &ZOOM_TOOL::Main, PCB_ACTIONS::zoomTool.MakeEvent() ); + Go( &ZOOM_TOOL::Main, ACTIONS::zoomTool.MakeEvent() ); } diff --git a/pcbnew/tools/zoom_tool.h b/common/tool/zoom_tool.h similarity index 91% rename from pcbnew/tools/zoom_tool.h rename to common/tool/zoom_tool.h index 801128ae4..e3ad31a15 100644 --- a/pcbnew/tools/zoom_tool.h +++ b/common/tool/zoom_tool.h @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2017 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 @@ -22,7 +22,7 @@ #include <tool/tool_interactive.h> -class PCB_EDIT_FRAME; +class EDA_DRAW_FRAME; class ZOOM_TOOL : public TOOL_INTERACTIVE @@ -42,7 +42,7 @@ public: private: bool selectRegion(); - PCB_EDIT_FRAME* m_frame; + EDA_DRAW_FRAME* m_frame; }; #endif // _ZOOM_TOOL_H diff --git a/include/draw_frame.h b/include/draw_frame.h index 842d92063..aa01690d0 100644 --- a/include/draw_frame.h +++ b/include/draw_frame.h @@ -393,6 +393,20 @@ public: wxAuiToolBar* GetMainToolBar() const { return m_mainToolBar; } /** + * Checks all the toolbars and returns true if the given tool id is toggled. + * + * This is needed because GerbView and Pcbnew put some of the same tools in + * different toolbars (for example, zoom selection is in the main bar in + * Pcbnew and in the options bar in GerbView). + */ + bool GetToolToggled( int aToolId ) + { + return ( m_mainToolBar->GetToolToggled( aToolId ) || + m_optionsToolBar->GetToolToggled( aToolId ) || + m_drawToolBar->GetToolToggled( aToolId ) ); + } + + /** * Function SetToolID * sets the tool command ID to \a aId and sets the cursor to \a aCursor. The * command ID must be greater or equal ::ID_NO_TOOL_SELECTED. If the command diff --git a/include/tool/actions.h b/include/tool/actions.h index 114c7f0a7..1eb5be8f7 100644 --- a/include/tool/actions.h +++ b/include/tool/actions.h @@ -55,6 +55,7 @@ public: static TOOL_ACTION zoomCenter; static TOOL_ACTION zoomFitScreen; static TOOL_ACTION zoomPreset; + static TOOL_ACTION zoomTool; // Grid control static TOOL_ACTION gridFast1; diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index a57c035f5..8deba7d43 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -310,7 +310,6 @@ set( PCBNEW_CLASS_SRCS tools/grid_helper.cpp tools/pad_tool.cpp tools/picker_tool.cpp - tools/zoom_tool.cpp tools/zone_create_helper.cpp tools/tools_common.cpp tools/tool_event_utils.cpp diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp index 526d024d8..974dc296d 100644 --- a/pcbnew/moduleframe.cpp +++ b/pcbnew/moduleframe.cpp @@ -62,9 +62,9 @@ #include <tool/tool_manager.h> #include <tool/common_tools.h> #include <tool/tool_dispatcher.h> +#include <tool/zoom_tool.h> #include "tools/selection_tool.h" -#include "tools/zoom_tool.h" #include "tools/edit_tool.h" #include "tools/drawing_tool.h" #include "tools/point_editor.h" diff --git a/pcbnew/tools/pcb_actions.cpp b/pcbnew/tools/pcb_actions.cpp index a3a399351..aba31f22a 100644 --- a/pcbnew/tools/pcb_actions.cpp +++ b/pcbnew/tools/pcb_actions.cpp @@ -145,7 +145,7 @@ boost::optional<TOOL_EVENT> PCB_ACTIONS::TranslateLegacyId( int aId ) return PCB_ACTIONS::selectionTool.MakeEvent(); case ID_ZOOM_SELECTION: - return PCB_ACTIONS::zoomTool.MakeEvent(); + return ACTIONS::zoomTool.MakeEvent(); case ID_PCB_DELETE_ITEM_BUTT: case ID_MODEDIT_DELETE_TOOL: diff --git a/pcbnew/tools/pcb_actions.h b/pcbnew/tools/pcb_actions.h index a39138268..b82f14293 100644 --- a/pcbnew/tools/pcb_actions.h +++ b/pcbnew/tools/pcb_actions.h @@ -204,7 +204,7 @@ public: /// Activation of the Push and Shove router (inline dragging mode) static TOOL_ACTION routerInlineDrag; - + // Point Editor /// Break outline (insert additional points to an edge) static TOOL_ACTION pointEditorAddCorner; @@ -354,7 +354,6 @@ public: // Miscellaneous static TOOL_ACTION selectionTool; - static TOOL_ACTION zoomTool; static TOOL_ACTION pickerTool; static TOOL_ACTION resetCoords; static TOOL_ACTION measureTool; diff --git a/pcbnew/tools/pcbnew_control.cpp b/pcbnew/tools/pcbnew_control.cpp index c3cc52c5c..3ef2490bc 100644 --- a/pcbnew/tools/pcbnew_control.cpp +++ b/pcbnew/tools/pcbnew_control.cpp @@ -197,10 +197,6 @@ TOOL_ACTION PCB_ACTIONS::selectionTool( "pcbnew.Control.selectionTool", AS_GLOBAL, 0, "", "", NULL, AF_ACTIVATE ); -TOOL_ACTION PCB_ACTIONS::zoomTool( "pcbnew.Control.zoomTool", - AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_SELECTION ), - _( "Zoom to Selection" ), "", NULL, AF_ACTIVATE ); - TOOL_ACTION PCB_ACTIONS::resetCoords( "pcbnew.Control.resetCoords", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_RESET_LOCAL_COORD ), "", "" ); diff --git a/pcbnew/tools/tools_common.cpp b/pcbnew/tools/tools_common.cpp index 19ae71bf7..499a5f9fe 100644 --- a/pcbnew/tools/tools_common.cpp +++ b/pcbnew/tools/tools_common.cpp @@ -27,9 +27,9 @@ #include <tool/tool_manager.h> #include <tool/common_tools.h> +#include <tool/zoom_tool.h> #include <tools/selection_tool.h> -#include <tools/zoom_tool.h> #include <tools/picker_tool.h> #include <tools/edit_tool.h> #include <tools/drawing_tool.h> -- 2.11.0
_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp