def draw_text(expected: QPainter, x: int, y: int, text: str):
    window = expected.window()
    scene = QGraphicsScene(0, 0, window.width(), window.height())
    text_item = scene.addSimpleText(text)
    font = expected.font()
    text_item.setFont(font)
    center_text_item(text_item, x, y)
    scene.render(expected)
Beispiel #2
0
    def __init__(self):
        super().__init__()

        # self.resize(300, 200)
        scene = QGraphicsScene(self)
        # scene.setItemIndexMethod(QGraphicsScene.NoIndex)
        scene.setSceneRect(0, 0, self.width(), self.height())
        self.setScene(scene)

        recognizer = PanGestureRecognizer()
        pan_gesture_id = QGestureRecognizer.registerRecognizer(recognizer)
        self.grabGesture(pan_gesture_id)
Beispiel #3
0
    def __init__(self):
        super().__init__()

        scene = QGraphicsScene(self)
        scene.setSceneRect(0, 0, 10, 10)
        self.setScene(scene)

        recognizer = PanGestureRecognizer()

        # CRASH HERE
        pan_gesture_id = QGestureRecognizer.registerRecognizer(recognizer)

        self.grabGesture(pan_gesture_id)
Beispiel #4
0
def test_click(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240,
                                       'spline_click') as (actual, expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SplineDisplay.load_pixmap('board-1.png', QSize(240,
                                                           240))).setPos(1, 0)
        black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png',
                                               QSize(60, 60))

        expected_scene.addPixmap(black_ball).setPos(115, 114)
        expected_scene.render(expected)

        display = SplineDisplay()
        height = 0
        row = 1
        column = 2
        piece_item = display.item_levels[height][row][column]

        display.resize(348, 264)
        display.grab()  # Force layout to recalculate.

        display.on_click(piece_item)

        render_display(display, actual)
Beispiel #5
0
def test_update(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240, 'spargo_update') as (
            actual,
            expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SpargoDisplay.load_pixmap('board-1.png',
                                      QSize(240, 240))).setPos(1, 0)
        black_ball = SpargoDisplay.load_pixmap('ball-b-shadow-1.png',
                                               QSize(60, 60))

        expected_scene.addPixmap(black_ball).setPos(63, 166)
        expected_scene.render(expected)

        display = SpargoDisplay()

        display.resize(348, 264)
        display.update_board(SpargoState("""\
  A C E G
7 . . . . 7

5 . . . . 5

3 . . . . 3

1 . B . . 1
  A C E G
>W
"""))

        render_display(display, actual)
    assert display.ui.black_count.text() == '1'
    assert display.ui.white_count.text() == '0'
Beispiel #6
0
def test_double_update(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240,
                                       'spline_double_update') as (actual,
                                                                   expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SplineDisplay.load_pixmap('board-1.png', QSize(240,
                                                           240))).setPos(1, 0)
        white_ball = SplineDisplay.load_pixmap('ball-w-shadow-1.png',
                                               QSize(60, 60))
        black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png',
                                               QSize(60, 60))

        expected_scene.addPixmap(black_ball).setPos(11, 10)
        expected_scene.addPixmap(white_ball).setPos(63, 10)
        expected_scene.addPixmap(black_ball).setPos(115, 62)
        expected_scene.render(expected)

        display = SplineDisplay()
        trigger_resize(display, 300, 240)
        display.update_board(
            SplineState("""\
  A C E G
7 W B . . 7

5 . . . W 5

3 . . . . 3

1 . . . . 1
  A C E G
"""))
        display.update_board(
            SplineState("""\
  A C E G
7 B W . . 7

5 . . B . 5

3 . . . . 3

1 . . . . 1
  A C E G
"""))

        display.resize(348, 264)

        render_display(display, actual)
