Loading common/view/view.cpp +23 −1 Original line number Original line Diff line number Diff line Loading @@ -45,8 +45,11 @@ VIEW::VIEW( bool aIsDynamic ) : m_scale( 1.0 ), m_scale( 1.0 ), m_painter( NULL ), m_painter( NULL ), m_gal( NULL ), m_gal( NULL ), m_dynamic( aIsDynamic ) m_dynamic( aIsDynamic ), m_scaleLimits( 15000.0, 1.0 ) { { m_panBoundary.SetMaximum(); // Redraw everything at the beginning // Redraw everything at the beginning for( int i = 0; i < TARGETS_NUMBER; ++i ) for( int i = 0; i < TARGETS_NUMBER; ++i ) MarkTargetDirty( i ); MarkTargetDirty( i ); Loading Loading @@ -290,6 +293,11 @@ void VIEW::SetScale( double aScale ) void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor ) void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor ) { { if( aScale > m_scaleLimits.x ) aScale = m_scaleLimits.x; else if( aScale < m_scaleLimits.y ) aScale = m_scaleLimits.y; VECTOR2D a = ToScreen( aAnchor ); VECTOR2D a = ToScreen( aAnchor ); m_gal->SetZoomFactor( aScale ); m_gal->SetZoomFactor( aScale ); Loading @@ -308,6 +316,20 @@ void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor ) void VIEW::SetCenter( const VECTOR2D& aCenter ) void VIEW::SetCenter( const VECTOR2D& aCenter ) { { m_center = aCenter; m_center = aCenter; if( !m_panBoundary.Contains( aCenter ) ) { if( aCenter.x < m_panBoundary.GetLeft() ) m_center.x = m_panBoundary.GetLeft(); else if( aCenter.x > m_panBoundary.GetRight() ) m_center.x = m_panBoundary.GetRight(); if( aCenter.y < m_panBoundary.GetTop() ) m_center.y = m_panBoundary.GetTop(); else if( aCenter.y > m_panBoundary.GetBottom() ) m_center.y = m_panBoundary.GetBottom(); } m_gal->SetLookAtPoint( m_center ); m_gal->SetLookAtPoint( m_center ); m_gal->ComputeWorldScreenMatrix(); m_gal->ComputeWorldScreenMatrix(); Loading include/view/view.h +29 −0 Original line number Original line Diff line number Diff line Loading @@ -455,6 +455,29 @@ public: m_dirtyTargets[i] = true; m_dirtyTargets[i] = true; } } /** * Function SetPanBoundary() * Sets limits for panning area. * @param aBoundary is the box that limits panning area. */ void SetPanBoundary( const BOX2I& aBoundary ) { m_panBoundary = aBoundary; } /** * Function SetScaleLimits() * Sets minimum and maximum values for scale. * @param aMaximum is the maximum value for scale.. * @param aMinimum is the minimum value for scale. */ void SetScaleLimits( double aMaximum, double aMinimum ) { wxASSERT_MSG( aMaximum > aMinimum, wxT( "I guess you passed parameters in wrong order" ) ); m_scaleLimits = VECTOR2D( aMaximum, aMinimum ); } static const int VIEW_MAX_LAYERS = 128; ///* maximum number of layers that may be shown static const int VIEW_MAX_LAYERS = 128; ///* maximum number of layers that may be shown private: private: Loading Loading @@ -588,6 +611,12 @@ private: /// Rendering order modifier for layers that are marked as top layers /// Rendering order modifier for layers that are marked as top layers static const int TOP_LAYER_MODIFIER = -VIEW_MAX_LAYERS; static const int TOP_LAYER_MODIFIER = -VIEW_MAX_LAYERS; /// Panning boundaries BOX2I m_panBoundary; /// Zoom limits VECTOR2D m_scaleLimits; }; }; } // namespace KiGfx } // namespace KiGfx Loading pcbnew/basepcbframe.cpp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -217,6 +217,7 @@ void PCB_BASE_FRAME::ViewReloadBoard( const BOARD* aBoard ) const view->Add( worksheet ); view->Add( worksheet ); view->SetPanBoundary( worksheet->ViewBBox() ); view->RecacheAllItems( true ); view->RecacheAllItems( true ); if( m_galCanvasActive ) if( m_galCanvasActive ) Loading Loading
common/view/view.cpp +23 −1 Original line number Original line Diff line number Diff line Loading @@ -45,8 +45,11 @@ VIEW::VIEW( bool aIsDynamic ) : m_scale( 1.0 ), m_scale( 1.0 ), m_painter( NULL ), m_painter( NULL ), m_gal( NULL ), m_gal( NULL ), m_dynamic( aIsDynamic ) m_dynamic( aIsDynamic ), m_scaleLimits( 15000.0, 1.0 ) { { m_panBoundary.SetMaximum(); // Redraw everything at the beginning // Redraw everything at the beginning for( int i = 0; i < TARGETS_NUMBER; ++i ) for( int i = 0; i < TARGETS_NUMBER; ++i ) MarkTargetDirty( i ); MarkTargetDirty( i ); Loading Loading @@ -290,6 +293,11 @@ void VIEW::SetScale( double aScale ) void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor ) void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor ) { { if( aScale > m_scaleLimits.x ) aScale = m_scaleLimits.x; else if( aScale < m_scaleLimits.y ) aScale = m_scaleLimits.y; VECTOR2D a = ToScreen( aAnchor ); VECTOR2D a = ToScreen( aAnchor ); m_gal->SetZoomFactor( aScale ); m_gal->SetZoomFactor( aScale ); Loading @@ -308,6 +316,20 @@ void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor ) void VIEW::SetCenter( const VECTOR2D& aCenter ) void VIEW::SetCenter( const VECTOR2D& aCenter ) { { m_center = aCenter; m_center = aCenter; if( !m_panBoundary.Contains( aCenter ) ) { if( aCenter.x < m_panBoundary.GetLeft() ) m_center.x = m_panBoundary.GetLeft(); else if( aCenter.x > m_panBoundary.GetRight() ) m_center.x = m_panBoundary.GetRight(); if( aCenter.y < m_panBoundary.GetTop() ) m_center.y = m_panBoundary.GetTop(); else if( aCenter.y > m_panBoundary.GetBottom() ) m_center.y = m_panBoundary.GetBottom(); } m_gal->SetLookAtPoint( m_center ); m_gal->SetLookAtPoint( m_center ); m_gal->ComputeWorldScreenMatrix(); m_gal->ComputeWorldScreenMatrix(); Loading
include/view/view.h +29 −0 Original line number Original line Diff line number Diff line Loading @@ -455,6 +455,29 @@ public: m_dirtyTargets[i] = true; m_dirtyTargets[i] = true; } } /** * Function SetPanBoundary() * Sets limits for panning area. * @param aBoundary is the box that limits panning area. */ void SetPanBoundary( const BOX2I& aBoundary ) { m_panBoundary = aBoundary; } /** * Function SetScaleLimits() * Sets minimum and maximum values for scale. * @param aMaximum is the maximum value for scale.. * @param aMinimum is the minimum value for scale. */ void SetScaleLimits( double aMaximum, double aMinimum ) { wxASSERT_MSG( aMaximum > aMinimum, wxT( "I guess you passed parameters in wrong order" ) ); m_scaleLimits = VECTOR2D( aMaximum, aMinimum ); } static const int VIEW_MAX_LAYERS = 128; ///* maximum number of layers that may be shown static const int VIEW_MAX_LAYERS = 128; ///* maximum number of layers that may be shown private: private: Loading Loading @@ -588,6 +611,12 @@ private: /// Rendering order modifier for layers that are marked as top layers /// Rendering order modifier for layers that are marked as top layers static const int TOP_LAYER_MODIFIER = -VIEW_MAX_LAYERS; static const int TOP_LAYER_MODIFIER = -VIEW_MAX_LAYERS; /// Panning boundaries BOX2I m_panBoundary; /// Zoom limits VECTOR2D m_scaleLimits; }; }; } // namespace KiGfx } // namespace KiGfx Loading
pcbnew/basepcbframe.cpp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -217,6 +217,7 @@ void PCB_BASE_FRAME::ViewReloadBoard( const BOARD* aBoard ) const view->Add( worksheet ); view->Add( worksheet ); view->SetPanBoundary( worksheet->ViewBBox() ); view->RecacheAllItems( true ); view->RecacheAllItems( true ); if( m_galCanvasActive ) if( m_galCanvasActive ) Loading