48#define USE_MOUSE_CAPTURE 
   68        return std::make_unique<ACCELERATING_ZOOM_CONTROLLER>();
 
 
  130#if defined USE_MOUSE_CAPTURE 
  136    if( 
m_parentPanel->EnableTouchEvents( wxTOUCH_ZOOM_GESTURE | wxTOUCH_PAN_GESTURES ) )
 
  153    m_settings.m_lastKeyboardCursorPositionValid = 
false;
 
  154    m_settings.m_lastKeyboardCursorPosition = { 0.0, 0.0 };
 
 
  161#if defined USE_MOUSE_CAPTURE 
 
  215    ( *m_MotionEventCounter )++;
 
  220    bool     isAutoPanning = 
false;
 
  234        if( screenPos != keyboardScreenPos )
 
  236            m_settings.m_lastKeyboardCursorPositionValid = 
false;
 
  237            m_settings.m_lastKeyboardCursorPosition = { 0.0, 0.0 };
 
  265    if( 
m_settings.m_motionPanModifier != WXK_NONE
 
  266        && wxGetKeyState( 
static_cast<wxKeyCode
>( 
m_settings.m_motionPanModifier ) ) )
 
  272            aEvent.StopPropagation();
 
  280            aEvent.StopPropagation();
 
  302    if( !isAutoPanning && aEvent.Dragging() )
 
  306            static bool justWarped = 
false;
 
  313                warpX = parentSize.x;
 
  315            else if( x >= parentSize.x )
 
  317                warpX = -parentSize.x;
 
  322                warpY = parentSize.y;
 
  324            else if( y >= parentSize.y )
 
  326                warpY = -parentSize.y;
 
  335                aEvent.StopPropagation();
 
  360            static bool justWarped = 
false;
 
  366                warpY = parentSize.y;
 
  368            else if( y >= parentSize.y )
 
  370                warpY = -parentSize.y;
 
  383                aEvent.StopPropagation();
 
 
  415    const double wheelPanSpeed = 0.001;
 
  416    const int    axis = aEvent.GetWheelAxis();
 
  418    if( axis == wxMOUSE_WHEEL_HORIZONTAL && !
m_settings.m_horizontalPan )
 
  425    if( aEvent.ShiftDown() )
 
  428        modifiers = WXK_SHIFT;
 
  431    if( aEvent.ControlDown() )
 
  434        modifiers = modifiers == 0 ? WXK_CONTROL : modifiers;
 
  437    if( aEvent.AltDown() )
 
  440        modifiers = modifiers == 0 ? WXK_ALT : modifiers;
 
  449        if( modifiers == 
m_settings.m_scrollModifierZoom && axis == wxMOUSE_WHEEL_VERTICAL )
 
  451            const int    rotation = aEvent.GetWheelRotation() * ( 
m_settings.m_scrollReverseZoom ? -1 : 1 );
 
  473                                 * ( (double) aEvent.GetWheelRotation() * wheelPanSpeed );
 
  474            double scrollX = 0.0;
 
  475            double scrollY = 0.0;
 
  476            bool   hReverse = 
false;
 
  478            if( axis != wxMOUSE_WHEEL_HORIZONTAL )
 
  481            if( axis == wxMOUSE_WHEEL_HORIZONTAL || modifiers == 
m_settings.m_scrollModifierPanH )
 
  484                    scrollX = scrollVec.
x;
 
  486                    scrollX = ( axis == wxMOUSE_WHEEL_HORIZONTAL ) ? scrollVec.
x : -scrollVec.
x;
 
  490                scrollY = -scrollVec.
