Esempio n. 1
0
class SystemTrayIcon(QSystemTrayIcon):
    def __init__(self, parent):
        super(SystemTrayIcon, self).__init__()
        self.parent = parent

        self.new_folder_window = NewFolderWindow(parent)
        self.preferences_window = PreferencesWindow()

        self.setIcon(QIcon(":gridsync.png"))

        self.right_menu = RightClickMenu(self)
        self.setContextMenu(self.right_menu)
        self.activated.connect(self.on_click)

        self.animation = QMovie()
        self.animation.setFileName(":sync.gif")
        self.animation.updated.connect(self.update_animation_frame)
        self.animation.setCacheMode(True)

    def update_animation_frame(self):
        self.setIcon(QIcon(self.animation.currentPixmap()))

    def set_icon(self, resource):
        self.setIcon(QIcon(resource))

    def on_click(self, value):
        #self.right_menu.populate()
        if value == QSystemTrayIcon.Trigger:
            open_gridsync_folder()

    def on_quit(self):
        reactor.stop()
Esempio n. 2
0
class SystemTrayIcon(QSystemTrayIcon):
    def __init__(self, parent):
        super(SystemTrayIcon, self).__init__()
        self.parent = parent

        self.icon = QIcon(resource(settings['application']['tray_icon']))
        self.setIcon(self.icon)

        self.menu = Menu(self)
        self.setContextMenu(self.menu)
        self.activated.connect(self.on_click)

        self.animation = QMovie()
        self.animation.setFileName(
            resource(settings['application']['tray_icon_sync']))
        self.animation.updated.connect(self.update)
        self.animation.setCacheMode(True)

    def update(self):
        if self.parent.core.operations:
            self.animation.setPaused(False)
            self.setIcon(QIcon(self.animation.currentPixmap()))
        else:
            self.animation.setPaused(True)
            self.setIcon(self.icon)

    def on_click(self, value):
        if value == QSystemTrayIcon.Trigger and sys.platform != 'darwin':
            self.parent.show_main_window()
Esempio n. 3
0
class SystemTrayIcon(QSystemTrayIcon):
    def __init__(self, parent):
        super(SystemTrayIcon, self).__init__()
        self.parent = parent

        self.new_folder_window = NewFolderWindow(parent)
        self.preferences_window = PreferencesWindow()
        
        self.setIcon(QIcon(":gridsync.png"))

        self.right_menu = RightClickMenu(self)
        self.setContextMenu(self.right_menu)
        self.activated.connect(self.on_click)

        self.animation = QMovie()
        self.animation.setFileName(":sync.gif")
        self.animation.updated.connect(self.update_animation_frame)
        self.animation.setCacheMode(True)

    def update_animation_frame(self):
        self.setIcon(QIcon(self.animation.currentPixmap()))

    def set_icon(self, resource):
        self.setIcon(QIcon(resource))

    def on_click(self, value):
        #self.right_menu.populate()
        if value == QSystemTrayIcon.Trigger:
            open_gridsync_folder()

    def on_quit(self):
        reactor.stop()
Esempio n. 4
0
class MoviePlayer(QWidget):
    def __init__(self):
        super(MoviePlayer, self).__init__()

        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setWindowFlags(Qt.FramelessWindowHint)

        self.movie = QMovie(self)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignAbsolute)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)

        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.movieLabel)
        self.setLayout(self.mainLayout)

        #self.resize(400, 500)

        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName('icon/gears.gif')

        pos = kp.pos()

        x = pos.x() - ((self.width() / 2) - (kp.width() / 2)) + 220
        y = pos.y() - ((self.height() / 2) - (kp.height() / 2)) + 160

        self.setGeometry(x, y, 400, 500)

        self.movie.start()
Esempio n. 5
0
class MoviePlayer(QWidget):
    def __init__(self):
        super(MoviePlayer, self).__init__()

        self.setAttribute(Qt.WA_TranslucentBackground)        
        self.setWindowFlags(Qt.FramelessWindowHint)

        self.movie = QMovie(self)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignAbsolute)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)


        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.movieLabel)
        self.setLayout(self.mainLayout)
        
        #self.resize(400, 500)

        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName('icon/gears.gif')

        pos = kp.pos()

        x = pos.x() - ((self.width()/2) - (kp.width()/2)) +220
        y = pos.y() - ((self.height()/2) - (kp.height()/2)) +160
        
        self.setGeometry(x,y, 400, 500)

        self.movie.start()   
