Header clean up round 1.

This commit is contained in:
Wayne Stambaugh 2020-12-18 09:04:03 -05:00
parent 34fb55dc9c
commit bf00ebee3b
21 changed files with 1989 additions and 2122 deletions

View File

@ -35,71 +35,10 @@
/**
* BASE_SCREEN
* handles how to draw a screen (a board, a schematic ...)
* Handles how to draw a screen (a board, a schematic ...)
*/
class BASE_SCREEN : public EDA_ITEM
{
private:
bool m_flagModified; ///< Indicates current drawing has been modified.
bool m_flagSave; ///< Indicates automatic file save.
/**
* The cross hair position in logical (drawing) units. The cross hair is not the cursor
* position. It is an addition indicator typically drawn on grid to indicate to the
* user where the current action will be performed.
*/
wxPoint m_crossHairPosition;
protected:
/**
* The number of #BASE_SCREEN objects in this design.
*
* This currently only has meaning for #SCH_SCREEN objects because #PCB_SCREEN object
* are limited to a single file. The count is virtual because #SCH_SCREEN objects can be
* used more than once so the screen (page) count can be more than the number of screen
* objects.
*/
int m_pageCount;
/**
* An integer based page number used for printing a range of pages.
*
* This page number is set before printing and plotting because page numbering does not
* reflect the actual page number in complex hiearachies in #SCH_SCREEN objects.
*/
int m_virtualPageNumber;
/**
* A user defined string page number used for printing and plotting.
*
* This currently only has meaning for #SCH_SCREEN objects because #PCB_SCREEN object
* are limited to a single file. This must be set before displaying, printing, or
* plotting the current sheet. If empty, the #m_virtualPageNumber value is converted
* to a string.
*/
wxString m_pageNumber;
public:
static wxString m_PageLayoutDescrFileName; ///< the name of the page layout descr file,
///< or emty to used the default pagelayout
wxPoint m_DrawOrg; ///< offsets for drawing the circuit on the screen
VECTOR2D m_LocalOrigin; ///< Relative Screen cursor coordinate (on grid)
///< in user units. (coordinates from last reset position)
wxPoint m_StartVisu; ///< Coordinates in drawing units of the current
///< view position (upper left corner of device)
bool m_Center; ///< Center on screen. If true (0.0) is centered on screen
///< coordinates can be < 0 and > 0 except for schematics.
///< false: when coordinates can only be >= 0 (schematics).
VECTOR2D m_ScrollCenter; ///< Current scroll center point in logical units.
bool m_Initialized;
public:
BASE_SCREEN( EDA_ITEM* aParent, KICAD_T aType = SCREEN_T );
@ -142,9 +81,69 @@ public:
const wxString& GetPageNumber() const;
void SetPageNumber( const wxString& aPageNumber ) { m_pageNumber = aPageNumber; }
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const override;
#endif
static wxString m_PageLayoutDescrFileName; ///< the name of the page layout descr file,
///< or emty to used the default pagelayout
wxPoint m_DrawOrg; ///< offsets for drawing the circuit on the screen
VECTOR2D m_LocalOrigin; ///< Relative Screen cursor coordinate (on grid)
///< in user units. (coordinates from last reset position)
wxPoint m_StartVisu; ///< Coordinates in drawing units of the current
///< view position (upper left corner of device)
bool m_Center; ///< Center on screen. If true (0.0) is centered on screen
///< coordinates can be < 0 and > 0 except for schematics.
///< false: when coordinates can only be >= 0 (schematics).
VECTOR2D m_ScrollCenter; ///< Current scroll center point in logical units.
bool m_Initialized;
protected:
/**
* The number of #BASE_SCREEN objects in this design.
*
* This currently only has meaning for #SCH_SCREEN objects because #PCB_SCREEN object
* are limited to a single file. The count is virtual because #SCH_SCREEN objects can be
* used more than once so the screen (page) count can be more than the number of screen
* objects.
*/
int m_pageCount;
/**
* An integer based page number used for printing a range of pages.
*
* This page number is set before printing and plotting because page numbering does not
* reflect the actual page number in complex hiearachies in #SCH_SCREEN objects.
*/
int m_virtualPageNumber;
/**
* A user defined string page number used for printing and plotting.
*
* This currently only has meaning for #SCH_SCREEN objects because #PCB_SCREEN object
* are limited to a single file. This must be set before displaying, printing, or
* plotting the current sheet. If empty, the #m_virtualPageNumber value is converted
* to a string.
*/
wxString m_pageNumber;
private:
bool m_flagModified; ///< Indicates current drawing has been modified.
bool m_flagSave; ///< Indicates automatic file save.
/**
* The cross hair position in logical (drawing) units. The cross hair is not the cursor
* position. It is an addition indicator typically drawn on grid to indicate to the
* user where the current action will be performed.
*/
wxPoint m_crossHairPosition;
};
#endif // BASE_SCREEN_H

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 1992-2017 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -35,8 +35,8 @@ class PLOTTER;
/*
* BASIC_GAL is a minimal GAL implementation to draw, plot and convert
* stroke texts to a set of segments for DRC tests, and to calculate text sizes.
* A minimal GAL implementation to draw, plot and convert stroke texts to a set of segments
* for DRC tests, and to calculate text sizes.
*
* Currently it allows one to use GAL and STROKE_FONT methods in legacy draw mode
* (using wxDC functions) in plot functions only for texts.
@ -56,24 +56,17 @@ struct TRANSFORM_PRM // A helper class to transform coordinates in BASIC_GAL
double m_rotAngle;
};
class BASIC_GAL: public KIGFX::GAL
{
public:
wxDC* m_DC;
COLOR4D m_Color;
private:
TRANSFORM_PRM m_transform;
std::stack <TRANSFORM_PRM> m_transformHistory;
public:
BASIC_GAL( KIGFX::GAL_DISPLAY_OPTIONS& aDisplayOptions ) :
GAL( aDisplayOptions )
{
m_DC = NULL;
m_DC = nullptr;
m_Color = RED;
m_plotter = NULL;
m_callback = NULL;
m_plotter = nullptr;
m_callback = nullptr;
m_callbackData = nullptr;
m_isClipped = false;
}
@ -83,7 +76,8 @@ public:
m_plotter = aPlotter;
}
void SetCallback( void (* aCallback)( int x0, int y0, int xf, int yf, void* aData ), void* aData )
void SetCallback( void (* aCallback)( int x0, int y0, int xf, int yf, void* aData ),
void* aData )
{
m_callback = aCallback;
m_callbackData = aData;
@ -93,13 +87,13 @@ public:
/// If NULL, no clip will be made
void SetClipBox( EDA_RECT* aClipBox )
{
m_isClipped = aClipBox != NULL;
m_isClipped = aClipBox != nullptr;
if( aClipBox )
m_clipBox = *aClipBox;
}
/// @brief Save the context.
/// Save the context.
virtual void Save() override
{
m_transformHistory.push( m_transform );
@ -112,21 +106,24 @@ public:
}
/**
* @brief Draw a polyline
* Draw a polyline
*
* @param aPointList is a list of 2D-Vectors containing the polyline points.
*/
virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ) override;
virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ) override;
/** Start and end points are defined as 2D-Vectors.
/**
* Start and end points are defined as 2D-Vectors.
*
* @param aStartPoint is the start point of the line.
* @param aEndPoint is the end point of the line.
*/
virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) override;
/**
* @brief Translate the context.
* Translate the context.
*
* @param aTranslation is the translation vector.
*/
@ -136,7 +133,7 @@ public:
}
/**
* @brief Rotate the context.
* Rotate the context.
*
* @param aAngle is the rotation angle in radians.
*/
@ -152,6 +149,14 @@ private:
// Apply the roation/translation transform to aPoint
const VECTOR2D transform( const VECTOR2D& aPoint ) const;
public:
wxDC* m_DC;
COLOR4D m_Color;
private:
TRANSFORM_PRM m_transform;
std::stack <TRANSFORM_PRM> m_transformHistory;
// A clip box, to clip drawings in a wxDC (mandatory to avoid draw issues)
EDA_RECT m_clipBox; // The clip box
bool m_isClipped; // Allows/disallows clipping
@ -162,8 +167,7 @@ private:
void (* m_callback)( int x0, int y0, int xf, int yf, void* aData );
void* m_callbackData; // a optional parameter for m_callback
// When calling the draw functions for plot, the plotter acts as a wxDC
// to plot basic items
// When calling the draw functions for plot, the plotter acts as a wxDC to plot basic items.
PLOTTER* m_plotter;
};

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2014-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -24,6 +24,7 @@
#ifndef BIN_MOD_H_
#define BIN_MOD_H_
/// @todo Should this be a check for the wxWidgets version rather that `#if 0`.
#if 0
#include <wx/filehistory.h> // wx 3.0:
#else
@ -38,12 +39,11 @@
class APP_SETTINGS_BASE;
/**
* Struct BIN_MOD
* pertains to a single program module, either an EXE or a DSO/DLL ("bin_mod").
* Pertains to a single program module, either an EXE or a DSO/DLL ("bin_mod").
*
* It manages miscellaneous configuration file information pertinent to one bin_mod.
* Because it serves in both DSO/DLLs and in EXEs, its name is neutral.
* <p>
* Accessors are in containing (wrapper) classes.
* Because it serves in both DSO/DLLs and in EXEs, its name is neutral. Accessors are
* in containing (wrapper) classes.
*/
struct BIN_MOD
{
@ -54,8 +54,9 @@ struct BIN_MOD
void End();
/**
* Takes ownership of a new application settings object
* @param aPtr is the settings object for this module
* Takes ownership of a new application settings object.
*
* @param aPtr is the settings object for this module.
*/
void InitSettings( APP_SETTINGS_BASE* aPtr ) { m_config = aPtr; }
@ -65,8 +66,6 @@ struct BIN_MOD
wxString m_help_file;
SEARCH_STACK m_search;
};
#endif // BIN_MOD_H_

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2018 jean-pierre.charras jp.charras at wanadoo.fr
* Copyright (C) 2013-2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2013-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -41,27 +41,15 @@ class PLOTTER;
/**
* This class handle bitmap images in KiCad.
* It is not intended to be used alone, but inside another class,
* so all methods are protected ( or private )
* It is used in SCH_BITMAP class and WS_DRAW_ITEM_BITMAP (and other in future)
*
* Remember not all plotters are able to plot a bitmap
* Mainly GERBER plotters cannot.
* It is not intended to be used alone, but inside another class so all methods are protected
* or private. It is used in #SCH_BITMAP class, #WS_DRAW_ITEM_BITMAP, and possibly others in
* the future.
*
* @warning Not all plotters are able to plot a bitmap. Mainly GERBER plotters cannot.
*/
class BITMAP_BASE
{
private:
double m_scale; // The scaling factor of the bitmap
// With m_pixelSizeIu, controls the actual draw size
wxImage* m_image; // the raw image data (png format)
wxBitmap* m_bitmap; // the bitmap used to draw/plot image
double m_pixelSizeIu; // The scaling factor of the bitmap
// to convert the bitmap size (in pixels)
// to internal KiCad units
// Usually does not change
int m_ppi; // the bitmap definition. the default is 300PPI
public:
BITMAP_BASE( const wxPoint& pos = wxPoint( 0, 0 ) );
@ -73,7 +61,6 @@ public:
delete m_image;
}
/*
* Accessors:
*/
@ -93,9 +80,9 @@ public:
void SetScale( double aScale ) { m_scale = aScale; }
/*
* Function RebuildBitmap
* Rebuild the internal bitmap used to draw/plot image
* must be called after a m_image change
* Rebuild the internal bitmap used to draw/plot image.
*
* This must be called after a #m_image change.
*/
void RebuildBitmap() { *m_bitmap = wxBitmap( *m_image ); }
@ -106,36 +93,32 @@ public:
}
/**
* Function ImportData
* Copy aItem image to me and update m_bitmap
* Copy aItem image to this object and update #m_bitmap.
*/
void ImportData( BITMAP_BASE* aItem );
/**
* Function GetScalingFactor
* @return the scaling factor from pixel size to actual draw size
* this scaling factor depends on m_pixelSizeIu and m_scale
* m_pixelSizeIu gives the scaling factor between a pixel size and
* the internal schematic units
* m_scale is an user dependant value, and gives the "zoom" value
* m_scale = 1.0 = original size of bitmap.
* m_scale < 1.0 = the bitmap is drawn smaller than its original size.
* m_scale > 1.0 = the bitmap is drawn bigger than its original size.
* This scaling factor depends on #m_pixelSizeIu and #m_scale.
*
* #m_pixelSizeIu gives the scaling factor between a pixel size and the internal units.
* #m_scale is an user dependent value, and gives the "zoom" value.
* - #m_scale = 1.0 = original size of bitmap.
* - #m_scale < 1.0 = the bitmap is drawn smaller than its original size.
* - #m_scale > 1.0 = the bitmap is drawn bigger than its original size.
*
* @return The scaling factor from pixel size to actual draw size.
*/
double GetScalingFactor() const
{
return m_pixelSizeIu * m_scale;
}
/**
* Function GetSize
* @return the actual size (in user units, not in pixels) of the image
*/
wxSize GetSize() const;
/**
* Function GetSizePixels
* @return the size in pixels of the image
*/
wxSize GetSizePixels() const
@ -147,8 +130,7 @@ public:
}
/**
* @return the bitmap definition in ppi
* the default is 300 ppi
* @return the bitmap definition in ppi, the default is 300 ppi.
*/
int GetPPI() const
{
@ -156,12 +138,11 @@ public:
}
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
* purposes. This box should be an enclosing perimeter for visible
* components of this object, and the units should be in the pcb or
* schematic coordinate system. It is OK to overestimate the size
* by a few counts.
* Return the orthogonal, bounding box of this object for display purposes.
*
* This box should be an enclosing perimeter for visible components of this object,
* and the units should be in the pcb or schematic coordinate system. It is OK to
* overestimate the size by a few counts.
*/
const EDA_RECT GetBoundingBox() const;
@ -170,83 +151,98 @@ public:
/**
* Reads and stores in memory an image file.
*
* Init the bitmap format used to draw this item.
* supported images formats are format supported by wxImage
* if all handlers are loaded
* by default, .png, .jpeg are always loaded
* Initialize the bitmap format used to draw this item. Supported images formats are
* format supported by wxImage if all handlers are loaded. By default, .png, .jpeg
* are always loaded.
*
* @param aFullFilename The full filename of the image file to read.
* @return bool - true if success reading else false.
* @return true if success reading else false.
*/
bool ReadImageFile( const wxString& aFullFilename );
/**
* Reads and stores in memory an image file.
*
* Init the bitmap format used to draw this item.
* supported images formats are format supported by wxImage
* if all handlers are loaded
* by default, .png, .jpeg are always loaded
* Initialize the bitmap format used to draw this item.
*
* @param aInStream an input stream containing the file data
* @return bool - true if success reading else false.
* Supported images formats are format supported by wxImage if all handlers are loaded.
* By default, .png, .jpeg are always loaded.
*
* @param aInStream an input stream containing the file data.
* @return true if success reading else false.
*/
bool ReadImageFile( wxInputStream& aInStream );
/**
* writes the bitmap data to aFile
* The format is png, in Hexadecimal form:
* If the hexadecimal data is converted to binary it gives exactly a .png image data
* Write the bitmap data to \a aFile.
*
* The file format is png, in hexadecimal form. If the hexadecimal data is converted to
* binary it gives exactly a .png image data.
*
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
* @return true if success writing else false.
*/
bool SaveData( FILE* aFile ) const;
/**
* writes the bitmap data to an array string
* The format is png, in Hexadecimal form:
* If the hexadecimal data is converted to binary it gives exactly a .png image data
* Write the bitmap data to an array string.
*
* The format is png, in Hexadecimal form. If the hexadecimal data is converted to binary
* it gives exactly a .png image data.
*
* @param aPngStrings The wxArrayString to write to.
*/
void SaveData( wxArrayString& aPngStrings ) const;
/**
* Load an image data saved by SaveData (png, in Hexadecimal form)
* @param aLine - the LINE_READER used to read the data file.
* @param aErrorMsg - Description of the error if an error occurs while loading the
* png bimap data.
* Load an image data saved by #SaveData.
*
* The file format must be png format in hexadecimal.
*
* @param aLine the LINE_READER used to read the data file.
* @param aErrorMsg Description of the error if an error occurs while loading the
* png bitmap data.
* @return true if the bitmap loaded successfully.
*/
bool LoadData( LINE_READER& aLine, wxString& aErrorMsg );
/**
* Function Mirror
* Mirror image vertically (i.e. relative to its horizontal X axis )
* or horizontally (i.e relative to its vertical Y axis)
* @param aVertically = false to mirror horizontally
* or true to mirror vertically
* Mirror image vertically (i.e. relative to its horizontal X axis ) or horizontally (i.e
* relative to its vertical Y axis).
* @param aVertically false to mirror horizontally or true to mirror vertically.
*/
void Mirror( bool aVertically );
/**
* Function Rotate
* Rotate image CW or CCW.
* @param aRotateCCW = true to rotate CCW
*
* @param aRotateCCW true to rotate CCW or false to rotate CW.
*/
void Rotate( bool aRotateCCW );
/**
* Function PlotImage
* Plot bitmap on plotter.
*
* If the plotter does not support bitmaps, plot a
* @param aPlotter = the plotter to use
* @param aPos = the position od the center of the bitmap
* @param aDefaultColor = the color used to plot the rectangle when bitmap is not supported
* @param aDefaultPensize = the pen size used to plot the rectangle when bitmap is not supported
*
* @param aPlotter the plotter to use.
* @param aPos the position of the center of the bitmap.
* @param aDefaultColor the color used to plot the rectangle when bitmap is not supported.
* @param aDefaultPensize the pen size used to plot the rectangle when bitmap is not supported.
*/
void PlotImage( PLOTTER* aPlotter, const wxPoint& aPos,
KIGFX::COLOR4D aDefaultColor, int aDefaultPensize );
private:
double m_scale; // The scaling factor of the bitmap
// With m_pixelSizeIu, controls the actual draw size
wxImage* m_image; // the raw image data (png format)
wxBitmap* m_bitmap; // the bitmap used to draw/plot image
double m_pixelSizeIu; // The scaling factor of the bitmap
// to convert the bitmap size (in pixels)
// to internal KiCad units
// Usually does not change
int m_ppi; // the bitmap definition. the default is 300PPI
};

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wandadoo.fr
* Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -43,9 +43,7 @@ class SHAPE;
class PCB_GROUP;
/**
* Enum PCB_SHAPE_TYPE_T
* is the set of shapes for PCB graphics and tracks and footprint graphics
* in the .m_Shape member
* The set of shapes for PCB graphics and tracks and footprint graphics in the .m_Shape member
*/
enum PCB_SHAPE_TYPE_T
{
@ -77,18 +75,12 @@ static inline wxString PCB_SHAPE_TYPE_T_asString( PCB_SHAPE_TYPE_T a )
/**
* BOARD_ITEM
* is a base class for any item which can be embedded within the BOARD
* container class, and therefore instances of derived classes should only be
* found in Pcbnew or other programs that use class BOARD and its contents.
* The corresponding class in Eeschema is SCH_ITEM.
* A base class for any item which can be embedded within the #BOARD container class, and
* therefore instances of derived classes should only be found in Pcbnew or other programs
* that use class #BOARD and its contents.
*/
class BOARD_ITEM : public EDA_ITEM
{
protected:
PCB_LAYER_ID m_layer;
PCB_GROUP* m_group;
public:
BOARD_ITEM( BOARD_ITEM* aParent, KICAD_T idtype ) :
EDA_ITEM( aParent, idtype ),
@ -115,11 +107,9 @@ public:
}
/**
* Function GetCenter()
*
* This defaults to the center of the bounding box if not overridden.
*
* @return centre point of the item
* @return center point of the item
*/
virtual wxPoint GetCenter() const
{
@ -139,8 +129,8 @@ public:
}
/**
* Function IsConnected()
* Returns information if the object is derived from BOARD_CONNECTED_ITEM.
*
* @return True if the object is of BOARD_CONNECTED_ITEM type, false otherwise.
*/
virtual bool IsConnected() const
@ -162,12 +152,11 @@ public:
static wxPoint ZeroOffset;
/**
* Function GetEffectiveShape
* Some pad shapes can be complex (rounded/chamfered rectangle), even without considering
* custom shapes. This routine returns a COMPOUND shape (set of simple shapes which make
* up the pad fod use with routing, collision determiniation, etc).
* up the pad for use with routing, collision determination, etc).
*
* Note that this list can contain a SHAPE_SIMPLE (a simple single-outline non-intersecting
* @note This list can contain a SHAPE_SIMPLE (a simple single-outline non-intersecting
* polygon), but should never contain a SHAPE_POLY_SET (a complex polygon consisting of
* multiple outlines and/or holes).
*
@ -179,14 +168,12 @@ public:
BOARD_ITEM_CONTAINER* GetParent() const { return (BOARD_ITEM_CONTAINER*) m_parent; }
/**
* Function GetLayer
* returns the primary layer this item is on.
* Return the primary layer this item is on.
*/
virtual PCB_LAYER_ID GetLayer() const { return m_layer; }
/**
* Function GetLayerSet
* returns a std::bitset of all layers on which the item physically resides.
* Return a std::bitset of all layers on which the item physically resides.
*/
virtual LSET GetLayerSet() const { return LSET( m_layer ); }
virtual void SetLayerSet( LSET aLayers )
@ -197,11 +184,12 @@ public:
}
/**
* Function SetLayer
* sets the layer this item is on.
* Set the layer this item is on.
*
* This method is virtual because some items (in fact: class DIMENSION)
* have a slightly different initialization.
*
* @param aLayer The layer number.
* is virtual because some items (in fact: class DIMENSION)
* have a slightly different initialization
*/
virtual void SetLayer( PCB_LAYER_ID aLayer )
{
@ -209,8 +197,7 @@ public:
}
/**
* Function Duplicate
* creates a copy of a BOARD_ITEM.
* Create a copy of a of this #BOARD_ITEM.
*/
virtual BOARD_ITEM* Duplicate() const
{
@ -221,20 +208,25 @@ public:
}
/**
* Swap data between aItem and aImage.
* aItem and aImage should have the same type
* Used in undo redo command to swap values between an item and its copy
* Only values like layer, size .. which are modified by editing are swapped
* @param aImage = the item image which contains data to swap
* Swap data between \a aItem and \a aImage.
*
* \a aItem and \a aImage should have the same type.
*
* Used in undo and redo commands to swap values between an item and its copy.
* Only values like layer, size .. which are modified by editing are swapped.
*
* @param aImage the item image which contains data to swap.
*/
virtual void SwapData( BOARD_ITEM* aImage );
/**
* Function IsOnLayer
* tests to see if this object is on the given layer. Virtual so objects like PAD, which
* reside on multiple layers can do their own form of testing.
* Test to see if this object is on the given layer.
*
* Virtual so objects like #PAD, which reside on multiple layers can do their own form
* of testing.
*
* @param aLayer The layer to test for.
* @return bool - true if on given layer, else false.
* @return true if on given layer, else false.
*/
virtual bool IsOnLayer( PCB_LAYER_ID aLayer ) const
{
@ -242,10 +234,9 @@ public:
}
/**
* Function IsTrack
* tests to see if this object is a track or via (or microvia).
* form of testing.
* @return bool - true if a track or via, else false.
* Test to see if this object is a track or via (or microvia).
*
* @return true if a track or via, else false.
*/
bool IsTrack() const
{
@ -253,8 +244,7 @@ public:
}
/**
* Function IsLocked
* @return bool - true if the object is locked, else false
* @return true if the object is locked, else false.
*/
virtual bool IsLocked() const
{
@ -263,8 +253,7 @@ public:
}
/**
* Function SetLocked
* modifies 'lock' status for of the item.
* Modify the 'lock' status for of the item.
*/
virtual void SetLocked( bool aLocked )
{
@ -272,22 +261,19 @@ public:
}
/**
* Function DeleteStructure
* deletes this object after removing from its parent if it has one.
* Delete this object after removing from its parent if it has one.
*/
void DeleteStructure();
/**
* Function ShowShape
* converts the enum PCB_SHAPE_TYPE_T integer value to a wxString.
* Convert the enum #PCB_SHAPE_TYPE_T integer value to a wxString.
*/
static wxString ShowShape( PCB_SHAPE_TYPE_T aShape );
// Some geometric transforms, that must be rewritten for derived classes
/**
* Function Move
* move this object.
* @param aMoveVector - the move vector for this object.
* Move this object.
*
* @param aMoveVector the move vector for this object.
*/
virtual void Move( const wxPoint& aMoveVector )
{
@ -301,10 +287,10 @@ public:
}
/**
* Function Rotate
* Rotate this object.
* @param aRotCentre - the rotation point.
* @param aAngle - the rotation angle in 0.1 degree.
*
* @param aRotCentre the rotation point.
* @param aAngle the rotation angle in 0.1 degree.
*/
virtual void Rotate( const wxPoint& aRotCentre, double aAngle )
{
@ -317,10 +303,10 @@ public:
}
/**
* Function Flip
* Flip this object, i.e. change the board side for this object
* @param aCentre - the rotation point.
* @param aFlipLeftRight - mirror across Y axis instead of X (the default)
* Flip this object, i.e. change the board side for this object.
*
* @param aCentre the rotation point.
* @param aFlipLeftRight mirror across Y axis instead of X (the default).
*/
virtual void Flip( const wxPoint& aCentre, bool aFlipLeftRight )
{
@ -333,32 +319,30 @@ public:
}
/**
* Function GetBoard
* returns the BOARD in which this BOARD_ITEM resides, or NULL if none.
* Return the #BOARD in which this #BOARD_ITEM resides, or NULL if none.
*/
virtual BOARD* GetBoard() const;
/**
* Function GetLayerName
* returns the name of the PCB layer on which the item resides.
* Return the name of the PCB layer on which the item resides.
*
* @return wxString containing the layer name associated with this item.
* @return the layer name associated with this item.
*/
wxString GetLayerName() const;
virtual void ViewGetLayers( int aLayers[], int& aCount ) const override;
/**
* Function TransformShapeWithClearanceToPolygon
* Convert the item shape to a closed polygon
* Used in filling zones calculations
* Circles and arcs are approximated by segments
* @param aCornerBuffer = a buffer to store the polygon
* @param aClearanceValue = the clearance around the pad
* @param aError = the maximum deviation from true circle
* @param aErrorLoc = should the approximation error be placed outside or inside the polygon?
* @param ignoreLineWidth = used for edge cut items where the line width is only
* for visualization
* Convert the item shape to a closed polygon.
*
* Used in filling zones calculations. Circles and arcs are approximated by segments.
*
* @param aCornerBuffer a buffer to store the polygon.
* @param aClearanceValue the clearance around the pad.
* @param aError the maximum deviation from true circle.
* @param aErrorLoc should the approximation error be placed outside or inside the polygon?
* @param ignoreLineWidth used for edge cut items where the line width is only
* for visualization.
*/
virtual void TransformShapeWithClearanceToPolygon( SHAPE_POLY_SET& aCornerBuffer,
PCB_LAYER_ID aLayer, int aClearanceValue,
@ -376,6 +360,9 @@ protected:
* because layer names are customizable.
*/
virtual wxString layerMaskDescribe() const;
PCB_LAYER_ID m_layer;
PCB_GROUP* m_group;
};
#ifndef SWIG
@ -385,6 +372,7 @@ DECLARE_ENUM_TO_WXANY( PCB_LAYER_ID );
/**
* A singleton item of this class is returned for a weak reference that no longer exists.
*
* Its sole purpose is to flag the item as having been deleted.
*/
class DELETED_BOARD_ITEM : public BOARD_ITEM

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2018 CERN
* Author: Maciej Suminski <maciej.suminski@cern.ch>
*
@ -62,10 +62,10 @@ struct BOARD_PRINTOUT_SETTINGS : public PRINTOUT_SETTINGS
void Save( APP_SETTINGS_BASE* aConfig ) override;
};
/**
* BOARD_PRINTOUT
* is a class derived from wxPrintout to handle the necessary information to control a printer
* when printing a board
* An object derived from wxPrintout to handle the necessary information to control a printer
* when printing a board.
*/
class BOARD_PRINTOUT : public wxPrintout
{
@ -84,11 +84,13 @@ public:
/**
* Print a page (or a set of pages).
* Note: this function prepare print parameters for the function
* which actually print the draw layers.
* @param aLayerName = a text which can be printed as layer name
* @param aPageNum = the number of the current page (only used to print this value)
* @param aPageCount = the number of pages to ptint (only used to print this value)
*
* @note This function prepares the print parameters for the function which actually prints
* the draw layers.
*
* @param aLayerName a text which can be printed as layer name.
* @param aPageNum the number of the current page (only used to print this value).
* @param aPageCount the number of pages to ptint (only used to print this value).
*/
virtual void DrawPage( const wxString& aLayerName = wxEmptyString,
int aPageNum = 1, int aPageCount = 1 );

View File

@ -77,7 +77,7 @@ public:
* If \p aParentWindow is not an EDA frame, a search through all the parents
* of the parent window will be done to find the frame.
*
* @param aParentWindow is the window immeidately containing this panel
* @param aParentWindow is the window immediately containing this panel
*/
EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId,
const wxPoint& aPosition, const wxSize& aSize,
@ -88,36 +88,35 @@ public:
virtual void SetFocus() override;
/**
* Function SwitchBackend
* Switches method of rendering graphics.
* Switch method of rendering graphics.
*
* @param aGalType is a type of rendering engine that you want to use.
*/
virtual bool SwitchBackend( GAL_TYPE aGalType );
/**
* Function GetBackend
* Returns the type of backend currently used by GAL canvas.
* Return the type of backend currently used by GAL canvas.
*/
inline GAL_TYPE GetBackend() const { return m_backend; }
/**
* Function GetGAL()
* Returns a pointer to the GAL instance used in the panel.
* Return a pointer to the GAL instance used in the panel.
*
* @return The instance of GAL.
*/
KIGFX::GAL* GetGAL() const { return m_gal; }
/**
* Function GetView()
* Returns a pointer to the VIEW instance used in the panel.
* @return The instance of VIEW.
* Return a pointer to the #VIEW instance used in the panel.
*
* @return The instance of #VIEW.
*/
virtual KIGFX::VIEW* GetView() const { return m_view; }
/**
* Function GetViewControls()
* Returns a pointer to the VIEW_CONTROLS instance used in the panel.
* @return The instance of VIEW_CONTROLS.
* Return a pointer to the #VIEW_CONTROLS instance used in the panel.
*
* @return The instance of #VIEW_CONTROLS.
*/
KIGFX::VIEW_CONTROLS* GetViewControls() const
{
@ -128,42 +127,38 @@ public:
virtual void Refresh( bool aEraseBackground = true, const wxRect* aRect = NULL ) override;
/**
* Function ForceRefresh()
* Forces a redraw.
* Force a redraw.
*/
void ForceRefresh();
/**
* Function SetEventDispatcher()
* Sets a dispatcher that processes events and forwards them to tools.
* Set a dispatcher that processes events and forwards them to tools.
*
* #DRAW_PANEL_GAL does not take over the ownership. Passing NULL disconnects all event
* handlers from the #DRAW_PANEL_GAL and parent frame.
*
* @param aEventDispatcher is the object that will be used for dispatching events.
* DRAW_PANEL_GAL does not take over the ownership. Passing NULL disconnects all event
* handlers from the DRAW_PANEL_GAL and parent frame.
*/
void SetEventDispatcher( TOOL_DISPATCHER* aEventDispatcher );
/**
* Function StartDrawing()
* Begins drawing if it was stopped previously.
* Begin drawing if it was stopped previously.
*/
void StartDrawing();
/**
* Function StopDrawing()
* Prevents the GAL canvas from further drawing till it is recreated
* or StartDrawing() is called.
* Prevent the GAL canvas from further drawing until it is recreated or #StartDrawing()
* is called.
*/
void StopDrawing();
/**
* Function SetHighContrastLayer
* Takes care of display settings for the given layer to be displayed in high contrast mode.
* Take care of display settings for the given layer to be displayed in high contrast mode.
*/
virtual void SetHighContrastLayer( int aLayer );
/**
* Function SetTopLayer
* Moves the selected layer to the top, so it is displayed above all others.
* Move the selected layer to the top, so it is displayed above all others.
*/
virtual void SetTopLayer( int aLayer );
@ -173,37 +168,35 @@ public:
}
/**
* Function GetParentEDAFrame()
* Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.
* Returns parent #EDA_DRAW_FRAME, if available or NULL otherwise.
*/
EDA_DRAW_FRAME* GetParentEDAFrame() const { return m_edaFrame; }
bool IsDialogPreview() const { return m_parent != (wxWindow*) m_edaFrame; }
/**
* Function OnShow()
* Called when the window is shown for the first time.
*/
virtual void OnShow() {}
/**
* Set whether focus is taken on certain events (mouseover, keys, etc). This should
* be true (and is by default) for any primary canvas, but can be false to make
* well-behaved preview panes and the like.
* Set whether focus is taken on certain events (mouseover, keys, etc).
*
* This should be true (and is by default) for any primary canvas, but can be false to make
* well behaved preview panes and the like.
*/
void SetStealsFocus( bool aStealsFocus ) { m_stealsFocus = aStealsFocus; }
/**
* Function SetCurrentCursor
* Set the current cursor shape for this panel
* Set the current cursor shape for this panel.
*/
void SetCurrentCursor( KICURSOR cursor );
/**
* Returns the bounding box of the view that should be used if model is not valid
* Return the bounding box of the view that should be used if model is not valid.
* For example, the worksheet bounding box for an empty PCB
*
* @return the default bounding box for the panel
* @return the default bounding box for the panel.
*/
virtual BOX2I GetDefaultViewBBox() const { return BOX2I(); }
@ -214,25 +207,25 @@ public:
/**
* Repaint the canvas, and fix scrollbar cursors
* Usually called by a OnPaint event, but because it do not use a wxPaintDC,
* it can be called outside a wxPaintEvent.
*
* Usually called by a OnPaint event.
*
* Because it does not use a wxPaintDC, it can be called outside a wxPaintEvent.
*/
void DoRePaint();
/**
* Creates an overlay for rendering debug graphics.
* Create an overlay for rendering debug graphics.
*/
std::shared_ptr<KIGFX::VIEW_OVERLAY> DebugOverlay();
/**
* Clears the contents of the debug overlay and removes it from the VIEW.
* Clear the contents of the debug overlay and removes it from the VIEW.
*/
void ClearDebugOverlay();
protected:
virtual void onPaint( wxPaintEvent& WXUNUSED( aEvent ) );
void onSize( wxSizeEvent& aEvent );
void onEnter( wxMouseEvent& aEvent );

View File

@ -40,45 +40,29 @@ class EDA_ITEM;
/**
* COLLECTOR
* is an abstract class that will find and hold all the objects according to
* An abstract class that will find and hold all the objects according to
* an inspection done by the Inspect() function which must be implemented by
* any derived class. When Inspect() finds an object that it wants to collect,
* i.e. one that it "likes", then it only has to do an Append( testItem )
* on it to add it to its collection, but in all cases for the scan to continue,
* Inspect() must return SEARCH_CONTINUE.
* any derived class.
*
* Later, after collection, the user can iterate through all the objects
* in the remembered collection using GetCount() and the [int] operator.
* When Inspect() finds an object that it wants to collect, i.e. one that it "likes", then
* it only has to do an Append( testItem )on it to add it to its collection, but in all cases
* for the scan to continue, Inspect() must return SEARCH_CONTINUE. Later, after collection,
* the user can iterate through all the objects in the remembered collection using GetCount()
* and the [int] operator.
*/
class COLLECTOR
{
protected:
std::vector<EDA_ITEM*> m_list; // Primary list of most likely items
std::vector<EDA_ITEM*> m_backupList; // Secondary list with items removed by heuristics
const KICAD_T* m_scanTypes;
INSPECTOR_FUNC m_inspector;
wxPoint m_refPos; // Reference position used to generate the collection.
EDA_RECT m_refBox; // Selection rectangle used to generate the collection.
public:
int m_Threshold; // Hit-test threshold in internal units.
wxString m_MenuTitle; // The title of selection disambiguation menu (if needed)
bool m_MenuCancelled; // Indicates selection disambiguation menu was cancelled
public:
COLLECTOR() :
m_Threshold( 0 ),
m_MenuCancelled( false ),
m_scanTypes( 0 ),
// Inspect() is virtual so calling it from a class common inspector preserves
// polymorphism.
m_inspector( [=]( EDA_ITEM* aItem, void* aTestData )
{
return this->Inspect( aItem, aTestData );
} ),
m_Threshold( 0 ),
m_MenuCancelled( false )
} )
{
}
@ -98,8 +82,7 @@ public:
CITER end() const { return m_list.cend(); }
/**
* Function GetCount
* returns the number of objects in the list
* Return the number of objects in the list.
*/
int GetCount() const
{
@ -107,8 +90,7 @@ public:
}
/**
* Function Empty
* sets the list to empty
* Clear the list.
*/
void Empty()
{
@ -116,8 +98,8 @@ public:
}
/**
* Function Append
* adds an item to the end of the list.
* Add an item to the end of the list.
*
* @param item An EDA_ITEM* to add.
*/
void Append( EDA_ITEM* item )
@ -126,8 +108,8 @@ public:
}
/**
* Function Remove
* removes the item at \a aIndex (first position is 0);
* Remove the item at \a aIndex (first position is 0).
*
* @param aIndex The index into the list.
*/
void Remove( int aIndex )
@ -136,8 +118,8 @@ public:
}
/**
* Function Remove
* removes the item aItem (if exists in the collector).
* Remove the item aItem (if exists in the collector).
*
* @param aItem the item to be removed.
*/
void Remove( const EDA_ITEM* aItem )
@ -151,8 +133,9 @@ public:
}
/**
* Test if the collector has heuristic backup items
* @return true if Combine() can run to bring secondary items into the list
* Test if the collector has heuristic backup items.
*
* @return true if Combine() can run to bring secondary items into the list.
*/
bool HasAdditionalItems()
{
@ -160,7 +143,7 @@ public:
}
/**
* Re-combines the backup list into the main list of the collector
* Re-combine the backup list into the main list of the collector.
*/
void Combine()
{
@ -169,7 +152,8 @@ public:
}
/**
* Moves the item at \a aIndex (first position is 0) to the backup list
* Move the item at \a aIndex (first position is 0) to the backup list.
*
* @param aIndex The index into the list.
*/
void Transfer( int aIndex )
@ -179,7 +163,8 @@ public:
}
/**
* Moves the item aItem (if exists in the collector) to the backup list
* Move \a aItem (if exists in the collector) to the backup list.
*
* @param aItem the item to be moved.
*/
void Transfer( EDA_ITEM* aItem )
@ -196,22 +181,21 @@ public:
}
/**
* Function operator[int]
* is used for read only access and returns the object at \a aIndex.
* Used for read only access and returns the object at \a aIndex.
*
* @param aIndex The index into the list.
* @return EDA_ITEM* - or something derived from it, or NULL.
* @return the object at \a aIndex something derived from it or NULL.
*/
virtual EDA_ITEM* operator[]( int aIndex ) const
{
if( (unsigned)aIndex < (unsigned)GetCount() ) // (unsigned) excludes aIndex<0 also
return m_list[ aIndex ];
return NULL;
return nullptr;
}
/**
* Function HasItem
* tests if \a aItem has already been collected.
* Tests if \a aItem has already been collected.
*
* @param aItem The EDA_ITEM* to be tested.
* @return True if \a aItem is already collected.
@ -228,9 +212,8 @@ public:
}
/**
* Function SetScanTypes
* records the list of KICAD_T types to consider for collection by
* the Inspect() function.
* Record the list of #KICAD_T types to consider for collection by the Inspect() function.
*
* @param scanTypes An array of KICAD_T, terminated by EOT. No copy is
* is made of this array (so cannot come from caller's stack).
*/
@ -244,21 +227,37 @@ public:
const EDA_RECT& GetBoundingBox() const { return m_refBox; }
/**
* Function CountType
* counts the number of items matching aType
* @param aType type we are interested in
* @return number of occurences
* Count the number of items matching \a aType.
*
* @param aType type we are interested in.
* @return number of occurrences.
*/
int CountType( KICAD_T aType )
{
int cnt = 0;
for( size_t i = 0; i < m_list.size(); i++ )
{
if( m_list[i]->Type() == aType )
cnt++;
}
return cnt;
}
int m_Threshold; // Hit-test threshold in internal units.
wxString m_MenuTitle; // The title of selection disambiguation menu (if needed)
bool m_MenuCancelled; // Indicates selection disambiguation menu was canceled
protected:
std::vector<EDA_ITEM*> m_list; // Primary list of most likely items
std::vector<EDA_ITEM*> m_backupList; // Secondary list with items removed by heuristics
const KICAD_T* m_scanTypes;
INSPECTOR_FUNC m_inspector;
wxPoint m_refPos; // Reference position used to generate the collection.
EDA_RECT m_refBox; // Selection rectangle used to generate the collection.};
};
#endif // COLLECTOR_H