y;
 
 
  515    m_view->SetScale( 
m_view->GetScale() * ( aEvent.GetMagnification() + 1.0f ), 
anchor );
 
 
  540#if defined USE_MOUSE_CAPTURE 
  552#if defined USE_MOUSE_CAPTURE 
  558        if( aEvent.LeftUp() )
 
  565        if( aEvent.MiddleUp() || aEvent.LeftUp() || aEvent.RightUp() )
 
  570#if defined USE_MOUSE_CAPTURE 
 
  593#if defined( _WIN32 ) || defined( __WXGTK__ ) 
 
  613#if !defined USE_MOUSE_CAPTURE 
 
  660        double borderSize = std::min( 
m_settings.m_autoPanMargin * 
m_view->GetScreenPixelSize().x,
 
  670        float accel = 0.5f + ( 
m_settings.m_autoPanAcceleration / 5.0f );
 
  676            dir = dir.
Resize( borderSize * accel );
 
  678            dir = dir.
Resize( borderSize );
 
  680        dir = 
m_view->ToWorld( dir, 
false );
 
 
  698    if( aEvent.IsGestureStart() )
 
  704    VECTOR2D evtPos( aEvent.GetPosition().x, aEvent.GetPosition().y );
 
  710                      m_view->ToWorld( evtPos ) );
 
 
  721    VECTOR2I screenDelta( aEvent.GetDelta().x, aEvent.GetDelta().y );
 
 
  732    const double linePanDelta = 0.05;
 
  733    const double pagePanDelta = 0.5;
 
  735    int type = aEvent.GetEventType();
 
  736    int dir = aEvent.GetOrientation();
 
  738    if( type == wxEVT_SCROLLWIN_THUMBTRACK )
 
  741        const auto& boundary = 
m_view->GetBoundary();
 
  744        const double xstart = ( 
m_view->IsMirroredX() ? boundary.GetRight() : boundary.GetLeft() );
 
  745        const double xdelta = ( 
m_view->IsMirroredX() ? -1 : 1 );
 
  747        if( dir == wxHORIZONTAL )
 
  754    else if( type == wxEVT_SCROLLWIN_THUMBRELEASE || type == wxEVT_SCROLLWIN_TOP || type == wxEVT_SCROLLWIN_BOTTOM )
 
  763        if( type == wxEVT_SCROLLWIN_PAGEUP )
 
  767        else if( type == wxEVT_SCROLLWIN_PAGEDOWN )
 
  769            dist = -pagePanDelta;
 
  771        else if( type == wxEVT_SCROLLWIN_LINEUP )
 
  775        else if( type == wxEVT_SCROLLWIN_LINEDOWN )
 
  777            dist = -linePanDelta;
 
  781            wxCHECK_MSG( 
false, , wxT( 
"Unhandled event type" ) );
 
  786        double scrollX = 0.0;
 
  787        double scrollY = 0.0;
 
  789        if( dir == wxHORIZONTAL )
 
 
  805#if defined USE_MOUSE_CAPTURE 
 
  839#if defined USE_MOUSE_CAPTURE 
 
  893    if( aTriggeredByArrows )
 
  895        m_settings.m_lastKeyboardCursorPositionValid = 
true;
 
  896        m_settings.m_lastKeyboardCursorPosition = clampedPosition;
 
  897        m_settings.m_lastKeyboardCursorCommand = aArrowCommand;
 
  902        m_settings.m_lastKeyboardCursorPositionValid = 
false;
 
  903        m_settings.m_lastKeyboardCursorPosition = { 0.0, 0.0 };
 
 
  919    const VECTOR2I& screenSize = 
m_view->GetGAL()->GetScreenPixelSize();
 
  923    if( aWarpView && !screen.
Contains( screenPos ) )
 
  924        m_view->SetCenter( clampedPosition );
 
 
  932    if( aWorldCoordinates )
 
  934        const VECTOR2I& screenSize = 
m_view->GetGAL()->GetScreenPixelSize();
 
  943                m_view->SetCenter( clampedPosition );
 
 
  965    const VECTOR2I& screenSize = 
