From c566e26326e3287df3fa19ac7984bfa250ddaf1c Mon Sep 17 00:00:00 2001
From: Charles PIGNEROL <>
Date: Tue, 12 Mar 2024 16:43:12 +0100
Subject: [PATCH 1/2] Pre-version 6.4.1. Several QtPythonConsole fixes (python
3/Qt 5).
---
cmake/version.cmake | 4 +-
src/QtPython3/QtPythonConsole.cpp | 115 +++-----
.../public/QtPython3/QtPythonConsole.h | 245 ++++++------------
versions.txt | 6 +
4 files changed, 126 insertions(+), 244 deletions(-)
diff --git a/cmake/version.cmake b/cmake/version.cmake
index 49bfb6e..58dae28 100644
--- a/cmake/version.cmake
+++ b/cmake/version.cmake
@@ -5,12 +5,12 @@
# Pour la bibliothèque QtPython :
set (QT_PYTHON_MAJOR_VERSION "6")
set (QT_PYTHON_MINOR_VERSION "4")
-set (QT_PYTHON_RELEASE_VERSION "0")
+set (QT_PYTHON_RELEASE_VERSION "1")
set (QT_PYTHON_VERSION ${QT_PYTHON_MAJOR_VERSION}.${QT_PYTHON_MINOR_VERSION}.${QT_PYTHON_RELEASE_VERSION})
# Pour la bibliothèque QtPython3 :
set (QT_PYTHON_3_MAJOR_VERSION "6")
set (QT_PYTHON_3_MINOR_VERSION "4")
-set (QT_PYTHON_3_RELEASE_VERSION "0")
+set (QT_PYTHON_3_RELEASE_VERSION "1")
set (QT_PYTHON_3_VERSION ${QT_PYTHON_3_MAJOR_VERSION}.${QT_PYTHON_3_MINOR_VERSION}.${QT_PYTHON_3_RELEASE_VERSION})
diff --git a/src/QtPython3/QtPythonConsole.cpp b/src/QtPython3/QtPythonConsole.cpp
index a91761f..d4c3a90 100644
--- a/src/QtPython3/QtPythonConsole.cpp
+++ b/src/QtPython3/QtPythonConsole.cpp
@@ -37,9 +37,7 @@ USE_ENCODING_AUTODETECTION
-/* On utilise la fonction python builtin execfile pour exécuter sous Pdb
- * des fichiers. Fonctionne bien avec Python 2.6 et 2.7, Pdb s'arrête bien aux
- * points d'arrêt demandés.
+/* On utilise la fonction python builtin execfile pour exécuter sous Pdb des fichiers. Fonctionne bien avec Python 2.6 et 2.7, Pdb s'arrête bien aux points d'arrêt demandés.
* Pb : cette fonction n'existe plus en Python 3.x, il faudra la réécrire.
*/
//#define USE_EXECFILE_PYTHON_FUNCTION 1
@@ -383,9 +381,7 @@ void QtPythonConsole::InstructionsFile::addLines (const vector
*
*
- * L'exécution du code est effectuée séquentiellement (pas de retour en arrière - * dans le code), au fur et à mesure ou en mode debug, où les - * instructions sont alors exécutées à la demande, en mode continu ou - * pas à pas, avec possibilité de positionner des points d'arrêt. + * L'exécution du code est effectuée séquentiellement (pas de retour en arrière dans le code), au fur et à mesure ou en mode debug, où les + * instructions sont alors exécutées à la demande, en mode continu ou pas à pas, avec possibilité de positionner des points d'arrêt. *
* - *Cette classe est en mesure d'afficher les sorties standard et erreur des - * commandes exécutées via une instance de la classe LogOutputStream. - * Elle peut également insérer des commandes scriptables dans la console - * transmises via la méthode log. + *
Cette classe est en mesure d'afficher les sorties standard et erreur des commandes exécutées via une instance de la classe LogOutputStream. + * Elle peut également insérer des commandes scriptables dans la console transmises via la méthode log. *
* - *Cette classe propose une complétion d'instruction reposant sur
- * readline. Cependant cette complétion est limitée (arguments non
- * renseignés) lorsqu'il s'agit d'un binding Swig car il repose sur une
- * transmission d'arguments de type varargs. Cette classe propose
- * néanmoins de faire un effort de recherche de signature, activable via
- * enableSwigCompletion. La complétion est appelable via la
- * combinaison de touches CTRL + Tab. Elle requiert d'être un peu
- * aidée (début de nom de fonction déjà saisi).
- * Depuis la version 2.6.0 de cette bibliothèque, la complétion ne prend pas
- * en compte les méthodes dont la signature comporte
- * UnusedStructForSwigCompletion. Ce dispositif permet de renseigner de
- * manière exacte la signature d'une méthode n'ayant qu'une seule signature. En
- * effet, dans un tel cas, il n'est pas possible avec SWIG d'obtenir de type
- * des arguments, alors qu'on y arrive si plusieurs choix sont possibles. Une
- * idée est alors par exemple de créer une macro créant une fonction de
- * signature bidon pour les cas où seule une signature est possible. Ex :
+ *
Cette classe propose une complétion d'instruction reposant sur readline. Cependant cette complétion est limitée (arguments non
+ * renseignés) lorsqu'il s'agit d'un binding Swig car il repose sur une transmission d'arguments de type varargs. Cette classe propose
+ * néanmoins de faire un effort de recherche de signature, activable via enableSwigCompletion. La complétion est appelable via la
+ * combinaison de touches CTRL + Tab. Elle requiert d'être un peu aidée (début de nom de fonction déjà saisi).
+ * Depuis la version 2.6.0 de cette bibliothèque, la complétion ne prend pas en compte les méthodes dont la signature comporte
+ * UnusedStructForSwigCompletion. Ce dispositif permet de renseigner de manière exacte la signature d'une méthode n'ayant qu'une seule signature. En
+ * effet, dans un tel cas, il n'est pas possible avec SWIG d'obtenir de type des arguments, alors qu'on y arrive si plusieurs choix sont possibles. Une
+ * idée est alors par exemple de créer une macro créant une fonction de signature bidon pour les cas où seule une signature est possible. Ex :
*
* struct UnusedStructForSwigCompletion { };
* #define SET_SWIG_COMPLETABLE_METHOD(method) \
@@ -83,13 +70,11 @@ typedef struct _object PyObject;
*
*
*
- * La classe QtDecoratedPythonConsole offre cet éditeur accolé à sa - * barre d'icône. L'opérateur -> permet d'invoquer directement les + *
La classe QtDecoratedPythonConsole offre cet éditeur accolé à sa barre d'icône. L'opérateur -> permet d'invoquer directement les * méthodes de l'instance de la classe QtPythonConsole de l'ensemble. *
* - * @warning Ne pas utiliser la méthode setEnabled, mais lui préférer la - * méthode setUsabled qui est thread safe. + * @warning Ne pas utiliser la méthode setEnabled, mais lui préférer la méthode setUsabled qui est thread safe. */ class QtPythonConsole : public QtTextEditor { @@ -98,32 +83,27 @@ class QtPythonConsole : public QtTextEditor public : /** - * Le mode de fonctionnement de la console : Continu, valeur par - * défaut, ou debug. + * Le mode de fonctionnement de la console : Continu, valeur par défaut, ou debug. */ enum RUNNING_MODE { RM_CONTINUOUS, RM_DEBUG }; /** - * La console doit elle supporter les scripts avec le jeu de caractères - * iso-8859-15 (false par défaut) ? + * La console doit elle supporter les scripts avec le jeu de caractères iso-8859-15 (false par défaut) ? */ static bool enableCodingIso8859_15; /** - * La console doit elle faire des efforts de completions en cas d'appels via - * un binding Swig (false par défaut) ? + * La console doit elle faire des efforts de completions en cas d'appels via un binding Swig (false par défaut) ? */ static bool enableSwigCompletion; /** - * La console doit elle s'arrêter lorsque en mode debug une erreur est - * rencontrée ? + * La console doit elle s'arrêter lorsque en mode debug une erreur est rencontrée ? */ static bool stopOnError; /** - * @return Retourne - si possible - le jeu de caractères d'encodage - * du fichier dont le chemin d'accès est transmis en argument. + * @return Retourne - si possible - le jeu de caractères d'encodage du fichier dont le chemin d'accès est transmis en argument. */ static TkUtil::Charset::CHARSET getFileCharset (const std::string& path); @@ -140,14 +120,12 @@ class QtPythonConsole : public QtTextEditor virtual ~QtPythonConsole ( ); /** - * @return La largeur souhaitée pour l'affichage des numéros de ligne - * et breakpoints. + * @return La largeur souhaitée pour l'affichage des numéros de ligne et breakpoints. */ virtual int lineNumberAreaWidth ( ) const; /** - * Dessine les numéros de ligne et icônes dans le rectangle transmis en - * argument. + * Dessine les numéros de ligne et icônes dans le rectangle transmis en argument. */ virtual void drawLinesNumbers (const QRect& rect); @@ -177,14 +155,12 @@ class QtPythonConsole : public QtTextEditor virtual void insert (const std::string& fileName, std::string& warnings); /** - * Ajoute un point d'arrêt à la ligne dont le numéro est transmis en - * argument (premier numéro : 1). + * Ajoute un point d'arrêt à la ligne dont le numéro est transmis en argument (premier numéro : 1). */ virtual void addBreakpoint (size_t line); /** - * Enlève le point d'arrêt à la ligne dont le numéro est transmis en - * argument (premier numéro : 1). + * Enlève le point d'arrêt à la ligne dont le numéro est transmis en argument (premier numéro : 1). */ virtual void removeBreakpoint (size_t line); @@ -194,8 +170,7 @@ class QtPythonConsole : public QtTextEditor virtual void clearBreakpoints ( ); /** - * Exécute le script à partir de la ligne d'exécution courante. Prend en - * compte le mode d'exécution (continu/debug). + * Exécute le script à partir de la ligne d'exécution courante. Prend en compte le mode d'exécution (continu/debug). * @see isRunning; * @see stop */ @@ -211,8 +186,7 @@ class QtPythonConsole : public QtTextEditor /** * @return true si l'instance est en train d'exécuter des instructions (même si en mode pas à pas, ou exécution d'un - * fichier via execFile), false dans le cas contraire. En cas d'exécution d'un fichier - * isExecutingFile retournera également true. + * fichier via execFile), false dans le cas contraire. En cas d'exécution d'un fichier isExecutingFile retournera également true. * @see isHalted * @see run * @see execFile @@ -228,8 +202,7 @@ class QtPythonConsole : public QtTextEditor virtual bool isExecutingFile ( ) const; /** - * @return true si l'instance est actuellement arrêtée et dans - * l'attente d'un ordre de reprise (suivant, continuer). + * @return true si l'instance est actuellement arrêtée et dans l'attente d'un ordre de reprise (suivant, continuer). * @see isRunning */ virtual bool isHalted ( ) const; @@ -304,22 +277,17 @@ class QtPythonConsole : public QtTextEditor bool runnable ( ) const; /** - * @return true si l'instruction appartient à un bloc (boucle - * for, while, ..., if, ..., try, - * ..., sinon false. + * @return true si l'instruction appartient à un bloc (boucle for, while, ..., if, ..., try, ..., sinon false. */ bool partOfBlock ( ) const; /** - * @return true si l'instruction transmise en argument est - * de nature multilignes (début d'instruction for, if, while, - * try), false dans le cas contraire. + * @return true si l'instruction transmise en argument est de nature multilignes (début d'instruction for, if, while, try), false dans le cas contraire. */ static bool isMultiline (const std::string& instruction); /** - * @return true si l'instruction transmise en argument est - * exécutable, false dans le cas contraire. + * @return true si l'instruction transmise en argument est exécutable, false dans le cas contraire. */ static bool isRunnable (const std::string& instruction); @@ -345,10 +313,7 @@ class QtPythonConsole : public QtTextEditor { return _type; } // Marche moyennement avec le syntax highlighting ! - static const QtScriptTextFormat commentFormat, emptyLineFormat, - instructionFormat, - ranInstructionFormat, - failedInstructionFormat, tryFormat; + static const QtScriptTextFormat commentFormat, emptyLineFormat, instructionFormat, ranInstructionFormat, failedInstructionFormat, tryFormat; static const QtScriptTextFormat& textFormat (const Instruction& ins); @@ -389,8 +354,7 @@ class QtPythonConsole : public QtTextEditor virtual QAction& removeBreakPointAction ( ); /** - * @return L'action "enlever tous les points d'arrêt" associée à - * l instance. + * @return L'action "enlever tous les points d'arrêt" associée à instance. */ virtual QAction& removeAllBreakPointsAction ( ); @@ -422,7 +386,7 @@ class QtPythonConsole : public QtTextEditor * Fonction callback appelée lorsqu'une ligne de la console vient d'être exécutée. Actualise la console. * @param numéro de ligne venant d'être exécutée * @param true si la ligne s'est correctement exécutée, false en cas d'erreur. - * * @param Message décrivant l'éventuelle erreur rencontrée + * @param Message décrivant l'éventuelle erreur rencontrée */ virtual void lineProcessedCallback (size_t consoleLine, bool ok, const std::string& error); @@ -432,81 +396,65 @@ class QtPythonConsole : public QtTextEditor //@{ /** - * @return L'éventuel flux sortant de messages utilisé pour écrire les - * instructions exécutées dans des scripts. + * @return L'éventuel flux sortant de messages utilisé pour écrire les instructions exécutées dans des scripts. */ virtual TkUtil::LogDispatcher& getLogDispatcher ( ); /** - * @return L'éventuel flux sortant de messages utilisé pour afficher - * des messages sur le déroulement des commandes exécutées. + * @return L'éventuel flux sortant de messages utilisé pour afficher des messages sur le déroulement des commandes exécutées. * @see setLogStream * @see log - * @warning Ce flux n'est pas adopté, et sa destruction reste de ce fait à - * la charge de l'appelant. + * @warning Ce flux n'est pas adopté, et sa destruction reste de ce fait à la charge de l'appelant. */ virtual TkUtil::LogOutputStream* getLogStream ( ); /** - * @param Le flux sortant de messages à utiliser pour afficher des - * messages sur le déroulement des commandes exécutées. + * @param Le flux sortant de messages à utiliser pour afficher des messages sur le déroulement des commandes exécutées. * @see getLogStream * @see log */ virtual void setLogStream (TkUtil::LogOutputStream* stream); /** - * Affiche le message transmis en arguments dans le flux sortant de messages - * associé à l'instance. + * Affiche le message transmis en arguments dans le flux sortant de messages associé à l'instance. * @see getLogStream */ virtual void log (const TkUtil::Log& log); /** - * @param Les résultats contenant la chaine transmise en argument doivent - * être masqués. + * @param Les résultats contenant la chaine transmise en argument doivent être masqués. */ virtual void hideResult (const std::string& str); /** - * Ajoute la commande transmise en argument, si il (le panneau) n'en est pas - * à l'origine, à l'historique des commandes exécutées, mais ne l'exécute - * pas. Présente l'intérêt d'intercaller des commandes effectuées par - * ailleurs. + * Ajoute la commande transmise en argument, si il (le panneau) n'en est pas à l'origine, à l'historique des commandes exécutées, mais ne l'exécute + * pas. Présente l'intérêt d'intercaller des commandes effectuées par ailleurs. * @param Commande à ajouter * @param Commentaires associés à la commande. * @param Sortie de la commande à ajouter. * @param Status en erreur ou non de la commande - * @param true si la commande vient du noyau, false - * si elle vient d'ailleurs (par exemple de la console python). + * @param true si la commande vient du noyau, false si elle vient d'ailleurs (par exemple de la console python). * @see setPythonOutputStream */ - virtual void addToHistoric ( - const IN_UTIL UTF8String& command, const IN_UTIL UTF8String& comments, - const IN_UTIL UTF8String& commandOutput, bool statusErr, - bool fromKernel = false); + virtual void addToHistoric (const IN_UTIL UTF8String& command, const IN_UTIL UTF8String& comments, const IN_UTIL UTF8String& commandOutput, bool statusErr, bool fromKernel = false); /** - * @return Nom de l'interpréteur python (ex : nom de l'application), - * pour les messages d'erreur. + * @return Nom de l'interpréteur python (ex : nom de l'application), pour les messages d'erreur. * @see setInterpreterName */ virtual const IN_STD string& getInterpreterName ( ) const; /** - * @param Nom de l'interpréteur python (ex : nom de l'application), - * pour les messages d'erreur. + * @param Nom de l'interpréteur python (ex : nom de l'application), pour les messages d'erreur. * @see getInterpreterName */ virtual void setInterpreterName (const IN_STD string& name); /** - *Flux standards (stdout et stderr) récupérés - * (true) ou non (false) par la session python lors de + *
Flux standards (stdout et stderr) récupérés (true) ou non (false) par la session python lors de * l'exécution de commandes ou fichiers scripts.
- *
L'intérêt de le faire est que les sorties figurent dans les - * logs. L'intérêt de ne pas le faire est en cas de plantage où ces + *
L'intérêt de le faire est que les sorties figurent dans les logs. L'intérêt de ne pas le faire est en cas de plantage où ces * traces, éventuellement utiles à la mise au point, sont perdues. *
*/ @@ -552,8 +500,7 @@ class QtPythonConsole : public QtTextEditor protected : /** - *Classe représentant une séquence d'instructions Python issue de la console et mises dans un fichier temporaire qui sera exécuté, en mode - * debug ou non. + *
Classe représentant une séquence d'instructions Python issue de la console et mises dans un fichier temporaire qui sera exécuté, en mode debug ou non. *
*Par convention les numéros de ligne commencent à 1. *
@@ -676,7 +623,7 @@ class QtPythonConsole : public QtTextEditor /** Le fichier temporaire utilisé. */ std::unique_ptr- * Classe de widget comprenant une instance de la classe QtPythonConsole - * accolée à sa barre d'icônes. L'opérateur -> permet d'invoquer - * directement les méthodes de l'instance associée de la classe - * QtPythonConsole. + * Classe de widget comprenant une instance de la classe QtPythonConsole accolée à sa barre d'icônes. L'opérateur -> permet d'invoquer + * directement les méthodes de l'instance associée de la classe QtPythonConsole. *
*/ class QtDecoratedPythonConsole : public QMainWindow @@ -1131,8 +1045,7 @@ class QtDecoratedPythonConsole : public QMainWindow virtual QtPythonConsole& getPythonConsole ( ); /** - * Invoquer directement des méthodes de l'instance de la console python - * associée. + * Invoquer directement des méthodes de l'instance de la console python associée. */ virtual const QtPythonConsole* operator -> ( ) const; virtual QtPythonConsole* operator -> ( ); diff --git a/versions.txt b/versions.txt index cd0b7c6..093f2ef 100644 --- a/versions.txt +++ b/versions.txt @@ -1,3 +1,9 @@ +Version 6.4.1 : (en cours) 12/03/24 +=============== + +Divers correctifs console python 3 (environnement Qt 5). + + Version 6.4.0 : 13/12/23 =============== From 6edcb830e1042c0ed9b72e9a846ed5cfe4c28ca2 Mon Sep 17 00:00:00 2001 From: Charles PIGNEROL <> Date: Fri, 15 Mar 2024 14:26:55 +0100 Subject: [PATCH 2/2] Version 6.4.1. Several QtPythonConsole fixes (python 3/Qt 5). --- cmake/version.cmake | 2 +- src/QtPython3/QtPythonConsole.cpp | 59 ++++++++++++++++++++----------- versions.txt | 2 +- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/cmake/version.cmake b/cmake/version.cmake index 58dae28..3acb522 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -5,7 +5,7 @@ # Pour la bibliothèque QtPython : set (QT_PYTHON_MAJOR_VERSION "6") set (QT_PYTHON_MINOR_VERSION "4") -set (QT_PYTHON_RELEASE_VERSION "1") +set (QT_PYTHON_RELEASE_VERSION "0") set (QT_PYTHON_VERSION ${QT_PYTHON_MAJOR_VERSION}.${QT_PYTHON_MINOR_VERSION}.${QT_PYTHON_RELEASE_VERSION}) # Pour la bibliothèque QtPython3 : diff --git a/src/QtPython3/QtPythonConsole.cpp b/src/QtPython3/QtPythonConsole.cpp index d4c3a90..cd00889 100644 --- a/src/QtPython3/QtPythonConsole.cpp +++ b/src/QtPython3/QtPythonConsole.cpp @@ -580,7 +580,10 @@ bool QtPythonConsole::stopOnError = true; const QSize QtPythonConsole::iconSize (32, 32); bool QtPythonConsole::_catchStdOutputs = true; +// QTextCharFormat : zone avec du texte +// QTextBlockFormat : le reste du bloc static QTextBlockFormat defaultBlockFormat; +static QTextCharFormat defaultCharFormat; static QBrush defaultBackground; @@ -750,6 +753,7 @@ QtPythonConsole::QtPythonConsole (QWidget* parent, const string& appName) { setCenterOnScroll (true); QTextCursor cursor = textCursor ( ); + defaultCharFormat = cursor.charFormat ( ); defaultBlockFormat = cursor.blockFormat ( ); defaultBackground = defaultBlockFormat.background ( ); @@ -780,8 +784,7 @@ QtPythonConsole::QtPythonConsole (QWidget* parent, const string& appName) // Enlève tous les points d'arrêt. _clearBreakPointsAction = new QAction (QIcon (":/images/clear_breakpoints.png"), QSTR ("Enlever tous les points d'arrêt"),this); connect (_clearBreakPointsAction, SIGNAL (triggered ( )), this, SLOT (clearBreakPointsCallback( ))); - // Affiche un sélecteur de fichier de chargement de script au point - // d'édition courant : + // Affiche un sélecteur de fichier de chargement de script au point d'édition courant : _insertScriptAction = new QAction (QIcon (":/images/load_script.png"), QSTR ("Insérer un script ..."), this); connect (_insertScriptAction, SIGNAL (triggered ( )), this, SLOT (insertScriptCallback( ))); @@ -987,7 +990,7 @@ void QtPythonConsole::setRunningMode (QtPythonConsole::RUNNING_MODE mode) case QtPythonConsole::RM_DEBUG : try { - _waitingForRunning = false; // v 1.14.0 + _waitingForRunning = false; quitDbg ( ); } catch (...) @@ -1009,8 +1012,7 @@ void QtPythonConsole::insert (const string& fileName, string& warnings) // On se met en début de ligne courante : moveCursor (QTextCursor::StartOfBlock, QTextCursor::MoveAnchor); - Charset::CHARSET streamCharset = getFileCharset (fileName); // v 3.3.0 -// streamCharset = Charset::UNKNOWN == streamCharset ? Charset::ASCII : streamCharset; + Charset::CHARSET streamCharset = getFileCharset (fileName); streamCharset = Charset::UNKNOWN == streamCharset ? Charset::UTF_8 : streamCharset; // v 5.1.7, éviter un rejet de conversion si caractère accentué // UTF-16 : les sauts de ligne ne sont pas des \n => réécrire différemment la lecture du fichier. @@ -1021,7 +1023,7 @@ void QtPythonConsole::insert (const string& fileName, string& warnings) if ((false == stream.good ( )) && (false == stream.eof ( ))) throw Exception ("Fichier invalide."); char buffer [10001]; - const size_t currentExecLine = _currentExecLine; // v 5.1.7 + const size_t currentExecLine = _currentExecLine; while ((true == stream.good ( )) && (false == stream.eof ( ))) { memset (buffer, '\0', 10001); @@ -1240,9 +1242,9 @@ void QtPythonConsole::validateCursorPosition ( ) block = document ( )->lastBlock ( ); cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); cursor = textCursor ( ); - // Les 2 instructions suivantes sont nécessaires pour que les - // lignes ajoutées ne soient pas en mode "exécutées" : + // Les 2 instructions suivantes sont nécessaires pour que les lignes ajoutées ne soient pas en mode "exécutées" : cursor.setBlockFormat (defaultBlockFormat); + setCurrentCharFormat (defaultCharFormat); appendPlainText (""); } } // if (_currentExecLine > document ( )->blockCount ( )) @@ -1250,7 +1252,8 @@ void QtPythonConsole::validateCursorPosition ( ) { block = document ( )->findBlockByNumber (_currentExecLine - 1); cursor.setPosition (block.position ( ), QTextCursor::MoveAnchor); - cursor.setBlockFormat (defaultBlockFormat); +// cursor.setCharFormat (defaultCharFormat); // v 6.4.1 +// cursor.setBlockFormat (defaultBlockFormat); // v 6.4.1 } // else if (_currentExecLine > document ( )->blockCount ( )) } catch (...) @@ -1568,29 +1571,39 @@ void QtPythonConsole::lineProcessedCallback (size_t line, bool ok, const string& { if (false == isComment) { - // Tant que les lignes précédentes sont des commentaires on les récupère pour les ajouter au fichier script. - QTextBlockFormat bformat = block.blockFormat ( ); // v6.4.1 - bformat.setBackground (true == ok ? QtScriptTextFormat::ranInstructionFormat.background ( ) : QtScriptTextFormat::failedInstructionFormat.background ( )); // v 6.4.1 + // Tant que les lignes précédentes sont des commentaires on les récupère pour les ajouter au fichier script + colorisation dans la console : UTF8String comments (Charset::UTF_8); size_t bl = true == isComment ? line - 1 : line - 2; bool stopped = 2 > bl ? true : false; while (false == stopped) { - const QTextBlock b = document()->findBlockByNumber(bl); - const string l = b.text ( ).toStdString ( ); + const QTextBlock b = document()->findBlockByNumber(bl); + const string l = b.text ( ).toStdString ( ); + bool colorize = true; // v 6.4.1. Coloriser la console couleur "déjà joué" ? + if ((true == l.empty ( )) || ('#' != l [0]) || (bl <= 0)) { + if (false == l.empty ( )) + colorize = false; stopped = true; bl = bl < line - 1 ? bl + 1 : line - 1; } else { - QTextCursor cursor (b); // v 6.4.1 - cursor.select (QTextCursor::LineUnderCursor); // v 6.4.1 - - cursor.setBlockFormat (bformat); // v 6.4.1 bl--; } // else if ((true == l.empty ( )) || ('#' != l [0]) || (bl <= 0)) + + if (true == colorize) // v 6.4.1 + { + QTextCursor cursor (b); + QTextBlockFormat commentBlockFormat = b.blockFormat ( ); + QTextCharFormat commentCharFormat = b.charFormat ( ); + cursor.select (QTextCursor::LineUnderCursor); + commentBlockFormat.setBackground (QtScriptTextFormat::ranInstructionFormat.background ( )); + commentCharFormat.setBackground (QtScriptTextFormat::ranInstructionFormat.background ( )); + cursor.setBlockFormat (commentBlockFormat); + cursor.setCharFormat (commentCharFormat); + } // if (true == colorize) } // while (false == stopped) for (size_t i = bl; i < line - 1; i++) { @@ -1605,19 +1618,24 @@ void QtPythonConsole::lineProcessedCallback (size_t line, bool ok, const string& getLogDispatcher ( ).log (ScriptingLog (instruction, comments)); } // if (false == isComment) } // if (line >= maxExecLine ( )) + QTextCharFormat cformat = block.charFormat ( ); // v 6.4.1 QTextBlockFormat bformat = block.blockFormat ( ); bformat.setProperty (QTextFormat::FullWidthSelection, true); + cformat.setBackground (true == ok ? QtScriptTextFormat::ranInstructionFormat.background ( ) : QtScriptTextFormat::failedInstructionFormat.background ( )); // v 6.4.1 bformat.setBackground (true == ok ? QtScriptTextFormat::ranInstructionFormat.background ( ) : QtScriptTextFormat::failedInstructionFormat.background ( )); QTextCursor cursor (block); // v 6.4.1 cursor.select (QTextCursor::LineUnderCursor); // v 6.4.1 why BlockUnderCursor does not work ??? + cursor.setCharFormat (cformat); cursor.setBlockFormat (bformat); if (true == cursor.atEnd ( )) { cursor.clearSelection ( ); QTextBlockFormat newformat = block.blockFormat ( ); - bformat.setBackground (QtScriptTextFormat::emptyLineFormat.background ( )); + newformat.setBackground (QtScriptTextFormat::emptyLineFormat.background ( )); // v 6.4.1 cursor.setBlockFormat (newformat); + cformat.setBackground (QtScriptTextFormat::emptyLineFormat.background ( )); // v 6.4.1 + cursor.setCharFormat (cformat); // v 6.4.1 cursor.insertBlock (newformat, QtScriptTextFormat::emptyLineFormat); } // if (true == cursor.atEnd ( )) addToHistoric (instruction); @@ -2346,7 +2364,6 @@ size_t QtPythonConsole::followingInstruction (size_t line) const void QtPythonConsole::addInstruction (const string& instruction) { // Un instruction en cours est peut être à compléter : - const size_t pendingLinesCount = Instruction (_pendingString).lineCount ( ); // v 6.4.1 _pendingString += instruction; // Commentaire, ligne blanche, ... : on ajoute et on passe à la suite. @@ -2396,7 +2413,7 @@ void QtPythonConsole::addInstruction (const string& instruction) void QtPythonConsole::execInstructions ( ) { -// EndOfDocCursor endOfDocCursor (*this); 241 +// EndOfDocCursor endOfDocCursor (*this); v 6.4.1 setRunningMode (QtPythonConsole::RM_CONTINUOUS); _running = true; diff --git a/versions.txt b/versions.txt index 093f2ef..4ddf1a9 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ -Version 6.4.1 : (en cours) 12/03/24 +Version 6.4.1 : 15/03/24 =============== Divers correctifs console python 3 (environnement Qt 5).