class EmailProgress(QWidget):
    #Shows a .gif while email is being sent.
    def __init__(self):
        super(EmailProgress, self).__init__()

        #Sets the background to invisible.
        self.setAttribute(Qt.WA_TranslucentBackground)
        #Gets rid of frame around window.
        self.setWindowFlags(Qt.FramelessWindowHint)

        #Create a movie object.
        self.movie = QMovie(self)

        #In case the gif is missing, display something, maybe.
        self.movieLabel = QLabel("No movie loaded")

        #I think there are some alignment issues here with this .gif, needs looked at, could
        #be a better way to do this.
        self.movieLabel.setAlignment(Qt.AlignAbsolute)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)

        #Could be a better way to do this with Qt Designer
        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.movieLabel)
        self.setLayout(self.mainLayout)

        self.resize(300, 300)

        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName('image/email_progress.gif')

        #Start aligning the .gif on the screen, always needs fudged, there is
        #probably a better way to do this.
        pos = fw.pos()

        x = (pos.x() - ((self.width() / 2) - (fw.width() / 2))) + 100
        y = (pos.y() - ((self.height() / 2) - (fw.height() / 2))) + 100

        self.setGeometry(x, y, 300, 300)
        #End aligning the .fig on the screen.

        #Start the .gif.
        self.movie.start()
Esempio n. 7
0
class SystemTrayIcon(QSystemTrayIcon):
    def __init__(self, gui):
        super(SystemTrayIcon, self).__init__()
        self.gui = gui

        tray_icon_path = resource(settings['application']['tray_icon'])
        self.app_pixmap = QPixmap(tray_icon_path)
        self.app_icon = QIcon(tray_icon_path)
        self.setIcon(self.app_icon)

        self.menu = Menu(self.gui)
        self.setContextMenu(self.menu)
        self.activated.connect(self.on_click)

        self.messageClicked.connect(self.gui.show_main_window)

        self.animation = QMovie()
        self.animation.setFileName(
            resource(settings['application']['tray_icon_sync']))
        self.animation.updated.connect(self.update)
        self.animation.setCacheMode(True)

    def update(self):
        if self.gui.core.operations:
            self.animation.setPaused(False)
            pixmap = self.animation.currentPixmap()
            if self.gui.unread_messages:
                pixmap = BadgedPixmap(
                    pixmap, len(self.gui.unread_messages), 0.6
                )
            self.setIcon(QIcon(pixmap))
        else:
            self.animation.setPaused(True)
            if self.gui.unread_messages:
                self.setIcon(QIcon(BadgedPixmap(
                    self.app_pixmap, len(self.gui.unread_messages), 0.6
                )))
            else:
                self.setIcon(self.app_icon)

    def on_click(self, value):
        if value == QSystemTrayIcon.Trigger and sys.platform != 'darwin':
            self.gui.show_main_window()
Esempio n. 8
0
    def setupWidget1(self):
        #setup the tree
        movie = QMovie()
        movie.setFileName("res/tree.gif")
        self.ui.lb_tree.setMovie(movie)
        self.ui.lb_tree_big.setMovie(movie)
        movie.start()

        #setup the statistics
        self.ui.gridLayout.setHorizontalSpacing(60)
        self.ui.gridLayout.setVerticalSpacing(10)
        self.ui.gridLayout.setGeometry(QRect(0, 51, 291, 224))
        self.ui.gridLayout.setAlignment(QtCore.Qt.AlignCenter)
        self.statLabels = []
        for i in range(7):
            self.statLabels.append([])
            for j in range(4):
                self.statLabels[i].append(QLabel())
                self.statLabels[i][j].setScaledContents(True)
                self.statLabels[i][j].setAutoFillBackground(False)
                self.statLabels[i][j].setAlignment(QtCore.Qt.AlignCenter)
                self.ui.gridLayout.addWidget(self.statLabels[i][j], i, j, 1, 1)
