From 58c9647166ec453a6fdc99f91db72b1b4c295c06 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 30 Mar 2011 21:20:23 +0200 Subject: [PATCH] Workaround for zoom levels < 1 in eescxhema, with wxMSW version < 2.9 --- eeschema/libeditframe.cpp | 12 +++++++++++- eeschema/sch_screen.cpp | 15 +++++++++++++++ eeschema/schframe.cpp | 17 ++++++++++++++--- eeschema/viewlib_frame.cpp | 10 ++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp index 13edefa9bd..36f2e8a571 100644 --- a/eeschema/libeditframe.cpp +++ b/eeschema/libeditframe.cpp @@ -389,7 +389,17 @@ int LIB_EDIT_FRAME::BestZoom() ii = wxRound( ( (double) dx / (double) size.x ) * (double) GetScreen()->m_ZoomScalar ); jj = wxRound( ( (double) dy / (double) size.y ) * (double) GetScreen()->m_ZoomScalar ); - return MAX( ii + 1, jj + 1 ); + int bestzoom = MAX( ii + 1, jj + 1 ); +#if defined( __WINDOWS__ ) && !wxCHECK_VERSION(2, 9, 1) + /* This is a workaround: wxWidgets (wxMSW) before version 2.9 seems have + * problems with scale values < 1 + * corresponding to values < GetScreen()->m_ZoomScalar + * So we keep bestzoom >= GetScreen()->m_ZoomScalar + */ + if( bestzoom < GetScreen()->m_ZoomScalar ) + bestzoom = GetScreen()->m_ZoomScalar; +#endif + return bestzoom; } diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 43d5533a20..66559acf58 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -30,10 +30,25 @@ /* Default EESchema zoom values. Limited to 17 values to keep a decent size * to menus */ +#if defined( __WINDOWS__ ) && !wxCHECK_VERSION(2, 9, 1) +/* Please, note: wxWidgets (wxMSW) before version 2.9 seems have + * problems with scale values < 1 + * because scale value is SchematicZoomList[x] / 10 + * ( in fact is SchematicZoomList[x] / m_ZoomScalar ) + * do not use values smaller than 10 without testing them under wxWidgets versions < 2.9 + * value like 0.5 seems work + */ +static int SchematicZoomList[] = +{ + 5, 10, 15, 20, 30, 40, 60, 80, 120, 160, 230, 320, 480, 640, 800, 1280 +}; + +#else static int SchematicZoomList[] = { 5, 7, 10, 15, 20, 30, 40, 60, 80, 120, 160, 230, 320, 480, 640, 800, 1280 }; +#endif #define SCHEMATIC_ZOOM_LIST_CNT ( sizeof( SchematicZoomList ) / sizeof( int ) ) #define MM_TO_SCH_UNITS 1000.0 / 25.4 //schematic internal unites are mils diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp index ffe255d479..57c4255c7a 100644 --- a/eeschema/schframe.cpp +++ b/eeschema/schframe.cpp @@ -393,17 +393,28 @@ int SCH_EDIT_FRAME::BestZoom() { int dx, dy; wxSize size; - double zoom; dx = GetScreen()->m_CurrentSheetDesc->m_Size.x; dy = GetScreen()->m_CurrentSheetDesc->m_Size.y; size = DrawPanel->GetClientSize(); - zoom = MAX( (double) dx / (double) size.x, (double) dy / (double) size.y ); + int ii = wxRound( (double) dx / size.x * (double) GetScreen()->m_ZoomScalar ); + int jj = wxRound( (double) dx / size.x * (double) GetScreen()->m_ZoomScalar ); + int bestzoom = MAX( ii, jj ); GetScreen()->SetScrollCenterPosition( wxPoint( dx / 2, dy / 2 ) ); - return wxRound( zoom * (double) GetScreen()->m_ZoomScalar ); +#if defined( __WINDOWS__ ) && !wxCHECK_VERSION(2, 9, 1) + /* This is a workaround: wxWidgets (wxMSW) before version 2.9 seems have + * problems with scale values < 1 + * corresponding to values < GetScreen()->m_ZoomScalar + * So we keep bestzoom >= GetScreen()->m_ZoomScalar + */ + if( bestzoom < GetScreen()->m_ZoomScalar ) + bestzoom = GetScreen()->m_ZoomScalar; +#endif + + return bestzoom; } diff --git a/eeschema/viewlib_frame.cpp b/eeschema/viewlib_frame.cpp index 2b3c14ea15..f95df4c926 100644 --- a/eeschema/viewlib_frame.cpp +++ b/eeschema/viewlib_frame.cpp @@ -358,6 +358,16 @@ int LIB_VIEW_FRAME::BestZoom() (double) GetScreen()->m_ZoomScalar ); bestzoom = MAX( ii, jj ) + 1; +#if defined( __WINDOWS__ ) && !wxCHECK_VERSION(2, 9, 1) + /* This is a workaround: wxWidgets (wxMSW) before version 2.9 seems have + * problems with scale values < 1 + * corresponding to values < GetScreen()->m_ZoomScalar + * So we keep bestzoom >= GetScreen()->m_ZoomScalar + */ + if( bestzoom < GetScreen()->m_ZoomScalar ) + bestzoom = GetScreen()->m_ZoomScalar; +#endif + GetScreen()->SetScrollCenterPosition( BoundaryBox.Centre() ); return bestzoom;