Exemple #1
0
    def load(self, source):
        """Load anything that QImageReader or QMovie constructors accept"""

        # Use QImageReader to identify animated GIFs for separate handling
        # (Thanks to https://stackoverflow.com/a/20674469/435253 for this)
        image_reader = QImageReader(source)
        from PyQt5.QtGui import QImageIOHandler
        if image_reader.supportsAnimation() and image_reader.imageCount() > 1:
            movie = QMovie(source)

            # Calculate the aspect ratio and adjust the widget size
            movie.jumpToFrame(0)
            movie_size = movie.currentImage().size()
            self.movie_aspect = movie_size.width() / movie_size.height()
            self.resizeEvent()

            self.label.setMovie(movie)
            movie.start()

            # Free memory if the previous image was non-animated
            self.orig_pixmap = None
        else:
            self.orig_pixmap = QPixmap(image_reader.read())
            self.label.setPixmap(self.orig_pixmap)

            # Fail quickly if our violated invariants result in stale
            # aspect-ratio information getting reused
            self.movie_aspect = None

        # Keep the image from preventing downscaling
        self.setMinimumSize(1, 1)
Exemple #2
0
 def _load_movie(self, movie: QMovie, reload_only: bool) -> None:
     """Load new movie into the graphics scene."""
     movie.jumpToFrame(0)
     if api.settings.image.autoplay.value:
         movie.start()
     widget = QLabel()
     widget.setMovie(movie)
     self._update_scene(widget, QRectF(movie.currentPixmap().rect()),
                        reload_only)
Exemple #3
0
class IntroOverlay(_OverlayWidget):
    opaque_timer = QtCore.QTimer()
    opaque_timer.setSingleShot(True)

    finished_signal = QtCore.pyqtSignal()

    def __init__(self, parent):
        super(IntroOverlay, self).__init__(parent)
        self.parent = parent

        self.intro_mov = QMovie(':/anim/Introduction.gif')
        self.intro_mov.setCacheMode(QMovie.CacheAll)
        self.intro_mov.finished.connect(self.finished)
        self.opaque_timer.timeout.connect(self.set_opaque_for_mouse_events)

        self.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj is None or event is None:
            return False

        if obj is self:
            if event.type() == QtCore.QEvent.MouseButtonPress:
                self.mouse_click()
                return True

        return False

    def set_opaque_for_mouse_events(self):
        self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, False)

    def intro(self):
        LOGGER.info('Playing introduction in %sx %sy %spx %spx',
                    self.parent.rect().x(), self.parent.rect().y(),
                    self.parent.rect().width(), self.parent.rect().height())

        self.movie_screen.setMovie(self.intro_mov)
        self.movie_screen.setGeometry(self.parent.rect())
        self._updateParent()
        self.opaque_timer.start(1000)
        self.movie_screen.show()
        self.show()

        self.intro_mov.jumpToFrame(0)
        self.intro_mov.start()

    def mouse_click(self):
        self.intro_mov.stop()
        self.finished()

    def finished(self):
        self.movie_screen.hide()
        self.hide()
        self.finished_signal.emit()
Exemple #4
0
class _Loading(QSplashScreen):
    """A splashscreen to show while loading TensorFlow."""
    def __init__(self):
        """Class constructor. Loads a gif to show while loading."""
        path = os.path.join('res', 'loading', 'loading.gif')
        self._gif = QMovie(path)
        self._gif.jumpToFrame(0)
        super().__init__(self._gif.currentPixmap(), Qt.WindowStaysOnTopHint)
        self.showMessage('Loading, please wait...', color=Qt.yellow)
        self._gif.frameChanged.connect(self._update)
        self.setFixedSize(self.pixmap().size())
        self._gif.start()
        self.show()

    def mousePressEvent(self, event: QMouseEvent):
        """Override the method so the splashscreen won't go away by clicking."""

    def _update(self):
        self.setPixmap(self._gif.currentPixmap())