class MoviePlayer(QWidget):
    def __init__(self, parent=None):
        super(MoviePlayer, self).__init__(parent)

        self.movie = QMovie(self)
        self.movie.setCacheMode(QMovie.CacheAll)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignCenter)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.movieLabel.setBackgroundRole(QPalette.Dark)
        self.movieLabel.setAutoFillBackground(True)

        self.currentMovieDirectory = ''

        self.createControls()
        self.createButtons()

        self.movie.frameChanged.connect(self.updateFrameSlider)
        self.movie.stateChanged.connect(self.updateButtons)
        self.fitCheckBox.clicked.connect(self.fitToWindow)
        self.frameSlider.valueChanged.connect(self.goToFrame)
        self.speedSpinBox.valueChanged.connect(self.movie.setSpeed)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.movieLabel)
        mainLayout.addLayout(self.controlsLayout)
        mainLayout.addLayout(self.buttonsLayout)
        self.setLayout(mainLayout)

        self.updateFrameSlider()
        self.updateButtons()

        self.setWindowTitle("Movie Player")
        self.resize(400, 400)

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie",
                                                  self.currentMovieDirectory)

        if fileName:
            self.openFile(fileName)

    def openFile(self, fileName):
        self.currentMovieDirectory = QFileInfo(fileName).path()

        self.movie.stop()
        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName(fileName)
        self.movie.start()

        self.updateFrameSlider()
        self.updateButtons()

    def goToFrame(self, frame):
        self.movie.jumpToFrame(frame)

    def fitToWindow(self):
        self.movieLabel.setScaledContents(self.fitCheckBox.isChecked())

    def updateFrameSlider(self):
        hasFrames = (self.movie.currentFrameNumber() >= 0)

        if hasFrames:
            if self.movie.frameCount() > 0:
                self.frameSlider.setMaximum(self.movie.frameCount() - 1)
            elif self.movie.currentFrameNumber() > self.frameSlider.maximum():
                self.frameSlider.setMaximum(self.movie.currentFrameNumber())

            self.frameSlider.setValue(self.movie.currentFrameNumber())
        else:
            self.frameSlider.setMaximum(0)

        self.frameLabel.setEnabled(hasFrames)
        self.frameSlider.setEnabled(hasFrames)

    def updateButtons(self):
        state = self.movie.state()

        self.playButton.setEnabled(self.movie.isValid()
                                   and self.movie.frameCount() != 1
                                   and state == QMovie.NotRunning)
        self.pauseButton.setEnabled(state != QMovie.NotRunning)
        self.pauseButton.setChecked(state == QMovie.Paused)
        self.stopButton.setEnabled(state != QMovie.NotRunning)

    def createControls(self):
        self.fitCheckBox = QCheckBox("Fit to Window")

        self.frameLabel = QLabel("Current frame:")

        self.frameSlider = QSlider(Qt.Horizontal)
        self.frameSlider.setTickPosition(QSlider.TicksBelow)
        self.frameSlider.setTickInterval(10)

        speedLabel = QLabel("Speed:")

        self.speedSpinBox = QSpinBox()
        self.speedSpinBox.setRange(1, 9999)
        self.speedSpinBox.setValue(100)
        self.speedSpinBox.setSuffix("%")

        self.controlsLayout = QGridLayout()
        self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2)
        self.controlsLayout.addWidget(self.frameLabel, 1, 0)
        self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2)
        self.controlsLayout.addWidget(speedLabel, 2, 0)
        self.controlsLayout.addWidget(self.speedSpinBox, 2, 1)

    def createButtons(self):
        iconSize = QSize(36, 36)

        openButton = QToolButton()
        openButton.setIcon(self.style().standardIcon(
            QStyle.SP_DialogOpenButton))
        openButton.setIconSize(iconSize)
        openButton.setToolTip("Open File")
        openButton.clicked.connect(self.open)

        self.playButton = QToolButton()
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.setIconSize(iconSize)
        self.playButton.setToolTip("Play")
        self.playButton.clicked.connect(self.movie.start)

        self.pauseButton = QToolButton()
        self.pauseButton.setCheckable(True)
        self.pauseButton.setIcon(self.style().standardIcon(
            QStyle.SP_MediaPause))
        self.pauseButton.setIconSize(iconSize)
        self.pauseButton.setToolTip("Pause")
        self.pauseButton.clicked.connect(self.movie.setPaused)

        self.stopButton = QToolButton()
        self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.stopButton.setIconSize(iconSize)
        self.stopButton.setToolTip("Stop")
        self.stopButton.clicked.connect(self.movie.stop)

        quitButton = QToolButton()
        quitButton.setIcon(self.style().standardIcon(
            QStyle.SP_DialogCloseButton))
        quitButton.setIconSize(iconSize)
        quitButton.setToolTip("Quit")
        quitButton.clicked.connect(self.close)

        self.buttonsLayout = QHBoxLayout()
        self.buttonsLayout.addStretch()
        self.buttonsLayout.addWidget(openButton)
        self.buttonsLayout.addWidget(self.playButton)
        self.buttonsLayout.addWidget(self.pauseButton)
        self.buttonsLayout.addWidget(self.stopButton)
        self.buttonsLayout.addWidget(quitButton)
        self.buttonsLayout.addStretch()
