Fix up zoom and pan issues entering/leaving sheets.

This commit is contained in:
Jeff Young 2018-09-16 22:19:33 +01:00
parent 929786ce50
commit 2d5baac77d
9 changed files with 43 additions and 91 deletions

View File

@ -43,7 +43,7 @@ BASE_SCREEN::BASE_SCREEN( KICAD_T aType ) :
EDA_ITEM( aType )
{
m_UndoRedoCountMax = DEFAULT_MAX_UNDO_ITEMS;
m_FirstRedraw = true;
m_Initialized = false;
m_ScreenNumber = 1;
m_NumberOfScreens = 1; // Hierarchy: Root: ScreenNumber = 1
m_Zoom = 32.0;

View File

@ -32,7 +32,7 @@
#include <view/view.h>
#include <view/wx_view_controls.h>
#include <painter.h>
#include <base_screen.h>
#include <gal/graphics_abstraction_layer.h>
#include <gal/opengl/opengl_gal.h>
#include <gal/cairo/cairo_gal.h>
@ -150,6 +150,11 @@ void EDA_DRAW_PANEL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
{
m_viewControls->UpdateScrollbars();
GetParentEDAFrame()->GetScreen()->SetZoom( GetLegacyZoom() );
VECTOR2D center = GetView()->GetCenter();
GetParentEDAFrame()->SetScrollCenterPosition( wxPoint( center.x, center.y ) );
// Drawing to a zero-width or zero-height GAL is fraught with peril.
if( GetClientRect().IsEmpty() )
return;

View File

@ -1030,15 +1030,6 @@ void EDA_DRAW_FRAME::UseGalCanvas( bool aEnable )
GetGalCanvas()->GetViewControls()->EnableMousewheelPan( m_canvas->GetEnableMousewheelPan() );
GetGalCanvas()->GetViewControls()->EnableAutoPan( m_canvas->GetEnableAutoPan() );
}
else if( m_galCanvasActive )
{
// Switch to legacy renderer from GAL
double zoomFactor = gal->GetWorldScale() / gal->GetZoomFactor();
// TODO replace it with EDA_DRAW_PANEL_GAL::GetLegacyZoom
m_canvas->SetZoom( 1.0 / ( zoomFactor * view->GetScale() ) );
VECTOR2D center = view->GetCenter();
AdjustScrollBars( wxPoint( center.x, center.y ) );
}
GetGalCanvas()->SetEvtHandlerEnabled( aEnable );

View File

@ -1250,9 +1250,7 @@ void EDA_DRAW_FRAME::UseGalCanvas( bool aEnable )
else if( m_galCanvasActive )
{
// Switch to legacy renderer from GAL
double zoomFactor = gal->GetWorldScale() / gal->GetZoomFactor();
// TODO replace it with EDA_DRAW_PANEL_GAL::GetLegacyZoom
m_canvas->SetZoom( 1.0 / ( zoomFactor * view->GetScale() ) );
m_canvas->SetZoom( GetGalCanvas()->GetLegacyZoom() );
VECTOR2D center = view->GetCenter();
AdjustScrollBars( wxPoint( center.x, center.y ) );
}
@ -1640,7 +1638,7 @@ void EDA_DRAW_FRAME::Zoom_Automatique( bool aWarpPointer )
double bestzoom = BestZoom();
screen->SetScalingFactor( bestzoom );
if( screen->m_FirstRedraw )
if( !screen->m_Initialized )
SetCrossHairPosition( GetScrollCenterPosition() );
if( !IsGalCanvasActive() )

View File

@ -365,6 +365,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
SchematicCleanUp( true );
GetScreen()->ClearUndoORRedoList( GetScreen()->m_UndoList, 1 );
GetScreen()->TestDanglingEnds(); // Only perform the dangling end test on root sheet.
GetScreen()->m_Initialized = true;
}
GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
@ -821,7 +822,7 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
// Ensure the schematic is fully segmented on first display
BreakSegmentsOnJunctions();
SchematicCleanUp( true );
GetScreen()->m_Initialized = true;
SCH_TYPE_COLLECTOR components;
SCH_SCREENS allScreens;

View File

@ -279,12 +279,10 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet()
SetSheetNumberAndCount();
m_canvas->SetCanStartBlock( -1 );
if( screen->m_FirstRedraw )
if( !screen->m_Initialized )
{
Zoom_Automatique( false );
screen->m_FirstRedraw = false;
SetCrossHairPosition( GetScrollCenterPosition() );
m_canvas->MoveCursorToCrossHair();
screen->m_Initialized = true;
// Ensure the schematic is fully segmented on first display
BreakSegmentsOnJunctions();
@ -295,18 +293,13 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet()
}
else
{
RedrawScreen( GetScrollCenterPosition(), true );
CenterScreen( GetScrollCenterPosition(), false );
// RedrawScreen() will set zoom to last used
RedrawScreen( GetScrollCenterPosition(), false );
}
// Some items (wires, labels) can be highlighted. So prepare the highlight flag:
SetCurrentSheetHighlightFlags();
// Now refresh m_canvas. Should be not necessary, but because screen has changed
// the previous refresh has set all new draw parameters (scroll position ..)
// but most of time there were some inconsitencies about cursor parameters
// ( previous position of cursor ...) and artefacts can happen
// mainly when sheet size has changed
// This second refresh clears artefacts because at this point,
// all parameters are now updated
SyncView();
GetCanvas()->Refresh();
}

View File

