def show_slides(self): try: i, img_object = self._result.get(True, 5) if isinstance(img_object, QMediaContent): self.MediaPlayer.setMedia(img_object) except Empty: self.timer.stop() return while i != self._next: self._result.put((i, img_object), False) i, img_object = self._result.get() if isinstance(img_object, QMediaContent): self.MediaPlayer.setMedia(img_object) if isinstance(img_object, QMediaContent): # If a movie # self.MediaPlayer.setMedia(img_object) self.layout.setCurrentWidget(self.VideoWidget) self.MediaPlayer.play() elif isinstance(img_object, QMovie): # If a gif size = img_object.scaledSize() img_object = QMovie(img_object.fileName()) img_object.setCacheMode(QMovie.CacheAll) self._gif = img_object img_object.frameChanged.connect(self.gif_frame_changed) self.SlideShowWidget.setMovie(img_object) size.scale(self.SlideShowWidget.size(), Qt.KeepAspectRatio) img_object.setScaledSize(size) img_object.setSpeed(int(self.rate * 100)) self.layout.setCurrentWidget(self.SlideShowWidget) # self.change_playspeed(self.rate) img_object.start() else: # If a picture # print(img_object.size()) self.SlideShowWidget.setPixmap( img_object.scaled(self.SlideShowWidget.size(), Qt.KeepAspectRatio)) self.timer.start(self.delay / self.rate) self.layout.setCurrentWidget(self.SlideShowWidget) self._next += 1 self.threading(self.maxqsize - self._result.qsize())
class SlideshowMediaWindow(QDialog): def __init__(self, parent, area=None, *args, **kwargs): "parent: parent widget" "area: top-left-x(to screen), top-left-y(to screen), width, height" super(SlideshowMediaWindow, self).__init__(parent, *args, **kwargs) self.setWindowTitle("Slideshow External Media Window") sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.setSizePolicy(sizePolicy) self.setAttribute(Qt.WA_DeleteOnClose, on=True) self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint) self.setSizeGripEnabled(True) self.layout = QVBoxLayout() self.media_container = QLabel(self) self.media_container.setAttribute(Qt.WA_NativeWindow, on=True) # self.media_container.setFrameShape(QFrame.NoFrame) sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) sizePolicy.setHeightForWidth( self.media_container.sizePolicy().hasHeightForWidth()) self.media_container.setSizePolicy(sizePolicy) self.media_container.setAlignment(Qt.AlignCenter) self.media_container.setStyleSheet("background-color: black;") self.layout.addWidget(self.media_container) self.layout.setContentsMargins(1, 1, 1, 1) self.setLayout(self.layout) self.area = area if any(area): self.resize(area[2], area[3]) self.move(area[0], area[1]) else: self.resize(400, 300) self.mouse_pos = [0, 0] self.allow_resize_mouse_press = False self.pic_image = None self.media_container.setScaledContents(False) self.media_container.original_resizeEvent = self.media_container.resizeEvent def media_container_resizeEvent(event): if self.pic_image and isinstance(self.pic_image, QPixmap): if self.pic_image.width() > self.media_container.width() - 2 \ and self.pic_image.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.width() target_height = self.pic_image.height() scaled_image = self.pic_image.scaled( target_width, target_height, aspectRatioMode=Qt.KeepAspectRatio, transformMode=Qt.FastTransformation) self.media_container.setPixmap(scaled_image) elif self.pic_image and isinstance(self.pic_image, QMovie): if self.pic_image.original_size.width() > self.media_container.width() - 2 \ and self.pic_image.original_size.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.original_size.width() target_height = self.pic_image.original_size.height() scaled_size = self.pic_image.original_size.scaled( target_width, target_height, Qt.KeepAspectRatio) self.pic_image.setScaledSize(scaled_size) else: self.media_container.original_resizeEvent(event) self.media_container.resizeEvent = media_container_resizeEvent self.show() self.last_media_path = "" self.media_show_completed_notice = None # this should be a function to be called like self.stop_media_show() self.stop_media_show = lambda: None self.gif_completed_notice = threading.Event() def show_video(self, path): self.stop_media_show() self.media_container.clear() # some say the winId change all the time...so... mplayer_extended.setup(int(self.media_container.winId())) self.media_show_completed_notice = mplayer_extended.play(path) logger.debug("ext-media-win showed video: %s" % path) self.last_media_path = path self.stop_media_show = mplayer_extended.stop def show_pic(self, path): self.stop_media_show() self.media_container.clear() if not path.lower().endswith(".gif"): self.pic_image = QPixmap(path) if self.pic_image.width() > self.media_container.width() - 2 \ and self.pic_image.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.width() target_height = self.pic_image.height() scaled_image = self.pic_image.scaled( target_width, target_height, aspectRatioMode=Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation) self.media_container.setPixmap(scaled_image) logger.debug("ext-media-win showed pic: %s" % path) self.stop_media_show = lambda: None self.media_show_completed_notice = None else: self.last_media_path = path self.pic_image = QMovie(path, QByteArray(), self) if not self.pic_image.isValid(): self.media_show_completed_notice = None return self.pic_image.setCacheMode(QMovie.CacheAll) self.pic_image.jumpToNextFrame() self.pic_image.original_size = self.pic_image.currentPixmap().size( ) if self.pic_image.original_size.width() > self.media_container.width() - 2 \ and self.pic_image.original_size.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.original_size.width() target_height = self.pic_image.original_size.height() scaled_size = self.pic_image.original_size.scaled( target_width, target_height, Qt.KeepAspectRatio) self.pic_image.setScaledSize(scaled_size) self.pic_image.setSpeed(100) self.media_container.setMovie(self.pic_image) self.media_show_completed_notice = self.gif_completed_notice self.media_show_completed_notice.clear() def frameChanged_Handler(frameNumber): if frameNumber >= self.pic_image.frameCount() - 1: self.pic_image.stop() self.media_show_completed_notice.set() self.pic_image.frameChanged.connect(frameChanged_Handler) self.pic_image.start() logger.debug("ext-media-win showed gif: %s" % path) def stop_gif(): try: self.pic_image.stop() self.media_show_completed_notice.set() except Exception: pass self.stop_media_show = stop_gif def contextMenuEvent(self, event): m = QMenu(self) item = m.addAction("Stop Media") item.triggered.connect(self.stop_media_show) item = m.addAction("Exit Media Window") item.triggered.connect(self.close) m.popup(QCursor.pos()) def mousePressEvent(self, event): self.mouse_pos[0] = event.x() self.mouse_pos[1] = event.y() if event.globalX() < self.x() + self.frameGeometry().width() - 20 \ or event.globalY() < self.y() + self.frameGeometry().height() - 20: self.allow_resize_mouse_press = True else: self.allow_resize_mouse_press = True super().mousePressEvent(event) def mouseReleaseEvent(self, event): self.allow_resize_mouse_press = False super().mouseReleaseEvent(event) def mouseMoveEvent(self, event): if self.allow_resize_mouse_press: self.move(event.globalX() - self.mouse_pos[0], event.globalY() - self.mouse_pos[1]) super().mouseMoveEvent(event) def mouseDoubleClickEvent(self, event): self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) super().mouseDoubleClickEvent(event) def keyPressEvent(self, event): if event.key() == Qt.Key_F11: self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) else: super().keyPressEvent(event) def closeEvent(self, event): self.stop_media_show() self.area[0] = self.x() self.area[1] = self.y() self.area[2] = self.width() self.area[3] = self.height() event.accept()