View File

@ -2,6 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright 2016-2017 CERN
* Copyright (C) 2020 KiCad Developers, see change_log.txt for contributors.
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
@ -60,10 +61,8 @@ CHANGE_TYPE operator&( CHANGE_TYPE aTypeA, T aTypeB )
/**
* COMMIT
*
* Represents a set of changes (additions, deletions or modifications)
* of a data model (e.g. the BOARD) class.
* Represent a set of changes (additions, deletions or modifications) of a data model
* (e.g. the BOARD) class.
*
* The class can be used to propagate changes to subscribed objects (e.g. views, ratsnest),
* and automatically create undo/redo points.
@ -113,6 +112,7 @@ public:
}
template<class Range>
COMMIT& StageItems( const Range& aRange, CHANGE_TYPE aChangeType )
{
for( const auto& item : aRange )
@ -121,19 +121,19 @@ public:
return *this;
}
///> Adds a change of the item aItem of type aChangeType to the change list.
virtual COMMIT& Stage( EDA_ITEM* aItem, CHANGE_TYPE aChangeType );
virtual COMMIT& Stage( std::vector<EDA_ITEM*>& container, CHANGE_TYPE aChangeType );
virtual COMMIT& Stage( const PICKED_ITEMS_LIST& aItems, UNDO_REDO aModFlag = UNDO_REDO::UNSPECIFIED );
virtual COMMIT& Stage( const PICKED_ITEMS_LIST& aItems,
UNDO_REDO aModFlag = UNDO_REDO::UNSPECIFIED );
///> Executes the changes.
virtual void Push( const wxString& aMessage = wxT( "A commit" ),
bool aCreateUndoEntry = true, bool aSetDirtyBit = true ) = 0;
///> Revertes the commit by restoring the modifed items state.
///> Revert the commit by restoring the modified items state.
virtual void Revert() = 0;
bool Empty() const
@ -161,10 +161,11 @@ protected:
COMMIT& createModified( EDA_ITEM* aItem, EDA_ITEM* aCopy, int aExtraFlags = 0 );
virtual void makeEntry( EDA_ITEM* aItem, CHANGE_TYPE aType, EDA_ITEM* aCopy = NULL );
virtual void makeEntry( EDA_ITEM* aItem, CHANGE_TYPE aType, EDA_ITEM* aCopy = nullptr );
/**
* Searches for an entry describing change for a particular item
* Search for an entry describing change for a particular item.
*
* @return null if there is no related entry.
*/
COMMIT_LINE* findEntry( EDA_ITEM* aItem );

