Filter line-endings from single-line Scintilla editors.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/15793
This commit is contained in:
parent
3b3e4fd34a
commit
34769cec63
|
@ -54,6 +54,12 @@ SCINTILLA_TRICKS::SCINTILLA_TRICKS( wxStyledTextCtrl* aScintilla, const wxString
|
|||
m_te->SetScrollWidth( 1 );
|
||||
m_te->SetScrollWidthTracking( true );
|
||||
|
||||
if( m_singleLine )
|
||||
{
|
||||
m_te->SetUseVerticalScrollBar( false );
|
||||
m_te->SetUseHorizontalScrollBar( false );
|
||||
}
|
||||
|
||||
setupStyles();
|
||||
|
||||
// Set up autocomplete
|
||||
|
@ -65,6 +71,7 @@ SCINTILLA_TRICKS::SCINTILLA_TRICKS( wxStyledTextCtrl* aScintilla, const wxString
|
|||
|
||||
// Hook up events
|
||||
m_te->Bind( wxEVT_STC_UPDATEUI, &SCINTILLA_TRICKS::onScintillaUpdateUI, this );
|
||||
m_te->Bind( wxEVT_STC_MODIFIED, &SCINTILLA_TRICKS::onModified, this );
|
||||
|
||||
// Handle autocomplete
|
||||
m_te->Bind( wxEVT_STC_CHARADDED, &SCINTILLA_TRICKS::onChar, this );
|
||||
|
@ -170,6 +177,31 @@ void SCINTILLA_TRICKS::onChar( wxStyledTextEvent& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void SCINTILLA_TRICKS::onModified( wxStyledTextEvent& aEvent )
|
||||
{
|
||||
if( m_singleLine )
|
||||
{
|
||||
wxString text = m_te->GetText();
|
||||
|
||||
if( text.Contains( wxS( "\n" ) ) || text.Contains( wxS( "\r" ) ) )
|
||||
{
|
||||
// Scintilla won't allow us to call SetText() from within this event processor,
|
||||
// so we have to delay the processing.
|
||||
CallAfter( [this]()
|
||||
{
|
||||
wxString text = m_te->GetText();
|
||||
int currpos = m_te->GetCurrentPos();
|
||||
|
||||
text.Replace( wxS( "\n" ), wxS( "" ) );
|
||||
text.Replace( wxS( "\r" ), wxS( "" ) );
|
||||
m_te->SetText( text );
|
||||
m_te->GotoPos( currpos-1 );
|
||||
} );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SCINTILLA_TRICKS::onCharHook( wxKeyEvent& aEvent )
|
||||
{
|
||||
wxString c = aEvent.GetUnicodeKey();
|
||||
|
@ -267,6 +299,13 @@ void SCINTILLA_TRICKS::onCharHook( wxKeyEvent& aEvent )
|
|||
str = data.GetText();
|
||||
|
||||
ConvertSmartQuotesAndDashes( &str );
|
||||
|
||||
if( m_singleLine )
|
||||
{
|
||||
str.Replace( wxS( "\n" ), wxEmptyString );
|
||||
str.Replace( wxS( "\r" ), wxEmptyString );
|
||||
}
|
||||
|
||||
m_te->BeginUndoAction();
|
||||
m_te->AddText( str );
|
||||
m_te->EndUndoAction();
|
||||
|
|
|
@ -160,15 +160,13 @@ void DIALOG_FIELD_PROPERTIES::init()
|
|||
m_CommonConvert->Show( false );
|
||||
m_CommonUnit->Show( false );
|
||||
|
||||
// Predefined fields cannot contain some chars, or cannot be empty,
|
||||
// and need a SCH_FIELD_VALIDATOR (m_StyledTextCtrl cannot use a SCH_FIELD_VALIDATOR).
|
||||
bool use_validator = m_fieldId == REFERENCE_FIELD
|
||||
// Predefined fields cannot contain some chars and cannot be empty, so they need a
|
||||
// SCH_FIELD_VALIDATOR (m_StyledTextCtrl cannot use a SCH_FIELD_VALIDATOR).
|
||||
if( m_fieldId == REFERENCE_FIELD
|
||||
|| m_fieldId == FOOTPRINT_FIELD
|
||||
|| m_fieldId == DATASHEET_FIELD
|
||||
|| m_fieldId == SHEETNAME_V
|
||||
|| m_fieldId == SHEETFILENAME_V;
|
||||
|
||||
if( use_validator )
|
||||
|| m_fieldId == SHEETFILENAME_V )
|
||||
{
|
||||
m_TextCtrl->SetValidator( FIELD_VALIDATOR( m_fieldId, &m_text ) );
|
||||
SetInitialFocus( m_TextCtrl );
|
||||
|
@ -190,9 +188,8 @@ void DIALOG_FIELD_PROPERTIES::init()
|
|||
|
||||
GetSizer()->SetSizeHints( this );
|
||||
|
||||
// Adjust the height of the scintilla text editor after the first layout
|
||||
// To show only one line
|
||||
// (multiline text are is supported in fields and will be removed)
|
||||
// Adjust the height of the scintilla editor after the first layout to show a single line
|
||||
// (multiline text is not supported in fields and will be removed)
|
||||
if( m_StyledTextCtrl->IsShown() )
|
||||
{
|
||||
wxSize maxSize = m_StyledTextCtrl->GetSize();
|
||||
|
|
|
@ -677,10 +677,7 @@ void SCH_FIELD::OnScintillaCharAdded( SCINTILLA_TRICKS* aScintillaTricks,
|
|||
int start = scintilla->WordStartPosition( pos, true );
|
||||
wxString partial;
|
||||
|
||||
// Currently, '\n' is not allowed in fields. So remove it when entered
|
||||
// TODO: see if we must close the dialog. However this is not obvious, as
|
||||
// if a \n is typed (and removed) when a text is selected, this text is deleted
|
||||
// (in fact replaced by \n, that is removed by the filter)
|
||||
// Multi-line fields are not allowed. So remove '\n' if entered.
|
||||
if( key == '\n' )
|
||||
{
|
||||
wxString text = scintilla->GetText();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2020-2022 KiCad Developers, see change_log.txt for contributors.
|
||||
* Copyright (C) 2020-2023 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -60,6 +60,7 @@ protected:
|
|||
|
||||
void onCharHook( wxKeyEvent& aEvent );
|
||||
void onChar( wxStyledTextEvent& aEvent );
|
||||
void onModified( wxStyledTextEvent& aEvent );
|
||||
void onScintillaUpdateUI( wxStyledTextEvent& aEvent );
|
||||
void onThemeChanged( wxSysColourChangedEvent &aEvent );
|
||||
|
||||
|
|
Loading…
Reference in New Issue