From 96b7a4f059ea086acaad6f35810f801d02f3f99e Mon Sep 17 00:00:00 2001 From: En Yi Date: Thu, 19 Jul 2018 15:46:21 +0800 Subject: [PATCH] Add circular loop to difficulty selector --- graphic_components/scoreboard.py | 39 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/graphic_components/scoreboard.py b/graphic_components/scoreboard.py index bef5770..c946da6 100644 --- a/graphic_components/scoreboard.py +++ b/graphic_components/scoreboard.py @@ -36,13 +36,16 @@ class HighScoreBoard(QWidget): class DifficultySwitch(QHBoxLayout): + difficultySelected = pyqtSignal(str) def __init__(self): super().__init__() + circular_text = hs.DIFFICULTIES.copy() + circular_text.insert(0, hs.DIFFICULTIES[-1]) + circular_text.append(hs.DIFFICULTIES[0]) self.max_length = max(len(diff) for diff in hs.DIFFICULTIES) - self.full_text = ''.join(d.center(self.max_length) for d in hs.DIFFICULTIES) - + self.full_text = ''.join(d.center(self.max_length) for d in circular_text) left_btn = QPushButton('<') self.difficulty_display = QLabel('Normal') self.difficulty_display.setAlignment(Qt.AlignCenter) @@ -55,45 +58,41 @@ class DifficultySwitch(QHBoxLayout): self.show_pos = 0 self.reach_end = True self.anim = QPropertyAnimation(self, b'show_pos') - self.anim.setDuration((len(hs.DIFFICULTIES) - 1) * self.max_length * 20) - self.anim.setStartValue(0) - self.anim.setEndValue((len(hs.DIFFICULTIES) - 1) * self.max_length) + self.anim.setDuration(((len(hs.DIFFICULTIES) + 1) * self.max_length + 2) * 20) + self.anim.setStartValue(-2) + self.anim.setEndValue((len(hs.DIFFICULTIES) + 2) * self.max_length + 1) left_btn.clicked.connect(lambda: self.shift_difficulty(QAbstractAnimation.Backward)) right_btn.clicked.connect(lambda: self.shift_difficulty(QAbstractAnimation.Forward)) self.anim.valueChanged.connect(self.pause_anim) + self.anim.start() @pyqtProperty(int) def show_pos(self): """ int : The value for the animation - When the value is set, the text to be printed is generated accordingly. - It determines whether actual text is to be printed, and retains the - paragraphs when printing garbage. + When the value is set, the text to be shown is selected from the full text. """ return self._shown_length @show_pos.setter def show_pos(self, value): self._shown_length = value - self.difficulty_display.setText(self.full_text[value:value+9]) + self.difficulty_display.setText(self.full_text[value:value+self.max_length]) def shift_difficulty(self, direction): if not self.anim.state() == QAbstractAnimation.Running: - if (direction == QAbstractAnimation.Forward and self.show_pos < self.anim.endValue()) \ - or (direction == QAbstractAnimation.Backward and self.show_pos > self.anim.startValue()): - self.anim.setDirection(direction) - if self.anim.state() == QAbstractAnimation.Paused: - self.anim.resume() - else: - self.anim.start() + self.anim.setDirection(direction) + self.anim.resume() def pause_anim(self, value): + if value == (len(hs.DIFFICULTIES)+1) * self.max_length: + self.show_pos = self.max_length + elif value == 0: + self.show_pos = len(hs.DIFFICULTIES) * self.max_length if value % 9 == 0: - if value == self.anim.endValue() or value == self.anim.endValue(): - self.reach_end = True - else: - self.anim.pause() + self.anim.pause() + self.difficultySelected.emit(self.difficulty_display.text()) class ScoreGrid(QGridLayout):