View File

@ -56,16 +56,14 @@ class REPORTER;
/**
* Run a command in a child process.
*
* @param aCommandLine The process and any arguments to it all in a single
* string.
* @param aCommandLine The process and any arguments to it all in a single string.
* @param aFlags The same args as allowed for wxExecute()
* @param callback wxProcess implementing OnTerminate to be run when the
child process finishes
* @return int - pid of process, 0 in case of error (like return values of
* wxExecute())
* @return pid of process, 0 in case of error (like return values of wxExecute()).
*/
int ProcessExecute( const wxString& aCommandLine, int aFlags = wxEXEC_ASYNC,
wxProcess *callback = NULL );
wxProcess *callback = nullptr );
/**
* Return the help file's full path.
@ -99,13 +97,13 @@ wxString SearchHelpFileFullPath( const SEARCH_STACK& aSearchStack, const wxStrin
*/
bool EnsureFileDirectoryExists( wxFileName* aTargetFullFileName,
const wxString& aBaseFilename,
REPORTER* aReporter = NULL );
REPORTER* aReporter = nullptr );
/**
* Replace any environment variable & text variable references with their values.
*
* @param aString = a string containing (perhaps) references to env var
* @return a string where env var are replaced by their value
* @param aString a string containing (perhaps) references to env var
* @return the expanded environment variable.
*/
const wxString ExpandEnvVarSubstitutions( const wxString& aString, PROJECT* aProject );
@ -128,19 +126,18 @@ const wxString ResolveUriByEnvVars( const wxString& aUri, PROJECT* aProject );
#ifdef __WXMAC__
/**
* OSX specific function GetOSXKicadUserDataDir
* @return A wxString pointing to the user data directory for Kicad
*
* @return The macOS specific user data directory for KiCad.
*/
wxString GetOSXKicadUserDataDir();
/**
* OSX specific function GetOSXMachineDataDir
* @return A wxString pointing to the machine data directory for Kicad
* @return The macOS specific machine data directory for KiCad
*/
wxString GetOSXKicadMachineDataDir();
/**
* OSX specific function GetOSXKicadDataDir
* @return A wxString pointing to the bundle data directory for Kicad
* @return The macOS specific bundle data directory for KiCad
*/
wxString GetOSXKicadDataDir();
#endif
@ -180,16 +177,14 @@ namespace std
/**
* Helper function to print the given wxSize to a stream.
*
* Used for debugging functions like EDA_ITEM::Show and also in unit
* testing fixtures.
* Used for debugging functions like EDA_ITEM::Show and also in unit testing fixtures.
*/
std::ostream& operator<<( std::ostream& out, const wxSize& size );
/**
* Helper function to print the given wxPoint to a stream.
*
* Used for debugging functions like EDA_ITEM::Show and also in unit
* testing fixtures.
* Used for debugging functions like EDA_ITEM::Show and also in unit testing fixtures.
*/
std::ostream& operator<<( std::ostream& out, const wxPoint& pt );

View File

@ -37,18 +37,15 @@
using KIGFX::COLOR4D;
/*
* NOTE: Everything in this file is deprecated, it only remains because advanced_config depends on
* it for the moment.
*/
/**
* Function ConfigBaseWriteDouble
* This is a helper function to write doubles in config
* We cannot use wxConfigBase->Write for a double, because
* this function uses a format with very few digits in mantissa,
* and truncation issues are frequent.
* We use here a better floating format.
* A helper function to write doubles in configuration file.
*
* We cannot use wxConfigBase->Write for a double, because this function uses a format with
* very few digits in mantissa and truncation issues are frequent. We use here a better
* floating format.
*
* @note Everything in this file is deprecated, it only remains because advanced_config depends on
* it for the moment.
*/
void ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double aValue );
@ -74,17 +71,34 @@ enum paramcfg_id {
/**
* PARAM_CFG
* is a base class which establishes the interface functions ReadParam and SaveParam,
* A base class which establishes the interface functions ReadParam and SaveParam,
* which are implemented by a number of derived classes, and these function's
* doxygen comments are inherited also.
* <p>
*
* See kicad.odt or kicad.pdf, chapter 2 :
* "Installation and configuration/Initialization of the default config".
*/
class PARAM_CFG
{
public:
PARAM_CFG( const wxString& ident, const paramcfg_id type, const wxChar* group = nullptr,
const wxString& legacy_ident = wxEmptyString );
virtual ~PARAM_CFG() {}
/**
* Read the value of the parameter stored in \a aConfig.
*
* @param aConfig the wxConfigBase that holds the parameter.
*/
virtual void ReadParam( wxConfigBase* aConfig ) const {};
/**
* Save the value of the parameter stored in \a aConfig.
*
* @param aConfig the wxConfigBase that can store the parameter.
*/
virtual void SaveParam( wxConfigBase* aConfig ) const {};
wxString m_Ident; ///< Keyword in config data
paramcfg_id m_Type; ///< Type of parameter
wxString m_Group; ///< Group name (this is like a path in the config data)
@ -93,39 +107,14 @@ public:
// If the m_Ident keyword isn't found, fall back and read values from m_Ident_legacy.
// Note that values are always written to the current, non-legacy keyword.
wxString m_Ident_legacy;
public:
PARAM_CFG( const wxString& ident, const paramcfg_id type, const wxChar* group = NULL,
const wxString& legacy_ident = wxEmptyString );
virtual ~PARAM_CFG() {}
/**
* Function ReadParam
* reads the value of the parameter stored in aConfig
* @param aConfig = the wxConfigBase that holds the parameter
*/
virtual void ReadParam( wxConfigBase* aConfig ) const {};
/**
* Function SaveParam
* saves the value of the parameter stored in aConfig
* @param aConfig = the wxConfigBase that can store the parameter
*/
virtual void SaveParam( wxConfigBase* aConfig ) const {};
};
/**
* Configuration parameter - Integer Class
*
* Configuration object for integers.
*/
class PARAM_CFG_INT : public PARAM_CFG
{
public:
int* m_Pt_param; ///< Pointer to the parameter value
int m_Min, m_Max; ///< Minimum and maximum values of the param type
int m_Default; ///< The default value of the parameter
public:
PARAM_CFG_INT( const wxString& ident, int* ptparam, int default_val = 0,
int min = std::numeric_limits<int>::min(),
@ -140,147 +129,142 @@ public:
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
int* m_Pt_param; ///< Pointer to the parameter value
int m_Min, m_Max; ///< Minimum and maximum values of the param type
int m_Default; ///< The default value of the parameter
};
/**
* Configuration parameter - Integer Class
* with unit conversion.
* Mainly used to store an integer value in millimeters (or inches)
* and retrieve it in internal units
* the stored value is a floating number
* Configuration for integers with unit conversion.
*
* Mainly used to store an integer value in millimeters (or inches) and retrieve it in
* internal units. The stored value is a floating number.
*/
class PARAM_CFG_INT_WITH_SCALE : public PARAM_CFG_INT
{
public:
double m_BIU_to_cfgunit; ///< the factor to convert the saved value in internal value
public:
PARAM_CFG_INT_WITH_SCALE( const wxString& ident, int* ptparam, int default_val = 0,
int min = std::numeric_limits<int>::min(),
int max = std::numeric_limits<int>::max(),
const wxChar* group = NULL, double aBiu2cfgunit = 1.0,
const wxChar* group = nullptr, double aBiu2cfgunit = 1.0,
const wxString& legacy_ident = wxEmptyString );
PARAM_CFG_INT_WITH_SCALE( bool insetup, const wxString& ident, int* ptparam,
int default_val = 0,
int min = std::numeric_limits<int>::min(),
int max = std::numeric_limits<int>::max(),
const wxChar* group = NULL, double aBiu2cfgunit = 1.0,
const wxChar* group = nullptr, double aBiu2cfgunit = 1.0,
const wxString& legacy_ident = wxEmptyString );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
public:
double m_BIU_to_cfgunit; ///< the factor to convert the saved value in internal value
};
/**
* Configuration parameter - Double Precision Class
*
* Configuration object for double precision floating point numbers.
*/
class PARAM_CFG_DOUBLE : public PARAM_CFG
{
public:
double* m_Pt_param; ///< Pointer to the parameter value
double m_Default; ///< The default value of the parameter
double m_Min, m_Max; ///< Minimum and maximum values of the param type
public:
PARAM_CFG_DOUBLE( const wxString& ident, double* ptparam,
double default_val = 0.0, double min = 0.0, double max = 10000.0,
const wxChar* group = NULL );
const wxChar* group = nullptr );
PARAM_CFG_DOUBLE( bool Insetup, const wxString& ident, double* ptparam,
double default_val = 0.0, double min = 0.0, double max = 10000.0,
const wxChar* group = NULL );
const wxChar* group = nullptr );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
double* m_Pt_param; ///< Pointer to the parameter value
double m_Default; ///< The default value of the parameter
double m_Min, m_Max; ///< Minimum and maximum values of the param type
};
/**
* Configuration parameter - Boolean Class
*
* Configuration object for booleans.
*/
class PARAM_CFG_BOOL : public PARAM_CFG
{
public:
bool* m_Pt_param; ///< Pointer to the parameter value
int m_Default; ///< The default value of the parameter
public:
PARAM_CFG_BOOL( const wxString& ident, bool* ptparam,
int default_val = false, const wxChar* group = NULL,
int default_val = false, const wxChar* group = nullptr,
const wxString& legacy_ident = wxEmptyString );
PARAM_CFG_BOOL( bool Insetup, const wxString& ident, bool* ptparam,
int default_val = false, const wxChar* group = NULL,
int default_val = false, const wxChar* group = nullptr,
const wxString& legacy_ident = wxEmptyString );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
bool* m_Pt_param; ///< Pointer to the parameter value
int m_Default; ///< The default value of the parameter
};
/**
* Configuration parameter - wxString Class
*
* Configuration object for wxString objects.
*/
class PARAM_CFG_WXSTRING : public PARAM_CFG
{
public:
wxString* m_Pt_param; ///< Pointer to the parameter value
wxString m_default; ///< The default value of the parameter
public:
PARAM_CFG_WXSTRING( const wxString& ident, wxString* ptparam, const wxChar* group = NULL );
PARAM_CFG_WXSTRING( const wxString& ident, wxString* ptparam, const wxChar* group = nullptr );
PARAM_CFG_WXSTRING( bool Insetup,
const wxString& ident,
wxString* ptparam,
const wxString& default_val = wxEmptyString,
const wxChar* group = NULL );
const wxChar* group = nullptr );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
wxString* m_Pt_param; ///< Pointer to the parameter value
wxString m_default; ///< The default value of the parameter
};
/**
* Configuration parameter - std::set<wxString>
* Configuration object for a set of wxString objects.
*
*/
class PARAM_CFG_WXSTRING_SET : public PARAM_CFG
{
public:
std::set<wxString>* m_Pt_param; ///< Pointer to the parameter value
public:
PARAM_CFG_WXSTRING_SET( const wxString& ident, std::set<wxString>* ptparam, const wxChar* group = NULL );
PARAM_CFG_WXSTRING_SET( const wxString& ident, std::set<wxString>* ptparam,
const wxChar* group = nullptr );
PARAM_CFG_WXSTRING_SET( bool Insetup,
const wxString& ident,
std::set<wxString>* ptparam,
const wxChar* group = NULL );
const wxChar* group = nullptr );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
std::set<wxString>* m_Pt_param; ///< Pointer to the parameter value
};
/**
* Configuration parameter - PARAM_CFG_FILENAME Class
* Same as PARAM_CFG_WXSTRING, but stores "\" as "/".
* and replace "/" by "\" under Windows.
* Used to store paths and filenames in config files
* Configuration object for a file name object.
*
* Same as #PARAM_CFG_WXSTRING but stores "\" as "/" and replace "/" by "\" under Windows.
*/
class PARAM_CFG_FILENAME : public PARAM_CFG
{
public:
wxString* m_Pt_param; ///< Pointer to the parameter value
public:
PARAM_CFG_FILENAME( const wxString& ident, wxString* ptparam,
const wxChar* group = NULL );
const wxChar* group = nullptr );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
wxString* m_Pt_param; ///< Pointer to the parameter value
};
@ -290,9 +274,8 @@ public:
wxArrayString* m_Pt_param; ///< Pointer to the parameter value
public:
PARAM_CFG_LIBNAME_LIST( const wxChar* ident,
wxArrayString* ptparam,
const wxChar* group = NULL );
PARAM_CFG_LIBNAME_LIST( const wxChar* ident, wxArrayString* ptparam,
const wxChar* group = nullptr );
virtual void ReadParam( wxConfigBase* aConfig ) const override;
virtual void SaveParam( wxConfigBase* aConfig ) const override;
@ -300,22 +283,21 @@ public:
/**
* Function wxConfigSaveSetups
* writes @a aList of PARAM_CFG to save configuration values to @a aCfg.
* Writes @a aList of #PARAM_CFG objects to @a aCfg.
*
* Only elements with m_Setup set true will be saved, hence the function name.
*
* @param aCfg where to save
* @param aList holds some configuration parameters, not all of which will
* necessarily be saved.
* @param aCfg where to save.
* @param aList holds some configuration parameters, not all of which will necessarily be saved.
*/
void wxConfigSaveSetups( wxConfigBase* aCfg, const std::vector<PARAM_CFG*>& aList );
/**
* Function wxConfigSaveParams
* writes @a aList of PARAM_CFG to save configuration values to @a aCfg.
* Write @a aList of #PARAM_CFG objects @a aCfg.
*
* Only elements with m_Setup set false will be saved, hence the function name.
*
* @param aCfg where to save
* @param aCfg where to save.
* @param aList holds some configuration parameters, not all of which will necessarily be saved.
* @param aGroup indicates in which group the value should be saved, unless the PARAM_CFG provides
* its own group, in which case it will take precedence. aGroup may be empty.
@ -324,8 +306,8 @@ void wxConfigSaveParams( wxConfigBase* aCfg, const std::vector<PARAM_CFG*>& aLis
const wxString& aGroup );
/**
* Function wxConfigLoadSetups
* uses @a aList of PARAM_CFG to load configuration values from @a aCfg.
* Use @a aList of #PARAM_CFG object to load configuration values from @a aCfg.
*
* Only elements whose m_Setup field is true will be loaded.
*
* @param aCfg where to load from.
@ -334,8 +316,7 @@ void wxConfigSaveParams( wxConfigBase* aCfg, const std::vector<PARAM_CFG*>& aLis
void wxConfigLoadSetups( wxConfigBase* aCfg, const std::vector<PARAM_CFG*>& aList );
/**
* Function wxConfigLoadParams
* uses @a aList of PARAM_CFG to load configuration values from @a aCfg.
* Use @a aList of #PARAM_CFG objects to load configuration values from @a aCfg.
* Only elements whose m_Setup field is false will be loaded.
*
* @param aCfg where to load from.

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2010 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -40,12 +40,10 @@ void ConvertMarkdown2Html( const wxString& aMarkdownInput, wxString& aHtmlOutput
class EDA_DRAW_FRAME;
/**
* EDA_LIST_DIALOG
*
* A dialog which shows:
* a list of elements for selection,
* a text control to display help or info about the selected item.
* 2 buttons (OK and Cancel)
* - a list of elements for selection,
* - a text control to display help or info about the selected item.
* - 2 buttons (OK and Cancel)
*
*/
class EDA_LIST_DIALOG : public EDA_LIST_DIALOG_BASE
@ -53,20 +51,17 @@ class EDA_LIST_DIALOG : public EDA_LIST_DIALOG_BASE
public:
/**
* Constructor:
* @param aParent Pointer to the parent window.
* @param aTitle = The title shown on top.
* @param aTitle The title shown on top.
* @param aItemHeaders an optional array containing the column header names for the dialog.
* @param aItemList = A wxArrayString of the list of elements.
* @param aRefText = An item name if an item must be preselected.
* @param aItemList A wxArrayString of the list of elements.
* @param aRefText An item name if an item must be preselected.
*/
EDA_LIST_DIALOG( EDA_DRAW_FRAME* aParent, const wxString& aTitle,
const wxArrayString& aItemHeaders,
const std::vector<wxArrayString>& aItemList,
const wxString& aRefText );
// ~EDA_LIST_DIALOG() {}
void SetListLabel( const wxString& aLabel );
void SetOKLabel( const wxString& aLabel );
@ -74,11 +69,10 @@ public:
void InsertItems( const std::vector<wxArrayString>& aItemList, int aPosition = 0 );
/**
* Function GetTextSelection
* return the selected text from \a aColumn in the wxListCtrl in the dialog.
* Return the selected text from \a aColumn in the wxListCtrl in the dialog.
*
* @param aColumn is the column to return the text from.
* @return a wxString object containing the selected text from \a aColumn.
* @return the selected text from \a aColumn.
*/
wxString GetTextSelection( int aColumn = 0 );
@ -94,21 +88,11 @@ private:
};
/**************************************************************************/
/* Class to edit/enter a coordinate (pair of values) ( INCHES or MM ) in */
/* dialog boxes, */
/**************************************************************************/
/**
* Object to edit/enter a coordinate (pair of values) ( INCHES or MM ) in dialog boxes.
*/
class EDA_POSITION_CTRL
{
public:
EDA_UNITS m_UserUnit;
wxTextCtrl* m_FramePosX;
wxTextCtrl* m_FramePosY;
private:
wxStaticText* m_TextX, * m_TextY;
public:
EDA_POSITION_CTRL( wxWindow* parent, const wxString& title, const wxPoint& pos_to_edit,
EDA_UNITS user_unit, wxBoxSizer* BoxSizer );
@ -118,13 +102,21 @@ public:
void Enable( bool x_win_on, bool y_win_on );
void SetValue( int x_value, int y_value );
wxPoint GetValue() const;
EDA_UNITS m_UserUnit;
wxTextCtrl* m_FramePosX;
wxTextCtrl* m_FramePosY;
private:
wxStaticText* m_TextX;
wxStaticText* m_TextY;
};
/*************************************************************
* Class to edit/enter a size (pair of values for X and Y size)
* ( INCHES or MM ) in dialog boxes
***************************************************************/
/**
* Object to edit/enter a size (pair of values for X and Y size ( INCHES or MM ) in dialog boxes.
*/
class EDA_SIZE_CTRL : public EDA_POSITION_CTRL
{
public:
@ -132,9 +124,9 @@ public:
EDA_UNITS user_unit, wxBoxSizer* BoxSizer );
~EDA_SIZE_CTRL() { }
wxSize GetValue() const;
};
#endif // DIALOG_HELPERS_H_