Exemple #5
0
class Pomodoro():
    def __init__(self):
        self.timer = 0
        self.progress_value = 0
        self.running = False
        self.cycles = 0
        self.state = STATE.WORK
        self.beep = AudioSegment.from_mp3("pomodoro.mp3")

    def swap_state(self):
        if self.state == STATE.WORK:
            self.state = STATE.PAUSE
        else:
            self.state = STATE.WORK
            self.cycles += 1
            self.set_cycles()

    def swap(self):
        self.swap_state()
        self.state_label.setText(STATE_LABELS[self.state])
        self.timer = 0
        play(self.beep)

    def reset(self):
        self.timer = 0
        self.change_progress_bar()
        self.change_time_label()

    def toggle(self):
        if self.running:
            self.toggle_button.setText('Play')
            self.running = False
            self.loop_stopper.set()
            self.movie.stop()
        else:
            self.toggle_button.setText('Pause')
            self.running = True
            self.run()
            self.movie.start()

    def set_cycles(self):
        self.cycles_label.setText('{} cycles'.format(self.cycles))

    def run(self):
        self.loop_stopper = threading.Event()
        self.window.loop_stopper = self.loop_stopper
        self.loop = threading.Thread(target=self.clock_loop,
                                     args=(self.loop_stopper, ))
        self.loop.start()

    def change_progress_bar(self):
        new_progress_value = int(self.timer / CYCLE_LENGTHS[self.state] * 100)
        if new_progress_value != self.progress_value:
            self.progress_value = new_progress_value
            self.progress.setValue(self.progress_value)

    def change_time_label(self):
        mins = self.timer // 60
        secs = self.timer - mins * 60
        total_mins = CYCLE_LENGTHS[self.state] // 60
        total_secs = CYCLE_LENGTHS[self.state] - total_mins * 60
        new_time_label = "{:02d}:{:02d} / {:02d}:{:02d}".format(
            mins, secs, total_mins, total_secs)
        self.time_label.setText(new_time_label)

    def clock_loop(self, stopper):
        while not stopper.isSet():
            self.timer += 1
            self.change_progress_bar()
            self.change_time_label()
            if self.timer == CYCLE_LENGTHS[self.state]:
                self.swap()
            time.sleep(1)

    def exec(self):
        self.app = QApplication([])

        # button font
        button_font = QtGui.QFont("Sans", 13, QtGui.QFont.Bold)

        # toggle button
        self.toggle_button = QPushButton('Start')
        self.toggle_button.setCheckable(True)
        self.toggle_button.clicked.connect(self.toggle)
        self.toggle_button.setFont(button_font)

        # reset button
        self.reset_button = QPushButton('Reset')
        self.reset_button.clicked.connect(self.reset)
        self.reset_button.setFont(button_font)

        # progress label
        self.progress_label = QLabel()
        self.movie = QMovie("spinner.gif")
        self.progress_label.setMovie(self.movie)
        self.progress_label.setSizePolicy(QSizePolicy.Expanding,
                                          QSizePolicy.Expanding)
        self.progress_label.setAlignment(Qt.AlignCenter)

        # label
        self.label = QLabel('Pomodoro timer')
        self.pixmap = QPixmap('pomodoro.png')
        self.label.setPixmap(self.pixmap)

        # time label
        self.time_label = QLabel('00:00 / 25:00')
        self.time_label.setFont(button_font)

        # cycles label
        self.cycles_label = QLabel('0 cycles')
        cycles_font = QtGui.QFont("Sans", 12, QtGui.QFont.Bold)
        self.cycles_label.setFont(cycles_font)

        # state label
        state_font = QtGui.QFont("Sans", 18, QtGui.QFont.Bold)
        self.state_label = QLabel(STATE_LABELS[self.state])
        self.state_label.setFont(state_font)

        # progressbar
        self.progress = QProgressBar()
        self.progress.setMaximum(100)
        self.progress.setMinimum(0)
        self.progress.setValue(0)

        self.window = CloseableQWidget(self)
        self.window.setGeometry(770, 440, 400, 200)

        self.outer_vertical = QVBoxLayout()
        self.inner_horizonal = QHBoxLayout()
        self.buttons_vertical = QVBoxLayout()
        self.slider_clock_layout = QHBoxLayout()
        self.labels = QHBoxLayout()

        self.outer_vertical.addLayout(self.inner_horizonal)

        self.inner_horizonal.addWidget(self.label)
        self.inner_horizonal.addLayout(self.buttons_vertical)

        self.buttons_vertical.addWidget(self.toggle_button)
        self.buttons_vertical.addWidget(self.reset_button)

        self.slider_clock_layout.addWidget(self.progress)
        self.slider_clock_layout.addWidget(self.time_label)

        self.labels.addWidget(self.state_label)
        self.labels.addWidget(self.cycles_label)
        self.labels.addWidget(self.progress_label, alignment=Qt.AlignRight)
        self.outer_vertical.addLayout(self.labels)
        self.outer_vertical.addLayout(self.slider_clock_layout)

        self.window.setLayout(self.outer_vertical)
        self.window.show()

        # gif options
        self.movie.setCacheMode(QMovie.CacheAll)
        self.progress_label.setMovie(self.movie)
        self.movie.jumpToFrame(1)
        self.movie.loopCount()

        self.app.setStyle('Fusion')
        sys.exit(self.app.exec_())
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()
Exemple #7
0
class Benek(Postac):
    def __init__(self, layout, move_distance=100, *args):
        super().__init__(layout, *args)
        self.clocks = []

        self.load_player_config()

        self.set_player_geo()
        self.setText("")
        self.setPixmap(QtGui.QPixmap("images/skins/" + JsonConnector.get_from_config("skin") + ".png"))
        self.setScaledContents(True)        # odpowiada za pozwolenie na skalowanie grafik

        self.move_distance = self.okno.gWidth / move_distance
        self.can_shot = True

        self.playing_sound = False

        self.rtimer = QTimer()
        self.clocks.append(self.rtimer)
        self.rtimer.timeout.connect(self.ruch_prawo)
        self.ltimer = QTimer()
        self.clocks.append(self.ltimer)
        self.ltimer.timeout.connect(self.ruch_lewo)

        self.shot_block_timer = QTimer()
        self.clocks.append(self.shot_block_timer)
        self.shot_block_timer.timeout.connect(self.shot_accuracy_unblock)

        self.make_move_animations()
        self.make_reload_bar()

    def load_player_config(self):
        config = JsonConnector.get_from_config("shipConfig")
        self.laser_penetrate = config["penetrate"]
        self.ship_size = config["shipSize"]
        self.fire_speed = config["fireSpeed"]
        self.ammo_size = config["ammoSize"]
        self.ammo_dist = config["ammoSpeed"]

    def set_player_geo(self):
        size = int(self.okno.gWidth/self.ship_size)
        self.setGeometry(QtCore.QRect((self.okno.width() - size)/2, self.okno.height() - size, size, size))

    def rusz_benek_prawo(self):
        self.rtimer.start(15)
        self.pg = int((self.okno.width() - self.okno.gWidth) / 2 + self.okno.gWidth)    # prawa granica
        self.x_ = self.geometry().x()

        self.move_sound_start()
        self.expand_anim_movie(self.lmove_anim)

    def ruch_prawo(self):
        if self.pg >= (self.x_ + self.width()):     # zapezpiecza postać przed wyjściem poza okno
            if (self.pg - (self.x_ + self.width())) < self.move_distance:   # jeśli odległość od lewego krańca jest mniejsza od ruchu to zmienia pozycje benka na krańcową
                self.x_ = self.pg - self.width()
            else:
                self.x_ += self.move_distance
            geo = QtCore.QRect(self.x_, self.geometry().y(), self.geometry().width(), self.geometry().height())
            self.setGeometry(geo)

    def stop_rusz_benek_prawo(self):
        self.rtimer.stop()
        self.move_sound_stop()
        self.collapse_anim_movie(self.lmove_anim)

    def rusz_benek_lewo(self):
        self.ltimer.start(15)
        self.x_ = self.geometry().x()
        self.lg = int((self.okno.width() - self.okno.gWidth) / 2) # lewa granica

        self.move_sound_start()
        self.expand_anim_movie(self.rmove_anim)

    def ruch_lewo(self):
        if self.x_ > self.lg:           # zabezpiecza przed wyjściem benka poza ekran
            if self.x_ - self.lg < self.move_distance:      # jeśli benkowi brakuje mniej niż dystans ruchu to przyjmuje zerową pozycje
                self.x_ = self.lg
            else:
                self.x_ -= self.move_distance
            geo = QtCore.QRect(self.x_, self.geometry().y(), self.geometry().width(), self.geometry().height())
            self.setGeometry(geo)

    def stop_rusz_benek_lewo(self):
        self.ltimer.stop()
        self.move_sound_stop()
        self.collapse_anim_movie(self.rmove_anim)

    def shot(self):     # tworzy nowy strzał
        if self.can_shot:
            x = SoundThread("shotLaser.wav")
            x.start()

            self.ui.centralwidget.close()
            x = PlayerLaser(self.ui.centralwidget, cause_geo=self.geometry(), can_penetrate=self.laser_penetrate, bullet_width=self.ammo_size[0], bullet_height=self.ammo_size[1], bullet_distance=self.ammo_dist)       # aby poprawnie dodać element do główneg widgetu należy go wyłączyć a następnie pokazać, czli zresetować
            self.ui.centralwidget.show()
            self.shot_accuracy_block()

    def shot_accuracy_block(self):
        self.can_shot = False
        self.shot_block_timer.start(self.fire_speed)

        self.movie.start()

    def shot_accuracy_unblock(self):
        self.can_shot = True
        self.shot_block_timer.stop()

        self.movie.stop()
        self.movie.jumpToFrame(self.movie.frameCount()-1)

    def move_sound_start(self):
        if not self.playing_sound:
            self.playing_sound = True
            self.move_sound = SoundThread("shotEngineNoise.wav", loop=True)
            self.clocks.append(self.move_sound)
            self.move_sound.start()

    def move_sound_stop(self):
        if self.playing_sound and not (self.ltimer.isActive() or self.rtimer.isActive()):
            self.move_sound.stop()
            self.clocks.remove(self.move_sound)
            self.playing_sound = False

    def make_reload_bar(self):
        self.reload_bar = QLabel(self)
        self.reload_bar.setGeometry(QtCore.QRect(int(self.width()/6), 0, int(self.width()/6), int(self.height()/2)))
        self.reload_bar.setText("aa")
        self.reload_bar.setPixmap(QtGui.QPixmap("images/reloadBar.gif"))
        self.reload_bar.setScaledContents(True)

        self.movie = QMovie("images/reloadBar.gif", QByteArray(), self.reload_bar)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100 * 1000 / self.fire_speed)   # ustala tak prędkość aby pokrywała się z szybkostrzelnością
        self.reload_bar.setMovie(self.movie)
        self.movie.jumpToFrame(self.movie.frameCount()-1)

    def make_move_animations(self):
        self.lmove_lab = QLabel(self)
        self.lmove_lab.setText("")
        self.lmove_lab.setGeometry(QtCore.QRect(0, 0, int(self.width() / 3), self.height()))
        self.lmove_lab.setScaledContents(True)

        self.lmove_anim = QMovie("images/lPlayerMove.gif", QByteArray(), self.lmove_lab)
        self.lmove_anim.setCacheMode(QMovie.CacheAll)
        self.lmove_anim.setSpeed(7000)
        self.lmove_lab.setMovie(self.lmove_anim)
        self.lmove_anim.jumpToFrame(0)

        self.rmove_lab = QLabel(self)
        self.rmove_lab.setText("")
        self.rmove_lab.setGeometry(QtCore.QRect(int(self.width() / 3*2), 0, int(self.width() / 3), self.height()))
        self.rmove_lab.setScaledContents(True)

        self.rmove_anim = QMovie("images/rPlayerMove.gif", QByteArray(), self.rmove_lab)
        self.rmove_anim.setCacheMode(QMovie.CacheAll)
        self.rmove_anim.setSpeed(7000)
        self.rmove_lab.setMovie(self.rmove_anim)
        self.rmove_anim.jumpToFrame(0)
        self.rmove_anim.frameCount()

    def expand_anim_movie(self, movie):
        movie.jumpToFrame(int(movie.frameCount() / 2))

    def collapse_anim_movie(self, movie):
        movie.jumpToFrame(0)
