small change on hotkey management. Added: drag component
This commit is contained in:
parent
3e3ae8925a
commit
ba04f83247
|
@ -4,6 +4,18 @@ Started 2007-June-11
|
|||
Please add newer entries at the top, list the date and your name with
|
||||
email address.
|
||||
|
||||
|
||||
2007-sept-22 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
|
||||
================================================================================
|
||||
+ all
|
||||
* small change in hotkeys handling
|
||||
(Ki_HotkeyInfo: new member m_IdMenuEvent to call an existing event handler from a hotkey list)
|
||||
|
||||
+ eeschema:
|
||||
* added drag component in pop up menu and hotkeys
|
||||
* plot svg format: incorrect arc draw fixed
|
||||
|
||||
|
||||
2007-Sep-22 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||
================================================================================
|
||||
+ pcbnew
|
||||
|
|
|
@ -166,10 +166,11 @@ char Line[256];
|
|||
void PlotPolyPS(int nb_segm, int * coord, int fill, int width)
|
||||
/*****************************************************************/
|
||||
|
||||
/* Trace un polygone ( ferme si rempli ) en format POSTSCRIPT
|
||||
* coord = tableau des coord des sommets
|
||||
* nb_segm = nombre de coord ( 1 coord = 2 elements: X et Y du tableau )
|
||||
* fill : si != 0 polygone rempli
|
||||
/* Draw a polygon ( a filled polygon if fill == 1 ) in POSTSCRIPT format
|
||||
* @param nb_segm = corner count
|
||||
* @param coord = corner list (a corner uses 2 int = X coordinate followed by Y coordinate
|
||||
* @param fill :if == 0 : filled polygon
|
||||
* @param width = line width
|
||||
*/
|
||||
{
|
||||
int ii;
|
||||
|
|
279
common/dcsvg.cpp
279
common/dcsvg.cpp
|
@ -1,4 +1,5 @@
|
|||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Name: svg.cpp
|
||||
// Purpose: SVG plot
|
||||
// Author: Chris Elliott
|
||||
|
@ -23,6 +24,7 @@
|
|||
#include "wx/image.h"
|
||||
|
||||
#define wxSVG_DEBUG FALSE
|
||||
|
||||
// or TRUE to see the calls being executed
|
||||
#define newline wxString( wxT( "\n" ) )
|
||||
#define space wxString( wxT( " " ) )
|
||||
|
@ -43,11 +45,15 @@
|
|||
#define pt2mm 0.352777777778
|
||||
#endif
|
||||
|
||||
static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } ;
|
||||
static inline double DegToRad( double deg )
|
||||
{
|
||||
return (deg * M_PI) / 180.0;
|
||||
};
|
||||
|
||||
wxString wxColStr( wxColour c )
|
||||
{
|
||||
unsigned char r, g, b;
|
||||
|
||||
r = c.Red();
|
||||
g = c.Green();
|
||||
b = c.Blue();
|
||||
|
@ -61,19 +67,21 @@ wxString wxColStr ( wxColour c )
|
|||
wxString wxBrushString( wxColour c, int style )
|
||||
{
|
||||
wxString s = wxT( "fill:#" ) + wxColStr( c ) + semicolon + space;
|
||||
|
||||
switch( style )
|
||||
{
|
||||
case wxSOLID:
|
||||
s = s + wxT( "fill-opacity:1.0; " );
|
||||
break;
|
||||
|
||||
case wxTRANSPARENT:
|
||||
s = s + wxT( "fill-opacity:0.0; " );
|
||||
break;
|
||||
|
||||
default:
|
||||
wxASSERT_MSG( FALSE, wxT( "wxSVGFileDC::Requested Brush Style not available" ) );
|
||||
|
||||
}
|
||||
|
||||
s = s + newline;
|
||||
return s;
|
||||
}
|
||||
|
@ -82,6 +90,7 @@ wxString wxBrushString ( wxColour c, int style )
|
|||
/***********************************************************************/
|
||||
void wxSVGFileDC::Init( wxString f, int Width, int Height, float dpi )
|
||||
/***********************************************************************/
|
||||
|
||||
/* set up things first wxDCBase does all this?
|
||||
*/
|
||||
{
|
||||
|
@ -141,18 +150,20 @@ void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
|
|||
write( s );
|
||||
s.Printf( wxT( " version=\"1.1\"\n" ) );
|
||||
write( s );
|
||||
s.Printf ( wxT(" width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
|
||||
s.Printf( wxT( " width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"\n" ),
|
||||
float (Width) / dpi * 2.54, float (Height) / dpi * 2.54, Width, Height );
|
||||
write( s );
|
||||
s.Printf( wxT( ">\n" ) );
|
||||
write( s );
|
||||
|
||||
s = wxT(" <title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ;
|
||||
s = wxT( " <title>SVG Picture created as " ) + wxFileNameFromPath( f ) +
|
||||
wxT( " </title>" ) + newline;
|
||||
write( s );
|
||||
s = wxString (wxT(" <desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ;
|
||||
s = wxString( wxT( " <desc>Picture generated by wxSVG " ) ) + wxSVGVersion + wxT(
|
||||
" </desc>" ) + newline;
|
||||
write( s );
|
||||
s = wxT( " <g style=\"fill:black; stroke:black; stroke-width:1\">" ) + newline;
|
||||
write( s );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -177,6 +188,7 @@ wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
|
|||
wxSVGFileDC::~wxSVGFileDC()
|
||||
{
|
||||
wxString s = wxT( "</g> \n</svg> \n" );
|
||||
|
||||
write( s );
|
||||
delete m_outfile;
|
||||
}
|
||||
|
@ -186,7 +198,8 @@ wxSVGFileDC::~wxSVGFileDC()
|
|||
|
||||
void wxSVGFileDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
|
||||
{
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
wxString s;
|
||||
s.Printf( wxT( "<path d=\"M%d %d L%d %d\" /> \n" ), x1, y1, x2, y2 );
|
||||
if( m_OK )
|
||||
|
@ -212,7 +225,9 @@ void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord
|
|||
void wxSVGFileDC::DoDrawPoint( wxCoord x1, wxCoord y1 )
|
||||
{
|
||||
wxString s;
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
s = wxT( "<g style = \"stroke-linecap:round;\" > " ) + newline;
|
||||
write( s );
|
||||
DrawLine( x1, y1, x1, y1 );
|
||||
|
@ -237,7 +252,8 @@ void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1)
|
|||
void wxSVGFileDC::DoDrawRotatedText( const wxString& sText, wxCoord x, wxCoord y, double angle )
|
||||
{
|
||||
//known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
wxString s, sTmp;
|
||||
|
||||
// calculate bounding box
|
||||
|
@ -261,30 +277,40 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y,
|
|||
// draw background first
|
||||
// just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background
|
||||
|
||||
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ;
|
||||
sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h );
|
||||
wxASSERT_MSG( !wxSVG_DEBUG,
|
||||
wxT( "wxSVGFileDC::Draw Rotated Text Call plotting text background" ) );
|
||||
sTmp.Printf( wxT(
|
||||
" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" " ), x, y + desc -
|
||||
h, w, h );
|
||||
s = sTmp + wxT( "style=\"fill:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " );
|
||||
s = s + wxT( "stroke-width:1; stroke:#" ) + wxColStr( m_textBackgroundColour ) + wxT( "; " );
|
||||
sTmp.Printf( wxT( "\" transform=\"rotate( %.2g %d %d ) \">" ), -angle, x, y );
|
||||
s = s + sTmp + newline;
|
||||
write( s );
|
||||
}
|
||||
|
||||
//now do the text itself
|
||||
s.Printf( wxT( " <text x=\"%d\" y=\"%d\" " ), x, y );
|
||||
|
||||
sTmp = m_font.GetFaceName();
|
||||
if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
|
||||
else s = s + wxT("style=\" ") ;
|
||||
if( sTmp.Len() > 0 )
|
||||
s = s + wxT( "style=\"font-family:" ) + sTmp + wxT( "; " );
|
||||
else
|
||||
s = s + wxT( "style=\" " );
|
||||
|
||||
wxString fontweights[3] = { wxT( "normal" ), wxT( "lighter" ), wxT( "bold" ) };
|
||||
s = s + wxT( "font-weight:" ) + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
|
||||
|
||||
wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") };
|
||||
wxString fontstyles[5] = {
|
||||
wxT( "normal" ), wxT( "style error" ), wxT( "style error" ), wxT(
|
||||
"italic" ), wxT( "oblique" )
|
||||
};
|
||||
s = s + wxT( "font-style:" ) + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space;
|
||||
|
||||
sTmp.Printf( wxT( "font-size:%dpt; fill:#" ), m_font.GetPointSize() );
|
||||
s = s + sTmp;
|
||||
s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ;
|
||||
s = s + wxColStr( m_textForegroundColour ) + wxT( "; stroke:#" ) + wxColStr(
|
||||
m_textForegroundColour ) + wxT( "; " );
|
||||
sTmp.Printf( wxT( "stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >" ), -angle, x, y );
|
||||
s = s + sTmp + sText + wxT( "</text> " ) + newline;
|
||||
if( m_OK )
|
||||
|
@ -292,7 +318,6 @@ void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y,
|
|||
write( s );
|
||||
}
|
||||
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DrawRotatedText Call executed" ) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -302,10 +327,15 @@ void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
|
|||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
|
||||
void wxSVGFileDC::DoDrawRoundedRectangle( wxCoord x,
|
||||
wxCoord y,
|
||||
wxCoord width,
|
||||
wxCoord height,
|
||||
double radius )
|
||||
|
||||
{
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
wxString s;
|
||||
|
||||
s.Printf( wxT( " <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" " ),
|
||||
|
@ -317,13 +347,17 @@ void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wx
|
|||
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::DoDrawRoundedRectangle Call executed" ) );
|
||||
CalcBoundingBox( x, y );
|
||||
CalcBoundingBox( x + width, y + height );
|
||||
|
||||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle)
|
||||
void wxSVGFileDC::DoDrawPolygon( int n,
|
||||
wxPoint points[],
|
||||
wxCoord xoffset,
|
||||
wxCoord yoffset,
|
||||
int fillStyle )
|
||||
{
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
wxString s, sTmp;
|
||||
s = wxT( "<polygon style=\"" );
|
||||
if( fillStyle == wxODDEVEN_RULE )
|
||||
|
@ -339,6 +373,7 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor
|
|||
s = s + sTmp + newline;
|
||||
CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset );
|
||||
}
|
||||
|
||||
s = s + wxT( "\" /> " );
|
||||
s = s + newline;
|
||||
write( s );
|
||||
|
@ -350,7 +385,8 @@ void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoor
|
|||
void wxSVGFileDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
||||
|
||||
{
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
|
||||
int rh = height / 2;
|
||||
int rw = width / 2;
|
||||
|
@ -367,23 +403,30 @@ void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord he
|
|||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
|
||||
void wxSVGFileDC::DoDrawArc( wxCoord x1,
|
||||
wxCoord y1,
|
||||
wxCoord x2,
|
||||
wxCoord y2,
|
||||
wxCoord xc,
|
||||
wxCoord yc )
|
||||
{
|
||||
/* Draws an arc of a circle, centred on (xc, yc), with starting point
|
||||
(x1, y1) and ending at (x2, y2). The current pen is used for the outline
|
||||
and the current brush for filling the shape.
|
||||
* (x1, y1) and ending at (x2, y2). The current pen is used for the outline
|
||||
* and the current brush for filling the shape.
|
||||
*
|
||||
* The arc is drawn in an anticlockwise direction from the start point to
|
||||
* the end point. */
|
||||
|
||||
The arc is drawn in an anticlockwise direction from the start point to
|
||||
the end point. */
|
||||
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
wxString s;
|
||||
|
||||
// we need the radius of the circle which has two estimates
|
||||
double r1 = sqrt( double ( (x1 - xc) * (x1 - xc) ) + double ( (y1 - yc) * (y1 - yc) ) );
|
||||
double r2 = sqrt( double ( (x2 - xc) * (x2 - xc) ) + double ( (y2 - yc) * (y2 - yc) ) );
|
||||
|
||||
wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
|
||||
wxASSERT_MSG( (fabs( r2 - r1 ) <= 3),
|
||||
wxT( "wxSVGFileDC::DoDrawArc Error in getting radii of circle" ) );
|
||||
if( fabs( r2 - r1 ) > 3 ) //pixels
|
||||
{
|
||||
s = wxT( "<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n" );
|
||||
|
@ -391,20 +434,35 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo
|
|||
}
|
||||
|
||||
double theta1 = atan2( (double) (yc - y1), (double) (x1 - xc) );
|
||||
if ( theta1 < 0 ) theta1 = theta1 + M_PI * 2;
|
||||
if( theta1 < 0 )
|
||||
theta1 = theta1 + M_PI * 2;
|
||||
double theta2 = atan2( (double) (yc - y2), (double) (x2 - xc) );
|
||||
if ( theta2 < 0 ) theta2 = theta2 + M_PI * 2;
|
||||
if ( theta2 < theta1 ) theta2 = theta2 + M_PI *2 ;
|
||||
if( theta2 < 0 )
|
||||
theta2 = theta2 + M_PI * 2;
|
||||
if( theta2 < theta1 )
|
||||
theta2 = theta2 + M_PI * 2;
|
||||
|
||||
int fArc; // flag for large or small arc 0 means less than 180 degrees
|
||||
if ( fabs(theta2 - theta1) > M_PI ) fArc = 1; else fArc = 0 ;
|
||||
if( fabs( theta2 - theta1 ) > M_PI )
|
||||
fArc = 1;else
|
||||
fArc = 0;
|
||||
|
||||
int fSweep = 0 ; // flag for sweep always 0
|
||||
int fSweep;
|
||||
if( (theta2 - theta1) > 0 )
|
||||
fSweep = 0;else
|
||||
fSweep = 1;
|
||||
float Axis_rotation = 0.0;
|
||||
|
||||
// Draw arc as pie:
|
||||
// s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
|
||||
// the z means close the path and fill (usefull to draw a pie)
|
||||
s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d"),
|
||||
x1, y1, r1, r2, fArc, fSweep, x2, y2, xc, yc );
|
||||
// x1, y1, r1, r2, fArc, fSweep, x2, y2, xc ,yc );
|
||||
|
||||
// Draw a single arc:
|
||||
s.Printf( wxT( "<path d=\"M%d %d A%.2g %.2g %g %d %d %d %d" ),
|
||||
x1, y1, r1, r2,
|
||||
Axis_rotation,
|
||||
fArc, fSweep, x2, y2 );
|
||||
|
||||
s = s + wxT( " \" /> " ) + newline;
|
||||
|
||||
|
@ -418,41 +476,52 @@ void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCo
|
|||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
|
||||
void wxSVGFileDC::DoDrawEllipticArc( wxCoord x,
|
||||
wxCoord y,
|
||||
wxCoord w,
|
||||
wxCoord h,
|
||||
double sa,
|
||||
double ea )
|
||||
{
|
||||
/*
|
||||
Draws an arc of an ellipse. The current pen is used for drawing the arc
|
||||
and the current brush is used for drawing the pie. This function is
|
||||
currently only available for X window and PostScript device contexts.
|
||||
|
||||
x and y specify the x and y coordinates of the upper-left corner of the
|
||||
rectangle that contains the ellipse.
|
||||
|
||||
width and height specify the width and height of the rectangle that
|
||||
contains the ellipse.
|
||||
|
||||
start and end specify the start and end of the arc relative to the
|
||||
three-o'clock position from the center of the rectangle. Angles are
|
||||
specified in degrees (360 is a complete circle). Positive values mean
|
||||
counter-clockwise motion. If start is equal to end, a complete ellipse
|
||||
will be drawn. */
|
||||
* Draws an arc of an ellipse. The current pen is used for drawing the arc
|
||||
* and the current brush is used for drawing the pie. This function is
|
||||
* currently only available for X window and PostScript device contexts.
|
||||
*
|
||||
* x and y specify the x and y coordinates of the upper-left corner of the
|
||||
* rectangle that contains the ellipse.
|
||||
*
|
||||
* width and height specify the width and height of the rectangle that
|
||||
* contains the ellipse.
|
||||
*
|
||||
* start and end specify the start and end of the arc relative to the
|
||||
* three-o'clock position from the center of the rectangle. Angles are
|
||||
* specified in degrees (360 is a complete circle). Positive values mean
|
||||
* counter-clockwise motion. If start is equal to end, a complete ellipse
|
||||
* will be drawn. */
|
||||
|
||||
//known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
|
||||
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
|
||||
wxString s;
|
||||
|
||||
//radius
|
||||
double rx = w / 2;
|
||||
double ry = h / 2;
|
||||
|
||||
// center
|
||||
double xc = x + rx;
|
||||
double yc = y + ry;
|
||||
|
||||
double xs, ys, xe, ye;
|
||||
xs = xc + rx* cos( DegToRad (sa) );
|
||||
|
||||
xe = xc + rx* cos( DegToRad (ea) );
|
||||
|
||||
ys = yc - ry* sin( DegToRad (sa) );
|
||||
|
||||
ye = yc - ry* sin( DegToRad (ea) );
|
||||
|
||||
///now same as circle arc...
|
||||
|
@ -461,15 +530,22 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub
|
|||
double theta2 = atan2( ye - yc, xe - xc );
|
||||
|
||||
int fArc; // flag for large or small arc 0 means less than 180 degrees
|
||||
if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ;
|
||||
if( fabs( theta2 - theta1 ) > M_PI )
|
||||
fArc = 1;else
|
||||
fArc = 0;
|
||||
|
||||
int fSweep;
|
||||
if ( fabs(theta2 - theta1) > M_PI) fSweep = 1; else fSweep = 0 ;
|
||||
if( (theta2 - theta1) > 0 )
|
||||
fSweep = 0;else
|
||||
fSweep = 1;
|
||||
float Axis_rotation = 0.0;
|
||||
|
||||
// s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
|
||||
s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d "),
|
||||
int(xs), int(ys), int(rx), int(ry),
|
||||
fArc, fSweep, int(xe), int(ye), int(xc), int(yc) );
|
||||
// Draw a single arc:
|
||||
s.Printf( wxT( "<path d=\"M%d,%d A%d,%d %g %d %d %d,%d" ),
|
||||
int (xs), int (ys),
|
||||
int (rx), int (ry),
|
||||
Axis_rotation,
|
||||
fArc, fSweep, int (xe), int (ye) );
|
||||
|
||||
|
||||
s = s + wxT( " \" /> " ) + newline;
|
||||
|
@ -483,13 +559,19 @@ void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,doub
|
|||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , wxFont *font) const
|
||||
void wxSVGFileDC::DoGetTextExtent( const wxString& string,
|
||||
wxCoord* w,
|
||||
wxCoord* h,
|
||||
wxCoord* descent,
|
||||
wxCoord* externalLeading,
|
||||
wxFont* font ) const
|
||||
|
||||
{
|
||||
wxScreenDC sDC;
|
||||
|
||||
sDC.SetFont( m_font );
|
||||
if ( font != NULL ) sDC.SetFont ( *font );
|
||||
if( font != NULL )
|
||||
sDC.SetFont( *font );
|
||||
sDC.GetTextExtent( string, w, h, descent, externalLeading );
|
||||
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetTextExtent Call executed" ) );
|
||||
}
|
||||
|
@ -499,29 +581,28 @@ wxCoord wxSVGFileDC::GetCharHeight() const
|
|||
|
||||
{
|
||||
wxScreenDC sDC;
|
||||
|
||||
sDC.SetFont( m_font );
|
||||
|
||||
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharHeight Call executing" ) );
|
||||
return ( sDC.GetCharHeight() );
|
||||
|
||||
return sDC.GetCharHeight();
|
||||
}
|
||||
|
||||
|
||||
wxCoord wxSVGFileDC::GetCharWidth() const
|
||||
{
|
||||
wxScreenDC sDC;
|
||||
|
||||
sDC.SetFont( m_font );
|
||||
|
||||
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::GetCharWidth Call executing" ) );
|
||||
return ( sDC.GetCharWidth() ) ;
|
||||
|
||||
return sDC.GetCharWidth();
|
||||
}
|
||||
|
||||
|
||||
/// Set Functions /////////////////////////////////////////////////////////////////
|
||||
void wxSVGFileDC::SetBackground( const wxBrush& brush )
|
||||
{
|
||||
|
||||
m_backgroundBrush = brush;
|
||||
return;
|
||||
}
|
||||
|
@ -554,9 +635,9 @@ void wxSVGFileDC::SetPen(const wxPen& pen)
|
|||
wxASSERT_MSG( !wxSVG_DEBUG, wxT( "wxSVGFileDC::SetPen Call executed" ) );
|
||||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::NewGraphics()
|
||||
{
|
||||
|
||||
int w = m_pen.GetWidth();
|
||||
wxColour c = m_pen.GetColour();
|
||||
|
||||
|
@ -570,40 +651,55 @@ void wxSVGFileDC::NewGraphics ()
|
|||
case wxCAP_PROJECTING:
|
||||
sPenCap = wxT( "stroke-linecap:square; " );
|
||||
break;
|
||||
|
||||
case wxCAP_BUTT:
|
||||
sPenCap = wxT( "stroke-linecap:butt; " );
|
||||
break;
|
||||
|
||||
case wxCAP_ROUND:
|
||||
default:
|
||||
sPenCap = wxT( "stroke-linecap:round; " );
|
||||
};
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
switch( m_pen.GetJoin() )
|
||||
{
|
||||
case wxJOIN_BEVEL:
|
||||
sPenJoin = wxT( "stroke-linejoin:bevel; " );
|
||||
break;
|
||||
|
||||
case wxJOIN_MITER:
|
||||
sPenJoin = wxT( "stroke-linejoin:miter; " );
|
||||
break;
|
||||
|
||||
case wxJOIN_ROUND:
|
||||
default:
|
||||
sPenJoin = wxT( "stroke-linejoin:round; " );
|
||||
};
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
switch( m_pen.GetStyle() )
|
||||
{
|
||||
case wxSOLID:
|
||||
sPenStyle = wxT( "stroke-opacity:1.0; stroke-opacity:1.0; " );
|
||||
break;
|
||||
|
||||
case wxTRANSPARENT:
|
||||
sPenStyle = wxT( "stroke-opacity:0.0; stroke-opacity:0.0; " );
|
||||
break;
|
||||
|
||||
default:
|
||||
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
|
||||
sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
|
||||
wxASSERT_MSG( FALSE,
|
||||
wxT( "wxSVGFileDC::SetPen Call called to set a Style which is not available" )
|
||||
);
|
||||
sWarn = sWarn + wxT(
|
||||
"<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n" );
|
||||
}
|
||||
|
||||
sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
|
||||
sLast.Printf( wxT(
|
||||
"stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">" ),
|
||||
w, m_OriginX, m_OriginY, m_scaleX, m_scaleY );
|
||||
|
||||
s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
|
||||
|
@ -645,28 +741,33 @@ void wxSVGFileDC::SetMapMode( int mode )
|
|||
case wxMM_TWIPS:
|
||||
SetLogicalScale( twips2mm * m_mm_to_pix_x, twips2mm * m_mm_to_pix_y );
|
||||
break;
|
||||
|
||||
case wxMM_POINTS:
|
||||
SetLogicalScale( pt2mm * m_mm_to_pix_x, pt2mm * m_mm_to_pix_y );
|
||||
break;
|
||||
|
||||
case wxMM_METRIC:
|
||||
SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
|
||||
break;
|
||||
|
||||
case wxMM_LOMETRIC:
|
||||
SetLogicalScale( m_mm_to_pix_x / 10.0, m_mm_to_pix_y / 10.0 );
|
||||
break;
|
||||
|
||||
default:
|
||||
case wxMM_TEXT:
|
||||
SetLogicalScale( 1.0, 1.0 );
|
||||
break;
|
||||
}
|
||||
|
||||
m_mappingMode = mode;
|
||||
|
||||
/* we don't do this mega optimisation
|
||||
if (mode != wxMM_TEXT)
|
||||
{
|
||||
m_needComputeScaleX = TRUE;
|
||||
m_needComputeScaleY = TRUE;
|
||||
}
|
||||
* if (mode != wxMM_TEXT)
|
||||
* {
|
||||
* m_needComputeScaleX = TRUE;
|
||||
* m_needComputeScaleY = TRUE;
|
||||
* }
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -731,12 +832,16 @@ bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord he
|
|||
{
|
||||
if( logicalFunc != wxCOPY )
|
||||
{
|
||||
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
|
||||
wxASSERT_MSG( FALSE,
|
||||
wxT( "wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible" )
|
||||
);
|
||||
return FALSE;
|
||||
}
|
||||
if( useMask != FALSE )
|
||||
{
|
||||
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
|
||||
wxASSERT_MSG( FALSE,
|
||||
wxT( "wxSVGFileDC::DoBlit Call requested False mask ; this is not possible" )
|
||||
);
|
||||
return FALSE;
|
||||
}
|
||||
wxBitmap myBitmap( width, height );
|
||||
|
@ -754,6 +859,7 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
|
|||
{
|
||||
wxBitmap myBitmap( myIcon.GetWidth(), myIcon.GetHeight() );
|
||||
wxMemoryDC memDC;
|
||||
|
||||
memDC.SelectObject( myBitmap );
|
||||
memDC.DrawIcon( myIcon, 0, 0 );
|
||||
memDC.SelectObject( wxNullBitmap );
|
||||
|
@ -763,10 +869,13 @@ void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
|
|||
}
|
||||
|
||||
|
||||
|
||||
void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool WXUNUSED(bTransparent) /*=0*/ )
|
||||
void wxSVGFileDC::DoDrawBitmap( const class wxBitmap& bmp,
|
||||
wxCoord x,
|
||||
wxCoord y,
|
||||
bool WXUNUSED ( bTransparent) /*=0*/ )
|
||||
{
|
||||
if (m_graphics_changed) NewGraphics ();
|
||||
if( m_graphics_changed )
|
||||
NewGraphics();
|
||||
|
||||
wxString sTmp, s, sPNG;
|
||||
wxImage::AddHandler( new wxPNGHandler );
|
||||
|
@ -783,6 +892,7 @@ void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y
|
|||
|
||||
//create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
|
||||
wxBitmap myBitmap = bmp;
|
||||
|
||||
//save it
|
||||
bool bPNG_OK = myBitmap.SaveFile( sPNG, wxBITMAP_TYPE_PNG );
|
||||
|
||||
|
@ -856,13 +966,16 @@ wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const
|
|||
return YLOG2DEVREL( y );
|
||||
}
|
||||
|
||||
|
||||
void wxSVGFileDC::write( const wxString& s )
|
||||
{
|
||||
const wxWX2MBbuf buf = s.mb_str( wxConvUTF8 );
|
||||
|
||||
m_outfile->Write( buf, strlen( (const char*) buf ) );
|
||||
m_OK = m_outfile->Ok();
|
||||
}
|
||||
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma warn .rch
|
||||
#pragma warn .ccc
|
||||
|
|
|
@ -18,11 +18,12 @@
|
|||
* This class allows the real key code changed by user from a key code list file
|
||||
*/
|
||||
|
||||
Ki_HotkeyInfo::Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode )
|
||||
Ki_HotkeyInfo::Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent )
|
||||
{
|
||||
m_KeyCode = keycode; // Key code (ascii value for ascii keys or wxWidgets code for function key
|
||||
m_InfoMsg = infomsg; // info message.
|
||||
m_Idcommand = idcommand; // internal id for the corresponding command (see hotkey_id_commnand list)
|
||||
m_IdMenuEvent = idmenuevent; // id to call the corresponding event (if any) (see id.h)
|
||||
}
|
||||
|
||||
|
||||
|
@ -315,25 +316,25 @@ void DisplayHotkeyList( WinEDA_DrawFrame* frame, struct Ki_HotkeyInfoSectionDesc
|
|||
}
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
int GetCommandCodeFromHotkey( int key, Ki_HotkeyInfo** List )
|
||||
/******************************************************************/
|
||||
/************************************************************************/
|
||||
Ki_HotkeyInfo* GetDescriptorFromHotkey( int key, Ki_HotkeyInfo** List )
|
||||
/***********************************************************************/
|
||||
|
||||
/*
|
||||
* Return an id identifier fron a key code for OnHotKey() function
|
||||
* Return a Ki_HotkeyInfo * pointer fron a key code for OnHotKey() function
|
||||
* @param key = key code (ascii value, or wxWidgets value for function keys
|
||||
* @param List = pointer to a Ki_HotkeyInfo list of commands
|
||||
* @return the corresponding function identifier from the Ki_HotkeyInfo List
|
||||
* @return the corresponding Ki_HotkeyInfo * pointer from the Ki_HotkeyInfo List
|
||||
*/
|
||||
{
|
||||
for( ; *List != NULL; List++ )
|
||||
{
|
||||
Ki_HotkeyInfo* hk_decr = *List;
|
||||
if( hk_decr->m_KeyCode == key )
|
||||
return hk_decr->m_Idcommand;
|
||||
return hk_decr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -607,7 +608,8 @@ void AddHotkeyConfigMenu( wxMenu* menu )
|
|||
return;
|
||||
item = new wxMenuItem( menu, ID_PREFERENCES_CREATE_CONFIG_HOTKEYS,
|
||||
_( "Create Hotkey config file" ),
|
||||
_( "Create or Recreate the hotkey config file from current hotkey list" ) );
|
||||
_( "Create or Recreate the hotkey config file from current hotkey list" )
|
||||
);
|
||||
item->SetBitmap( save_setup_xpm );
|
||||
menu->Append( item );
|
||||
item = new wxMenuItem( menu, ID_PREFERENCES_READ_CONFIG_HOTKEYS,
|
||||
|
@ -637,7 +639,8 @@ void AddHotkeyConfigMenu( wxMenu* menu )
|
|||
ADD_MENUITEM_WITH_HELP_AND_SUBMENU( menu, submenu_hkcfg,
|
||||
-1,
|
||||
_( "Hotkey config location" ),
|
||||
_( "Hotkey config file location selection (home directory or kicad tree)" ),
|
||||
_(
|
||||
"Hotkey config file location selection (home directory or kicad tree)" ),
|
||||
right_xpm );
|
||||
submenu_hkcfg->Check( ID_PREFERENCES_HOTKEY_PATH_IS_HOME,
|
||||
g_ConfigFileLocationChoice == 0 );
|
||||
|
@ -649,6 +652,7 @@ void AddHotkeyConfigMenu( wxMenu* menu )
|
|||
/************************************************************************/
|
||||
void HandleHotkeyConfigMenuSelection( WinEDA_DrawFrame* frame, int id )
|
||||
/************************************************************************/
|
||||
|
||||
/* called on hotkey file location selecton menu
|
||||
* @param frame = current WinEDA_DrawFrame
|
||||
* @param id = selected menu id
|
||||
|
@ -665,7 +669,8 @@ wxMenuBar * menu = frame->GetMenuBar();
|
|||
g_ConfigFileLocationChoice = 0;
|
||||
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_HOME, true );
|
||||
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_KICAD, false );
|
||||
frame->m_Parent->m_EDA_CommonConfig->Write(HOTKEY_CFG_PATH_OPT, g_ConfigFileLocationChoice);
|
||||
frame->m_Parent->m_EDA_CommonConfig->Write( HOTKEY_CFG_PATH_OPT,
|
||||
g_ConfigFileLocationChoice );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -675,7 +680,8 @@ wxMenuBar * menu = frame->GetMenuBar();
|
|||
g_ConfigFileLocationChoice = 1;
|
||||
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_HOME, false );
|
||||
menu->Check( ID_PREFERENCES_HOTKEY_PATH_IS_KICAD, true );
|
||||
frame->m_Parent->m_EDA_CommonConfig->Write(HOTKEY_CFG_PATH_OPT, g_ConfigFileLocationChoice);
|
||||
frame->m_Parent->m_EDA_CommonConfig->Write( HOTKEY_CFG_PATH_OPT,
|
||||
g_ConfigFileLocationChoice );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -683,4 +689,3 @@ wxMenuBar * menu = frame->GetMenuBar();
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "colors.h"
|
||||
|
||||
// Define print format d to display a schematic component line
|
||||
#define CMP_FORMAT wxT("%3d %+8s - %+16s : %-.32s")
|
||||
#define CMP_FORMAT wxT("%3d %8s - %16s : %-.32s")
|
||||
|
||||
#define FILTERFOOTPRINTKEY "FilterFootprint"
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
* add the HkMyNewEntry pointer in the s_Schematic_Hotkey_List list or the s_LibEdit_Hotkey_List list
|
||||
* ( or s_Common_Hotkey_List if the same command is added both in eeschema and libedit)
|
||||
* Add the new code in the switch in OnHotKey() function.
|
||||
* when the variable PopupOn is true, an item is currently edited.
|
||||
* when the variable ItemInEdit is true, an item is currently edited.
|
||||
* This can be usefull if the new function cannot be executed while an item is currently being edited
|
||||
* ( For example, one cannot start a new wire when a component is moving.)
|
||||
*
|
||||
|
@ -48,8 +48,8 @@ static Ki_HotkeyInfo HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 );
|
|||
static Ki_HotkeyInfo HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 );
|
||||
static Ki_HotkeyInfo HkHelp( wxT( "Help: this message" ), HK_HELP, '?' );
|
||||
static Ki_HotkeyInfo HkResetLocalCoord( wxT( "Reset local coord." ), HK_RESET_LOCAL_COORD, ' ' );
|
||||
static Ki_HotkeyInfo HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z' );
|
||||
static Ki_HotkeyInfo HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y' );
|
||||
static Ki_HotkeyInfo HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z', (int)ID_SCHEMATIC_UNDO );
|
||||
static Ki_HotkeyInfo HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y', (int)ID_SCHEMATIC_REDO );
|
||||
|
||||
// Schematic editor
|
||||
static Ki_HotkeyInfo HkBeginWire( wxT( "begin Wire" ), HK_BEGIN_WIRE, 'W' );
|
||||
|
@ -62,7 +62,8 @@ static Ki_HotkeyInfo HkOrientNormalComponent( wxT(
|
|||
"Orient Normal Component" ),
|
||||
HK_ORIENT_NORMAL_COMPONENT, 'N' );
|
||||
static Ki_HotkeyInfo HkRotateComponent( wxT( "Rotate Component" ), HK_ROTATE_COMPONENT, 'R' );
|
||||
static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ), HK_MOVE_COMPONENT, 'M' );
|
||||
static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ), HK_MOVE_COMPONENT, 'M', ID_POPUP_SCH_MOVE_CMP_REQUEST );
|
||||
static Ki_HotkeyInfo HkDragComponent( wxT( "Drag Component" ), HK_DRAG_COMPONENT, 'G', ID_POPUP_SCH_DRAG_CMP_REQUEST );
|
||||
static Ki_HotkeyInfo HkMove2Drag( wxT(
|
||||
"Switch move block to drag block" ),
|
||||
HK_MOVEBLOCK_TO_DRAGBLOCK, '\t' );
|
||||
|
@ -88,7 +89,7 @@ Ki_HotkeyInfo* s_Common_Hotkey_List[] =
|
|||
Ki_HotkeyInfo* s_Schematic_Hotkey_List[] = {
|
||||
&HkNextSearch,
|
||||
&HkDelete, &HkInsert, &HkMove2Drag,
|
||||
&HkMoveComponent, &HkAddComponent,
|
||||
&HkMoveComponent, &HkDragComponent, &HkAddComponent,
|
||||
&HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, &HkOrientNormalComponent,
|
||||
&HkBeginWire,
|
||||
NULL
|
||||
|
@ -135,7 +136,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
* Commands are case insensitive
|
||||
*/
|
||||
{
|
||||
bool PopupOn = m_CurrentScreen->GetCurItem()
|
||||
bool ItemInEdit = m_CurrentScreen->GetCurItem()
|
||||
&& m_CurrentScreen->GetCurItem()->m_Flags;
|
||||
bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified
|
||||
|
||||
|
@ -152,11 +153,12 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
hotkey += 'A' - 'a';
|
||||
|
||||
// Search command from key :
|
||||
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( CommandCode == HK_NOT_FOUND )
|
||||
CommandCode = GetCommandCodeFromHotkey( hotkey, s_Schematic_Hotkey_List );
|
||||
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( HK_Descr == NULL )
|
||||
HK_Descr = GetDescriptorFromHotkey( hotkey, s_Schematic_Hotkey_List );
|
||||
if( HK_Descr == NULL ) return;
|
||||
|
||||
switch( CommandCode )
|
||||
switch( HK_Descr->m_Idcommand )
|
||||
{
|
||||
default:
|
||||
case HK_NOT_FOUND:
|
||||
|
@ -188,15 +190,12 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
break;
|
||||
|
||||
case HK_UNDO:
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_SCHEMATIC_UNDO);
|
||||
wxPostEvent(this, event);
|
||||
}
|
||||
break;
|
||||
|
||||
case HK_REDO:
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_SCHEMATIC_REDO);
|
||||
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
|
||||
|
||||
wxPostEvent( this, event );
|
||||
}
|
||||
break;
|
||||
|
@ -206,7 +205,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
break;
|
||||
|
||||
case HK_DELETE:
|
||||
if( PopupOn )
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
RefreshToolBar = LocateAndDeleteItem( this, DC );
|
||||
m_CurrentScreen->SetModify();
|
||||
|
@ -215,15 +214,17 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
break;
|
||||
|
||||
case HK_REPEAT_LAST:
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
if( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) )
|
||||
{
|
||||
RepeatDrawItem( DC );
|
||||
}
|
||||
else
|
||||
wxBell();
|
||||
break;
|
||||
|
||||
case HK_NEXT_SEARCH:
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
if( g_LastSearchIsMarker )
|
||||
WinEDA_SchematicFrame::FindMarker( 1 );
|
||||
else
|
||||
|
@ -231,7 +232,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
break;
|
||||
|
||||
case HK_ADD_NEW_COMPONENT: // Add component
|
||||
if( DrawStruct && DrawStruct->m_Flags )
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
|
||||
// switch to m_ID_current_state = ID_COMPONENT_BUTT;
|
||||
|
@ -351,15 +352,18 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
}
|
||||
break;
|
||||
|
||||
case HK_DRAG_COMPONENT: // Start drag Component
|
||||
case HK_MOVE_COMPONENT: // Start move Component
|
||||
if( PopupOn )
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
if( DrawStruct == NULL )
|
||||
DrawStruct = LocateSmallestComponent( GetScreen() );
|
||||
if( DrawStruct && (DrawStruct->m_Flags ==0) )
|
||||
{
|
||||
m_CurrentScreen->SetCurItem( DrawStruct );
|
||||
Process_Move_Item( m_CurrentScreen->GetCurItem(), DC );
|
||||
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
|
||||
|
||||
wxPostEvent( this, event );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -378,6 +382,8 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
* Commands are case insensitive
|
||||
*/
|
||||
{
|
||||
bool ItemInEdit = m_CurrentScreen->GetCurItem()
|
||||
&& m_CurrentScreen->GetCurItem()->m_Flags;
|
||||
bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified
|
||||
|
||||
if( hotkey == 0 )
|
||||
|
@ -391,11 +397,12 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
/* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */
|
||||
if( (hotkey >= 'a') && (hotkey <= 'z') )
|
||||
hotkey += 'A' - 'a';
|
||||
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( CommandCode == HK_NOT_FOUND )
|
||||
CommandCode = GetCommandCodeFromHotkey( hotkey, s_LibEdit_Hotkey_List );
|
||||
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( HK_Descr == NULL )
|
||||
HK_Descr = GetDescriptorFromHotkey( hotkey, s_LibEdit_Hotkey_List );
|
||||
if( HK_Descr == NULL ) return;
|
||||
|
||||
switch( CommandCode )
|
||||
switch( HK_Descr->m_Idcommand )
|
||||
{
|
||||
default:
|
||||
case HK_NOT_FOUND:
|
||||
|
@ -427,15 +434,12 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
break;
|
||||
|
||||
case HK_UNDO:
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_LIBEDIT_UNDO);
|
||||
wxPostEvent(this, event);
|
||||
}
|
||||
break;
|
||||
|
||||
case HK_REDO:
|
||||
if( ItemInEdit )
|
||||
break;
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, ID_LIBEDIT_REDO);
|
||||
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent );
|
||||
|
||||
wxPostEvent( this, event );
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -25,6 +25,7 @@ enum hotkey_id_commnand {
|
|||
HK_MIRROR_Y_COMPONENT,
|
||||
HK_ORIENT_NORMAL_COMPONENT,
|
||||
HK_MOVE_COMPONENT,
|
||||
HK_DRAG_COMPONENT,
|
||||
HK_ADD_NEW_COMPONENT,
|
||||
HK_BEGIN_WIRE
|
||||
};
|
||||
|
|
|
@ -284,6 +284,9 @@ void AddMenusForComponent( wxMenu* PopMenu, EDA_SchComponentStruct* Component )
|
|||
msg = AddHotkeyName( _( "Move Component" ), s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT );
|
||||
ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_CMP_REQUEST,
|
||||
msg, move_xpm );
|
||||
msg = AddHotkeyName( _( "Drag Component" ), s_Schematic_Hokeys_Descr, HK_DRAG_COMPONENT );
|
||||
ADD_MENUITEM( PopMenu, ID_POPUP_SCH_DRAG_CMP_REQUEST,
|
||||
msg, move_xpm );
|
||||
}
|
||||
|
||||
// add menu orient et sous menu:
|
||||
|
|
|
@ -53,6 +53,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
|
|||
case ID_POPUP_SCH_MOVE_PINSHEET:
|
||||
case ID_POPUP_SCH_MOVE_ITEM_REQUEST:
|
||||
case ID_POPUP_SCH_MOVE_CMP_REQUEST:
|
||||
case ID_POPUP_SCH_DRAG_CMP_REQUEST:
|
||||
case ID_POPUP_SCH_EDIT_CMP:
|
||||
case ID_POPUP_SCH_MIROR_X_CMP:
|
||||
case ID_POPUP_SCH_MIROR_Y_CMP:
|
||||
|
@ -486,21 +487,27 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
|
|||
m_CurrentScreen->GetCurItem(), &dc );
|
||||
break;
|
||||
|
||||
case ID_POPUP_SCH_DRAG_CMP_REQUEST:
|
||||
case ID_POPUP_SCH_MOVE_CMP_REQUEST:
|
||||
|
||||
// Ensure the struct is a component (could be a struct of a component, like Field, text..)
|
||||
if( m_CurrentScreen->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
|
||||
m_CurrentScreen->SetCurItem( LocateSmallestComponent( GetScreen() ) );
|
||||
if( m_CurrentScreen->GetCurItem() == NULL )
|
||||
break;
|
||||
|
||||
case ID_POPUP_SCH_MOVE_ITEM_REQUEST:
|
||||
DrawPanel->MouseToCursorSchema();
|
||||
Process_Move_Item( m_CurrentScreen->GetCurItem(), &dc );
|
||||
if ( id == ID_POPUP_SCH_DRAG_CMP_REQUEST )
|
||||
{ // The easiest way to handle a drag component is simulate a block drag command
|
||||
if( GetScreen()->BlockLocate.m_State == STATE_NO_BLOCK )
|
||||
{
|
||||
if( !HandleBlockBegin( &dc, BLOCK_DRAG, GetScreen()->m_Curseur ) ) break;
|
||||
HandleBlockEnd( &dc );
|
||||
}
|
||||
}
|
||||
else Process_Move_Item( m_CurrentScreen->GetCurItem(), &dc );
|
||||
break;
|
||||
|
||||
case ID_POPUP_SCH_EDIT_CMP:
|
||||
|
||||
// Ensure the struct is a component (could be a struct of a component, like Field, text..)
|
||||
if( m_CurrentScreen->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
|
||||
m_CurrentScreen->SetCurItem( LocateSmallestComponent( GetScreen() ) );
|
||||
|
|
|
@ -91,9 +91,10 @@ void WinEDA_GerberFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
if( (hotkey >= 'a') && (hotkey <= 'z') )
|
||||
hotkey += 'A' - 'a';
|
||||
|
||||
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Gerbview_Hotkey_List );
|
||||
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Gerbview_Hotkey_List );
|
||||
if( HK_Descr == NULL ) return;
|
||||
|
||||
switch( CommandCode )
|
||||
switch( HK_Descr->m_Idcommand )
|
||||
{
|
||||
default:
|
||||
case HK_NOT_FOUND:
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
COMMON_GLOBL wxString g_BuildVersion
|
||||
#ifdef EDA_BASE
|
||||
(wxT("(2007-09-19)"))
|
||||
(wxT("(2007-09-22)"))
|
||||
#endif
|
||||
;
|
||||
|
||||
|
|
|
@ -31,9 +31,10 @@ public:
|
|||
int m_KeyCode; // Key code (ascii value for ascii keys or wxWidgets code for function key
|
||||
wxString m_InfoMsg; // info message.
|
||||
int m_Idcommand; // internal id for the corresponding command (see hotkey_id_commnand list)
|
||||
int m_IdMenuEvent; // id to call the corresponding event (if any) (see id.h)
|
||||
|
||||
public:
|
||||
Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode );
|
||||
Ki_HotkeyInfo( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent = 0 );
|
||||
};
|
||||
|
||||
/* handle a Section name and the corresponding list of hotkeys (Ki_HotkeyInfo list)
|
||||
|
@ -101,7 +102,7 @@ wxString AddHotkeyName( const wxString& text,
|
|||
int CommandId );
|
||||
void DisplayHotkeyList( WinEDA_DrawFrame* frame,
|
||||
struct Ki_HotkeyInfoSectionDescriptor* List );
|
||||
int GetCommandCodeFromHotkey( int key, Ki_HotkeyInfo** List );
|
||||
Ki_HotkeyInfo* GetDescriptorFromHotkey( int key, Ki_HotkeyInfo** List );
|
||||
|
||||
|
||||
#endif // HOTKEYS_BASIC_H
|
||||
|
|
|
@ -282,7 +282,7 @@ enum main_id {
|
|||
ID_POPUP_SCH_DELETE_NODE,
|
||||
ID_POPUP_SCH_MOVE_CMP_REQUEST,
|
||||
ID_POPUP_SCH_DELETE_CMP,
|
||||
ID_POPUP_SCH_UNUSED_0,
|
||||
ID_POPUP_SCH_DRAG_CMP_REQUEST,
|
||||
ID_POPUP_SCH_UNUSED_1,
|
||||
ID_POPUP_SCH_UNUSED_2,
|
||||
ID_POPUP_SCH_ENTRY_SELECT_SLASH,
|
||||
|
|
25
libs.linux
25
libs.linux
|
@ -25,9 +25,9 @@ KICAD_TEMPLATE=$(KICAD_DATA)/template
|
|||
|
||||
else
|
||||
# used by myself (JP Charras) to build a statically linked distribution intalled in /usr/local (with STD_INSTALL = 0)
|
||||
PREFIX = /usr/local/linux
|
||||
KICAD_BIN = $(PREFIX)/bin
|
||||
KICAD_PLUGINS = $(PREFIX)/linux/plugins
|
||||
PREFIX = /usr/local/kicad
|
||||
KICAD_BIN = $(PREFIX)/linux
|
||||
KICAD_PLUGINS = $(KICAD_BIN)/plugins
|
||||
KICAD_DOCS=$(PREFIX)/help
|
||||
KICAD_DATA=$(PREFIX)
|
||||
KICAD_MODULES=$(KICAD_DATA)/modules
|
||||
|
@ -121,12 +121,15 @@ ifeq ($(KICAD_STATIC_LINK), 1)
|
|||
LIBS3D = $(WXPATH)/$(PREFIX_WX_LIBS)$(SUFFIX_WX_LIBGL)\
|
||||
$(MESALIBSPATH)/libGL.a $(MESALIBSPATH)/libGLU.a
|
||||
|
||||
AUXLIB = -lXxf86vm
|
||||
#AUXLIB = /usr/X11R6/lib/libXinerama.a
|
||||
|
||||
WXSYSLIB= $(WXPATH)/$(PREFIX_WX_LIBS)-$(LIBVERSION).a \
|
||||
$(WXPATH)/libwxpng-$(LIBVERSION).a\
|
||||
$(WXPATH)/libwxjpeg-$(LIBVERSION).a\
|
||||
$(WXPATH)/libwxzlib-$(LIBVERSION).a\
|
||||
$(LIBREGEX)\
|
||||
/usr/X11R6/lib/libXinerama.a \
|
||||
$(AUXLIB)\
|
||||
-lgtk-x11-2.0 -lgdk-x11-2.0 \
|
||||
-latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lgthread-2.0\
|
||||
-lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl\
|
||||
|
@ -134,18 +137,8 @@ WXSYSLIB= $(WXPATH)/$(PREFIX_WX_LIBS)-$(LIBVERSION).a \
|
|||
-L/usr/lib $(PYLIBS)
|
||||
|
||||
|
||||
WXSYSLIB_WITH_GL= $(WXPATH)/$(PREFIX_WX_LIBS)-$(LIBVERSION).a \
|
||||
$(WXPATH)/libwxpng-$(LIBVERSION).a\
|
||||
$(WXPATH)/libwxjpeg-$(LIBVERSION).a\
|
||||
$(WXPATH)/libwxzlib-$(LIBVERSION).a\
|
||||
$(LIBS3D)\
|
||||
/usr/X11R6/lib/libXinerama.a \
|
||||
/usr/X11R6/lib/libXxf86vm.a \
|
||||
-lgtk-x11-2.0 -lgdk-x11-2.0 \
|
||||
-latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lgthread-2.0\
|
||||
-lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl\
|
||||
-lglib-2.0 -lpangoft2-1.0 -lSM\
|
||||
-L/usr/lib $(PYLIBS)
|
||||
WXSYSLIB_WITH_GL= $(WXSYSLIB) $(LIBS3D)
|
||||
|
||||
else
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
|
|
|
@ -186,12 +186,14 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
if( (hotkey >= 'a') && (hotkey <= 'z') )
|
||||
hotkey += 'A' - 'a';
|
||||
|
||||
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( CommandCode == HK_NOT_FOUND )
|
||||
CommandCode = GetCommandCodeFromHotkey( hotkey, s_board_edit_Hotkey_List );
|
||||
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( HK_Descr == NULL )
|
||||
HK_Descr = GetDescriptorFromHotkey( hotkey, s_board_edit_Hotkey_List );
|
||||
if( HK_Descr == NULL ) return;
|
||||
|
||||
int ll;
|
||||
|
||||
switch( CommandCode )
|
||||
switch( HK_Descr->m_Idcommand )
|
||||
{
|
||||
default:
|
||||
case HK_NOT_FOUND:
|
||||
|
@ -465,7 +467,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
SetCurItem( module );
|
||||
}
|
||||
|
||||
switch( CommandCode )
|
||||
switch( HK_Descr->m_Idcommand )
|
||||
{
|
||||
case HK_ROTATE_FOOTPRINT: // Rotation
|
||||
Rotate_Module( DC, module, 900, TRUE );
|
||||
|
@ -506,11 +508,12 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* DC, int hotkey,
|
|||
if( (hotkey >= 'a') && (hotkey <= 'z') )
|
||||
hotkey += 'A' - 'a';
|
||||
|
||||
int CommandCode = GetCommandCodeFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( CommandCode == HK_NOT_FOUND )
|
||||
CommandCode = GetCommandCodeFromHotkey( hotkey, s_module_edit_Hotkey_List );
|
||||
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List );
|
||||
if( HK_Descr == NULL )
|
||||
HK_Descr = GetDescriptorFromHotkey( hotkey, s_module_edit_Hotkey_List );
|
||||
if( HK_Descr == NULL ) return;
|
||||
|
||||
switch( CommandCode )
|
||||
switch( HK_Descr->m_Idcommand )
|
||||
{
|
||||
default:
|
||||
case HK_NOT_FOUND:
|
||||
|
|
Loading…
Reference in New Issue