View File

@ -82,23 +82,7 @@ class WX_EVENT_LOOP;
*/
class DIALOG_SHIM : public wxDialog, public KIWAY_HOLDER
{
/**
* Properly handle the wxCloseEvent when in the quasimodal mode when not calling
* EndQuasiModal which is possible with any dialog derived from #DIALOG_SHIM.
*/
void OnCloseWindow( wxCloseEvent& aEvent );
/**
* Properly handle the default button events when in the quasimodal mode when not
* calling EndQuasiModal which is possible with any dialog derived from #DIALOG_SHIM.
*/
void OnButton( wxCommandEvent& aEvent );
protected:
virtual void OnCharHook( wxKeyEvent& aEvt );
public:
DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
@ -146,7 +130,6 @@ public:
}
protected:
/**
* In all dialogs, we must call the same functions to fix minimal dlg size, the default
* position and perhaps some others to fix a few issues depending on Windows Managers
@ -187,6 +170,27 @@ protected:
*/
void resetSize();
virtual void OnCharHook( wxKeyEvent& aEvt );
private:
/**
* Properly handle the wxCloseEvent when in the quasimodal mode when not calling
* EndQuasiModal which is possible with any dialog derived from #DIALOG_SHIM.
*/
void OnCloseWindow( wxCloseEvent& aEvent );
/**
* Properly handle the default button events when in the quasimodal mode when not
* calling EndQuasiModal which is possible with any dialog derived from #DIALOG_SHIM.
*/
void OnButton( wxCommandEvent& aEvent );
void OnGridEditorShown( wxGridEvent& event );
void OnGridEditorHidden( wxGridEvent& event );
DECLARE_EVENT_TABLE();
protected:
EDA_UNITS m_units; // userUnits for display and parsing
std::string m_hash_key; // alternate for class_map when classname re-used
@ -205,11 +209,6 @@ protected:
std::vector<wxWindow*> m_tabOrder;
private:
void OnGridEditorShown( wxGridEvent& event );
void OnGridEditorHidden( wxGridEvent& event );
DECLARE_EVENT_TABLE()
};
#endif // DIALOG_SHIM_

View File