Exemple #8
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()
Exemple #9
0
class UiImageGroup(QLabel):
    """
    :type iv_image: IVImage
    :type self.movie: QMovie
    """

    def __init__(self, iv_image):
        super().__init__()
        if not iv_image:
            return
        self.iv_image = iv_image
        self.setContentsMargins(0, 0, 0, 0)
        self.setStyleSheet("UiImageGroup { background-color: white; }")
        self.setPixmap(QPixmap(str(self.iv_image.thumbnail_path)).scaled(imageviewer.settings.IMAGE_WIDTH,
                                                                         imageviewer.settings.IMAGE_HEIGHT,
                                                                         Qt.KeepAspectRatio))
        self.movie = None

    def gif(self):
        if self.movie:
            # Movie is already created
            self.movie.start()
            return
        print("Creating movie for", str(self.iv_image.path))
        self.movie = QMovie(str(self.iv_image.path))
        image = QImage(str(self.iv_image.path))
        if image.height() > imageviewer.settings.IMAGE_HEIGHT or image.width() > imageviewer.settings.IMAGE_WIDTH:
            # scale the movie if it doesn't fit in the frame
            # the frame is big enough we don't need the gif at full size to see what is going on
            image2 = image.scaled(imageviewer.settings.IMAGE_WIDTH,
                                  imageviewer.settings.IMAGE_HEIGHT,
                                  Qt.KeepAspectRatio)
            size = QSize()
            size.setHeight(image2.height())
            size.setWidth(image2.width())
            self.movie.setScaledSize(size)
            print("Scaled movie size")
        self.setMovie(self.movie)
        self.movie.start()

    def open_explorer(self):
        print(r'explorer /select,"' + str(self.iv_image.path) + '"')
        subprocess.Popen(r'explorer /select,"' + str(self.iv_image.path) + '"')

    def enterEvent(self, event):
        if self.iv_image.filename.endswith(".gif"):
            self.gif()
        elif self.iv_image.filename.endswith(".jpg"):
            self.setPixmap(QPixmap(str(self.iv_image.path)).scaled(imageviewer.settings.IMAGE_WIDTH,
                                                                   imageviewer.settings.IMAGE_HEIGHT,
                                                                   Qt.KeepAspectRatio))
        QApplication.setOverrideCursor(Qt.PointingHandCursor)
        event.accept()

    def leaveEvent(self, event):
        if self.movie:
            self.movie.jumpToFrame(0)  # Reset gif?
            self.movie.stop()
        QApplication.restoreOverrideCursor()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.open_explorer()
            event.accept()
