diff options
Diffstat (limited to 'include/view/view_controls.h')
-rw-r--r-- | include/view/view_controls.h | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/include/view/view_controls.h b/include/view/view_controls.h new file mode 100644 index 0000000..d91a0f2 --- /dev/null +++ b/include/view/view_controls.h @@ -0,0 +1,269 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2013 CERN + * Copyright (C) 2013-2016 KiCad Developers, see AUTHORS.txt for contributors. + * + * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch> + * + * 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 + * + */ + +/** + * @file view_controls.h + * @brief VIEW_CONTROLS class definition. + */ + +#ifndef __VIEW_CONTROLS_H +#define __VIEW_CONTROLS_H + +#include <math/box2.h> + +namespace KIGFX +{ +class VIEW; + +/** + * Class VIEW_CONTROLS + * is an interface for classes handling user events controlling the view behaviour + * (such as zooming, panning, mouse grab, etc.) + */ +class VIEW_CONTROLS +{ +public: + VIEW_CONTROLS( VIEW* aView ) : m_view( aView ), + m_forceCursorPosition( false ), m_cursorCaptured( false ), m_snappingEnabled( false ), + m_grabMouse( false ), m_autoPanEnabled( false ), m_autoPanMargin( 0.1 ), + m_autoPanSpeed( 0.15 ), m_warpCursor( false ), m_enableMousewheelPan( false ) + { + } + + virtual ~VIEW_CONTROLS() + {} + + /** + * Function SetSnapping() + * Enables/disables snapping cursor to grid. + * + * @param aEnabled says whether the opion should be enabled or disabled. + */ + virtual void SetSnapping( bool aEnabled ) + { + m_snappingEnabled = aEnabled; + } + + /** + * Function SetGrabMouse + * Turns on/off mouse grabbing. When the mouse is grabbed, it cannot go outside the VIEW. + * @param aEnabled tells if mouse should be grabbed or not. + */ + virtual void SetGrabMouse( bool aEnabled ) + { + m_grabMouse = aEnabled; + } + + /** + * Function SetAutoPan + * Turns on/off auto panning (this feature is used when there is a tool active (eg. drawing a + * track) and user moves mouse to the VIEW edge - then the view can be translated or not). + * @param aEnabled tells if the autopanning should be active. + */ + virtual void SetAutoPan( bool aEnabled ) + { + m_autoPanEnabled = aEnabled; + } + + /** + * Function SetAutoPanSpeed() + * Sets speed of autopanning. + * @param aSpeed is a new speed for autopanning. + */ + virtual void SetAutoPanSpeed( float aSpeed ) + { + m_autoPanSpeed = aSpeed; + } + + /** + * Function SetAutoPanMArgin() + * Sets margin for autopanning (ie. the area when autopanning becomes active). + * @param aMargin is a new margin for autopanning. + */ + virtual void SetAutoPanMargin( float aMargin ) + { + m_autoPanMargin = aMargin; + } + + /** + * Function GetMousePosition() + * Returns the current mouse pointer position in screen coordinates. Note, that it may be + * different from the cursor position if snapping is enabled (@see GetCursorPosition()). + * + * @return The current mouse pointer position in the screen coordinates. + */ + virtual VECTOR2I GetMousePosition() const = 0; + + /** + * Function GetCursorPosition() + * Returns the current cursor position in world coordinates. Note, that it may be + * different from the mouse pointer position if snapping is enabled or cursor position + * is forced to specific point. + * + * @return The current cursor position in world coordinates. + */ + virtual VECTOR2D GetCursorPosition() const = 0; + + /** + * Function ForceCursorPosition() + * Places the cursor immediately at a given point. Mouse movement is ignored. + * @param aEnabled enable forced cursor position + * @param aPosition the position (world coordinates). + */ + virtual void ForceCursorPosition( bool aEnabled, const VECTOR2D& aPosition = VECTOR2D( 0, 0 ) ) + { + m_forcedPosition = aPosition; + m_forceCursorPosition = aEnabled; + } + + /** + * Function ShowCursor() + * Enables or disables display of cursor. + * @param aEnabled decides if the cursor should be shown. + */ + virtual void ShowCursor( bool aEnabled ); + + /** + * Function CaptureCursor() + * Forces the cursor to stay within the drawing panel area. + * @param aEnabled determines if the cursor should be captured. + */ + virtual void CaptureCursor( bool aEnabled ) + { + m_cursorCaptured = aEnabled; + } + + inline bool IsCursorPositionForced() const + { + return m_forceCursorPosition; + } + + /** + * Function WarpCursor() + * If enabled (@see SetEnableCursorWarping(), warps the cursor to the specified position, + * expressed either in the screen coordinates or the world coordinates. + * @param aPosition is the position where the cursor should be warped. + * @param aWorldCoordinates if true treats aPosition as the world coordinates, otherwise it + * uses it as the screen coordinates. + * @param aWarpView determines if the view can be warped too (only matters if the position is + * specified in the world coordinates and its not visible in the current viewport). + */ + virtual void WarpCursor( const VECTOR2D& aPosition, bool aWorldCoordinates = false, + bool aWarpView = false ) const = 0; + + /** + * Function EnableCursorWarping() + * Enables or disables warping the cursor. + * @param aEnabled is true if the cursor is allowed to be warped. + */ + void EnableCursorWarping( bool aEnable ) + { + m_warpCursor = aEnable; + } + + /** + * Function IsCursorWarpingEnabled() + * Returns the current setting for cursor warping. + */ + bool IsCursorWarpingEnabled() const + { + return m_warpCursor; + } + + /** + * Function EnableMousewheelPan() + * Enables or disables mousewheel panning. + * @param aEnabled is true if mouse-wheel panning is enabled. + */ + virtual void EnableMousewheelPan( bool aEnable ) + { + m_enableMousewheelPan = aEnable; + } + + /** + * Function IsMousewheelPanEnabled() + * Returns the current setting for mousewheel panning + */ + virtual bool IsMousewheelPanEnabled() const + { + return m_enableMousewheelPan; + } + + /** + * Function CenterOnCursor() + * Sets the viewport center to the current cursor position and warps the cursor to the + * screen center. + */ + virtual void CenterOnCursor() const = 0; + + /** + * Function Reset() + * Restores the default VIEW_CONTROLS settings. + */ + virtual void Reset(); + +protected: + /// Pointer to controlled VIEW. + VIEW* m_view; + + /// Current cursor position + VECTOR2D m_cursorPosition; + + /// Forced cursor position + VECTOR2D m_forcedPosition; + + /// Is the forced cursor position enabled + bool m_forceCursorPosition; + + /// Should the cursor be locked within the parent window area + bool m_cursorCaptured; + + /// Should the cursor snap to grid or move freely + bool m_snappingEnabled; + + /// Flag for grabbing the mouse cursor + bool m_grabMouse; + + /// Flag for turning on autopanning + bool m_autoPanEnabled; + + /// Distance from cursor to VIEW edge when panning is active + float m_autoPanMargin; + + /// How fast is panning when in auto mode + float m_autoPanSpeed; + + /// If the cursor is allowed to be warped + bool m_warpCursor; + + /// Mousewheel (2-finger touchpad) panning + bool m_enableMousewheelPan; +}; +} // namespace KIGFX + +#endif |