@ -2,7 +2,7 @@
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2007-2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2007-2015 Kicad Developers, see change_log.txt for contributors.
* Copyright (C) 2007-2020 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -34,8 +34,7 @@
#ifndef SWIG
/**
* Struct KEYWORD
* holds a keyword string and its unique integer token.
* Hold a keyword string and its unique integer token.
*/
struct KEYWORD
{
@ -51,9 +50,9 @@ struct KEYWORD
/**
* Enum DSN_SYNTAX_T
* lists all the DSN lexer's tokens that are supported in lexing. It is up
* to the parser if it wants also to support them.
* List all the DSN lexer's tokens that are supported in lexing.
*
* It is up to the parser if it wants also to support them.
*/
enum DSN_SYNTAX_T
{
@ -72,47 +71,384 @@ enum DSN_SYNTAX_T
/**
* DSNLEXER
* implements a lexical analyzer for the SPECCTRA DSN file format. It
* reads lexical tokens from the current LINE_READER through the NextTok()
* function.
* Implement a lexical analyzer for the SPECCTRA DSN file format.
*
* It reads lexical tokens from the current #LINE_READER through the #NextTok() function.
*/
class DSNLEXER
{
public:
/**
* Initialize a DSN lexer and prepares to read from aFile which is already open and has
* \a aFilename.
*
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc.
* @param aKeywordCount is the count of tokens in aKeywordTable.
* @param aFile is an open file, which will be closed when this is destructed.
* @param aFileName is the name of the file
*/
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
FILE* aFile, const wxString& aFileName );
/**
* Initialize a DSN lexer and prepares to read from @a aSExpression.
*
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc.
* @param aKeywordCount is the count of tokens in aKeywordTable.
* @param aSExpression is text to feed through a STRING_LINE_READER
* @param aSource is a description of aSExpression, used for error reporting.
*/
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
const std::string& aSExpression, const wxString& aSource = wxEmptyString );
/**
* Initialize a DSN lexer and prepares to read from @a aSExpression.
*
* Use this one without a keyword table with the DOM parser in ptree.h.
*
* @param aSExpression is text to feed through a #STRING_LINE_READER
* @param aSource is a description of aSExpression, used for error reporting.
*/
DSNLEXER( const std::string& aSExpression, const wxString& aSource = wxEmptyString );
/**
* Initialize a DSN lexer and prepares to read from @a aLineReader which is already
* open, and may be in use by other DSNLEXERs also.
*
* No ownership is taken of @a aLineReader. This enables it to be used by other DSNLEXERs.
*
* @param aKeywordTable is an array of #KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc.
* @param aKeywordCount is the count of tokens in aKeywordTable.
* @param aLineReader is any subclassed instance of LINE_READER, such as
* #STRING_LINE_READER or #FILE_LINE_READER. No ownership is taken.
*/
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
LINE_READER* aLineReader = NULL );
virtual ~DSNLEXER();
/**
* Usable only for DSN lexers which share the same #LINE_READER.
*
* Synchronizes the pointers handling the data read by the #LINE_READER. Allows 2
* #DNSLEXER objects to share the same current line, when switching from a #DNSLEXER
* to another #DNSLEXER
* @param aLexer the model.
* @return true if the sync can be made ( at least the same line reader ).
*/
bool SyncLineReaderWith( DSNLEXER& aLexer );
/**
* Change the behavior of this lexer into or out of "specctra mode".
*
* If specctra mode, then:
* -#) stringDelimiter can be changed.
* -#) KiCad quoting protocol is not in effect.
* -#) space_in_quoted_tokens is functional else none of the above are true.
*
* The default mode is non-specctra mode, meaning:
* -#) stringDelimiter cannot be changed.
* -#) KiCad quoting protocol is in effect.
* -#) space_in_quoted_tokens is not functional.
*/
void SetSpecctraMode( bool aMode );
/**
* Manage a stack of LINE_READERs in order to handle nested file inclusion.
*
* This function pushes aLineReader onto the top of a stack of LINE_READERs and makes
* it the current #LINE_READER with its own #GetSource(), line number and line text.
* A grammar must be designed such that the "include" token (whatever its various names),
* and any of its parameters are not followed by anything on that same line,
* because PopReader always starts reading from a new line upon returning to
* the original #LINE_READER.
*/
void PushReader( LINE_READER* aLineReader );
/**
* Delete the top most #LINE_READER from an internal stack of LINE_READERs and
* in the case of #FILE_LINE_READER this means the associated FILE is closed.
*
* The most recently used former #LINE_READER on the stack becomes the
* current #LINE_READER and its previous position in its input stream and the
* its latest line number should pertain. PopReader always starts reading
* from a new line upon returning to the previous #LINE_READER. A pop is only
* possible if there are at least 2 #LINE_READERs on the stack, since popping
* the last one is not supported.
*
* @return the LINE_READER that was in use before the pop, or NULL
* if there was not at least two readers on the stack and therefore the
* pop failed.
*/
LINE_READER* PopReader();
/**
* Return the next token found in the input file or DSN_EOF when reaching the end of
* file.
*
* Users should wrap this function to return an enum to aid in grammar debugging while
* running under a debugger, but leave this lower level function returning an int (so
* the enum does not collide with another usage).
*
* @return the type of token found next.
* @throw IO_ERROR only if the #LINE_READER throws it.
*/
int NextTok();
/**
* Call #NextTok() and then verifies that the token read in satisfies #IsSymbol().
*
* @return the actual token read in.
* @throw IO_ERROR if the next token does not satisfy IsSymbol().
*/
int NeedSYMBOL();
/**
* Call #NextTok() and then verifies that the token read in satisfies bool IsSymbol() or
* the next token is #DSN_NUMBER.
*
* @return the actual token read in.
* @throw IO_ERROR if the next token does not satisfy the above test.
*/
int NeedSYMBOLorNUMBER();
/**
* Call #NextTok() and then verifies that the token read is type #DSN_NUMBER.
*
* @return the actual token read in.
* @throw IO_ERROR if the next token does not satisfy the above test.
*/
int NeedNUMBER( const char* aExpectation );
/**
* Return whatever #NextTok() returned the last time it was called.
*/
int CurTok() const
{
return curTok;
}
/**
* Return whatever NextTok() returned the 2nd to last time it was called.
*/
int PrevTok() const
{
return prevTok;
}
/**
* Used to support "loose" matches (quoted tokens).
*/
int GetCurStrAsToken() const
{
return findToken( curText );
}
/**
* Change the string delimiter from the default " to some other character and return
* the old value.
*
* @param aStringDelimiter The character in lowest 8 bits.
* @return The old delimiter in the lowest 8 bits.
*/
char SetStringDelimiter( char aStringDelimiter )
{
int old = stringDelimiter;
if( specctraMode )
stringDelimiter = aStringDelimiter;
return old;
}
/**
* Change the setting controlling whether a space in a quoted string isa terminator.
*
* @param val If true, means
*/
bool SetSpaceInQuotedTokens( bool val )
{
bool old = space_in_quoted_tokens;
if( specctraMode )
space_in_quoted_tokens = val;
return old;
}
/**
* Change the handling of comments.
*
* If set true, comments are returned as single line strings with a terminating newline.
* Otherwise they are consumed by the lexer and not returned.
*/
bool SetCommentsAreTokens( bool val )
{
bool old = commentsAreTokens;
commentsAreTokens = val;
return old;
}
/**
* Check the next sequence of tokens and reads them into a wxArrayString if they are
* comments.
*
* Reading continues until a non-comment token is encountered, and such last read token
* remains as #CurTok() and as #CurText(). No push back or "un get" mechanism is used
* for this support. Upon return you simply avoid calling NextTok() for the next token,
* but rather #CurTok().
*
* @return Heap allocated block of comments or NULL if none. The caller owns the
* allocation and must delete if not NULL.
*/
wxArrayString* ReadCommentLines();
/**
* Test a token to see if it is a symbol.
*
* This means it cannot be a special delimiter character such as #DSN_LEFT, #DSN_RIGHT,
* #DSN_QUOTE, etc. It may however, coincidentally match a keyword and still be a symbol.
*/
static bool IsSymbol( int aTok );
/**
* Throw an #IO_ERROR exception with an input file specific error message.
*
* @param aTok is the token/keyword type which was expected at the current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Expecting( int aTok ) const;
/**
* Throw an #IO_ERROR exception with an input file specific error message.
*
* @param aTokenList is the token/keyword type which was expected at the
* current input location, e.g. "pin|graphic|property".
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Expecting( const char* aTokenList ) const;
/**
* Throw an #IO_ERROR exception with an input file specific error message.
*
* @param aTok is the token/keyword type which was not expected at the
* current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Unexpected( int aTok ) const;
/**
* Throw an #IO_ERROR exception with an input file specific error message.
*
* @param aToken is the token which was not expected at the current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Unexpected( const char* aToken ) const;
/**
* Throw an #IO_ERROR exception with a message saying specifically that \a aTok
* is a duplicate of one already seen in current context.
*
* @param aTok is the token/keyword type which was not expected at the current input
* location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Duplicate( int aTok );
/**
* Call #NextTok() and then verifies that the token read in is a #DSN_LEFT.
*
* @throw IO_ERROR if the next token is not a #DSN_LEFT
*/
void NeedLEFT();
/**
* Call #NextTok() and then verifies that the token read in is a #DSN_RIGHT.
*
* @throw IO_ERROR if the next token is not a #DSN_RIGHT
*/
void NeedRIGHT();
/**
* Return the C string representation of a #DSN_T value.
*/
const char* GetTokenText( int aTok ) const;
/**
* Return a quote wrapped wxString representation of a token value.
*/
wxString GetTokenString( int aTok ) const;
static const char* Syntax( int aTok );
/**
* Return a pointer to the current token's text.
*/
const char* CurText() const
{
return curText.c_str();
}
/**
* Return a reference to current token in std::string form.
*/
const std::string& CurStr() const
{
return curText;
}
/**
* Return the current token text as a wxString, assuming that the input byte stream
* is UTF8 encoded.
*/
wxString FromUTF8() const
{
return wxString::FromUTF8( curText.c_str() );
}
/**
* Return the current line number within my #LINE_READER.
*/
int CurLineNumber() const
{
return reader->LineNumber();
}
/**
* Return the current line of text from which the #CurText() would return its token.
*/
const char* CurLine() const
{
return (const char*)(*reader);
}
/**
* Return the current #LINE_READER source.
*
* @return source of the lines of text, e.g. a filename or "clipboard".
*/
const wxString& CurSource() const
{
return reader->GetSource();
}
/**
* Return the byte offset within the current line, using a 1 based index.
*
* @return a one based index into the current line.
*/
int CurOffset() const
{
return curOffset + 1;
}
#ifndef SWIG
protected:
bool iOwnReaders; ///< on readerStack, should I delete them?
const char* start;
const char* next;
const char* limit;
char dummy[1]; ///< when there is no reader.
typedef std::vector<LINE_READER*> READER_STACK;
READER_STACK readerStack; ///< all the LINE_READERs by pointer.
LINE_READER* reader; ///< no ownership. ownership is via readerStack, maybe, if iOwnReaders
bool specctraMode; ///< if true, then:
///< 1) stringDelimiter can be changed
///< 2) Kicad quoting protocol is not in effect
///< 3) space_in_quoted_tokens is functional
///< else not.
char stringDelimiter;
bool space_in_quoted_tokens; ///< blank spaces within quoted strings
bool commentsAreTokens; ///< true if should return comments as tokens
int prevTok; ///< curTok from previous NextTok() call.
int curOffset; ///< offset within current line of the current token
int curTok; ///< the current token obtained on last NextTok()
std::string curText; ///< the text of the current token
const KEYWORD* keywords; ///< table sorted by CMake for bsearch()
unsigned keywordCount; ///< count of keywords table
KEYWORD_MAP keyword_hash; ///< fast, specialized "C string" hashtable
void init();
int readLine()
@ -136,12 +472,11 @@ protected:
}
/**
* Function findToken
* takes aToken string and looks up the string in the keywords table.
* Take @a aToken string and looks up the string in the keywords table.
*
* @param aToken is a string to lookup in the keywords table.
* @return int - with a value from the enum DSN_T matching the keyword text,
* or DSN_SYMBOL if @a aToken is not in the kewords table.
* @return with a value from the enum #DSN_T matching the keyword text,
* or #DSN_SYMBOL if @a aToken is not in the keywords table.
*/
int findToken( const std::string& aToken ) const;
@ -156,399 +491,40 @@ protected:
return false;
}
bool iOwnReaders; ///< on readerStack, should I delete them?
const char* start;
const char* next;
const char* limit;
char dummy[1]; ///< when there is no reader.
typedef std::vector<LINE_READER*> READER_STACK;
READER_STACK readerStack; ///< all the LINE_READERs by pointer.
///< no ownership. ownership is via readerStack, maybe, if iOwnReaders
LINE_READER* reader;
bool specctraMode; ///< if true, then:
///< 1) stringDelimiter can be changed
///< 2) Kicad quoting protocol is not in effect
///< 3) space_in_quoted_tokens is functional
///< else not.
char stringDelimiter;
bool space_in_quoted_tokens; ///< blank spaces within quoted strings
bool commentsAreTokens; ///< true if should return comments as tokens
int prevTok; ///< curTok from previous NextTok() call.
int curOffset; ///< offset within current line of the current token
int curTok; ///< the current token obtained on last NextTok()
std::string curText; ///< the text of the current token
const KEYWORD* keywords; ///< table sorted by CMake for bsearch()
unsigned keywordCount; ///< count of keywords table
KEYWORD_MAP keyword_hash; ///< fast, specialized "C string" hashtable
#endif // SWIG
public:
/**
* Constructor ( FILE*, const wxString& )
* intializes a DSN lexer and prepares to read from aFile which
* is already open and has aFilename.
*
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc.
* @param aKeywordCount is the count of tokens in aKeywordTable.
* @param aFile is an open file, which will be closed when this is destructed.
* @param aFileName is the name of the file
*/
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
FILE* aFile, const wxString& aFileName );
/**
* Constructor ( const KEYWORD*, unsigned, const std::string&, const wxString& )
* intializes a DSN lexer and prepares to read from @a aSExpression.
*
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc.
* @param aKeywordCount is the count of tokens in aKeywordTable.
* @param aSExpression is text to feed through a STRING_LINE_READER
* @param aSource is a description of aSExpression, used for error reporting.
*/
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
const std::string& aSExpression, const wxString& aSource = wxEmptyString );
/**
* Constructor ( const std::string&, const wxString& )
* intializes a DSN lexer and prepares to read from @a aSExpression. Use this
* one without a keyword table with the DOM parser in ptree.h.
*
* @param aSExpression is text to feed through a STRING_LINE_READER
* @param aSource is a description of aSExpression, used for error reporting.
*/
DSNLEXER( const std::string& aSExpression, const wxString& aSource = wxEmptyString );
/**
* Constructor ( LINE_READER* )
* intializes a DSN lexer and prepares to read from @a aLineReader which
* is already open, and may be in use by other DSNLEXERs also. No ownership
* is taken of @a aLineReader. This enables it to be used by other DSNLEXERs also.
*
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc.
*
* @param aKeywordCount is the count of tokens in aKeywordTable.
*
* @param aLineReader is any subclassed instance of LINE_READER, such as
* STRING_LINE_READER or FILE_LINE_READER. No ownership is taken.
*/
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
LINE_READER* aLineReader = NULL );
virtual ~DSNLEXER();
/**
* Useable only for DSN lexers which share the same LINE_READER
* Synchronizes the pointers handling the data read by the LINE_READER
* Allows 2 DNSLEXER to share the same current line, when switching from a
* DNSLEXER to another DNSLEXER
* @param aLexer = the model
* @return true if the sync can be made ( at least the same line reader )
*/
bool SyncLineReaderWith( DSNLEXER& aLexer );
/**
* Function SetSpecctraMode
* changes the behavior of this lexer into or out of "specctra mode". If
* specctra mode, then:
* 1) stringDelimiter can be changed
* 2) Kicad quoting protocol is not in effect
* 3) space_in_quoted_tokens is functional
* else none of the above are true. The default mode is non-specctra mode, meaning:
* 1) stringDelimiter cannot be changed
* 2) Kicad quoting protocol is in effect
* 3) space_in_quoted_tokens is not functional
*/
void SetSpecctraMode( bool aMode );
/**
* Function PushReader
* manages a stack of LINE_READERs in order to handle nested file inclusion.
* This function pushes aLineReader onto the top of a stack of LINE_READERs and makes
* it the current LINE_READER with its own GetSource(), line number and line text.
* A grammar must be designed such that the "include" token (whatever its various names),
* and any of its parameters are not followed by anything on that same line,
* because PopReader always starts reading from a new line upon returning to
* the original LINE_READER.
*/
void PushReader( LINE_READER* aLineReader );
/**
* Function PopReader
* deletes the top most LINE_READER from an internal stack of LINE_READERs and
* in the case of FILE_LINE_READER this means the associated FILE is closed.
* The most recently used former LINE_READER on the stack becomes the
* current LINE_READER and its previous position in its input stream and the
* its latest line number should pertain. PopReader always starts reading
* from a new line upon returning to the previous LINE_READER. A pop is only
* possible if there are at least 2 LINE_READERs on the stack, since popping
* the last one is not supported.
*
* @return LINE_READER* - is the one that was in use before the pop, or NULL
* if there was not at least two readers on the stack and therefore the
* pop failed.
*/
LINE_READER* PopReader();
// Some functions whose return value is best overloaded to return an enum
// in a derived class.
//-----<overload return values to tokens>------------------------------
/**
* Function NextTok
* returns the next token found in the input file or DSN_EOF when reaching
* the end of file. Users should wrap this function to return an enum
* to aid in grammar debugging while running under a debugger, but leave
* this lower level function returning an int (so the enum does not collide
* with another usage).
* @return int - the type of token found next.
* @throw IO_ERROR - only if the LINE_READER throws it.
*/
int NextTok();
/**
* Function NeedSYMBOL
* calls NextTok() and then verifies that the token read in
* satisfies bool IsSymbol().
* If not, an IO_ERROR is thrown.
* @return int - the actual token read in.
* @throw IO_ERROR, if the next token does not satisfy IsSymbol()
*/
int NeedSYMBOL();
/**
* Function NeedSYMBOLorNUMBER
* calls NextTok() and then verifies that the token read in
* satisfies bool IsSymbol() or tok==DSN_NUMBER.
* If not, an IO_ERROR is thrown.
* @return int - the actual token read in.
* @throw IO_ERROR, if the next token does not satisfy the above test
*/
int NeedSYMBOLorNUMBER();
/**
* Function NeedNUMBER
* calls NextTok() and then verifies that the token read is type DSN_NUMBER.
* If not, and IO_ERROR is thrown using text from aExpectation.
* @return int - the actual token read in.
* @throw IO_ERROR, if the next token does not satisfy the above test
*/
int NeedNUMBER( const char* aExpectation );
/**
* Function CurTok
* returns whatever NextTok() returned the last time it was called.
*/
int CurTok() const
{
return curTok;
}
/**
* Function PrevTok
* returns whatever NextTok() returned the 2nd to last time it was called.
*/
int PrevTok() const
{
return prevTok;
}
/**
* Function GetCurStrAsToken
* Used to support "loose" matches (quoted tokens)
*/
int GetCurStrAsToken() const
{
return findToken( curText );
}
//-----</overload return values to tokens>-----------------------------
/**
* Function SetStringDelimiter
* changes the string delimiter from the default " to some other character
* and returns the old value.
* @param aStringDelimiter The character in lowest 8 bits.
* @return int - The old delimiter in the lowest 8 bits.
*/
char SetStringDelimiter( char aStringDelimiter )
{
int old = stringDelimiter;
if( specctraMode )
stringDelimiter = aStringDelimiter;
return old;
}
/**
* Function SetSpaceInQuotedTokens
* changes the setting controlling whether a space in a quoted string is
* a terminator.
* @param val If true, means
*/
bool SetSpaceInQuotedTokens( bool val )
{
bool old = space_in_quoted_tokens;
if( specctraMode )
space_in_quoted_tokens = val;
return old;
}
/**
* Function SetCommentsAreTokens
* changes the handling of comments. If set true, comments are returns
* as single line strings with a terminating newline, else they are
* consumed by the lexer and not returned.
*/
bool SetCommentsAreTokens( bool val )
{
bool old = commentsAreTokens;
commentsAreTokens = val;
return old;
}
/**
* Function ReadCommentLines
* checks the next sequence of tokens and reads them into a wxArrayString
* if they are comments. Reading continues until a non-comment token is
* encountered, and such last read token remains as CurTok() and as CurText().
* No push back or "un get" mechanism is used for this support. Upon return
* you simply avoid calling NextTok() for the next token, but rather CurTok().
*
* @return wxArrayString* - heap allocated block of comments, or NULL if none;
* caller owns the allocation and must delete if not NULL.
*/
wxArrayString* ReadCommentLines();
/**
* Function IsSymbol
* tests a token to see if it is a symbol. This means it cannot be a
* special delimiter character such as DSN_LEFT, DSN_RIGHT, DSN_QUOTE, etc. It may
* however, coincidentally match a keyword and still be a symbol.
*/
static bool IsSymbol( int aTok );
/**
* Function Expecting
* throws an IO_ERROR exception with an input file specific error message.
* @param aTok is the token/keyword type which was expected at the current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Expecting( int aTok ) const;
/**
* Function Expecting
* throws an IO_ERROR exception with an input file specific error message.
* @param aTokenList is the token/keyword type which was expected at the
* current input location, e.g. "pin|graphic|property"
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Expecting( const char* aTokenList ) const;
/**
* Function Unexpected
* throws an IO_ERROR exception with an input file specific error message.
* @param aTok is the token/keyword type which was not expected at the
* current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Unexpected( int aTok ) const;
/**
* Function Unexpected
* throws an IO_ERROR exception with an input file specific error message.
* @param aToken is the token which was not expected at the
* current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Unexpected( const char* aToken ) const;
/**
* Function Duplicate
* throws an IO_ERROR exception with a message saying specifically that aTok
* is a duplicate of one already seen in current context.
* @param aTok is the token/keyword type which was not expected at the
* current input location.
* @throw IO_ERROR with the location within the input file of the problem.
*/
void Duplicate( int aTok );
/**
* Function NeedLEFT
* calls NextTok() and then verifies that the token read in is a DSN_LEFT.
* If it is not, an IO_ERROR is thrown.
* @throw IO_ERROR, if the next token is not a DSN_LEFT
*/
void NeedLEFT();
/**
* Function NeedRIGHT
* calls NextTok() and then verifies that the token read in is a DSN_RIGHT.
* If it is not, an IO_ERROR is thrown.
* @throw IO_ERROR, if the next token is not a DSN_RIGHT
*/
void NeedRIGHT();
/**
* Function GetTokenText
* returns the C string representation of a DSN_T value.
*/
const char* GetTokenText( int aTok ) const;
/**
* Function GetTokenString
* returns a quote wrapped wxString representation of a token value.
*/
wxString GetTokenString( int aTok ) const;
static const char* Syntax( int aTok );
/**
* Function CurText
* returns a pointer to the current token's text.
*/
const char* CurText() const
{
return curText.c_str();
}
/**
* Function CurStr
* returns a reference to current token in std::string form.
*/
const std::string& CurStr() const
{
return curText;
}
/**
* Function FromUTF8
* returns the current token text as a wxString, assuming that the input
* byte stream is UTF8 encoded.
*/
wxString FromUTF8() const
{
return wxString::FromUTF8( curText.c_str() );
}
/**
* Function CurLineNumber
* returns the current line number within my LINE_READER
*/
int CurLineNumber() const
{
return reader->LineNumber();
}
/**
* Function CurLine
* returns the current line of text, from which the CurText() would return
* its token.
*/
const char* CurLine() const
{
return (const char*)(*reader);
}
/**
* Function CurFilename
* returns the current LINE_READER source.
* @return const wxString& - the source of the lines of text,
* e.g. a filename or "clipboard".
*/
const wxString& CurSource() const
{
return reader->GetSource();
}
/**
* Function CurOffset
* returns the byte offset within the current line, using a 1 based index.
* @return int - a one based index into the current line.
*/
int CurOffset() const
{
return curOffset + 1;
}
};
#endif // DSNLEXER_H_

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2009-2015 Jean-Pierre Charras, jp.charras wanadoo.fr
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -96,140 +96,15 @@ wxDECLARE_EVENT( UNITS_CHANGED, wxCommandEvent );
* This class is not intended to be used directly. It provides support for automatic calls
* to SaveSettings() function. SaveSettings() for a derived class can choose to do nothing,
* or rely on basic SaveSettings() support in this base class to do most of the work by
* calling it from the derived class's SaveSettings().
* <p>
* This class is not a KIWAY_PLAYER because KICAD_MANAGER_FRAME is derived from it
* and that class is not a player.
* </p>
* calling it from the derived class's SaveSettings(). This class is not a #KIWAY_PLAYER
* because #KICAD_MANAGER_FRAME is derived from it and that class is not a player.
*/
class EDA_BASE_FRAME : public wxFrame, public TOOLS_HOLDER, public KIWAY_HOLDER
{
/**
* (with its unexpected name so it does not collide with the real OnWindowClose()
* function provided in derived classes) is called just before a window
* closing, and is used to call a derivation specific
* SaveSettings(). SaveSettings() is called for all derived wxFrames in this
* base class overload. (Calling it from a destructor is deprecated since the
* wxFrame's position is not available in the destructor on linux.) In other words,
* you should not need to call SaveSettings() anywhere, except in this
* one function found only in this class.
*/
void windowClosing( wxCloseEvent& event );
wxWindow* findQuasiModalDialog();
/**
* Return true if the frame is shown in our modal mode
* and false if the frame is shown as an usual frame
* In modal mode, the caller that created the frame is responsible to Destroy()
* this frame after closing
*/
virtual bool IsModal() const { return false; }
protected:
FRAME_T m_ident; // Id Type (pcb, schematic, library..)
wxPoint m_framePos;
wxSize m_frameSize;
bool m_maximizeByDefault;
// These contain the frame size and position for when it is not maximized
wxPoint m_normalFramePos;
wxSize m_normalFrameSize;
wxString m_aboutTitle; // Name of program displayed in About.
wxAuiManager m_auimgr;
wxString m_perspective; // wxAuiManager perspective.
WX_INFOBAR* m_infoBar; // Infobar for the frame
wxString m_configName; // Prefix used to identify some params (frame size...)
// and to name some config files (legacy hotkey files)
SETTINGS_MANAGER* m_settingsManager;
FILE_HISTORY* m_fileHistory; // The frame's recently opened file list
bool m_hasAutoSave;
bool m_autoSaveState;
int m_autoSaveInterval; // The auto save interval time in seconds.
wxTimer* m_autoSaveTimer;
int m_undoRedoCountMax; // undo/Redo command Max depth
UNDO_REDO_CONTAINER m_undoList; // Objects list for the undo command (old data)
UNDO_REDO_CONTAINER m_redoList; // Objects list for the redo command (old data)
wxString m_mruPath; // Most recently used path.
EDA_UNITS m_userUnits;
// Map containing the UI update handlers registered with wx for each action
std::map<int, UIUpdateHandler> m_uiUpdateMap;
bool m_isClosing; // Set by the close window event handler after frames are asked if they can close
// Allows other functions when called to know our state is cleanup
bool m_isNonUserClose; // Set by NonUserClose() to indicate that the user did not request the current close
///> Default style flags used for wxAUI toolbars
static constexpr int KICAD_AUI_TB_STYLE = wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_PLAIN_BACKGROUND;
/**
* @return the suffix to be appended to the file extension on backup
*/
static wxString GetBackupSuffix()
{
return wxT( "-bak" );
}
/**
* @return the string to prepend to a file name for automatic save.
*/
static wxString GetAutoSaveFilePrefix()
{
return wxT( "_autosave-" );
}
/**
* Handle the auto save timer event.
*/
void onAutoSaveTimer( wxTimerEvent& aEvent );
/**
* Return the auto save status of the application.
*
* Override this function if your derived frame supports automatic file saving.
*/
virtual bool isAutoSaveRequired() const { return false; }
/**
* This should be overridden by the derived class to handle the auto save feature.
*
* @return true if the auto save was successful otherwise false.
*/
virtual bool doAutoSave();
virtual bool canCloseWindow( wxCloseEvent& aCloseEvent ) { return true; }
virtual void doCloseWindow() { }
/**
* Called when when the units setting has changed to allow for any derived classes
* to handle refreshing and controls that have units based measurements in them. The
* default version only updates the status bar. Don't forget to call the default
* in your derived class or the status bar will not get updated properly.
*/
virtual void unitsChangeRefresh() { }
/**
* Setup the UI conditions for the various actions and their controls in this frame.
*/
virtual void setupUIConditions();
DECLARE_EVENT_TABLE()
public:
EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType,
const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
long aStyle, const wxString& aFrameName, KIWAY* aKiway );
EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType, const wxString& aTitle,
const wxPoint& aPos, const wxSize& aSize, long aStyle,
const wxString& aFrameName, KIWAY* aKiway );
~EDA_BASE_FRAME();
@ -272,7 +147,7 @@ public:
virtual void OnCharHook( wxKeyEvent& event );
/**
* The TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu
* The #TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu
* events aren't captured by the menus themselves.
*/
void OnMenuEvent( wxMenuEvent& event );
@ -293,12 +168,12 @@ public:
virtual void UnregisterUIUpdateHandler( int aID ) override;
/**
* Handles events generated when the UI is trying to figure out the current state of the UI controls
* related to TOOL_ACTIONS (e.g. enabled, checked, etc.).
* Handle events generated when the UI is trying to figure out the current state of the
* UI controls related to #TOOL_ACTIONS (e.g. enabled, checked, etc.).
*
* @param aEvent is the wxUpdateUIEvent to be processed.
* @param aFrame is the frame to get the selection from
* @param aCond are the UI SELECTION_CONDITIONS used
* @param aCond are the #UI SELECTION_CONDITIONS used
*/
static void HandleUpdateUIEvent( wxUpdateUIEvent& aEvent, EDA_BASE_FRAME* aFrame,
ACTION_CONDITIONS aCond );
@ -317,7 +192,7 @@ public:
bool IsType( FRAME_T aType ) const { return m_ident == aType; }
/**
* Return a SEARCH_STACK pertaining to entire program.
* Return a #SEARCH_STACK pertaining to entire program.
*
* This is overloaded in #KICAD_MANAGER_FRAME
*/
@ -331,89 +206,95 @@ public:
void PrintMsg( const wxString& text );
/**
* @return the WX_INFOBAR that can be displayed on the top of the canvas
* @return the #WX_INFOBAR that can be displayed on the top of the canvas.
*/
WX_INFOBAR* GetInfoBar() { return m_infoBar; }
/**
* Show the WX_INFOBAR displayed on the top of the canvas with a message
* and a Error icon on the left of the infobar. The infobar will be closed
* after a timeaout
* Show the #WX_INFOBAR displayed on the top of the canvas with a message
* and a error icon on the left of the infobar.
*
* The infobar will be closed after a timeout.
*
* @param aErrorMsg is the message to display
* @param aShowCloseButton = true to show a close button on the right of the
* WX_INFOBAR
* @param aShowCloseButton true to show a close button on the right of the #WX_INFOBAR.
*/
void ShowInfoBarError( const wxString& aErrorMsg, bool aShowCloseButton = false );
/**
* Show the WX_INFOBAR displayed on the top of the canvas with a message
* and a Warning icon on the left of the infobar. The infobar will be closed
* after a timeaout
* @param aErrorMsg is the message to display
* @param aShowCloseButton = true to show a close button on the right of the
* WX_INFOBAR
* Show the #WX_INFOBAR displayed on the top of the canvas with a message and a warning
* icon on the left of the infobar.
*
* The infobar will be closed after a timeout.
*
* @param aErrorMsg is the message to display.
* @param aShowCloseButton true to show a close button on the right of the #WX_INFOBAR.
*/
void ShowInfoBarWarning( const wxString& aWarningMsg, bool aShowCloseButton = false );
/**
* Show the WX_INFOBAR displayed on the top of the canvas with a message
* and a Info icon on the left of the infobar. The infobar will be closed
* after a timeaout
* @param aErrorMsg is the message to display
* @param aShowCloseButton = true to show a close button on the right of the
* WX_INFOBAR
* Show the #WX_INFOBAR displayed on the top of the canvas with a message and an info
* icon on the left of the infobar.
*
* The infobar will be closed after a timeout.
*
* @param aErrorMsg is the message to display.
* @param aShowCloseButton true to show a close button on the right of the #WX_INFOBAR.
*/
void ShowInfoBarMsg( const wxString& aMsg, bool aShowCloseButton = false );
/**
* Returns the settings object used in SaveSettings(), and is overloaded in
* KICAD_MANAGER_FRAME
* #KICAD_MANAGER_FRAME.
*/
virtual APP_SETTINGS_BASE* config() const;
/**
* Function InstallPreferences
* Allow a frame to load its preference panels (if any) into the preferences dialog.
* @param aParent a paged dialog into which the preference panels should be installed
*
* @param aParent a paged dialog into which the preference panels should be installed.
*/
virtual void InstallPreferences( PAGED_DIALOG* , PANEL_HOTKEYS_EDITOR* ) { }
void LoadWindowState( const wxString& aFileName );
/**
* Loads window settings from the given settings object
* Normally called by LoadSettings unless the window in question is a child window that
* stores its settings somewhere other than APP_SETTINGS_BASE::m_Window
* Load window settings from the given settings object.
*
* Normally called by #LoadSettings() unless the window in question is a child window
* that* stores its settings somewhere other than #APP_SETTINGS_BASE::m_Window.
*/
void LoadWindowSettings( const WINDOW_SETTINGS* aCfg );
/**
* Saves window settings to the given settings object
* Normally called by SaveSettings unless the window in question is a child window that
* stores its settings somewhere other than APP_SETTINGS_BASE::m_Window
* Save window settings to the given settings object.
*
* Normally called by #SaveSettings unless the window in question is a child window that
* stores its settings somewhere other than #APP_SETTINGS_BASE::m_Window.
*/
void SaveWindowSettings( WINDOW_SETTINGS* aCfg );
/**
* Load common frame parameters from a configuration file.
*
* Don't forget to call the base method or your frames won't
* remember their positions and sizes.
* Don't forget to call the base method or your frames won't remember their positions
* and sizes.
*/
virtual void LoadSettings( APP_SETTINGS_BASE* aCfg );
/**
* Saves common frame parameters to a configuration data file.
* Save common frame parameters to a configuration data file.
*
* Don't forget to call the base class's SaveSettings() from
* your derived SaveSettings() otherwise the frames won't remember their
* positions and sizes.
* Don't forget to call the base class's SaveSettings() from your derived
* #SaveSettings() otherwise the frames won't remember their positions and sizes.
*/
virtual void SaveSettings( APP_SETTINGS_BASE* aCfg );
/**
* Returns a pointer to the window settings for this frame.
* Return a pointer to the window settings for this frame.
*
* By default, points to aCfg->m_Window for top-level frames.
*
* @param aCfg is this frame's config object
*/
virtual WINDOW_SETTINGS* GetWindowSettings( APP_SETTINGS_BASE* aCfg );
@ -424,11 +305,14 @@ public:
virtual void LoadWindowState( const WINDOW_STATE& aState );
/**
* Get the configuration base name.
*
* This is usually the name of the frame set by CTOR, except for frames shown in
* multiple modes in which case the m_configName must be set to the base name so
* that a single configuration can be used.
*
* @return a base name prefix used in Load/Save settings to build the full name of keys
* used in config.
* This is usually the name of the frame set by CTOR, except for frames shown in multiple
* modes in which case the m_configName must be set to the base name so that a single
* config can be used.
* used in configuration.
*/
wxString ConfigBaseName() override
{
@ -440,19 +324,18 @@ public:
* Save changes to the project settings to the project (.pro) file.
*
* The method is virtual so you can override it to call the suitable save method.
* The base method do nothing
* @param aAskForSave = true to open a dialog before saving the settings
* The base method does nothing.
*
* @param aAskForSave true to open a dialog before saving the settings.
*/
virtual void SaveProjectSettings() {};
// Read/Save and Import/export hotkeys config
/**
* Prompt the user for a hotkey file to read, and read it.
*
* @param aActionMap = current hotkey map (over which the imported hotkeys will be applied)
* @param aDefaultShortname = a default short name (extension not needed)
* like eechema, kicad...
* @param aActionMap current hotkey map (over which the imported hotkeys will be applied).
* @param aDefaultShortname a default short name (extension not needed) like
* Eeschema, KiCad...
*/
void ImportHotkeyConfigFromFile( std::map<std::string, TOOL_ACTION*> aActionMap,
const wxString& aDefaultShortname );
@ -461,7 +344,7 @@ public:
* Fetches the file name from the file history list.
*
* This removes the selected file, if this file does not exist. The menu is also updated,
* if FILE_HISTORY::UseMenu was called at init time
* if #FILE_HISTORY::UseMenu was called at initialization time.
*
* @param cmdId The command ID associated with the \a aFileHistory object.
* @param type Please document me!
@ -486,8 +369,8 @@ public:
* The menu is also updated, if FILE_HISTORY::UseMenu was called at init time.
*
* @param FullFileName The full file name including the path.
* @param aFileHistory The FILE_HISTORY in use.
* If NULL, the main application file history is used.
* @param aFileHistory The FILE_HISTORY in use. If NULL, the main application file
* history is used.
*/
void UpdateFileHistory( const wxString& FullFileName, FILE_HISTORY* aFileHistory = nullptr );
@ -507,6 +390,7 @@ public:
/**
* Get the full filename + path of the currently opened file in the frame.
*
* If no file is open, an empty string is returned.
*
* @return the filename and full path to the open file
@ -527,13 +411,13 @@ public:
/**
* Checks if \a aFileName can be written.
* <p>
*
* The function performs a number of tests on \a aFileName to verify that it can be saved.
* If \a aFileName defines a path with no file name, them the path is tested for user write
* permission. If \a aFileName defines a file name that does not exist in the path, the
* path is tested for user write permission. If \a aFileName defines a file that already
* exits, the file name is tested for user write permissions.
* </p>
*>
* @note The file name path must be set or an assertion will be raised on debug builds and
* return false on release builds.
* @param aFileName The full path and/or file name of the file to test.
@ -544,13 +428,13 @@ public:
/**
* Check if an auto save file exists for \a aFileName and takes the appropriate action
* depending on the user input.
* <p>
*
* If an auto save file exists for \a aFileName, the user is prompted if they wish to
* replace file \a aFileName with the auto saved file. If the user chooses to replace the
* file, the backup file of \a aFileName is removed, \a aFileName is renamed to the backup
* file name, and the auto save file is renamed to \a aFileName. If user chooses to keep
* the existing version of \a aFileName, the auto save file is removed.
* </p>
*
* @param aFileName A wxFileName object containing the file name to check.
*/
void CheckForAutoSaveFile( const wxFileName& aFileName );
@ -599,60 +483,50 @@ public:
*/
wxSize GetWindowSize();
/* general Undo/Redo command control */
/**
* Function ClearUndoORRedoList (virtual).
* this function must remove the aItemCount old commands from aList
* and delete commands, pickers and picked items if needed
* Because picked items must be deleted only if they are not in use, this
* is a virtual pure function that must be created for SCH_SCREEN and
* PCB_SCREEN
* @param aList = the UNDO_REDO_CONTAINER of commands
* @param aItemCount = number of old commands to delete. -1 to remove all
* old commands this will empty the list of commands.
* Commands are deleted from the older to the last.
* Remove the \a aItemCount of old commands from \a aList and delete commands, pickers
* and picked items if needed.
*
* Because picked items must be deleted only if they are not in use, this is a virtual
* pure function that must be created for #SCH_SCREEN and #PCB_SCREEN. Commands are
* deleted from the older to the last.
*
* @param aList = the #UNDO_REDO_CONTAINER of commands.
* @param aItemCount number of old commands to delete. -1 to remove all old commands
* this will empty the list of commands.
*/
enum UNDO_REDO_LIST { UNDO_LIST, REDO_LIST };
virtual void ClearUndoORRedoList( UNDO_REDO_LIST aList, int aItemCount = -1 )
{ }
/**
* Function ClearUndoRedoList
* clear undo and redo list, using ClearUndoORRedoList()
* picked items are deleted by ClearUndoORRedoList() according to their
* status
* Clear the undo and redo list using #ClearUndoORRedoList()
*
* Picked items are deleted by ClearUndoORRedoList() according to their status.
*/
virtual void ClearUndoRedoList();
/**
* Function PushCommandToUndoList
* add a command to undo in undo list
* delete the very old commands when the max count of undo commands is
* reached
* ( using ClearUndoORRedoList)
* Add a command to undo in the undo list.
*
* Delete the very old commands when the max count of undo commands is reached.
*/
virtual void PushCommandToUndoList( PICKED_ITEMS_LIST* aItem );
/**
* Function PushCommandToRedoList
* add a command to redo in redo list
* delete the very old commands when the max count of redo commands is
* reached
* ( using ClearUndoORRedoList)
* Add a command to redo in the redo list.
*
* Delete the very old commands when the max count of redo commands is reached.
*/
virtual void PushCommandToRedoList( PICKED_ITEMS_LIST* aItem );
/** PopCommandFromUndoList
* return the last command to undo and remove it from list
* nothing is deleted.
/**
* Return the last command to undo and remove it from list, nothing is deleted.
*/
virtual PICKED_ITEMS_LIST* PopCommandFromUndoList();
/** PopCommandFromRedoList
* return the last command to undo and remove it from list
* nothing is deleted.
/**
* Return the last command to undo and remove it from list, nothing is deleted.
*/
virtual PICKED_ITEMS_LIST* PopCommandFromRedoList();
@ -666,6 +540,137 @@ public:
m_isNonUserClose = true;
return Close( aForce );
}
protected:
///< Default style flags used for wxAUI toolbars.
static constexpr int KICAD_AUI_TB_STYLE = wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_PLAIN_BACKGROUND;
/**
* @return the suffix to be appended to the file extension on backup
*/
static wxString GetBackupSuffix()
{
return wxT( "-bak" );
}
/**
* @return the string to prepend to a file name for automatic save.
*/
static wxString GetAutoSaveFilePrefix()
{
return wxT( "_autosave-" );
}
/**
* Handle the auto save timer event.
*/
void onAutoSaveTimer( wxTimerEvent& aEvent );
/**
* Return the auto save status of the application.
*
* Override this function if your derived frame supports automatic file saving.
*/
virtual bool isAutoSaveRequired() const { return false; }
/**
* This should be overridden by the derived class to handle the auto save feature.
*
* @return true if the auto save was successful otherwise false.
*/
virtual bool doAutoSave();
virtual bool canCloseWindow( wxCloseEvent& aCloseEvent ) { return true; }
virtual void doCloseWindow() { }
/**
* Called when when the units setting has changed to allow for any derived classes
* to handle refreshing and controls that have units based measurements in them.
*
* The default version only updates the status bar. Don't forget to call the default
* in your derived class or the status bar will not get updated properly.
*/
virtual void unitsChangeRefresh() { }
/**
* Setup the UI conditions for the various actions and their controls in this frame.
*/
virtual void setupUIConditions();
DECLARE_EVENT_TABLE()
private:
/**
* (with its unexpected name so it does not collide with the real OnWindowClose()
* function provided in derived classes) is called just before a window
* closing, and is used to call a derivation specific SaveSettings().
*
* #SaveSettings() is called for all derived wxFrames in this base class overload.
* Calling it from a destructor is deprecated since the wxFrame's position is not
* available in the destructor on linux. In other words, you should not need to
* call #SaveSettings() anywhere, except in this one function found only in this class.
*/
void windowClosing( wxCloseEvent& event );
wxWindow* findQuasiModalDialog();
/**
* Return true if the frame is shown in our modal mode and false if the frame is
* shown as an usual frame.
*
* In modal mode, the caller that created the frame is responsible to Destroy()
* this frame after closing.
*/
virtual bool IsModal() const { return false; }
protected:
FRAME_T m_ident; // Id Type (pcb, schematic, library..)
wxPoint m_framePos;
wxSize m_frameSize;
bool m_maximizeByDefault;
// These contain the frame size and position for when it is not maximized
wxPoint m_normalFramePos;
wxSize m_normalFrameSize;
wxString m_aboutTitle; // Name of program displayed in About.
wxAuiManager m_auimgr;
wxString m_perspective; // wxAuiManager perspective.
WX_INFOBAR* m_infoBar; // Infobar for the frame
wxString m_configName; // Prefix used to identify some params (frame size...)
// and to name some config files (legacy hotkey files)
SETTINGS_MANAGER* m_settingsManager;
FILE_HISTORY* m_fileHistory; // The frame's recently opened file list
bool m_hasAutoSave;
bool m_autoSaveState;
int m_autoSaveInterval; // The auto save interval time in seconds.
wxTimer* m_autoSaveTimer;
int m_undoRedoCountMax; // undo/Redo command Max depth
UNDO_REDO_CONTAINER m_undoList; // Objects list for the undo command (old data)
UNDO_REDO_CONTAINER m_redoList; // Objects list for the redo command (old data)
wxString m_mruPath; // Most recently used path.
EDA_UNITS m_userUnits;
///< Map containing the UI update handlers registered with wx for each action.
std::map<int, UIUpdateHandler> m_uiUpdateMap;
///< Set by the close window event handler after frames are asked if they can close.
///< Allows other functions when called to know our state is cleanup.
bool m_isClosing;
///< Set by #NonUserClose() to indicate that the user did not request the current close.
bool m_isNonUserClose;
};

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2009-2014 Jerry Jacobs
* Copyright (C) 1992-2019 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see CHANGELOG.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -33,24 +33,23 @@
/**
* Function KeywordMatch
* searches \a aKeyList for any words found in \a aDatabase.
* Search \a aKeyList for any words found in \a aDatabase.
*
* @return true if keyword is found.
*/
bool KeywordMatch( const wxString& aKeys, const wxString& aDatabase );
/**
* Function GetAssociatedDocument
* open a document (file) with the suitable browser. Environmental variables are
* substituted before the document name is resolved for either browser or file
* @param aParent = main frame
* @param aDocName = filename of file to open (Full filename or short filename)
* if \a aDocName begins with http: or ftp: or www. the default internet browser is launched
* Open a document (file) with the suitable browser.
*
* Environmental variables are substituted before the document name is resolved for
* either browser or file. If \a aDocName begins with http: or ftp: or www. the
* default internet browser is launched.
*
* @param aParent main frame.
* @param aDocName filename of file to open (Full filename or short filename).
*/
bool GetAssociatedDocument( wxWindow* aParent,
const wxString& aDocName,
PROJECT* aProject );
bool GetAssociatedDocument( wxWindow* aParent, const wxString& aDocName, PROJECT* aProject );
#endif /* __INCLUDE__EDA_DOC_H__ */

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -61,99 +61,26 @@ using KIGFX::RENDER_SETTINGS;
/**
* The base class for create windows for drawing purpose. The Eeschema, Pcbnew and
* GerbView main windows are just a few examples of classes derived from EDA_DRAW_FRAME.
* The base class for create windows for drawing purpose.
*
* The Eeschema, Pcbnew and GerbView main windows are just a few examples of classes
* derived from EDA_DRAW_FRAME.
*/
class EDA_DRAW_FRAME : public KIWAY_PLAYER
{
BASE_SCREEN* m_currentScreen; ///< current used SCREEN
EDA_DRAW_PANEL_GAL* m_canvas;
///< GAL display options - this is the frame's interface to setting GAL display options
KIGFX::GAL_DISPLAY_OPTIONS m_galDisplayOptions;
/// Default display origin transforms object
ORIGIN_TRANSFORMS m_originTransforms;
protected:
wxSocketServer* m_socketServer;
std::vector<wxSocketBase*> m_sockets; ///< interprocess communication
std::unique_ptr<wxSingleInstanceChecker> m_file_checker; ///< prevents opening same file multiple times.
bool m_showPageLimits; // True to display the page limits
COLOR4D m_gridColor; // Grid color
COLOR4D m_drawBgColor; // The background color of the draw canvas; BLACK for
// Pcbnew, BLACK or WHITE for eeschema
int m_undoRedoCountMax; // Default Undo/Redo command Max depth, to be handed
// to screens
bool m_polarCoords; // For those frames that support polar coordinates
bool m_showBorderAndTitleBlock; // Show the worksheet (border and title block).
long m_firstRunDialogSetting; // Show first run dialog on startup
wxChoice* m_gridSelectBox;
wxChoice* m_zoomSelectBox;
ACTION_TOOLBAR* m_mainToolBar;
ACTION_TOOLBAR* m_auxiliaryToolBar; // Additional tools under main toolbar
ACTION_TOOLBAR* m_drawToolBar; // Drawing tools (typically on right edge of window)
ACTION_TOOLBAR* m_optionsToolBar; // Options (typically on left edge of window)
wxFindReplaceData* m_findReplaceData;
wxArrayString m_findStringHistoryList;
wxArrayString m_replaceStringHistoryList;
EDA_MSG_PANEL* m_messagePanel;
int m_msgFrameHeight;
COLOR_SETTINGS* m_colorSettings;
/// The current canvas type
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType;
virtual void SetScreen( BASE_SCREEN* aScreen ) { m_currentScreen = aScreen; }
void unitsChangeRefresh() override;
void setupUnits( APP_SETTINGS_BASE* aCfg );
/**
* Determines the Canvas type to load (with prompt if required) and initializes m_canvasType
*/
void resolveCanvasType();
/**
* Returns the canvas type stored in the application settings.
*/
EDA_DRAW_PANEL_GAL::GAL_TYPE loadCanvasTypeSetting();
/**
* Stores the canvas type in the application settings.
*/
bool saveCanvasTypeSetting( EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType );
/**
* Sets the common key-pair for exiting the application (Ctrl-Q) and ties it
* to the wxID_EXIT event id. This is useful in sub-applications to pass the event
* up to a non-owning window
*/
void initExitKey();
public:
EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
FRAME_T aFrameType,
const wxString& aTitle,
const wxPoint& aPos, const wxSize& aSize,
long aStyle,
EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType, const wxString& aTitle,
const wxPoint& aPos, const wxSize& aSize, long aStyle,
const wxString& aFrameName );
~EDA_DRAW_FRAME();
/**
* Mark a schematic file as being in use. Use ReleaseFile() to undo this.
* Mark a schematic file as being in use.
*
* @param aFileName = full path to the file.
* Use #ReleaseFile() to undo this.
*
* @param aFileName full path to the file.
* @return false if the file was already locked, true otherwise.
*/
bool LockFile( const wxString& aFileName );
@ -184,15 +111,17 @@ public:
void ToggleUserUnits() override;
/**
* Get the pair or units in current use. The primary unit is the main
* unit of the frame, and the secondary unit is the unit of the other
* system that was used most recently.
* Get the pair or units in current use.
*
* The primary unit is the main unit of the frame, and the secondary unit is the unit
* of the other system that was used most recently.
*/
void GetUnitPair( EDA_UNITS& aPrimaryUnit, EDA_UNITS& aSecondaryUnits );
/**
* Return the absolute coordinates of the origin of the snap grid. This is
* treated as a relative offset, and snapping will occur at multiples of the grid
* Return the absolute coordinates of the origin of the snap grid.
*
* This is treated as a relative offset and snapping will occur at multiples of the grid
* size relative to this point.
*/
virtual const wxPoint& GetGridOrigin() const = 0;
@ -202,7 +131,7 @@ public:
* Return the nearest \a aGridSize location to \a aPosition.
*
* @param aPosition The position to check.
* @return The nearst grid position.
* @return The nearest grid position.
*/
wxPoint GetNearestGridPosition( const wxPoint& aPosition ) const;
@ -236,23 +165,24 @@ public:
* @param isDirectory indicates the library files are directories
* @return true for OK; false for Cancel.
*/
bool LibraryFileBrowser( bool doOpen, wxFileName& aFilename,
const wxString& wildcard, const wxString& ext,
bool isDirectory = false );
bool LibraryFileBrowser( bool doOpen, wxFileName& aFilename, const wxString& wildcard,
const wxString& ext, bool isDirectory = false );
void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
virtual wxString GetScreenDesc() const;
/**
* Return a pointer to a BASE_SCREEN or one of its derivatives. It is overloaded by
* derived classes to return SCH_SCREEN or PCB_SCREEN.
* Return a pointer to a BASE_SCREEN or one of its derivatives.
*
* It is overloaded by derived classes to return #SCH_SCREEN or #PCB_SCREEN.
*/
virtual BASE_SCREEN* GetScreen() const { return m_currentScreen; }
/**
* Execute a remote command sent via socket (to port KICAD_PCB_PORT_SERVICE_NUMBER,
* currently 4242).
*
* Subclasses should override to implement actual command handlers.
*/
virtual void ExecuteRemoteCommand( const char* cmdline ){}
@ -267,6 +197,7 @@ public:
/*
* These 4 functions provide a basic way to show/hide grid and /get/set grid color.
*
* These parameters are saved in KiCad config for each main frame.
*/
bool IsGridVisible() const;
@ -282,7 +213,7 @@ public:
* application setting is saved. If you override this method, make sure you call down
* to the base class.
*
* @param event - Command event from the grid size combobox on the toolbar.
* @param event Command event from the grid size combobox on the toolbar.
*/
void OnSelectGrid( wxCommandEvent& event );
@ -290,7 +221,7 @@ public:
/**
* Rebuild the grid combobox to respond to any changes in the GUI (units, user
* grid changes, etc.)
* grid changes, etc.).
*/
void UpdateGridSelectBox();
@ -318,8 +249,8 @@ public:
/**
* Set the zoom factor when selected by the zoom list box in the main tool bar.
*
* @note List position 0 is fit to page
* List position >= 1 = zoom (1 to zoom max)
* @note List position 0 is fit to page.
* List position >= 1 = zoom (1 to zoom max).
* Last list position is custom zoom not in zoom list.
*/
virtual void OnSelectZoom( wxCommandEvent& event );
@ -337,37 +268,37 @@ public:
virtual void HardRedraw();
/**
* Redraw the screen with best zoom level and the best centering
* that shows all the page or the board
* Redraw the screen with best zoom level and the best centering that shows all the
* page or the board.
*/
virtual void Zoom_Automatique( bool aWarpPointer );
/**
* Useful to focus on a particular location, in find functions
* Move the graphic cursor (crosshair cursor) at a given coordinate and reframes
* the drawing if the requested point is out of view or if center on location is requested.
* Useful to focus on a particular location, in find functions.
*
* Move the graphic cursor (crosshair cursor) at a given coordinate and reframes the
* drawing if the requested point is out of view or if center on location is requested.
*
* @param aPos is the point to go to.
*/
void FocusOnLocation( const wxPoint& aPos );
/**
* Function CreateBasicMenu
*
* Construct a "basic" menu for a tool, containing only items
* that apply to all tools (e.g. zoom and grid)
* Construct a "basic" menu for a tool, containing only items that apply to all tools
* (e.g. zoom and grid).
*/
void AddStandardSubMenus( TOOL_MENU& aMenu );
/**
* Prints the page layout with the frame and the basic inscriptions.
*
* @param aScreen screen to draw
* @param aScreen screen to draw.
* @param aMils2Iu The mils to Iu conversion factor.
* @param aFilename The filename to display in basic inscriptions.
* @param aSheetLayer The layer displayed from pcbnew.
* @param aSheetLayer The layer displayed from PcbNew.
*/
void PrintWorkSheet( RENDER_SETTINGS* aSettings, BASE_SCREEN* aScreen, double aMils2Iu,
const wxString &aFilename, const wxString &aSheetLayer = wxEmptyString );
const wxString& aFilename, const wxString& aSheetLayer = wxEmptyString );
void DisplayToolMsg( const wxString& msg ) override;
@ -408,13 +339,12 @@ public:
/**
* Append a message to the message panel.
*
* This helper method checks to make sure the message panel exists in
* the frame and appends a message to it using the message panel
* AppendMessage() method.
* This helper method checks to make sure the message panel exists in the frame and
* appends a message to it using the message panel AppendMessage() method.
*
* @param aTextUpper - The message upper text.
* @param aTextLower - The message lower text.
* @param aPadding - Number of spaces to pad between messages.
* @param aTextUpper The message upper text.
* @param aTextLower The message lower text.
* @param aPadding Number of spaces to pad between messages.
*/
void AppendMsgPanel( const wxString& aTextUpper, const wxString& aTextLower, int aPadding = 6 );
@ -434,9 +364,9 @@ public:
/**
* Helper function that erases the msg panel and then appends a single message
*
* @param aTextUpper - The message upper text.
* @param aTextLower - The message lower text.
* @param aPadding - Number of spaces to pad between messages.
* @param aTextUpper The message upper text.
* @param aTextLower The message lower text.
* @param aPadding Number of spaces to pad between messages.
*/
void SetMsgPanel( const wxString& aTextUpper, const wxString& aTextLower, int aPadding = 6 );
@ -453,7 +383,7 @@ public:
/**
* Print the page pointed by current screen, set by the calling print function.
*
* @param aDC = wxDC given by the calling print function
* @param aDC wxDC given by the calling print function
*/
virtual void PrintPage( RENDER_SETTINGS* aSettings );
@ -496,9 +426,9 @@ public:
* false makes it ignore any items outside the PCB edge such as fabrication
* notes.
*
* @param aIncludeAllVisible - True = Include everything visible in bbox calculations
* False = Ignore some visible items (program dependent)
* @return BOX2I - Bounding box of document (ignoring some items as requested)
* @param aIncludeAllVisible True to include everything visible in bbox calculations,
* false to ignore some visible items (program dependent).
* @return Bounding box of the document (ignoring some items as requested).
*/
virtual const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const;
@ -508,6 +438,83 @@ public:
void RecreateToolbars();
DECLARE_EVENT_TABLE()
protected:
virtual void SetScreen( BASE_SCREEN* aScreen ) { m_currentScreen = aScreen; }
void unitsChangeRefresh() override;
void setupUnits( APP_SETTINGS_BASE* aCfg );
/**
* Determines the Canvas type to load (with prompt if required) and initializes m_canvasType
*/
void resolveCanvasType();
/**
* Returns the canvas type stored in the application settings.
*/
EDA_DRAW_PANEL_GAL::GAL_TYPE loadCanvasTypeSetting();
/**
* Stores the canvas type in the application settings.
*/
bool saveCanvasTypeSetting( EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType );
/**
* Sets the common key-pair for exiting the application (Ctrl-Q) and ties it
* to the wxID_EXIT event id.
*
* This is useful in sub-applications to pass the event up to a non-owning window.
*/
void initExitKey();
wxSocketServer* m_socketServer;
std::vector<wxSocketBase*> m_sockets; ///< interprocess communication
///< Prevents opening same file multiple times.
std::unique_ptr<wxSingleInstanceChecker> m_file_checker;
bool m_showPageLimits; // True to display the page limits
COLOR4D m_gridColor; // Grid color
COLOR4D m_drawBgColor; // The background color of the draw canvas; BLACK for
// Pcbnew, BLACK or WHITE for Eeschema
int m_undoRedoCountMax; // Default Undo/Redo command Max depth, to be handed
// to screens
bool m_polarCoords; // For those frames that support polar coordinates
bool m_showBorderAndTitleBlock; // Show the worksheet (border and title block).
long m_firstRunDialogSetting; // Show first run dialog on startup
wxChoice* m_gridSelectBox;
wxChoice* m_zoomSelectBox;
ACTION_TOOLBAR* m_mainToolBar;
ACTION_TOOLBAR* m_auxiliaryToolBar; // Additional tools under main toolbar
ACTION_TOOLBAR* m_drawToolBar; // Drawing tools (typically on right edge of window)
ACTION_TOOLBAR* m_optionsToolBar; // Options (typically on left edge of window)
wxFindReplaceData* m_findReplaceData;
wxArrayString m_findStringHistoryList;
wxArrayString m_replaceStringHistoryList;
EDA_MSG_PANEL* m_messagePanel;
int m_msgFrameHeight;
COLOR_SETTINGS* m_colorSettings;
///< The current canvas type.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType;
private:
BASE_SCREEN* m_currentScreen; ///< current used SCREEN
EDA_DRAW_PANEL_GAL* m_canvas;
///< This the frame's interface to setting GAL display options.
KIGFX::GAL_DISPLAY_OPTIONS m_galDisplayOptions;
///< Default display origin transforms object.
ORIGIN_TRANSFORMS m_originTransforms;
};
#endif // DRAW_FRAME_H_