Esempio n. 10
0
class App(QMainWindow):
    def __init__(self,
                 model_config=json.load(open('./model_util/config.json',
                                             "r"))):
        super().__init__()
        self.title = "Voice Conversion App"
        self.left = 0
        self.top = 0
        self.width = 800
        self.height = 800
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        #========================= some default setting =========================
        self.image_mapping = defaultdict(lambda: model_config["default_image"],
                                         model_config["speakers_image"])
        self.model_config = model_config

        self.central_widget = QWidget()
        self.layout = QHBoxLayout(self.central_widget)

        self.speaker_widget = display.SignalDisplayWidget(self, "Speaker")
        self.convert_widget = display.SignalDisplayWidget(self, "Convert")

        self.control_panel = QGroupBox("Control Panel")
        self.build_control_widget()  # will create self.control_widget
        #========================= start connect something ======================

        self.left_group = QGroupBox("Speaker")
        self.left_group_layout = QHBoxLayout(self.left_group)

        self.left_group_layout.addWidget(self.speaker_widget)
        self.left_group_layout.addWidget(self.control_widget)
        self.layout.addWidget(self.left_group)
        self.layout.addWidget(self.convert_widget)
        self.layout.addWidget(self.Movie_Label)

        self.control_items["Load"].clicked.connect(lambda: self.load_audio())
        self.control_items["Record"].clicked.connect(
            lambda: self.record_callback())

        self.setCentralWidget(self.central_widget)
        self.show()

    def build_control_widget(self):
        self.control_widget = QWidget()
        self.control_layout = QVBoxLayout()
        self.control_items = dict()
        CI = self.control_items

        # Label
        CI["Label_Sound"] = QLabel("==Sound==")
        # Push Buttons
        sound_button_names = ["Load", "Record"]
        for _name in sound_button_names:
            CI[_name] = QPushButton(_name, self)

        CI["Label_Model"] = QLabel("==Model==")
        CI["model_widget"] = self.construct_model_widget()

        for _, item in CI.items():
            self.control_layout.addWidget(item)
        self.control_layout.addStretch(1)
        self.control_widget.setLayout(self.control_layout)

    def record_callback(self):
        signal, sr = record.ui.record_dialog()
        self.set_audio(signal, sr)

    def load_audio(self):
        signal, sr = self.speaker_widget.load_audio()
        self.set_audio(signal, sr)

    def set_audio(self, signal, sr):
        self.speaker_widget.set_audio(signal, sr)
        self.model_widget.set_signal(signal, sr)

    def construct_model_widget(self):
        self.model_widget = model_helper.ModelDisplayWidget(
            self, self.model_config)

        but = self.model_widget.convert_button
        but.clicked.disconnect()
        but.clicked.connect(self.go_convert)

        combo_box = self.model_widget.trg_combo_box
        combo_box.currentIndexChanged.connect(self.change_target)
        self.movie = QMovie(self)
        self.Movie_Label = QLabel(self)
        self.Movie_Label.setMovie(self.movie)

        self.change_target()  # change target image

        return self.model_widget

    def go_convert(self):
        signal, sr = self.model_widget.go_convert()
        print(signal, sr)
        self.convert_widget.set_audio(signal, sr)

    def change_target(self):
        self.movie.setPaused(True)
        trg_name = self.model_widget.trg_combo_box.currentText()
        image_path = self.image_mapping[trg_name]
        self.movie.setFileName(image_path)
        self.movie.start()
