def test_key_events(editor): zoom = editor.zoom_level QTest.keyPress(editor, '+', QtCore.Qt.ControlModifier) assert editor.zoom_level > zoom QTest.keyPress(editor, '0', QtCore.Qt.ControlModifier) assert editor.zoom_level == zoom == 0 QTest.keyPress(editor, '-', QtCore.Qt.ControlModifier) assert editor.zoom_level < zoom if os.environ['QT_API'].lower() == 'pyqt5': editor.wheelEvent( QtGui.QWheelEvent(QtCore.QPoint(10, 10), editor.mapToGlobal(QtCore.QPoint(10, 10)), QtCore.QPoint(0, 1), QtCore.QPoint(0, 1), 1, QtCore.Qt.Vertical, QtCore.Qt.MidButton, QtCore.Qt.ControlModifier)) else: editor.wheelEvent( QtGui.QWheelEvent(QtCore.QPoint(10, 10), 1, QtCore.Qt.MidButton, QtCore.Qt.ControlModifier)) if os.environ['QT_API'].lower() == 'pyqt5': editor.wheelEvent( QtGui.QWheelEvent(QtCore.QPoint(10, 10), editor.mapToGlobal(QtCore.QPoint(10, 10)), QtCore.QPoint(0, -1), QtCore.QPoint(0, -1), -1, QtCore.Qt.Vertical, QtCore.Qt.MidButton, QtCore.Qt.ControlModifier)) else: editor.wheelEvent( QtGui.QWheelEvent(QtCore.QPoint(10, 10), -1, QtCore.Qt.MidButton, QtCore.Qt.ControlModifier))
def toggle_fold_trigger(editor, line, panel): y_pos = TextHelper(editor).line_pos_from_number(line) + 5 QTest.mouseMove(panel, QtCore.QPoint(3, y_pos)) QTest.qWait(1000) QTest.mousePress(panel, QtCore.Qt.RightButton, QtCore.Qt.NoModifier, QtCore.QPoint(3, y_pos)) QTest.qWait(1000)
def cursorRect(self): r = self.textRect(' ') r.moveTopLeft( QtCore.QPoint(0, 0) + QtCore.QPoint(self._vt.cursor.x * r.width(), self._vt.cursor.y * r.height())) return r
def test_mouse_events(editor): editor.mousePressEvent( QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress, QtCore.QPoint(10, 10), QtCore.Qt.RightButton, QtCore.Qt.RightButton, QtCore.Qt.NoModifier)) editor.mouseReleaseEvent( QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(10, 10), QtCore.Qt.RightButton, QtCore.Qt.RightButton, QtCore.Qt.NoModifier)) if os.environ['QT_API'].lower() == 'pyqt5': editor.wheelEvent( QtGui.QWheelEvent(QtCore.QPoint(10, 10), editor.mapToGlobal(QtCore.QPoint(10, 10)), QtCore.QPoint(0, 1), QtCore.QPoint(0, 1), 1, QtCore.Qt.Vertical, QtCore.Qt.MidButton, QtCore.Qt.NoModifier)) else: editor.wheelEvent( QtGui.QWheelEvent(QtCore.QPoint(10, 10), 1, QtCore.Qt.MidButton, QtCore.Qt.NoModifier)) editor.mouseMoveEvent( QtGui.QMouseEvent(QtCore.QEvent.MouseMove, QtCore.QPoint(10, 10), QtCore.Qt.RightButton, QtCore.Qt.RightButton, QtCore.Qt.NoModifier)) editor.verticalScrollBar().setValue(editor.verticalScrollBar().maximum() / 2.0)
def test_mouse_move(editor): panel = get_panel(editor) panel.highlight_caret_scope = False nb_decos = len(editor.decorations) y_pos = TextHelper(editor).line_pos_from_number(8) QTest.mouseMove(panel, QtCore.QPoint(3, y_pos + 5)) QTest.qWait(1000) assert len(editor.decorations) >= 2 y_pos = TextHelper(editor).line_pos_from_number(14) QTest.mouseMove(panel, QtCore.QPoint(3, y_pos + 5)) QTest.qWait(1000) assert len(editor.decorations) >= 4 QTest.mouseMove(panel, QtCore.QPoint(0, 0)) panel.leaveEvent(None) editor.setFocus() panel.highlight_caret_scope = True
def _display_tooltip(self, tooltip, top): """ Display tooltip at the specified top position. """ QtWidgets.QToolTip.showText( self.mapToGlobal(QtCore.QPoint(self.sizeHint().width(), top)), tooltip, self)
def _display_tooltip(self, call, col): if not call or self._is_last_chard_end_of_word(): return # create a formatted calltip (current index appear in bold) calltip = "<p style='white-space:pre'>{0}.{1}(".format( call['call.module.name'], call['call.call_name']) for i, param in enumerate(call['call.params']): if i < len(call['call.params']) - 1 and not param.endswith(','): param += ", " if param.endswith(','): param += ' ' # pep8 calltip if i == call['call.index']: calltip += "<b>" calltip += param if i == call['call.index']: calltip += "</b>" calltip += ')</p>' # set tool tip position at the start of the bracket char_width = self.editor.fontMetrics().width('A') w_offset = (col - call['call.bracket_start'][1]) * char_width position = QtCore.QPoint( self.editor.cursorRect().x() - w_offset, self.editor.cursorRect().y() + char_width + self.editor.panels.margin_size(0)) position = self.editor.mapToGlobal(position) # show tooltip QtWidgets.QToolTip.showText(position, calltip, self.editor)
def paintEvent(self, event): p = QtGui.QPainter() p.begin(self) pal = self.palette() p.fillRect(QtCore.QRect(QtCore.QPoint(), self.size()), pal.color(pal.Background)) textSize = self.textRect(' ' * self._vt.columns).size() bound = QtCore.QRect(QtCore.QPoint(), textSize) flags = QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom for line in self._vt.display: p.drawText(bound, flags, line) bound.translate(0, bound.height()) if self.hasFocus(): p.fillRect(self.cursorRect(), pal.color(pal.Foreground)) else: p.drawRect(self.cursorRect()) p.end()
def _show_popup(self): parent_pos = self.main_tab_widget.pos() parent_size = self.main_tab_widget.size() size = self.popup.size() x, y = parent_pos.x(), parent_pos.y() pw, ph = parent_size.width(), parent_size.height() w = size.width() x += pw / 2 - w / 2 y += ph / 10 self.popup.move(self.mapToGlobal(QtCore.QPoint(x, y))) self.popup.set_filenames( [editor.file.path for editor in self.widgets()]) self.popup.show()
def test_word_selection(editor): QTest.qWait(1000) mode = get_mode(editor) TextHelper(editor).goto_line(8, 29) QTest.qWait(1000) try: event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonDblClick, QtCore.QPointF(0, 0), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier) except TypeError: event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonDblClick, QtCore.QPoint(0, 0), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier) mode._on_double_click(event) assert editor.textCursor().selectedText() == 'modes' QTest.qWait(1000)
def test_mouse_press(editor): panel = get_panel(editor) panel.highlight_caret_scope = False # fold child block toggle_fold_trigger(editor, 15, panel) block = editor.document().findBlockByNumber(14) assert TextBlockHelper.is_fold_trigger(block) is True assert TextBlockHelper.is_collapsed(block) is True block = block.next() while block.blockNumber() < 21: assert block.isVisible() is False block = block.next() # fold top level block toggle_fold_trigger(editor, 9, panel) block = editor.document().findBlockByNumber(8) assert TextBlockHelper.is_fold_trigger(block) block = block.next() while block.blockNumber() < 27: if block.blockNumber() == 14: assert TextBlockHelper.is_fold_trigger(block) is True assert TextBlockHelper.is_collapsed(block) is True assert block.isVisible() is False block = block.next() # unfold it top level block toggle_fold_trigger(editor, 9, panel) block = editor.document().findBlockByNumber(8) assert TextBlockHelper.is_fold_trigger(block) block = block.next() while block.blockNumber() < 27: if 14 < block.blockNumber() < 22: assert block.isVisible() is False else: assert block.isVisible() is True block = block.next() # cleanup QTest.mouseMove(panel, QtCore.QPoint(0, 0)) panel.leaveEvent(None) editor.setFocus() panel.highlight_caret_scope = True
def test_events(editor): mode = get_mode(editor) mode._add_decoration(editor.textCursor()) pt = QtCore.QPoint(10, TextHelper(editor).line_pos_from_number(0)) if os.environ['QT_API'] == 'pyqt5': QTest.mouseMove(editor, pt) QTest.mousePress(editor, QtCore.Qt.LeftButton, QtCore.Qt.ControlModifier, pt) QTest.mouseMove(editor, pt) else: editor.mouseMoveEvent( QtGui.QMouseEvent(QtCore.QEvent.MouseMove, pt, QtCore.Qt.RightButton, QtCore.Qt.RightButton, QtCore.Qt.ControlModifier)) # here we have a deco, try to click on it. editor.mousePressEvent( QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress, pt, QtCore.Qt.LeftButton, QtCore.Qt.RightButton, QtCore.Qt.NoModifier)) # move window without control -> remove deco editor.mouseMoveEvent( QtGui.QMouseEvent(QtCore.QEvent.MouseMove, pt, QtCore.Qt.RightButton, QtCore.Qt.RightButton, QtCore.Qt.NoModifier))
def __init__(self, parent=None, create_default_actions=True): """ :param parent: Parent widget :param create_default_actions: True to create the default context menu actions (copy, paste, edit) """ super(CodeEdit, self).__init__(parent) self.clones = [] self._default_font_size = 10 self._backend = BackendManager(self) self._file = FileManager(self) self._modes = ModesManager(self) self._panels = PanelsManager(self) self._decorations = TextDecorationsManager(self) self.document().modificationChanged.connect(self._emit_dirty_changed) self._word_separators = [ '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '+', '{', '}', '|', ':', '"', "'", "<", ">", "?", ",", ".", "/", ";", '[', ']', '\\', '\n', '\t', '=', '-', ' ' ] self._save_on_focus_out = False self._use_spaces_instead_of_tabs = True self._whitespaces_foreground = None self._sel_background = None self._show_whitespaces = False self._foreground = None self._sel_foreground = None self._tab_length = 4 self._zoom_level = 0 self._font_size = 10 self._background = None QtGui.QFontDatabase.addApplicationFont( ':/fonts/rc/SourceCodePro-Regular.ttf') QtGui.QFontDatabase.addApplicationFont( ':/fonts/rc/SourceCodePro-Bold.ttf') self._font_family = self._DEFAULT_FONT self._mimetypes = [] # Flags/Working variables self._last_mouse_pos = QtCore.QPoint(0, 0) self._modified_lines = set() self._cleaning = False self._visible_blocks = [] self._tooltips_runner = DelayJobRunner(delay=700) self._prev_tooltip_block_nbr = -1 self._original_text = "" self._dirty = False # setup context menu self._actions = [] self._menus = [] if create_default_actions: self._init_actions() self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.connect(self._show_context_menu) self._mnu = None # bug with PySide (github #63) # init settings and styles from global settings/style modules self._init_settings() self._init_style() # connect slots self.textChanged.connect(self._on_text_changed) self.blockCountChanged.connect(self.update) self.cursorPositionChanged.connect(self.update) self.selectionChanged.connect(self.update) self.setMouseTracking(True) self.setCenterOnScroll(True) self.setLineWrapMode(self.NoWrap)
def test_show_tooltip(editor): editor.show_tooltip(QtCore.QPoint(0, 0), 'A tooltip')
def textRect(self, text): textSize = QtGui.QFontMetrics(self.font()).size(0, text) return QtCore.QRect(QtCore.QPoint(), textSize)
def test_show_context_menu(editor): assert isinstance(editor, QtWidgets.QPlainTextEdit) editor.customContextMenuRequested.emit(QtCore.QPoint(10, 10)) editor._mnu.hide()
def __init__(self, parent): super(DraggableTabBar, self).__init__(parent) self._pos = QtCore.QPoint() self.setAcceptDrops(True) self.setMouseTracking(True) self.setElideMode(QtCore.Qt.ElideNone)