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& lines, s throw exc; } // if (0 == _tmpStream.get ( )) - // Attention : on peut appeler addLines plusieurs fois pour le même - // script ... _firstLineNum sert ensuite pour faire les conversions - // num script <-> num fichier + // Attention : on peut appeler addLines plusieurs fois pour le même script ... _firstLineNum sert ensuite pour faire les conversions num script <-> num fichier if (0 == _firstLineNum) _firstLineNum = firstLineNum; for (vector::const_iterator it = lines.begin ( ); lines.end ( ) != it; it++) @@ -585,7 +581,6 @@ const QSize QtPythonConsole::iconSize (32, 32); bool QtPythonConsole::_catchStdOutputs = true; static QTextBlockFormat defaultBlockFormat; -static QTextCharFormat defaultCharFormat; static QBrush defaultBackground; @@ -755,7 +750,6 @@ QtPythonConsole::QtPythonConsole (QWidget* parent, const string& appName) { setCenterOnScroll (true); QTextCursor cursor = textCursor ( ); - defaultCharFormat = cursor.charFormat ( ); defaultBlockFormat = cursor.blockFormat ( ); defaultBackground = defaultBlockFormat.background ( ); @@ -945,11 +939,9 @@ void QtPythonConsole::drawLinesNumbers (const QRect& rect) { if ((true == block.isVisible ( )) && (bottom >= rect.top ( ))) { - // Rem : sous Qt 4.7.4 la surimpression (breakpoint, et par dessus - // ligne actuelle) ne fonctionne pas ... (pixmap ? autre ?) + // Rem : sous Qt 4.7.4 la surimpression (breakpoint, et par dessus ligne actuelle) ne fonctionne pas ... (pixmap ? autre ?) // => on n'affiche pas le BP si ligne courrante. - if ((_breakpoints.end ( ) != _breakpoints.find (number)) && - (currentInstruction ( ) != number)) + if ((_breakpoints.end ( ) != _breakpoints.find (number)) && (currentInstruction ( ) != number)) { _breakPointIcon.paint (&painter, 3, top, width, height); } // if (_breakpoints.end ( ) != _breakpoints.find (number)) @@ -1021,8 +1013,7 @@ void QtPythonConsole::insert (const string& fileName, string& warnings) // streamCharset = Charset::UNKNOWN == streamCharset ? Charset::ASCII : streamCharset; 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. + // UTF-16 : les sauts de ligne ne sont pas des \n => réécrire différemment la lecture du fichier. if (Charset::UTF_16 == streamCharset) throw Exception ("Encodage UTF-16 non supporté dans cette version."); @@ -1252,7 +1243,6 @@ void QtPythonConsole::validateCursorPosition ( ) // 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 ( )) @@ -1260,7 +1250,6 @@ void QtPythonConsole::validateCursorPosition ( ) { block = document ( )->findBlockByNumber (_currentExecLine - 1); cursor.setPosition (block.position ( ), QTextCursor::MoveAnchor); - cursor.setCharFormat (defaultCharFormat); cursor.setBlockFormat (defaultBlockFormat); } // else if (_currentExecLine > document ( )->blockCount ( )) } @@ -1568,7 +1557,7 @@ void QtPythonConsole::lineProcessedCallback (size_t line, bool ok, const string& // Gérer les sorties du script python : processPythonOutputs ( ); if (true == _checkingCompletion) - return; // v 5.3.0 + return; // Cette ligne a été jouée (rem : les numéros Qt commencent à 0 ...) : QTextBlock block = document ( )->findBlockByNumber (line-1); @@ -1580,6 +1569,8 @@ 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 UTF8String comments (Charset::UTF_8); size_t bl = true == isComment ? line - 1 : line - 2; bool stopped = 2 > bl ? true : false; @@ -1593,7 +1584,13 @@ void QtPythonConsole::lineProcessedCallback (size_t line, bool ok, const string& 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)) } // while (false == stopped) for (size_t i = bl; i < line - 1; i++) { @@ -1608,40 +1605,26 @@ void QtPythonConsole::lineProcessedCallback (size_t line, bool ok, const string& getLogDispatcher ( ).log (ScriptingLog (instruction, comments)); } // if (false == isComment) } // if (line >= maxExecLine ( )) - // QTextCharFormat : zone avec du texte - // QTextBlockFormat : le reste du bloc - QTextCharFormat cformat = block.charFormat ( ); QTextBlockFormat bformat = block.blockFormat ( ); - cformat.setProperty (QTextFormat::FullWidthSelection, true); bformat.setProperty (QTextFormat::FullWidthSelection, true); - cformat.setBackground (true == ok ? QtScriptTextFormat::ranInstructionFormat.background ( ) : QtScriptTextFormat::failedInstructionFormat.background ( )); - bformat.setBackground ( true == ok ? QtScriptTextFormat::ranInstructionFormat.background ( ) : QtScriptTextFormat::failedInstructionFormat.background ( )); - QTextCursor cursor = textCursor ( ); - const int position= cursor.position ( ); - cursor.setPosition (block.position ( ), QTextCursor::MoveAnchor); - cursor.select (QTextCursor::BlockUnderCursor); - cursor.setCharFormat (cformat); // v 5.0.0 - cursor.setBlockFormat (bformat); // v 5.0.0 + 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.setBlockFormat (bformat); + if (true == cursor.atEnd ( )) { cursor.clearSelection ( ); QTextBlockFormat newformat = block.blockFormat ( ); bformat.setBackground (QtScriptTextFormat::emptyLineFormat.background ( )); - //cursor.insertBlock (newformat, QtScriptTextFormat::emptyLineFormat); cursor.setBlockFormat (newformat); - cursor.setCharFormat (QtScriptTextFormat::emptyLineFormat); cursor.insertBlock (newformat, QtScriptTextFormat::emptyLineFormat); - //appendPlainText (""); // v 5.0.0 } // if (true == cursor.atEnd ( )) addToHistoric (instruction); -// cursor.setCharFormat (cformat); // v 5.0.0 -// cursor.setBlockFormat (bformat); // v 5.0.0 cursor.clearSelection ( ); // On en profite pour s'assurer que la ligne courante est visible : setTextCursor (cursor); ensureCursorVisible ( ); - // On se repositionne là où on était : - cursor.setPosition (position, QTextCursor::MoveAnchor); // On passe à la ligne suivante : _maxExecLine = line > _maxExecLine ? line : _maxExecLine; @@ -1736,7 +1719,6 @@ void QtPythonConsole::addToHistoric ( } // if (linesCount > 1) size_t line = currentInstruction ( ); -// if ((false == isRunning ( )) || (true == isExecutingFile ( ))) if ((false == isRunning ( )) || ((true == isExecutingFile ( )) && (QtPythonConsole::RM_DEBUG != _runningMode))) // v 5.0.5, en mode debug l'exécution de la console passe par un fichier ... { if (line < currentInstruction ( )) // Eviter de réécrire les boucles @@ -1786,7 +1768,6 @@ void QtPythonConsole::addToHistoric ( QTextCharFormat defaultBlockCharFormat = cursor.blockCharFormat ( ); defaultBlockCharFormat.setBackground (defaultBackground); cursor.setBlockCharFormat (defaultBlockCharFormat); - setCurrentCharFormat (defaultCharFormat); line += lineNumber (scriptingLog.getText ( ).utf8 ( )) - 1; cursor.insertText (UTF8TOQSTRING (scriptingLog.getText ( ))); cursor.insertText ("\n"); @@ -1803,13 +1784,9 @@ void QtPythonConsole::addToHistoric ( QTextCursor cursor = textCursor ( ); cursor.setPosition (block.position ( ), QTextCursor::MoveAnchor); cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); - QTextCharFormat charFormat = cursor.charFormat ( ); - charFormat.setBackground (QtScriptTextFormat::failedInstructionFormat.background ( )); - cursor.setCharFormat (charFormat); cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); setTextCursor (cursor); cursor.setBlockFormat (defaultBlockFormat); - setCurrentCharFormat (defaultCharFormat); setTextCursor (cursor); // Faut-il arrêter l'exécution du script ? @@ -2036,10 +2013,8 @@ bool QtPythonConsole::handleDownKeyPress (QKeyEvent& event) if (currentLine != instruction) { QTextCursor cursor = textCursor ( ); -// cursor.movePosition (QTextCursor::StartOfLine); -// cursor.movePosition (QTextCursor::EndOfLine, QTextCursor::KeepAnchor); - cursor.movePosition (QTextCursor::StartOfBlock); // v 5.0.0 - cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); // v 5.0.0 + cursor.movePosition (QTextCursor::StartOfBlock); + cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); cursor.insertText (instruction.c_str ( )); } // if (currentLine != instruction) } // if (_historyIndex < size) @@ -2068,10 +2043,8 @@ bool QtPythonConsole::handleUpKeyPress (QKeyEvent& event) if (currentLine != instruction) { QTextCursor cursor = textCursor ( ); -// cursor.movePosition (QTextCursor::StartOfLine); -// cursor.movePosition (QTextCursor::EndOfLine, QTextCursor::KeepAnchor); - cursor.movePosition (QTextCursor::StartOfBlock); // v 5.0.0 - cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); // v 5.0.0 + cursor.movePosition (QTextCursor::StartOfBlock); + cursor.movePosition (QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); cursor.insertText (instruction.c_str ( )); } // if (currentLine != instruction) } // if (_historyIndex < _history.count ( )) @@ -2131,8 +2104,7 @@ bool QtPythonConsole::handleComplete (QKeyEvent& event) try { UTF8String request (charset); -// request << "NECCompletionSession.instance ( ).complete ('" << editedInstruction ( ) << "'," << i << ")"; - request << "NECCompletionSession.instance ( ).complete ('" << trimedInstruction << "'," << i << ")"; // v 5.3.0 + request << "NECCompletionSession.instance ( ).complete ('" << trimedInstruction << "'," << i << ")"; PyCompilerFlags flags; // flags.cf_flags = CO_FUTURE_DIVISION; @@ -2205,13 +2177,12 @@ bool QtPythonConsole::handleComplete (QKeyEvent& event) cmps.insert (completions.begin ( ), completions.end ( )); for (set::const_iterator it = cmps.begin ( ); cmps.end ( ) != it; it++) { -// _completionComboBox->addItem ((*it).c_str ( )); // v 5.3.0 UTF8String completion (charset); if ((size_t)-1 != equalPos) // => A = ... completion = left + head.utf8 ( )+ *it + tail.utf8 ( ); else completion = head.utf8 ( )+ *it + tail.utf8 ( ); - _completionComboBox->addItem (completion.utf8 ( ).c_str ( )); // v 5.3.0 + _completionComboBox->addItem (completion.utf8 ( ).c_str ( )); } // for (set::const_iterator it = cmps.begin ( ); cmps.end ( ) != it; it++) _completionComboBox->setCurrentIndex (0); _completionComboBox->setGeometry (rect); @@ -2226,8 +2197,8 @@ bool QtPythonConsole::handleComplete (QKeyEvent& event) catch (...) { } - _currentExecLine = currentLine; // v 5.3.0 déplacé par mécanisme de complétion - _previousExecLine = _checkingCompletion; // v 5.3.0 + _currentExecLine = currentLine; + _previousExecLine = _checkingCompletion; _checkingCompletion = false; } // if (0 != completions.size ( )) @@ -2237,7 +2208,7 @@ bool QtPythonConsole::handleComplete (QKeyEvent& event) void QtPythonConsole::addToHistoric (const string& instruction) { // On ne stocke pas 2 fois successivement la même instruction - if (true == _checkingCompletion) // v 5.3.0 + if (true == _checkingCompletion) return; const size_t size = _history.size ( ); @@ -2375,8 +2346,9 @@ 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. bool completed = false; if ((0 == _pendingString.size ( )) || ('#' == _pendingString [0])) @@ -2400,11 +2372,10 @@ void QtPythonConsole::addInstruction (const string& instruction) } } // if (false == completed) else - { // v 5.1.5 : cas de l'insertion d'un commentaire multiligne. A noter qu'un bogue subsiste et qu'on peut - // observer un décalage entre commentaires et instructions associées. + { // v 5.1.5 : cas de l'insertion d'un commentaire multiligne. A noter qu'un bogue subsiste et qu'on peut observer un décalage entre commentaires et instructions associées. if ((0 != _pendingString.size ( )) && ('#' == _pendingString [0])) { - _pendingString = '\n' + _pendingString; +// _pendingString = '\n' + _pendingString; v 6.4.1 const size_t count = Instruction (_pendingString).lineCount ( ); _currentExecLine += count; } // if ((0 != _pendingString.size ( )) && ('#' == _pendingString [0])) @@ -2413,7 +2384,6 @@ void QtPythonConsole::addInstruction (const string& instruction) if (true == completed) { Instruction ins (_pendingString); - setCurrentCharFormat (QtPythonConsole::QtScriptTextFormat::textFormat (ins)); _pendingString += '\n'; insertPlainText (QString::fromUtf8(_pendingString.c_str( ))); _pendingString.clear ( ); @@ -2426,7 +2396,7 @@ void QtPythonConsole::addInstruction (const string& instruction) void QtPythonConsole::execInstructions ( ) { - EndOfDocCursor endOfDocCursor (*this); +// EndOfDocCursor endOfDocCursor (*this); 241 setRunningMode (QtPythonConsole::RM_CONTINUOUS); _running = true; @@ -2440,8 +2410,7 @@ void QtPythonConsole::execInstructions ( ) const bool autoDelete = true; _currentScript.reset (new QtPythonConsole::InstructionsFile (false, "python_panel_script_", QtPythonConsole::enableCodingIso8859_15, autoDelete)); _currentScript->addLines (instructions, _currentExecLine); - // 2 cas de figure : une ligne uniquement, on la traite telle que, permet d'avoir dans stdout des retours type "4" pour - // une ligne t.q. "2 + 2". + // 2 cas de figure : une ligne uniquement, on la traite telle que, permet d'avoir dans stdout des retours type "4" pour une ligne t.q. "2 + 2". // C'est le fait d'être en une seule instruction + Py_single_input qui offre cette possibilité là. // Pour les autres cas on reste avec Py_file_input qui est dédié aux cas multilignes. PyObject* result = 0; @@ -2490,8 +2459,6 @@ void QtPythonConsole::execInstructions ( ) _running = false; _halted = true; - // Actualisation IHM : - const size_t lastAt = ++_currentExecLine; _currentScript.reset (0); validateCursorPosition ( ); @@ -2569,12 +2536,12 @@ void QtPythonConsole::execDbgInstructions (bool stopImmediatly) { error = exc.getFullMessage ( ); // addToHistoric ici car il faut false == isRunning ( ) - addToHistoric ("", "", error, true, false); +// addToHistoric ("", "", error, true, false); // v 6.4.1 } catch (...) { // addToHistoric ici car il faut false == isRunning ( ) - addToHistoric ("", "", error, true, false); +// addToHistoric ("", "", error, true, false); // v 6.4.1 error = "Erreur non documentée."; } unregisterConsole (*this); @@ -2628,7 +2595,7 @@ void QtPythonConsole::execInstruction (const string& instruction, bool insert) flags.cf_flags = 0; PyObject* result = 0; - registerConsole (*this); // CP v 5.0.5 + registerConsole (*this); try { // gérer les erreurs C++ de l'API appelée result = PyRun_StringFlags (instruction.c_str ( ), Py_file_input, _globalDict, _localDict, &flags); @@ -2638,7 +2605,7 @@ void QtPythonConsole::execInstruction (const string& instruction, bool insert) if ((QtPythonConsole::RM_DEBUG == getRunningMode ( )) && (0 != _runningModeAction)) _runningModeAction->setChecked (false); } - unregisterConsole (*this); // CP v 5.0.5 + unregisterConsole (*this); processPythonOutputs ( ); @@ -2652,11 +2619,6 @@ void QtPythonConsole::execInstruction (const string& instruction, bool insert) throw Exception (error); } // if (0 != retCode) Py_DECREF (result); - - // Actualisation IHM : -// v 5.0.5 : déjà appelé via tracePythonExecution -// if (true == insert) -// lineProcessedCallback (_currentExecLine, true, string ( )); } // QtPythonConsole::execInstruction @@ -3035,6 +2997,7 @@ void QtPythonConsole::cursorPositionCallback ( ) try { QtTextEditor::cursorPositionCallback ( ); // presumed no throw + validateCursorPosition ( ); // v 6.4.1 : s'assurer qu'il y a au moins un point d'insertion de texte (ex : suite backspace sur la seule ligne éditable) updateActions ( ); } catch (...) diff --git a/src/QtPython3/public/QtPython3/QtPythonConsole.h b/src/QtPython3/public/QtPython3/QtPythonConsole.h index 13983cd..7bbdc57 100644 --- a/src/QtPython3/public/QtPython3/QtPythonConsole.h +++ b/src/QtPython3/public/QtPython3/QtPythonConsole.h @@ -39,40 +39,27 @@ typedef struct _object PyObject; *
    *
  • ou saisi manuellement, façon éditeur de texte, *
  • ou importé depuis un fichier, - *
  • ou issu de l'historique des commandes jouées, et éventuellement modifé - * (utilisation via MAJ + touche haut ou bas) + *
  • ou issu de l'historique des commandes jouées, et éventuellement modifié (utilisation via MAJ + touche haut ou bas) *