Esempio n. 11
0
class BubbleImage(QLabel):
    """绘制背景气泡的控件"""
    border = 5
    trigon = 20
    lineLen = 40  # 每行的文字数量

    minH = 2 * trigon + 2 * border
    minW = 2 * trigon + 2 * border

    def __init__(self,
                 listItem,
                 listView,
                 img=DEFAULT_IMG,
                 lr=True,
                 maxWidth=50):  # 图片显示的最长宽度
        self.listItem = listItem
        self.listView = listView
        self.img = img
        super(BubbleImage, self).__init__()

        self.setMinimumWidth(self.minW)
        # self.setStyleSheet("QLabel:hover{background-color:rgba(210,240,250,255);}")#鼠标滑过的颜色设置,这样自定义的paintEvent绘图区域就被看穿了
        self.setState(False)  # 设置鼠标不进入状态,方便绘图区域的颜色更新

        self.lr = lr  # 标志绘制左还是右
        if self.lr:
            self.setContentsMargins(int(self.trigon * sqrt(3) / 2 + 3),
                                    self.border + 3, self.border + 3,
                                    self.border + 3)
        else:
            self.setContentsMargins(self.border + 3, self.border + 3,
                                    int(self.trigon * sqrt(3) / 2 + 3),
                                    self.border + 3)

        self.setScaledContents(True)
        if not os.path.exists(img):
            img = DEFAULT_IMG

        pic = QPixmap(img)
        self.wid = pic.size().width(
        ) if pic.size().width() < maxWidth else maxWidth
        nPic = pic.scaledToWidth(self.wid)  # 高度自动计算,以便保持比例
        self.setPixmap(nPic)

        if img.endswith('gif'):
            self.movie = QMovie(self)
            self.movie.setFileName(img)
            self.movie.setCacheMode(QMovie.CacheNone)
            self.movie.frameChanged.connect(self.animate)
            self.movie.start()

    @pyqtSlot(int)
    def animate(self, index):
        pic = self.movie.currentPixmap()
        nPic = pic.scaledToWidth(self.wid)
        self.setPixmap(nPic)

    def paintEvent(self, e):
        size = self.size()
        qp = QPainter()
        qp.begin(self)
        if self.lr:
            self.leftBubble(qp, size.width(), size.height())
        else:
            self.rightBubble(qp, size.width(), size.height())
        qp.end()
        super(BubbleImage, self).paintEvent(e)

    def leftBubble(self, qp, w, h):
        qp.setPen(self.colorLeftE)  # 设置画笔颜色,绘制的矩形边缘颜色
        qp.setBrush(self.colorLeftM)  # 设置红色的笔刷
        middle = h / 2
        shifty = self.trigon / 2
        shiftx = self.trigon * sqrt(3) / 2
        pL = QPolygonF()
        pL.append(QPointF(0, middle))  # 起始点
        pL.append(QPointF(shiftx, middle + shifty))  # 第二点
        pL.append(QPointF(shiftx, h - self.border))  # 第三点
        pL.append(QPointF(w - self.border, h - self.border))  # 第四点
        pL.append(QPointF(w - self.border, self.border))  # 第五点
        pL.append(QPointF(shiftx, self.border))  # 第六点
        pL.append(QPointF(shiftx, middle - shifty))  # 第七点
        qp.drawPolygon(pL)

    def rightBubble(self, qp, w, h):
        qp.setPen(self.colorRightE)  # 设置画笔颜色,绘制的矩形边缘颜色
        qp.setBrush(self.colorRightM)  # 设置红色的笔刷
        middle = h / 2
        shifty = self.trigon / 2
        shiftx = self.trigon * sqrt(3) / 2
        pL = QPolygonF()
        pL.append(QPointF(w, middle))  # 起始点
        pL.append(QPointF(w - shiftx, middle + shifty))  # 第二点
        pL.append(QPointF(w - shiftx, h - self.border))  # 第三点
        pL.append(QPointF(self.border, h - self.border))  # 第四点
        pL.append(QPointF(self.border, self.border))  # 第五点
        pL.append(QPointF(w - shiftx, self.border))  # 第六点
        pL.append(QPointF(w - shiftx, middle - shifty))  # 第七点
        qp.drawPolygon(pL)

    def setState(self, mouse):
        '''鼠标进入和鼠标出时需要显示不一样的效果,主要就是更新颜色变量,然后调用update更新重绘'''
        if mouse:  # 鼠标进入
            self.colorLeftM = QColor("#eaeaea")
            self.colorLeftE = QColor("#D6D6D6")
            self.colorRightM = QColor("#8FD648")
            self.colorRightE = QColor("#85AF65")
        else:
            self.colorLeftM = QColor("#fafafa")
            self.colorLeftE = QColor("#D6D6D6")
            self.colorRightM = QColor("#9FE658")
            self.colorRightE = QColor("#85AF65")
        self.update()  # 更新界面,不用执行也可以更新,但是不实时

    def enterEvent(self, e):
        # print 'mouse entered'
        self.setState(True)

    def leaveEvent(self, e):
        # print 'mouse leaved'
        self.setState(False)

    def contextMenuEvent(self, e):
        ''' 右键菜单实现文本的复制和控件的删除'''
        editUser = QAction(QIcon('icons/copy.png'), u'复制',
                           self)  # 第一个参数也可以给一个QIcon图标
        editUser.triggered.connect(self.copyImage)

        delUser = QAction(QIcon('icons/delete.png'), u'删除', self)
        delUser.triggered.connect(self.delTextItem)  # 选中就会触发

        menu = QMenu()
        menu.addAction(editUser)
        menu.addAction(delUser)
        menu.exec_(QCursor.pos())  # 全局位置比较好,使用e.pos()还得转换

        e.accept()  # 禁止弹出菜单事件传递到父控件中

    def copyImage(self, b):
        # print 'msg copyed'
        cb = QApplication.clipboard()
        cb.setImage(QImage(self.img))

    def delTextItem(self, b):
        # print 'msg deleted'
        self.listView.takeItem(
            self.listView.indexFromItem(self.listItem).row())
