def mousePressEvent(self, event): """ Re-implemented to handle the mouse press event. event: the mouse press event (QMouseEvent) """ if event.button() == Qt.MidButton: self.setFocus() self.paste() event.accept() else: ConsoleBaseWidget.mousePressEvent(self, event)
def mouseMoveEvent(self, event): """Show Pointing Hand Cursor on error messages""" text = self.get_line_at(event.pos()) if get_error_match(text): if not self.__cursor_changed: QApplication.setOverrideCursor(QCursor(Qt.PointingHandCursor)) self.__cursor_changed = True event.accept() return if self.__cursor_changed: QApplication.restoreOverrideCursor() self.__cursor_changed = False ConsoleBaseWidget.mouseMoveEvent(self, event)
def focusNextPrevChild(self, next): """ Reimplemented to stop Tab moving to the next window """ if next: return False return ConsoleBaseWidget.focusNextPrevChild(self, next)
def insert_text(self, text, at_end=False, error=False, prompt=False): """ Insert text at the current cursor position or at the end of the command line """ if self.isReadOnly(): return if error and text.startswith(' File "<'): # Avoid printing 'File <console> [...]' which is related to the # code.InteractiveConsole Python interpreter emulation return if at_end: # Insert text at the end of the command line self.append_text_to_pythonshell(text, error, prompt) else: # Insert text at current cursor position ConsoleBaseWidget.insert_text(self, text)
def __init__(self, parent, history_filename, debug=False, profile=False): """ parent : specifies the parent widget """ ConsoleBaseWidget.__init__(self, parent) # Prompt position: tuple (line, index) self.current_prompt_pos = None self.new_input_line = True # History self.histidx = None self.hist_wholeline = False assert isinstance(history_filename, (str, unicode)) self.history_filename = history_filename self.history = self.load_history() # Session self.historylog_filename = CONF.get('main', 'historylog_filename', get_conf_path('history.log')) # Context menu self.menu = None self.setup_context_menu() # Debug mode self.debug = debug # Simple profiling test self.profile = profile # write/flush self.__buffer = [] self.__timestamp = 0.0 # Give focus to widget self.setFocus()
def postprocess_keyevent(self, event): """Post-process keypress event: in InteractiveShell, this is method is called when shell is ready""" event, text, key, ctrl, shift = restore_keyevent(event) # Is cursor on the last line? and after prompt? if len(text): if self.hasSelectedText(): self.check_selection() self.restrict_cursor_position(self.current_prompt_pos, 'eof') cursor_position = self.get_position('cursor') if key in (Qt.Key_Return, Qt.Key_Enter): if self.is_cursor_on_last_line(): self._key_enter() # add and run selection else: text = self.selectedText() self.insert_text(text, at_end=True) event.accept() elif key == Qt.Key_Delete: if self.hasSelectedText(): self.check_selection() self.removeSelectedText() elif self.is_cursor_on_last_line(): self.stdkey_clear() event.accept() elif key == Qt.Key_Backspace: self._key_backspace(cursor_position) event.accept() elif key == Qt.Key_Tab: self._key_tab() event.accept() elif key == Qt.Key_Left: event.accept() if self.current_prompt_pos == cursor_position: # Avoid moving cursor on prompt return method = self.extend_selection_to_next if shift \ else self.move_cursor_to_next method('word' if ctrl else 'character', direction='left') elif key == Qt.Key_Right: event.accept() if self.is_cursor_at_end(): return method = self.extend_selection_to_next if shift \ else self.move_cursor_to_next method('word' if ctrl else 'character', direction='right') elif (key == Qt.Key_Home) or ((key == Qt.Key_Up) and ctrl): self._key_home(shift) event.accept() elif (key == Qt.Key_End) or ((key == Qt.Key_Down) and ctrl): self._key_end(shift) event.accept() elif key == Qt.Key_Up: if not self.is_cursor_on_last_line(): self.set_cursor_position('eof') y_cursor = self.get_coordinates(cursor_position)[1] y_prompt = self.get_coordinates(self.current_prompt_pos)[1] if self.is_completion_widget_visible() or y_cursor > y_prompt: self.stdkey_up(shift) else: self.browse_history(backward=True) event.accept() elif key == Qt.Key_Down: if not self.is_cursor_on_last_line(): self.set_cursor_position('eof') y_cursor = self.get_coordinates(cursor_position)[1] y_end = self.get_coordinates('eol')[1] if self.is_completion_widget_visible() or y_cursor < y_end: self.stdkey_down(shift) else: self.browse_history(backward=False) event.accept() elif key in (Qt.Key_PageUp, Qt.Key_PageDown): #XXX: Find a way to do this programmatically instead of calling # widget keyhandler (this won't work if the *event* is coming from # the event queue - i.e. when the busy buffer will be implemented) ConsoleBaseWidget.keyPressEvent(self, event) elif key == Qt.Key_Escape: self._key_escape() event.accept() elif key == Qt.Key_V and ctrl: self.paste() event.accept() elif key == Qt.Key_X and ctrl: self.cut() event.accept() elif key == Qt.Key_Z and ctrl: self.undo() event.accept() elif key == Qt.Key_Y and ctrl: self.redo() event.accept() elif key == Qt.Key_Question and not self.hasSelectedText(): self._key_question(text) event.accept() elif key == Qt.Key_ParenLeft and not self.hasSelectedText(): self._key_parenleft(text) event.accept() elif key == Qt.Key_Period and not self.hasSelectedText(): self._key_period(text) event.accept() elif ((key == Qt.Key_Plus) and ctrl) \ or ((key==Qt.Key_Equal) and shift and ctrl): self.zoomIn() event.accept() elif (key == Qt.Key_Minus) and ctrl: self.zoomOut() event.accept() elif text.length(): self.hist_wholeline = False self.insert_text(text) self._key_other(text) event.accept() else: # Let the parent widget handle the key press event event.ignore()
def paste(self): """Reimplemented slot to handle multiline paste action""" if self.new_input_line: self.on_new_line() ConsoleBaseWidget.paste(self)
def delete(self): """Remove selected text""" self.check_selection() if self.hasSelectedText(): ConsoleBaseWidget.removeSelectedText(self)
def mouseReleaseEvent(self, event): """Go to error""" ConsoleBaseWidget.mouseReleaseEvent(self, event) text = self.get_line_at(event.pos()) if get_error_match(text) and not self.hasSelectedText(): self.emit(SIGNAL("go_to_error(QString)"), text)
def leaveEvent(self, event): """If cursor has not been restored yet, do it now""" if self.__cursor_changed: QApplication.restoreOverrideCursor() self.__cursor_changed = False ConsoleBaseWidget.leaveEvent(self, event)
def setup(self): """Reimplement ConsoleBaseWidget method""" ConsoleBaseWidget.setup(self) self.set_caret(color=Qt.darkGray, width=2) self.remove_margins() # Suppressing Scintilla margins
def cut(self): """Cut text""" self.check_selection() if self.hasSelectedText(): ConsoleBaseWidget.cut(self)