From ed4ddc80e4084cb83f7bbf054df51f7c1e001bb1 Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Mon, 27 May 2024 20:31:10 -0400 Subject: [PATCH 1/9] Preserve cursor position and _insert_plain_text() Preserve position of cursor so ANSI commands such as \r that modify position will preserve the position they specifed over multiple calls, even if these calls are not all combined into one. --- qtconsole/console_widget.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 62d20377..57979c86 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -1006,7 +1006,6 @@ def _append_custom(self, insert, input, before_prompt=False, *args, **kwargs): else: if insert != self._insert_plain_text: self._flush_pending_stream() - cursor.movePosition(QtGui.QTextCursor.End) # Perform the insertion. result = insert(cursor, input, *args, **kwargs) @@ -1660,10 +1659,7 @@ def _on_flush_pending_stream_timer(self): """ Flush the pending stream output and change the prompt position appropriately. """ - cursor = self._control.textCursor() - cursor.movePosition(QtGui.QTextCursor.End) self._flush_pending_stream() - cursor.movePosition(QtGui.QTextCursor.End) def _flush_pending_stream(self): """ Flush out pending text into the widget. """ @@ -1674,7 +1670,7 @@ def _flush_pending_stream(self): text = self._get_last_lines_from_list(text, buffer_size) text = ''.join(text) t = time.time() - self._insert_plain_text(self._get_end_cursor(), text, flush=True) + self._insert_plain_text(self._control.textCursor(), text, flush=True) # Set the flush interval to equal the maximum time to update text. self._pending_text_flush_interval.setInterval( int(max(100, (time.time() - t) * 1000)) @@ -2123,7 +2119,7 @@ def _insert_plain_text(self, cursor, text, flush=False): cursor.select(QtGui.QTextCursor.Document) remove = True if act.area == 'line': - if act.erase_to == 'all': + if act.erase_to == 'all': cursor.select(QtGui.QTextCursor.LineUnderCursor) remove = True elif act.erase_to == 'start': @@ -2137,7 +2133,7 @@ def _insert_plain_text(self, cursor, text, flush=False): QtGui.QTextCursor.EndOfLine, QtGui.QTextCursor.KeepAnchor) remove = True - if remove: + if remove: nspace=cursor.selectionEnd()-cursor.selectionStart() if fill else 0 cursor.removeSelectedText() if nspace>0: cursor.insertText(' '*nspace) # replace text by space, to keep cursor position as specified @@ -2181,11 +2177,12 @@ def _insert_plain_text(self, cursor, text, flush=False): remain = cursor2.position() - pos # number of characters until end of line n=len(substring) swallow = min(n, remain) # number of character to swallow - cursor.setPosition(pos+swallow,QtGui.QTextCursor.KeepAnchor) + cursor.setPosition(pos + swallow, QtGui.QTextCursor.KeepAnchor) cursor.insertText(substring,format) else: cursor.insertText(text) cursor.endEditBlock() + self._control.setTextCursor(cursor) if should_autoscroll: self._scroll_to_end() From 96ab4e84e08a71c6f0a75bf58d36da5959df564c Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Mon, 27 May 2024 22:19:47 -0400 Subject: [PATCH 2/9] Add regression test for _insert_plain_text() carriage return handling Add regression to test for #272 --- qtconsole/tests/test_00_console_widget.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index 2745be6e..42f6ebc7 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -371,6 +371,27 @@ def test_erase_in_line(self): # clear all the text cursor.insertText('') + def test_carriage_return(self): + """ Does overwriting the currentt line with carriage return work? + """ + w = ConsoleWidget() + test_inputs = ['Hello\n' + 'World\r', + '*' * 10, + '\r' + '0', '1', '2', '3', '4', + '5', '6', '7', '8', '9', + '\r\n'] + + expected_output = "Hello\u20290123456789\u2029" + + for text in test_inputs: + cursor = w._get_cursor() + w._insert_plain_text(cursor, text, flush = True) + w._flush_pending_stream() # emulate text being flushed + + self.assert_text_equal(cursor, expected_output) + def test_link_handling(self): noButton = QtCore.Qt.NoButton noButtons = QtCore.Qt.NoButton From f81d23d7703e9b76991a3c3466c513758d20117a Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Fri, 31 May 2024 00:49:04 -0400 Subject: [PATCH 3/9] Use additional cursor to track insert position for text insert Instead of using the main cursor (which the user can control by clicking), create a dedicated cursor `_insert_text_cursor` to track the position of where text should be inserted. --- qtconsole/console_widget.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 57979c86..7852211c 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -297,6 +297,10 @@ def __init__(self, parent=None, **kw): self._reading_callback = None self._tab_width = 4 + # Cursor position of where to insert text. + # Control characters allow this to move around on the current line. + self._insert_text_cursor = self._control.textCursor() + # List of strings pending to be appended as plain text in the widget. # The text is not immediately inserted when available to not # choke the Qt event loop with paint events for the widget in @@ -695,6 +699,9 @@ def do_execute(self, source, complete, indent): # effect when using a QTextEdit. I believe this is a Qt bug. self._control.moveCursor(QtGui.QTextCursor.End) + # Advance where text is inserted + self._insert_text_cursor.movePosition(QtGui.QTextCursor.End) + def export_html(self): """ Shows a dialog to export HTML/XML in various formats. """ @@ -712,6 +719,9 @@ def _finalize_input_request(self): self._append_before_prompt_cursor.setPosition( self._get_end_cursor().position()) + self._insert_text_cursor.setPosition( + self._get_end_cursor().position()) + # The maximum block count is only in effect during execution. # This ensures that _prompt_pos does not become invalid due to # text truncation. @@ -998,7 +1008,7 @@ def _append_custom(self, insert, input, before_prompt=False, *args, **kwargs): current prompt, if there is one. """ # Determine where to insert the content. - cursor = self._control.textCursor() + cursor = self._insert_text_cursor if before_prompt and (self._reading or not self._executing): self._flush_pending_stream() cursor._insert_mode=True @@ -1009,6 +1019,11 @@ def _append_custom(self, insert, input, before_prompt=False, *args, **kwargs): # Perform the insertion. result = insert(cursor, input, *args, **kwargs) + + # Remove insert mode tag + if hasattr(cursor, "_insert_mode"): + del cursor._insert_mode + return result def _append_block(self, block_format=None, before_prompt=False): @@ -1670,7 +1685,7 @@ def _flush_pending_stream(self): text = self._get_last_lines_from_list(text, buffer_size) text = ''.join(text) t = time.time() - self._insert_plain_text(self._control.textCursor(), text, flush=True) + self._insert_plain_text(self._insert_text_cursor, text, flush=True) # Set the flush interval to equal the maximum time to update text. self._pending_text_flush_interval.setInterval( int(max(100, (time.time() - t) * 1000)) @@ -2182,7 +2197,6 @@ def _insert_plain_text(self, cursor, text, flush=False): else: cursor.insertText(text) cursor.endEditBlock() - self._control.setTextCursor(cursor) if should_autoscroll: self._scroll_to_end() From a1abf41acee453a5d0585409a333d7de30163aef Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Fri, 31 May 2024 00:51:50 -0400 Subject: [PATCH 4/9] Update test_carriage_return() test. Need to set _executing = True for test to work. --- qtconsole/tests/test_00_console_widget.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index 42f6ebc7..ac3f4a92 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -375,21 +375,22 @@ def test_carriage_return(self): """ Does overwriting the currentt line with carriage return work? """ w = ConsoleWidget() - test_inputs = ['Hello\n' + test_inputs = ['Hello\n', 'World\r', '*' * 10, - '\r' + '\r', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\r\n'] expected_output = "Hello\u20290123456789\u2029" + w._executing = True for text in test_inputs: - cursor = w._get_cursor() - w._insert_plain_text(cursor, text, flush = True) + w._append_plain_text(text, before_prompt = True) w._flush_pending_stream() # emulate text being flushed + cursor = w._get_cursor() self.assert_text_equal(cursor, expected_output) def test_link_handling(self): From ad8b77c8126ca7642d5a802c030290c76925b6df Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Sat, 8 Jun 2024 14:34:28 -0400 Subject: [PATCH 5/9] Only use insert mode when needed to work with ANSI sequences --- qtconsole/console_widget.py | 32 ++++++++++++++++++----- qtconsole/frontend_widget.py | 2 +- qtconsole/tests/test_00_console_widget.py | 23 +++++++++++++++- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 7852211c..2123f853 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -1011,9 +1011,27 @@ def _append_custom(self, insert, input, before_prompt=False, *args, **kwargs): cursor = self._insert_text_cursor if before_prompt and (self._reading or not self._executing): self._flush_pending_stream() - cursor._insert_mode=True - cursor.setPosition(self._append_before_prompt_pos) + + # Jump to before prompt, if there is one + if cursor.position() >= self._append_before_prompt_pos \ + and self._append_before_prompt_pos != self._get_end_pos(): + cursor.setPosition(self._append_before_prompt_pos) + + # If we appending on the same line as the prompt, use insert mode + # If so, the character at self._append_before_prompt_pos will not be a newline + cursor.movePosition(QtGui.QTextCursor.Right, + QtGui.QTextCursor.KeepAnchor) + if cursor.selection().toPlainText() != '\n': + cursor._insert_mode = True + cursor.movePosition(QtGui.QTextCursor.Left) else: + # Insert at current printing point + # If cursor is before prompt jump to end, but only if there + # is a prompt (before_prompt_pos != end) + if cursor.position() < self._append_before_prompt_pos \ + and self._append_before_prompt_pos != self._get_end_pos(): + cursor.movePosition(QtGui.QTextCursor.End) + if insert != self._insert_plain_text: self._flush_pending_stream() @@ -2104,12 +2122,12 @@ def _insert_plain_text(self, cursor, text, flush=False): if (self._executing and not flush and self._pending_text_flush_interval.isActive() and - cursor.position() == self._get_end_pos()): + cursor.position() == self._insert_text_cursor.position()): # Queue the text to insert in case it is being inserted at end self._pending_insert_text.append(text) if buffer_size > 0: self._pending_insert_text = self._get_last_lines_from_list( - self._pending_insert_text, buffer_size) + self._pending_insert_text, buffer_size) return if self._executing and not self._pending_text_flush_interval.isActive(): @@ -2185,7 +2203,9 @@ def _insert_plain_text(self, cursor, text, flush=False): # simulate replacement mode if substring is not None: format = self._ansi_processor.get_format() - if not (hasattr(cursor,'_insert_mode') and cursor._insert_mode): + + # Note that using _insert_mode means the \r ANSI sequence will not swallow characters. + if not (hasattr(cursor, '_insert_mode') and cursor._insert_mode): pos = cursor.position() cursor2 = QtGui.QTextCursor(cursor) # self._get_line_end_pos() is the previous line, don't use it cursor2.movePosition(QtGui.QTextCursor.EndOfLine) @@ -2193,7 +2213,7 @@ def _insert_plain_text(self, cursor, text, flush=False): n=len(substring) swallow = min(n, remain) # number of character to swallow cursor.setPosition(pos + swallow, QtGui.QTextCursor.KeepAnchor) - cursor.insertText(substring,format) + cursor.insertText(substring, format) else: cursor.insertText(text) cursor.endEditBlock() diff --git a/qtconsole/frontend_widget.py b/qtconsole/frontend_widget.py index 0a788bb9..8e2fbec8 100644 --- a/qtconsole/frontend_widget.py +++ b/qtconsole/frontend_widget.py @@ -728,7 +728,7 @@ def restart_kernel(self, message, now=False): def append_stream(self, text): """Appends text to the output stream.""" - self._append_plain_text(text, before_prompt=True) + self._append_plain_text(text, before_prompt = True) def flush_clearoutput(self): """If a clearoutput is pending, execute it.""" diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index ac3f4a92..41b3f462 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -371,7 +371,7 @@ def test_erase_in_line(self): # clear all the text cursor.insertText('') - def test_carriage_return(self): + def test_print_while_executing(self): """ Does overwriting the currentt line with carriage return work? """ w = ConsoleWidget() @@ -393,6 +393,27 @@ def test_carriage_return(self): cursor = w._get_cursor() self.assert_text_equal(cursor, expected_output) + def test_print_while_reading(self): + """ Does overwriting the currentt line with carriage return work? + """ + w = ConsoleWidget() + test_inputs = ['Hello\n', + 'World\r', + '*' * 10, + '\r', + '0', '1', '2', '3', '4', + '5', '6', '7', '8', '9', + '\r\n'] + + expected_output = "Hello\u20290123456789\u2029" + + for text in test_inputs: + w._append_plain_text(text, before_prompt = True) + w._flush_pending_stream() # emulate text being flushed + + cursor = w._get_cursor() + self.assert_text_equal(cursor, expected_output) + def test_link_handling(self): noButton = QtCore.Qt.NoButton noButtons = QtCore.Qt.NoButton From be39446c5aed04ace4e92c8b55b351676010ba4f Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Sun, 9 Jun 2024 11:08:08 -0400 Subject: [PATCH 6/9] Add fix for transition from insert before prompt to insert after prompt. And added test case. --- qtconsole/console_widget.py | 5 ++- qtconsole/tests/test_00_console_widget.py | 51 ++++++++++------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 2123f853..2b1f7435 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -1028,7 +1028,7 @@ def _append_custom(self, insert, input, before_prompt=False, *args, **kwargs): # Insert at current printing point # If cursor is before prompt jump to end, but only if there # is a prompt (before_prompt_pos != end) - if cursor.position() < self._append_before_prompt_pos \ + if cursor.position() <= self._append_before_prompt_pos \ and self._append_before_prompt_pos != self._get_end_pos(): cursor.movePosition(QtGui.QTextCursor.End) @@ -2562,6 +2562,9 @@ def _show_prompt(self, prompt=None, html=False, newline=True, if move_forward: self._append_before_prompt_cursor.setPosition( self._append_before_prompt_cursor.position() + 1) + else: + # cursor position was 0, set before prompt cursor + self._append_before_prompt_cursor.setPosition(0) self._prompt_started() #------ Signal handlers ---------------------------------------------------- diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index 41b3f462..fa23b48b 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -371,48 +371,43 @@ def test_erase_in_line(self): # clear all the text cursor.insertText('') - def test_print_while_executing(self): - """ Does overwriting the currentt line with carriage return work? + def test_print_carriage_return(self): + """ Test that overwriting the current line works as intended, + before and after the cursor prompt. """ w = ConsoleWidget() - test_inputs = ['Hello\n', - 'World\r', - '*' * 10, - '\r', + + # Show a prompt + w._prompt = "prompt>" + w._prompt_sep = "\n" + + w._show_prompt() + self.assert_text_equal(w._get_cursor(), '\u2029prompt>') + + test_inputs = ['Hello\n', 'World\r', + '*' * 10, '\r', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\r\n'] - expected_output = "Hello\u20290123456789\u2029" - - w._executing = True for text in test_inputs: w._append_plain_text(text, before_prompt = True) w._flush_pending_stream() # emulate text being flushed - cursor = w._get_cursor() - self.assert_text_equal(cursor, expected_output) - - def test_print_while_reading(self): - """ Does overwriting the currentt line with carriage return work? - """ - w = ConsoleWidget() - test_inputs = ['Hello\n', - 'World\r', - '*' * 10, - '\r', - '0', '1', '2', '3', '4', - '5', '6', '7', '8', '9', - '\r\n'] + self.assert_text_equal(w._get_cursor(), + "Hello\u20290123456789\u2029\u2029prompt>") - expected_output = "Hello\u20290123456789\u2029" + # Print after prompt + w._executing = True + test_inputs = ['\nF', 'o', 'o', + '\r', 'Bar', '\n'] for text in test_inputs: - w._append_plain_text(text, before_prompt = True) + w._append_plain_text(text, before_prompt = False) w._flush_pending_stream() # emulate text being flushed - cursor = w._get_cursor() - self.assert_text_equal(cursor, expected_output) + self.assert_text_equal(w._get_cursor(), + "Hello\u20290123456789\u2029\u2029prompt>\u2029Bar\u2029") def test_link_handling(self): noButton = QtCore.Qt.NoButton @@ -491,7 +486,7 @@ def test_prompt_cursors(self): w._prompt_pos - len(w._prompt)) # insert some text before the prompt - w._append_plain_text('line', before_prompt=True) + w._append_plain_text('line', before_prompt = True) self.assertEqual(w._prompt_pos, w._get_end_pos()) self.assertEqual(w._append_before_prompt_pos, w._prompt_pos - len(w._prompt)) From 50bb0fdba1bce2fb3af1f1394fa4dff955819ec6 Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Sun, 9 Jun 2024 12:26:50 -0400 Subject: [PATCH 7/9] Fix handling of a blank prompt Make sure prompt is correctly setup even if the prompt is literally a blank string, as could be set using input() --- qtconsole/console_widget.py | 14 +++++++++++++- qtconsole/tests/test_00_console_widget.py | 9 +++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 2b1f7435..20a30873 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -2519,6 +2519,9 @@ def _show_prompt(self, prompt=None, html=False, newline=True, cursor = self._get_end_cursor() + # Memorize end to check if we actually add any prompt characters + prior_end_pos = cursor.position() + # Save the current position to support _append*(before_prompt=True). # We can't leave the cursor at the end of the document though, because # that would cause any further additions to move the cursor. Therefore, @@ -2557,7 +2560,16 @@ def _show_prompt(self, prompt=None, html=False, newline=True, self._prompt_html = None self._flush_pending_stream() - self._prompt_cursor.setPosition(self._get_end_pos() - 1) + + current_end_pos = self._get_end_pos() + if prior_end_pos != current_end_pos: + # Set the prompt cursor to end minus 1, so long as + # the prompt was not blank + self._prompt_cursor.setPosition(current_end_pos - 1) + else: + # The prompt didn't move end, i.e. the prompt inserted exactly 0 characters + # Move cursor to end + self._prompt_cursor.setPosition(current_end_pos) if move_forward: self._append_before_prompt_cursor.setPosition( diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index fa23b48b..69368529 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -491,6 +491,15 @@ def test_prompt_cursors(self): self.assertEqual(w._append_before_prompt_pos, w._prompt_pos - len(w._prompt)) + # Test a blank prompt. Such as from input() + w._append_plain_text('\n') + w._show_prompt(prompt = '', separator = False) + + w._append_plain_text('plain text\n') + + self.assertEqual(w._prompt_pos, w._get_end_pos()) + self.assertEqual(w._append_before_prompt_pos, w._prompt_pos) + def test_select_all(self): w = ConsoleWidget() w._append_plain_text('Header\n') From ae9e57b658654618a2a379416244cd2d9acdfca8 Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Sun, 9 Jun 2024 12:38:27 -0400 Subject: [PATCH 8/9] Revert "Fix handling of a blank prompt" Changes actually broke all input() handling. Reverting. This reverts commit 50bb0fdba1bce2fb3af1f1394fa4dff955819ec6. --- qtconsole/console_widget.py | 14 +------------- qtconsole/tests/test_00_console_widget.py | 9 --------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 20a30873..2b1f7435 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -2519,9 +2519,6 @@ def _show_prompt(self, prompt=None, html=False, newline=True, cursor = self._get_end_cursor() - # Memorize end to check if we actually add any prompt characters - prior_end_pos = cursor.position() - # Save the current position to support _append*(before_prompt=True). # We can't leave the cursor at the end of the document though, because # that would cause any further additions to move the cursor. Therefore, @@ -2560,16 +2557,7 @@ def _show_prompt(self, prompt=None, html=False, newline=True, self._prompt_html = None self._flush_pending_stream() - - current_end_pos = self._get_end_pos() - if prior_end_pos != current_end_pos: - # Set the prompt cursor to end minus 1, so long as - # the prompt was not blank - self._prompt_cursor.setPosition(current_end_pos - 1) - else: - # The prompt didn't move end, i.e. the prompt inserted exactly 0 characters - # Move cursor to end - self._prompt_cursor.setPosition(current_end_pos) + self._prompt_cursor.setPosition(self._get_end_pos() - 1) if move_forward: self._append_before_prompt_cursor.setPosition( diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index 69368529..fa23b48b 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -491,15 +491,6 @@ def test_prompt_cursors(self): self.assertEqual(w._append_before_prompt_pos, w._prompt_pos - len(w._prompt)) - # Test a blank prompt. Such as from input() - w._append_plain_text('\n') - w._show_prompt(prompt = '', separator = False) - - w._append_plain_text('plain text\n') - - self.assertEqual(w._prompt_pos, w._get_end_pos()) - self.assertEqual(w._append_before_prompt_pos, w._prompt_pos) - def test_select_all(self): w = ConsoleWidget() w._append_plain_text('Header\n') From dbf756208e60cb3a95cd85b621ae74c4f5c8ac90 Mon Sep 17 00:00:00 2001 From: TheMatt2 Date: Sat, 27 Jul 2024 01:24:22 -0400 Subject: [PATCH 9/9] Format suggestions from code review --- qtconsole/console_widget.py | 20 +++++++++++--------- qtconsole/tests/test_00_console_widget.py | 6 +++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/qtconsole/console_widget.py b/qtconsole/console_widget.py index 2b1f7435..ebb8d23a 100644 --- a/qtconsole/console_widget.py +++ b/qtconsole/console_widget.py @@ -851,12 +851,12 @@ def paste(self, mode=QtGui.QClipboard.Clipboard): self._insert_plain_text_into_buffer(cursor, dedent(text)) - def print_(self, printer = None): + def print_(self, printer=None): """ Print the contents of the ConsoleWidget to the specified QPrinter. """ - if (not printer): + if not printer: printer = QtPrintSupport.QPrinter() - if(QtPrintSupport.QPrintDialog(printer).exec_() != QtPrintSupport.QPrintDialog.Accepted): + if QtPrintSupport.QPrintDialog(printer).exec_() != QtPrintSupport.QPrintDialog.Accepted: return self._control.print_(printer) @@ -1039,7 +1039,7 @@ def _append_custom(self, insert, input, before_prompt=False, *args, **kwargs): result = insert(cursor, input, *args, **kwargs) # Remove insert mode tag - if hasattr(cursor, "_insert_mode"): + if hasattr(cursor, '_insert_mode'): del cursor._insert_mode return result @@ -1077,7 +1077,7 @@ def _clear_temporary_buffer(self): # Select and remove all text below the input buffer. cursor = self._get_prompt_cursor() prompt = self._continuation_prompt.lstrip() - if(self._temp_buffer_filled): + if self._temp_buffer_filled: self._temp_buffer_filled = False while cursor.movePosition(QtGui.QTextCursor.NextBlock): temp_cursor = QtGui.QTextCursor(cursor) @@ -1689,13 +1689,15 @@ def _event_filter_page_keypress(self, event): return False def _on_flush_pending_stream_timer(self): - """ Flush the pending stream output and change the - prompt position appropriately. + """ Flush pending text into the widget on console timer trigger. """ self._flush_pending_stream() def _flush_pending_stream(self): - """ Flush out pending text into the widget. """ + """ Flush pending text into the widget. Only applies to text that is pending + when the console is in the running state. Text printed when console is + not running is shown immediately, and does not wait to be flushed. + """ text = self._pending_insert_text self._pending_insert_text = [] buffer_size = self._control.document().maximumBlockCount() @@ -2430,7 +2432,7 @@ def _readline(self, prompt='', callback=None, password=False): self._reading = True if password: - self._show_prompt('Warning: QtConsole does not support password mode, '\ + self._show_prompt('Warning: QtConsole does not support password mode, ' 'the text you type will be visible.', newline=True) if 'ipdb' not in prompt.lower(): diff --git a/qtconsole/tests/test_00_console_widget.py b/qtconsole/tests/test_00_console_widget.py index fa23b48b..c9b571e8 100644 --- a/qtconsole/tests/test_00_console_widget.py +++ b/qtconsole/tests/test_00_console_widget.py @@ -391,7 +391,7 @@ def test_print_carriage_return(self): '\r\n'] for text in test_inputs: - w._append_plain_text(text, before_prompt = True) + w._append_plain_text(text, before_prompt=True) w._flush_pending_stream() # emulate text being flushed self.assert_text_equal(w._get_cursor(), @@ -403,7 +403,7 @@ def test_print_carriage_return(self): '\r', 'Bar', '\n'] for text in test_inputs: - w._append_plain_text(text, before_prompt = False) + w._append_plain_text(text, before_prompt=False) w._flush_pending_stream() # emulate text being flushed self.assert_text_equal(w._get_cursor(), @@ -486,7 +486,7 @@ def test_prompt_cursors(self): w._prompt_pos - len(w._prompt)) # insert some text before the prompt - w._append_plain_text('line', before_prompt = True) + w._append_plain_text('line', before_prompt=True) self.assertEqual(w._prompt_pos, w._get_end_pos()) self.assertEqual(w._append_before_prompt_pos, w._prompt_pos - len(w._prompt))