Esempio n. 12
0
class ImageView(QScrollArea):
    imageLoaded = pyqtSignal(IPFSPath, MIMEType)

    qrCodesPresent = pyqtSignal(list)

    def __init__(self, parent=None):
        super(ImageView, self).__init__(parent)

        self.app = QApplication.instance()
        self.image = QImage()

        self.clip = QMovie(self)
        self.clipFirstPixmap = None
        self.clipCurrentPixmap = None

        self.currentImgPath = None
        self.setObjectName('ImageView')

        self.qrDecoder = IPFSQrDecoder()
        self.labelImage = QLabel()
        self.setAlignment(Qt.AlignCenter)
        self.labelImage.setAlignment(Qt.AlignCenter)

        self.setBackgroundRole(QPalette.Dark)
        self.labelImage.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.labelImage.setScaledContents(True)
        self.scaleFactor = 1.0
        self.setWidget(self.labelImage)

    def wheelEvent(self, event):
        """
        Zoom in/out on the image on mouse wheel events
        """

        degrees = event.angleDelta()

        if degrees.y() == 0:
            return

        yDeg = max(min(60, abs(degrees.y())), 240)

        if degrees.y() > 0:
            factor = 1 + ((yDeg / 30) * 0.05)
            self.zoomIn(factor=factor)
        elif degrees.y() < 0:
            factor = 1 - ((yDeg / 30) * 0.05)
            self.zoomOut(factor=factor)

        event.accept()

    def pinImage(self):
        if self.currentImgPath and self.currentImgPath.valid:
            ensure(self.pinImageFromPath(self.currentImgPath))

    @ipfsOp
    async def pinImageFromPath(self, ipfsop, imgPath):
        await ipfsop.ctx.pin(str(imgPath))

    def fitWindow(self, fit):
        self.setWidgetResizable(fit)

        if not fit:
            self.scaleFactor = 1.0
            self.resizePixmap()

    def zoomOut(self, factor=0.75):
        self.scaleFactor *= factor
        self.resizePixmap()

    def zoomIn(self, factor=1.25):
        self.scaleFactor *= factor
        self.resizePixmap()

    def zoomInClicked(self):
        self.zoomIn()

    def zoomOutClicked(self):
        self.zoomOut()

    def resizePixmap(self):
        if self.labelImage.movie() and self.clipFirstPixmap:
            self.labelImage.resize(self.scaleFactor *
                                   self.clipFirstPixmap.size())
            return

        pixmap = self.labelImage.pixmap()

        if pixmap == 0 or pixmap is None:
            return

        self.labelImage.resize(self.scaleFactor * pixmap.size())

    @ipfsOp
    async def showImage(self, ipfsop, imgPath, fromBlock=False, timeout=10):
        try:
            if fromBlock is True:
                imgData = await ipfsop.waitFor(
                    ipfsop.client.block.get(imgPath), timeout)
            else:
                imgData = await ipfsop.waitFor(ipfsop.catObject(imgPath),
                                               timeout)

            if not imgData:
                raise Exception('Failed to load image')

            mimeType, statInfo = await self.app.rscAnalyzer(IPFSPath(imgPath))

            if mimeType is None:
                raise Exception('Failed to load image')

            stat = StatInfo(statInfo)

            if mimeType.isAnimation:
                fp = self.app.tempDir.filePath(stat.cid)
                tmpFile = QFile(fp)

                if not tmpFile.exists() and tmpFile.open(QFile.ReadWrite):
                    tmpFile.write(imgData)
                    tmpFile.close()

                self.clip.stop()
                self.clip.setFileName(fp)
                self.labelImage.setMovie(self.clip)
                self.clip.frameChanged.connect(self.onMovieFrameChanged)
                self.clip.start()
                self.labelImage.adjustSize()
            else:
                img = QImage()
                img.loadFromData(imgData)
                self.image = img

                self.labelImage.setPixmap(QPixmap.fromImage(self.image))
                self.labelImage.adjustSize()
                self.resizePixmap()

                if self.qrDecoder:
                    # See if we have any QR codes in the image
                    urls = self.qrDecoder.decode(imgData)
                    if urls:
                        self.qrCodesPresent.emit(urls)

            self.labelImage.adjustSize()
            self.currentImgPath = IPFSPath(imgPath)
            self.imageLoaded.emit(self.currentImgPath, mimeType)

        except Exception:
            logUser.debug('Failed to load image: {path}'.format(path=imgPath))
            messageBox(iImageCannotLoad(imgPath))

    def onMovieFrameChanged(self, num):
        self.clipCurrentPixmap = self.clip.currentPixmap()

        if self.clipFirstPixmap is None:
            self.clipFirstPixmap = self.clipCurrentPixmap

    def onMovieError(self, err):
        logUser.info(f'{self.clip.fileName()}: {self.clip.lastErrorString()}')