@ -26,59 +26,30 @@
#include <memory>
#include <view/view.h>
#include <view/view_group.h>
#include <view/wx_view_controls.h>
#include <worksheet_viewitem.h>
#include <layers_id_colors_and_visibility.h>
#include <class_libentry.h>
#include "sch_view.h"
#include <sch_sheet.h>
#include <sch_screen.h>
#include <preview_items/selection_area.h>
#include "sch_view.h"
namespace KIGFX {
SCH_VIEW::SCH_VIEW( bool aIsDynamic ) :
VIEW( aIsDynamic )
{
}
SCH_VIEW::~SCH_VIEW()
{
}
void SCH_VIEW::Add( KIGFX::VIEW_ITEM* aItem, int aDrawPriority )
{
//auto ei = static_cast<EDA_ITEM*>(aItem);
//auto bb = ei->ViewBBox();
//printf("Add %p [%s] %d %d - %d %d\n", aItem, "dupa", bb.GetOrigin().x, bb.GetOrigin().y, bb.GetWidth(), bb.GetHeight() );
//if(bb.GetOrigin().x < 0)
//for(;;);
VIEW::Add( aItem, aDrawPriority );
}
void SCH_VIEW::Remove( KIGFX::VIEW_ITEM* aItem )
{
VIEW::Remove( aItem );
}
void SCH_VIEW::Update( KIGFX::VIEW_ITEM* aItem, int aUpdateFlags )
{
VIEW::Update( aItem, aUpdateFlags );
}
void SCH_VIEW::Update( KIGFX::VIEW_ITEM* aItem )
{
VIEW::Update( aItem );
}
static const LAYER_NUM SCH_LAYER_ORDER[] =
{
@ -87,31 +58,30 @@ static const LAYER_NUM SCH_LAYER_ORDER[] =
LAYER_WORKSHEET
};
void SCH_VIEW::DisplaySheet( SCH_SCREEN *aSheet )
{
for( auto item = aSheet->GetDrawItems(); item; item = item->Next() )
{
//printf("-- ADD SCHITEM %p\n", item );
Add( item );
}
m_worksheet.reset ( new KIGFX::WORKSHEET_VIEWITEM( 1, &aSheet->GetPageSettings(), &aSheet->GetTitleBlock() ) );
//m_worksheet->SetMilsToIUfactor(1);
m_worksheet.reset( new KIGFX::WORKSHEET_VIEWITEM( 1, &aSheet->GetPageSettings(),
&aSheet->GetTitleBlock() ) );
m_selectionArea.reset( new KIGFX::PREVIEW::SELECTION_AREA( ) );
m_preview.reset( new KIGFX::VIEW_GROUP () );
//printf("Display-screen\n");
Add( m_worksheet.get() );
Add( m_selectionArea.get() );
Add( m_preview.get() );
}
void SCH_VIEW::DisplaySheet( SCH_SHEET *aSheet )
{
DisplaySheet( aSheet->GetScreen() );
}
void SCH_VIEW::DisplayComponent( LIB_PART *aPart )
{
Clear();
@ -142,6 +112,7 @@ void SCH_VIEW::DisplayComponent( LIB_PART *aPart )
void SCH_VIEW::ClearPreview()
{
m_preview->Clear();
for( auto item : m_previewItems )
delete item;
@ -149,6 +120,7 @@ void SCH_VIEW::ClearPreview()
Update(m_preview.get());
}
void SCH_VIEW::AddToPreview( EDA_ITEM *aItem, bool owned )
{
m_preview->Add( aItem );
@ -161,6 +133,7 @@ void SCH_VIEW::AddToPreview( EDA_ITEM *aItem, bool owned )
Update( m_preview.get() );
}
void SCH_VIEW::ShowSelectionArea( bool aShow )
{
if( aShow )
@ -174,21 +147,25 @@ void SCH_VIEW::ShowSelectionArea( bool aShow )
SetVisible( m_selectionArea.get(), aShow );
}
void SCH_VIEW::ShowPreview( bool aShow )
{
SetVisible( m_preview.get(), aShow );
}
void SCH_VIEW::ClearHiddenFlags()
{
for( auto item : m_allItems )
Hide ( item, false );
}
void SCH_VIEW::HideWorksheet()
{
// SetVisible( m_worksheet.get(), false );
}
};

View File

@ -13,15 +13,15 @@ class SCH_SHEET;
class SCH_SCREEN;
class LIB_PART;
namespace KIGFX {
namespace KIGFX
{
class VIEW_GROUP;
class WORKSHEET_VIEWITEM;
namespace PREVIEW {
namespace PREVIEW
{
class SELECTION_AREA;
};
class WORKSHEET_VIEWITEM;
};
class SCH_VIEW : public KIGFX::VIEW
{
@ -33,19 +33,6 @@ public:
void DisplaySheet( SCH_SCREEN *aSheet );
void DisplayComponent( LIB_PART *aPart );
/// @copydoc VIEW::Add()
virtual void Add( VIEW_ITEM* aItem, int aDrawPriority = -1 ) override;
/// @copydoc VIEW::Remove()
virtual void Remove( VIEW_ITEM* aItem ) override;
/// @copydoc VIEW::Update()
virtual void Update( VIEW_ITEM* aItem, int aUpdateFlags ) override;
/// @copydoc VIEW::Update()
virtual void Update( VIEW_ITEM* aItem ) override;
// void SetWorksheet( KIGFX::WORKSHEET_VIEWITEM* aWorksheet );
KIGFX::PREVIEW::SELECTION_AREA* GetSelectionArea() const { return m_selectionArea.get(); }
KIGFX::VIEW_GROUP* GetPreview() const { return m_preview.get(); }

View File

@ -204,7 +204,7 @@ public:
* > 0 except for schematics.
* false: when coordinates can only be >= 0
* Schematic */
bool m_FirstRedraw;
bool m_Initialized;
// Undo/redo list of commands
UNDO_REDO_CONTAINER m_UndoList; ///< Objects list for the undo command (old data)