m_view->GetGAL()->GetScreenPixelSize();
 
  966    VECTOR2D        screenCenter( screenSize / 2 );
 
  974            m_view->SetCenter( newCenter );
 
 
  983    int border = std::min( 
m_settings.m_autoPanMargin * 
m_view->GetScreenPixelSize().x,
 
  988    VECTOR2D botRight( 
m_view->GetScreenPixelSize().x - border, 
m_view->GetScreenPixelSize().y - border );
 
  990    topLeft = 
m_view->ToWorld( topLeft );
 
  991    botRight = 
m_view->ToWorld( botRight );
 
  995    if( pos.
x < topLeft.
x )
 
  997    else if( pos.
x > botRight.
x )
 
 1000    if( pos.
y < topLeft.
y )
 
 1002    else if( pos.
y > botRight.
y )
 
 1007    if( aWarpMouseCursor )
 
 
 1014    VECTOR2I p( aEvent.GetX(), aEvent.GetY() );
 
 1031    int borderStart = std::min( 
m_settings.m_autoPanMargin * 
m_view->GetScreenPixelSize().x,
 
 1033    borderStart = std::max( borderStart, 2 );
 
 1034    int borderEndX = 
m_view->GetScreenPixelSize().x - borderStart;
 
 1035    int borderEndY = 
m_view->GetScreenPixelSize().y - borderStart;
 
 1037    if( p.
x < borderStart )
 
 1039    else if( p.
x > borderEndX )
 
 1044    if( p.
y < borderStart )
 
 1046    else if( p.
y > borderEndY )
 
 1070            m_panTimer.Start( (
int) ( 250.0 / 60.0 ), 
true );
 
 1081    wxCHECK_MSG( 
false, 
false, wxT( 
"This line should never be reached" ) );
 
 
 1099        else if( x >= parentSize.x )
 
 1101            x = parentSize.x - 1;
 
 1110        else if( y >= parentSize.y )
 
 1112            y = parentSize.y - 1;
 
 
 1127    moveEvent.SetX( msp.x );
 
 1128    moveEvent.SetY( msp.y );
 
 1133        moveEvent.SetControlDown( wxGetKeyState( WXK_CONTROL ) );
 
 1134        moveEvent.SetShiftDown( wxGetKeyState( WXK_SHIFT ) );
 
 1135        moveEvent.SetAltDown( wxGetKeyState( WXK_ALT ) );
 
 
 1167    if( 
m_view->IsMirroredX() )
 
 1173        || newRange.
y != 
m_parentPanel->GetScrollRange( wxSB_VERTICAL ) )
 
 1175        m_parentPanel->SetScrollbars( 1, 1, newRange.
x, newRange.
y, newScroll.
x, newScroll.
y, 
true );
 
 1178#if !defined( __APPLE__ ) && !defined( WIN32 ) 
 
 1193    m_settings.m_forcedPosition = clampedPosition;
 
 
constexpr size_type GetWidth() const
 
constexpr Vec Centre() const
 
constexpr size_type GetHeight() const
 
constexpr coord_type GetLeft() const
 
constexpr bool Contains(const Vec &aPoint) const
 
constexpr coord_type GetRight() const
 
constexpr coord_type GetTop() const
 
The base class for create windows for drawing purpose.
 
static constexpr double MAC_SCALE
A suitable (magic) scale factor for Mac systems.
 
static constexpr double MSW_SCALE
A suitable (magic) scale factor for Windows systems.
 
static constexpr double GTK3_SCALE
A suitable (magic) scale factor for GTK3 systems.
 
static constexpr double MANUAL_SCALE_FACTOR
Multiplier for manual scale ssetting.
 
Abstract interface for drawing on a 2D-surface.
 
VECTOR2D GetGridPoint(const VECTOR2D &aPoint) const
For a given point it returns the nearest point belonging to the grid in world coordinates.
 
bool GetGridSnapping() const
 
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
 
bool m_cursorWarped
Application warped the cursor, not the user (keyboard).
 
bool IsCursorWarpingEnabled() const
 
VC_SETTINGS m_settings
Current VIEW_CONTROLS settings.
 
VIEW * m_view
Pointer to controlled VIEW.
 
VIEW_CONTROLS(VIEW *aView)
 
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
 
bool m_updateCursor
Flag deciding whether the cursor position should be calculated using the mouse position.
 
bool m_infinitePanWorks
Flag to indicate if infinite panning works on this platform.
 
void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView) override
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
 
void LoadSettings() override
Applies VIEW_CONTROLS settings from the program COMMON_SETTINGS.
 
void setState(STATE aNewState)
Set the interaction state, simply a internal setter to make it easier to debug changes.
 
STATE m_state
Current state of VIEW_CONTROLS.
 
void CaptureCursor(bool aEnabled) override
Force the cursor to stay within the drawing panel area.
 
VECTOR2D m_metaPanStart
Last mouse position when panning via the meta key.
 
bool m_metaPanning
True if we are panning via the meta key.
 
void onScroll(wxScrollWinEvent &aEvent)
 
wxTimer m_panTimer
Timer responsible for handling autopanning.
 
void CancelDrag()
End any mouse drag action still in progress.
 
VECTOR2D m_gestureLastPos
 
void onButton(wxMouseEvent &aEvent)
 
double m_gestureLastZoomFactor
Used to track gesture events.
 
void onEnter(wxMouseEvent &WXUNUSED(aEvent))
 
void onWheel(wxMouseEvent &aEvent)
Handler functions.
 
VECTOR2I m_scrollPos
Current scrollbar position.
 
