def test_correct_key(backend, qt_core, qt_key, qt_mods, answer): """ Make a figure. Send a key_press_event event (using non-public, qtX backend specific api). Catch the event. Assert sent and caught keys are the same. """ from matplotlib.backends.qt_compat import _enum, _to_int result = None qt_mod = _enum("QtCore.Qt.KeyboardModifier").NoModifier for mod in qt_mods: qt_mod |= getattr(_enum("QtCore.Qt.KeyboardModifier"), mod) class _Event: def isAutoRepeat(self): return False def key(self): return _to_int(getattr(_enum("QtCore.Qt.Key"), qt_key)) def modifiers(self): return qt_mod def on_key_press(event): nonlocal result result = event.key qt_canvas = plt.figure().canvas qt_canvas.mpl_connect('key_press_event', on_key_press) qt_canvas.keyPressEvent(_Event()) assert result == answer
def __init__(self, entries): super().__init__() self.entries = entries self.current_entry = -1 self.current_thumbnail = -1 event_filter = EventFilter(self) self.installEventFilter(event_filter) # The list of files on the left-hand side. self.filelist = QtWidgets.QListWidget() self.filelist.setMinimumWidth(400) for entry in entries: self.filelist.addItem(entry.display) self.filelist.currentRowChanged.connect(self.set_entry) thumbnails_box = QtWidgets.QWidget() thumbnails_layout = QtWidgets.QVBoxLayout() self.thumbnails = [] for i, name in enumerate(('test', 'expected', 'diff')): thumbnail = Thumbnail(self, i, name) thumbnails_layout.addWidget(thumbnail) self.thumbnails.append(thumbnail) thumbnails_box.setLayout(thumbnails_layout) images_layout = QtWidgets.QVBoxLayout() images_box = QtWidgets.QWidget() self.image_display = QtWidgets.QLabel() self.image_display.setAlignment( _enum('QtCore.Qt.AlignmentFlag').AlignHCenter | _enum('QtCore.Qt.AlignmentFlag').AlignVCenter) self.image_display.setMinimumSize(800, 600) images_layout.addWidget(self.image_display, 6) images_box.setLayout(images_layout) buttons_box = QtWidgets.QWidget() buttons_layout = QtWidgets.QHBoxLayout() accept_button = QtWidgets.QPushButton("Accept (A)") accept_button.clicked.connect(self.accept_test) buttons_layout.addWidget(accept_button) reject_button = QtWidgets.QPushButton("Reject (R)") reject_button.clicked.connect(self.reject_test) buttons_layout.addWidget(reject_button) buttons_box.setLayout(buttons_layout) images_layout.addWidget(buttons_box) main_layout = QtWidgets.QHBoxLayout() main_layout.addWidget(self.filelist, 1) main_layout.addWidget(thumbnails_box, 1) main_layout.addWidget(images_box, 3) self.setLayout(main_layout) self.setWindowTitle("matplotlib test triager") self.set_entry(0)
def set_large_image(self, index): self.thumbnails[self.current_thumbnail].setFrameShape( _enum('QtWidgets.QFrame.Shape').NoFrame) self.current_thumbnail = index pixmap = QtGui.QPixmap( os.fspath(self.entries[self.current_entry].thumbnails[ self.current_thumbnail])) self.image_display.setPixmap(pixmap) self.thumbnails[self.current_thumbnail].setFrameShape( _enum('QtWidgets.QFrame.Shape').Box)
def __init__(self, data, title="", comment="", icon=None, parent=None, apply=None): super().__init__(parent) self.apply_callback = apply # Form if isinstance(data[0][0], (list, tuple)): self.formwidget = FormTabWidget(data, comment=comment, parent=self) elif len(data[0]) == 3: self.formwidget = FormComboWidget(data, comment=comment, parent=self) else: self.formwidget = FormWidget(data, comment=comment, parent=self) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.formwidget) self.float_fields = [] self.formwidget.setup() # Button box self.bbox = bbox = QtWidgets.QDialogButtonBox( QtWidgets.QDialogButtonBox.StandardButton( _to_int(_enum("QtWidgets.QDialogButtonBox.StandardButton").Ok) | _to_int( _enum("QtWidgets.QDialogButtonBox.StandardButton").Cancel)) ) self.formwidget.update_buttons.connect(self.update_buttons) if self.apply_callback is not None: apply_btn = bbox.addButton( _enum("QtWidgets.QDialogButtonBox.StandardButton").Apply) apply_btn.clicked.connect(self.apply) bbox.accepted.connect(self.accept) bbox.rejected.connect(self.reject) layout.addWidget(bbox) self.setLayout(layout) self.setWindowTitle(title) if not isinstance(icon, QtGui.QIcon): icon = QtWidgets.QWidget().style().standardIcon( QtWidgets.QStyle.SP_MessageBoxQuestion) self.setWindowIcon(icon)
def set_entry(self, index): if self.current_entry == index: return self.current_entry = index entry = self.entries[index] self.pixmaps = [] for fname, thumbnail in zip(entry.thumbnails, self.thumbnails): pixmap = QtGui.QPixmap(os.fspath(fname)) scaled_pixmap = pixmap.scaled( thumbnail.size(), _enum('QtCore.Qt.AspectRatioMode').KeepAspectRatio, _enum('QtCore.Qt.TransformationMode').SmoothTransformation) thumbnail.image.setPixmap(scaled_pixmap) self.pixmaps.append(scaled_pixmap) self.set_large_image(0) self.filelist.setCurrentRow(self.current_entry)
def update_buttons(self): valid = True for field in self.float_fields: if not is_edit_valid(field): valid = False for btn_type in ["Ok", "Apply"]: btn = self.bbox.button( getattr(_enum("QtWidgets.QDialogButtonBox.StandardButton"), btn_type)) if btn is not None: btn.setEnabled(valid)
def __init__(self, parent, index, name): super().__init__() self.parent = parent self.index = index layout = QtWidgets.QVBoxLayout() label = QtWidgets.QLabel(name) label.setAlignment( _enum('QtCore.Qt.AlignmentFlag').AlignHCenter | _enum('QtCore.Qt.AlignmentFlag').AlignVCenter) layout.addWidget(label, 0) self.image = QtWidgets.QLabel() self.image.setAlignment( _enum('QtCore.Qt.AlignmentFlag').AlignHCenter | _enum('QtCore.Qt.AlignmentFlag').AlignVCenter) self.image.setMinimumSize(800 // 3, 600 // 3) layout.addWidget(self.image) self.setLayout(layout)
def keyPressEvent(self, e): if e.key() == _enum('QtCore.Qt.Key').Key_Left: self.set_large_image((self.current_thumbnail - 1) % 3) elif e.key() == _enum('QtCore.Qt.Key').Key_Right: self.set_large_image((self.current_thumbnail + 1) % 3) elif e.key() == _enum('QtCore.Qt.Key').Key_Up: self.set_entry(max(self.current_entry - 1, 0)) elif e.key() == _enum('QtCore.Qt.Key').Key_Down: self.set_entry(min(self.current_entry + 1, len(self.entries) - 1)) elif e.key() == _enum('QtCore.Qt.Key').Key_A: self.accept_test() elif e.key() == _enum('QtCore.Qt.Key').Key_R: self.reject_test() else: super().keyPressEvent(e)
def _test_enums_impl(): import sys from matplotlib.backends.qt_compat import _enum, _to_int, QtCore from matplotlib.backend_bases import cursors, MouseButton _enum("QtGui.QDoubleValidator.State").Acceptable _enum("QtWidgets.QDialogButtonBox.StandardButton").Ok _enum("QtWidgets.QDialogButtonBox.StandardButton").Cancel _enum("QtWidgets.QDialogButtonBox.StandardButton").Apply for btn_type in ["Ok", "Cancel"]: getattr(_enum("QtWidgets.QDialogButtonBox.StandardButton"), btn_type) _enum("QtGui.QImage.Format").Format_ARGB32_Premultiplied _enum("QtGui.QImage.Format").Format_ARGB32_Premultiplied # SPECIAL_KEYS are Qt::Key that do *not* return their unicode name instead # they have manually specified names. SPECIAL_KEYS = { _to_int(getattr(_enum("QtCore.Qt.Key"), k)): v for k, v in [ ("Key_Escape", "escape"), ("Key_Tab", "tab"), ("Key_Backspace", "backspace"), ("Key_Return", "enter"), ("Key_Enter", "enter"), ("Key_Insert", "insert"), ("Key_Delete", "delete"), ("Key_Pause", "pause"), ("Key_SysReq", "sysreq"), ("Key_Clear", "clear"), ("Key_Home", "home"), ("Key_End", "end"), ("Key_Left", "left"), ("Key_Up", "up"), ("Key_Right", "right"), ("Key_Down", "down"), ("Key_PageUp", "pageup"), ("Key_PageDown", "pagedown"), ("Key_Shift", "shift"), # In OSX, the control and super (aka cmd/apple) keys are switched. ("Key_Control", "control" if sys.platform != "darwin" else "cmd"), ("Key_Meta", "meta" if sys.platform != "darwin" else "control"), ("Key_Alt", "alt"), ("Key_CapsLock", "caps_lock"), ("Key_F1", "f1"), ("Key_F2", "f2"), ("Key_F3", "f3"), ("Key_F4", "f4"), ("Key_F5", "f5"), ("Key_F6", "f6"), ("Key_F7", "f7"), ("Key_F8", "f8"), ("Key_F9", "f9"), ("Key_F10", "f10"), ("Key_F10", "f11"), ("Key_F12", "f12"), ("Key_Super_L", "super"), ("Key_Super_R", "super"), ] } # Define which modifier keys are collected on keyboard events. Elements # are (Qt::KeyboardModifiers, Qt::Key) tuples. Order determines the # modifier order (ctrl+alt+...) reported by Matplotlib. _MODIFIER_KEYS = [( _to_int(getattr(_enum("QtCore.Qt.KeyboardModifier"), mod)), _to_int(getattr(_enum("QtCore.Qt.Key"), key)), ) for mod, key in [ ("ControlModifier", "Key_Control"), ("AltModifier", "Key_Alt"), ("ShiftModifier", "Key_Shift"), ("MetaModifier", "Key_Meta"), ]] cursord = { k: getattr(_enum("QtCore.Qt.CursorShape"), v) for k, v in [ (cursors.MOVE, "SizeAllCursor"), (cursors.HAND, "PointingHandCursor"), (cursors.POINTER, "ArrowCursor"), (cursors.SELECT_REGION, "CrossCursor"), (cursors.WAIT, "WaitCursor"), ] } buttond = { getattr(_enum("QtCore.Qt.MouseButton"), k): v for k, v in [ ("LeftButton", MouseButton.LEFT), ("RightButton", MouseButton.RIGHT), ("MiddleButton", MouseButton.MIDDLE), ("XButton1", MouseButton.BACK), ("XButton2", MouseButton.FORWARD), ] } _enum("QtCore.Qt.WidgetAttribute").WA_OpaquePaintEvent _enum("QtCore.Qt.FocusPolicy").StrongFocus _enum("QtCore.Qt.ToolBarArea").TopToolBarArea _enum("QtCore.Qt.ToolBarArea").TopToolBarArea _enum("QtCore.Qt.AlignmentFlag").AlignRight _enum("QtCore.Qt.AlignmentFlag").AlignVCenter _enum("QtWidgets.QSizePolicy.Policy").Expanding _enum("QtWidgets.QSizePolicy.Policy").Ignored _enum("QtCore.Qt.MaskMode").MaskOutColor _enum("QtCore.Qt.ToolBarArea").TopToolBarArea _enum("QtCore.Qt.ToolBarArea").TopToolBarArea _enum("QtCore.Qt.AlignmentFlag").AlignRight _enum("QtCore.Qt.AlignmentFlag").AlignVCenter _enum("QtWidgets.QSizePolicy.Policy").Expanding _enum("QtWidgets.QSizePolicy.Policy").Ignored
def key(self): return _to_int(getattr(_enum("QtCore.Qt.Key"), qt_key))
def choose_color(self): color = QtWidgets.QColorDialog.getColor( self._color, self.parentWidget(), "", _enum("QtWidgets.QColorDialog.ColorDialogOption").ShowAlphaChannel) if color.isValid(): self.set_color(color)
def is_edit_valid(edit): text = edit.text() state = edit.validator().validate(text, 0)[0] return state == _enum("QtGui.QDoubleValidator.State").Acceptable
def eventFilter(self, receiver, event): if event.type() == _enum('QtCore.QEvent.Type').KeyPress: self.window.keyPressEvent(event) return True else: return super().eventFilter(receiver, event)