From 90c3ca2ab0f98b7cb76b4858e403e6f9765ab8fc Mon Sep 17 00:00:00 2001 From: Et0h Date: Sat, 6 Dec 2014 18:39:32 +0000 Subject: [PATCH] Change ready state automatically on manual pause/unpause --- syncplay/client.py | 14 ++++++++++++++ syncplay/constants.py | 1 + syncplay/ui/gui.py | 9 +++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index 855b73f..fba023a 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -68,6 +68,7 @@ class SyncplayClient(object): self.serverVersion = "0.0.0" self.lastLeftTime = 0 + self.lastPausedOnLeaveTime = None self.lastLeftUser = u"" self.protocolFactory = SyncClientFactory(self) self.ui = UiManager(self, ui) @@ -158,6 +159,12 @@ class SyncplayClient(object): pauseChange, seeked = self._determinePlayerStateChange(paused, position) self._playerPosition = position self._playerPaused = paused + if pauseChange and utils.meetsMinVersion(self.serverVersion, constants.USER_READY_MIN_VERSION): + lastPausedDiff = time.time() - self.lastPausedOnLeaveTime if self.lastPausedOnLeaveTime else None + if lastPausedDiff is not None and lastPausedDiff < constants.LAST_PAUSED_DIFF_THRESHOLD: + self.lastPausedOnLeaveTime = None + else: + self.changeReadyState(not self.getPlayerPaused()) if self._lastGlobalUpdate: self._lastPlayerUpdate = time.time() if (pauseChange or seeked) and self._protocol: @@ -303,6 +310,7 @@ class SyncplayClient(object): def onDisconnect(self): if self._config['pauseOnLeave']: self.setPaused(True) + self.lastPausedOnLeaveTime = time.time() def removeUser(self, username): if self.userlist.isUserInYourRoom(username): @@ -478,6 +486,12 @@ class SyncplayClient(object): def toggleReady(self): self._protocol.setReady(not self.userlist.currentUser.isReady()) + @requireMinServerVersion(constants.USER_READY_MIN_VERSION) + def changeReadyState(self, newState): + oldState = self.userlist.currentUser.isReady() + if newState != oldState: + self.toggleReady() + def setReady(self, username, isReady): oldReadyState = self.userlist.isReady(username) if oldReadyState is None: diff --git a/syncplay/constants.py b/syncplay/constants.py index 19d9dfe..7f389f3 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -48,6 +48,7 @@ WARNING_OSD_MESSAGES_LOOP_INTERVAL = 1 MERGE_PLAYPAUSE_BUTTONS = False SYNC_ON_PAUSE = True # Client seek to global position - subtitles may disappear on some media players #Usually there's no need to adjust these +LAST_PAUSED_DIFF_THRESHOLD = 2 FILENAME_STRIP_REGEX = u"[-~_\.\[\](): ]" CONTROL_PASSWORD_STRIP_REGEX = u"[^a-zA-Z0-9\-]" ROOM_NAME_STRIP_REGEX = u"^(\+)(?P.*)(:)(\w{12})$" diff --git a/syncplay/ui/gui.py b/syncplay/ui/gui.py index dd51ecd..7075319 100644 --- a/syncplay/ui/gui.py +++ b/syncplay/ui/gui.py @@ -163,6 +163,7 @@ class MainWindow(QtGui.QMainWindow): font = QtGui.QFont() if currentUser.username == user.username: font.setWeight(QtGui.QFont.Bold) + self.updateReadyState(currentUser.isReady()) if isControlledRoom and not isController: useritem.setForeground(QtGui.QBrush(QtGui.QColor(constants.STYLE_NOTCONTROLLER_COLOR))) useritem.setFont(font) @@ -199,6 +200,11 @@ class MainWindow(QtGui.QMainWindow): except: pass + def updateReadyState(self, newState): + oldState = self.readyCheckbox.isChecked() + if newState != oldState: + self.readyCheckbox.setChecked(newState) + def roomClicked(self, item): while item.parent().row() != -1: item = item.parent() @@ -621,8 +627,7 @@ class MainWindow(QtGui.QMainWindow): self.listbox.moveCursor(QtGui.QTextCursor.End) def changeReadyState(self): - if self.readyCheckbox.isChecked() != self._syncplayClient.userlist.currentUser.isReady(): - self._syncplayClient.toggleReady() + self._syncplayClient.changeReadyState(self.readyCheckbox.isChecked()) def dragEnterEvent(self, event): data = event.mimeData()