void refreshMouse(bool aSetModifiers)
Send an event to refresh mouse position.
 
WX_VIEW_CONTROLS(VIEW *aView, EDA_DRAW_PANEL_GAL *aParentPanel)
 
void onZoomGesture(wxZoomGestureEvent &aEvent)
 
void PinCursorInsideNonAutoscrollArea(bool aWarpMouseCursor) override
 
void SetCursorPosition(const VECTOR2D &aPosition, bool warpView, bool aTriggeredByArrows, long aArrowCommand) override
Move cursor to the requested position expressed in world coordinates.
 
VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const override
Return the current mouse pointer position.
 
void WarpMouseCursor(const VECTOR2D &aPosition, bool aWorldCoordinates=false, bool aWarpView=false) override
 
void onMagnify(wxMouseEvent &aEvent)
 
VECTOR2D GetRawCursorPosition(bool aSnappingEnabled=true) const override
Return the current cursor position in world coordinates ignoring the cursorUp position force mode.
 
VECTOR2D m_scrollScale
Ratio used for scaling world coordinates to scrollbar position.
 
bool handleAutoPanning(const wxMouseEvent &aEvent)
Compute new viewport settings while in autopanning mode.
 
wxPoint getMouseScreenPosition() const
Get the cursor position in the screen coordinates.
 
void onPanGesture(wxPanGestureEvent &aEvent)
 
void onTimer(wxTimerEvent &WXUNUSED(aEvent))
 
std::unique_ptr< ZOOM_CONTROLLER > m_zoomController
A ZOOM_CONTROLLER that determines zoom steps. This is platform-specific.
 
STATE
Possible states for WX_VIEW_CONTROLS.
 
@ DRAG_PANNING
Panning with mouse button pressed.
 
@ AUTO_PANNING
Panning on approaching borders of the frame.
 
@ DRAG_ZOOMING
Zooming with mouse button pressed.
 
@ IDLE
Nothing is happening.
 
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
 
void CenterOnCursor() override
Set the viewport center to the current cursor position and warps the cursor to the screen center.
 
virtual ~WX_VIEW_CONTROLS()
 
VECTOR2D m_cursorPos
Current cursor position (world coordinates).
 
void onCaptureLost(wxMouseEvent &WXUNUSED(aEvent))
 
void onMotion(wxMouseEvent &aEvent)
 
std::unique_ptr< PROF_COUNTER > m_MotionEventCounter
 
EDA_DRAW_PANEL_GAL * m_parentPanel
Panel that is affected by VIEW_CONTROLS.
 
void UpdateScrollbars()
Adjusts the scrollbars position to match the current viewport.
 
void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0)) override
Place the cursor immediately at a given point.
 
void handleCursorCapture(int x, int y)
Limit the cursor position to within the canvas by warping it.
 
void onLeave(wxMouseEvent &WXUNUSED(aEvent))
 
VECTOR2D m_zoomStartPoint
The mouse position when a drag zoom started.
 
static const wxEventType EVT_REFRESH_MOUSE
Event that forces mouse move event in the dispatcher (eg.
 
VECTOR2D m_panDirection
Current direction of panning (only autopanning mode).
 
VECTOR2D m_dragStartPoint
Store information about point where dragging has started.
 
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
 
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
 
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
 
virtual COMMON_SETTINGS * GetCommonSettings() const
 
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
 
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
 
a few functions useful in geometry calculations.
 
VECTOR2< ret_type > GetClampedCoords(const VECTOR2< in_type > &aCoords, pad_type aPadding=1u)
Clamps a vector to values that can be negated, respecting numeric limits of coordinates data type wit...
 
const wxChar *const traceZoomScroll
Flag to enable debug output of zoom-scrolling calculations in KIGFX::ZOOM_CONTROLLER and derivatives.
 
The Cairo implementation of the graphics abstraction layer.
 
KICOMMON_API bool IsInputControlFocused(wxWindow *aFocus=nullptr)
Check if a input control has focus.
 
KICOMMON_API bool IsModalDialogFocused()
 
PGM_BASE & Pgm()
The global program "get" accessor.
 
wxLogTrace helper definitions.
 
Functions to provide common constants and other functions to assist in making a consistent UI.
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D
 
static std::unique_ptr< ZOOM_CONTROLLER > GetZoomControllerForPlatform(bool aAcceleration)
 
WX_VIEW_CONTROLS class definition.
 
ZOOM_CONTROLLER class definition.