Esempio n. 13
0
class MoviePlayer(QWidget):
    def __init__(self, parent=None):
        super(MoviePlayer, self).__init__(parent)

        self.movie = QMovie(self)
        self.movie.setCacheMode(QMovie.CacheAll)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignCenter)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.movieLabel.setBackgroundRole(QPalette.Dark)
        self.movieLabel.setAutoFillBackground(True)

        self.currentMovieDirectory = ''

        self.createControls()
        self.createButtons()

        self.movie.frameChanged.connect(self.updateFrameSlider)
        self.movie.stateChanged.connect(self.updateButtons)
        self.fitCheckBox.clicked.connect(self.fitToWindow)
        self.frameSlider.valueChanged.connect(self.goToFrame)
        self.speedSpinBox.valueChanged.connect(self.movie.setSpeed)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.movieLabel)
        mainLayout.addLayout(self.controlsLayout)
        mainLayout.addLayout(self.buttonsLayout)
        self.setLayout(mainLayout)

        self.updateFrameSlider()
        self.updateButtons()

        self.setWindowTitle("Movie Player")
        self.resize(400, 400)

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie",
                self.currentMovieDirectory)

        if fileName:
            self.openFile(fileName)

    def openFile(self, fileName):
        self.currentMovieDirectory = QFileInfo(fileName).path()

        self.movie.stop()
        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName(fileName)
        self.movie.start()

        self.updateFrameSlider();
        self.updateButtons();

    def goToFrame(self, frame):
        self.movie.jumpToFrame(frame)

    def fitToWindow(self):
        self.movieLabel.setScaledContents(self.fitCheckBox.isChecked())

    def updateFrameSlider(self):
        hasFrames = (self.movie.currentFrameNumber() >= 0)

        if hasFrames:
            if self.movie.frameCount() > 0:
                self.frameSlider.setMaximum(self.movie.frameCount() - 1)
            elif self.movie.currentFrameNumber() > self.frameSlider.maximum():
                self.frameSlider.setMaximum(self.movie.currentFrameNumber())

            self.frameSlider.setValue(self.movie.currentFrameNumber())
        else:
            self.frameSlider.setMaximum(0)

        self.frameLabel.setEnabled(hasFrames)
        self.frameSlider.setEnabled(hasFrames)

    def updateButtons(self):
        state = self.movie.state()

        self.playButton.setEnabled(self.movie.isValid() and
                self.movie.frameCount() != 1 and state == QMovie.NotRunning)
        self.pauseButton.setEnabled(state != QMovie.NotRunning)
        self.pauseButton.setChecked(state == QMovie.Paused)
        self.stopButton.setEnabled(state != QMovie.NotRunning)

    def createControls(self):
        self.fitCheckBox = QCheckBox("Fit to Window")

        self.frameLabel = QLabel("Current frame:")

        self.frameSlider = QSlider(Qt.Horizontal)
        self.frameSlider.setTickPosition(QSlider.TicksBelow)
        self.frameSlider.setTickInterval(10)

        speedLabel = QLabel("Speed:")

        self.speedSpinBox = QSpinBox()
        self.speedSpinBox.setRange(1, 9999)
        self.speedSpinBox.setValue(100)
        self.speedSpinBox.setSuffix("%")

        self.controlsLayout = QGridLayout()
        self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2)
        self.controlsLayout.addWidget(self.frameLabel, 1, 0)
        self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2)
        self.controlsLayout.addWidget(speedLabel, 2, 0)
        self.controlsLayout.addWidget(self.speedSpinBox, 2, 1)

    def createButtons(self):
        iconSize = QSize(36, 36)

        openButton = QToolButton()
        openButton.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton))
        openButton.setIconSize(iconSize)
        openButton.setToolTip("Open File")
        openButton.clicked.connect(self.open)

        self.playButton = QToolButton()
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.setIconSize(iconSize)
        self.playButton.setToolTip("Play")
        self.playButton.clicked.connect(self.movie.start)

        self.pauseButton = QToolButton()
        self.pauseButton.setCheckable(True)
        self.pauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
        self.pauseButton.setIconSize(iconSize)
        self.pauseButton.setToolTip("Pause")
        self.pauseButton.clicked.connect(self.movie.setPaused)

        self.stopButton = QToolButton()
        self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.stopButton.setIconSize(iconSize)
        self.stopButton.setToolTip("Stop")
        self.stopButton.clicked.connect(self.movie.stop)

        quitButton = QToolButton()
        quitButton.setIcon(self.style().standardIcon(QStyle.SP_DialogCloseButton))
        quitButton.setIconSize(iconSize)
        quitButton.setToolTip("Quit")
        quitButton.clicked.connect(self.close)

        self.buttonsLayout = QHBoxLayout()
        self.buttonsLayout.addStretch()
        self.buttonsLayout.addWidget(openButton)
        self.buttonsLayout.addWidget(self.playButton)
        self.buttonsLayout.addWidget(self.pauseButton)
        self.buttonsLayout.addWidget(self.stopButton)
        self.buttonsLayout.addWidget(quitButton)
        self.buttonsLayout.addStretch()