View File

@ -70,19 +70,18 @@ class MSG_PANEL_ITEM;
/**
* Typedef INSPECTOR
* is used to inspect and possibly collect the
* (search) results of iterating over a list or tree of KICAD_T objects.
* Provide an implementation as needed to inspect EDA_ITEMs visited via
* EDA_ITEM::Visit() and EDA_ITEM::IterateForward().
* <p>
* FYI the std::function may hold a lambda, std::bind, pointer to func, or
* ptr to member function, per modern C++. It is used primarily for searching,
* but not limited to that. It can also collect or modify the scanned objects.
* 'Capturing' lambdas are particularly convenient because they can use context
* and this often means @a aTestData is not used.
* Used to inspect and possibly collect the (search) results of iterating over a list or
* tree of #KICAD_T objects.
*
* @param aItem An EDA_ITEM to examine.
* Provide an implementation as needed to inspect EDA_ITEMs visited via #EDA_ITEM::Visit()
* and #EDA_ITEM::IterateForward().
*
* FYI the std::function may hold a lambda, std::bind, pointer to func, or ptr to member
* function, per modern C++. It is used primarily for searching, but not limited to that.
* It can also collect or modify the scanned objects. 'Capturing' lambdas are particularly
* convenient because they can use context and this often means @a aTestData is not used.
*
* @param aItem An #EDA_ITEM to examine.
* @param aTestData is arbitrary data needed by the inspector to determine
* if the EDA_ITEM under test meets its match criteria, and is often NULL
* with the advent of capturing lambdas.
@ -91,7 +90,8 @@ class MSG_PANEL_ITEM;
*/
typedef std::function< SEARCH_RESULT ( EDA_ITEM* aItem, void* aTestData ) > INSPECTOR_FUNC;
typedef const INSPECTOR_FUNC& INSPECTOR; /// std::function passed to nested users by ref, avoids copying std::function
///< std::function passed to nested users by ref, avoids copying std::function.
typedef const INSPECTOR_FUNC& INSPECTOR;
// These define are used for the .m_flags and .m_UndoRedoStatus member of the
@ -142,41 +142,20 @@ typedef const INSPECTOR_FUNC& INSPECTOR; /// std::function passed to nested u
typedef unsigned STATUS_FLAGS;
/**
* EDA_ITEM
* is a base class for most all the KiCad significant classes used in schematics and boards.
* A base class for most all the KiCad significant classes used in schematics and boards.
*/
class EDA_ITEM : public KIGFX::VIEW_ITEM
{
public:
const KIID m_Uuid;
private:
/**
* Run time identification, _keep private_ so it can never be changed after a ctor
* sets it. See comment near SetType() regarding virtual functions.
*/
KICAD_T m_structType;
protected:
STATUS_FLAGS m_status;
EDA_ITEM* m_parent; ///< Linked list: Link (parent struct)
bool m_forceVisible;
STATUS_FLAGS m_flags;
protected:
EDA_ITEM( EDA_ITEM* parent, KICAD_T idType );
EDA_ITEM( KICAD_T idType );
EDA_ITEM( const EDA_ITEM& base );
public:
virtual ~EDA_ITEM() { };
/**
* Function Type()
* Returns the type of object.
*
* returns the type of object. This attribute should never be changed after a ctor sets
* it, so there is no public "setter" method.
* @return KICAD_T - the type of object.
* This attribute should never be changed after a ctor sets it, so there is no public
* "setter" method.
*
* @return the type of object.
*/
inline KICAD_T Type() const { return m_structType; }
@ -242,8 +221,8 @@ public:
}
/**
* Function IsType
* Checks whether the item is one of the listed types
* Check whether the item is one of the listed types.
*
* @param aScanTypes List of item types
* @return true if the item type is contained in the list aScanTypes
*/
@ -262,9 +241,8 @@ public:
}
/**
* Function SetForceVisible
* is used to set and cleag force visible flag used to force the item to be drawn
* even if it's draw attribute is set to not visible.
* Set and clear force visible flag used to force the item to be drawn even if it's draw
* attribute is set to not visible.
*
* @param aEnable True forces the item to be drawn. False uses the item's visibility
* setting to determine if the item is to be drawn.
@ -274,8 +252,7 @@ public:
bool IsForceVisible() const { return m_forceVisible; }
/**
* Function GetMsgPanelInfo
* populates \a aList of #MSG_PANEL_ITEM objects with it's internal state for display
* Populate \a aList of #MSG_PANEL_ITEM objects with it's internal state for display
* purposes.
*
* @param aList is the list to populate.
@ -285,8 +262,7 @@ public:
}
/**
* Function HitTest
* tests if \a aPosition is contained within or on the bounding box of an item.
* Test if \a aPosition is contained within or on the bounding box of an item.
*
* @param aPosition A reference to a wxPoint object containing the coordinates to test.
* @param aAccuracy Increase the item bounding box by this amount.
@ -298,10 +274,9 @@ public:
}
/**
* Function HitTest
* tests if \a aRect intersects or is contained within the bounding box of an item.
* Test if \a aRect intersects or is contained within the bounding box of an item.
*
* @param aRect A reference to a EDA_RECT object containing the rectangle to test.
* @param aRect A reference to a #EDA_RECT object containing the rectangle to test.
* @param aContained Set to true to test for containment instead of an intersection.
* @param aAccuracy Increase \a aRect by this amount.
* @return True if \a aRect contains or intersects the item bounding box.
@ -312,13 +287,11 @@ public:
}
/**
* Function GetBoundingBox
* returns the orthogonal, bounding box of this object for display
* purposes.
* Return the orthogonal bounding box of this object for display purposes.
*
* This box should be an enclosing perimeter for visible components of this
* object, and the units should be in the pcb or schematic coordinate
* system.
* It is OK to overestimate the size by a few counts.
* system. It is OK to overestimate the size by a few counts.
*/
virtual const EDA_RECT GetBoundingBox() const;
@ -326,15 +299,13 @@ public:
virtual void SetPosition( const wxPoint& aPos ) {};
/**
* Function GetFocusPosition
* similar to GetPosition, but allows items to return their visual center rather
* Similar to GetPosition, but allows items to return their visual center rather
* than their anchor.
*/
virtual const wxPoint GetFocusPosition() const { return GetPosition(); }
/**
* Function Clone
* creates a duplicate of this item with linked list members set to NULL.
* Create a duplicate of this item with linked list members set to NULL.
*
* The default version will return NULL in release builds and likely crash the
* program. In debug builds, a warning message indicating the derived class
@ -348,25 +319,23 @@ public:
virtual EDA_ITEM* Clone() const; // should not be inline, to save the ~ 6 bytes per call site.
/**
* Function Visit
* may be re-implemented for each derived class in order to handle
* all the types given by its member data. Implementations should call
* inspector->Inspect() on types in scanTypes[], and may use
* IterateForward()
* to do so on lists of such data.
* @param inspector An INSPECTOR instance to use in the inspection.
* May be re-implemented for each derived class in order to handle all the types given
* by its member data.
*
* Implementations should call inspector->Inspect() on types in scanTypes[], and may use
* #IterateForward() to do so on lists of such data.
*
* @param inspector An #INSPECTOR instance to use in the inspection.
* @param testData Arbitrary data used by the inspector.
* @param scanTypes Which KICAD_T types are of interest and the order
* @param scanTypes Which# KICAD_T types are of interest and the order
* is significant too, terminated by EOT.
* @return SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan,
* else SCAN_CONTINUE, and determined by the inspector.
* @return #SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan,
* else #SCAN_CONTINUE, and determined by the inspector.
*/
virtual SEARCH_RESULT Visit( INSPECTOR inspector, void* testData, const KICAD_T scanTypes[] );
/**
* @copydoc SEARCH_RESULT IterateForward( EDA_ITEM*, INSPECTOR, void*, const KICAD_T )
*
* This changes first parameter to avoid the DList and use the main queue instead
* This changes first parameter to avoid the DList and use the main queue instead.
*/
template< class T >
static SEARCH_RESULT IterateForward( std::deque<T>& aList,
@ -385,9 +354,7 @@ public:
}
/**
* @copydoc SEARCH_RESULT IterateForward( EDA_ITEM*, INSPECTOR, void*, const KICAD_T )
*
* This changes first parameter to avoid the DList and use std::vector instead
* Change first parameter to avoid the DList and use std::vector instead.
*/
template <class T>
static SEARCH_RESULT IterateForward(
@ -404,43 +371,41 @@ public:
}
/**
* Function GetClass
* returns the class name.
* @return wxString
* Return the class name.
*/
virtual wxString GetClass() const = 0;
/**
* Function GetSelectMenuText
* returns the text to display to be used in the selection clarification context menu
* when multiple items are found at the current cursor position. The default version
* of this function raises an assertion in the debug mode and returns a string to
* indicate that it was not overridden to provide the object specific text.
* Return the text to display to be used in the selection clarification context menu
* when multiple items are found at the current cursor position.
*
* The default version of this function raises an assertion in the debug mode and
* returns a string to indicate that it was not overridden to provide the object
* specific text.
*
* @return The menu text string.
*/
virtual wxString GetSelectMenuText( EDA_UNITS aUnits ) const;
/**
* Function GetMenuImage
* returns a pointer to an image to be used in menus. The default version returns
* the right arrow image. Override this function to provide object specific menu
* images.
* Return a pointer to an image to be used in menus.
*
* The default version returns the right arrow image. Override this function to provide
* object specific menu images.
*
* @return The menu image associated with the item.
*/
virtual BITMAP_DEF GetMenuImage() const;
/**
* Function Matches
* compares the item against the search criteria in \a aSearchData.
* Compare the item against the search criteria in \a aSearchData.
*
* The base class returns false since many of the objects derived from EDA_ITEM
* do not have any text to search.
*
* @param aSearchData A reference to a wxFindReplaceData object containing the
* search criteria.
* @param aAuxData A pointer to optional data required for the search or NULL
* if not used.
* @param aAuxData A pointer to optional data required for the search or NULL if not used.
* @return True if the item's text matches the search criteria in \a aSearchData.
*/
virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData )
@ -449,40 +414,34 @@ public:
}
/**
* Helper function used in search and replace dialog
* Function Replace
* performs a text replace on \a aText using the find and replace criteria in
* Perform a text replace on \a aText using the find and replace criteria in
* \a aSearchData on items that support text find and replace.
*
* @param aSearchData A reference to a wxFindReplaceData object containing the
* search and replace criteria.
* @param aText A reference to a wxString object containing the text to be
* replaced.
* @param aText A reference to a wxString object containing the text to be replaced.
* @return True if \a aText was modified, otherwise false.
*/
static bool Replace( wxFindReplaceData& aSearchData, wxString& aText );
/**
* Function Replace
* performs a text replace using the find and replace criteria in \a aSearchData
* Perform a text replace using the find and replace criteria in \a aSearchData
* on items that support text find and replace.
*
* This function must be overridden for items that support text replace.
*
* @param aSearchData A reference to a wxFindReplaceData object containing the
* search and replace criteria.
* @param aAuxData A pointer to optional data required for the search or NULL
* if not used.
* @param aSearchData A reference to a wxFindReplaceData object containing the search and
* replace criteria.
* @param aAuxData A pointer to optional data required for the search or NULL if not used.
* @return True if the item text was modified, otherwise false.
*/
virtual bool Replace( wxFindReplaceData& aSearchData, void* aAuxData = NULL ) { return false; }
virtual bool Replace( wxFindReplaceData& aSearchData, void* aAuxData = nullptr )
{
return false;
}
/**
* Function IsReplaceable
* <p>
* Override this method in any derived object that supports test find and
* replace.
* </p>
* Override this method in any derived object that supports test find and replace.
*
* @return True if the item has replaceable text that can be modified using
* the find and replace dialog.
@ -498,9 +457,8 @@ public:
bool operator<( const EDA_ITEM& aItem ) const;
/**
* Function Sort
* is a helper function to be used by the C++ STL sort algorithm for sorting a STL
* container of EDA_ITEM pointers.
* Helper function to be used by the C++ STL sort algorithm for sorting a STL
* container of #EDA_ITEM pointers.
*
* @param aLeft The left hand item to compare.
* @param aRight The right hand item to compare.
@ -509,8 +467,7 @@ public:
static bool Sort( const EDA_ITEM* aLeft, const EDA_ITEM* aRight ) { return *aLeft < *aRight; }
/**
* Operator assignment
* is used to assign the members of \a aItem to another object.
* Assign the members of \a aItem to another object.
*/
EDA_ITEM& operator=( const EDA_ITEM& aItem );
@ -521,32 +478,37 @@ public:
#if defined(DEBUG)
/**
* Function Show
* is used to output the object tree, currently for debugging only.
* Output the object tree, currently for debugging only.
*
* This is pure virtual so compiler warns if somebody mucks up a derived declaration.
*
* @param nestLevel An aid to prettier tree indenting, and is the level
* of nesting of this object within the overall tree.
* @param os The ostream& to output to.
*/
virtual void Show( int nestLevel, std::ostream& os ) const = 0;
// pure virtual so compiler warns if somebody mucks up a derived declaration
void ShowDummy( std::ostream& os ) const; ///< call this if you are a lazy developer
/**
* Function NestedSpace
* outputs nested space for pretty indenting.
* @param nestLevel The nest count
* Output nested space for pretty indenting.
*
* @param nestLevel The nest count.
* @param os The ostream&, where to output
* @return std::ostream& - for continuation.
* @return The std::ostream& for continuation.
**/
static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
#endif
protected:
EDA_ITEM( EDA_ITEM* parent, KICAD_T idType );
EDA_ITEM( KICAD_T idType );
EDA_ITEM( const EDA_ITEM& base );
/**
* Function Matches
* compares \a aText against search criteria in \a aSearchData.
* Compare \a aText against search criteria in \a aSearchData.
*
* This is a helper function for simplify derived class logic.
*
* @param aText A reference to a wxString object containing the string to test.
@ -554,12 +516,27 @@ protected:
* @return True if \a aText matches the search criteria in \a aSearchData.
*/
bool Matches( const wxString& aText, wxFindReplaceData& aSearchData );
public:
const KIID m_Uuid;
protected:
STATUS_FLAGS m_status;
EDA_ITEM* m_parent; ///< Linked list: Link (parent struct)
bool m_forceVisible;
STATUS_FLAGS m_flags;
private:
/**
* Run time identification, _keep private_ so it can never be changed after a ctor
* sets it. See comment near SetType() regarding virtual functions.
*/
KICAD_T m_structType;
};
/**
* Function new_clone
* provides cloning capabilities for all Boost pointer containers of EDA_ITEM pointers.
* Provide cloning capabilities for all Boost pointer containers of #EDA_ITEM pointers.
*
* @param aItem EDA_ITEM to clone.
* @return Clone of \a aItem.

View File

@ -2,8 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2004-2014 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2004-2020 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -34,12 +33,11 @@
#include <math/box2.h>
/**
* EDA_RECT
* handles the component boundary box.
* This class is similar to wxRect, but some wxRect functions are very curious,
* and are working only if dimensions are >= 0 (not always the case in KiCad)
* and also KiCad needs some specific method.
* so I prefer this more suitable class
* Handle the component boundary box.
*
* This class is similar to wxRect, but some wxRect functions are very curious, and are
* working only if dimensions are >= 0 (not always the case in KiCad) and also KiCad needs
* some specific method which makes this a more suitable class.
*/
class EDA_RECT
{
@ -61,50 +59,44 @@ public:
wxPoint Centre() const
{
return wxPoint( m_pos.x + ( m_size.x >> 1 ),
m_pos.y + ( m_size.y >> 1 ) );
return wxPoint( m_pos.x + ( m_size.x >> 1 ), m_pos.y + ( m_size.y >> 1 ) );
}
/**
* Function Move
* moves the rectangle by the \a aMoveVector.
* @param aMoveVector A wxPoint that is the value to move this rectangle
* Move the rectangle by the \a aMoveVector.
*
* @param aMoveVector A wxPoint that is the value to move this rectangle.
*/
void Move( const wxPoint& aMoveVector );
/**
* Function Normalize
* ensures that the height ant width are positive.
* Ensures that the height ant width are positive.
*/
void Normalize();
/**
* Function Contains
* @param aPoint = the wxPoint to test
* @return true if aPoint is inside the boundary box. A point on a edge is seen as inside
* @param aPoint the wxPoint to test.
* @return true if aPoint is inside the boundary box. A point on a edge is seen as inside.
*/
bool Contains( const wxPoint& aPoint ) const;
/**
* Function Contains
* @param x = the x coordinate of the point to test
* @param y = the x coordinate of the point to test
* @param x the x coordinate of the point to test.
* @param y the x coordinate of the point to test.
* @return true if point is inside the boundary box. A point on a edge is seen as inside
*/
bool Contains( int x, int y ) const { return Contains( wxPoint( x, y ) ); }
/**
* Function Contains
* @param aRect = the EDA_RECT to test
* @return true if aRect is Contained. A common edge is seen as contained
* @param aRect the EDA_RECT to test.
* @return true if aRect is Contained. A common edge is seen as contained.
*/
bool Contains( const EDA_RECT& aRect ) const;
const wxSize GetSize() const { return m_size; }
/**
* @brief GetSizeMax
* @return the max size dimension
* @return the max size dimension.
*/
int GetSizeMax() const { return ( m_size.x > m_size.y ) ? m_size.x : m_size.y; }
@ -114,7 +106,10 @@ public:
const wxPoint GetOrigin() const { return m_pos; }
const wxPoint GetPosition() const { return m_pos; }
const wxPoint GetEnd() const { return wxPoint( m_pos.x + m_size.x, m_pos.y + m_size.y ); }
const wxPoint GetCenter() const { return wxPoint( m_pos.x + ( m_size.x / 2 ), m_pos.y + ( m_size.y / 2 ) ); }
const wxPoint GetCenter() const
{
return wxPoint( m_pos.x + ( m_size.x / 2 ), m_pos.y + ( m_size.y / 2 ) );
}
int GetWidth() const { return m_size.x; }
int GetHeight() const { return m_size.y; }
@ -203,8 +198,7 @@ public:
}
/**
* Function RevertYAxis
* Mirror the rectangle from the X axis (negate Y pos and size)
* Mirror the rectangle from the X axis (negate Y pos and size).
*/
void RevertYAxis()
{
@ -214,42 +208,40 @@ public:
}
/**
* Function Intersects
* tests for a common area between rectangles.
* Test for a common area between rectangles.
*
* @param aRect A rectangle to test intersection with.
* @return bool - true if the argument rectangle intersects this rectangle.
* @return true if the argument rectangle intersects this rectangle.
* (i.e. if the 2 rectangles have at least a common point)
*/
bool Intersects( const EDA_RECT& aRect ) const;
/**
* Tests for a common area between this rectangle,
* and a rectangle with arbitrary rotation
* Tests for a common area between this rectangle, and a rectangle with arbitrary rotation
*
* @param aRect a rectangle to test intersection with
* @param aRot rectangle rotation (in 1/10 degrees)
* @param aRect a rectangle to test intersection with.
* @param aRot rectangle rotation (in 1/10 degrees).
*/
bool Intersects( const EDA_RECT& aRect, double aRot ) const;
/**
* Function Intersects
* tests for a common area between a segment and this rectangle.
* Test for a common area between a segment and this rectangle.
*
* @param aPoint1 First point of the segment to test intersection with.
* @param aPoint2 Second point of the segment to test intersection with.
* @return bool - true if the argument segment intersects this rectangle.
* @return true if the argument segment intersects this rectangle.
* (i.e. if the segment and rectangle have at least a common point)
*/
bool Intersects( const wxPoint& aPoint1, const wxPoint& aPoint2 ) const;
/**
* Tests for intersection between a segment and this rectangle, returning the intersections
* @param aPoint1 is the first point of the segment to test intersection with
* @param aPoint2 is the second point of the segment to test intersection with
* @param aIntersection1 will be filled with the first intersection point, if any
* @param aIntersection2 will be filled with the second intersection point, if any
* @return true if the segment intersects the rect
* Test for intersection between a segment and this rectangle, returning the intersections.
*
* @param aPoint1 is the first point of the segment to test intersection with.
* @param aPoint2 is the second point of the segment to test intersection with.
* @param aIntersection1 will be filled with the first intersection point, if any.
* @param aIntersection2 will be filled with the second intersection point, if any.
* @return true if the segment intersects the rect.
*/
bool Intersects( const wxPoint& aPoint1, const wxPoint& aPoint2,
wxPoint* aIntersection1, wxPoint* aIntersection2 ) const;
@ -265,29 +257,26 @@ public:
const wxPoint FarthestPointTo( const wxPoint& aPoint ) const;
/**
* Function IntersectsCircle
* tests for a common area between a circle and this rectangle
* Test for a common area between a circle and this rectangle.
*
* @param aCenter center of the circle
* @param aRadius radius of the circle
* @param aCenter center of the circle.
* @param aRadius radius of the circle.
*/
bool IntersectsCircle( const wxPoint& aCenter, const int aRadius ) const;
/**
* IntersectsCircleEdge
* Tests for intersection between this rect and the edge (radius) of a circle
* Test for intersection between this rect and the edge (radius) of a circle.
*
* @param aCenter center of the circle
* @param aRadius radius of the circle
* @param aWidth width of the circle edge
* @param aCenter center of the circle.
* @param aRadius radius of the circle.
* @param aWidth width of the circle edge.
*/
bool IntersectsCircleEdge( const wxPoint& aCenter, const int aRadius, const int aWidth ) const;
/**
* Function operator(wxRect)
* overloads the cast operator to return a wxRect
* wxRect does not accept negative values for size, so ensure the
* wxRect size is always >= 0
* Overload the cast operator to return a wxRect.
*
* wxRect does not accept negative values for size, so ensure the wxRect size is always >= 0.
*/
operator wxRect() const
{
@ -297,9 +286,9 @@ public:
}
/**
* Function operator(BOX2I)
* overloads the cast operator to return a BOX2I
* @return BOX2I - this box shaped as a BOX2I object.
* Overload the cast operator to return a BOX2I.
*
* @return this box shaped as a BOX2I object.
*/
operator BOX2I() const
{
@ -309,56 +298,54 @@ public:
}
/**
* Function Inflate
* inflates the rectangle horizontally by \a dx and vertically by \a dy. If \a dx
* Inflate the rectangle horizontally by \a dx and vertically by \a dy. If \a dx
* and/or \a dy is negative the rectangle is deflated.
*/
EDA_RECT& Inflate( wxCoord dx, wxCoord dy );
/**
* Function Inflate
* inflates the rectangle horizontally and vertically by \a aDelta. If \a aDelta
* Inflate the rectangle horizontally and vertically by \a aDelta. If \a aDelta
* is negative the rectangle is deflated.
*/
EDA_RECT& Inflate( int aDelta );
/**
* Function Merge
* modifies the position and size of the rectangle in order to contain \a aRect. It is
* mainly used to calculate bounding boxes.
* Modify the position and size of the rectangle in order to contain \a aRect.
*
* It is mainly used to calculate bounding boxes.
*
* @param aRect The rectangle to merge with this rectangle.
*/
void Merge( const EDA_RECT& aRect );
/**
* Function Merge
* modifies the position and size of the rectangle in order to contain the given point.
* Modify the position and size of the rectangle in order to contain the given point.
*
* @param aPoint The point to merge with the rectangle.
*/
void Merge( const wxPoint& aPoint );
/**
* Function GetArea
* returns the area of the rectangle.
* Return the area of the rectangle.
*
* @return The area of the rectangle.
*/
double GetArea() const;
/**
* Function Common
* returns the area that is common with another rectangle.
* Return the area that is common with another rectangle.
*
* @param aRect is the rectangle to find the common area with.
* @return The common area rect or 0-sized rectangle if there is no intersection.
*/
EDA_RECT Common( const EDA_RECT& aRect ) const;
/**
* Function GetBoundingBoxRotated
* @return the bounding box of this, after rotation
* @param aAngle = the rotation angle in 0.1 deg.
* @param aRotCenter = the rotation point.
* useful to calculate bounding box of rotated items, when
* rotation if not k*90 degrees
* Useful to calculate bounding box of rotated items, when rotation if not k*90 degrees.
*
* @return the bounding box of this, after rotation.
* @param aAngle the rotation angle in 0.1 deg.
* @param aRotCenter the rotation point.
*/
const EDA_RECT GetBoundingBoxRotated( wxPoint aRotCenter, double aAngle ) const;
};

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Jean-Pierre Charras, jpe.charras at wanadoo.fr
* Copyright (C) 2004-2019 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2004-2020 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -111,10 +111,10 @@ struct TEXT_EFFECTS
/**
* A mix-in class (via multiple inheritance) that handles texts such as
* labels, parts, components, or footprints. Because it's a mix-in class, care
* is used to provide function names (accessors) that to not collide with function
* names likely to be seen in the combined derived classes.
* A mix-in class (via multiple inheritance) that handles texts such as labels, parts,
* components, or footprints. Because it's a mix-in class, care is used to provide
* function names (accessors) that to not collide with function names likely to be seen
* in the combined derived classes.
*/
class EDA_TEXT
{
@ -134,7 +134,8 @@ public:
/**
* Return the string actually shown after processing of the base text.
* @aParam aDepth is used to prevent infinite recusions and loops when expanding
*
* @param aDepth is used to prevent infinite recursions and loops when expanding
* text variables.
*/
virtual wxString GetShownText( int aDepth = 0 ) const { return m_shown_text; }
@ -142,6 +143,7 @@ public:
/**
* A version of GetShownText() which also indicates whether or not the text needs
* to be processed for text variables.
*
* @param processTextVars [out]
*/
wxString GetShownText( bool* processTextVars ) const
@ -165,8 +167,7 @@ public:
int GetTextThickness() const { return m_e.penwidth; };
/**
* The EffectiveTextPenWidth uses the text thickness if > 1 or
* aDefaultWidth.
* The EffectiveTextPenWidth uses the text thickness if > 1 or aDefaultWidth.
*/
int GetEffectiveTextPenWidth( int aDefaultWidth = 0 ) const;
@ -195,9 +196,8 @@ public:
bool IsMirrored() const { return m_e.Bit( TE_MIRROR ); }
/**
* @param aAllow true if ok to use multiline option, false
* if ok to use only single line text. (Single line is faster in
* calculations than multiline.)
* @param aAllow true if ok to use multiline option, false if ok to use only single line
* text. (Single line is faster in calculations than multiline.)
*/
void SetMultilineAllowed( bool aAllow ) { m_e.Bit( TE_MULTILINE, aAllow ); }
bool IsMultilineAllowed() const { return m_e.Bit( TE_MULTILINE ); }
@ -211,7 +211,7 @@ public:
/**
* Set the text effects from another instance.
*
* TEXT_EFFECTS is not exposed in the public API, but includes everything except the actual
* #TEXT_EFFECTS is not exposed in the public API, but includes everything except the actual
* text string itself.
*/
void SetEffects( const EDA_TEXT& aSrc );
@ -219,7 +219,7 @@ public:
/**
* Swap the text effects of the two involved instances.
*
* TEXT_EFFECTS is not exposed in the public API, but includes everything except the actual
* #TEXT_EFFECTS is not exposed in the public API, but includes everything except the actual
* text string itself.
*/
void SwapEffects( EDA_TEXT& aTradingPartner );
@ -267,10 +267,10 @@ public:
/**
* Print this text object to the device context \a aDC.
*
* @param aDC = the current Device Context
* @param aOffset = draw offset (usually (0,0))
* @param aColor = text color
* @param aDisplay_mode = FILLED or SKETCH
* @param aDC the current Device Context.
* @param aOffset draw offset (usually (0,0)).
* @param aColor text color.
* @param aDisplay_mode #FILLED or #SKETCH.
*/
void Print( RENDER_SETTINGS* aSettings, const wxPoint& aOffset, COLOR4D aColor,
OUTLINE_MODE aDisplay_mode = FILLED );
@ -290,9 +290,9 @@ public:
* Used in filling zones calculations
* Circles and arcs are approximated by segments
*
* @param aCornerBuffer = a buffer to store the polygon
* @param aClearanceValue = the clearance around the text bounding box
* to the real clearance value (usually near from 1.0)
* @param aCornerBuffer a buffer to store the polygon.
* @param aClearanceValue the clearance around the text bounding box
* to the real clearance value (usually near from 1.0).
*/
void TransformBoundingBoxWithClearanceToPolygon( SHAPE_POLY_SET* aCornerBuffer,
int aClearanceValue ) const;
@ -302,33 +302,34 @@ public:
/**
* Test if \a aPoint is within the bounds of this object.
*
* @param aPoint- A wxPoint to test
* @param aAccuracy - Amount to inflate the bounding box.
* @return bool - true if a hit, else false
* @param aPoint A wxPoint to test.
* @param aAccuracy Amount to inflate the bounding box.
* @return true if a hit, else false.
*/
virtual bool TextHitTest( const wxPoint& aPoint, int aAccuracy = 0 ) const;
/**
* Test if object bounding box is contained within or intersects \a aRect.
*
* @param aRect - Rect to test against.
* @param aContains - Test for containment instead of intersection if true.
* @param aAccuracy - Amount to inflate the bounding box.
* @return bool - true if a hit, else false
* @param aRect Rect to test against.
* @param aContains Test for containment instead of intersection if true.
* @param aAccuracy Amount to inflate the bounding box.
* @return true if a hit, else false.
*/
virtual bool TextHitTest( const EDA_RECT& aRect, bool aContains, int aAccuracy = 0 ) const;
/**
* @return the text length in internal units
* @param aLine : the line of text to consider.
* For single line text, this parameter is always m_Text
* @param aThickness : the stroke width of the text
* @return the text length in internal units.
* @param aLine the line of text to consider. For single line text, this parameter
* is always m_Text.
* @param aThickness the stroke width of the text.
*/
int LenSize( const wxString& aLine, int aThickness ) const;
/**
* Useful in multiline texts to calculate the full text or a line area (for zones filling,
* locate functions....)
*
* @param aLine The line of text to consider. Pass -1 for all lines.
* @param aInvertY Invert the Y axis when calculating bounding box.
* @return the rect containing the line of text (i.e. the position and the size of one line)
@ -347,20 +348,19 @@ public:
int GetInterline() const;
/**
* @return a wxString with the style name( Normal, Italic, Bold, Bold+Italic)
* @return a wxString with the style name( Normal, Italic, Bold, Bold+Italic).
*/
wxString GetTextStyleName() const;
/**
* Populate \a aPositions with the position of each line of
* a multiline text, according to the vertical justification and the
* rotation of the whole text
* Populate \a aPositions with the position of each line of a multiline text, according
* to the vertical justification and the rotation of the whole text.
*
* @param aPositions is the list to populate by the wxPoint positions
* @param aLineCount is the number of lines (not recalculated here
* for efficiency reasons
* @param aPositions is the list to populate by the wxPoint positions.
* @param aLineCount is the number of lines (not recalculated here for efficiency reasons.
*/
void GetLinePositions( std::vector<wxPoint>& aPositions, int aLineCount ) const;
/**
* Output the object to \a aFormatter in s-expression form.
*
@ -374,6 +374,18 @@ public:
virtual double GetDrawRotation() const;
private:
/**
* Print each line of this EDA_TEXT..
*
* @param aOffset draw offset (usually (0,0)).
* @param aColor text color.
* @param aFillMode FILLED or SKETCH
* @param aText the single line of text to draw.
* @param aPos the position of this line ).
*/
void printOneLineOfText( RENDER_SETTINGS* aSettings, const wxPoint& aOffset, COLOR4D aColor,
OUTLINE_MODE aFillMode, const wxString& aText, const wxPoint& aPos );
wxString m_text;
wxString m_shown_text; // Cache of unescaped text for efficient access
bool m_shown_text_has_text_var_refs;
@ -387,20 +399,6 @@ private:
TE_MULTILINE,
TE_VISIBLE,
};
private:
/**
* Print each line of this EDA_TEXT.
*
* @param aOffset = draw offset (usually (0,0))
* @param aColor = text color
* @param aFillMode = FILLED or SKETCH
* @param aText = the single line of text to draw.
* @param aPos = the position of this line ).
*/
void printOneLineOfText( RENDER_SETTINGS* aSettings, const wxPoint& aOffset, COLOR4D aColor,
OUTLINE_MODE aFillMode, const wxString& aText,
const wxPoint& aPos );
};