Constant-size page layout object handles w/respect to zoom.

Fixes: lp:1787491
* https://bugs.launchpad.net/kicad/+bug/1787491
This commit is contained in:
Jeff Young 2018-08-19 20:49:35 +01:00
parent 86a801aabc
commit a6d10d6e28
8 changed files with 51 additions and 43 deletions

View File

@ -101,7 +101,7 @@ void WS_DRAW_ITEM_LIST::Draw( EDA_RECT* aClipBox, wxDC* aDC )
}
// The selected items are drawn after (usually 0 or 1)
int markerSize = WORKSHEET_DATAITEM::GetMarkerSizeUi();
int markerSize = WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC );
for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() )
{
@ -210,12 +210,12 @@ bool WS_DRAW_ITEM_TEXT::HitTest( const EDA_RECT& aRect ) const
}
bool WS_DRAW_ITEM_TEXT::HitTestStartPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_TEXT::HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint pos = GetTextPos();
if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 &&
std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 &&
std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;
@ -276,12 +276,12 @@ bool WS_DRAW_ITEM_POLYGON::HitTest( const EDA_RECT& aRect ) const
}
bool WS_DRAW_ITEM_POLYGON::HitTestStartPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_POLYGON::HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint pos = GetPosition();
if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 &&
std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( std::abs( pos.x - aPosition.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 &&
std::abs( pos.y - aPosition.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;
@ -368,25 +368,25 @@ bool WS_DRAW_ITEM_RECT::HitTest( const EDA_RECT& aRect ) const
}
bool WS_DRAW_ITEM_RECT::HitTestStartPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_RECT::HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint dist = GetStart() - aPosition;
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;
}
bool WS_DRAW_ITEM_RECT::HitTestEndPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_RECT::HitTestEndPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint pos = GetEnd();
int dist = (int) hypot( pos.x - aPosition.x, pos.y - aPosition.y );
if( dist <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( dist <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;
@ -416,45 +416,45 @@ bool WS_DRAW_ITEM_LINE::HitTest( const EDA_RECT& aRect ) const
}
bool WS_DRAW_ITEM_LINE::HitTestStartPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_LINE::HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint dist = GetStart() - aPosition;
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;
}
bool WS_DRAW_ITEM_LINE::HitTestEndPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_LINE::HitTestEndPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint dist = GetEnd() - aPosition;
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;
}
void WS_DRAW_ITEM_LIST::Locate( std::vector <WS_DRAW_ITEM_BASE*>& aList,
const wxPoint& aPosition)
void WS_DRAW_ITEM_LIST::Locate( wxDC* aDC, std::vector <WS_DRAW_ITEM_BASE*>& aList,
const wxPoint& aPosition )
{
for( WS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() )
{
item->m_Flags &= ~(LOCATE_STARTPOINT|LOCATE_ENDPOINT);
bool found = false;
if( item->HitTestStartPoint ( aPosition ) )
if( item->HitTestStartPoint ( aDC, aPosition ) )
{
item->m_Flags |= LOCATE_STARTPOINT;
found = true;
}
if( item->HitTestEndPoint ( aPosition ) )
if( item->HitTestEndPoint ( aDC, aPosition ) )
{
item->m_Flags |= LOCATE_ENDPOINT;
found = true;
@ -511,12 +511,12 @@ bool WS_DRAW_ITEM_BITMAP::HitTest( const EDA_RECT& aRect ) const
/**
* return true if the point aPosition is on the reference point of this item.
*/
bool WS_DRAW_ITEM_BITMAP::HitTestStartPoint( const wxPoint& aPosition)
bool WS_DRAW_ITEM_BITMAP::HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition )
{
wxPoint dist = m_pos - aPosition;
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi()/2 )
if( std::abs( dist.x) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 &&
std::abs( dist.y) <= WORKSHEET_DATAITEM::GetMarkerSizeUi( aDC ) / 2 )
return true;
return false;

View File

@ -205,9 +205,15 @@ public:
return KiROUND( m_DefaultLineWidth * m_WSunits2Iu );
}
static int GetMarkerSizeUi()
static int GetMarkerSizeUi( wxDC* aDC )
{
return KiROUND( 0.5 * m_WSunits2Iu );
double x, y;
double scale;
aDC->GetUserScale( &x, &y );
scale = (x + y ) / 2; // should be equal, but if not best we can do is average
return KiROUND( 0.01 * m_WSunits2Iu / scale );
}
/**

View File

@ -119,7 +119,7 @@ public:
* (texts or polygons)
* the maxi dist is WORKSHEET_DATAITEM::GetMarkerSizeUi()/2
*/
virtual bool HitTestStartPoint( const wxPoint& aPosition) = 0;
virtual bool HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition ) = 0;
/**
* return true if the point aPosition is near the ending point of this item
@ -127,7 +127,7 @@ public:
* 2 points
* the maxi dist is WORKSHEET_DATAITEM::GetMarkerSizeUi()/2
*/
virtual bool HitTestEndPoint( const wxPoint& aPosition)
virtual bool HitTestEndPoint( wxDC *aDC, const wxPoint& aPosition)
{
return false;
}
@ -176,14 +176,14 @@ public:
/**
* return true if the point aPosition is on the starting point of this item.
*/
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
virtual bool HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition ) override;
/**
* return true if the point aPosition is on the ending point of this item
* This is avirtual function which should be overriden for items defien by
* 2 points
*/
virtual bool HitTestEndPoint( const wxPoint& aPosition) override;
virtual bool HitTestEndPoint( wxDC *aDC, const wxPoint& aPosition ) override;
};
// This class draws a polygon
@ -233,7 +233,7 @@ public:
/**
* return true if the point aPosition is on the starting point of this item.
*/
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
virtual bool HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition ) override;
};
// This class draws a not filled rectangle with thick segment
@ -268,14 +268,14 @@ public:
/**
* return true if the point aPosition is on the starting point of this item.
*/
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
virtual bool HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition ) override;
/**
* return true if the point aPosition is on the ending point of this item
* This is avirtual function which should be overriden for items defien by
* 2 points
*/
virtual bool HitTestEndPoint( const wxPoint& aPosition) override;
virtual bool HitTestEndPoint( wxDC *aDC, const wxPoint& aPosition ) override;
};
// This class draws a graphic text.
@ -317,7 +317,7 @@ public:
/**
* return true if the point aPosition is on the starting point of this item.
*/
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
virtual bool HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition ) override;
};
// This class draws a bitmap.
@ -359,7 +359,7 @@ public:
/**
* return true if the point aPosition is on the reference point of this item.
*/
virtual bool HitTestStartPoint( const wxPoint& aPosition) override;
virtual bool HitTestStartPoint( wxDC *aDC, const wxPoint& aPosition ) override;
const wxPoint GetPosition() const { return m_pos; }
};
@ -592,7 +592,7 @@ public:
* @param aList = the list of items found
* @param aPosition the position (in user units) to locate items
*/
void Locate(std::vector <WS_DRAW_ITEM_BASE*>& aList, const wxPoint& aPosition);
void Locate(wxDC* aDC, std::vector <WS_DRAW_ITEM_BASE*>& aList, const wxPoint& aPosition);
};