Esempio n. 14
0
class Demo3(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        self.setWindowTitle('show_gif')
        self.setWindowIcon(QIcon('image/Capture_64px.png'))
        self.setWindowFlags(self.windowFlags() | Qt.WindowMinMaxButtonsHint)
        # self.resize(400,400)
        self.setFixedSize(800, 600)
        mainl = QVBoxLayout(self)
        self.labelShow = QLabel()
        self.labelShow.setContentsMargins(0, 0, 0, 0)
        pat = self.labelShow.palette()
        pat.setBrush(QPalette.Background, Qt.darkGray)
        self.labelShow.setAutoFillBackground(True)
        self.labelShow.setPalette(pat)
        self.labelShow.setAlignment(Qt.AlignCenter)
        # self.labelShow.setScaledContents(True)
        mainl.addWidget(self.labelShow, 1)
        line = QFrame()
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        mainl.addWidget(line)
        btnLay = QHBoxLayout()

        frmLay = QFormLayout()
        self._spinBox = QSpinBox()
        frmLay.addRow('跳转:', self._spinBox)
        btnGo = QPushButton('Go', self)

        btnPrev = QPushButton('上一张', self)
        self.btnNext = QPushButton('下一张', self)
        btnPrev.clicked.connect(self.on_prev)
        self.btnNext.clicked.connect(self.on_next)
        btnGo.clicked.connect(lambda: self.flashMovie(self._spinBox.value()))
        self._spinBox.valueChanged.connect(lambda n: self.flashMovie(n))
        btnLay.addStretch()
        btnLay.addLayout(frmLay)
        btnLay.addWidget(btnGo)
        btnLay.addWidget(btnPrev)
        btnLay.addWidget(self.btnNext)
        btnLay.addStretch()
        mainl.addLayout(btnLay)

        labLay = QHBoxLayout()
        labLay.setSpacing(10)
        self._label = QLabel()
        frm1 = QFormLayout()
        frm1.addRow('共:', self._label)
        frm1.setRowWrapPolicy(QFormLayout.WrapLongRows)
        labLay.addStretch()
        labLay.addLayout(frm1)
        frm1 = QFormLayout()
        self._labInfo = QLabel()
        # self._labInfo.setWordWrap(True)
        frm1.addRow('当前:', self._labInfo)
        # frm1.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
        frm1.setRowWrapPolicy(QFormLayout.WrapLongRows)
        labLay.addLayout(frm1)
        frm1 = QFormLayout()
        self._labPlay = QLabel()
        frm1.addRow('播放帧号:', self._labPlay)
        labLay.addLayout(frm1)
        frm1.setRowWrapPolicy(QFormLayout.WrapLongRows)

        labLay.addStretch()
        labLay.setSpacing(10)
        line = QFrame()
        line.setFrameShape(QFrame.HLine)
        line.setFrameShadow(QFrame.Sunken)
        mainl.addWidget(line)
        mainl.addLayout(labLay)
        self._gifs = []
        self._movie = QMovie()
        self.labelShow.setMovie(self._movie)
        QTimer.singleShot(0, self.on_firstShow)
        self._picIndex = 0
        self._movie.frameChanged.connect(self.on_frameChange)
        # self._movie.finished.connect(lambda:self.btnNext.clicked.emit())

    def on_frameChange(self, n):
        self._labPlay.setText(' {} 帧'.format(n))
        if n + 1 == self._movie.frameCount():
            self.btnNext.clicked.emit()

    def on_firstShow(self):
        dir = r'E:\jiandanspider\pic'
        for i in os.listdir(dir):
            # print(os.path.isfile(i),i.lower(),i.lower().endswith('gif'))
            fullPath = os.path.join(dir, i)
            if os.path.isfile(fullPath) and i.lower().endswith('gif'):
                self._gifs.append(fullPath)

        self._spinBox.setMaximum(len(self._gifs))
        self._label.setText('%03d条记录' % len(self._gifs))
        if len(self._gifs) > 0:
            self._movie.setFileName(self._gifs[0])
            self._movie.start()
            self._labInfo.setText('{},{}帧\n{}'.format(
                os.path.split(self._movie.fileName())[1],
                self._movie.frameCount(), self._movie.frameRect()))

    def flashMovie(self, index):

        if index >= len(self._gifs):
            return
        self._movie.stop()
        self._movie.setFileName(self._gifs[index])
        self._movie.start()

        self._spinBox.valueChanged.disconnect()
        self._spinBox.setValue(index)
        self._labInfo.setText('{},{}帧\n{}'.format(
            os.path.split(self._movie.fileName())[1], self._movie.frameCount(),
            self._movie.frameRect()))
        self._spinBox.valueChanged.connect(lambda n: self.flashMovie(n))
        self._picIndex = index

    def on_next(self):
        self._picIndex += 1
        if self._picIndex >= len(self._gifs):
            self._picIndex = len(self._gifs) - 1
        self.flashMovie(self._picIndex)

    def on_prev(self):
        self._picIndex -= 1
        if self._picIndex < 0:
            self._picIndex = 0
        self.flashMovie(self._picIndex)