Commit 66f1de70 authored by Marco Mattila's avatar Marco Mattila

Add horizontal text justification to text items in pcbnew.

parent 160ab816
......@@ -230,7 +230,7 @@ EDA_TEXT::~EDA_TEXT()
int EDA_TEXT::LenSize( const wxString& aLine ) const
{
return ReturnGraphicTextWidth( aLine, m_Size.x, m_Italic, m_Bold ) + m_Thickness;
return ReturnGraphicTextWidth( aLine, m_Size.x, m_Italic, m_Bold );
}
......@@ -286,7 +286,6 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
delete list;
rect.SetSize( textsize );
rect.Inflate( thickness / 2 ); // ensure a small margin
/* Now, calculate the rect origin, according to text justification
* At this point the rectangle origin is the text origin (m_Pos).
......@@ -297,6 +296,8 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
switch( m_HJustify )
{
case GR_TEXT_HJUSTIFY_LEFT:
if( m_Mirror )
rect.SetX( rect.GetX() - rect.GetWidth() );
break;
case GR_TEXT_HJUSTIFY_CENTER:
......@@ -304,7 +305,8 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
break;
case GR_TEXT_HJUSTIFY_RIGHT:
rect.SetX( rect.GetX() - rect.GetWidth() );
if( !m_Mirror )
rect.SetX( rect.GetX() - rect.GetWidth() );
break;
}
......@@ -324,6 +326,7 @@ EDA_RECT EDA_TEXT::GetTextBox( int aLine, int aThickness, bool aInvertY ) const
break;
}
rect.Inflate( thickness / 2 );
rect.Normalize(); // Make h and v sizes always >= 0
return rect;
......@@ -378,7 +381,7 @@ void EDA_TEXT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
aColor,
aDrawMode,
aFillMode,
aAnchor_color,
i ? UNSPECIFIED_COLOR : aAnchor_color,
txt,
pos );
pos += offset;
......
......@@ -845,6 +845,11 @@ public:
void SetText( const wxString& aText ) { m_Text = aText; }
wxString GetText() const { return m_Text; }
GRTextHorizJustifyType GetHorizJustify() const { return m_HJustify; };
GRTextVertJustifyType GetVertJustify() const { return m_VJustify; };
void SetHorizJustify( GRTextHorizJustifyType aType ) { m_HJustify = aType; };
void SetVertJustify( GRTextVertJustifyType aType ) { m_VJustify = aType; };
};
#endif /* BASE_STRUCT_H */
......@@ -16,7 +16,7 @@
#include "trigo.h"
#include "protos.h"
#include "richio.h"
#include "class_drawpanel.h"
/*******************/
/* class TEXTE_PCB */
......@@ -119,8 +119,9 @@ int TEXTE_PCB::ReadTextePcbDescr( LINE_READER* aReader )
{
style[0] = 0;
int normal_display = 1;
sscanf( line + 2, " %d %d %lX %s\n", &m_Layer, &normal_display,
&m_TimeStamp, style );
char hJustify = 'l';
sscanf( line + 2, " %d %d %lX %s %c\n", &m_Layer, &normal_display,
&m_TimeStamp, style, &hJustify );
m_Mirror = normal_display ? false : true;
......@@ -133,6 +134,25 @@ int TEXTE_PCB::ReadTextePcbDescr( LINE_READER* aReader )
m_Italic = 1;
else
m_Italic = 0;
switch( hJustify )
{
case 'l':
case 'L':
m_HJustify = GR_TEXT_HJUSTIFY_LEFT;
break;
case 'c':
case 'C':
m_HJustify = GR_TEXT_HJUSTIFY_CENTER;
break;
case 'r':
case 'R':
m_HJustify = GR_TEXT_HJUSTIFY_RIGHT;
break;
default:
m_HJustify = GR_TEXT_HJUSTIFY_CENTER;
break;
}
continue;
}
}
......@@ -173,9 +193,26 @@ bool TEXTE_PCB::Save( FILE* aFile ) const
fprintf( aFile, "Po %d %d %d %d %d %d\n",
m_Pos.x, m_Pos.y, m_Size.x, m_Size.y, m_Thickness, m_Orient );
fprintf( aFile, "De %d %d %lX %s\n", m_Layer,
char hJustify = 'L';
switch( m_HJustify )
{
case GR_TEXT_HJUSTIFY_LEFT:
hJustify = 'L';
break;
case GR_TEXT_HJUSTIFY_CENTER:
hJustify = 'C';
break;
case GR_TEXT_HJUSTIFY_RIGHT:
hJustify = 'R';
break;
default:
hJustify = 'C';
break;
}
fprintf( aFile, "De %d %d %lX %s %c\n", m_Layer,
m_Mirror ? 0 : 1,
m_TimeStamp, style );
m_TimeStamp, style, hJustify );
if( fprintf( aFile, "$EndTEXTPCB\n" ) != sizeof("$EndTEXTPCB\n") - 1 )
return false;
......@@ -193,23 +230,23 @@ bool TEXTE_PCB::Save( FILE* aFile ) const
void TEXTE_PCB::Draw( EDA_DRAW_PANEL* panel, wxDC* DC,
int DrawMode, const wxPoint& offset )
{
BOARD * brd = GetBoard( );
BOARD* brd = GetBoard();
if( brd->IsLayerVisible( m_Layer ) == false )
return;
int color = brd->GetLayerColor(m_Layer);
int color = brd->GetLayerColor( m_Layer );
GRTraceMode fillmode = FILLED;
if ( DisplayOpt.DisplayDrawItems == SKETCH)
if( DisplayOpt.DisplayDrawItems == SKETCH )
fillmode = SKETCH;
int anchor_color = UNSPECIFIED_COLOR;
if( brd->IsElementVisible( ANCHOR_VISIBLE ) )
anchor_color = brd->GetVisibleElementColor(ANCHOR_VISIBLE);
anchor_color = brd->GetVisibleElementColor( ANCHOR_VISIBLE );
EDA_TEXT::Draw( panel, DC, offset, (EDA_Colors) color,
DrawMode, fillmode, (EDA_Colors) anchor_color );
DrawMode, fillmode, (EDA_Colors) anchor_color );
}
......@@ -245,16 +282,16 @@ void TEXTE_PCB::DisplayInfo( EDA_DRAW_FRAME* frame )
frame->AppendMsgPanel( _( "Mirror" ), _( "Yes" ), DARKGREEN );
msg.Printf( wxT( "%.1f" ), (float) m_Orient / 10 );
frame->AppendMsgPanel( _( "Orient" ), msg, DARKGREEN );
frame->AppendMsgPanel( _( "Orientation" ), msg, DARKGREEN );
valeur_param( m_Thickness, msg );
frame->AppendMsgPanel( _( "Thickness" ), msg, MAGENTA );
valeur_param( m_Size.x, msg );
frame->AppendMsgPanel( _( "H Size" ), msg, RED );
frame->AppendMsgPanel( _( "Size X" ), msg, RED );
valeur_param( m_Size.y, msg );
frame->AppendMsgPanel( _( "V Size" ), msg, RED );
frame->AppendMsgPanel( _( "Size Y" ), msg, RED );
}
......
......@@ -58,6 +58,7 @@ DIALOG_PCB_TEXT_PROPERTIES::DIALOG_PCB_TEXT_PROPERTIES( PCB_EDIT_FRAME* parent,
Centre();
}
/**
* Routine for main window class to launch text properties dialog.
*/
......@@ -70,6 +71,7 @@ void PCB_EDIT_FRAME::InstallTextPCBOptionsFrame( TEXTE_PCB* TextPCB, wxDC* DC )
DrawPanel->m_IgnoreMouseEvents = FALSE;
}
void DIALOG_PCB_TEXT_PROPERTIES::MyInit()
{
SetFocus();
......@@ -95,11 +97,18 @@ void DIALOG_PCB_TEXT_PROPERTIES::MyInit()
PutValueInLocalUnits( *m_PositionYCtrl, m_SelectedPCBText->m_Pos.y,
m_Parent->m_InternalUnits );
int enabledLayers = m_Parent->GetBoard()->GetEnabledLayers();
for( int layer = 0; layer < NB_LAYERS; ++layer )
{
m_LayerSelectionCtrl->Append( m_Parent->GetBoard()->GetLayerName( layer ) );
if( enabledLayers & (1 << layer) )
{
layerList.push_back( layer );
int itemIndex =
m_LayerSelectionCtrl->Append( m_Parent->GetBoard()->GetLayerName( layer ) );
if( m_SelectedPCBText->GetLayer() == layer )
m_LayerSelectionCtrl->SetSelection( itemIndex );
}
}
m_LayerSelectionCtrl->SetSelection( m_SelectedPCBText->GetLayer() );
switch( m_SelectedPCBText->m_Orient )
{
......@@ -127,16 +136,28 @@ void DIALOG_PCB_TEXT_PROPERTIES::MyInit()
else
m_StyleCtrl->SetSelection( 0 );
// Set justification
GRTextHorizJustifyType hJustify = m_SelectedPCBText->GetHorizJustify();
m_justifyChoice->SetSelection( (int) hJustify + 1 );
// Set focus on most important control
m_TextContentCtrl->SetFocus();
m_TextContentCtrl->SetSelection( -1, -1 );
}
void DIALOG_PCB_TEXT_PROPERTIES::OnClose( wxCloseEvent& event )
{
EndModal( 0 );
}
void DIALOG_PCB_TEXT_PROPERTIES::OnCancelClick( wxCommandEvent& event )
{
EndModal( wxID_CANCEL );
}
void DIALOG_PCB_TEXT_PROPERTIES::OnOkClick( wxCommandEvent& event )
{
wxPoint newPosition;
......@@ -174,6 +195,7 @@ void DIALOG_PCB_TEXT_PROPERTIES::OnOkClick( wxCommandEvent& event )
// Check constraints and set PCB Text size
newSize.x = ReturnValueFromString( g_UserUnit, m_SizeXCtrl->GetValue(), m_Parent->m_InternalUnits );
newSize.y = ReturnValueFromString( g_UserUnit, m_SizeYCtrl->GetValue(), m_Parent->m_InternalUnits );
if( newSize.x < TEXTS_MIN_SIZE )
newSize.x = TEXTS_MIN_SIZE;
if( newSize.y < TEXTS_MIN_SIZE )
......@@ -196,7 +218,7 @@ void DIALOG_PCB_TEXT_PROPERTIES::OnOkClick( wxCommandEvent& event )
}
// Set the layer on which the PCB text is laying
m_SelectedPCBText->SetLayer( m_LayerSelectionCtrl->GetSelection() );
m_SelectedPCBText->SetLayer( layerList[m_LayerSelectionCtrl->GetSelection()] );
// Set whether the PCB text is mirrored (faced down from layer face perspective)
m_SelectedPCBText->m_Mirror = (m_DisplayCtrl->GetSelection() == 1) ? true : false;
......@@ -207,6 +229,22 @@ void DIALOG_PCB_TEXT_PROPERTIES::OnOkClick( wxCommandEvent& event )
// Set whether the PCB text is slanted (it is not italics, as italics has additional curves in style)
m_SelectedPCBText->m_Italic = m_StyleCtrl->GetSelection() ? 1 : 0;
// Set justification
switch( m_justifyChoice->GetSelection() )
{
case 0:
m_SelectedPCBText->SetHorizJustify( GR_TEXT_HJUSTIFY_LEFT );
break;
case 1:
m_SelectedPCBText->SetHorizJustify( GR_TEXT_HJUSTIFY_CENTER );
break;
case 2:
m_SelectedPCBText->SetHorizJustify( GR_TEXT_HJUSTIFY_RIGHT );
break;
default:
break;
}
// Finally, display new text if there is a context to do so
if( m_DC )
{
......
#ifndef __dialog_pcb_text_properties__
#define __dialog_pcb_text_properties__
/**
@file
Subclass of DIALOG_PCB_TEXT_PROPERTIES_BASE, which is generated by wxFormBuilder.
*/
#ifndef DIALOG_PCB_TEXT_PROPERTIES_H
#define DIALOG_PCB_TEXT_PROPERTIES_H
#include <vector>
#include <wx/wx.h>
#include "dialog_pcb_text_properties_base.h"
//// end generated include
class PCB_EDIT_FRAME;
class wxDC;
class TEXTE_PCB;
/** Implementing DIALOG_PCB_TEXT_PROPERTIES_BASE */
......@@ -21,18 +15,18 @@ private:
PCB_EDIT_FRAME* m_Parent;
wxDC* m_DC;
TEXTE_PCB* m_SelectedPCBText;
std::vector<int> layerList;
void MyInit();
protected:
// Handlers for DIALOG_PCB_TEXT_PROPERTIES_BASE events.
void OnClose( wxCloseEvent& event );
void OnCancelClick( wxCommandEvent& event );
void OnOkClick( wxCommandEvent& event );
public:
DIALOG_PCB_TEXT_PROPERTIES( PCB_EDIT_FRAME* parent, TEXTE_PCB* passedTextPCB, wxDC* DC );
//// end generated class members
};
#endif // __dialog_pcb_text_properties__
#endif // DIALOG_PCB_TEXT_PROPERTIES_H
This source diff could not be displayed because it is too large. You can view the blob instead.
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Sep 8 2010)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __dialog_pcb_text_properties_base__
#define __dialog_pcb_text_properties_base__
#include <wx/intl.h>
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/textctrl.h>
#include <wx/choice.h>
#include <wx/sizer.h>
#include <wx/radiobox.h>
#include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_PCB_TEXT_PROPERTIES_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_PCB_TEXT_PROPERTIES_BASE : public wxDialog
{
private:
protected:
wxStaticText* m_TextLabel;
wxTextCtrl* m_TextContentCtrl;
wxStaticText* m_SizeXLabel;
wxTextCtrl* m_SizeXCtrl;
wxStaticText* m_SizeYLabel;
wxTextCtrl* m_SizeYCtrl;
wxStaticText* m_ThicknessLabel;
wxTextCtrl* m_ThicknessCtrl;
wxStaticText* m_PositionXLabel;
wxTextCtrl* m_PositionXCtrl;
wxStaticText* m_PositionYLabel;
wxTextCtrl* m_PositionYCtrl;
wxStaticText* m_LayerLabel;
wxChoice* m_LayerSelectionCtrl;
wxRadioBox* m_OrientationCtrl;
wxRadioBox* m_StyleCtrl;
wxRadioBox* m_DisplayCtrl;
wxStdDialogButtonSizer* m_StandardSizer;
wxButton* m_StandardSizerOK;
wxButton* m_StandardSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_PCB_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Text item properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 433,465 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU );
~DIALOG_PCB_TEXT_PROPERTIES_BASE();
};
#endif //__dialog_pcb_text_properties_base__
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 18 2010)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __dialog_pcb_text_properties_base__
#define __dialog_pcb_text_properties_base__
#include <wx/intl.h>
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/textctrl.h>
#include <wx/sizer.h>
#include <wx/choice.h>
#include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_PCB_TEXT_PROPERTIES_BASE
///////////////////////////////////////////////////////////////////////////////
class DIALOG_PCB_TEXT_PROPERTIES_BASE : public wxDialog
{
private:
protected:
wxStaticText* m_TextLabel;
wxTextCtrl* m_TextContentCtrl;
wxStaticText* m_SizeXLabel;
wxTextCtrl* m_SizeXCtrl;
wxStaticText* m_SizeYLabel;
wxTextCtrl* m_SizeYCtrl;
wxStaticText* m_ThicknessLabel;
wxTextCtrl* m_ThicknessCtrl;
wxStaticText* m_PositionXLabel;
wxTextCtrl* m_PositionXCtrl;
wxStaticText* m_PositionYLabel;
wxTextCtrl* m_PositionYCtrl;
wxStaticText* m_LayerLabel;
wxChoice* m_LayerSelectionCtrl;
wxStaticText* m_staticText8;
wxChoice* m_OrientationCtrl;
wxStaticText* m_staticText9;
wxChoice* m_StyleCtrl;
wxStaticText* m_staticText10;
wxChoice* m_DisplayCtrl;
wxStaticText* m_staticText11;
wxChoice* m_justifyChoice;
wxStdDialogButtonSizer* m_StandardSizer;
wxButton* m_StandardSizerOK;
wxButton* m_StandardSizerCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkClick( wxCommandEvent& event ) { event.Skip(); }
public:
DIALOG_PCB_TEXT_PROPERTIES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Text Item Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 433,465 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU );
~DIALOG_PCB_TEXT_PROPERTIES_BASE();
};
#endif //__dialog_pcb_text_properties_base__
......@@ -1005,8 +1005,6 @@ static void Process_Move_Item( PCB_EDIT_FRAME* frame, EDA_ITEM* DrawStruct, wxDC
if( DrawStruct == NULL )
return;
frame->DrawPanel->MoveCursorToCrossHair();
switch( DrawStruct->Type() )
{
case TYPE_TEXTE:
......
......@@ -106,6 +106,10 @@ void PCB_EDIT_FRAME::StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC )
TextePcb->Draw( DrawPanel, DC, GR_XOR );
TextePcb->m_Flags |= IS_MOVED;
TextePcb->DisplayInfo( this );
GetScreen()->SetCrossHairPosition( TextePcb->GetPosition() );
DrawPanel->MoveCursorToCrossHair();
DrawPanel->SetMouseCapture( Move_Texte_Pcb, Abort_Edit_Pcb_Text );
SetCurItem( TextePcb );
DrawPanel->m_mouseCaptureCallback( DrawPanel, DC, wxDefaultPosition, FALSE );
......
......@@ -174,15 +174,12 @@ void PCB_BASE_FRAME::StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC )
MoveVector.x = MoveVector.y = 0;
DrawPanel->CrossHairOff( DC );
TextInitialPosition = Text->m_Pos;
TextInitialOrientation = Text->m_Orient;
// Center cursor on initial position of text
GetScreen()->SetCrossHairPosition( TextInitialPosition );
DrawPanel->MoveCursorToCrossHair();
DrawPanel->CrossHairOn( DC );
Text->DisplayInfo( this );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment