예제 #1
0
 def select_diagonal(self):
     vb = self.widget.curveplot.plot.vb
     vb.set_mode_select()
     vr = vb.viewRect()
     QTest.qWait(100)
     tls = vr.bottomRight() if self.widget.curveplot.invertX else vr.bottomLeft()
     brs = vr.topLeft() if self.widget.curveplot.invertX else vr.topRight()
     tl = vb.mapViewToScene(tls).toPoint() + QPoint(2, 2)
     br = vb.mapViewToScene(brs).toPoint() - QPoint(2, 2)
     ca = self.widget.curveplot.childAt(tl)
     QTest.mouseClick(ca, Qt.LeftButton, pos=tl)
     QTest.mouseMove(self.widget.curveplot, pos=tl)
     QTest.mouseMove(self.widget.curveplot)
     QTest.qWait(1)
     QTest.mouseClick(ca, Qt.LeftButton, pos=br)
예제 #2
0
 def test_arrow_annotation_action(self):
     w = self.w
     workflow = w.scheme()
     workflow.clear()
     view = w.view()
     w.resize(300, 300)
     actions = w.toolbarActions()
     action_by_name(actions, "new-arrow-action").trigger()
     QTest.mousePress(view.viewport(), Qt.LeftButton, pos=QPoint(50, 50))
     mouseMove(view.viewport(), Qt.LeftButton, pos=QPoint(100, 100))
     QTest.mouseRelease(view.viewport(),
                        Qt.LeftButton,
                        pos=QPoint(100, 100))
     self.assertEqual(len(workflow.annotations), 1)
     self.assertIsInstance(workflow.annotations[0], SchemeArrowAnnotation)
예제 #3
0
    def test_selection(self):
        data = Table('iris')
        selected_indices = []

        def selection_callback(indices):
            nonlocal selected_indices
            selected_indices = indices

        scatter = SelectionScatter(selection_callback)
        scatter.chart(options=dict(series=[dict(data=data.X[:, :2])]))
        scatter.show()

        while scatter.isHidden() or not scatter.geometry().isValid():
            qApp.processEvents()
            time.sleep(.05)

        time.sleep(1)  # add some time for WM to place window or whatever
        topleft = scatter.geometry().topLeft()
        bottomright = scatter.geometry().bottomRight()
        startpos = topleft + QPoint(100, 100)
        endpos = bottomright - QPoint(300, 300)

        # Simulate selection
        QTest.mousePress(scatter, Qt.LeftButton, Qt.NoModifier, startpos, 1000)
        qApp.processEvents()
        QTest.mouseMove(scatter, endpos)
        qApp.processEvents()
        QTest.mouseRelease(scatter, Qt.LeftButton, Qt.NoModifier, endpos, 100)

        while not selected_indices:
            qApp.processEvents()
            time.sleep(.05)

        self.assertEqual(len(selected_indices), 1)
        self.assertGreater(len(selected_indices[0]), 0)

        # Simulate deselection
        QTest.mouseClick(scatter, Qt.LeftButton, Qt.NoModifier,
                         startpos - QPoint(10, 10))

        while selected_indices:
            qApp.processEvents()
            time.sleep(.05)

        self.assertFalse(len(selected_indices))

        QTest.keyClick(scatter, Qt.Key_Escape)
        self.assertTrue(scatter.isHidden())
예제 #4
0
 def is_valid_url(self, url):
     if is_valid_url(url):
         self.Error.invalid_url.clear()
         return True
     self.Error.invalid_url()
     QToolTip.showText(self.combo.mapToGlobal(QPoint(0, 0)),
                       self.combo.toolTip())
예제 #5
0
def decorate_welcome_icon(icon, background_color):
    """Return a `QIcon` with a circle shaped background.
    """
    welcome_icon = QIcon()
    sizes = [32, 48, 64, 80]
    background_color = NAMED_COLORS.get(background_color, background_color)
    background_color = QColor(background_color)
    grad = radial_gradient(background_color)
    for size in sizes:
        icon_pixmap = icon.pixmap(5 * size / 8, 5 * size / 8)
        icon_size = icon_pixmap.size()
        icon_rect = QRect(QPoint(0, 0), icon_size)

        pixmap = QPixmap(size, size)
        pixmap.fill(QColor(0, 0, 0, 0))
        p = QPainter(pixmap)
        p.setRenderHint(QPainter.Antialiasing, True)
        p.setBrush(QBrush(grad))
        p.setPen(Qt.NoPen)
        ellipse_rect = QRect(0, 0, size, size)
        p.drawEllipse(ellipse_rect)
        icon_rect.moveCenter(ellipse_rect.center())
        p.drawPixmap(icon_rect.topLeft(), icon_pixmap)
        p.end()

        welcome_icon.addPixmap(pixmap)

    return welcome_icon
예제 #6
0
    def __testaxis(self, event):
        viewbox = self.parent()
        widget = event.widget()
        assert widget is not None
        view = widget.parent()
        assert isinstance(view, QGraphicsView)
        pos = view.mapFromGlobal(event.screenPos())
        hitarea = view.mapToScene(QRect(pos - QPoint(2, 2), QSize(4, 4)))
        hitarea = viewbox.mapFromScene(hitarea)
        hitarea = viewbox.mapToView(hitarea).boundingRect()
        center = hitarea.center()

        if center.x() < 0:
            hitarea.moveCenter(QPointF(-center.x(), center.y()))

        cx = self.selection[1][1].x()
        cy = self.selection[1][1].y()
        if hitarea.contains(QPointF(cx, cy)):
            axes = Qt.Horizontal | Qt.Vertical
        elif hitarea.bottom() > cy > hitarea.top() and hitarea.left() > cx:
            axes = Qt.Vertical
        elif hitarea.left() < cx < hitarea.right() and hitarea.bottom() > cy:
            axes = Qt.Horizontal
        else:
            axes = 0
        return axes
예제 #7
0
    def test_show_tip(self):
        w = QWidget()
        show_tip(w, QPoint(100, 100), "Ha Ha")
        app = QApplication.instance()
        windows = app.topLevelWidgets()
        label = [
            tl for tl in windows
            if tl.parent() is w and tl.objectName() == "tip-label"
        ][0]
        self.assertTrue(label.isVisible())
        self.assertTrue(label.text() == "Ha Ha")

        show_tip(w, QPoint(100, 100), "Ha")
        self.assertTrue(label.text() == "Ha")
        show_tip(w, QPoint(100, 100), "")
        self.assertFalse(label.isVisible())
    def test_text_annotation_action(self):
        w = self.w
        workflow = w.scheme()
        workflow.clear()
        view = w.view()
        w.resize(300, 300)
        actions = w.toolbarActions()
        action_by_name(actions, "new-text-action").trigger()
        QTest.mousePress(view.viewport(), Qt.LeftButton, pos=QPoint(50, 50))
        mouseMove(view.viewport(), Qt.LeftButton, pos=QPoint(100, 100))
        QTest.mouseRelease(view.viewport(), Qt.LeftButton, pos=QPoint(100, 100))
        # need to steal focus from the item for it to be commited.
        w.scene().setFocusItem(None)

        self.assertEqual(len(workflow.annotations), 1)
        self.assertIsInstance(workflow.annotations[0], SchemeTextAnnotation)
예제 #9
0
def dragEnterLeave(widget: QWidget,
                   mime: QMimeData,
                   pos=QPoint(),
                   action=Qt.CopyAction,
                   buttons=Qt.LeftButton,
                   modifiers=Qt.NoModifier) -> None:
    """
    Simulate a drag/move/leave interaction on the `widget`.

    A QDragEnterEvent, QDragMoveEvent and a QDragLeaveEvent are created
    and dispatched to the widget.
    """
    if pos.isNull():
        pos = widget.rect().center()

    ev = QDragEnterEvent(pos, action, mime, buttons, modifiers)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)

    ev = QDragMoveEvent(pos, action, mime, buttons, modifiers,
                        QDragMoveEvent.DragMove)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)

    ev = QDragLeaveEvent()
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)
    return
예제 #10
0
    def __shadowPixmapForDpr(self, dpr=1.0):
        # type: (float) -> QPixmap
        """
        Return a shadow pixmap rendered in `dpr` device pixel ratio.
        """
        offset = self.offset()
        radius = self.radius()
        color = self.color()
        fill_color = self.palette().color(QPalette.Window)
        rect_size = QSize(int(50 * dpr), int(50 * dpr))
        left = top = right = bottom = int(radius * dpr)
        # Size of the pixmap.
        pixmap_size = QSize(rect_size.width() + left + right,
                            rect_size.height() + top + bottom)
        shadow_rect = QRect(QPoint(left, top) - offset * dpr, rect_size)
        pixmap = QPixmap(pixmap_size)
        pixmap.fill(Qt.transparent)

        pixmap = render_drop_shadow_frame(
            pixmap,
            QRectF(shadow_rect),
            shadow_color=color,
            offset=QPointF(offset * dpr),
            radius=radius * dpr,
            rect_fill_color=fill_color
        )
        pixmap.setDevicePixelRatio(dpr)
        return pixmap
예제 #11
0
    def popup(self, pos=None, searchText=""):
        """
        Popup the menu at `pos` (in screen coordinates). 'Search' text field
        is initialized with `searchText` if provided.

        """
        if pos is None:
            pos = QPoint()

        self.__clearCurrentItems()

        self.__search.setText(searchText)
        patt = QRegExp("(^|\W)" + searchText)
        patt.setCaseSensitivity(False)
        self.__suggestPage.setFilterRegExp(patt)

        self.ensurePolished()

        if self.testAttribute(Qt.WA_Resized) and self.sizeGripEnabled():
            size = self.size()
        else:
            size = self.sizeHint()

        desktop = QApplication.desktop()
        screen_geom = desktop.availableGeometry(pos)

        # Adjust the size to fit inside the screen.
        if size.height() > screen_geom.height():
            size.setHeight(screen_geom.height())
        if size.width() > screen_geom.width():
            size.setWidth(screen_geom.width())

        geom = QRect(pos, size)

        if geom.top() < screen_geom.top():
            geom.setTop(screen_geom.top())

        if geom.left() < screen_geom.left():
            geom.setLeft(screen_geom.left())

        bottom_margin = screen_geom.bottom() - geom.bottom()
        right_margin = screen_geom.right() - geom.right()
        if bottom_margin < 0:
            # Falls over the bottom of the screen, move it up.
            geom.translate(0, bottom_margin)

        # TODO: right to left locale
        if right_margin < 0:
            # Falls over the right screen edge, move the menu to the
            # other side of pos.
            geom.translate(-size.width(), 0)

        self.setGeometry(geom)

        self.show()

        if searchText:
            self.setFocusProxy(self.__search)
        else:
            self.setFocusProxy(None)
예제 #12
0
 def test_drop_sample(self):
     path = os.path.join(self._path, "lib.cell.count")
     data = QMimeData()
     data.setUrls([QUrl.fromLocalFile(path)])
     event = QDropEvent(QPoint(10, 10), Qt.MoveAction, data, Qt.NoButton,
                        Qt.NoModifier, QDropEvent.Drop)
     self.widget.view.dropEvent(event)
     self.assertEqual(self.widget.view.model().rowCount(), 3)
예제 #13
0
 def test_tool_tips(self):
     scene = GraphicsScene()
     view = QGraphicsView(scene)
     w = TextListWidget()
     text = "A" * 10
     w.setItems([text, text])
     scene.addItem(w)
     view.grab()  # ensure w is laid out
     wrect = view.mapFromScene(w.mapToScene(
         w.contentsRect())).boundingRect()
     p = QPoint(wrect.topLeft() + QPoint(5, 5))
     ev = QHelpEvent(QHelpEvent.ToolTip, p, view.viewport().mapToGlobal(p))
     try:
         QApplication.sendEvent(view.viewport(), ev)
         self.assertEqual(QToolTip.text(), text)
     finally:
         QToolTip.hideText()
예제 #14
0
    def __init__(self, *args, **kwargs):
        self.__scaledMinimum = kwargs.pop('minimum', 0)
        self.__scaledMaximum = kwargs.pop('maximum', 99)
        tracking = kwargs.pop('tracking', True)

        self.__steps = max(kwargs.pop('steps', 1024), 1)
        self.__scale = (self.__scaledMaximum -
                        self.__scaledMinimum) / self.__steps
        self._tickList = kwargs.pop('ticks', None)

        if self._tickList is not None:
            self._tickList = np.unique(self._tickList)

        self._tickImage = QPixmap()

        minimum = kwargs['minimum'] = 0
        maximum = kwargs['maximum'] = self.__steps

        self.__position0 = self.__value0 = kwargs.pop('value0', minimum)
        self.__position1 = self.__value1 = kwargs.pop('value1', maximum)

        self._handleWidth = kwargs.pop('handleWidth', 10)
        self._tickHeight = 4

        kwargs['orientation'] = Qt.Horizontal
        super().__init__(*args, **kwargs)

        self.setTracking(tracking)
        self.setMouseTracking(True)
        self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)

        # holds bounding rectangles for handle0, handle1, inner handle and groove respectively; last rect is invalid
        self._rects = [QRect(), QRect(), QRect(), QRect()]

        # the index of the handle used as index to _rects; -1 is none
        self._hover = -1
        self._press = -1

        # used to calculate mouse events
        self._handleOffset = QPoint()
        self._lastPos = (maximum, minimum)
        self._lastClick = QPoint()

        #
        self._makeTickMarks()
예제 #15
0
def dragDrop(widget: QWidget,
             mime: QMimeData,
             pos: QPoint = QPoint(),
             action=Qt.CopyAction,
             buttons=Qt.LeftButton,
             modifiers=Qt.NoModifier) -> bool:
    """
    Simulate a drag/drop interaction on the `widget`.

    A `QDragEnterEvent`, `QDragMoveEvent` and `QDropEvent` are created and
    dispatched to the `widget`. However if any of the `QDragEnterEvent` or
    `QDragMoveEvent` are not accepted, a `QDragLeaveEvent` is dispatched
    to 'reset' the widget state before this function returns `False`

    Parameters
    ----------
    widget: QWidget
        The target widget.
    mime: QMimeData
        The mime data associated with the drag/drop.
    pos: QPoint
        Position of the drop
    action: Qt.DropActions
        Type of acceptable drop actions
    buttons: Qt.MouseButtons:
        Pressed mouse buttons.
    modifiers: Qt.KeyboardModifiers
        Pressed keyboard modifiers.

    Returns
    -------
    state: bool
        Were the events accepted.

    See Also
    --------
    QDragEnterEvent, QDropEvent
    """
    if pos.isNull():
        pos = widget.rect().center()

    ev = QDragEnterEvent(pos, action, mime, buttons, modifiers)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)

    ev = QDragMoveEvent(pos, action, mime, buttons, modifiers)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)

    if not ev.isAccepted():
        QApplication.sendEvent(widget, QDragLeaveEvent())
        return False

    ev = QDropEvent(QPointF(pos), action, mime, buttons, modifiers)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)
    return ev.isAccepted()
예제 #16
0
def dragDrop(widget: 'QWidget',
             mime: QMimeData,
             pos: QPoint = QPoint(-1, -1),
             action=Qt.CopyAction,
             buttons=Qt.LeftButton,
             modifiers=Qt.NoModifier) -> bool:
    if pos == QPoint(-1, -1):
        pos = widget.rect().center()

    ev = QDragEnterEvent(pos, action, mime, buttons, modifiers)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)
    if not ev.isAccepted():
        return False
    ev = QDropEvent(QPointF(pos), action, mime, buttons, modifiers)
    ev.setAccepted(False)
    QApplication.sendEvent(widget, ev)
    return ev.isAccepted()