From 96db7ad4f3c372a8315a6621fc22ad03df13e56f Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 4 Oct 2020 13:11:54 +1000 Subject: [PATCH] Ensure that all open code editors respond immediately to color/font changes --- python/gui/auto_generated/qgscodeeditor.sip.in | 9 +++++++++ python/gui/auto_generated/qgscodeeditorcss.sip.in | 3 +++ .../auto_generated/qgscodeeditorexpression.sip.in | 5 +++++ python/gui/auto_generated/qgscodeeditorhtml.sip.in | 3 +++ python/gui/auto_generated/qgscodeeditorjs.sip.in | 3 +++ python/gui/auto_generated/qgscodeeditorpython.sip.in | 5 +++++ python/gui/auto_generated/qgscodeeditorsql.sip.in | 4 ++++ src/gui/qgscodeeditor.cpp | 12 ++++++++++++ src/gui/qgscodeeditor.h | 9 +++++++++ src/gui/qgscodeeditorcss.cpp | 4 ++-- src/gui/qgscodeeditorcss.h | 4 ++-- src/gui/qgscodeeditorexpression.cpp | 1 - src/gui/qgscodeeditorexpression.h | 5 ++++- src/gui/qgscodeeditorhtml.cpp | 4 ++-- src/gui/qgscodeeditorhtml.h | 4 ++-- src/gui/qgscodeeditorjs.cpp | 4 ++-- src/gui/qgscodeeditorjs.h | 4 ++-- src/gui/qgscodeeditorpython.cpp | 8 ++++---- src/gui/qgscodeeditorpython.h | 7 ++++--- src/gui/qgscodeeditorsql.h | 7 +++---- 20 files changed, 80 insertions(+), 25 deletions(-) diff --git a/python/gui/auto_generated/qgscodeeditor.sip.in b/python/gui/auto_generated/qgscodeeditor.sip.in index ee4565fa22f..5d4e233fcfb 100644 --- a/python/gui/auto_generated/qgscodeeditor.sip.in +++ b/python/gui/auto_generated/qgscodeeditor.sip.in @@ -165,6 +165,15 @@ Returns the monospaced font to use for code editors. virtual void keyPressEvent( QKeyEvent *event ); + virtual void initializeLexer(); +%Docstring +Called when the dialect specific code lexer needs to be initialized (or reinitialized). + +The default implementation does nothing. + +.. versionadded:: 3.16 +%End + }; diff --git a/python/gui/auto_generated/qgscodeeditorcss.sip.in b/python/gui/auto_generated/qgscodeeditorcss.sip.in index e840d547f76..5baa4236834 100644 --- a/python/gui/auto_generated/qgscodeeditorcss.sip.in +++ b/python/gui/auto_generated/qgscodeeditorcss.sip.in @@ -29,6 +29,9 @@ code autocompletion. Constructor for QgsCodeEditorCSS %End + protected: + virtual void initializeLexer(); + }; /************************************************************************ diff --git a/python/gui/auto_generated/qgscodeeditorexpression.sip.in b/python/gui/auto_generated/qgscodeeditorexpression.sip.in index 798bce95acf..f86d2dd4ff0 100644 --- a/python/gui/auto_generated/qgscodeeditorexpression.sip.in +++ b/python/gui/auto_generated/qgscodeeditorexpression.sip.in @@ -41,6 +41,11 @@ Will also reload all globally registered functions. Field names will be added to the API. %End + protected: + + virtual void initializeLexer(); + + }; diff --git a/python/gui/auto_generated/qgscodeeditorhtml.sip.in b/python/gui/auto_generated/qgscodeeditorhtml.sip.in index 0f616eee032..916ba8ae6aa 100644 --- a/python/gui/auto_generated/qgscodeeditorhtml.sip.in +++ b/python/gui/auto_generated/qgscodeeditorhtml.sip.in @@ -32,6 +32,9 @@ code autocompletion. Constructor for QgsCodeEditorHTML %End + protected: + virtual void initializeLexer(); + }; /************************************************************************ diff --git a/python/gui/auto_generated/qgscodeeditorjs.sip.in b/python/gui/auto_generated/qgscodeeditorjs.sip.in index 131c096ec09..6bd7fb02333 100644 --- a/python/gui/auto_generated/qgscodeeditorjs.sip.in +++ b/python/gui/auto_generated/qgscodeeditorjs.sip.in @@ -29,6 +29,9 @@ code autocompletion. Constructor for QgsCodeEditorJavascript %End + protected: + virtual void initializeLexer(); + }; /************************************************************************ diff --git a/python/gui/auto_generated/qgscodeeditorpython.sip.in b/python/gui/auto_generated/qgscodeeditorpython.sip.in index f12cd5c306b..94bea7b646a 100644 --- a/python/gui/auto_generated/qgscodeeditorpython.sip.in +++ b/python/gui/auto_generated/qgscodeeditorpython.sip.in @@ -52,6 +52,11 @@ Load a script file :param script: The script file to load %End + protected: + + virtual void initializeLexer(); + + }; /************************************************************************ diff --git a/python/gui/auto_generated/qgscodeeditorsql.sip.in b/python/gui/auto_generated/qgscodeeditorsql.sip.in index af123a52761..104c37e2fa1 100644 --- a/python/gui/auto_generated/qgscodeeditorsql.sip.in +++ b/python/gui/auto_generated/qgscodeeditorsql.sip.in @@ -38,6 +38,10 @@ Set field names to be added to the lexer API. .. versionadded:: 3.14 %End + protected: + virtual void initializeLexer(); + + }; diff --git a/src/gui/qgscodeeditor.cpp b/src/gui/qgscodeeditor.cpp index e2a2e08fbb9..3bb0f442c57 100644 --- a/src/gui/qgscodeeditor.cpp +++ b/src/gui/qgscodeeditor.cpp @@ -18,6 +18,7 @@ #include "qgscodeeditor.h" #include "qgssettings.h" #include "qgssymbollayerutils.h" +#include "qgsgui.h" #include #include @@ -82,6 +83,12 @@ QgsCodeEditor::QgsCodeEditor( QWidget *parent, const QString &title, bool foldin SendScintilla( SCI_SETADDITIONALSELECTIONTYPING, 1 ); SendScintilla( SCI_SETMULTIPASTE, 1 ); SendScintilla( SCI_SETVIRTUALSPACEOPTIONS, SCVS_RECTANGULARSELECTION ); + + connect( QgsGui::instance(), &QgsGui::optionsChanged, this, [ = ] + { + setSciWidget(); + initializeLexer(); + } ); } // Workaround a bug in QScintilla 2.8.X @@ -128,6 +135,11 @@ void QgsCodeEditor::keyPressEvent( QKeyEvent *event ) } } +void QgsCodeEditor::initializeLexer() +{ + +} + void QgsCodeEditor::setSciWidget() { QFont font = getMonospaceFont(); diff --git a/src/gui/qgscodeeditor.h b/src/gui/qgscodeeditor.h index fe2d32301df..cd3616e8ca7 100644 --- a/src/gui/qgscodeeditor.h +++ b/src/gui/qgscodeeditor.h @@ -173,6 +173,15 @@ class GUI_EXPORT QgsCodeEditor : public QsciScintilla void focusOutEvent( QFocusEvent *event ) override; void keyPressEvent( QKeyEvent *event ) override; + /** + * Called when the dialect specific code lexer needs to be initialized (or reinitialized). + * + * The default implementation does nothing. + * + * \since QGIS 3.16 + */ + virtual void initializeLexer(); + private: void setSciWidget(); diff --git a/src/gui/qgscodeeditorcss.cpp b/src/gui/qgscodeeditorcss.cpp index 5ee52fe86e1..a8ad62380e2 100644 --- a/src/gui/qgscodeeditorcss.cpp +++ b/src/gui/qgscodeeditorcss.cpp @@ -31,10 +31,10 @@ QgsCodeEditorCSS::QgsCodeEditorCSS( QWidget *parent ) } setMarginVisible( false ); setFoldingVisible( true ); - setSciLexerCSS(); + initializeLexer(); } -void QgsCodeEditorCSS::setSciLexerCSS() +void QgsCodeEditorCSS::initializeLexer() { QsciLexerCSS *lexer = new QsciLexerCSS( this ); lexer->setDefaultFont( getMonospaceFont() ); diff --git a/src/gui/qgscodeeditorcss.h b/src/gui/qgscodeeditorcss.h index 8e7d2dd4964..b575ad55056 100644 --- a/src/gui/qgscodeeditorcss.h +++ b/src/gui/qgscodeeditorcss.h @@ -38,8 +38,8 @@ class GUI_EXPORT QgsCodeEditorCSS : public QgsCodeEditor //! Constructor for QgsCodeEditorCSS QgsCodeEditorCSS( QWidget *parent SIP_TRANSFERTHIS = nullptr ); - private: - void setSciLexerCSS(); + protected: + void initializeLexer() override; }; #endif diff --git a/src/gui/qgscodeeditorexpression.cpp b/src/gui/qgscodeeditorexpression.cpp index 1ac05d6e6b4..423391db356 100644 --- a/src/gui/qgscodeeditorexpression.cpp +++ b/src/gui/qgscodeeditorexpression.cpp @@ -98,7 +98,6 @@ void QgsCodeEditorExpression::setFields( const QgsFields &fields ) updateApis(); } - void QgsCodeEditorExpression::initializeLexer() { QFont font = getMonospaceFont(); diff --git a/src/gui/qgscodeeditorexpression.h b/src/gui/qgscodeeditorexpression.h index 05ecd8be694..e1bc97b3cf6 100644 --- a/src/gui/qgscodeeditorexpression.h +++ b/src/gui/qgscodeeditorexpression.h @@ -53,8 +53,11 @@ class GUI_EXPORT QgsCodeEditorExpression : public QgsCodeEditor */ void setFields( const QgsFields &fields ); + protected: + + void initializeLexer() override; + private: - void initializeLexer(); void updateApis(); QsciAPIs *mApis = nullptr; QsciLexerSQL *mSqlLexer; diff --git a/src/gui/qgscodeeditorhtml.cpp b/src/gui/qgscodeeditorhtml.cpp index e0ab1d453f1..000db4a3ce9 100644 --- a/src/gui/qgscodeeditorhtml.cpp +++ b/src/gui/qgscodeeditorhtml.cpp @@ -32,10 +32,10 @@ QgsCodeEditorHTML::QgsCodeEditorHTML( QWidget *parent ) } setMarginVisible( false ); setFoldingVisible( true ); - setSciLexerHTML(); + initializeLexer(); } -void QgsCodeEditorHTML::setSciLexerHTML() +void QgsCodeEditorHTML::initializeLexer() { QFont font = getMonospaceFont(); QColor defaultColor = color( ColorRole::Default ); diff --git a/src/gui/qgscodeeditorhtml.h b/src/gui/qgscodeeditorhtml.h index f92667e9bbe..14c2cb4e6ad 100644 --- a/src/gui/qgscodeeditorhtml.h +++ b/src/gui/qgscodeeditorhtml.h @@ -38,8 +38,8 @@ class GUI_EXPORT QgsCodeEditorHTML : public QgsCodeEditor //! Constructor for QgsCodeEditorHTML QgsCodeEditorHTML( QWidget *parent SIP_TRANSFERTHIS = nullptr ); - private: - void setSciLexerHTML(); + protected: + void initializeLexer() override; }; #endif diff --git a/src/gui/qgscodeeditorjs.cpp b/src/gui/qgscodeeditorjs.cpp index 23ba919828e..f5d3d267980 100644 --- a/src/gui/qgscodeeditorjs.cpp +++ b/src/gui/qgscodeeditorjs.cpp @@ -31,10 +31,10 @@ QgsCodeEditorJavascript::QgsCodeEditorJavascript( QWidget *parent ) } setMarginVisible( false ); setFoldingVisible( true ); - setSciLexerJs(); + initializeLexer(); } -void QgsCodeEditorJavascript::setSciLexerJs() +void QgsCodeEditorJavascript::initializeLexer() { QsciLexerJavaScript *lexer = new QsciLexerJavaScript( this ); QFont f = getMonospaceFont(); diff --git a/src/gui/qgscodeeditorjs.h b/src/gui/qgscodeeditorjs.h index 0792433b816..56370fe428b 100644 --- a/src/gui/qgscodeeditorjs.h +++ b/src/gui/qgscodeeditorjs.h @@ -38,8 +38,8 @@ class GUI_EXPORT QgsCodeEditorJavascript : public QgsCodeEditor //! Constructor for QgsCodeEditorJavascript QgsCodeEditorJavascript( QWidget *parent SIP_TRANSFERTHIS = nullptr ); - private: - void setSciLexerJs(); + protected: + void initializeLexer() override; }; #endif // QGSCODEEDITORJS_H diff --git a/src/gui/qgscodeeditorpython.cpp b/src/gui/qgscodeeditorpython.cpp index 8592b402e91..d7a705111a9 100644 --- a/src/gui/qgscodeeditorpython.cpp +++ b/src/gui/qgscodeeditorpython.cpp @@ -34,10 +34,10 @@ QgsCodeEditorPython::QgsCodeEditorPython( QWidget *parent, const QList { setTitle( tr( "Python Editor" ) ); } - setSciLexerPython(); + initializeLexer(); } -void QgsCodeEditorPython::setSciLexerPython() +void QgsCodeEditorPython::initializeLexer() { // current line setCaretWidth( 2 ); @@ -119,7 +119,7 @@ void QgsCodeEditorPython::loadAPIs( const QList &filenames ) { mAPISFilesList = filenames; //QgsDebugMsg( QStringLiteral( "The apis files: %1" ).arg( mAPISFilesList[0] ) ); - setSciLexerPython(); + initializeLexer(); } bool QgsCodeEditorPython::loadScript( const QString &script ) @@ -136,6 +136,6 @@ bool QgsCodeEditorPython::loadScript( const QString &script ) setText( in.readAll().trimmed() ); file.close(); - setSciLexerPython(); + initializeLexer(); return true; } diff --git a/src/gui/qgscodeeditorpython.h b/src/gui/qgscodeeditorpython.h index 6b1f2585b9e..718505fa9cb 100644 --- a/src/gui/qgscodeeditorpython.h +++ b/src/gui/qgscodeeditorpython.h @@ -57,10 +57,11 @@ class GUI_EXPORT QgsCodeEditorPython : public QgsCodeEditor */ bool loadScript( const QString &script ); + protected: + + void initializeLexer() override; + private: - //QgsCodeEditor *mSciWidget; - //QWidget *mWidget; - void setSciLexerPython(); QList mAPISFilesList; QString mPapFile; diff --git a/src/gui/qgscodeeditorsql.h b/src/gui/qgscodeeditorsql.h index 47cbab01ae1..18692c6064b 100644 --- a/src/gui/qgscodeeditorsql.h +++ b/src/gui/qgscodeeditorsql.h @@ -46,11 +46,10 @@ class GUI_EXPORT QgsCodeEditorSQL : public QgsCodeEditor */ void setFields( const QgsFields &fields ); + protected: + void initializeLexer() override; + private: - //QgsCodeEditor *mSciWidget; - //QWidget *mWidget; - void setSciLexerSQL(); - void initializeLexer(); void updateApis(); QsciAPIs *mApis = nullptr; QsciLexerSQL *mSqlLexer;