Zoom bug fix and optimization.

Prevent drawing center from moving when client zoom size exceeds drawing size.
Prevent drawing refresh when zoom level doesn't change to eliminate flicker.
This commit is contained in:
stambaughw 2009-02-11 19:39:55 +00:00
parent c6f68578b3
commit 07bd76a0e8
4 changed files with 53 additions and 35 deletions

View File

@ -69,10 +69,6 @@ void BASE_SCREEN::InitDatas()
m_Curseur.y = ReturnPageSize().y / 2;
}
// DrawOrg est rendu multiple du zoom min :
m_DrawOrg.x -= m_DrawOrg.x % 256;
m_DrawOrg.y -= m_DrawOrg.y % 256;
m_O_Curseur = m_Curseur;
SetCurItem( NULL );
@ -230,12 +226,23 @@ void BASE_SCREEN::SetZoomList( const wxArrayInt& zoomlist )
}
void BASE_SCREEN::SetFirstZoom()
bool BASE_SCREEN::SetFirstZoom()
{
if( m_ZoomList.IsEmpty() )
m_Zoom = m_ZoomScalar;
else
{
if( m_Zoom != m_ZoomScalar )
{
m_Zoom = m_ZoomScalar;
return true;
}
}
else if( m_Zoom != m_ZoomList[0] )
{
m_Zoom = m_ZoomList[0];
return true;
}
return false;
}
@ -245,57 +252,67 @@ int BASE_SCREEN::GetZoom() const
}
void BASE_SCREEN::SetZoom( int coeff )
bool BASE_SCREEN::SetZoom( int coeff )
{
if( coeff == m_Zoom )
return false;
m_Zoom = coeff;
if( m_Zoom < 1 )
m_Zoom = 1;
return true;
}
void BASE_SCREEN::SetNextZoom()
bool BASE_SCREEN::SetNextZoom()
{
size_t i;
if( m_ZoomList.IsEmpty() || m_Zoom >= m_ZoomList.Last() )
return;
return false;
for( i = 0; i < m_ZoomList.GetCount(); i++ )
{
if( m_Zoom < m_ZoomList[i] )
{
m_Zoom = m_ZoomList[i];
break;
return true;
}
}
return false;
}
void BASE_SCREEN::SetPreviousZoom()
bool BASE_SCREEN::SetPreviousZoom()
{
size_t i;
if( m_ZoomList.IsEmpty() || m_Zoom <= m_ZoomList[0] )
return;
return false;
for( i = m_ZoomList.GetCount(); i != 0; i-- )
{
if( m_Zoom > m_ZoomList[i - 1] )
{
m_Zoom = m_ZoomList[i - 1];
break;
return true;
}
}
return false;
}
void BASE_SCREEN::SetLastZoom()
bool BASE_SCREEN::SetLastZoom()
{
if( m_ZoomList.IsEmpty() )
return;
if( m_ZoomList.IsEmpty() || m_Zoom == m_ZoomList.Last() )
return false;
m_Zoom = m_ZoomList.Last();
return true;
}

View File

@ -584,8 +584,13 @@ void WinEDA_DrawFrame::AdjustScrollBars()
// la surface de trace doit etre augmentee
panel_size = DrawPanel->GetClientSize();
screen->Unscale( panel_size );
draw_size += panel_size / 2;
/* Adjust drawing size when zooming way out to prevent centering around
* cursor problems. */
if( panel_size.x > draw_size.x || panel_size.y > draw_size.y )
draw_size = panel_size;
draw_size += panel_size / 2;
if( screen->m_Center )
{
@ -598,10 +603,6 @@ void WinEDA_DrawFrame::AdjustScrollBars()
screen->m_DrawOrg.y = -panel_size.y / 2;
}
// DrawOrg est rendu multiple du zoom min :
screen->m_DrawOrg.x -= screen->m_DrawOrg.x % 256;
screen->m_DrawOrg.y -= screen->m_DrawOrg.y % 256;
// Calcul du nombre de scrolls (en unites de scrool )
scrollbar_number = draw_size / screen->Unscale( screen->m_ZoomScalar );
xUnit = yUnit = screen->m_ZoomScalar;

View File

@ -67,8 +67,8 @@ void WinEDA_DrawFrame::Zoom_Automatique( bool move_mouse_cursor )
/** Redraw the screen with the zoom level which shows all the page or the board
*/
{
GetBaseScreen()->SetZoom( BestZoom() );
Recadre_Trace( move_mouse_cursor );
if( GetBaseScreen()->SetZoom( BestZoom() )
Recadre_Trace( move_mouse_cursor );
}
@ -122,8 +122,8 @@ void WinEDA_DrawFrame::OnZoom( wxCommandEvent& event )
case ID_ZOOM_IN:
if( id == ID_ZOOM_IN )
screen->m_Curseur = DrawPanel->GetScreenCenterRealPosition();
screen->SetPreviousZoom();
Recadre_Trace( zoom_at_cursor );
if( screen->SetPreviousZoom() )
Recadre_Trace( zoom_at_cursor );
break;
case ID_POPUP_ZOOM_OUT:
@ -133,8 +133,8 @@ void WinEDA_DrawFrame::OnZoom( wxCommandEvent& event )
case ID_ZOOM_OUT:
if( id == ID_ZOOM_OUT )
screen->m_Curseur = DrawPanel->GetScreenCenterRealPosition();
screen->SetNextZoom();
Recadre_Trace( zoom_at_cursor );
if( screen->SetNextZoom() )
Recadre_Trace( zoom_at_cursor );
break;
case ID_ZOOM_REDRAW:
@ -170,8 +170,8 @@ void WinEDA_DrawFrame::OnZoom( wxCommandEvent& event )
"the zoom list." ), i );
return;
}
screen->SetZoom( screen->m_ZoomList[i] );
Recadre_Trace( true );
if( screen->SetZoom( screen->m_ZoomList[i] ) )
Recadre_Trace( true );
}
Affiche_Status_Box();

View File

@ -228,7 +228,7 @@ public:
* Function SetZoom
* adjusts the current zoom factor
*/
void SetZoom( int coeff );
bool SetZoom( int coeff );
/**
* Function SetZoomList
@ -246,10 +246,10 @@ public:
void Unscale( wxPoint& pt );
void Unscale( wxSize& sz );
void SetNextZoom(); /* ajuste le prochain coeff de zoom */
void SetPreviousZoom(); /* ajuste le precedent coeff de zoom */
void SetFirstZoom(); /* ajuste le coeff de zoom a 1*/
void SetLastZoom(); /* ajuste le coeff de zoom au max */
bool SetNextZoom(); /* ajuste le prochain coeff de zoom */
bool SetPreviousZoom(); /* ajuste le precedent coeff de zoom */
bool SetFirstZoom(); /* ajuste le coeff de zoom a 1*/
bool SetLastZoom(); /* ajuste le coeff de zoom au max */
//----<grid stuff>----------------------------------------------------------
wxRealPoint GetGrid(); /* retourne la grille */