View File

@ -267,7 +267,7 @@ bool PL_EDITOR_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode,
if( busy )
break;
if( (item = Locate( aPosition )) == NULL )
if( (item = Locate( aDC, aPosition ) ) == NULL )
break;
// Only rect and lines have a end point.

View File

@ -55,7 +55,7 @@ void PL_EDITOR_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
}
item = m_treePagelayout->GetPageLayoutSelectedItem();
WORKSHEET_DATAITEM* newitem = Locate( aPosition );
WORKSHEET_DATAITEM* newitem = Locate( aDC, aPosition );
if( newitem == NULL )
return;

View File

@ -38,6 +38,7 @@
#include <worksheet_shape_builder.h>
#include <worksheet_dataitem.h>
#include <hotkeys.h>
#include <kicad_device_context.h>
// Helper function to add menuitems relative to items creation
void AddNewItemsCommand( wxMenu* aMainMenu )
@ -83,8 +84,9 @@ bool PL_EDITOR_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* aPopMenu )
if( ! busy ) // No item currently edited
{
INSTALL_UNBUFFERED_DC( dc, m_canvas );
WORKSHEET_DATAITEM* old_item = m_treePagelayout->GetPageLayoutSelectedItem();
WORKSHEET_DATAITEM* item = Locate( aPosition );
WORKSHEET_DATAITEM* item = Locate( &dc, aPosition );
if( item && old_item != item )
{

View File

@ -600,7 +600,7 @@ WORKSHEET_DATAITEM * PL_EDITOR_FRAME::GetSelectedItem()
}
WORKSHEET_DATAITEM* PL_EDITOR_FRAME::Locate( const wxPoint& aPosition )
WORKSHEET_DATAITEM* PL_EDITOR_FRAME::Locate( wxDC* aDC, const wxPoint& aPosition )
{
const PAGE_INFO& pageInfo = GetPageSettings();
TITLE_BLOCK t_block = GetTitleBlock();
@ -625,7 +625,7 @@ WORKSHEET_DATAITEM* PL_EDITOR_FRAME::Locate( const wxPoint& aPosition )
// We do not use here the COLLECTOR classes in use in pcbnew and eeschema
// because the locate requirements are very basic.
std::vector <WS_DRAW_ITEM_BASE*> list;
drawList.Locate( list, aPosition );
drawList.Locate( aDC, list, aPosition );
if( list.size() == 0 )
return NULL;

View File

@ -358,7 +358,7 @@ public:
* @return the page layout item found at position aPosition
* @param aPosition = the position (in user units) of the reference point
*/
WORKSHEET_DATAITEM *Locate( const wxPoint& aPosition );
WORKSHEET_DATAITEM *Locate( wxDC* aDC, const wxPoint& aPosition );
/**
* Initialize a move item command