def test_hover_enter_remove(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(
            240, 240, 'spook_hover_enter_remove') as (actual, expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SpookDisplay.load_pixmap('board-1.png', QSize(240,
                                                          240))).setPos(1, 0)
        white_ball = SpookDisplay.load_pixmap('ball-w-shadow-1.png',
                                              QSize(60, 60))
        red_ball = SpookDisplay.load_pixmap('ball-r-shadow-1.png',
                                            QSize(60, 60))
        black_ball = SpookDisplay.load_pixmap('ball-b-shadow-1.png',
                                              QSize(60, 60))

        black_piece = expected_scene.addPixmap(black_ball)
        black_piece.setPos(115, 114)
        black_piece.setOpacity(0.5)
        red_piece = expected_scene.addPixmap(red_ball)
        red_piece.setPos(63, 62)
        white_piece = expected_scene.addPixmap(white_ball)
        white_piece.setPos(115, 62)
        expected_scene.render(expected)

        display = SpookDisplay()
        display.update_board(
            SpookState('''\
  A C E G
7 . . . . 7

5 . R W . 5

3 . . B . 3

1 . . . . 1
  A C E G
>R(R,B)
'''))
        height = 0
        row = 1
        column = 2
        piece_item = display.item_levels[height][row][column]

        display.resize(348, 264)
        display.grab()  # Force layout to recalculate.

        display.on_hover_enter(piece_item)

        render_display(display, actual)
Beispiel #8
0
def test_hover_enter_red(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(
            240, 240, 'sandbox_hover_enter_red') as (actual, expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SandboxDisplay.load_pixmap('board-1.png',
                                       QSize(240, 240))).setPos(1, 0)
        red_ball = SandboxDisplay.load_pixmap('ball-r-shadow-1.png',
                                              QSize(60, 60))

        new_piece = expected_scene.addPixmap(red_ball)
        new_piece.setPos(115, 114)
        new_piece.setOpacity(0.5)
        expected_scene.render(expected)

        display = SandboxDisplay()
        display.selected_move_type = MoveType.RED
        height = 0
        row = 1
        column = 2
        piece_item = display.item_levels[height][row][column]

        display.resize(348, 264)
        display.grab()  # Force layout to recalculate.

        display.on_hover_enter(piece_item)

        render_display(display, actual)
    def __init__(self, start_state: ShibumiGameState):
        super().__init__(start_state)
        self.start_state = start_state

        ui = self.ui = Ui_ShibumiDisplay()
        ui.setupUi(self)
        scene = QGraphicsScene()
        ui.game_display.setScene(scene)
        self.background_pixmap = self.assemble_board()
        self.background_item = scene.addPixmap(self.background_pixmap)
        self.white_scaled = self.white_pixmap = self.load_pixmap(
            'ball-w-shadow-1.png')
        self.black_scaled = self.black_pixmap = self.load_pixmap(
            'ball-b-shadow-1.png')
        self.red_scaled = self.red_pixmap = self.load_pixmap(
            'ball-r-shadow-1.png')
        self.remove_pixmap = self.load_pixmap('ball-x-shadow-1.png')
        self.item_levels = []
        self.hovered_piece: typing.Optional[GraphicsShibumiPieceItem] = None
        for height in range(self.start_state.size):
            item_level = []
            for row in range(self.start_state.size - height):
                item_row = []
                for column in range(self.start_state.size - height):
                    item = GraphicsShibumiPieceItem(height, row, column, self)
                    scene.addItem(item)
                    item_row.append(item)
                item_level.append(item_row)
            self.item_levels.append(item_level)
        self.row_labels = []
        self.column_labels = []
        for i in range(self.start_state.size * 2 - 1):
            self.row_labels.append(scene.addSimpleText(str(i + 1)))
            self.column_labels.append(scene.addSimpleText(chr(i + 65)))
        self.ui.move_black.clicked.connect(
            lambda: self.on_move_type_selected(MoveType.BLACK))
        self.ui.move_white.clicked.connect(
            lambda: self.on_move_type_selected(MoveType.WHITE))
        self.ui.move_red.clicked.connect(
            lambda: self.on_move_type_selected(MoveType.RED))
        self.ui.remove.clicked.connect(
            lambda: self.on_move_type_selected(MoveType.REMOVE))
        self._selected_move_type = MoveType.BLACK
        self._visible_counts: typing.FrozenSet[PlayerCode] = frozenset()
        self._visible_move_types: typing.FrozenSet[MoveType] = frozenset()
        self.ui.black_count_pixmap.setText('')
        self.ui.white_count_pixmap.setText('')
        self.ui.red_count_pixmap.setText('')
        self.ui.move_black.setText('')
        self.ui.move_white.setText('')
        self.ui.move_red.setText('')
        self.ui.remove.setText('')
        self.ui.move_black.setIcon(self.black_pixmap)
        self.ui.move_white.setIcon(self.white_pixmap)
        self.ui.move_red.setIcon(self.red_pixmap)
        self.ui.remove.setIcon(self.remove_pixmap)
        self.ui.pass_button.setVisible(False)
        self.show_counts = False
        self.show_move_types = False
        self.debug_message = ''
Beispiel #10
0
 def rotate_selected(scene: QGraphicsScene, e: QKeyEvent):
     for item in scene.selectedItems():
         if e.key() == Qt.Key_Right:
             item.setRotation(
                 (item.rotation() + 1 +
                  (2 * (e.modifiers() == Qt.ShiftModifier))) % 360)
         elif e.key() == Qt.Key_Left:
             item.setRotation(
                 (item.rotation() - 1 -
                  (2 * (e.modifiers() == Qt.ShiftModifier))) % 360)
Beispiel #11
0
    def __init__(self, parent=None):
        super(View, self).__init__(parent)
        self.setScene(QGraphicsScene(self))

        self.setDragMode(QGraphicsView.NoDrag)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        # Chart
        self._chart = QChart()
        self._chart.setMinimumSize(640, 480)
        self._chart.setTitle("Hover the line to show callout. Click the line "
                             "to make it stay")
        self._chart.legend().hide()
        self.series = QLineSeries()
        self.series.append(1, 3)
        self.series.append(4, 5)
        self.series.append(5, 4.5)
        self.series.append(7, 1)
        self.series.append(11, 2)
        self._chart.addSeries(self.series)

        self.series2 = QSplineSeries()
        self.series2.append(1.6, 1.4)
        self.series2.append(2.4, 3.5)
        self.series2.append(3.7, 2.5)
        self.series2.append(7, 4)
        self.series2.append(10, 2)
        self._chart.addSeries(self.series2)

        self._chart.createDefaultAxes()
        self._chart.setAcceptHoverEvents(True)

        self.setRenderHint(QPainter.Antialiasing)
        self.scene().addItem(self._chart)

        self._coordX = QGraphicsSimpleTextItem(self._chart)
        self._coordX.setPos(self._chart.size().width() / 2 - 50,
                            self._chart.size().height())
        self._coordX.setText("X: ")
        self._coordY = QGraphicsSimpleTextItem(self._chart)
        self._coordY.setPos(self._chart.size().width() / 2 + 50,
                            self._chart.size().height())
        self._coordY.setText("Y: ")

        self._callouts = []
        self._tooltip = Callout(self._chart)

        self.series.clicked.connect(self.keepCallout)
        self.series.hovered.connect(self.tooltip)

        self.series2.clicked.connect(self.keepCallout)
        self.series2.hovered.connect(self.tooltip)

        self.setMouseTracking(True)
Beispiel #12
0
    def _on_calculate_word_freq(self):
        # one reference
        # selected = self.window.refListView.currentIndex().row()
        # refPath = self.refPaths[selected]
        selecteds = self.window.refListView.selectedIndexes()
        selectedRefPaths = []
        for selected in selecteds:
            selectedRefPaths.append(self.refPaths[selected.row()])

        self.backend.update_refs(selectedRefPaths)
        wordCloudDraw = self.backend.drawWordCloud()

        # binary
        biWordCloudDraw = wordCloudDraw.to_array()

        x = biWordCloudDraw.shape[1]
        y = biWordCloudDraw.shape[0]
        channel = biWordCloudDraw.shape[2]
        frame = QImage(biWordCloudDraw, x, y, QImage.Format_RGB888)
        pix = QPixmap.fromImage(frame)
        scene = QGraphicsScene()
        item = QGraphicsPixmapItem(pix)
        scene.addItem(item)

        self.window.wordCloudView.setScene(scene)

        def fit_view():
            self.window.wordCloudView.fitInView(item)

        def save_image():
            wordCloudDraw.to_file('wc.png')

        rezoom = QAction(self.window.wordCloudView)
        rezoom.setText('Rezoom')
        rezoom.triggered.connect(fit_view)

        save = QAction(self.window.wordCloudView)
        save.setText('Save')
        save.triggered.connect(save_image)

        self.window.wordCloudView.addAction(rezoom)
        self.window.wordCloudView.addAction(save)
Beispiel #13
0
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.processing = False
        self.rectangle = None

        self.setMinimumHeight(405)
        self.layout = QVBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.scene = QGraphicsScene(self)
        self.scene.setBackgroundBrush(QBrush(Qt.black))
        self.view = QGraphicsView(self.scene)
        self.viewfinder = QGraphicsVideoItem()
        self.scene.addItem(self.viewfinder)
        self.layout.addWidget(self.view)
        self.setLayout(self.layout)

        self.camera = None
        self.captureSession = None
        self.imageCapture = None
        self.captureTimer = None
Beispiel #14
0
    def __init__(self, parent=None, audio=None, settings=None):
        super().__init__(parent)
        self.setupUi(self)
        self.bg_image = None
        self.spectrogram_scene = QGraphicsScene(self)

        self._audio = None
        self._spectrogram = None
        self._image_generator = None

        self.sound_marker = None
        self.marker_position = 0
        self.yscale = 1

        self.settings = settings

        self.audio = audio
        self.setup_graphics_view()
        self.define_shortcuts()
        self.install_filters()
Beispiel #15
0
 def rescale_selected(scene: QGraphicsScene, e: QKeyEvent):
     for item in scene.selectedItems():
         transform = item.transform()
         if e.key() == Qt.Key_W:
             transform.scale(1, 1.01)
         elif e.key() == Qt.Key_S:
             transform.scale(1, 0.99)
         elif e.key() == Qt.Key_D:
             transform.scale(1.01, 1)
         elif e.key() == Qt.Key_A:
             transform.scale(0.99, 1)
         item.setTransform(transform)
Beispiel #16
0
def test_empty(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240,
                                       'sandbox_empty') as (actual, expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SandboxDisplay.load_pixmap('board-1.png',
                                       QSize(240, 240))).setPos(1, 0)

        expected_scene.render(expected)

        display = SandboxDisplay()

        display.resize(348, 264)

        render_display(display, actual)
    for widget in (display.ui.move_black, display.ui.move_white,
                   display.ui.move_red, display.ui.remove,
                   display.ui.black_count_pixmap,
                   display.ui.white_count_pixmap, display.ui.red_count_pixmap,
                   display.ui.black_count, display.ui.white_count,
                   display.ui.red_count):
        assert widget.isVisibleTo(display)
    assert display.ui.move_black.isChecked()
    assert display.ui.red_count.text() == '0'
Beispiel #17
0
def test_empty(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240, 'spargo_empty') as (
            actual,
            expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SpargoDisplay.load_pixmap('board-1.png',
                                      QSize(240, 240))).setPos(1, 0)

        expected_scene.render(expected)

        display = SpargoDisplay()
        display.resize(348, 264)

        render_display(display, actual)
    assert display.ui.move_text.text() == 'to move'
    assert display.ui.black_count.text() == '0'
    assert display.ui.red_count.text() == ''
    assert display.ui.white_count.text() == '0'
    black_icon = display.black_pixmap.toImage()
    assert display.ui.black_count_pixmap.pixmap().toImage() == black_icon
    assert display.ui.player_pixmap.pixmap().toImage() == black_icon
    white_icon = display.white_pixmap.toImage()
    assert display.ui.white_count_pixmap.pixmap().toImage() == white_icon
Beispiel #18
0
def test_coordinates(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 200,
                                       'spline_coordinates') as (actual,
                                                                 expected):
        expected_scene = QGraphicsScene(0, 0, 240, 200)
        expected_scene.addPixmap(
            SplineDisplay.load_pixmap('board-1.png',
                                      QSize(160, 160))).setPos(36, 0)

        for i in range(7):
            add_text(expected_scene, str(7 - i), 15 + i % 2 * 10, i * 17 + 27,
                     10)
            add_text(expected_scene, chr(65 + i), i * 17 + 64,
                     178 - i % 2 * 10, 10)

        expected_scene.render(expected)

        display = SplineDisplay()
        display.resize(348, 224)

        display.show_coordinates = True

        render_display(display, actual)
Beispiel #19
0
def test_first_level(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240,
                                       'spline_first_level') as (actual,
                                                                 expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SplineDisplay.load_pixmap('board-1.png', QSize(240,
                                                           240))).setPos(1, 0)
        white_ball = SplineDisplay.load_pixmap('ball-w-shadow-1.png',
                                               QSize(60, 60))
        black_ball = SplineDisplay.load_pixmap('ball-b-shadow-1.png',
                                               QSize(60, 60))

        expected_scene.addPixmap(white_ball).setPos(11, 10)
        expected_scene.addPixmap(black_ball).setPos(63, 10)
        expected_scene.addPixmap(black_ball).setPos(167, 62)
        expected_scene.render(expected)

        display = SplineDisplay()
        display.update_board(
            SplineState("""\
  A C E G
7 W B . . 7

5 . . . B 5

3 . . . . 3

1 . . . . 1
  A C E G
"""))

        display.resize(348, 264)

        render_display(display, actual)
    white_icon = SplineDisplay.load_pixmap('ball-w-shadow-1.png').toImage()
    assert display.ui.player_pixmap.pixmap().toImage() == white_icon
Beispiel #20
0
    def __init__(self):
        super().__init__()

        scene = QGraphicsScene()
        self.setScene(scene)

        self.setRenderHint(QPainter.Antialiasing)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setMouseTracking(True)

        self._offset = QPointF(0, 0)
        self._zoom = 0

        self.backgroundColor = QColor(40, 40, 40)

        self.gridSpacing = QSizeF(60, 60)
        self.gridThickness = 1
        self.gridColor = QColor(100, 100, 100)
        self.gridZoomThreshold = -1.5
        self.showGrid = True

        self.selectionBoxStrokeColor = QColor(52, 222, 235)
        self.selectionBoxFillColor = QColor(52, 222, 235, 50)
        self.selectionBoxThickness = 2
        self._editing = True

        self._hoveredItems: List[ChipItem] = []
        self._selectedItems: List[ChipItem] = []
        self._sceneItems: Set[ChipItem] = set()

        self._boxSelectionRectAnchor = QPointF()
        self._currentCursorPosition = QPointF()

        self.selectionBox = self.scene().addRect(QRectF(),
                                                 QPen(self.selectionBoxStrokeColor, self.selectionBoxThickness),
                                                 QBrush(self.selectionBoxFillColor))
        self.selectionBox.setVisible(False)

        self._state = State.IDLE

        self.UpdateView()
Beispiel #21
0
def test_hover_enter_leave(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(
            240, 240, 'sandbox_hover_enter_leave') as (actual, expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SandboxDisplay.load_pixmap('board-1.png',
                                       QSize(240, 240))).setPos(1, 0)
        white_ball = SandboxDisplay.load_pixmap('ball-w-shadow-1.png',
                                                QSize(60, 60))

        new_piece = expected_scene.addPixmap(white_ball)
        new_piece.setPos(115, 114)
        expected_scene.render(expected)

        display = SandboxDisplay()
        display.update_board(
            SandboxState('''\
  A C E G
7 . . . . 7

5 . . . . 5

3 . . W . 3

1 . . . . 1
  A C E G
'''))
        display.selected_move_type = MoveType.REMOVE
        height = 0
        row = 1
        column = 2
        piece_item = display.item_levels[height][row][column]

        display.resize(348, 264)
        display.grab()  # Force layout to recalculate.

        display.on_hover_enter(piece_item)
        display.on_hover_leave(piece_item)

        render_display(display, actual)
Beispiel #22
0
def test_resize_narrow(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(120, 240,
                                       'spline_resize_narrow') as (actual,
                                                                   expected):
        expected_scene = QGraphicsScene(0, 0, 120, 240)
        expected_scene.addPixmap(
            SplineDisplay.load_pixmap('board-1.png',
                                      QSize(120, 123))).setPos(0, 59)

        expected_scene.render(expected)

        display = SplineDisplay()

        display.resize(204, 264)

        render_display(display, actual)
Beispiel #23
0
def test_empty(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(240, 240,
                                       'spline_empty') as (actual, expected):
        expected_scene = QGraphicsScene(0, 0, 240, 240)
        expected_scene.addPixmap(
            SplineDisplay.load_pixmap('board-1.png', QSize(240,
                                                           240))).setPos(1, 0)

        expected_scene.render(expected)

        display = SplineDisplay()

        display.resize(348, 264)

        render_display(display, actual)
    black_icon = SplineDisplay.load_pixmap('ball-b-shadow-1.png').toImage()
    assert display.ui.player_pixmap.pixmap().toImage() == black_icon
    assert display.ui.move_text.text() == 'to move'
def test_coordinates(pixmap_differ: PixmapDiffer):
    actual: QPainter
    expected: QPainter
    with pixmap_differ.create_painters(360, 240,
                                       'margo_coordinates') as (actual,
                                                                expected):
        expected_scene = QGraphicsScene(0, 0, 360, 240)
        display = MargoDisplay(size=2)
        full_board = display.assemble_board()
        scaled_board = display.scale_pixmap(full_board, 185, 192)
        expected_scene.addPixmap(scaled_board).setPos(82, 0)
        add_text(expected_scene, '3', 57, 57, 12)
        add_text(expected_scene, '2', 68, 93, 12)
        add_text(expected_scene, '1', 57, 129, 12)
        add_text(expected_scene, 'A', 141, 214, 12)
        add_text(expected_scene, 'B', 177, 203, 12)
        add_text(expected_scene, 'C', 213, 214, 12)
        expected_scene.render(expected)

        display.resize(492, 264)

        display.show_coordinates = True

        render_display(display, actual)
Beispiel #25
0
 def delete_selected(scene: QGraphicsScene, gim: GraphicItemModel):
     gim.delete_all_from_references(scene.selectedItems())
     for item in scene.selectedItems():
         scene.removeItem(item)
    def __init__(self):
        super(self.__class__, self).__init__()
        Ui_Img.__init__(self)
        self.setupUi(self)
        self.bookId = ""
        self.epsId = 0
        self.curIndex = 0
        self.setWindowTitle("IMG")
        self.setWindowModality(QtCore.Qt.ApplicationModal)
        self.resize(800, 900)
        self.checkBox.setChecked(True)
        self.index = 0
        self.comboBox.setCurrentIndex(self.index)
        validator = QIntValidator(0, 9999999)
        self.heighEdit.setValidator(validator)
        self.widthEdit.setValidator(validator)
        exp = QDoubleValidator(0.1, 64, 1)
        exp.setNotation(exp.StandardNotation)
        self.scaleEdit.setValidator(exp)
        # self.setWindowFlags(Qt.FramelessWindowHint)

        self.graphicsView.setFrameStyle(QFrame.NoFrame)
        self.graphicsView.setObjectName("graphicsView")

        self.graphicsView.setBackgroundBrush(QColor(Qt.white))
        self.graphicsView.setCursor(Qt.OpenHandCursor)
        self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.graphicsView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.graphicsView.setRenderHints(QPainter.Antialiasing |
                                         QPainter.SmoothPixmapTransform)
        self.graphicsView.setCacheMode(self.graphicsView.CacheBackground)
        self.graphicsView.setViewportUpdateMode(self.graphicsView.SmartViewportUpdate)

        self.graphicsItem = QGraphicsPixmapItem()
        self.graphicsItem.setFlags(QGraphicsPixmapItem.ItemIsFocusable |
                                   QGraphicsPixmapItem.ItemIsMovable)
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.CopyPicture)

        self.graphicsScene = QGraphicsScene(self)  # 场景
        self.graphicsView.setScene(self.graphicsScene)
        self.graphicsScene.addItem(self.graphicsItem)
        self.graphicsView.setMinimumSize(10, 10)
        self.pixMap = QPixmap("Loading")
        self.graphicsItem.setPixmap(self.pixMap)
        # self.radioButton.setChecked(True)
        self.isStripModel = False

        # self.radioButton.installEventFilter(self)
        # self.radioButton_2.installEventFilter(self)
        self.graphicsView.installEventFilter(self)
        self.graphicsView.setWindowFlag(Qt.FramelessWindowHint)
        # tta有BUG,暂时屏蔽 TODO
        # self.ttaModel.setEnabled(False)
        self.data = b""
        self.waifu2xData = b""

        self._delta = 0.1
        self.scaleCnt = 0

        self.backStatus = ""
        self.format = ""
class QtImg(QtWidgets.QWidget, Ui_Img):
    def __init__(self):
        super(self.__class__, self).__init__()
        Ui_Img.__init__(self)
        self.setupUi(self)
        self.bookId = ""
        self.epsId = 0
        self.curIndex = 0
        self.setWindowTitle("IMG")
        self.setWindowModality(QtCore.Qt.ApplicationModal)
        self.resize(800, 900)
        self.checkBox.setChecked(True)
        self.index = 0
        self.comboBox.setCurrentIndex(self.index)
        validator = QIntValidator(0, 9999999)
        self.heighEdit.setValidator(validator)
        self.widthEdit.setValidator(validator)
        exp = QDoubleValidator(0.1, 64, 1)
        exp.setNotation(exp.StandardNotation)
        self.scaleEdit.setValidator(exp)
        # self.setWindowFlags(Qt.FramelessWindowHint)

        self.graphicsView.setFrameStyle(QFrame.NoFrame)
        self.graphicsView.setObjectName("graphicsView")

        self.graphicsView.setBackgroundBrush(QColor(Qt.white))
        self.graphicsView.setCursor(Qt.OpenHandCursor)
        self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.graphicsView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.graphicsView.setRenderHints(QPainter.Antialiasing |
                                         QPainter.SmoothPixmapTransform)
        self.graphicsView.setCacheMode(self.graphicsView.CacheBackground)
        self.graphicsView.setViewportUpdateMode(self.graphicsView.SmartViewportUpdate)

        self.graphicsItem = QGraphicsPixmapItem()
        self.graphicsItem.setFlags(QGraphicsPixmapItem.ItemIsFocusable |
                                   QGraphicsPixmapItem.ItemIsMovable)
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.CopyPicture)

        self.graphicsScene = QGraphicsScene(self)  # 场景
        self.graphicsView.setScene(self.graphicsScene)
        self.graphicsScene.addItem(self.graphicsItem)
        self.graphicsView.setMinimumSize(10, 10)
        self.pixMap = QPixmap("Loading")
        self.graphicsItem.setPixmap(self.pixMap)
        # self.radioButton.setChecked(True)
        self.isStripModel = False

        # self.radioButton.installEventFilter(self)
        # self.radioButton_2.installEventFilter(self)
        self.graphicsView.installEventFilter(self)
        self.graphicsView.setWindowFlag(Qt.FramelessWindowHint)
        # tta有BUG,暂时屏蔽 TODO
        # self.ttaModel.setEnabled(False)
        self.data = b""
        self.waifu2xData = b""

        self._delta = 0.1
        self.scaleCnt = 0

        self.backStatus = ""
        self.format = ""

    def ShowImg(self, data):
        if data:
            self.data = data
            self.waifu2xData = b""
            QtTask().CancelConver("QtImg")
            self._ShowImg(data)
        elif self.data:
            self._ShowImg(self.data)
        else:
            pass

    def _ShowImg(self, data):
        self.scaleCnt = 0
        self.pixMap = QPixmap()
        self.pixMap.loadFromData(data)
        self.show()
        self.graphicsItem.setPixmap(self.pixMap)
        self.graphicsView.setSceneRect(QRectF(QPointF(0, 0), QPointF(self.pixMap.width(), self.pixMap.height())))
        size = ToolUtil.GetDownloadSize(len(data))
        self.sizeLabel.setText(size)
        weight, height = ToolUtil.GetPictureSize(data)
        self.resolutionLabel.setText(str(weight) + "x" + str(height))
        self.ScalePicture()

    def ScalePicture(self):
        rect = QRectF(self.graphicsItem.pos(), QSizeF(
            self.pixMap.size()))
        unity = self.graphicsView.transform().mapRect(QRectF(0, 0, 1, 1))
        width = unity.width()
        height = unity.height()
        if width <= 0 or height <= 0:
            return
        self.graphicsView.scale(1 / width, 1 / height)
        viewRect = self.graphicsView.viewport().rect()
        sceneRect = self.graphicsView.transform().mapRect(rect)
        if sceneRect.width() <= 0 or sceneRect.height() <= 0:
            return
        x_ratio = viewRect.width() / sceneRect.width()
        y_ratio = viewRect.height() / sceneRect.height()
        x_ratio = y_ratio = min(x_ratio, y_ratio)

        self.graphicsView.scale(x_ratio, y_ratio)
        # if self.readImg.isStripModel:
        #     height2 = self.pixMap.size().height() / 2
        #     height3 = self.graphicsView.size().height()/2
        #     height3 = height3/x_ratio
        #     p = self.graphicsItem.pos()
        #     self.graphicsItem.setPos(p.x(), p.y()+height2-height3)
        self.graphicsView.centerOn(rect.center())

        for _ in range(abs(self.scaleCnt)):
            if self.scaleCnt > 0:
                self.graphicsView.scale(1.1, 1.1)
            else:
                self.graphicsView.scale(1/1.1, 1/1.1)

    def resizeEvent(self, event) -> None:
        super(self.__class__, self).resizeEvent(event)
        self.ScalePicture()

    def eventFilter(self, obj, ev):
        if ev.type() == QEvent.KeyPress:
            return True
        else:
            return super(self.__class__, self).eventFilter(obj, ev)

    def wheelEvent(self, event):
        if event.angleDelta().y() > 0:
            self.zoomIn()
        else:
            self.zoomOut()

    def zoomIn(self):
        """放大"""
        self.zoom(1.1)

    def zoomOut(self):
        """缩小"""
        self.zoom(1/1.1)

    def zoom(self, factor):
        """缩放
        :param factor: 缩放的比例因子
        """
        _factor = self.graphicsView.transform().scale(
            factor, factor).mapRect(QRectF(0, 0, 1, 1)).width()
        if _factor < 0.07 or _factor > 100:
            # 防止过大过小
            return
        if factor >= 1:
            self.scaleCnt += 1
        else:
            self.scaleCnt -= 1
        self.graphicsView.scale(factor, factor)

    def CopyPicture(self):
        clipboard = QApplication.clipboard()
        clipboard.setPixmap(self.pixMap)
        QtBubbleLabel.ShowMsgEx(self, "Copy Success")
        return

    def ReduceScalePic(self):
        self.zoom(1/1.1)
        return

    def AddScalePic(self):
        self.zoom(1.1)
        return

    def OpenPicture(self):
        try:
            filename = QFileDialog.getOpenFileName(self, "Open Image", ".", "Image Files(*.jpg *.png)")
            if filename and len(filename) >= 1:
                name = filename[0]
                if os.path.isfile(name):
                    f = open(name, "rb")
                    data = f.read()
                    f.close()
                    self.ShowImg(data)
        except Exception as ex:
            Log.Error(ex)
        return

    def StartWaifu2xPng(self):
        if self.StartWaifu2x("png"):
            self.format = "png"
            self.changeJpg.setEnabled(False)
            self.changePng.setEnabled(False)
        return

    def StartWaifu2xJPG(self):
        if self.StartWaifu2x("jpg"):
            self.format = "jpg"
            self.changeJpg.setEnabled(False)
            self.changePng.setEnabled(False)
        return

    def StartWaifu2x(self, format):
        if not self.data:
            return False
        if not config.CanWaifu2x:
            return False
        from waifu2x_vulkan import waifu2x_vulkan
        self.SetStatus(False)
        self.index = self.comboBox.currentIndex()
        index = self.comboBox.currentIndex()
        noise = int(self.noiseCombox.currentText())
        if index == 0:
            modelName = "CUNET"
        elif index == 1:
            modelName = "PHOTO"
        elif index == 2:
            modelName = "ANIME_STYLE_ART_RGB"
        else:
            return False
        if noise == -1:
            noiseName = "NO_NOISE"
        else:
            noiseName = "NOISE"+str(noise)
        if modelName == "CUNET" and self.scaleRadio.isChecked() and round(float(self.scaleEdit.text()), 1) <= 1:
            modelInsence = "MODEL_{}_NO_SCALE_{}".format(modelName, noiseName)
        else:
            modelInsence = "MODEL_{}_{}".format(modelName, noiseName)
        if self.ttaModel.isChecked():
            modelInsence += "_TTA"

        model = {
            "model":  getattr(waifu2x_vulkan, modelInsence),
        }
        if self.scaleRadio.isChecked():
            model['scale'] = round(float(self.scaleEdit.text()), 1)
        else:
            model['width'] = int(self.widthEdit.text())
            model['high'] = int(self.heighEdit.text())
        model['format'] = format
        self.backStatus = self.GetStatus()
        QtTask().AddConvertTask(self.data, model, self.AddConvertBack,
                                cleanFlag="QtImg")
        self.changeLabel.setText(self.tr("正在转换"))
        return True

    def AddConvertBack(self, data, waifuId, backParam, tick):
        if data:
            self.waifu2xData = data
            if self.checkBox.isChecked():
                self._ShowImg(data)
            self.changeLabel.setText(self.tr("已转换"))
            self.tickLabel.setText(str(round(tick, 3)) + "s")

        else:
            self.changeLabel.setText(self.tr("失败"))
        self.SetStatus(True)
        return

    def CheckHideButton(self):
        if self.format == "":
            self.changePng.setEnabled(True)
            self.changeJpg.setEnabled(True)
        elif self.format == "png":
            self.changePng.setEnabled(False)
            self.changeJpg.setEnabled(True)
        else:
            self.changePng.setEnabled(True)
            self.changeJpg.setEnabled(False)

    def SavePicture(self):
        data = self.waifu2xData if self.waifu2xData else self.data
        if not data:
            return
        try:
            today = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
            picFormat = self.format if self.format else "jpg"
            filepath = QFileDialog.getSaveFileName(self, "Save", "{}.{}".format(today, picFormat))
            if filepath and len(filepath) >= 1 and filepath[0]:
                name = filepath[0]
                f = open(name, "wb")
                f.write(data)
                f.close()
        except Exception as es:
            Log.Error(es)
        return

    def SwithPicture(self):
        if self.checkBox.isChecked() and self.waifu2xData:
            self._ShowImg(self.waifu2xData)
        else:
            self._ShowImg(self.data)
        return

    def ChangeModel(self, index):
        # self.index = self.comboBox.currentIndex()
        self.CheckScaleRadio()
        return

    def GetStatus(self):
        data = str(self.noiseCombox.currentText()) + \
            str(self.buttonGroup_2.checkedId()) + \
            str(self.scaleEdit.text()) + \
            str(self.heighEdit.text()) + \
            str(int(self.ttaModel.isChecked())) + \
            str(self.widthEdit.text()) + \
            str(self.comboBox.currentIndex())
        return data

    def SetStatus(self, status):
        self.scaleRadio.setEnabled(status)
        self.heighRadio.setEnabled(status)
        self.scaleEdit.setEnabled(status)
        self.widthEdit.setEnabled(status)
        self.heighEdit.setEnabled(status)
        self.noiseCombox.setEnabled(status)
        self.comboBox.setEnabled(status)
        # self.radioButton_4.setEnabled(status)
        # self.radioButton_5.setEnabled(status)
        # self.radioButton_6.setEnabled(status)
        # self.radioButton_7.setEnabled(status)
        # self.radioButton_8.setEnabled(status)
        # self.ttaModel.setEnabled(status)
        self.CheckScaleRadio()

    def SetEnable(self):
        self.SetStatus(True)

    def SetDisEnable(self):
        self.SetStatus(False)

    def CheckScaleRadio(self):
        if self.scaleRadio.isChecked() and self.scaleRadio.isEnabled():
            self.scaleEdit.setEnabled(True)
            self.widthEdit.setEnabled(False)
            self.heighEdit.setEnabled(False)
        elif self.heighRadio.isChecked() and self.heighRadio.isEnabled():
            self.scaleEdit.setEnabled(False)
            self.widthEdit.setEnabled(True)
            self.heighEdit.setEnabled(True)
        data = self.GetStatus()
        if self.backStatus != data:
            self.changePng.setEnabled(True)
            self.changeJpg.setEnabled(True)
        else:
            self.CheckHideButton()
Beispiel #28
0
    def __init__(self, start_state: GridGameState):
        super().__init__(start_state)
        self.start_state: GridGameState = start_state
        self.spaces = []  # self.spaces[i][j] holds row i, column j
        self.column_dividers = []
        self.row_dividers = []
        self.column_labels = []
        self.row_labels = []
        self.text_x = self.text_y = 0

        ui = self.ui = Ui_GridControls()
        ui.setupUi(self)
        scene = QGraphicsScene()
        ui.game_display.setScene(scene)
        scene.setBackgroundBrush(self.background_colour)
        self.player1_icon = self.create_icon(self.player1_colour)
        self.player2_icon = self.create_icon(self.player2_colour)
        ui.black_count_pixmap.setText('')
        ui.white_count_pixmap.setText('')
        ui.black_count.setText('')
        ui.white_count.setText('')

        for _ in range(start_state.board_height - 1):
            self.row_dividers.append(scene.addLine(0, 0, 1, 1))
        for _ in range(start_state.board_width - 1):
            self.column_dividers.append(scene.addLine(0, 0, 1, 1))
        for i in range(start_state.board_height):
            self.row_labels.append(scene.addSimpleText(f'{i + 1}'))
        for j in range(start_state.board_width):
            self.column_labels.append(scene.addSimpleText(chr(65 + j)))
        self.to_move = scene.addEllipse(0,
                                        0,
                                        1,
                                        1,
                                        brush=self.get_player_brush(
                                            self.start_state.X_PLAYER))
        self.to_move.setVisible(False)
        self.move_text = ui.move_text
        for i in range(self.start_state.board_height):
            row: typing.List[GraphicsPieceItem] = []
            self.spaces.append(row)
            for j in range(self.start_state.board_width):
                piece = GraphicsPieceItem(i, j, self)
                scene.addItem(piece)
                piece.setBrush(self.background_colour)
                piece.setPen(self.background_colour)
                row.append(piece)
        self.debug_message = ''
Beispiel #29
0
    def __init__(self):
        super(MainWindow, self).__init__()

        # Załadowanie layoutu [Modyfikować tylko w Designerze!]:
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Ustawienie kilku parametrów aplikacji
        self.setWindowTitle("Paint Application")
        self.setWindowIcon(QIcon("../Icons/main_icon.png"))
        self.ui.actionselect.setChecked(True)
        self.unsaved_changes = False

        # GraphicItemModel i listView
        self.gim = GraphicItemModel()
        self.ui.listView.setModel(self.gim)

        # Scena
        self.scene = QGraphicsScene()

        # Widok - utworzenie, połączenie z widokiem, dodanie do okienka aplikacji
        self.graphicsView = CustomQGraphicsView(self.scene,
                                                self.centralWidget(), self.gim)
        self.graphicsView.setObjectName(u"graphicsView")
        self.graphicsView.setMinimumSize(QSize(250, 250))
        self.ui.gridLayout.addWidget(self.graphicsView, 0, 0, 1, 1)

        # Dialogi:
        # PrePickerDialog - wyświetlanie dialogu przed wyborem koloru (dla brush lub pen)
        self.color_picker_decide = PrePickerDialog()
        # ColorDialog - wybór koloru, dialog wyświetlany po PrePickerDialog
        self.color_picker_dialog = QColorDialog()
        # UnsavedChangesDialog - wyświetalnie dialogu np. po "Quit" lub "New" gdy są niezapisane zmiany
        self.unsaved_changes_dialog = UnsavedChangesDialog()
        # AboutDialog - wyświetalnie dialogu z informacjami o aplikacji
        self.about_dialog = AboutDialog()
        # AboutDialog - wyświetalnie dialogu z informacjami o nawigacji
        self.navigation_dialog = NavigationDialog()

        # ItemsInputOutput - menadżer zapisu i odczytu plików zawierających figury
        self.reader_writer = ItemsInputOutput(self.scene)

        # Powiązanie sygnałów ze slotami
        self.ui.actionNew.triggered.connect(self.slot_menu_new)
        self.ui.actionExport.triggered.connect(self.slot_menu_export)
        self.ui.actionSave.triggered.connect(self.slot_menu_save)
        self.ui.actionOpen.triggered.connect(self.slot_menu_open)
        self.ui.actionQuit.triggered.connect(self.slot_menu_quit)
        self.ui.actionAbout.triggered.connect(self.slot_menu_about)
        self.ui.actionNavigation.triggered.connect(self.slot_menu_navigation)

        self.ui.actionselect.triggered.connect(self.slot_trigger_select)
        self.ui.actionrectangle.triggered.connect(self.slot_trigger_rectangle)
        self.ui.actiontriangle.triggered.connect(self.slot_trigger_triangle)
        self.ui.actionellipse.triggered.connect(self.slot_trigger_ellipse)
        self.ui.actionline.triggered.connect(self.slot_trigger_line)
        self.ui.actionpolygon.triggered.connect(self.slot_trigger_polygon)
        self.ui.actionpicker.triggered.connect(self.slot_trigger_picker)
        self.ui.actionWidth.triggered.connect(self.slot_trigger_line_width)

        self.ui.lineEdit.textEdited.connect(self.slot_text_edited)
        self.color_picker_dialog.colorSelected.connect(
            self.slot_color_selected)
        self.gim.renamed.connect(self.unsaved_changes_detected)
        self.graphicsView.changed.connect(self.unsaved_changes_detected)
Beispiel #30
0
class SpectrogramViewer(QtWidgets.QWidget, Ui_SpectrogramViewer):

    seek = QtCore.Signal(float)
    spectrogram_drawn = QtCore.Signal()

    def __init__(self, parent=None, audio=None, settings=None):
        super().__init__(parent)
        self.setupUi(self)
        self.bg_image = None
        self.spectrogram_scene = QGraphicsScene(self)

        self._audio = None
        self._spectrogram = None
        self._image_generator = None

        self.sound_marker = None
        self.marker_position = 0
        self.yscale = 1

        self.settings = settings

        self.audio = audio
        self.setup_graphics_view()
        self.define_shortcuts()
        self.install_filters()

    def setup_graphics_view(self):
        self.spectrogram_view.setScene(self.spectrogram_scene)

    def define_shortcuts(self):
        QtGui.QShortcut(
            QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_Plus), self,
            self.zoom_in)
        QtGui.QShortcut(
            QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_Minus),
            self,
            self.zoom_out,
        )

    def install_filters(self):
        self.mouse_filter = SpectrogramMouseFilter(self)
        self.spectrogram_scene.installEventFilter(self.mouse_filter)

    @property
    def audio(self):
        return self._audio

    @audio.setter
    def audio(self, audio):
        if audio is not None:
            self._audio = audio
            self.spectrogram = Spectrogram(audio, self.spectrogram_options)
            self.marker_position = 0

    @property
    def spectrogram(self):
        return self._spectrogram

    @spectrogram.setter
    def spectrogram(self, spectrogram):
        self._spectrogram = spectrogram
        self.display_spectrogram()

    @property
    def image_options(self):
        return self.settings.image_options if self.settings else {}

    @property
    def spectrogram_options(self):
        return self.settings.spectrogram_options if self.settings else {}

    @property
    def image_generator(self):
        if self._image_generator is None:
            self._image_generator = ImageGenerator(self.image_options)
        return self._image_generator

    def display_spectrogram(self):
        # TODO: save image somewhere
        im = self.image_generator.spec2img(self.spectrogram)
        # TODO: change events when checkbox is checked
        # if self.checkbox_draw_events.isChecked():
        #     im = self.draw_events(im, max_duration)
        img = ImageQt.ImageQt(im)
        pixmap = QtGui.QPixmap.fromImage(img)

        # Change Qt array to a Qt graphic
        self.bg_image = QGraphicsPixmapItem(pixmap)
        self.spectrogram_scene.clear()
        self.spectrogram_scene.addItem(self.bg_image)
        # Ensure spectrogram graphic is displayed as background
        self.bg_image.setZValue(-100)
        self.bg_image.setPos(0, 0)
        self.sound_marker = None
        if self.marker_position:
            self.update_sound_marker(None)
        self.spectrogram_drawn.emit()

    def display_text(self, text):
        text_item = QGraphicsTextItem()
        text_item.setPos(150, 100)
        text_item.setPlainText(text)
        self.spectrogram_scene.clear()
        self.spectrogram_scene.addItem(text_item)

    def update_sound_marker(self, position_sec):
        # 100 # multiply by step-size in SpecGen()
        if position_sec is not None:
            self.marker_position = self.image_generator.sec2pixels(
                position_sec)
        line = QtCore.QLineF(
            self.marker_position,
            0,
            self.marker_position,
            self.image_generator["height"],
        )
        if not self.sound_marker:
            penCol = QtGui.QColor()
            penCol.setRgb(255, 0, 0)
            self.sound_marker = self.spectrogram_scene.addLine(
                line, QtGui.QPen(penCol))
        else:
            self.sound_marker.setLine(line)

        self.spectrogram_scene.update()

        if self.spectrogram_options["follow_sound"]:
            self.center_view()

    def center_view(self):
        self.spectrogram_view.centerOn(self.marker_position,
                                       self.get_center().y())

    def zoom(self, scale, scene_pos=None):
        self.yscale *= scale
        self.spectrogram_view.scale(scale, scale)
        if scene_pos:
            self.spectrogram_view.centerOn(scene_pos)

    def zoom_in(self):
        self.zoom(1.5)

    def zoom_out(self):
        self.zoom(0.75)

    def seek_sound(self, pos):
        self.seek.emit(self.image_generator.pixels2sec(pos))

    def update_spectrogram(self, option, redraw):
        if redraw:
            self.spectrogram = Spectrogram(self.audio,
                                           self.spectrogram_options)
            self.freq2pixels(6000)

    def update_image(self, option, redraw):
        if redraw:
            self.display_spectrogram()

    def get_center(self):
        return self.spectrogram_view.mapToScene(
            self.spectrogram_view.viewport().rect().center())

    def clear_rects(self):
        items = self.spectrogram_scene.items()
        for item in items:
            if isinstance(item, AnnotatedRectItem):
                self.spectrogram_scene.removeItem(item)

    def freq2pixels(self, freq):
        res = 0
        if self.spectrogram["scale"] == "Linear":
            height = self.image_generator["height"]
            max_freq = self.audio.sr / 2
            freq_step = height / max_freq
            res = height - (freq * freq_step)
        else:
            print("Only linear scale is supported so far")

        return res

    def draw_annotation(self, opts):
        x1 = self.image_generator.sec2pixels(opts.get("start", 0))
        x2 = self.image_generator.sec2pixels(opts.get("end", 0))
        y1 = self.freq2pixels(opts.get("max_freq", 0))
        y2 = self.freq2pixels(opts.get("min_freq", 0))
        text = opts.get("text", "")
        buffer = opts.get("vertical_buffer", 1)
        top_offset = opts.get("top_offset", 0)
        bottom_offset = opts.get("bottom_offset", 0)

        if y2 - y1 <= 0:
            y1 = 0
            y2 = self.spectrogram_scene.height() - 2
            if buffer:
                v_offset = buffer * y2 / 100
                y1 += v_offset + top_offset
                y2 -= v_offset - bottom_offset
                if text:
                    font = QtGui.QFont(opts.get("text_font", ""),
                                       opts.get("text_fontsize", 12))
                    font_height = QtGui.QFontMetrics(font).height()
                    y1 += font_height

        coords = (x1, y1, x2 - x1, y2 - y1)

        opts["coords"] = coords

        rect = AnnotatedRectItem(opts)

        self.spectrogram_scene.addItem(rect)

    def draw_rect(self,
                  start,
                  end,
                  y=0,
                  height=-1,
                  color="#ffffff",
                  fill="",
                  buffer=1):
        x = self.image_generator.sec2pixels(start)
        width = self.image_generator.sec2pixels(end - start)
        if height == -1:
            height = self.spectrogram_scene.height() - 2
        rect = QtWidgets.QGraphicsRectItem()
        rect.setPen(QtGui.QPen(color))
        if fill is not None:
            if not fill:
                fill = color
            rect.setBrush(QtGui.QBrush(fill, QtCore.Qt.SolidPattern))
        if buffer:
            y += buffer * height / 100
            height -= buffer * height / 100
        rect.setRect(x, y, width, height)
        self.spectrogram_scene.addItem(rect)