From 7fade5dfe04223387416b6c0ee404c7c3fb80c6e Mon Sep 17 00:00:00 2001 From: Et0h Date: Tue, 17 Mar 2015 17:12:33 +0000 Subject: [PATCH] Provide more options for how to handle unpause action (UnpauseIfOthersReady by default) --- syncplay/client.py | 12 ++++- syncplay/constants.py | 7 ++- syncplay/messages.py | 37 ++++++++++++--- syncplay/ui/ConfigurationGetter.py | 5 +-- syncplay/ui/GuiConfiguration.py | 72 ++++++++++++++++++++++++------ 5 files changed, 108 insertions(+), 25 deletions(-) diff --git a/syncplay/client.py b/syncplay/client.py index 9dfacd3..5af2c8e 100644 --- a/syncplay/client.py +++ b/syncplay/client.py @@ -521,8 +521,18 @@ class SyncplayClient(object): self.stopAutoplayCountdown() def instaplayConditionsMet(self): - if self.userlist.currentUser.isReady() or self._config["alwaysUnpause"]: + if not self.userlist.currentUser.canControl(): + return False + + unpauseAction = self._config['unpauseAction'] + if self.userlist.currentUser.isReady() or unpauseAction == constants.UNPAUSE_ALWAYS_MODE: return True + elif unpauseAction == constants.UNPAUSE_IFOTHERSREADY_MODE and self.userlist.areAllOtherUsersInRoomReady(): + return True + elif unpauseAction == constants.UNPAUSE_IFMINUSERSREADY_MODE and self.userlist.areAllOtherUsersInRoomReady() and self.autoPlayThreshold and self.userlist.usersInRoomCount() >= self.autoPlayThreshold: + return True + else: + return False def autoplayConditionsMet(self): return self._playerPaused and self.autoPlay and self.userlist.currentUser.canControl() and self.userlist.isReadinessSupported() and self.userlist.areAllUsersInRoomReady() and self.autoPlayThreshold and self.userlist.usersInRoomCount() >= self.autoPlayThreshold diff --git a/syncplay/constants.py b/syncplay/constants.py index 8e6e7a1..9c1f097 100644 --- a/syncplay/constants.py +++ b/syncplay/constants.py @@ -115,7 +115,7 @@ VLC_MAX_PORT = 55000 #These are not changes you're looking for STYLE_TABLIST = "QListWidget::item { border-style: solid; border-width: 1px; border-radius: 2px; } QListWidget::item:selected { color: black; background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(242, 248, 255, 255), stop:1 rgba(208, 229, 255, 255)); border-color: #84ACDD; } QListWidget::item:!selected { border-color: transparent; } QListWidget::item:!selected:hover { color: black; background: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(248, 248, 248, 255), stop:1 rgba(229, 229, 229, 255)); border-color: silver; }" -STYLE_SUBCHECKBOX = "QCheckBox, QLabel {{ margin-left: 6px; padding-left: 21px; background:url('{}') left no-repeat }}" #Graphic path +STYLE_SUBCHECKBOX = "QCheckBox, QLabel, QRadioButton {{ margin-left: 6px; padding-left: 21px; background:url('{}') left no-repeat }}" #Graphic path STYLE_SUBLABEL = "QCheckBox, QLabel {{ margin-left: 6px; padding-left: 16px; background:url('{}') left no-repeat }}" #Graphic path STYLE_ERRORLABEL = "QLabel { color : black; border-style: outset; border-width: 2px; border-radius: 7px; border-color: red; padding: 2px; background: #FFAAAA; }" STYLE_SUCCESSLABEL = "QLabel { color : black; border-style: outset; border-width: 2px; border-radius: 7px; border-color: green; padding: 2px; background: #AAFFAA; }" @@ -151,6 +151,11 @@ SERVER_MAX_TEMPLATE_LENGTH = 10000 PRIVACY_SENDRAW_MODE = "SendRaw" PRIVACY_SENDHASHED_MODE = "SendHashed" PRIVACY_DONTSEND_MODE = "DoNotSend" +UNPAUSE_IFALREADYREADY_MODE = "IfAlreadyReady" +UNPAUSE_IFOTHERSREADY_MODE = "IfOthersReady" +UNPAUSE_IFMINUSERSREADY_MODE = "IfMinUsersReady" +UNPAUSE_ALWAYS_MODE = "Always" + PRIVACY_HIDDENFILENAME = "**Hidden filename**" INVERTED_STATE_MARKER = "*" ERROR_MESSAGE_MARKER = "*" diff --git a/syncplay/messages.py b/syncplay/messages.py index 37a72ba..21e8ed5 100755 --- a/syncplay/messages.py +++ b/syncplay/messages.py @@ -180,7 +180,6 @@ en = { "dontslowdownwithme-label" : "Never slow down or rewind others (experimental)", "pauseonleave-label" : "Pause when user leaves (e.g. if they are disconnected)", "readyatstart-label" : "Set me as 'ready to watch' by default", - "alwaysunpause-label" : u"Unpause always unpauses (rather than just sets as ready if unready)", "forceguiprompt-label" : "Don't always show the Syncplay configuration window", # (Inverted) "nostore-label" : "Don't store this configuration", # (Inverted) "showosd-label" : "Enable OSD Messages", @@ -194,6 +193,7 @@ en = { "automatic-language" : "Default ({})", # Default language "showdurationnotification-label" : "Warn about media duration mismatches", "basics-label" : "Basics", + "readiness-label" : u"Play/Pause", "misc-label" : u"Misc", "core-behaviour-title" : "Core room behaviour", "syncplay-internals-title" : u"Syncplay internals", @@ -205,6 +205,11 @@ en = { "messages-other-title" : "Other display settings", "privacy-label" : "Privacy", # Currently unused, but will be brought back if more space is needed in Misc tab "privacy-title" : "Privacy settings", + "unpause-title" : u"If you press play, set as ready and:", + "unpause-ifalreadyready-option" : u"Unpause if already set as ready", + "unpause-ifothersready-option" : u"Unpause if already ready or others in room are ready (default)", + "unpause-ifminusersready-option" : u"Unpause if already ready or if all others ready and min users ready", + "unpause-always" : u"Always unpause", "help-label" : "Help", "reset-label" : "Restore defaults", @@ -285,7 +290,6 @@ en = { "dontslowdownwithme-tooltip" : "Means others do not get slowed down or rewinded if your playback is lagging. Useful for room operators.", "pauseonleave-tooltip" : "Pause playback if you get disconnected or someone leaves from your room.", "readyatstart-tooltip" : "Set yourself as 'ready' at start (otherwise you are set as 'not ready' until you change your readiness state)", - "alwaysunpause-tooltip" : "If you unpause when not ready it sets you as ready and unpauses, rather than just setting you as ready.", "forceguiprompt-tooltip" : "Configuration dialogue is not shown when opening a file with Syncplay.", # (Inverted) "nostore-tooltip" : "Run Syncplay with the given configuration, but do not permanently store the changes.", # (Inverted) "rewindondesync-tooltip" : "Jump back when needed to get back in sync. Disabling this option can result in major desyncs!", @@ -298,6 +302,10 @@ en = { "showslowdownosd-tooltip" :"Show notifications of slowing down / reverting on time difference.", "showdurationnotification-tooltip" : "Useful for when a segment in a multi-part file is missing, but can result in false positives.", "language-tooltip" : u"Language to be used by Syncplay.", + "unpause-always-tooltip" : u"If you press unpause it always sets you as ready and unpause, rather than just setting you as ready.", + "unpause-ifalreadyready-tooltip" : u"If you press unpause when not ready it will set you as ready - press unpause again to unpause.", + "unpause-ifothersready-tooltip" : u"If you press unpause when not ready, it will only upause if others are ready.", + "unpause-ifminusersready-tooltip" : u"If you press unpause when not ready, it will only upause if others are ready and minimum users threshold is met.", "help-tooltip" : "Opens the Syncplay.pl user guide.", "reset-tooltip" : "Reset all settings to the default configuration.", @@ -523,7 +531,6 @@ ru = { "dontslowdownwithme-label" : u"Никогда не замедлять или перематывать видео другим", # TODO: Update new wording into Russian (should state "Experimental" in brackets at the end) "pauseonleave-label" : u"Приостанавливать, когда кто-то уходит (например, отключился)", "readyatstart-label" : u"Set me as 'ready to watch' by default", # TODO: Translate into Russian - "alwaysunpause-label" : u"Unpause always unpauses (rather than just sets as ready if unready)", # TODO: Translate into Russian "fastforwardondesync-label" : u"Fast-forward if lagging behind (recommended)", # TODO: Translate into Russian "forceguiprompt-label" : u"Не показывать больше этот диалог", # (Inverted) "nostore-label" : u"Не сохранять текущую конфигурацию", # (Inverted) @@ -538,6 +545,7 @@ ru = { "automatic-language" : u"Default ({})", # Automatic language # TODO: Translate into Russian "showdurationnotification-label" : u"Предупреждать о несовпадении продолжительности видео", "basics-label" : u"Основное", + "readiness-label" : u"Play/Pause", # TODO: Translate into Russian "misc-label" : u"Misc", # TODO: Translate into Russian "core-behaviour-title" : "Core room behaviour", # TODO: Translate into Russian "syncplay-internals-title" : u"Syncplay internals", # TODO: Translate into Russian @@ -549,6 +557,11 @@ ru = { "messages-other-title" : u"Other display settings", # TODO: Translate into Russian "privacy-label" : u"Приватность", "privacy-title" : u"Privacy settings", # TODO: Translate into Russian + "unpause-title" : u"If you press play, set as ready and:", # TODO: Translate into Russian + "unpause-ifalreadyready-option" : u"Unpause if already set as ready", # TODO: Translate into Russian + "unpause-ifothersready-option" : u"Unpause if already ready or others in room are ready (default)", # TODO: Translate into Russian + "unpause-ifminusersready-option" : u"Unpause if already ready or if all others ready and min users ready", # TODO: Translate into Russian + "unpause-always" : u"Always unpause", # TODO: Translate into Russian "help-label" : u"Помощь", "reset-label" : u"Сброс настроек", @@ -567,7 +580,6 @@ ru = { "autoplay-guipushbuttonlabel" : u"Auto-play when everyone is ready", # TODO: Translate into Russian "autoplay-minimum-label" : u"Min users:", # TODO: Translate into Russian - "ready-guipushbuttonlabel" : u"I'm ready to watch!", # TODO: Translate into Russian "roomuser-heading-label" : u"Комната / Пользователь", @@ -642,6 +654,10 @@ ru = { "showslowdownosd-tooltip" : u"Показывать уведомления о замедлении или перемотке в целях синхронизации.", "showdurationnotification-tooltip" : u"Полезно, когда сегмент составного файла отсутствует. Возможны ложные срабатывания.", "language-tooltip" : u"Language to be used by Syncplay.", # TODO: Translate into Russian + "unpause-always-tooltip" : u"If you press unpause it always sets you as ready and unpause, rather than just setting you as ready.", # TODO: Translate into Russian + "unpause-ifalreadyready-tooltip" : u"If you press unpause when not ready it will set you as ready - press unpause again to unpause.", # TODO: Translate into Russian + "unpause-ifothersready-tooltip" : u"If you press unpause when not ready, it will only upause if others are ready.", # TODO: Translate into Russian + "unpause-ifminusersready-tooltip" : u"If you press unpause when not ready, it will only upause if others are ready and minimum users threshold is met.", # TODO: Translate into Russian "help-tooltip" : u"Открыть Руководство Пользователя на Syncplay.pl.", "reset-tooltip" : u"Сбрасывает все настройки Syncplay в начальное состояние.", @@ -866,7 +882,6 @@ de = { "dontslowdownwithme-label" : u"Nie verlangsamen oder andere zurückspulen (Experimentell)", "pauseonleave-label" : u"Pausieren wenn ein Benutzer austritt", "readyatstart-label" : u"Standardmäßig auf \'Bereit\' stellen", - "alwaysunpause-label" : u"Fortsetzen startet immer (anstatt nur den Bereitschaftsstatus zu ändern)", "forceguiprompt-label" : u"Diesen Dialog nicht mehr anzeigen", "nostore-label" : u"Diese Konfiguration nicht speichern", "showosd-label" : u"OSD-Nachrichten anzeigen", @@ -880,6 +895,7 @@ de = { "automatic-language" : u"Automatisch ({})", # Default language # TODO: Change to German translation of "default" / Current translation represents Idea better "showdurationnotification-label" : u"Zeige Warnung wegen unterschiedlicher Dauer", "basics-label" : u"Grundlagen", + "readiness-label" : u"Play/Pause", # TODO: Translate into German "misc-label" : u"Diverse", "core-behaviour-title" : u"Verhalten des Raumes", "syncplay-internals-title" : u"Syncplay intern", @@ -891,6 +907,11 @@ de = { "messages-other-title" : u"Weitere Display-Einstellungen", "privacy-label" : u"Privatsphäre", "privacy-title" : u"Privatsphäreneinstellungen", + "unpause-title" : u"If you press play, set as ready and:", # TODO: Translate into German + "unpause-ifalreadyready-option" : u"Unpause if already set as ready", # TODO: Translate into German + "unpause-ifothersready-option" : u"Unpause if already ready or others in room are ready (default)", # TODO: Translate into German + "unpause-ifminusersready-option" : u"Unpause if already ready or if all others ready and min users ready", # TODO: Translate into German + "unpause-always" : u"Always unpause", # TODO: Translate into German "help-label" : u"Hilfe", "reset-label" : u"Standardwerte zurücksetzen", @@ -985,6 +1006,10 @@ de = { "showslowdownosd-tooltip" : u"Meldungen bei Geschwindigkeitsänderung anzeigen.", "showdurationnotification-tooltip" : u"Nützlich, wenn z.B. ein Teil eines mehrteiligen Videos fehlt, kann jedoch auch fehlerhaft anschlagen.", "language-tooltip" : u"Die verwendete Sprache von Syncplay", + "unpause-always-tooltip" : u"Fortsetzen startet immer (anstatt nur den Bereitschaftsstatus zu ändern)", + "unpause-ifalreadyready-tooltip" : u"If you press unpause when not ready it will set you as ready - press unpause again to unpause.", # TODO: Translate into German + "unpause-ifothersready-tooltip" : u"If you press unpause when not ready, it will only upause if others are ready.", # TODO: Translate into German + "unpause-ifminusersready-tooltip" : u"If you press unpause when not ready, it will only upause if others are ready and minimum users threshold is met.", # TODO: Translate into German "help-tooltip" : u"Öffnet Hilfe auf syncplay.pl [Englisch]", "reset-tooltip" : u"Alle Einstellungen auf Standardwerte zurücksetzen.", @@ -1092,4 +1117,4 @@ def getMessage(type_, locale=None): if messages["en"].has_key(type_): return unicode(messages["en"][type_]) else: - raise KeyError() + raise KeyError(type_) diff --git a/syncplay/ui/ConfigurationGetter.py b/syncplay/ui/ConfigurationGetter.py index 3012fe1..55323d1 100755 --- a/syncplay/ui/ConfigurationGetter.py +++ b/syncplay/ui/ConfigurationGetter.py @@ -45,7 +45,7 @@ class ConfigurationGetter(object): "filesizePrivacyMode": constants.PRIVACY_SENDRAW_MODE, "pauseOnLeave": False, "readyAtStart": False, - "alwaysUnpause": False, + "unpauseAction": constants.UNPAUSE_IFOTHERSREADY_MODE, "autoplayInitialState" : None, "autoplayMinUsers" : -1, "clearGUIData": False, @@ -84,7 +84,6 @@ class ConfigurationGetter(object): "dontSlowDownWithMe", "pauseOnLeave", "readyAtStart", - "alwaysUnpause", "clearGUIData", "rewindOnDesync", "slowOnDesync", @@ -114,7 +113,7 @@ class ConfigurationGetter(object): self._iniStructure = { "server_data": ["host", "port", "password"], - "client_settings": ["name", "room", "playerPath", "slowdownThreshold", "rewindThreshold", "fastforwardThreshold", "slowOnDesync", "rewindOnDesync", "fastforwardOnDesync", "dontSlowDownWithMe", "forceGuiPrompt", "filenamePrivacyMode", "filesizePrivacyMode", "pauseOnLeave", "readyAtStart", "alwaysUnpause", "autoplayMinUsers", "autoplayInitialState"], + "client_settings": ["name", "room", "playerPath", "slowdownThreshold", "rewindThreshold", "fastforwardThreshold", "slowOnDesync", "rewindOnDesync", "fastforwardOnDesync", "dontSlowDownWithMe", "forceGuiPrompt", "filenamePrivacyMode", "filesizePrivacyMode", "unpauseAction", "pauseOnLeave", "readyAtStart", "autoplayMinUsers", "autoplayInitialState"], "gui": ["showOSD", "showOSDWarnings", "showSlowdownOSD", "showDifferentRoomOSD", "showSameRoomOSD", "showNonControllerOSD", "showDurationNotification"], "general": ["language", "checkForUpdatesAutomatically", "lastCheckedForUpdates"] } diff --git a/syncplay/ui/GuiConfiguration.py b/syncplay/ui/GuiConfiguration.py index 976bf1e..b3b0f35 100644 --- a/syncplay/ui/GuiConfiguration.py +++ b/syncplay/ui/GuiConfiguration.py @@ -460,6 +460,60 @@ class ConfigDialog(QtGui.QDialog): self.basicOptionsFrame.setLayout(self.basicOptionsLayout) self.stackedLayout.addWidget(self.basicOptionsFrame) + def addReadinessTab(self): + self.readyFrame = QtGui.QFrame() + self.readyLayout = QtGui.QVBoxLayout() + self.readyFrame.setLayout(self.readyLayout) + + # Initial state + + self.readyInitialGroup = QtGui.QGroupBox(u"Initial readiness state") + self.readyInitialLayout = QtGui.QVBoxLayout() + self.readyInitialGroup.setLayout(self.readyInitialLayout) + self.readyatstartCheckbox = QCheckBox(getMessage("readyatstart-label")) + self.readyatstartCheckbox.setObjectName("readyAtStart") + self.readyInitialLayout.addWidget(self.readyatstartCheckbox) + self.readyLayout.addWidget(self.readyInitialGroup) + + # Automatically pausing + self.readyPauseGroup = QtGui.QGroupBox(u"Pausing") + self.readyPauseLayout = QtGui.QVBoxLayout() + self.readyPauseGroup.setLayout(self.readyPauseLayout) + self.pauseonleaveCheckbox = QCheckBox(getMessage("pauseonleave-label")) + self.pauseonleaveCheckbox.setObjectName("pauseOnLeave") + self.readyPauseLayout.addWidget(self.pauseonleaveCheckbox) + self.readyLayout.addWidget(self.readyPauseGroup) + + # Unpausing + self.readyUnpauseGroup = QtGui.QGroupBox(getMessage("unpause-title")) + self.readyUnpauseLayout = QtGui.QVBoxLayout() + self.readyUnpauseGroup.setLayout(self.readyUnpauseLayout) + self.readyUnpauseButtonGroup = QButtonGroup() + self.unpauseIfAlreadyReadyOption = QRadioButton(getMessage("unpause-ifalreadyready-option")) + self.readyUnpauseButtonGroup.addButton(self.unpauseIfAlreadyReadyOption) + self.unpauseIfAlreadyReadyOption.setStyleSheet(constants.STYLE_SUBCHECKBOX.format(self.posixresourcespath + "chevrons_right.png")) + self.unpauseIfAlreadyReadyOption.setObjectName("unpause-ifalreadyready" + constants.CONFIG_NAME_MARKER + "unpauseAction" + constants.CONFIG_VALUE_MARKER + constants.UNPAUSE_IFALREADYREADY_MODE) + self.readyUnpauseLayout.addWidget(self.unpauseIfAlreadyReadyOption) + self.unpauseIfOthersReadyOption = QRadioButton(getMessage("unpause-ifothersready-option")) + self.readyUnpauseButtonGroup.addButton(self.unpauseIfOthersReadyOption) + self.unpauseIfOthersReadyOption.setStyleSheet(constants.STYLE_SUBCHECKBOX.format(self.posixresourcespath + "chevrons_right.png")) + self.unpauseIfOthersReadyOption.setObjectName("unpause-ifothersready" + constants.CONFIG_NAME_MARKER + "unpauseAction" + constants.CONFIG_VALUE_MARKER + constants.UNPAUSE_IFOTHERSREADY_MODE) + self.readyUnpauseLayout.addWidget(self.unpauseIfOthersReadyOption) + self.unpauseIfMinUsersReadyOption = QRadioButton(getMessage("unpause-ifminusersready-option")) + self.readyUnpauseButtonGroup.addButton(self.unpauseIfMinUsersReadyOption) + self.unpauseIfMinUsersReadyOption.setStyleSheet(constants.STYLE_SUBCHECKBOX.format(self.posixresourcespath + "chevrons_right.png")) + self.unpauseIfMinUsersReadyOption.setObjectName("unpause-ifminusersready" + constants.CONFIG_NAME_MARKER + "unpauseAction" + constants.CONFIG_VALUE_MARKER + constants.UNPAUSE_IFMINUSERSREADY_MODE) + self.readyUnpauseLayout.addWidget(self.unpauseIfMinUsersReadyOption) + self.unpauseAlwaysUnpauseOption = QRadioButton(getMessage("unpause-always")) + self.readyUnpauseButtonGroup.addButton(self.unpauseAlwaysUnpauseOption) + self.unpauseAlwaysUnpauseOption.setStyleSheet(constants.STYLE_SUBCHECKBOX.format(self.posixresourcespath + "chevrons_right.png")) + self.unpauseAlwaysUnpauseOption.setObjectName("unpause-always" + constants.CONFIG_NAME_MARKER + "unpauseAction" + constants.CONFIG_VALUE_MARKER + constants.UNPAUSE_ALWAYS_MODE) + self.readyUnpauseLayout.addWidget(self.unpauseAlwaysUnpauseOption) + self.readyLayout.addWidget(self.readyUnpauseGroup) + + self.readyLayout.setAlignment(Qt.AlignTop) + self.stackedLayout.addWidget(self.readyFrame) + def addMiscTab(self): self.miscFrame = QtGui.QFrame() self.miscLayout = QtGui.QVBoxLayout() @@ -469,18 +523,6 @@ class ConfigDialog(QtGui.QDialog): self.coreSettingsLayout = QtGui.QGridLayout() self.coreSettingsGroup.setLayout(self.coreSettingsLayout) - self.pauseonleaveCheckbox = QCheckBox(getMessage("pauseonleave-label")) - self.pauseonleaveCheckbox.setObjectName("pauseOnLeave") - self.coreSettingsLayout.addWidget(self.pauseonleaveCheckbox, 0, 0, 1, 4) - - self.alwaysUnpauseCheckbox = QCheckBox(getMessage("alwaysunpause-label")) - self.alwaysUnpauseCheckbox.setObjectName("alwaysUnpause") - self.coreSettingsLayout.addWidget(self.alwaysUnpauseCheckbox, 1, 0, 1, 4) - - self.readyatstartCheckbox = QCheckBox(getMessage("readyatstart-label")) - self.readyatstartCheckbox.setObjectName("readyAtStart") - self.coreSettingsLayout.addWidget(self.readyatstartCheckbox, 2, 0, 1, 4) - ### Privacy: self.filenameprivacyLabel = QLabel(getMessage("filename-privacy-label"), self) @@ -727,9 +769,10 @@ class ConfigDialog(QtGui.QDialog): self.tabListFrame = QtGui.QFrame() self.tabListWidget = QtGui.QListWidget() self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + "house.png"),getMessage("basics-label"))) - self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + "cog.png"),getMessage("misc-label"))) + self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + "control_pause_blue.png"),getMessage("readiness-label"))) self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + "film_link.png"),getMessage("sync-label"))) self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + "comments.png"),getMessage("messages-label"))) + self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + "cog.png"),getMessage("misc-label"))) self.tabListLayout.addWidget(self.tabListWidget) self.tabListFrame.setLayout(self.tabListLayout) self.tabListFrame.setFixedWidth(self.tabListFrame.minimumSizeHint().width()) @@ -814,9 +857,10 @@ class ConfigDialog(QtGui.QDialog): self.mainLayout.setContentsMargins(0,0,0,0) self.addBasicTab() - self.addMiscTab() + self.addReadinessTab() self.addSyncTab() self.addMessageTab() + self.addMiscTab() self.tabList() self.mainLayout.addWidget(self.stackedFrame, 0, 1)