Eeschema and pcbnew: Table Cell Properties

This commit is contained in:
Damjan 2025-02-24 11:07:58 +00:00 committed by Jeff Young
parent 5771467ca3
commit 76a3d1c845
10 changed files with 4937 additions and 4261 deletions

View File

@ -33,22 +33,50 @@
#include <tool/tool_manager.h>
#include <dialog_tablecell_properties.h>
DIALOG_TABLECELL_PROPERTIES::DIALOG_TABLECELL_PROPERTIES( SCH_EDIT_FRAME* aFrame,
DIALOG_TABLECELL_PROPERTIES::DIALOG_TABLECELL_PROPERTIES( SCH_EDIT_FRAME* aFrame,
std::vector<SCH_TABLECELL*> aCells ) :
DIALOG_TABLECELL_PROPERTIES_BASE( aFrame ),
m_frame( aFrame ),
m_table( nullptr ),
DIALOG_TABLECELL_PROPERTIES_BASE( aFrame ), m_frame( aFrame ), m_table( nullptr ),
m_cells( std::move( aCells ) ),
m_textSize( aFrame, m_textSizeLabel, m_textSizeCtrl, m_textSizeUnits ),
m_marginLeft( aFrame, nullptr, m_marginLeftCtrl, nullptr ),
m_marginTop( aFrame, nullptr, m_marginTopCtrl, m_marginTopUnits ),
m_marginRight( aFrame, nullptr, m_marginRightCtrl, nullptr ),
m_marginBottom( aFrame, nullptr, m_marginBottomCtrl, nullptr ),
m_scintillaTricks( nullptr ), m_cellText( m_cellTextCtrl ),
m_returnValue( TABLECELL_PROPS_CANCEL )
{
wxASSERT( m_cells.size() > 0 && m_cells[0] );
m_cellText->SetEOLMode( wxSTC_EOL_LF );
#ifdef _WIN32
// Without this setting, on Windows, some esoteric unicode chars create display issue
// in a wxStyledTextCtrl.
// for SetTechnology() info, see https://www.scintilla.org/ScintillaDoc.html#SCI_SETTECHNOLOGY
m_cellText->SetTechnology( wxSTC_TECHNOLOGY_DIRECTWRITE );
#endif
m_scintillaTricks = new SCINTILLA_TRICKS(
m_cellText, wxT( "{}" ), false,
// onAcceptFn
[this]( wxKeyEvent& aEvent )
{
wxPostEvent( this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ) );
},
// onCharFn
[this]( wxStyledTextEvent& aEvent )
{
m_scintillaTricks->DoTextVarAutocomplete(
// getTokensFn
[this]( const wxString& xRef, wxArrayString* tokens )
{
getContextualTextVars( xRef, tokens );
} );
} );
SetInitialFocus( m_cellText );
m_table = static_cast<SCH_TABLE*>( m_cells[0]->GetParent() );
if( m_frame->GetColorSettings()->GetOverrideSchItemColors() )
@ -86,6 +114,54 @@ DIALOG_TABLECELL_PROPERTIES::DIALOG_TABLECELL_PROPERTIES( SCH_EDIT_FRAME* aFrame
finishDialogSettings();
}
DIALOG_TABLECELL_PROPERTIES::~DIALOG_TABLECELL_PROPERTIES()
{
delete m_scintillaTricks;
}
void DIALOG_TABLECELL_PROPERTIES::getContextualTextVars( const wxString& aCrossRef,
wxArrayString* aTokens )
{
SCHEMATIC* schematic = m_table->Schematic();
if( !aCrossRef.IsEmpty() )
{
SCH_SYMBOL* refSymbol = nullptr;
if( schematic )
{
SCH_REFERENCE_LIST refs;
schematic->Hierarchy().GetSymbols( refs );
for( int jj = 0; jj < (int) refs.GetCount(); jj++ )
{
SCH_REFERENCE& ref = refs[jj];
if( ref.GetSymbol()->GetRef( &ref.GetSheetPath(), true ) == aCrossRef )
{
refSymbol = ref.GetSymbol();
break;
}
}
}
if( refSymbol )
refSymbol->GetContextualTextVars( aTokens );
}
else
{
if( schematic && schematic->CurrentSheet().Last() )
{
schematic->CurrentSheet().Last()->GetContextualTextVars( aTokens );
}
else
{
for( std::pair<wxString, wxString> entry : Prj().GetTextVars() )
aTokens->push_back( entry.first );
}
}
}
bool DIALOG_TABLECELL_PROPERTIES::TransferDataToWindow()
{
@ -98,6 +174,11 @@ bool DIALOG_TABLECELL_PROPERTIES::TransferDataToWindow()
for( SCH_TABLECELL* cell : m_cells )
{
wxString text = cell->GetText();
m_cellText->SetValue( text );
m_cellText->EmptyUndoBuffer();
if( firstCell )
{
m_fontCtrl->SetFontSelection( cell->GetFont() );
@ -258,6 +339,19 @@ bool DIALOG_TABLECELL_PROPERTIES::TransferDataFromWindow()
for( SCH_TABLECELL* cell : m_cells )
{
wxString text = m_cellTextCtrl->GetValue();
#ifdef __WXMAC__
// On macOS CTRL+Enter produces '\r' instead of '\n' regardless of EOL setting
text.Replace( "\r", "\n" );
#elif defined( __WINDOWS__ )
// On Windows, a new line is coded as \r\n. We use only \n in KiCad files and in
// drawing routines so strip the \r char.
text.Replace( "\r", "" );
#endif
cell->SetText( text );
if( m_bold->Get3StateValue() == wxCHK_CHECKED )
cell->SetBold( true );
else if( m_bold->Get3StateValue() == wxCHK_UNCHECKED )
@ -335,3 +429,11 @@ void DIALOG_TABLECELL_PROPERTIES::onEditTable( wxCommandEvent& aEvent )
Close();
}
}
void DIALOG_TABLECELL_PROPERTIES::onMultiLineTCLostFocus( wxFocusEvent& event )
{
if( m_scintillaTricks )
m_scintillaTricks->CancelAutocomplete();
event.Skip();
}

View File

@ -31,7 +31,7 @@
class SCH_EDIT_FRAME;
class SCH_TABLE;
class SCH_TABLECELL;
class SCINTILLA_TRICKS;
class DIALOG_TABLECELL_PROPERTIES : public DIALOG_TABLECELL_PROPERTIES_BASE
{
@ -45,11 +45,15 @@ public:
};
DIALOG_TABLECELL_PROPERTIES( SCH_EDIT_FRAME* aParentFrame, std::vector<SCH_TABLECELL*> aCells );
~DIALOG_TABLECELL_PROPERTIES();
///< @return the value depending on the way the dialog was closed.
enum TABLECELL_PROPS_RETVALUE GetReturnValue() { return m_returnValue; }
private:
void getContextualTextVars( const wxString& aCrossRef, wxArrayString* aTokens );
void onMultiLineTCLostFocus( wxFocusEvent& event ) override;
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
@ -60,16 +64,21 @@ private:
void onEditTable( wxCommandEvent& aEvent ) override;
void OnSystemColourChanged( wxSysColourChangedEvent& event );
void UpdateTheme( void );
private:
SCH_EDIT_FRAME* m_frame;
SCH_TABLE* m_table;
std::vector<SCH_TABLECELL*> m_cells;
SCINTILLA_TRICKS* m_scintillaTricks;
UNIT_BINDER m_textSize;
UNIT_BINDER m_marginLeft;
UNIT_BINDER m_marginTop;
UNIT_BINDER m_marginRight;
UNIT_BINDER m_marginBottom;
wxStyledTextCtrl* m_cellText;
enum TABLECELL_PROPS_RETVALUE m_returnValue; // the option that closed the dialog
};

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -28,11 +28,70 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bMainSizer->Add( m_infoBar, 0, wxEXPAND|wxBOTTOM, 5 );
wxBoxSizer* bSizer151;
bSizer151 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer16;
bSizer16 = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer* bSizer18;
bSizer18 = new wxBoxSizer( wxVERTICAL );
m_cellTextLabel = new wxStaticText( this, wxID_ANY, _("Cell contents:"), wxDefaultPosition, wxDefaultSize, 0 );
m_cellTextLabel->Wrap( -1 );
bSizer18->Add( m_cellTextLabel, 0, wxALL, 5 );
m_cellTextCtrl = new wxStyledTextCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN, wxEmptyString );
m_cellTextCtrl->SetUseTabs( false );
m_cellTextCtrl->SetTabWidth( 4 );
m_cellTextCtrl->SetIndent( 4 );
m_cellTextCtrl->SetTabIndents( false );
m_cellTextCtrl->SetBackSpaceUnIndents( false );
m_cellTextCtrl->SetViewEOL( false );
m_cellTextCtrl->SetViewWhiteSpace( false );
m_cellTextCtrl->SetMarginWidth( 2, 0 );
m_cellTextCtrl->SetIndentationGuides( false );
m_cellTextCtrl->SetReadOnly( false );
m_cellTextCtrl->SetMarginWidth( 1, 0 );
m_cellTextCtrl->SetMarginWidth( 0, 0 );
{
wxFont font = wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString );
m_cellTextCtrl->StyleSetFont( wxSTC_STYLE_DEFAULT, font );
}
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_EMPTY );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_EMPTY );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_EMPTY );
m_cellTextCtrl->SetSelBackground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
m_cellTextCtrl->SetSelForeground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) );
m_cellTextCtrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
m_cellTextCtrl->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
m_cellTextCtrl->SetMinSize( wxSize( 200,100 ) );
bSizer18->Add( m_cellTextCtrl, 1, wxEXPAND | wxALL, 5 );
bSizer16->Add( bSizer18, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer17;
bSizer17 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer13;
bSizer13 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bMargins;
bMargins = new wxBoxSizer( wxVERTICAL );
bSizer13->Add( 0, 20, 0, 0, 5 );
wxFlexGridSizer* fgTextStyleSizer;
fgTextStyleSizer = new wxFlexGridSizer( 0, 2, 5, 5 );
@ -44,7 +103,7 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
hAlignLabel->Wrap( -1 );
hAlignLabel->SetToolTip( _("Horizontal alignment") );
fgTextStyleSizer->Add( hAlignLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
fgTextStyleSizer->Add( hAlignLabel, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
wxBoxSizer* hAlignButtons;
hAlignButtons = new wxBoxSizer( wxHORIZONTAL );
@ -65,13 +124,13 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
hAlignButtons->Add( m_hAlignRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
fgTextStyleSizer->Add( hAlignButtons, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
fgTextStyleSizer->Add( hAlignButtons, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
vAlignLabel = new wxStaticText( this, wxID_ANY, _("Vertical alignment:"), wxDefaultPosition, wxDefaultSize, 0 );
vAlignLabel->Wrap( -1 );
vAlignLabel->SetToolTip( _("Vertical alignment") );
fgTextStyleSizer->Add( vAlignLabel, 0, wxALIGN_CENTER_VERTICAL, 5 );
fgTextStyleSizer->Add( vAlignLabel, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
wxBoxSizer* vAlignButtons;
vAlignButtons = new wxBoxSizer( wxHORIZONTAL );
@ -95,7 +154,10 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
fgTextStyleSizer->Add( vAlignButtons, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
bMargins->Add( fgTextStyleSizer, 0, wxEXPAND|wxBOTTOM, 6 );
bSizer13->Add( fgTextStyleSizer, 0, wxBOTTOM|wxEXPAND, 6 );
wxBoxSizer* bMargins;
bMargins = new wxBoxSizer( wxVERTICAL );
bMargins->Add( 0, 10, 0, wxEXPAND, 5 );
@ -108,7 +170,7 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
m_styleLabel = new wxStaticText( this, wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, 0 );
m_styleLabel->Wrap( -1 );
gbFontSizer->Add( m_styleLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbFontSizer->Add( m_styleLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
wxBoxSizer* bSizer14;
bSizer14 = new wxBoxSizer( wxHORIZONTAL );
@ -120,21 +182,21 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bSizer14->Add( m_italic, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 45 );
gbFontSizer->Add( bSizer14, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
gbFontSizer->Add( bSizer14, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
m_fontLabel = new wxStaticText( this, wxID_ANY, _("Font:"), wxDefaultPosition, wxDefaultSize, 0 );
m_fontLabel->Wrap( -1 );
gbFontSizer->Add( m_fontLabel, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 1 );
gbFontSizer->Add( m_fontLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 1 );
wxString m_fontCtrlChoices[] = { _("Default Font"), _("KiCad Font") };
int m_fontCtrlNChoices = sizeof( m_fontCtrlChoices ) / sizeof( wxString );
m_fontCtrl = new FONT_CHOICE( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_fontCtrlNChoices, m_fontCtrlChoices, 0 );
m_fontCtrl->SetSelection( 0 );
gbFontSizer->Add( m_fontCtrl, wxGBPosition( 0, 1 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
gbFontSizer->Add( m_fontCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_textSizeLabel = new wxStaticText( this, wxID_ANY, _("Size:"), wxDefaultPosition, wxDefaultSize, 0 );
m_textSizeLabel->Wrap( -1 );
gbFontSizer->Add( m_textSizeLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbFontSizer->Add( m_textSizeLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
wxBoxSizer* bSizer15;
bSizer15 = new wxBoxSizer( wxHORIZONTAL );
@ -147,7 +209,7 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bSizer15->Add( m_textSizeUnits, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 3 );
gbFontSizer->Add( bSizer15, wxGBPosition( 1, 1 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_VERTICAL, 5 );
gbFontSizer->Add( bSizer15, wxGBPosition( 2, 1 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_VERTICAL, 5 );
gbFontSizer->AddGrowableCol( 1 );
@ -294,7 +356,16 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bSizer13->Add( bMargins, 1, wxEXPAND|wxALL, 5 );
bMainSizer->Add( bSizer13, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
bSizer17->Add( bSizer13, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
bSizer16->Add( bSizer17, 1, wxEXPAND, 5 );
bSizer151->Add( bSizer16, 1, wxEXPAND, 5 );
bMainSizer->Add( bSizer151, 1, wxEXPAND, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bMainSizer->Add( m_staticline1, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
@ -328,6 +399,7 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bMainSizer->Fit( this );
// Connect Events
this->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onMultiLineTCLostFocus ) );
m_textColorPopup->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onTextColorPopup ), NULL, this );
m_fillColorPopup->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onFillColorPopup ), NULL, this );
m_editTable->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onEditTable ), NULL, this );
@ -336,6 +408,7 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
DIALOG_TABLECELL_PROPERTIES_BASE::~DIALOG_TABLECELL_PROPERTIES_BASE()
{
// Disconnect Events
this->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onMultiLineTCLostFocus ) );
m_textColorPopup->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onTextColorPopup ), NULL, this );
m_fillColorPopup->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onFillColorPopup ), NULL, this );
m_editTable->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_TABLECELL_PROPERTIES_BASE::onEditTable ), NULL, this );

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.1.0-0-g733bf3d)
// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -23,12 +23,13 @@ class WX_INFOBAR;
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/stc/stc.h>
#include <wx/sizer.h>
#include <wx/bmpbuttn.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/checkbox.h>
#include <wx/choice.h>
#include <wx/textctrl.h>
@ -49,6 +50,8 @@ class DIALOG_TABLECELL_PROPERTIES_BASE : public DIALOG_SHIM
protected:
WX_INFOBAR* m_infoBar;
wxStaticText* m_cellTextLabel;
wxStyledTextCtrl* m_cellTextCtrl;
BITMAP_BUTTON* m_hAlignLeft;
BITMAP_BUTTON* m_hAlignCenter;
BITMAP_BUTTON* m_hAlignRight;
@ -88,6 +91,7 @@ class DIALOG_TABLECELL_PROPERTIES_BASE : public DIALOG_SHIM
wxButton* m_sdbSizer1Cancel;
// Virtual event handlers, override them in your derived class
virtual void onMultiLineTCLostFocus( wxFocusEvent& event ) { event.Skip(); }
virtual void onTextColorPopup( wxCommandEvent& event ) { event.Skip(); }
virtual void onFillColorPopup( wxCommandEvent& event ) { event.Skip(); }
virtual void onEditTable( wxCommandEvent& event ) { event.Skip(); }

View File

@ -52,10 +52,44 @@ DIALOG_TABLECELL_PROPERTIES::DIALOG_TABLECELL_PROPERTIES( PCB_BASE_EDIT_FRAME* a
m_marginTop( aFrame, nullptr, m_marginTopCtrl, m_marginTopUnits ),
m_marginRight( aFrame, nullptr, m_marginRightCtrl, nullptr ),
m_marginBottom( aFrame, nullptr, m_marginBottomCtrl, nullptr ),
m_cellText( m_cellTextCtrl ),
m_returnValue( TABLECELL_PROPS_CANCEL )
{
wxASSERT( m_cells.size() > 0 && m_cells[0] );
m_cellText->SetEOLMode( wxSTC_EOL_LF );
#ifdef _WIN32
// Without this setting, on Windows, some esoteric unicode chars create display issue
// in a wxStyledTextCtrl.
// for SetTechnology() info, see https://www.scintilla.org/ScintillaDoc.html#SCI_SETTECHNOLOGY
m_cellText->SetTechnology(wxSTC_TECHNOLOGY_DIRECTWRITE);
#endif
m_scintillaTricks = new SCINTILLA_TRICKS( m_cellText, wxT( "{}" ), false,
// onAcceptFn
[this]( wxKeyEvent& aEvent )
{
wxPostEvent( this, wxCommandEvent( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK ) );
},
// onCharFn
[this]( wxStyledTextEvent& aEvent )
{
m_scintillaTricks->DoTextVarAutocomplete(
// getTokensFn
[this]( const wxString& xRef, wxArrayString* tokens )
{
m_frame->GetContextualTextVars( m_table, xRef, tokens );
} );
} );
// A hack which causes Scintilla to auto-size the text editor canvas
// See: https://github.com/jacobslusser/ScintillaNET/issues/216
m_cellText->SetScrollWidth( 1 );
m_cellText->SetScrollWidthTracking( true );
SetInitialFocus( m_cellText );
m_table = static_cast<PCB_TABLE*>( m_cells[0]->GetParent() );
m_hAlignLeft->SetIsRadioButton();
@ -75,6 +109,9 @@ DIALOG_TABLECELL_PROPERTIES::DIALOG_TABLECELL_PROPERTIES( PCB_BASE_EDIT_FRAME* a
SetupStandardButtons();
Layout();
Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TABLECELL_PROPERTIES::OnCharHook ),
nullptr, this );
m_hAlignLeft->Bind( wxEVT_BUTTON, &DIALOG_TABLECELL_PROPERTIES::onHAlignButton, this );
m_hAlignCenter->Bind( wxEVT_BUTTON, &DIALOG_TABLECELL_PROPERTIES::onHAlignButton, this );
m_hAlignRight->Bind( wxEVT_BUTTON, &DIALOG_TABLECELL_PROPERTIES::onHAlignButton, this );
@ -86,6 +123,14 @@ DIALOG_TABLECELL_PROPERTIES::DIALOG_TABLECELL_PROPERTIES( PCB_BASE_EDIT_FRAME* a
finishDialogSettings();
}
DIALOG_TABLECELL_PROPERTIES::~DIALOG_TABLECELL_PROPERTIES()
{
Disconnect( wxEVT_CHAR_HOOK, wxKeyEventHandler( DIALOG_TABLECELL_PROPERTIES::OnCharHook ),
nullptr, this );
delete m_scintillaTricks;
}
bool DIALOG_TABLECELL_PROPERTIES::TransferDataToWindow()
{
@ -98,6 +143,7 @@ bool DIALOG_TABLECELL_PROPERTIES::TransferDataToWindow()
for( PCB_TABLECELL* cell : m_cells )
{
m_cellTextCtrl->SetValue( cell->GetText() );
if( firstCell )
{
m_fontCtrl->SetFontSelection( cell->GetFont() );
@ -221,6 +267,20 @@ bool DIALOG_TABLECELL_PROPERTIES::TransferDataFromWindow()
for( PCB_TABLECELL* cell : m_cells )
{
wxString txt = m_cellTextCtrl->GetValue();
#ifdef __WXMAC__
// On macOS CTRL+Enter produces '\r' instead of '\n' regardless of EOL setting.
// Replace it now.
txt.Replace( "\r", "\n" );
#elif defined( __WINDOWS__ )
// On Windows, a new line is coded as \r\n. We use only \n in kicad files and in
// drawing routines so strip the \r char.
txt.Replace( "\r", "" );
#endif
cell->SetText( txt );
if( m_bold->Get3StateValue() == wxCHK_CHECKED )
cell->SetBold( true );
else if( m_bold->Get3StateValue() == wxCHK_UNCHECKED )

View File

@ -33,7 +33,7 @@
class PCB_BASE_EDIT_FRAME;
class PCB_TABLE;
class PCB_TABLECELL;
class SCINTILLA_TRICKS;
class DIALOG_TABLECELL_PROPERTIES : public DIALOG_TABLECELL_PROPERTIES_BASE
{
@ -48,7 +48,7 @@ public:
DIALOG_TABLECELL_PROPERTIES( PCB_BASE_EDIT_FRAME* aParentFrame,
std::vector<PCB_TABLECELL*> aCells );
~DIALOG_TABLECELL_PROPERTIES();
///< @return the value depending on the way the dialog was closed.
enum TABLECELL_PROPS_RETVALUE GetReturnValue() { return m_returnValue; }
@ -61,6 +61,11 @@ private:
void onEditTable( wxCommandEvent& aEvent ) override;
virtual void onMultiLineTCLostFocus( wxFocusEvent& event ) { event.Skip(); }
void OnSystemColourChanged( wxSysColourChangedEvent& event );
void UpdateTheme( void );
private:
PCB_BASE_EDIT_FRAME* m_frame;
PCB_TABLE* m_table;
@ -73,6 +78,9 @@ private:
UNIT_BINDER m_marginTop;
UNIT_BINDER m_marginRight;
UNIT_BINDER m_marginBottom;
wxStyledTextCtrl* m_cellText;
SCINTILLA_TRICKS* m_scintillaTricks;
enum TABLECELL_PROPS_RETVALUE m_returnValue; // the option that closed the dialog
};

View File

@ -27,9 +27,60 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bMainSizer->Add( m_infoBar, 0, wxEXPAND|wxBOTTOM, 5 );
wxBoxSizer* bSizer7;
bSizer7 = new wxBoxSizer( wxHORIZONTAL );
wxBoxSizer* bSizer8;
bSizer8 = new wxBoxSizer( wxVERTICAL );
m_cellTextLabel = new wxStaticText( this, wxID_ANY, _("Cell contents:"), wxDefaultPosition, wxDefaultSize, 0 );
m_cellTextLabel->Wrap( -1 );
bSizer8->Add( m_cellTextLabel, 0, wxALL, 5 );
m_cellTextCtrl = new wxStyledTextCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_SUNKEN, wxEmptyString );
m_cellTextCtrl->SetUseTabs( false );
m_cellTextCtrl->SetTabWidth( 4 );
m_cellTextCtrl->SetIndent( 4 );
m_cellTextCtrl->SetTabIndents( false );
m_cellTextCtrl->SetBackSpaceUnIndents( false );
m_cellTextCtrl->SetViewEOL( false );
m_cellTextCtrl->SetViewWhiteSpace( false );
m_cellTextCtrl->SetMarginWidth( 2, 0 );
m_cellTextCtrl->SetIndentationGuides( false );
m_cellTextCtrl->SetReadOnly( false );
m_cellTextCtrl->SetMarginWidth( 1, 0 );
m_cellTextCtrl->SetMarginWidth( 0, 0 );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDER, wxSTC_MARK_BOXPLUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDER, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDEROPEN, wxSTC_MARK_BOXMINUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPEN, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDERSUB, wxSTC_MARK_EMPTY );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDEREND, wxSTC_MARK_BOXPLUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDEREND, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDEROPENMID, wxSTC_MARK_BOXMINUS );
m_cellTextCtrl->MarkerSetBackground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("BLACK") ) );
m_cellTextCtrl->MarkerSetForeground( wxSTC_MARKNUM_FOLDEROPENMID, wxColour( wxT("WHITE") ) );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDERMIDTAIL, wxSTC_MARK_EMPTY );
m_cellTextCtrl->MarkerDefine( wxSTC_MARKNUM_FOLDERTAIL, wxSTC_MARK_EMPTY );
m_cellTextCtrl->SetSelBackground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
m_cellTextCtrl->SetSelForeground( true, wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHTTEXT ) );
bSizer8->Add( m_cellTextCtrl, 1, wxEXPAND | wxALL, 5 );
bSizer7->Add( bSizer8, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer9;
bSizer9 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bMargins;
bMargins = new wxBoxSizer( wxVERTICAL );
bMargins->Add( 0, 15, 0, wxEXPAND, 5 );
wxFlexGridSizer* fgTextStyleSizer;
fgTextStyleSizer = new wxFlexGridSizer( 0, 2, 5, 5 );
fgTextStyleSizer->SetFlexibleDirection( wxBOTH );
@ -104,17 +155,17 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
m_fontLabel = new wxStaticText( this, wxID_ANY, _("Font:"), wxDefaultPosition, wxDefaultSize, 0 );
m_fontLabel->Wrap( -1 );
gbFontSizer->Add( m_fontLabel, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 1 );
gbFontSizer->Add( m_fontLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 1 );
wxString m_fontCtrlChoices[] = { _("KiCad Font") };
int m_fontCtrlNChoices = sizeof( m_fontCtrlChoices ) / sizeof( wxString );
m_fontCtrl = new FONT_CHOICE( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_fontCtrlNChoices, m_fontCtrlChoices, 0 );
m_fontCtrl->SetSelection( 0 );
gbFontSizer->Add( m_fontCtrl, wxGBPosition( 0, 1 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
gbFontSizer->Add( m_fontCtrl, wxGBPosition( 1, 1 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_styleLabel = new wxStaticText( this, wxID_ANY, _("Style:"), wxDefaultPosition, wxDefaultSize, 0 );
m_styleLabel->Wrap( -1 );
gbFontSizer->Add( m_styleLabel, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
gbFontSizer->Add( m_styleLabel, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 );
wxBoxSizer* bSizer14;
bSizer14 = new wxBoxSizer( wxHORIZONTAL );
@ -126,7 +177,7 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bSizer14->Add( m_italic, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 45 );
gbFontSizer->Add( bSizer14, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
gbFontSizer->Add( bSizer14, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
gbFontSizer->AddGrowableCol( 1 );
@ -218,7 +269,13 @@ DIALOG_TABLECELL_PROPERTIES_BASE::DIALOG_TABLECELL_PROPERTIES_BASE( wxWindow* pa
bMargins->Add( gMarginsSizer, 0, wxEXPAND, 5 );
bMainSizer->Add( bMargins, 1, wxEXPAND|wxALL, 10 );
bSizer9->Add( bMargins, 1, wxEXPAND|wxALL, 10 );
bSizer7->Add( bSizer9, 1, wxEXPAND, 5 );
bMainSizer->Add( bSizer7, 1, wxEXPAND, 5 );
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bMainSizer->Add( m_staticline1, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );

File diff suppressed because it is too large Load Diff

View File

@ -22,12 +22,13 @@ class WX_INFOBAR;
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/stc/stc.h>
#include <wx/sizer.h>
#include <wx/bmpbuttn.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/choice.h>
#include <wx/checkbox.h>
#include <wx/gbsizer.h>
@ -46,6 +47,8 @@ class DIALOG_TABLECELL_PROPERTIES_BASE : public DIALOG_SHIM
protected:
WX_INFOBAR* m_infoBar;
wxStaticText* m_cellTextLabel;
wxStyledTextCtrl* m_cellTextCtrl;
BITMAP_BUTTON* m_hAlignLeft;
BITMAP_BUTTON* m_hAlignCenter;
BITMAP_BUTTON* m_hAlignRight;