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 at_end: # Insert text at the end of the command line self.append_text_to_shell(text, error, prompt) else: # Insert text at current cursor position ConsoleBaseWidget.insert_text(self, text)
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 mousePressEvent(self, event): """ Re-implemented to handle the mouse press event. event: the mouse press event (QMouseEvent) """ if event.button() == Qt.MidButton: text = self.selectedText() # Simulating left mouse button: event = QMouseEvent(QMouseEvent.MouseButtonPress, event.pos(), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) ConsoleBaseWidget.mousePressEvent(self, event) if self.new_input_line: self.on_new_line() self.insert_text(text) event.accept() else: ConsoleBaseWidget.mousePressEvent(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 __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 setup(self): """Reimplement ConsoleBaseWidget method""" ConsoleBaseWidget.setup(self) self.set_caret(color=Qt.darkGray, width=2) self.remove_margins() # Suppressing Scintilla margins
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 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 postprocess_keyevent(self, event): """Post-process keypress event: in InternalShell, 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): # XXX: Shouldn't it be: `if len(unicode(text).strip(os.linesep))` ? 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. if the busy buffer is ever 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_A and ctrl: self.selectAll() 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() and not self.isReadOnly(): 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 cut(self): """Cut text""" self.check_selection() if self.hasSelectedText(): ConsoleBaseWidget.cut(self)