*

* *

- * 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 _tmpFile; - /** Le flux utilisé pour écrire dans le fichier temporire. */ + /** Le flux utilisé pour écrire dans le fichier temporaire. */ std::unique_ptr _tmpStream; /** Les lignes conservées. */ @@ -685,12 +632,10 @@ class QtPythonConsole : public QtTextEditor /** Le nombre de lignes du fichier. */ size_t _lineCount; - /** Le numéro de la première ligne de la console écrite dans le - fichier. */ + /** Le numéro de la première ligne de la console écrite dans le fichier. */ size_t _firstLineNum; - /** true si le jeu de caractères du fichier est - * ISO-8859-15, sinon false. */ + /** true si le jeu de caractères du fichier est ISO-8859-15, sinon false. */ bool _iso8859; /** Le plus grand numéro de ligne traité. */ @@ -723,15 +668,12 @@ class QtPythonConsole : public QtTextEditor /** * Appelé lorsque le curseur change de position. Actualise les actions. - * L'action d'insertion d'un script dépend notamment de la position du - * curseur. + * L'action d'insertion d'un script dépend notamment de la position du curseur. */ virtual void cursorPositionCallback ( ); /** - * Certains évènements sont interdits sur les zones de script déjà - * exécutées. Les surcharges ci-dessous visent à metter en place cette - * interdiction. + * Certains évènements sont interdits sur les zones de script déjà exécutées. Les surcharges ci-dessous visent à metter en place cette interdiction. */ virtual bool event (QEvent*); virtual void dragEnterEvent (QDragEnterEvent*); @@ -739,16 +681,14 @@ class QtPythonConsole : public QtTextEditor virtual void dragMoveEvent (QDragMoveEvent*); virtual void dropEvent (QDropEvent*); - /** Gestion des évènements : surchages pour spécificité (historique des - * instructions jouées, ...). + /** Gestion des évènements : surchages pour spécificité (historique des instructions jouées, ...). * @see handleDownKeyPress * @see handleUpKeyPress */ virtual void keyPressEvent (QKeyEvent* event); /** - * Appelé lorsque l'utilisateur presse la touche down - * (resp. up). Si les modificateurs adéquats sont également pressés + * Appelé lorsque l'utilisateur presse la touche down (resp. up). Si les modificateurs adéquats sont également pressés * propose alors une instruction présente dans l'historique. * @see addToHistoric */ @@ -769,8 +709,7 @@ class QtPythonConsole : public QtTextEditor virtual void updateActions ( ); /** - * @return La ligne courrante, à savoir la prochaine ligne à devoir être - * exécutée. + * @return La ligne courrante, à savoir la prochaine ligne à devoir être exécutée. * @see editedInstruction * @see previousInstruction * @see maxExecLine @@ -790,14 +729,9 @@ class QtPythonConsole : public QtTextEditor virtual std::string editedInstruction ( ) const; /** - * @return La ligne d'instruction exécutable suivant la ligne transmise - * dont le numéro est transmis en argument (saute les lignes - * blanches, les lignes de commentaires). S'il n'y a que des lignes - * blanches après retourne alors le numéro de la première ligne - * blanche. - * @warning ATTENTION : ne garanti pas que ce sera la prochaine - * instruction exécutée, qui peut dépendre d'un branchement - * conditionnel, d'une exception. + * @return La ligne d'instruction exécutable suivant la ligne transmise dont le numéro est transmis en argument (saute les lignes + * blanches, les lignes de commentaires). S'il n'y a que des lignes blanches après retourne alors le numéro de la première ligne blanche. + * @warning ATTENTION : ne garanti pas que ce sera la prochaine instruction exécutée, qui peut dépendre d'un branchement conditionnel, d'une exception. * @see previousInstruction */ virtual size_t followingInstruction (size_t line) const; @@ -809,10 +743,8 @@ class QtPythonConsole : public QtTextEditor virtual size_t previousInstruction ( ) const; /** - * Ajoute l'instruction transmise en argument à la console, au point - * courant d'édition. Vérifie que cette instruction est valable. - * Gère les instructions multilignes, à savoir que le cas échéant l'instance - * attend de disposer de tous le bloc multiligne avant de l'ajouter. + * Ajoute l'instruction transmise en argument à la console, au point courant d'édition. Vérifie que cette instruction est valable. + * Gère les instructions multilignes, à savoir que le cas échéant l'instance attend de disposer de tous le bloc multiligne avant de l'ajouter. * @warning L'instruction est supposée être encodée en UTF8. */ virtual void addInstruction (const std::string& instruction); @@ -830,8 +762,7 @@ class QtPythonConsole : public QtTextEditor virtual void execDbgInstructions (bool stopImmediatly); /** - * Exécute l'instruction transmise en argument hors débogueur, via - * PyRun_StringFlags. + * Exécute l'instruction transmise en argument hors débogueur, via PyRun_StringFlags. * @param instruction à exécuter * @param insère dans la console au point courant d'exécution * l'instruction si insert vaut true. @@ -839,8 +770,7 @@ class QtPythonConsole : public QtTextEditor virtual void execInstruction (const std::string& instruction, bool insert); /** - * Exécute le fichier transmis en argument hors débogueur, via - * PyRun_FileFlags. Le fichier n'est pas inséré dans la console. + * Exécute le fichier transmis en argument hors débogueur, via PyRun_FileFlags. Le fichier n'est pas inséré dans la console. * isRunning retourne true durant l'exécution du fichier. * @param fichier à exécuter * @warning ATTENTION : Non compatible en l'état avec une seconde @@ -849,22 +779,19 @@ class QtPythonConsole : public QtTextEditor virtual void execFile (const std::string& file); /** - * @return Les instructions exécutables (depuis la ligne donnée en argument - * à la dernière ligne). + * @return Les instructions exécutables (depuis la ligne donnée en argument à la dernière ligne). */ virtual std::vector getRunnableInstructions (size_t first) const; /** * @param from est la ligne (non évaluée) à partir de laquelle on recherche un breakpoint. * @param num est le nombre de lignes à partir de from. - * @return Le numéro de ligne du prochain breakpoint après from, ou from + num + 1 - * en l'absence de breakpoint suivant. + * @return Le numéro de ligne du prochain breakpoint après from, ou from + num + 1 en l'absence de breakpoint suivant. */ virtual size_t getNextBreakPoint (size_t from, size_t num) const; /** - * Récupère les sorties python et les exploite conformément au contexte - * en cours. + * Récupère les sorties python et les exploite conformément au contexte en cours. */ virtual void processPythonOutputs ( ); @@ -874,40 +801,32 @@ class QtPythonConsole : public QtTextEditor virtual int getIconSize ( ) const; /** - * @return true si la modification du script est autorisée à - * l'emplacement du curseur, false dans le cas contraire. + * @return true si la modification du script est autorisée à l'emplacement du curseur, false dans le cas contraire. */ virtual bool allowEditionAtCursorPos ( ) const; /** - * @return true si la modification du script est autorisée à - * la ligne dont le numéro est tranmis en argument (numéro première - * ligne : 1). + * @return true si la modification du script est autorisée à la ligne dont le numéro est tranmis en argument (numéro première ligne : 1). */ virtual bool allowEditionAtLine (size_t line) const; /** - * Positionne le curseur à une "bonne position pour l'utilisateur". Ajoute - * une nouvelle ligne si nécessaire. + * Positionne le curseur à une "bonne position pour l'utilisateur". Ajoute une nouvelle ligne si nécessaire. */ virtual void validateCursorPosition ( ); /** * Ajoute à completions les complétions acceptées par Swig. - * Cette fonction part du principe que l'instruction instruction est - * un appel Swig, et les signatures des complétions qui seront - * proposées (et ajoutées à completions) sont extraites des messages - * d'erreur fournis par Swig ... - * @param ensemble de complétions auxquelles seront ajoutées celle de cet - * appel. + * Cette fonction part du principe que l'instruction instruction est un appel Swig, et les signatures des complétions qui seront + * proposées (et ajoutées à completions) sont extraites des messages d'erreur fournis par Swig ... + * @param ensemble de complétions auxquelles seront ajoutées celle de cet appel. * @param instruction dont on recherche les complétion Swig. * @see getSwigCompletion */ virtual void addSwigCompletions (std::vector& completions, const std::string& instruction); /** - * Trouve la seule complétion acceptable par Swig possible pour - * l'instruction transmise en argument, et la retourne. Cette instruction + * Trouve la seule complétion acceptable par Swig possible pour l'instruction transmise en argument, et la retourne. Cette instruction * est de type nom de fonction, sans parenthèes, sans arguments. * La complétion retournée est reconstituée à partir des messages d'erreur fournis par Swig ... * @return Complétion acceptable pour Swig @@ -969,16 +888,14 @@ class QtPythonConsole : public QtTextEditor virtual void removeBreakPointCallback ( ); /** - * Appelé lorsque l'utilisateur active l'action "enlever tous les points - * d'arrêt". + * Appelé lorsque l'utilisateur active l'action "enlever tous les points d'arrêt". * Enlève tous les points d'arrêt. */ virtual void clearBreakPointsCallback ( ); /** * Appelé lorsque l'utilisateur active l'action "charger un script". - * Affiche un sélecteur de fichier de chargement d'un script et insère le - * contenu du script sélectionné à l'emplacement du curseur. + * Affiche un sélecteur de fichier de chargement d'un script et insère le contenu du script sélectionné à l'emplacement du curseur. * @warning L'insertion se fait sur une nouvelle ligne */ virtual void insertScriptCallback ( ); @@ -992,8 +909,7 @@ class QtPythonConsole : public QtTextEditor signals : /** - * Signal émis en environnement multithread lorsque la méthode - * setUsabled/I> est invoquée depuis un thread autre que le thread de l'instance. + * Signal émis en environnement multithread lorsque la méthode setUsabled/I> est invoquée depuis un thread autre que le thread de l'instance. * @warning Requiert une compilation avec la directive -DMULTITHREADED_APPLICATION. */ void setUsabledCalled (bool usable); @@ -1092,10 +1008,8 @@ class QtPythonConsole : public QtTextEditor /** *

- * 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).