Exemple #10
0
 def set_loading(self):
     loader = QMovie(appctxt.get_resource("animations/loader.gif"))
     self.preview_box.setMovie(loader)
     loader.jumpToFrame(0)
     self.preview_box.resize(loader.currentImage().size())
     loader.start()
Exemple #11
0
class Game(QMainWindow, Ui_MainWindow):
    # set window on screen center
    def center(self):
        frameGm = self.frameGeometry()
        screen = QtWidgets.QApplication.desktop().screenNumber(
            QtWidgets.QApplication.desktop().cursor().pos())
        centerPoint = QtWidgets.QApplication.desktop().screenGeometry(
            screen).center()
        frameGm.moveCenter(centerPoint)
        self.move(frameGm.topLeft())

    # move window by holding right mouse button
    def mousePressEvent(self, event):
        if event.buttons() == Qt.RightButton:
            self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        # print(delta)
        if event.buttons() == Qt.RightButton:
            delta = QPoint(event.globalPos() - self.oldPos)
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.oldPos = event.globalPos()

    def animateBackground(self):
        # Load the file into a QMovie
        self.movie = QMovie(APP_FOLDER + "/resources/images/clouds.gif",
                            QByteArray(), self)
        self.movie.setScaledSize(QSize(1020, 900))
        self.movie.setSpeed(70)
        proxy_style = RoundPixmapStyle(radius=20,
                                       style=self.lbBackground.style())
        self.lbBackground.setStyle(proxy_style)
        self.lbBackground.setMovie(self.movie)
        self.movie.start()

    def settings(self):
        settings = QSettings()
        return settings

    def __init__(self, parent=None):
        # Αρχικοποίηση του γραφικού περιβάλλοντος
        super(Game, self).__init__(parent)
        print(APP_FOLDER)
        self.setupUi(self)
        c.SCORE = self.settings().value("score", 0, type=int)
        # Μεταβλητές
        self.points = []
        self.speed = 30
        self.movie = None
        self.commands = {
            c.KEY_UP: logic.up,
            c.KEY_DOWN: logic.down,
            c.KEY_LEFT: logic.left,
            c.KEY_RIGHT: logic.right,
            c.KEY_UP_ALT: logic.up,
            c.KEY_DOWN_ALT: logic.down,
            c.KEY_LEFT_ALT: logic.left,
            c.KEY_RIGHT_ALT: logic.right,
            c.KEY_J: logic.left,
            c.KEY_L: logic.right,
            c.KEY_I: logic.up,
            c.KEY_K: logic.down
        }

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint
                            | QtCore.Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.center()

        self.settings()
        self.restoreStates()

        self.fontDatabase = QFontDatabase()
        self.fontDatabase.addApplicationFont(
            APP_FOLDER + "/resources/fonts/JackportCollegeNcv-1MZe.ttf")
        self.fontDatabase.addApplicationFont(
            APP_FOLDER + "/resources/fonts/Rosemary-Bold.ttf")
        self.lScore.setFont(QFont("JACKPORT COLLEGE NCV", 40))
        self.lHiScore.setFont(QFont("JACKPORT COLLEGE NCV", 40))
        self.bExit.setFont(QFont("JACKPORT COLLEGE NCV", 32))
        self.lMediaSet.setFont(QFont("Rosemary", 38))
        swipeCurImg = QPixmap(APP_FOLDER + "/resources/images/swipeCursor.png")
        handCurImg = QPixmap(APP_FOLDER + "/resources/images/handCursor.png")
        self.cursors = [handCurImg, swipeCurImg]
        self.centralwidget.setCursor(QCursor(self.cursors[0], 15, 2))
        self.frame.setCursor(QCursor(self.cursors[1], 35, 35))
        self.frame.setAttribute(Qt.WA_StyledBackground, (True))
        self.animateBackground()
        self.musIcon()
        self.sndIcon()
        self.playMusic()

        self.init_grid()
        self.matrix = logic.new_game(c.GRID_LEN)
        self.history_matrixs = []
        self.update_grid_cells()
        self.restoreGame()

        # Αντιστοίχιση ενεργειών κίνησης ποντικιού και κλικ
        self.bHelp.clicked.connect(self.bHelpClicked)
        self.bAnim.clicked.connect(self.animStartStop)
        self.sndslider.valueChanged.connect(self.sndslvalchanged)
        self.musslider.valueChanged.connect(self.musslvalchanged)
        self.frame.installEventFilter(self)

    # Μέθοδος ενεργοποίησης/απενεργοποίησης του κινούμενου bakcground
    def animStartStop(self):
        if self.movie != None and self.movie.state() == QMovie.Running:
            self.movie.stop()
            self.bAnim.setStyleSheet(
                "QPushButton{\n"
                "border-image: url(:/resources/images/anim_off.png)\n"
                "}")
        else:
            self.animateBackground()
            self.bAnim.setStyleSheet(
                "QPushButton{\n"
                "border-image: url(:/resources/images/anim_on.png)\n"
                "}")

    # Σχεδίαση του βασικού πλαισίου
    def init_grid(self):
        for i in range(c.GRID_LEN):
            for j in range(c.GRID_LEN):
                self.gridBoard.addWidget(self.setTile("empty"), i, j)

    def generate_next(self):
        index = (gen(), gen())
        while self.matrix[index[0]][index[1]] != 0:
            index = (gen(), gen())
        self.matrix[index[0]][index[1]] = 2

    def update_grid_cells(self):
        for i in range(c.GRID_LEN):
            for j in range(c.GRID_LEN):
                new_number = self.matrix[i][j]
                if new_number == 0:
                    self.replaceTile("empty", i, j)
                else:
                    self.replaceTile(new_number, i, j)

    # Δημιουργία των αριθμητικών πλακιδίων
    def setTile(self, item):
        tile = QLabel('')
        tile.setFocusPolicy(Qt.NoFocus)
        tile.setFixedWidth(135)
        tile.setFixedHeight(140)
        path = c.CELL_IMAGE_DICT.get(item)
        tile.setStyleSheet("QLabel{\n"
                           "border-image: url(:" + str(path) + ")\n"
                           "}")
        tile.setObjectName(str(item))
        return tile

    # Μέθοδος αντικατάστασης πλακιδίου
    def replaceTile(self, newTile, pX, pY):
        item = self.gridBoard.itemAtPosition(pX, pY)
        self.gridBoard.removeWidget(item.widget())
        self.gridBoard.addWidget(self.setTile(newTile), pX, pY)

    # Ενεργοποίηση των πλήκτρων χειρισμού
    def keyPressEvent(self, event):
        key = event.key()
        modifiers = QtWidgets.QApplication.keyboardModifiers()
        if modifiers == QtCore.Qt.ControlModifier:
            if key == QtCore.Qt.Key_Home:
                # print("is up!")
                if self.frameGeometry().y() > 0:
                    self.move(self.frameGeometry().x(),
                              self.frameGeometry().y() - self.speed)
            elif key == QtCore.Qt.Key_End:
                # print("is down!")
                if self.frameGeometry().y() > 0:
                    self.move(self.frameGeometry().x(),
                              self.frameGeometry().y() + self.speed)
            elif key == QtCore.Qt.Key_Delete:
                # print("is left!")
                if self.frameGeometry().x() > 0:
                    self.move(self.frameGeometry().x() - self.speed,
                              self.frameGeometry().y())
            elif key == QtCore.Qt.Key_PageDown:
                # print("is right!")
                if self.frameGeometry().x() > 0:
                    self.move(self.frameGeometry().x() + self.speed,
                              self.frameGeometry().y())
        if key == c.KEY_BACK or key == c.KEY_BACK_ALT:
            if len(self.history_matrixs) > 1:
                self.matrix = self.history_matrixs.pop()
                self.update_grid_cells()
                #print('back on step total step:', len(self.history_matrixs))
        # Έλεγχος Αν το παιχνίδι τελείωσε και αν έχει κερδηθεί ή χαθεί
        elif key in self.commands:
            self.frame.setCursor(Qt.BlankCursor)
            self.matrix, done = self.commands[key](self.matrix)
            if done:
                self.stateOfGame()

    def stateOfGame(self):
        self.playSound(APP_FOLDER + c.SOUNDS_DICT["move"])
        self.matrix = logic.add_two(self.matrix)
        # record last move
        self.history_matrixs.append(self.matrix)
        #print(self.history_matrixs[-1])
        self.update_grid_cells()
        if logic.game_state(self.matrix) == 'win':
            if logic.winNum != 65535:
                print("num: " + str(logic.winNum))
                for key, value in c.SOUNDS_DICT.items():
                    if key == str(logic.winNum):
                        self.playSound(APP_FOLDER + value)
                winLooseDlg.WinLooseDialog(self).dialogTypes("WIN")
                print("Κερδίσες")
            else:
                winLooseDlg.WinLooseDialog(self).dialogTypes("ENDGAME")
        if logic.game_state(self.matrix) == 'lose':
            self.playSound(APP_FOLDER + c.SOUNDS_DICT["lose"])
            winLooseDlg.WinLooseDialog(self).dialogTypes("LOOSE")
            print("Έχασες")
        self.lScore.setText(str(c.SCORE))
        if int(self.lHiScore.text()) < int(self.lScore.text()):
            self.lHiScore.setText(self.lScore.text())

    # Μέθοδος για χειρσμό με κλικ και σύρσιμο του ποντικιού
    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseMove:
            self.frame.setCursor(QCursor(self.cursors[1], 35, 35))
            if event.buttons() == QtCore.Qt.LeftButton:

                if len(self.points) > 2:
                    startx, starty = self.points[0][0], self.points[0][1]
                    for i in range(len(self.points)):
                        self.points[i] = (self.points[i][0] - startx,
                                          self.points[i][1] - starty)
                self.points.append(
                    (event.localPos().x(), event.localPos().y()))
                # print(self.points)
        if event.type() == QtCore.QEvent.MouseButtonRelease and event.button(
        ) == QtCore.Qt.LeftButton:
            # print("Released!")
            self.mouseDown = False
            strokes = moosegesture.getGesture(self.points)
            if len(strokes) > 0:
                strokeText = str(strokes[-1])
                # print(strokeText)
                if strokeText == "R":
                    self.matrix, done = logic.right(self.matrix)
                    if done:
                        self.stateOfGame()
                elif strokeText == "L":
                    self.matrix, done = logic.left(self.matrix)
                    if done:
                        self.stateOfGame()
                elif strokeText == "U":
                    self.matrix, done = logic.up(self.matrix)
                    if done:
                        self.stateOfGame()
                elif strokeText == "D":
                    self.matrix, done = logic.down(self.matrix)
                    if done:
                        self.stateOfGame()
            strokes.clear()
        else:
            return True

        return self.frame.eventFilter(source, event)

    # Μέθοδος για την αναπαραγωγή των ήχων
    def playSound(self, sound):
        pygame.mixer.pre_init(frequency=44100,
                              size=-16,
                              channels=3,
                              buffer=512)
        pygame.mixer.init()
        effect = pygame.mixer.Sound(sound)
        self.sndslider.setMinimum(0)
        self.sndslider.setMaximum(100)
        vol = self.sndslider.value()
        effect.set_volume(vol / 100)
        pygame.mixer.find_channel().play(effect)

    # Έλεγχος για αλλαγές στο εικονίδιο ήχου
    def sndslvalchanged(self):
        self.sndIcon()

    # Αλλαγή του εικονιδίου ήχου
    def sndIcon(self):
        if self.sndslider.value() == 0:
            self.lSound.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/sound_off.png)\n"
                "}")
        else:
            self.lSound.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/sound_on.png)\n"
                "}")

    # Μέθοδος για την αnaπαραγωγή μουσικής
    def playMusic(self):
        pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)
        pygame.mixer.music.load(
            os.path.join(APP_FOLDER, "resources/sounds/backmusic.ogg"))
        self.musslider.setMinimum(0)
        self.musslider.setMaximum(100)
        musvol = self.musslider.value()
        pygame.mixer.music.set_volume(musvol / 100)
        pygame.mixer.music.play(loops=-1)
        self.musslider.valueChanged.connect(self.musslvalchanged)

    def musslvalchanged(self):
        pygame.mixer.music.pause()
        pygame.mixer.music.set_volume(self.musslider.value() / 100)
        pygame.mixer.music.unpause()
        self.musIcon()

    def musIcon(self):
        if self.musslider.value() == 0:
            self.lMusic.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/music_off.png)\n"
                "}")
        else:
            self.lMusic.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/music_on.png)\n"
                "}")

    def chkGrid(self):
        if len(self.history_matrixs) != 0:
            lst = self.history_matrixs[-1]
        else:
            lst = self.settings().value("gameState")
        nums = []
        for i in range(len(lst)):
            for j in range(len(lst[0])):
                if lst[i][j] != 0:
                    nums.append(lst[i][j])
        print(nums)
        return nums

    def bHelpClicked(self):
        helpDlg.HelpDialog(self).exec()

    pyqtSlot()

    def on_bPlay_clicked(self):
        self.gridBoard.blockSignals(False)
        self.init_grid()
        c.SCORE = 0
        self.lScore.setText(str(c.SCORE))
        self.matrix = logic.new_game(c.GRID_LEN)
        self.history_matrixs = []
        self.update_grid_cells()

    pyqtSlot()

    def on_bExit_clicked(self):
        self.saveStates()
        self.movie.jumpToFrame(100)
        if len(self.chkGrid()) > 2:
            winLooseDlg.WinLooseDialog(self).dialogTypes("SAVEGAME")
        sys.exit()

    # αποθήκευση τιμών της εφαρμογής
    def saveStates(self):
        self.settings().setValue("slidervalue", self.sndslider.value())
        self.settings().setValue("sliderMvalue", self.musslider.value())
        self.settings().setValue("HighScore", self.lHiScore.text())
        self.settings().setValue("geometry", self.saveGeometry())
        self.settings().setValue("windowState", self.saveState())
        self.settings().sync()

    # Επαναφορά αποθηκευμένων τιμών από το preferencies.ini
    def restoreStates(self):
        self.sndslider.setValue(self.settings().value("slidervalue",
                                                      40,
                                                      type=int))
        self.musslider.setValue(self.settings().value("sliderMvalue",
                                                      50,
                                                      type=int))
        self.lHiScore.setText(self.settings().value("HighScore", "0"))
        if not self.settings().value("geometry") == None:
            self.restoreGeometry(self.settings().value("geometry"))
        if not self.settings().value("windowState") == None:
            self.restoreState(self.settings().value("windowState"))

    def saveGame(self):
        if len(self.history_matrixs) != 0:
            self.settings().setValue("gameState", self.history_matrixs[-1])
        self.settings().setValue("score", self.lScore.text())

    def restoreGame(self):
        self.matrix = self.settings().value("gameState",
                                            logic.new_game(c.GRID_LEN))
        maxNum = np.max(self.matrix)
        if logic.winNum < (maxNum):
            logic.winNum = maxNum * 2
        print(logic.winNum)
        self.update_grid_cells()
        self.lScore.setText(self.settings().value("score", "0"))

    def closeEvent(self, e):
        self.saveStates()