Add super- and subscript support to Eeschema.
Note that since the markup might exist for other reasons, it has to be turned on with a preference setting. (It goes through a set of bitflags so the same architecture can be used for other markup structures that we might want to support in the future.) Note also that this is more about engineering nomenclature than visual formatting. In that respect it's more similar to overbar than italic or bold.
This commit is contained in:
parent
52fcbeab44
commit
35c8d64f98
|
@ -41,7 +41,6 @@ set( GAL_SRCS
|
|||
gl_context_mgr.cpp
|
||||
${FONT_SRC}
|
||||
painter.cpp
|
||||
text_utils.cpp
|
||||
gal/color4d.cpp
|
||||
gal/gal_display_options.cpp
|
||||
gal/graphics_abstraction_layer.cpp
|
||||
|
|
|
@ -162,14 +162,14 @@ bool EDA_TEXT::Replace( wxFindReplaceData& aSearchData )
|
|||
}
|
||||
|
||||
|
||||
int EDA_TEXT::LenSize( const wxString& aLine, int aThickness ) const
|
||||
int EDA_TEXT::LenSize( const wxString& aLine, int aThickness, int aMarkupFlags ) const
|
||||
{
|
||||
basic_gal.SetFontItalic( IsItalic() );
|
||||
basic_gal.SetFontBold( IsBold() );
|
||||
basic_gal.SetLineWidth( (float) aThickness );
|
||||
basic_gal.SetGlyphSize( VECTOR2D( GetTextSize() ) );
|
||||
|
||||
VECTOR2D tsize = basic_gal.GetTextLineSize( aLine );
|
||||
VECTOR2D tsize = basic_gal.GetTextLineSize( aLine, aMarkupFlags );
|
||||
|
||||
return KiROUND( tsize.x );
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ int EDA_TEXT::GetInterline() const
|
|||
}
|
||||
|
||||
|
||||
EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
|
||||
EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY, int aMarkupFlags ) const
|
||||
{
|
||||
EDA_RECT rect;
|
||||
wxArrayString strings;
|
||||
|
@ -232,8 +232,10 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
|
|||
}
|
||||
|
||||
// calculate the H and V size
|
||||
int dx = KiROUND( basic_gal.GetStrokeFont().ComputeStringBoundaryLimits(
|
||||
text, VECTOR2D( GetTextSize() ), double( thickness ) ).x );
|
||||
const auto& font = basic_gal.GetStrokeFont();
|
||||
VECTOR2D size( GetTextSize() );
|
||||
double penWidth( thickness );
|
||||
int dx = KiROUND( font.ComputeStringBoundaryLimits( text, size, penWidth, aMarkupFlags ).x );
|
||||
int dy = GetInterline();
|
||||
|
||||
// Creates bounding box (rectangle) for an horizontal
|
||||
|
@ -258,9 +260,8 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
|
|||
{ // A overbar adds an extra size to the text
|
||||
// Height from the base line text of chars like [ or {
|
||||
double curr_height = GetTextHeight() * 1.15;
|
||||
int extra_height = KiROUND(
|
||||
basic_gal.GetStrokeFont().ComputeOverbarVerticalPosition( GetTextHeight(), thickness ) - curr_height );
|
||||
extra_height += thickness/2;
|
||||
int extra_height = KiROUND( font.ComputeOverbarVerticalPosition( size.y, penWidth ) - curr_height );
|
||||
extra_height += thickness / 2;
|
||||
textsize.y += extra_height;
|
||||
rect.Move( wxPoint( 0, -extra_height ) );
|
||||
}
|
||||
|
@ -272,9 +273,8 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
|
|||
for( unsigned ii = 1; ii < strings.GetCount(); ii++ )
|
||||
{
|
||||
text = strings.Item( ii );
|
||||
dx = KiROUND( basic_gal.GetStrokeFont().ComputeStringBoundaryLimits(
|
||||
text, VECTOR2D( GetTextSize() ), double( thickness ) ).x );
|
||||
textsize.x = std::max( textsize.x, dx );
|
||||
dx = KiROUND( font.ComputeStringBoundaryLimits( text, size, penWidth, aMarkupFlags ).x );
|
||||
textsize.x = std::max( textsize.x, dx );
|
||||
textsize.y += dy;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -167,12 +167,12 @@ void GAL::ResetTextAttributes()
|
|||
}
|
||||
|
||||
|
||||
VECTOR2D GAL::GetTextLineSize( const UTF8& aText ) const
|
||||
VECTOR2D GAL::GetTextLineSize( const UTF8& aText, int aMarkupFlags ) const
|
||||
{
|
||||
// Compute the X and Y size of a given text.
|
||||
// Because computeTextLineSize expects a one line text,
|
||||
// aText is expected to be only one line text.
|
||||
return strokeFont.computeTextLineSize( aText );
|
||||
return strokeFont.computeTextLineSize( aText, aMarkupFlags );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <gal/definitions.h>
|
||||
#include <gl_context_mgr.h>
|
||||
#include <geometry/shape_poly_set.h>
|
||||
#include <text_utils.h>
|
||||
#include <bitmap_base.h>
|
||||
|
||||
#include <macros.h>
|
||||
|
@ -1125,10 +1124,7 @@ void OPENGL_GAL::BitmapText( const wxString& aText, const VECTOR2D& aPosition,
|
|||
{
|
||||
wxASSERT_MSG( !IsTextMirrored(), "No support for mirrored text using bitmap fonts." );
|
||||
|
||||
auto processedText = ProcessOverbars( aText );
|
||||
const auto& text = processedText.first;
|
||||
const auto& overbars = processedText.second;
|
||||
|
||||
const UTF8 text( aText );
|
||||
// Compute text size, so it can be properly justified
|
||||
VECTOR2D textSize;
|
||||
float commonOffset;
|
||||
|
@ -1192,14 +1188,25 @@ void OPENGL_GAL::BitmapText( const wxString& aText, const VECTOR2D& aPosition,
|
|||
unsigned int c = *chIt;
|
||||
wxASSERT_MSG( c != '\n' && c != '\r', wxT( "No support for multiline bitmap text yet" ) );
|
||||
|
||||
// Handle overbar
|
||||
if( overbars[i] && !overbar )
|
||||
bool wasOverbar = overbar;
|
||||
|
||||
if( *chIt == '~' )
|
||||
{
|
||||
overbar = true; // beginning of an overbar
|
||||
if( ++chIt == end )
|
||||
break;
|
||||
|
||||
if( *chIt == '~' )
|
||||
{
|
||||
// double ~ is really a ~ so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
overbar = !overbar;
|
||||
}
|
||||
}
|
||||
else if( overbar && !overbars[i] )
|
||||
|
||||
if( wasOverbar && !overbar )
|
||||
{
|
||||
overbar = false; // end of an overbar
|
||||
drawBitmapOverbar( overbarLength, overbarHeight );
|
||||
overbarLength = 0;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
#include <gal/stroke_font.h>
|
||||
#include <gal/graphics_abstraction_layer.h>
|
||||
#include <text_utils.h>
|
||||
#include <wx/string.h>
|
||||
|
||||
|
||||
|
@ -141,12 +140,10 @@ BOX2D STROKE_FONT::computeBoundingBox( const GLYPH& aGLYPH, const VECTOR2D& aGLY
|
|||
boundingPoints.emplace_back( VECTOR2D( aGLYPHBoundingX.x, 0 ) );
|
||||
boundingPoints.emplace_back( VECTOR2D( aGLYPHBoundingX.y, 0 ) );
|
||||
|
||||
for( const auto& pointList : aGLYPH )
|
||||
for( const std::vector<VECTOR2D>& pointList : aGLYPH )
|
||||
{
|
||||
for( const auto& pt : pointList )
|
||||
{
|
||||
boundingPoints.emplace_back( aGLYPHBoundingX.x, pt.y );
|
||||
}
|
||||
for( const VECTOR2D& point : pointList )
|
||||
boundingPoints.emplace_back( aGLYPHBoundingX.x, point.y );
|
||||
}
|
||||
|
||||
boundingBox.Compute( boundingPoints );
|
||||
|
@ -155,7 +152,8 @@ BOX2D STROKE_FONT::computeBoundingBox( const GLYPH& aGLYPH, const VECTOR2D& aGLY
|
|||
}
|
||||
|
||||
|
||||
void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle )
|
||||
void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle,
|
||||
int markupFlags )
|
||||
{
|
||||
if( aText.empty() )
|
||||
return;
|
||||
|
@ -220,7 +218,7 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
|
|||
{
|
||||
size_t length = newlinePos - begin;
|
||||
|
||||
drawSingleLineText( aText.substr( begin, length ) );
|
||||
drawSingleLineText( aText.substr( begin, length ), markupFlags );
|
||||
m_gal->Translate( VECTOR2D( 0.0, lineHeight ) );
|
||||
|
||||
begin = newlinePos + 1;
|
||||
|
@ -229,15 +227,16 @@ void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRo
|
|||
|
||||
// Draw the last (or the only one) line
|
||||
if( !aText.empty() )
|
||||
drawSingleLineText( aText.substr( begin ) );
|
||||
drawSingleLineText( aText.substr( begin ), markupFlags );
|
||||
|
||||
m_gal->Restore();
|
||||
}
|
||||
|
||||
|
||||
void STROKE_FONT::drawSingleLineText( const UTF8& aText )
|
||||
void STROKE_FONT::drawSingleLineText( const UTF8& aText, int markupFlags )
|
||||
{
|
||||
double xOffset;
|
||||
double yOffset;
|
||||
VECTOR2D glyphSize( m_gal->GetGlyphSize() );
|
||||
double overbar_italic_comp = computeOverbarVerticalPosition() * ITALIC_TILT;
|
||||
|
||||
|
@ -245,7 +244,7 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
|
|||
overbar_italic_comp = -overbar_italic_comp;
|
||||
|
||||
// Compute the text size
|
||||
VECTOR2D textSize = computeTextLineSize( aText );
|
||||
VECTOR2D textSize = computeTextLineSize( aText, markupFlags );
|
||||
double half_thickness = m_gal->GetLineWidth()/2;
|
||||
|
||||
// Context needs to be saved before any transformations
|
||||
|
@ -296,13 +295,13 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
|
|||
// must not be indented on subsequent letters to ensure that the bar segments
|
||||
// overlap.
|
||||
bool last_had_overbar = false;
|
||||
auto processedText = ProcessOverbars( aText );
|
||||
const auto& text = processedText.first;
|
||||
const auto& overbars = processedText.second;
|
||||
int overbar_index = 0;
|
||||
bool in_overbar = false;
|
||||
|
||||
for( UTF8::uni_iter chIt = text.ubegin(), end = text.uend(); chIt < end; ++chIt )
|
||||
yOffset = 0;
|
||||
|
||||
for( UTF8::uni_iter chIt = aText.ubegin(), end = aText.uend(); chIt < end; ++chIt )
|
||||
{
|
||||
// Index into bounding boxes table
|
||||
int dd = *chIt - ' ';
|
||||
|
||||
// Handle tabs as locked to the nearest 4th column (counting in spaces)
|
||||
|
@ -317,6 +316,63 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
|
|||
|
||||
// Set the character to ' ' instead of the '?' for tab
|
||||
dd = 0;
|
||||
|
||||
glyphSize = m_gal->GetGlyphSize();
|
||||
yOffset = 0;
|
||||
}
|
||||
else if( *chIt == '~' )
|
||||
{
|
||||
if( ++chIt == end )
|
||||
break;
|
||||
|
||||
if( *chIt == '~' )
|
||||
{
|
||||
// double ~ is really a ~ so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
in_overbar = !in_overbar;
|
||||
}
|
||||
}
|
||||
else if( *chIt == '^' && ( markupFlags & ENABLE_SUPERSCRIPT_MARKUP ) )
|
||||
{
|
||||
if( ++chIt == end )
|
||||
break;
|
||||
|
||||
if( *chIt == '^' )
|
||||
{
|
||||
// double ^ is really a ^ so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
// single ^ starts a superscript
|
||||
dd = *chIt - ' ';
|
||||
glyphSize = m_gal->GetGlyphSize() * 0.8;
|
||||
yOffset = -m_gal->GetGlyphSize().y * 0.3;
|
||||
}
|
||||
}
|
||||
else if( *chIt == '#' && ( markupFlags & ENABLE_SUBSCRIPT_MARKUP ) )
|
||||
{
|
||||
if( ++chIt == end )
|
||||
break;
|
||||
|
||||
if( *chIt == '#' )
|
||||
{
|
||||
// double # is really a # so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
// single _ starts a subscript
|
||||
dd = *chIt - ' ';
|
||||
glyphSize = m_gal->GetGlyphSize() * 0.8;
|
||||
yOffset = m_gal->GetGlyphSize().y * 0.1;
|
||||
}
|
||||
}
|
||||
else if( *chIt == ' ' )
|
||||
{
|
||||
// space ends a super- or subscript
|
||||
glyphSize = m_gal->GetGlyphSize();
|
||||
yOffset = 0;
|
||||
}
|
||||
|
||||
if( dd >= (int) m_glyphBoundingBoxes.size() || dd < 0 )
|
||||
|
@ -325,7 +381,7 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
|
|||
GLYPH& glyph = m_glyphs[dd];
|
||||
BOX2D& bbox = m_glyphBoundingBoxes[dd];
|
||||
|
||||
if( overbars[overbar_index] )
|
||||
if( in_overbar )
|
||||
{
|
||||
double overbar_start_x = xOffset;
|
||||
double overbar_start_y = - computeOverbarVerticalPosition();
|
||||
|
@ -350,32 +406,31 @@ void STROKE_FONT::drawSingleLineText( const UTF8& aText )
|
|||
last_had_overbar = false;
|
||||
}
|
||||
|
||||
for( const auto& pointList : glyph )
|
||||
for( std::vector<VECTOR2D>& ptList : glyph )
|
||||
{
|
||||
std::deque<VECTOR2D> pointListScaled;
|
||||
std::deque<VECTOR2D> ptListScaled;
|
||||
|
||||
for( const auto& pt : pointList )
|
||||
for( VECTOR2D& pt : ptList )
|
||||
{
|
||||
VECTOR2D pointPos( pt.x * glyphSize.x + xOffset, pt.y * glyphSize.y );
|
||||
VECTOR2D scaledPt( pt.x * glyphSize.x + xOffset, pt.y * glyphSize.y + yOffset );
|
||||
|
||||
if( m_gal->IsFontItalic() )
|
||||
{
|
||||
// FIXME should be done other way - referring to the lowest Y value of point
|
||||
// because now italic fonts are translated a bit
|
||||
if( m_gal->IsTextMirrored() )
|
||||
pointPos.x += pointPos.y * STROKE_FONT::ITALIC_TILT;
|
||||
scaledPt.x += scaledPt.y * STROKE_FONT::ITALIC_TILT;
|
||||
else
|
||||
pointPos.x -= pointPos.y * STROKE_FONT::ITALIC_TILT;
|
||||
scaledPt.x -= scaledPt.y * STROKE_FONT::ITALIC_TILT;
|
||||
}
|
||||
|
||||
pointListScaled.push_back( pointPos );
|
||||
ptListScaled.push_back( scaledPt );
|
||||
}
|
||||
|
||||
m_gal->DrawPolyline( pointListScaled );
|
||||
m_gal->DrawPolyline( ptListScaled );
|
||||
}
|
||||
|
||||
xOffset += glyphSize.x * bbox.GetEnd().x;
|
||||
++overbar_index;
|
||||
}
|
||||
|
||||
m_gal->Restore();
|
||||
|
@ -399,19 +454,23 @@ double STROKE_FONT::computeOverbarVerticalPosition() const
|
|||
}
|
||||
|
||||
|
||||
VECTOR2D STROKE_FONT::computeTextLineSize( const UTF8& aText ) const
|
||||
VECTOR2D STROKE_FONT::computeTextLineSize( const UTF8& aText, int aMarkupFlags ) const
|
||||
{
|
||||
return ComputeStringBoundaryLimits( aText, m_gal->GetGlyphSize(), m_gal->GetLineWidth() );
|
||||
return ComputeStringBoundaryLimits( aText, m_gal->GetGlyphSize(), m_gal->GetLineWidth(),
|
||||
aMarkupFlags );
|
||||
}
|
||||
|
||||
|
||||
VECTOR2D STROKE_FONT::ComputeStringBoundaryLimits( const UTF8& aText, const VECTOR2D& aGlyphSize,
|
||||
double aGlyphThickness ) const
|
||||
double aGlyphThickness, int markupFlags ) const
|
||||
{
|
||||
VECTOR2D string_bbox;
|
||||
int line_count = 1;
|
||||
double maxX = 0.0, curX = 0.0;
|
||||
|
||||
double curScale = 1.0;
|
||||
bool in_overbar = false;
|
||||
|
||||
for( UTF8::uni_iter it = aText.ubegin(), end = aText.uend(); it < end; ++it )
|
||||
{
|
||||
if( *it == '\n' )
|
||||
|
@ -422,12 +481,68 @@ VECTOR2D STROKE_FONT::ComputeStringBoundaryLimits( const UTF8& aText, const VECT
|
|||
continue;
|
||||
}
|
||||
|
||||
// If it is double tilda, then it is displayed as a single tilda
|
||||
// If it is single tilda, then it is toggling overbar, so we need to skip it
|
||||
if( *it == '~' )
|
||||
// Handle tabs as locked to the nearest 4th column (counting in spaces)
|
||||
// The choice of spaces is somewhat arbitrary but sufficient for aligning text
|
||||
if( *it == '\t' )
|
||||
{
|
||||
if( ++it >= end )
|
||||
double fourSpaces = 4.0 * m_glyphBoundingBoxes[0].GetEnd().x;
|
||||
double addlSpace = fourSpaces - std::fmod( curX, fourSpaces );
|
||||
|
||||
// Add the remaining space (between 0 and 3 spaces)
|
||||
curX += addlSpace;
|
||||
|
||||
// Tab ends a super- or subscript
|
||||
curScale = 1.0;
|
||||
}
|
||||
else if( *it == '~' )
|
||||
{
|
||||
if( ++it == end )
|
||||
break;
|
||||
|
||||
if( *it == '~' )
|
||||
{
|
||||
// double ~ is really a ~ so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
// single ~ toggles overbar
|
||||
in_overbar = !in_overbar;
|
||||
}
|
||||
}
|
||||
else if( *it == '^' && ( markupFlags & ENABLE_SUPERSCRIPT_MARKUP ) )
|
||||
{
|
||||
if( ++it == end )
|
||||
break;
|
||||
|
||||
if( *it == '^' )
|
||||
{
|
||||
// double ^ is really a ^ so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
// single ^ starts a superscript
|
||||
curScale = 0.8;
|
||||
}
|
||||
}
|
||||
else if( *it == '#' && ( markupFlags & ENABLE_SUBSCRIPT_MARKUP ) )
|
||||
{
|
||||
if( ++it == end )
|
||||
break;
|
||||
|
||||
if( *it == '#' )
|
||||
{
|
||||
// double # is really a # so go ahead and process the second one
|
||||
}
|
||||
else
|
||||
{
|
||||
// single _ starts a subscript
|
||||
curScale = 0.8;
|
||||
}
|
||||
}
|
||||
else if( *it == ' ' )
|
||||
{
|
||||
// space ends a super- or subscript
|
||||
curScale = 1.0;
|
||||
}
|
||||
|
||||
// Index in the bounding boxes table
|
||||
|
@ -437,11 +552,10 @@ VECTOR2D STROKE_FONT::ComputeStringBoundaryLimits( const UTF8& aText, const VECT
|
|||
dd = '?' - ' ';
|
||||
|
||||
const BOX2D& box = m_glyphBoundingBoxes[dd];
|
||||
curX += box.GetEnd().x;
|
||||
curX += box.GetEnd().x * curScale;
|
||||
}
|
||||
|
||||
string_bbox.x = std::max( maxX, curX );
|
||||
string_bbox.x *= aGlyphSize.x;
|
||||
string_bbox.x = std::max( maxX, curX ) * aGlyphSize.x;
|
||||
string_bbox.x += aGlyphThickness;
|
||||
string_bbox.y = line_count * GetInterline( aGlyphSize.y );
|
||||
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <text_utils.h>
|
||||
|
||||
std::pair<UTF8, std::vector<bool>> ProcessOverbars( const UTF8& aText )
|
||||
{
|
||||
UTF8 text;
|
||||
std::vector<bool> flags;
|
||||
bool overbar = false;
|
||||
|
||||
for( UTF8::uni_iter chIt = aText.ubegin(), end = aText.uend(); chIt < end; ++chIt )
|
||||
{
|
||||
if( *chIt == '~' )
|
||||
{
|
||||
if( ++chIt >= end )
|
||||
break;
|
||||
|
||||
// It was a single tilda, it toggles overbar
|
||||
if( *chIt != '~' )
|
||||
overbar = !overbar;
|
||||
|
||||
// If it is a double tilda, just process the second one
|
||||
}
|
||||
|
||||
// remember: *chIt is not necessary a ASCII7 char.
|
||||
// it is an unsigned giving a multibyte char in UTF8 strings
|
||||
text += *chIt;
|
||||
|
||||
flags.push_back( overbar );
|
||||
}
|
||||
|
||||
return std::make_pair( text, flags );
|
||||
}
|
|
@ -71,6 +71,11 @@ bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataToWindow()
|
|||
m_wireWidth.SetValue( GetDefaultWireThickness() );
|
||||
m_junctionSize.SetValue( SCH_JUNCTION::GetSymbolSize() );
|
||||
m_checkShowHiddenPins->SetValue( m_frame->GetShowAllPins() );
|
||||
|
||||
int superSubFlags = KIGFX::ENABLE_SUBSCRIPT_MARKUP | KIGFX::ENABLE_SUPERSCRIPT_MARKUP;
|
||||
|
||||
m_checkSuperSub->SetValue( GetTextMarkupFlags() & superSubFlags );
|
||||
|
||||
m_checkPageLimits->SetValue( m_frame->ShowPageLimits() );
|
||||
|
||||
m_galOptsPanel->TransferDataToWindow();
|
||||
|
@ -111,6 +116,14 @@ bool PANEL_EESCHEMA_DISPLAY_OPTIONS::TransferDataFromWindow()
|
|||
|
||||
// Update canvas
|
||||
m_frame->GetRenderSettings()->m_ShowHiddenPins = m_checkShowHiddenPins->GetValue();
|
||||
|
||||
int superSubFlags = KIGFX::ENABLE_SUBSCRIPT_MARKUP | KIGFX::ENABLE_SUPERSCRIPT_MARKUP;
|
||||
|
||||
if( m_checkSuperSub->GetValue() )
|
||||
SetTextMarkupFlags( GetTextMarkupFlags() | superSubFlags );
|
||||
else
|
||||
SetTextMarkupFlags( GetTextMarkupFlags() & ~superSubFlags );
|
||||
|
||||
m_frame->GetRenderSettings()->SetShowPageLimits( m_checkPageLimits->GetValue() );
|
||||
m_frame->GetCanvas()->GetView()->MarkDirty();
|
||||
m_frame->GetCanvas()->GetView()->UpdateAllItems( KIGFX::REPAINT );
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Dec 30 2017)
|
||||
// C++ code generated with wxFormBuilder (version Oct 26 2018)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
|
@ -9,103 +9,106 @@
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE::PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
|
||||
PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE::PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
|
||||
{
|
||||
wxBoxSizer* bPanelSizer;
|
||||
bPanelSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
m_galOptionsSizer = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
|
||||
|
||||
bPanelSizer->Add( m_galOptionsSizer, 1, wxEXPAND|wxLEFT, 5 );
|
||||
|
||||
|
||||
wxBoxSizer* bRightColumn;
|
||||
bRightColumn = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
|
||||
wxStaticBoxSizer* sbSizer2;
|
||||
sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Dimensions") ), wxVERTICAL );
|
||||
|
||||
|
||||
wxFlexGridSizer* fgSizer32;
|
||||
fgSizer32 = new wxFlexGridSizer( 0, 3, 3, 0 );
|
||||
fgSizer32->AddGrowableCol( 1 );
|
||||
fgSizer32->SetFlexibleDirection( wxBOTH );
|
||||
fgSizer32->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
|
||||
m_busWidthLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("&Bus thickness:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_busWidthLabel->Wrap( -1 );
|
||||
fgSizer32->Add( m_busWidthLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_busWidthCtrl = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP );
|
||||
fgSizer32->Add( m_busWidthCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
m_busWidthUnits = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_busWidthUnits->Wrap( -1 );
|
||||
fgSizer32->Add( m_busWidthUnits, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_wireWidthLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("&Wire thickness:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_wireWidthLabel->Wrap( -1 );
|
||||
fgSizer32->Add( m_wireWidthLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_wireWidthCtrl = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP );
|
||||
fgSizer32->Add( m_wireWidthCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
m_wireWidthUnits = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_wireWidthUnits->Wrap( -1 );
|
||||
fgSizer32->Add( m_wireWidthUnits, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_jctSizeLabel = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("Junction size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_jctSizeLabel->Wrap( -1 );
|
||||
fgSizer32->Add( m_jctSizeLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
m_jctSizeCtrl = new wxTextCtrl( sbSizer2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizer32->Add( m_jctSizeCtrl, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_jctSizeUnits = new wxStaticText( sbSizer2->GetStaticBox(), wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_jctSizeUnits->Wrap( -1 );
|
||||
fgSizer32->Add( m_jctSizeUnits, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
sbSizer2->Add( fgSizer32, 0, wxBOTTOM|wxRIGHT|wxEXPAND, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
bRightColumn->Add( sbSizer2, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 );
|
||||
|
||||
|
||||
wxStaticBoxSizer* sbSizer1;
|
||||
sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Annotations") ), wxVERTICAL );
|
||||
|
||||
|
||||
wxBoxSizer* bSizer6;
|
||||
bSizer6 = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
|
||||
m_staticText26 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Symbol unit notation:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText26->Wrap( -1 );
|
||||
bSizer6->Add( m_staticText26, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
wxString m_choiceSeparatorRefIdChoices[] = { _("A"), _(".A"), _("-A"), _("_A"), _(".1"), _("-1"), _("_1") };
|
||||
int m_choiceSeparatorRefIdNChoices = sizeof( m_choiceSeparatorRefIdChoices ) / sizeof( wxString );
|
||||
m_choiceSeparatorRefId = new wxChoice( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceSeparatorRefIdNChoices, m_choiceSeparatorRefIdChoices, 0 );
|
||||
m_choiceSeparatorRefId->SetSelection( 0 );
|
||||
bSizer6->Add( m_choiceSeparatorRefId, 1, wxEXPAND|wxRIGHT, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
sbSizer1->Add( bSizer6, 0, wxEXPAND|wxRIGHT, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
sbSizer1->Add( 0, 0, 0, wxEXPAND|wxTOP|wxBOTTOM, 10 );
|
||||
|
||||
|
||||
m_checkShowHiddenPins = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("S&how hidden pins"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizer1->Add( m_checkShowHiddenPins, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
m_checkSuperSub = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Enable superscript/subscript markup"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizer1->Add( m_checkSuperSub, 0, wxALL, 5 );
|
||||
|
||||
m_checkPageLimits = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Show page limi&ts"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_checkPageLimits->SetValue(true);
|
||||
m_checkPageLimits->SetValue(true);
|
||||
sbSizer1->Add( m_checkPageLimits, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
bRightColumn->Add( sbSizer1, 1, wxEXPAND|wxTOP|wxRIGHT, 5 );
|
||||
|
||||
|
||||
|
||||
|
||||
bPanelSizer->Add( bRightColumn, 1, wxEXPAND|wxRIGHT|wxLEFT, 10 );
|
||||
|
||||
|
||||
|
||||
|
||||
this->SetSizer( bPanelSizer );
|
||||
this->Layout();
|
||||
bPanelSizer->Fit( this );
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="13" />
|
||||
<FileVersion major="1" minor="15" />
|
||||
<object class="Project" expanded="1">
|
||||
<property name="class_decoration"></property>
|
||||
<property name="code_generation">C++</property>
|
||||
|
@ -14,6 +14,7 @@
|
|||
<property name="file">panel_eeschema_display_options_base</property>
|
||||
<property name="first_id">1000</property>
|
||||
<property name="help_provider">none</property>
|
||||
<property name="indent_with_spaces"></property>
|
||||
<property name="internationalize">1</property>
|
||||
<property name="name">PanelEeschemaDisplayOptions</property>
|
||||
<property name="namespace"></property>
|
||||
|
@ -48,36 +49,6 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||
<event name="OnAuiFindManager"></event>
|
||||
<event name="OnAuiPaneButton"></event>
|
||||
<event name="OnAuiPaneClose"></event>
|
||||
<event name="OnAuiPaneMaximize"></event>
|
||||
<event name="OnAuiPaneRestore"></event>
|
||||
<event name="OnAuiRender"></event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnInitDialog"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bPanelSizer</property>
|
||||
|
@ -115,7 +86,6 @@
|
|||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="parent">1</property>
|
||||
<property name="permission">none</property>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxBOTTOM|wxRIGHT|wxEXPAND</property>
|
||||
|
@ -165,6 +135,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">&Bus thickness:</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -190,29 +161,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -277,33 +225,6 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -339,6 +260,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">mils</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -364,29 +286,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -422,6 +321,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">&Wire thickness:</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -447,29 +347,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -534,33 +411,6 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -596,6 +446,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">mils</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -621,29 +472,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
|
@ -679,6 +507,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Junction size:</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -704,29 +533,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
|
@ -791,33 +597,6 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
|
@ -853,6 +632,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">mils</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -878,29 +658,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
@ -919,7 +676,6 @@
|
|||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="parent">1</property>
|
||||
<property name="permission">none</property>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxRIGHT</property>
|
||||
|
@ -962,6 +718,7 @@
|
|||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Symbol unit notation:</property>
|
||||
<property name="markup">0</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
|
@ -987,29 +744,6 @@
|
|||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -1074,30 +808,6 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnChoice"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
@ -1174,30 +884,70 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxCheckBox" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="checked">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Enable superscript/subscript markup</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_checkSuperSub</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="0">
|
||||
|
@ -1262,30 +1012,6 @@
|
|||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnCheckBox"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Dec 30 2017)
|
||||
// C++ code generated with wxFormBuilder (version Oct 26 2018)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE_H__
|
||||
#define __PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE_H__
|
||||
#pragma once
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
|
@ -29,10 +28,10 @@
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE : public wxPanel
|
||||
class PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE : public wxPanel
|
||||
{
|
||||
private:
|
||||
|
||||
|
||||
protected:
|
||||
wxBoxSizer* m_galOptionsSizer;
|
||||
wxStaticText* m_busWidthLabel;
|
||||
|
@ -47,13 +46,13 @@ class PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE : public wxPanel
|
|||
wxStaticText* m_staticText26;
|
||||
wxChoice* m_choiceSeparatorRefId;
|
||||
wxCheckBox* m_checkShowHiddenPins;
|
||||
wxCheckBox* m_checkSuperSub;
|
||||
wxCheckBox* m_checkPageLimits;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
|
||||
|
||||
PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
|
||||
~PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE();
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif //__PANEL_EESCHEMA_DISPLAY_OPTIONS_BASE_H__
|
||||
|
|
|
@ -51,6 +51,7 @@ static int s_defaultBusThickness = DEFAULTBUSTHICKNESS;
|
|||
static int s_defaultWireThickness = DEFAULTDRAWLINETHICKNESS;
|
||||
static int s_defaultTextSize = DEFAULT_SIZE_TEXT;
|
||||
static int s_drawDefaultLineThickness = -1;
|
||||
static int s_textMarkupFlags = 0;
|
||||
|
||||
|
||||
int GetDefaultBusThickness()
|
||||
|
@ -95,6 +96,18 @@ int GetDefaultLineThickness()
|
|||
}
|
||||
|
||||
|
||||
void SetTextMarkupFlags( int aMarkupFlags )
|
||||
{
|
||||
s_textMarkupFlags = aMarkupFlags;
|
||||
}
|
||||
|
||||
|
||||
int GetTextMarkupFlags()
|
||||
{
|
||||
return s_textMarkupFlags;
|
||||
}
|
||||
|
||||
|
||||
void SetDefaultLineThickness( int aThickness )
|
||||
{
|
||||
s_drawDefaultLineThickness = std::max( 1, aThickness );
|
||||
|
@ -249,6 +262,7 @@ static const wxChar DefaultJctSizeEntry[] = wxT( "DefaultJunctionSize" )
|
|||
static const wxChar ShowHiddenPinsEntry[] = wxT( "ShowHiddenPins" );
|
||||
static const wxChar HorzVertLinesOnlyEntry[] = wxT( "HorizVertLinesOnly" );
|
||||
static const wxChar FieldNamesEntry[] = wxT( "FieldNames" );
|
||||
static const wxString TextMarkupFlagsEntry = "TextMarkupFlags";
|
||||
static const wxString ShowPageLimitsEntry = "ShowPageLimits";
|
||||
static const wxString UnitsEntry = "Units";
|
||||
static const wxString PrintMonochromeEntry = "PrintMonochrome";
|
||||
|
@ -325,6 +339,8 @@ void SCH_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg )
|
|||
|
||||
SetDefaultWireThickness( (int) tmp );
|
||||
|
||||
SetTextMarkupFlags( (int) aCfg->Read( TextMarkupFlagsEntry, 0L ) );
|
||||
|
||||
if( aCfg->Read( DefaultJctSizeEntry, &tmp ) )
|
||||
SCH_JUNCTION::SetSymbolSize( (int) tmp );
|
||||
|
||||
|
@ -389,6 +405,8 @@ void SCH_EDIT_FRAME::SaveSettings( wxConfigBase* aCfg )
|
|||
record.Replace( wxT(" "), wxT(" "), true ); // double space to single
|
||||
|
||||
aCfg->Write( FieldNamesEntry, record );
|
||||
|
||||
aCfg->Write( TextMarkupFlagsEntry, GetTextMarkupFlags() );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -120,6 +120,9 @@ void SetDefaultBusThickness( int aThickness );
|
|||
int GetDefaultWireThickness();
|
||||
void SetDefaultWireThickness( int aThickness );
|
||||
|
||||
int GetTextMarkupFlags();
|
||||
void SetTextMarkupFlags( int aMarkupFlags );
|
||||
|
||||
COLOR4D GetLayerColor( SCH_LAYER_ID aLayer );
|
||||
void SetLayerColor( COLOR4D aColor, SCH_LAYER_ID aLayer );
|
||||
|
||||
|
|
|
@ -317,7 +317,7 @@ const EDA_RECT LIB_FIELD::GetBoundingBox() const
|
|||
/* Y coordinates for LIB_ITEMS are bottom to top, so we must invert the Y position when
|
||||
* calling GetTextBox() that works using top to bottom Y axis orientation.
|
||||
*/
|
||||
EDA_RECT rect = GetTextBox( -1, -1, true );
|
||||
EDA_RECT rect = GetTextBox( -1, -1, true, GetTextMarkupFlags() );
|
||||
rect.RevertYAxis();
|
||||
|
||||
// We are using now a bottom to top Y axis.
|
||||
|
|
|
@ -273,7 +273,7 @@ const EDA_RECT LIB_TEXT::GetBoundingBox() const
|
|||
/* Y coordinates for LIB_ITEMS are bottom to top, so we must invert the Y position when
|
||||
* calling GetTextBox() that works using top to bottom Y axis orientation.
|
||||
*/
|
||||
EDA_RECT rect = GetTextBox( -1, -1, true );
|
||||
EDA_RECT rect = GetTextBox( -1, -1, true, GetTextMarkupFlags() );
|
||||
rect.RevertYAxis();
|
||||
|
||||
// We are using now a bottom to top Y axis.
|
||||
|
|
|
@ -208,10 +208,10 @@ const EDA_RECT SCH_FIELD::GetBoundingBox() const
|
|||
SCH_FIELD text( *this ); // Make a local copy to change text
|
||||
// because GetBoundingBox() is const
|
||||
text.SetText( GetFullyQualifiedText() );
|
||||
rect = text.GetTextBox( -1, linewidth );
|
||||
rect = text.GetTextBox( -1, linewidth, false, GetTextMarkupFlags() );
|
||||
}
|
||||
else
|
||||
rect = GetTextBox( -1, linewidth );
|
||||
rect = GetTextBox( -1, linewidth, false, GetTextMarkupFlags() );
|
||||
|
||||
// Calculate the bounding box position relative to the component:
|
||||
wxPoint origin = parentComponent->GetPosition();
|
||||
|
|
|
@ -300,6 +300,12 @@ float SCH_PAINTER::getTextThickness( const SCH_TEXT* aItem, bool aDrawingShadows
|
|||
}
|
||||
|
||||
|
||||
void SCH_PAINTER::strokeText( const wxString& aText, const VECTOR2D& aPosition, double aAngle )
|
||||
{
|
||||
m_gal->StrokeText( aText, aPosition, aAngle, GetTextMarkupFlags() );
|
||||
}
|
||||
|
||||
|
||||
void SCH_PAINTER::draw( LIB_PART *aPart, int aLayer, bool aDrawFields, int aUnit, int aConvert )
|
||||
{
|
||||
if( !aUnit )
|
||||
|
@ -536,7 +542,7 @@ void SCH_PAINTER::draw( LIB_FIELD *aField, int aLayer )
|
|||
auto pos = mapCoords( aField->GetPosition() );
|
||||
double orient = aField->GetTextAngleRadians();
|
||||
|
||||
m_gal->StrokeText( aField->GetText(), pos, orient );
|
||||
strokeText( aField->GetText(), pos, orient );
|
||||
|
||||
// Draw the umbilical line
|
||||
if( aField->IsMoving() && m_schSettings.m_ShowUmbilicals )
|
||||
|
@ -582,7 +588,7 @@ void SCH_PAINTER::draw( LIB_TEXT *aText, int aLayer )
|
|||
m_gal->SetGlyphSize( VECTOR2D( aText->GetTextSize() ) );
|
||||
m_gal->SetFontBold( aText->IsBold() );
|
||||
m_gal->SetFontItalic( aText->IsItalic() );
|
||||
m_gal->StrokeText( aText->GetText(), pos, orient );
|
||||
strokeText( aText->GetText(), pos, orient );
|
||||
}
|
||||
|
||||
|
||||
|
@ -886,28 +892,28 @@ void SCH_PAINTER::draw( LIB_PIN *aPin, int aLayer )
|
|||
SET_DC( INSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_RIGHT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText( text[INSIDE], pos + VECTOR2D( -insideOffset - len, 0 ), 0 );
|
||||
strokeText( text[INSIDE], pos + VECTOR2D( -insideOffset - len, 0 ), 0 );
|
||||
}
|
||||
if( size[OUTSIDE] )
|
||||
{
|
||||
SET_DC( OUTSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText( text[OUTSIDE], pos + VECTOR2D( outsideOffset, 0 ), 0 );
|
||||
strokeText( text[OUTSIDE], pos + VECTOR2D( outsideOffset, 0 ), 0 );
|
||||
}
|
||||
if( size[ABOVE] )
|
||||
{
|
||||
SET_DC( ABOVE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_BOTTOM );
|
||||
m_gal->StrokeText( text[ABOVE], pos + VECTOR2D( -len / 2.0, -aboveOffset ), 0 );
|
||||
strokeText( text[ABOVE], pos + VECTOR2D( -len / 2.0, -aboveOffset ), 0 );
|
||||
}
|
||||
if( size[BELOW] )
|
||||
{
|
||||
SET_DC( BELOW );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_TOP );
|
||||
m_gal->StrokeText( text[BELOW], pos + VECTOR2D( -len / 2.0, belowOffset ), 0 );
|
||||
strokeText( text[BELOW], pos + VECTOR2D( -len / 2.0, belowOffset ), 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -918,28 +924,28 @@ void SCH_PAINTER::draw( LIB_PIN *aPin, int aLayer )
|
|||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
|
||||
m_gal->StrokeText( text[INSIDE], pos + VECTOR2D( insideOffset + len, 0 ), 0 );
|
||||
strokeText( text[INSIDE], pos + VECTOR2D( insideOffset + len, 0 ), 0 );
|
||||
}
|
||||
if( size[OUTSIDE] )
|
||||
{
|
||||
SET_DC( OUTSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_RIGHT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText( text[OUTSIDE], pos + VECTOR2D( -outsideOffset, 0 ), 0 );
|
||||
strokeText( text[OUTSIDE], pos + VECTOR2D( -outsideOffset, 0 ), 0 );
|
||||
}
|
||||
if( size[ABOVE] )
|
||||
{
|
||||
SET_DC( ABOVE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_BOTTOM );
|
||||
m_gal->StrokeText( text[ABOVE], pos + VECTOR2D( len / 2.0, -aboveOffset ), 0 );
|
||||
strokeText( text[ABOVE], pos + VECTOR2D( len / 2.0, -aboveOffset ), 0 );
|
||||
}
|
||||
if( size[BELOW] )
|
||||
{
|
||||
SET_DC( BELOW );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_TOP );
|
||||
m_gal->StrokeText( text[BELOW], pos + VECTOR2D( len / 2.0, belowOffset ), 0 );
|
||||
strokeText( text[BELOW], pos + VECTOR2D( len / 2.0, belowOffset ), 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -949,28 +955,28 @@ void SCH_PAINTER::draw( LIB_PIN *aPin, int aLayer )
|
|||
SET_DC( INSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_RIGHT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText ( text[INSIDE], pos + VECTOR2D( 0, insideOffset + len ), M_PI / 2);
|
||||
strokeText ( text[INSIDE], pos + VECTOR2D( 0, insideOffset + len ), M_PI / 2);
|
||||
}
|
||||
if( size[OUTSIDE] )
|
||||
{
|
||||
SET_DC( OUTSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText ( text[OUTSIDE], pos + VECTOR2D( 0, -outsideOffset ), M_PI / 2);
|
||||
strokeText ( text[OUTSIDE], pos + VECTOR2D( 0, -outsideOffset ), M_PI / 2);
|
||||
}
|
||||
if( size[ABOVE] )
|
||||
{
|
||||
SET_DC( ABOVE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_BOTTOM );
|
||||
m_gal->StrokeText( text[ABOVE], pos + VECTOR2D( -aboveOffset, len / 2.0 ), M_PI / 2 );
|
||||
strokeText( text[ABOVE], pos + VECTOR2D( -aboveOffset, len / 2.0 ), M_PI / 2 );
|
||||
}
|
||||
if( size[BELOW] )
|
||||
{
|
||||
SET_DC( BELOW );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_TOP );
|
||||
m_gal->StrokeText( text[BELOW], pos + VECTOR2D( belowOffset, len / 2.0 ), M_PI / 2 );
|
||||
strokeText( text[BELOW], pos + VECTOR2D( belowOffset, len / 2.0 ), M_PI / 2 );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -980,28 +986,28 @@ void SCH_PAINTER::draw( LIB_PIN *aPin, int aLayer )
|
|||
SET_DC( INSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText ( text[INSIDE], pos + VECTOR2D( 0, -insideOffset - len ), M_PI / 2);
|
||||
strokeText ( text[INSIDE], pos + VECTOR2D( 0, -insideOffset - len ), M_PI / 2);
|
||||
}
|
||||
if( size[OUTSIDE] )
|
||||
{
|
||||
SET_DC( OUTSIDE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_RIGHT );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_CENTER );
|
||||
m_gal->StrokeText ( text[OUTSIDE], pos + VECTOR2D( 0, outsideOffset ), M_PI / 2);
|
||||
strokeText ( text[OUTSIDE], pos + VECTOR2D( 0, outsideOffset ), M_PI / 2);
|
||||
}
|
||||
if( size[ABOVE] )
|
||||
{
|
||||
SET_DC( ABOVE );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_BOTTOM );
|
||||
m_gal->StrokeText( text[ABOVE], pos + VECTOR2D( -aboveOffset, -len / 2.0 ), M_PI / 2 );
|
||||
strokeText( text[ABOVE], pos + VECTOR2D( -aboveOffset, -len / 2.0 ), M_PI / 2 );
|
||||
}
|
||||
if( size[BELOW] )
|
||||
{
|
||||
SET_DC( BELOW );
|
||||
m_gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_CENTER );
|
||||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_TOP );
|
||||
m_gal->StrokeText( text[BELOW], pos + VECTOR2D( belowOffset, -len / 2.0 ), M_PI / 2 );
|
||||
strokeText( text[BELOW], pos + VECTOR2D( belowOffset, -len / 2.0 ), M_PI / 2 );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1206,7 +1212,7 @@ void SCH_PAINTER::draw( SCH_TEXT *aText, int aLayer )
|
|||
}
|
||||
|
||||
if( !shownText.IsEmpty() )
|
||||
m_gal->StrokeText( shownText, text_offset, aText->GetTextAngleRadians() );
|
||||
strokeText( shownText, text_offset, aText->GetTextAngleRadians() );
|
||||
|
||||
if( aText->IsDangling() )
|
||||
drawDanglingSymbol( aText->GetTextPos(), drawingShadows );
|
||||
|
@ -1373,7 +1379,7 @@ void SCH_PAINTER::draw( SCH_FIELD *aField, int aLayer )
|
|||
m_gal->SetFontItalic( aField->IsItalic() );
|
||||
m_gal->SetTextMirrored( aField->IsMirrored() );
|
||||
m_gal->SetLineWidth( getLineWidth( aField, drawingShadows ) );
|
||||
m_gal->StrokeText( aField->GetFullyQualifiedText(), textpos, orient == TEXT_ANGLE_VERT ? M_PI/2 : 0 );
|
||||
strokeText( aField->GetFullyQualifiedText(), textpos, orient == TEXT_ANGLE_VERT ? M_PI/2 : 0 );
|
||||
|
||||
// Draw the umbilical line
|
||||
if( aField->IsMoving() )
|
||||
|
@ -1548,7 +1554,7 @@ void SCH_PAINTER::draw( SCH_SHEET *aSheet, int aLayer )
|
|||
m_gal->SetFontBold( false );
|
||||
m_gal->SetFontItalic( false );
|
||||
|
||||
m_gal->StrokeText( text, pos_sheetname, nameAngle );
|
||||
strokeText( text, pos_sheetname, nameAngle );
|
||||
|
||||
txtSize = aSheet->GetFileNameSize();
|
||||
m_gal->SetGlyphSize( VECTOR2D( txtSize, txtSize ) );
|
||||
|
@ -1556,7 +1562,7 @@ void SCH_PAINTER::draw( SCH_SHEET *aSheet, int aLayer )
|
|||
m_gal->SetVerticalJustify( GR_TEXT_VJUSTIFY_TOP );
|
||||
|
||||
text = wxT( "File: " ) + aSheet->GetFileName();
|
||||
m_gal->StrokeText( text, pos_filename, nameAngle );
|
||||
strokeText( text, pos_filename, nameAngle );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -171,6 +171,7 @@ private:
|
|||
bool setDeviceColors( const LIB_ITEM* aItem, int aLayer );
|
||||
|
||||
void triLine ( const VECTOR2D &a, const VECTOR2D &b, const VECTOR2D &c );
|
||||
void strokeText( const wxString& aText, const VECTOR2D& aPosition, double aRotationAngle );
|
||||
|
||||
SCH_RENDER_SETTINGS m_schSettings;
|
||||
};
|
||||
|
|
|
@ -427,7 +427,7 @@ const EDA_RECT SCH_TEXT::GetBoundingBox() const
|
|||
|
||||
linewidth = Clamp_Text_PenSize( linewidth, GetTextSize(), IsBold() );
|
||||
|
||||
EDA_RECT rect = GetTextBox( -1, linewidth );
|
||||
EDA_RECT rect = GetTextBox( -1, linewidth, false, GetTextMarkupFlags() );
|
||||
|
||||
if( GetTextAngle() != 0 ) // Rotate rect
|
||||
{
|
||||
|
@ -694,7 +694,7 @@ bool SCH_LABEL::IsType( const KICAD_T aScanTypes[] )
|
|||
const EDA_RECT SCH_LABEL::GetBoundingBox() const
|
||||
{
|
||||
int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness();
|
||||
EDA_RECT rect = GetTextBox( -1, linewidth );
|
||||
EDA_RECT rect = GetTextBox( -1, linewidth, false, GetTextMarkupFlags() );
|
||||
|
||||
if( GetTextAngle() != 0.0 )
|
||||
{
|
||||
|
@ -850,7 +850,7 @@ void SCH_GLOBALLABEL::CreateGraphicShape( std::vector <wxPoint>& aPoints, const
|
|||
|
||||
aPoints.clear();
|
||||
|
||||
int symb_len = LenSize( GetShownText(), linewidth ) + ( TXT_MARGIN * 2 );
|
||||
int symb_len = LenSize( GetShownText(), linewidth, GetTextMarkupFlags() ) + ( TXT_MARGIN * 2 );
|
||||
|
||||
// Create outline shape : 6 points
|
||||
int x = symb_len + linewidth + 3;
|
||||
|
@ -947,7 +947,7 @@ const EDA_RECT SCH_GLOBALLABEL::GetBoundingBox() const
|
|||
height = ( (GetTextHeight() * 15) / 10 ) + width + 2 * TXT_MARGIN;
|
||||
|
||||
// text X size add height for triangular shapes(bidirectional)
|
||||
length = LenSize( GetShownText(), width ) + height + DANGLING_SYMBOL_SIZE;
|
||||
length = LenSize( GetShownText(), width, GetTextMarkupFlags() ) + height + DANGLING_SYMBOL_SIZE;
|
||||
|
||||
switch( GetLabelSpinStyle() ) // respect orientation
|
||||
{
|
||||
|
@ -1109,7 +1109,7 @@ const EDA_RECT SCH_HIERLABEL::GetBoundingBox() const
|
|||
int width = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness();
|
||||
|
||||
height = GetTextHeight() + width + 2 * TXT_MARGIN;
|
||||
length = LenSize( GetShownText(), width )
|
||||
length = LenSize( GetShownText(), width, GetTextMarkupFlags() )
|
||||
+ height // add height for triangular shapes
|
||||
+ 2 * DANGLING_SYMBOL_SIZE;
|
||||
|
||||
|
|
|
@ -303,8 +303,10 @@ public:
|
|||
* @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
|
||||
* @param aMarkupFlags a flagset of MARKUP_FLAG enums indicating which markup tokens should
|
||||
* be processed
|
||||
*/
|
||||
int LenSize( const wxString& aLine, int aThickness ) const;
|
||||
int LenSize( const wxString& aLine, int aThickness, int aMarkupFlags ) const;
|
||||
|
||||
/**
|
||||
* Function GetTextBox
|
||||
|
@ -321,8 +323,11 @@ public:
|
|||
* @param aThickness Overrides the current penwidth when greater than 0.
|
||||
* This is needed when the current penwidth is 0 and a default penwidth is used.
|
||||
* @param aInvertY Invert the Y axis when calculating bounding box.
|
||||
* @param aMarkupFlags a flagset of MARKUP_FLAG enums indicating which markup tokens should
|
||||
* be processed
|
||||
*/
|
||||
EDA_RECT GetTextBox( int aLine = -1, int aThickness = -1, bool aInvertY = false ) const;
|
||||
EDA_RECT GetTextBox( int aLine = -1, int aThickness = -1, bool aInvertY = false,
|
||||
int aMarkupFlags = 0 ) const;
|
||||
|
||||
/**
|
||||
* Return the distance between two lines of text.
|
||||
|
|
|
@ -46,6 +46,12 @@ class BITMAP_BASE;
|
|||
namespace KIGFX
|
||||
{
|
||||
|
||||
enum TEXT_MARKUP_FLAGS
|
||||
{
|
||||
ENABLE_SUBSCRIPT_MARKUP = 1 << 0,
|
||||
ENABLE_SUPERSCRIPT_MARKUP = 1 << 1
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Class GAL is the abstract interface for drawing on a 2D-surface.
|
||||
*
|
||||
|
@ -335,11 +341,12 @@ public:
|
|||
* @param aText is the text to be drawn.
|
||||
* @param aPosition is the text position in world coordinates.
|
||||
* @param aRotationAngle is the text rotation angle.
|
||||
* @param aMarkupFlags a bitset of TEXT_MARKUP_FLAGS.
|
||||
*/
|
||||
virtual void StrokeText( const wxString& aText, const VECTOR2D& aPosition,
|
||||
double aRotationAngle )
|
||||
double aRotationAngle, int aMarkupFlags = 0 )
|
||||
{
|
||||
strokeFont.Draw( aText, aPosition, aRotationAngle );
|
||||
strokeFont.Draw( aText, aPosition, aRotationAngle, aMarkupFlags );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -370,9 +377,10 @@ public:
|
|||
* a only one line text.
|
||||
*
|
||||
* @param aText is the text string (one line).
|
||||
* @param aMarkupFlags a bitset of TEXT_MARKUP_FLAGS.
|
||||
* @return is the text size.
|
||||
*/
|
||||
VECTOR2D GetTextLineSize( const UTF8& aText ) const;
|
||||
VECTOR2D GetTextLineSize( const UTF8& aText, int aMarkupFlags = 0 ) const;
|
||||
|
||||
/**
|
||||
* Compute the vertical position of an overbar, sometimes used in texts.
|
||||
|
|
|
@ -73,8 +73,11 @@ public:
|
|||
* @param aText is the text to be drawn.
|
||||
* @param aPosition is the text position in world coordinates.
|
||||
* @param aRotationAngle is the text rotation angle in radians.
|
||||
* @param markupFlags a flagset of MARKUP_FLAG enums indicating which markup tokens should
|
||||
* be processed
|
||||
*/
|
||||
void Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle );
|
||||
void Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle,
|
||||
int markupFlags );
|
||||
|
||||
/**
|
||||
* Function SetGAL
|
||||
|
@ -90,10 +93,12 @@ public:
|
|||
* Compute the boundary limits of aText (the bounding box of all shapes).
|
||||
* The overbar and alignment are not taken in account, '~' characters are skipped.
|
||||
*
|
||||
* @param markupFlags a flagset of MARKUP_FLAG enums indicating which markup tokens should
|
||||
* be processed
|
||||
* @return a VECTOR2D giving the width and height of text.
|
||||
*/
|
||||
VECTOR2D ComputeStringBoundaryLimits( const UTF8& aText, const VECTOR2D& aGlyphSize,
|
||||
double aGlyphThickness ) const;
|
||||
double aGlyphThickness, int markupFlags ) const;
|
||||
|
||||
/**
|
||||
* Compute the vertical position of an overbar, sometimes used in texts.
|
||||
|
@ -124,9 +129,10 @@ private:
|
|||
* a only one line text.
|
||||
*
|
||||
* @param aText is the text string (one line).
|
||||
* @param aMarkupFlags a bitset of TEXT_MARKUP_FLAGS.
|
||||
* @return the text size.
|
||||
*/
|
||||
VECTOR2D computeTextLineSize( const UTF8& aText ) const;
|
||||
VECTOR2D computeTextLineSize( const UTF8& aText, int aMarkupFlags ) const;
|
||||
|
||||
/**
|
||||
* Compute the vertical position of an overbar, sometimes used in texts.
|
||||
|
@ -150,7 +156,7 @@ private:
|
|||
*
|
||||
* @param aText is the text to be drawn.
|
||||
*/
|
||||
void drawSingleLineText( const UTF8& aText );
|
||||
void drawSingleLineText( const UTF8& aText, int markupFlags );
|
||||
|
||||
/**
|
||||
* @brief Returns number of lines for a given text.
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KICAD, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef TEXT_UTILS_H
|
||||
#define TEXT_UTILS_H
|
||||
|
||||
#include <utf8.h>
|
||||
#include <vector>
|
||||
|
||||
/**
|
||||
* Processes a text to extract the raw text and overbar flags.
|
||||
* @param aText is the text to be processed.
|
||||
* @return Pair of raw text and overbar enable flags for each character in the raw text.
|
||||
*/
|
||||
std::pair<UTF8, std::vector<bool>> ProcessOverbars( const UTF8& aText );
|
||||
|
||||
#endif /* TEXT_UTILS_H */
|
Loading…
Reference in New Issue