Merged qtpy-pyside1 in master_local

This commit is contained in:
alby128 2017-11-21 09:56:32 +01:00
commit 7726d02068
13 changed files with 2183 additions and 440 deletions

View File

@ -6,7 +6,7 @@ branches:
- master_local - master_local
script: script:
- python buildPy2app.py py2app - python buildPy2app.py py2app fix
before_install: before_install:
- brew install python - brew install python
@ -16,6 +16,7 @@ before_install:
install: install:
- export PATH=/usr/local/bin:$PATH - export PATH=/usr/local/bin:$PATH
- export QT_PREFERRED_BINDING="PySide"
- pip install twisted appnope pyobjc py2app - pip install twisted appnope pyobjc py2app
before_deploy: before_deploy:

View File

@ -5,17 +5,21 @@ Usage:
python setup.py py2app python setup.py py2app
""" """
from setuptools import setup from setuptools import setup, Command
from glob import glob from glob import glob
import shutil
import syncplay import syncplay
cmdlist = {}
APP = ['syncplayClient.py'] APP = ['syncplayClient.py']
DATA_FILES = [ DATA_FILES = [
('resources', glob('resources/*.png') + glob('resources/*.rtf')), ('resources', glob('resources/*.png') + glob('resources/*.rtf')),
] ]
OPTIONS = { OPTIONS = {
'iconfile':'resources/icon.icns', 'iconfile':'resources/icon.icns',
'plist': { 'includes': {'PySide.QtCore', 'PySide.QtUiTools', 'PySide.QtGui'},
'plist': {
'CFBundleName':'Syncplay', 'CFBundleName':'Syncplay',
'CFBundleShortVersionString':syncplay.version, 'CFBundleShortVersionString':syncplay.version,
'CFBundleIdentifier':'pl.syncplay.Syncplay', 'CFBundleIdentifier':'pl.syncplay.Syncplay',
@ -23,10 +27,32 @@ OPTIONS = {
} }
} }
class Fix(Command):
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def trim_packages(self):
"""Remove big files in external dependencies that Syncplay doesn't need"""
shutil.rmtree('dist/Syncplay.app/Contents/Frameworks/QtDesigner.framework', ignore_errors=True)
shutil.rmtree('dist/Syncplay.app/Contents/Frameworks/QtScript.framework', ignore_errors=True)
shutil.rmtree('dist/Syncplay.app/Contents/Frameworks/QtXml.framework', ignore_errors=True)
def run(self):
self.trim_packages()
cmdlist['fix'] = Fix
setup( setup(
app=APP, app=APP,
name='Syncplay', name='Syncplay',
data_files=DATA_FILES, data_files=DATA_FILES,
options={'py2app': OPTIONS}, options={'py2app': OPTIONS},
setup_requires=['py2app'], setup_requires=['py2app'],
cmdclass=cmdlist
) )

0
buildPy2exe.py Normal file → Executable file
View File

View File

@ -8,6 +8,22 @@
\f0\fs24 \cf0 Syncplay relies on the following softwares, in compliance with their licenses. \ \f0\fs24 \cf0 Syncplay relies on the following softwares, in compliance with their licenses. \
\ \
\b Qt.py
\b0 \
\
Copyright (c) 2016 Marcus Ottosson\
\
Permission is hereby granted, free of charge, to any person obtaining a copy\
of this software and associated documentation files (the "Software"), to deal\
in the Software without restriction, including without limitation the rights\
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\
copies of the Software, and to permit persons to whom the Software is\
furnished to do so, subject to the following conditions:\
\
The above copyright notice and this permission notice shall be included in all\
copies or substantial portions of the Software.\
\
\b PySide\ \b PySide\
\b0 \ \b0 \
@ -97,8 +113,7 @@ The above copyright notice and this permission notice shall be\
included in all copies or substantial portions of the Software.\ included in all copies or substantial portions of the Software.\
\b \ \b \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 Qt 4\
\cf0 Qt 4\
\ \
\b0 Copyright (C) 2015 The Qt Company Ltd.\ \b0 Copyright (C) 2015 The Qt Company Ltd.\
@ -119,8 +134,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\b \cf0 \ \b \cf0 \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 appnope\
\cf0 appnope\
\b0 \ \b0 \
Copyright (c) 2013, Min Ragan-Kelley\ Copyright (c) 2013, Min Ragan-Kelley\
@ -143,11 +157,9 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\b \cf0 \ \b \
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 PyObjC\
\cf0 PyObjC\
\b0 \ \b0 \
Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al.\ Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al.\

View File

@ -286,7 +286,7 @@ de = {
#About dialog - TODO: Translate #About dialog - TODO: Translate
"about-menu-label": u"&About Syncplay", "about-menu-label": u"&About Syncplay",
"about-dialog-title": u"About Syncplay", "about-dialog-title": u"About Syncplay",
"about-dialog-release": u"Version {} release {}", "about-dialog-release": u"Version {} release {} on {}",
"about-dialog-license-text" : u"Licensed under the Apache&nbsp;License,&nbsp;Version 2.0", "about-dialog-license-text" : u"Licensed under the Apache&nbsp;License,&nbsp;Version 2.0",
"about-dialog-license-button": u"License", "about-dialog-license-button": u"License",
"about-dialog-dependencies": u"Dependencies", "about-dialog-dependencies": u"Dependencies",

View File

@ -286,7 +286,7 @@ en = {
#About dialog #About dialog
"about-menu-label": u"&About Syncplay", "about-menu-label": u"&About Syncplay",
"about-dialog-title": u"About Syncplay", "about-dialog-title": u"About Syncplay",
"about-dialog-release": u"Version {} release {}", "about-dialog-release": u"Version {} release {} on {}",
"about-dialog-license-text" : u"Licensed under the Apache&nbsp;License,&nbsp;Version 2.0", "about-dialog-license-text" : u"Licensed under the Apache&nbsp;License,&nbsp;Version 2.0",
"about-dialog-license-button": u"License", "about-dialog-license-button": u"License",
"about-dialog-dependencies": u"Dependencies", "about-dialog-dependencies": u"Dependencies",

View File

@ -288,7 +288,7 @@ ru = {
#About dialog - TODO: Translate #About dialog - TODO: Translate
"about-menu-label": u"&About Syncplay", "about-menu-label": u"&About Syncplay",
"about-dialog-title": u"About Syncplay", "about-dialog-title": u"About Syncplay",
"about-dialog-release": u"Version {} release {}", "about-dialog-release": u"Version {} release {} on {}",
"about-dialog-license-text" : u"Licensed under the Apache&nbsp;License,&nbsp;Version 2.0", "about-dialog-license-text" : u"Licensed under the Apache&nbsp;License,&nbsp;Version 2.0",
"about-dialog-license-button": u"License", "about-dialog-license-button": u"License",
"about-dialog-dependencies": u"Dependencies", "about-dialog-dependencies": u"Dependencies",

View File

@ -403,15 +403,17 @@ class ConfigurationGetter(object):
self._overrideConfigWithArgs(args) self._overrideConfigWithArgs(args)
if not self._config['noGui']: if not self._config['noGui']:
try: try:
from PySide import QtGui # @UnresolvedImport from syncplay.vendor.Qt import QtWidgets, IsPySide, IsPySide2
from PySide.QtCore import QCoreApplication from syncplay.vendor.Qt.QtCore import QCoreApplication
from syncplay.vendor import qt4reactor from syncplay.vendor import qt5reactor
if QCoreApplication.instance() is None: if not (IsPySide2 or IsPySide):
self.app = QtGui.QApplication(sys.argv) raise ImportError
qt4reactor.install() if QCoreApplication.instance() is None:
if sys.platform.startswith('darwin'): self.app = QtWidgets.QApplication(sys.argv)
import appnope qt5reactor.install()
appnope.nope() if sys.platform.startswith('darwin'):
import appnope
appnope.nope()
except ImportError: except ImportError:
print getMessage("unable-import-gui-error") print getMessage("unable-import-gui-error")
self._config['noGui'] = True self._config['noGui'] = True

220
syncplay/ui/GuiConfiguration.py Normal file → Executable file
View File

@ -1,6 +1,9 @@
from PySide import QtCore, QtGui from syncplay.vendor.Qt import QtCore, QtWidgets, QtGui, __binding__, IsPySide, IsPySide2
from PySide.QtCore import QSettings, Qt, QCoreApplication, QUrl from syncplay.vendor.Qt.QtCore import Qt, QSettings, QCoreApplication, QSize, QPoint, QUrl, QLine
from PySide.QtGui import QApplication, QLineEdit, QCursor, QLabel, QCheckBox, QDesktopServices, QIcon, QImage, QButtonGroup, QRadioButton, QDoubleSpinBox, QPlainTextEdit from syncplay.vendor.Qt.QtWidgets import QApplication, QLineEdit, QLabel, QCheckBox, QButtonGroup, QRadioButton, QDoubleSpinBox, QPlainTextEdit
from syncplay.vendor.Qt.QtGui import QCursor, QIcon, QImage, QDesktopServices
if IsPySide2:
from PySide2.QtCore import QStandardPaths
from syncplay.players.playerFactory import PlayerFactory from syncplay.players.playerFactory import PlayerFactory
from datetime import datetime from datetime import datetime
from syncplay import utils from syncplay import utils
@ -19,7 +22,7 @@ class GuiConfiguration:
def run(self): def run(self):
if QCoreApplication.instance() is None: if QCoreApplication.instance() is None:
self.app = QtGui.QApplication(sys.argv) self.app = QtWidgets.QApplication(sys.argv)
dialog = ConfigDialog(self.config, self._availablePlayerPaths, self.error, self.defaultConfig) dialog = ConfigDialog(self.config, self._availablePlayerPaths, self.error, self.defaultConfig)
dialog.exec_() dialog.exec_()
@ -65,22 +68,22 @@ class GetPlayerIconThread(threading.Thread, QtCore.QObject):
self.done.emit(iconpath, playerpath) self.done.emit(iconpath, playerpath)
class ConfigDialog(QtGui.QDialog): class ConfigDialog(QtWidgets.QDialog):
pressedclosebutton = True pressedclosebutton = True
moreToggling = False moreToggling = False
def automaticUpdatePromptCheck(self): def automaticUpdatePromptCheck(self):
if self.automaticupdatesCheckbox.checkState() == Qt.PartiallyChecked: if self.automaticupdatesCheckbox.checkState() == Qt.PartiallyChecked:
reply = QtGui.QMessageBox.question(self, "Syncplay", reply = QtWidgets.QMessageBox.question(self, "Syncplay",
getMessage("promptforupdate-label"), QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No) getMessage("promptforupdate-label"), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
if reply == QtGui.QMessageBox.Yes: if reply == QtWidgets.QMessageBox.Yes:
self.automaticupdatesCheckbox.setChecked(True) self.automaticupdatesCheckbox.setChecked(True)
else: else:
self.automaticupdatesCheckbox.setChecked(False) self.automaticupdatesCheckbox.setChecked(False)
def moreToggled(self): def moreToggled(self):
self.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
if self.moreToggling == False: if self.moreToggling == False:
self.moreToggling = True self.moreToggling = True
@ -220,10 +223,10 @@ class ConfigDialog(QtGui.QDialog):
def languageChanged(self): def languageChanged(self):
setLanguage(unicode(self.languageCombobox.itemData(self.languageCombobox.currentIndex()))) setLanguage(unicode(self.languageCombobox.itemData(self.languageCombobox.currentIndex())))
QtGui.QMessageBox.information(self, "Syncplay", getMessage("language-changed-msgbox-label")) QtWidgets.QMessageBox.information(self, "Syncplay", getMessage("language-changed-msgbox-label"))
def browsePlayerpath(self): def browsePlayerpath(self):
options = QtGui.QFileDialog.Options() options = QtWidgets.QFileDialog.Options()
defaultdirectory = "" defaultdirectory = ""
browserfilter = "All files (*)" browserfilter = "All files (*)"
@ -242,7 +245,7 @@ class ConfigDialog(QtGui.QDialog):
elif "bsd" in sys.platform or sys.platform.startswith('dragonfly'): elif "bsd" in sys.platform or sys.platform.startswith('dragonfly'):
defaultdirectory = "/usr/local/bin" defaultdirectory = "/usr/local/bin"
fileName, filtr = QtGui.QFileDialog.getOpenFileName(self, fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self,
"Browse for media player executable", "Browse for media player executable",
defaultdirectory, defaultdirectory,
browserfilter, "", options) browserfilter, "", options)
@ -285,13 +288,13 @@ class ConfigDialog(QtGui.QDialog):
def loadLastUpdateCheckDate(self): def loadLastUpdateCheckDate(self):
settings = QSettings("Syncplay", "Interface") settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update") settings.beginGroup("Update")
self.lastCheckedForUpdates = settings.value("lastChecked", None) self.lastCheckedForUpdates = settings.value("lastCheckedQt", None)
if self.lastCheckedForUpdates: if self.lastCheckedForUpdates:
if self.config["lastCheckedForUpdates"] is not None and self.config["lastCheckedForUpdates"] is not "": if self.config["lastCheckedForUpdates"] is not None and self.config["lastCheckedForUpdates"] is not "":
if self.lastCheckedForUpdates > datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f"): if self.lastCheckedForUpdates.toPython() > datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f"):
self.config["lastCheckedForUpdates"] = str(self.lastCheckedForUpdates) self.config["lastCheckedForUpdates"] = self.lastCheckedForUpdates.toString("yyyy-MM-d HH:mm:ss.z")
else: else:
self.config["lastCheckedForUpdates"] = str(self.lastCheckedForUpdates) self.config["lastCheckedForUpdates"] = self.lastCheckedForUpdates.toString("yyyy-MM-d HH:mm:ss.z")
def loadSavedPublicServerList(self): def loadSavedPublicServerList(self):
settings = QSettings("Syncplay", "Interface") settings = QSettings("Syncplay", "Interface")
@ -346,23 +349,35 @@ class ConfigDialog(QtGui.QDialog):
self.hostCombobox.setEditText(currentServer) self.hostCombobox.setEditText(currentServer)
def showErrorMessage(self, errorMessage): def showErrorMessage(self, errorMessage):
QtGui.QMessageBox.warning(self, "Syncplay", errorMessage) QtWidgets.QMessageBox.warning(self, "Syncplay", errorMessage)
def browseMediapath(self): def browseMediapath(self):
self.loadMediaBrowseSettings() self.loadMediaBrowseSettings()
options = QtGui.QFileDialog.Options() options = QtWidgets.QFileDialog.Options()
if self.config["mediaSearchDirectories"] and os.path.isdir(self.config["mediaSearchDirectories"][0]): if IsPySide:
defaultdirectory = self.config["mediaSearchDirectories"][0] if self.config["mediaSearchDirectories"] and os.path.isdir(self.config["mediaSearchDirectories"][0]):
elif os.path.isdir(self.mediadirectory): defaultdirectory = self.config["mediaSearchDirectories"][0]
defaultdirectory = self.mediadirectory elif os.path.isdir(self.mediadirectory):
elif os.path.isdir(QDesktopServices.storageLocation(QDesktopServices.MoviesLocation)): defaultdirectory = self.mediadirectory
defaultdirectory = QDesktopServices.storageLocation(QDesktopServices.MoviesLocation) elif os.path.isdir(QDesktopServices.storageLocation(QDesktopServices.MoviesLocation)):
elif os.path.isdir(QDesktopServices.storageLocation(QDesktopServices.HomeLocation)): defaultdirectory = QDesktopServices.storageLocation(QDesktopServices.MoviesLocation)
defaultdirectory = QDesktopServices.storageLocation(QDesktopServices.HomeLocation) elif os.path.isdir(QDesktopServices.storageLocation(QDesktopServices.HomeLocation)):
else: defaultdirectory = QDesktopServices.storageLocation(QDesktopServices.HomeLocation)
defaultdirectory = "" else:
defaultdirectory = ""
elif IsPySide2:
if self.config["mediaSearchDirectories"] and os.path.isdir(self.config["mediaSearchDirectories"][0]):
defaultdirectory = self.config["mediaSearchDirectories"][0]
elif os.path.isdir(self.mediadirectory):
defaultdirectory = self.mediadirectory
elif os.path.isdir(QStandardPaths.standardLocations(QStandardPaths.MoviesLocation)[0]):
defaultdirectory = QStandardPaths.standardLocations(QStandardPaths.MoviesLocation)[0]
elif os.path.isdir(QStandardPaths.standardLocations(QStandardPaths.HomeLocation)[0]):
defaultdirectory = QStandardPaths.standardLocations(QStandardPaths.HomeLocation)[0]
else:
defaultdirectory = ""
browserfilter = "All files (*)" browserfilter = "All files (*)"
fileName, filtr = QtGui.QFileDialog.getOpenFileName(self, "Browse for media files", defaultdirectory, fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self, "Browse for media files", defaultdirectory,
browserfilter, "", options) browserfilter, "", options)
if fileName: if fileName:
self.mediapathTextbox.setText(os.path.normpath(fileName)) self.mediapathTextbox.setText(os.path.normpath(fileName))
@ -531,9 +546,9 @@ class ConfigDialog(QtGui.QDialog):
self.mediaSearchDirectories = self.config["mediaSearchDirectories"] self.mediaSearchDirectories = self.config["mediaSearchDirectories"]
self.trustedDomains = self.config["trustedDomains"] self.trustedDomains = self.config["trustedDomains"]
self.connectionSettingsGroup = QtGui.QGroupBox(getMessage("connection-group-title")) self.connectionSettingsGroup = QtWidgets.QGroupBox(getMessage("connection-group-title"))
self.loadSavedPublicServerList() self.loadSavedPublicServerList()
self.hostCombobox = QtGui.QComboBox(self) self.hostCombobox = QtWidgets.QComboBox(self)
if self.publicServers: if self.publicServers:
i = 0 i = 0
for publicServer in self.publicServers: for publicServer in self.publicServers:
@ -548,7 +563,7 @@ class ConfigDialog(QtGui.QDialog):
self.hostCombobox.setEditText(host) self.hostCombobox.setEditText(host)
self.hostCombobox.setFixedWidth(165) self.hostCombobox.setFixedWidth(165)
self.hostLabel = QLabel(getMessage("host-label"), self) self.hostLabel = QLabel(getMessage("host-label"), self)
self.findServerButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'arrow_refresh.png'), getMessage("update-server-list-label")) self.findServerButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + 'arrow_refresh.png'), getMessage("update-server-list-label"))
self.findServerButton.clicked.connect(self.updateServerList) self.findServerButton.clicked.connect(self.updateServerList)
self.findServerButton.setToolTip(getMessage("update-server-list-tooltip")) self.findServerButton.setToolTip(getMessage("update-server-list-tooltip"))
self.usernameTextbox = QLineEdit(self) self.usernameTextbox = QLineEdit(self)
@ -575,7 +590,7 @@ class ConfigDialog(QtGui.QDialog):
self.usernameTextbox.setMaxLength(constants.MAX_USERNAME_LENGTH) self.usernameTextbox.setMaxLength(constants.MAX_USERNAME_LENGTH)
self.defaultroomTextbox.setMaxLength(constants.MAX_ROOM_NAME_LENGTH) self.defaultroomTextbox.setMaxLength(constants.MAX_ROOM_NAME_LENGTH)
self.connectionSettingsLayout = QtGui.QGridLayout() self.connectionSettingsLayout = QtWidgets.QGridLayout()
self.connectionSettingsLayout.addWidget(self.hostLabel, 0, 0) self.connectionSettingsLayout.addWidget(self.hostLabel, 0, 0)
self.connectionSettingsLayout.addWidget(self.hostCombobox, 0, 1) self.connectionSettingsLayout.addWidget(self.hostCombobox, 0, 1)
self.connectionSettingsLayout.addWidget(self.findServerButton, 0, 2) self.connectionSettingsLayout.addWidget(self.findServerButton, 0, 2)
@ -592,12 +607,12 @@ class ConfigDialog(QtGui.QDialog):
self.playerargsTextbox.textEdited.connect(self.changedPlayerArgs) self.playerargsTextbox.textEdited.connect(self.changedPlayerArgs)
self.playerargsLabel = QLabel(getMessage("player-arguments-label"), self) self.playerargsLabel = QLabel(getMessage("player-arguments-label"), self)
self.mediaplayerSettingsGroup = QtGui.QGroupBox(getMessage("media-setting-title")) self.mediaplayerSettingsGroup = QtWidgets.QGroupBox(getMessage("media-setting-title"))
self.executableiconImage = QtGui.QImage() self.executableiconImage = QtGui.QImage()
self.executableiconLabel = QLabel(self) self.executableiconLabel = QLabel(self)
self.executableiconLabel.setMinimumWidth(16) self.executableiconLabel.setMinimumWidth(16)
self.executableiconLabel.setAlignment(Qt.AlignRight | Qt.AlignVCenter) self.executableiconLabel.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.executablepathCombobox = QtGui.QComboBox(self) self.executablepathCombobox = QtWidgets.QComboBox(self)
self.executablepathCombobox.setEditable(True) self.executablepathCombobox.setEditable(True)
self.executablepathCombobox.currentIndexChanged.connect(self.updateExecutableIcon) self.executablepathCombobox.currentIndexChanged.connect(self.updateExecutableIcon)
self.executablepathCombobox.setEditText(self._tryToFillPlayerPath(config['playerPath'], playerpaths)) self.executablepathCombobox.setEditText(self._tryToFillPlayerPath(config['playerPath'], playerpaths))
@ -605,11 +620,11 @@ class ConfigDialog(QtGui.QDialog):
self.executablepathCombobox.editTextChanged.connect(self.updateExecutableIcon) self.executablepathCombobox.editTextChanged.connect(self.updateExecutableIcon)
self.executablepathLabel = QLabel(getMessage("executable-path-label"), self) self.executablepathLabel = QLabel(getMessage("executable-path-label"), self)
self.executablebrowseButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("browse-label")) self.executablebrowseButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("browse-label"))
self.executablebrowseButton.clicked.connect(self.browsePlayerpath) self.executablebrowseButton.clicked.connect(self.browsePlayerpath)
self.mediapathTextbox = QLineEdit(config['file'], self) self.mediapathTextbox = QLineEdit(config['file'], self)
self.mediapathLabel = QLabel(getMessage("media-path-label"), self) self.mediapathLabel = QLabel(getMessage("media-path-label"), self)
self.mediabrowseButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("browse-label")) self.mediabrowseButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + 'folder_explore.png'), getMessage("browse-label"))
self.mediabrowseButton.clicked.connect(self.browseMediapath) self.mediabrowseButton.clicked.connect(self.browseMediapath)
self.executablepathLabel.setObjectName("executable-path") self.executablepathLabel.setObjectName("executable-path")
@ -619,7 +634,7 @@ class ConfigDialog(QtGui.QDialog):
self.playerargsLabel.setObjectName("player-arguments") self.playerargsLabel.setObjectName("player-arguments")
self.playerargsTextbox.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "player-arguments") self.playerargsTextbox.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "player-arguments")
self.mediaplayerSettingsLayout = QtGui.QGridLayout() self.mediaplayerSettingsLayout = QtWidgets.QGridLayout()
self.mediaplayerSettingsLayout.addWidget(self.executablepathLabel, 0, 0) self.mediaplayerSettingsLayout.addWidget(self.executablepathLabel, 0, 0)
self.mediaplayerSettingsLayout.addWidget(self.executableiconLabel, 0, 1) self.mediaplayerSettingsLayout.addWidget(self.executableiconLabel, 0, 1)
self.mediaplayerSettingsLayout.addWidget(self.executablepathCombobox, 0, 2) self.mediaplayerSettingsLayout.addWidget(self.executablepathCombobox, 0, 2)
@ -634,8 +649,8 @@ class ConfigDialog(QtGui.QDialog):
self.showmoreCheckbox = QCheckBox(getMessage("more-title")) self.showmoreCheckbox = QCheckBox(getMessage("more-title"))
self.showmoreCheckbox.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "more") self.showmoreCheckbox.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "more")
self.basicOptionsFrame = QtGui.QFrame() self.basicOptionsFrame = QtWidgets.QFrame()
self.basicOptionsLayout = QtGui.QVBoxLayout() self.basicOptionsLayout = QtWidgets.QVBoxLayout()
if error: if error:
self.errorLabel = QLabel(self) self.errorLabel = QLabel(self)
if error[:1] != constants.ERROR_MESSAGE_MARKER: if error[:1] != constants.ERROR_MESSAGE_MARKER:
@ -651,19 +666,19 @@ class ConfigDialog(QtGui.QDialog):
self.basicOptionsLayout.addWidget(self.connectionSettingsGroup) self.basicOptionsLayout.addWidget(self.connectionSettingsGroup)
self.basicOptionsLayout.addSpacing(5) self.basicOptionsLayout.addSpacing(5)
self.basicOptionsLayout.addWidget(self.mediaplayerSettingsGroup) self.basicOptionsLayout.addWidget(self.mediaplayerSettingsGroup)
self.basicOptionsFrame.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) self.basicOptionsFrame.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
self.basicOptionsFrame.setLayout(self.basicOptionsLayout) self.basicOptionsFrame.setLayout(self.basicOptionsLayout)
self.stackedLayout.addWidget(self.basicOptionsFrame) self.stackedLayout.addWidget(self.basicOptionsFrame)
def addReadinessTab(self): def addReadinessTab(self):
self.readyFrame = QtGui.QFrame() self.readyFrame = QtWidgets.QFrame()
self.readyLayout = QtGui.QVBoxLayout() self.readyLayout = QtWidgets.QVBoxLayout()
self.readyFrame.setLayout(self.readyLayout) self.readyFrame.setLayout(self.readyLayout)
# Initial state # Initial state
self.readyInitialGroup = QtGui.QGroupBox(getMessage("readiness-title")) self.readyInitialGroup = QtWidgets.QGroupBox(getMessage("readiness-title"))
self.readyInitialLayout = QtGui.QVBoxLayout() self.readyInitialLayout = QtWidgets.QVBoxLayout()
self.readyInitialGroup.setLayout(self.readyInitialLayout) self.readyInitialGroup.setLayout(self.readyInitialLayout)
self.readyatstartCheckbox = QCheckBox(getMessage("readyatstart-label")) self.readyatstartCheckbox = QCheckBox(getMessage("readyatstart-label"))
self.readyatstartCheckbox.setObjectName("readyAtStart") self.readyatstartCheckbox.setObjectName("readyAtStart")
@ -671,8 +686,8 @@ class ConfigDialog(QtGui.QDialog):
self.readyLayout.addWidget(self.readyInitialGroup) self.readyLayout.addWidget(self.readyInitialGroup)
# Automatically pausing # Automatically pausing
self.readyPauseGroup = QtGui.QGroupBox(getMessage("pausing-title")) self.readyPauseGroup = QtWidgets.QGroupBox(getMessage("pausing-title"))
self.readyPauseLayout = QtGui.QVBoxLayout() self.readyPauseLayout = QtWidgets.QVBoxLayout()
self.readyPauseGroup.setLayout(self.readyPauseLayout) self.readyPauseGroup.setLayout(self.readyPauseLayout)
self.pauseonleaveCheckbox = QCheckBox(getMessage("pauseonleave-label")) self.pauseonleaveCheckbox = QCheckBox(getMessage("pauseonleave-label"))
self.pauseonleaveCheckbox.setObjectName("pauseOnLeave") self.pauseonleaveCheckbox.setObjectName("pauseOnLeave")
@ -680,8 +695,8 @@ class ConfigDialog(QtGui.QDialog):
self.readyLayout.addWidget(self.readyPauseGroup) self.readyLayout.addWidget(self.readyPauseGroup)
# Unpausing # Unpausing
self.readyUnpauseGroup = QtGui.QGroupBox(getMessage("unpause-title")) self.readyUnpauseGroup = QtWidgets.QGroupBox(getMessage("unpause-title"))
self.readyUnpauseLayout = QtGui.QVBoxLayout() self.readyUnpauseLayout = QtWidgets.QVBoxLayout()
self.readyUnpauseGroup.setLayout(self.readyUnpauseLayout) self.readyUnpauseGroup.setLayout(self.readyUnpauseLayout)
self.readyUnpauseButtonGroup = QButtonGroup() self.readyUnpauseButtonGroup = QButtonGroup()
self.unpauseIfAlreadyReadyOption = QRadioButton(getMessage("unpause-ifalreadyready-option")) self.unpauseIfAlreadyReadyOption = QRadioButton(getMessage("unpause-ifalreadyready-option"))
@ -710,12 +725,12 @@ class ConfigDialog(QtGui.QDialog):
self.stackedLayout.addWidget(self.readyFrame) self.stackedLayout.addWidget(self.readyFrame)
def addMiscTab(self): def addMiscTab(self):
self.miscFrame = QtGui.QFrame() self.miscFrame = QtWidgets.QFrame()
self.miscLayout = QtGui.QVBoxLayout() self.miscLayout = QtWidgets.QVBoxLayout()
self.miscFrame.setLayout(self.miscLayout) self.miscFrame.setLayout(self.miscLayout)
self.coreSettingsGroup = QtGui.QGroupBox(getMessage("core-behaviour-title")) self.coreSettingsGroup = QtWidgets.QGroupBox(getMessage("core-behaviour-title"))
self.coreSettingsLayout = QtGui.QGridLayout() self.coreSettingsLayout = QtWidgets.QGridLayout()
self.coreSettingsGroup.setLayout(self.coreSettingsLayout) self.coreSettingsGroup.setLayout(self.coreSettingsLayout)
### Privacy: ### Privacy:
@ -758,8 +773,8 @@ class ConfigDialog(QtGui.QDialog):
## Syncplay internals ## Syncplay internals
self.internalSettingsGroup = QtGui.QGroupBox(getMessage("syncplay-internals-title")) self.internalSettingsGroup = QtWidgets.QGroupBox(getMessage("syncplay-internals-title"))
self.internalSettingsLayout = QtGui.QVBoxLayout() self.internalSettingsLayout = QtWidgets.QVBoxLayout()
self.internalSettingsGroup.setLayout(self.internalSettingsLayout) self.internalSettingsGroup.setLayout(self.internalSettingsLayout)
self.alwaysshowCheckbox = QCheckBox(getMessage("forceguiprompt-label")) self.alwaysshowCheckbox = QCheckBox(getMessage("forceguiprompt-label"))
@ -772,13 +787,13 @@ class ConfigDialog(QtGui.QDialog):
## Media path directories ## Media path directories
self.mediasearchSettingsGroup = QtGui.QGroupBox(getMessage("syncplay-mediasearchdirectories-title")) self.mediasearchSettingsGroup = QtWidgets.QGroupBox(getMessage("syncplay-mediasearchdirectories-title"))
self.mediasearchSettingsLayout = QtGui.QVBoxLayout() self.mediasearchSettingsLayout = QtWidgets.QVBoxLayout()
self.mediasearchSettingsGroup.setLayout(self.mediasearchSettingsLayout) self.mediasearchSettingsGroup.setLayout(self.mediasearchSettingsLayout)
self.mediasearchTextEdit = QPlainTextEdit(utils.getListAsMultilineString(self.mediaSearchDirectories)) self.mediasearchTextEdit = QPlainTextEdit(utils.getListAsMultilineString(self.mediaSearchDirectories))
self.mediasearchTextEdit.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "mediasearcdirectories-arguments") self.mediasearchTextEdit.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "mediasearcdirectories-arguments")
self.mediasearchTextEdit.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) self.mediasearchTextEdit.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
self.mediasearchSettingsLayout.addWidget(self.mediasearchTextEdit) self.mediasearchSettingsLayout.addWidget(self.mediasearchTextEdit)
self.mediasearchSettingsGroup.setMaximumHeight(self.mediasearchSettingsGroup.minimumSizeHint().height()) self.mediasearchSettingsGroup.setMaximumHeight(self.mediasearchSettingsGroup.minimumSizeHint().height())
@ -789,12 +804,12 @@ class ConfigDialog(QtGui.QDialog):
self.stackedLayout.addWidget(self.miscFrame) self.stackedLayout.addWidget(self.miscFrame)
def addSyncTab(self): def addSyncTab(self):
self.syncSettingsFrame = QtGui.QFrame() self.syncSettingsFrame = QtWidgets.QFrame()
self.syncSettingsLayout = QtGui.QVBoxLayout() self.syncSettingsLayout = QtWidgets.QVBoxLayout()
self.desyncSettingsGroup = QtGui.QGroupBox(getMessage("sync-otherslagging-title")) self.desyncSettingsGroup = QtWidgets.QGroupBox(getMessage("sync-otherslagging-title"))
self.desyncOptionsFrame = QtGui.QFrame() self.desyncOptionsFrame = QtWidgets.QFrame()
self.desyncSettingsOptionsLayout = QtGui.QHBoxLayout() self.desyncSettingsOptionsLayout = QtWidgets.QHBoxLayout()
config = self.config config = self.config
self.slowdownCheckbox = QCheckBox(getMessage("slowondesync-label")) self.slowdownCheckbox = QCheckBox(getMessage("slowondesync-label"))
@ -804,9 +819,9 @@ class ConfigDialog(QtGui.QDialog):
self.fastforwardCheckbox = QCheckBox(getMessage("fastforwardondesync-label")) self.fastforwardCheckbox = QCheckBox(getMessage("fastforwardondesync-label"))
self.fastforwardCheckbox.setObjectName("fastforwardOnDesync") self.fastforwardCheckbox.setObjectName("fastforwardOnDesync")
self.desyncSettingsLayout = QtGui.QGridLayout() self.desyncSettingsLayout = QtWidgets.QGridLayout()
self.desyncSettingsLayout.setSpacing(2) self.desyncSettingsLayout.setSpacing(2)
self.desyncFrame = QtGui.QFrame() self.desyncFrame = QtWidgets.QFrame()
self.desyncFrame.setLineWidth(0) self.desyncFrame.setLineWidth(0)
self.desyncFrame.setMidLineWidth(0) self.desyncFrame.setMidLineWidth(0)
@ -819,9 +834,9 @@ class ConfigDialog(QtGui.QDialog):
self.desyncFrame.setLayout(self.syncSettingsLayout) self.desyncFrame.setLayout(self.syncSettingsLayout)
self.othersyncSettingsGroup = QtGui.QGroupBox(getMessage("sync-youlaggging-title")) self.othersyncSettingsGroup = QtWidgets.QGroupBox(getMessage("sync-youlaggging-title"))
self.othersyncOptionsFrame = QtGui.QFrame() self.othersyncOptionsFrame = QtWidgets.QFrame()
self.othersyncSettingsLayout = QtGui.QGridLayout() self.othersyncSettingsLayout = QtWidgets.QGridLayout()
self.dontslowwithmeCheckbox = QCheckBox(getMessage("dontslowdownwithme-label")) self.dontslowwithmeCheckbox = QCheckBox(getMessage("dontslowdownwithme-label"))
self.dontslowwithmeCheckbox.setObjectName("dontSlowDownWithMe") self.dontslowwithmeCheckbox.setObjectName("dontSlowDownWithMe")
@ -834,13 +849,13 @@ class ConfigDialog(QtGui.QDialog):
## Trusted domains ## Trusted domains
self.trusteddomainsSettingsGroup = QtGui.QGroupBox(getMessage("syncplay-trusteddomains-title")) self.trusteddomainsSettingsGroup = QtWidgets.QGroupBox(getMessage("syncplay-trusteddomains-title"))
self.trusteddomainsSettingsLayout = QtGui.QVBoxLayout() self.trusteddomainsSettingsLayout = QtWidgets.QVBoxLayout()
self.trusteddomainsSettingsGroup.setLayout(self.trusteddomainsSettingsLayout) self.trusteddomainsSettingsGroup.setLayout(self.trusteddomainsSettingsLayout)
self.trusteddomainsTextEdit = QPlainTextEdit(utils.getListAsMultilineString(self.trustedDomains)) self.trusteddomainsTextEdit = QPlainTextEdit(utils.getListAsMultilineString(self.trustedDomains))
self.trusteddomainsTextEdit.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "trusteddomains-arguments") self.trusteddomainsTextEdit.setObjectName(constants.LOAD_SAVE_MANUALLY_MARKER + "trusteddomains-arguments")
self.trusteddomainsTextEdit.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) self.trusteddomainsTextEdit.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
self.trusteddomainsSettingsLayout.addWidget(self.trusteddomainsTextEdit) self.trusteddomainsSettingsLayout.addWidget(self.trusteddomainsTextEdit)
self.trusteddomainsSettingsGroup.setMaximumHeight(self.trusteddomainsSettingsGroup.minimumSizeHint().height()) self.trusteddomainsSettingsGroup.setMaximumHeight(self.trusteddomainsSettingsGroup.minimumSizeHint().height())
@ -855,14 +870,14 @@ class ConfigDialog(QtGui.QDialog):
self.stackedLayout.addWidget(self.syncSettingsFrame) self.stackedLayout.addWidget(self.syncSettingsFrame)
def addMessageTab(self): def addMessageTab(self):
self.messageFrame = QtGui.QFrame() self.messageFrame = QtWidgets.QFrame()
self.messageLayout = QtGui.QVBoxLayout() self.messageLayout = QtWidgets.QVBoxLayout()
self.messageLayout.setAlignment(Qt.AlignTop) self.messageLayout.setAlignment(Qt.AlignTop)
# OSD # OSD
self.osdSettingsGroup = QtGui.QGroupBox(getMessage("messages-osd-title")) self.osdSettingsGroup = QtWidgets.QGroupBox(getMessage("messages-osd-title"))
self.osdSettingsLayout = QtGui.QVBoxLayout() self.osdSettingsLayout = QtWidgets.QVBoxLayout()
self.osdSettingsFrame = QtGui.QFrame() self.osdSettingsFrame = QtWidgets.QFrame()
self.showOSDCheckbox = QCheckBox(getMessage("showosd-label")) self.showOSDCheckbox = QCheckBox(getMessage("showosd-label"))
self.showOSDCheckbox.setObjectName("showOSD") self.showOSDCheckbox.setObjectName("showOSD")
@ -902,23 +917,23 @@ class ConfigDialog(QtGui.QDialog):
# Other display # Other display
self.displaySettingsGroup = QtGui.QGroupBox(getMessage("messages-other-title")) self.displaySettingsGroup = QtWidgets.QGroupBox(getMessage("messages-other-title"))
self.displaySettingsLayout = QtGui.QVBoxLayout() self.displaySettingsLayout = QtWidgets.QVBoxLayout()
self.displaySettingsLayout.setAlignment(Qt.AlignTop & Qt.AlignLeft) self.displaySettingsLayout.setAlignment(Qt.AlignTop & Qt.AlignLeft)
self.displaySettingsFrame = QtGui.QFrame() self.displaySettingsFrame = QtWidgets.QFrame()
self.showDurationNotificationCheckbox = QCheckBox(getMessage("showdurationnotification-label")) self.showDurationNotificationCheckbox = QCheckBox(getMessage("showdurationnotification-label"))
self.showDurationNotificationCheckbox.setObjectName("showDurationNotification") self.showDurationNotificationCheckbox.setObjectName("showDurationNotification")
self.displaySettingsLayout.addWidget(self.showDurationNotificationCheckbox) self.displaySettingsLayout.addWidget(self.showDurationNotificationCheckbox)
self.languageFrame = QtGui.QFrame() self.languageFrame = QtWidgets.QFrame()
self.languageLayout = QtGui.QHBoxLayout() self.languageLayout = QtWidgets.QHBoxLayout()
self.languageLayout.setContentsMargins(0, 0, 0, 0) self.languageLayout.setContentsMargins(0, 0, 0, 0)
self.languageFrame.setLayout(self.languageLayout) self.languageFrame.setLayout(self.languageLayout)
self.languageFrame.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) self.languageFrame.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
self.languageLayout.setAlignment(Qt.AlignTop & Qt.AlignLeft) self.languageLayout.setAlignment(Qt.AlignTop & Qt.AlignLeft)
self.languageLabel = QLabel(getMessage("language-label"), self) self.languageLabel = QLabel(getMessage("language-label"), self)
self.languageCombobox = QtGui.QComboBox(self) self.languageCombobox = QtWidgets.QComboBox(self)
self.languageCombobox.addItem(getMessage("automatic-language").format(getMessage("LANGUAGE", getInitialLanguage()))) self.languageCombobox.addItem(getMessage("automatic-language").format(getMessage("LANGUAGE", getInitialLanguage())))
self.languages = getLanguages() self.languages = getLanguages()
@ -948,22 +963,22 @@ class ConfigDialog(QtGui.QDialog):
config = self.config config = self.config
resourcespath = self.resourcespath resourcespath = self.resourcespath
self.bottomButtonFrame = QtGui.QFrame() self.bottomButtonFrame = QtWidgets.QFrame()
self.bottomButtonLayout = QtGui.QHBoxLayout() self.bottomButtonLayout = QtWidgets.QHBoxLayout()
self.helpButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + u'help.png'), getMessage("help-label")) self.helpButton = QtWidgets.QPushButton(QtGui.QIcon(self.resourcespath + u'help.png'), getMessage("help-label"))
self.helpButton.setObjectName("help") self.helpButton.setObjectName("help")
self.helpButton.setMaximumSize(self.helpButton.sizeHint()) self.helpButton.setMaximumSize(self.helpButton.sizeHint())
self.helpButton.pressed.connect(self.openHelp) self.helpButton.pressed.connect(self.openHelp)
self.resetButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + u'cog_delete.png'),getMessage("reset-label")) self.resetButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + u'cog_delete.png'),getMessage("reset-label"))
self.resetButton.setMaximumSize(self.resetButton.sizeHint()) self.resetButton.setMaximumSize(self.resetButton.sizeHint())
self.resetButton.setObjectName("reset") self.resetButton.setObjectName("reset")
self.resetButton.pressed.connect(self.resetSettings) self.resetButton.pressed.connect(self.resetSettings)
self.runButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + u'accept.png'), getMessage("run-label")) self.runButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + u'accept.png'), getMessage("run-label"))
self.runButton.pressed.connect(self._runWithoutStoringConfig) self.runButton.pressed.connect(self._runWithoutStoringConfig)
self.runButton.setToolTip(getMessage("nostore-tooltip")) self.runButton.setToolTip(getMessage("nostore-tooltip"))
self.storeAndRunButton = QtGui.QPushButton(QtGui.QIcon(resourcespath + u'accept.png'), getMessage("storeandrun-label")) self.storeAndRunButton = QtWidgets.QPushButton(QtGui.QIcon(resourcespath + u'accept.png'), getMessage("storeandrun-label"))
self.storeAndRunButton.pressed.connect(self._saveDataAndLeave) self.storeAndRunButton.pressed.connect(self._saveDataAndLeave)
self.bottomButtonLayout.addWidget(self.helpButton) self.bottomButtonLayout.addWidget(self.helpButton)
self.bottomButtonLayout.addWidget(self.resetButton) self.bottomButtonLayout.addWidget(self.resetButton)
@ -973,9 +988,9 @@ class ConfigDialog(QtGui.QDialog):
self.bottomButtonLayout.setContentsMargins(5,0,5,0) self.bottomButtonLayout.setContentsMargins(5,0,5,0)
self.mainLayout.addWidget(self.bottomButtonFrame, 1, 0, 1, 2) self.mainLayout.addWidget(self.bottomButtonFrame, 1, 0, 1, 2)
self.bottomCheckboxFrame = QtGui.QFrame() self.bottomCheckboxFrame = QtWidgets.QFrame()
self.bottomCheckboxFrame.setContentsMargins(0,0,0,0) self.bottomCheckboxFrame.setContentsMargins(0,0,0,0)
self.bottomCheckboxLayout = QtGui.QGridLayout() self.bottomCheckboxLayout = QtWidgets.QGridLayout()
self.alwaysshowCheckbox = QCheckBox(getMessage("forceguiprompt-label")) self.alwaysshowCheckbox = QCheckBox(getMessage("forceguiprompt-label"))
self.enableplaylistsCheckbox = QCheckBox(getMessage("sharedplaylistenabled-label")) self.enableplaylistsCheckbox = QCheckBox(getMessage("sharedplaylistenabled-label"))
@ -988,14 +1003,14 @@ class ConfigDialog(QtGui.QDialog):
self.mainLayout.addWidget(self.bottomCheckboxFrame, 2, 0, 1, 2) self.mainLayout.addWidget(self.bottomCheckboxFrame, 2, 0, 1, 2)
def tabList(self): def tabList(self):
self.tabListLayout = QtGui.QHBoxLayout() self.tabListLayout = QtWidgets.QHBoxLayout()
self.tabListFrame = QtGui.QFrame() self.tabListFrame = QtWidgets.QFrame()
self.tabListWidget = QtGui.QListWidget() self.tabListWidget = QtWidgets.QListWidget()
self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"house.png"),getMessage("basics-label"))) self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"house.png"),getMessage("basics-label")))
self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"control_pause_blue.png"),getMessage("readiness-label"))) self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"control_pause_blue.png"),getMessage("readiness-label")))
self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"film_link.png"),getMessage("sync-label"))) self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"film_link.png"),getMessage("sync-label")))
self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"comments.png"),getMessage("messages-label"))) self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"comments.png"),getMessage("messages-label")))
self.tabListWidget.addItem(QtGui.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"cog.png"),getMessage("misc-label"))) self.tabListWidget.addItem(QtWidgets.QListWidgetItem(QtGui.QIcon(self.resourcespath + u"cog.png"),getMessage("misc-label")))
self.tabListLayout.addWidget(self.tabListWidget) self.tabListLayout.addWidget(self.tabListWidget)
self.tabListFrame.setLayout(self.tabListLayout) self.tabListFrame.setLayout(self.tabListLayout)
self.tabListFrame.setFixedWidth(self.tabListFrame.minimumSizeHint().width() + constants.TAB_PADDING) self.tabListFrame.setFixedWidth(self.tabListFrame.minimumSizeHint().width() + constants.TAB_PADDING)
@ -1090,6 +1105,7 @@ class ConfigDialog(QtGui.QDialog):
self.config['clearGUIData'] = False self.config['clearGUIData'] = False
self.clearGUIData() self.clearGUIData()
self.QtWidgets = QtWidgets
self.QtGui = QtGui self.QtGui = QtGui
self.error = error self.error = error
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
@ -1105,11 +1121,11 @@ class ConfigDialog(QtGui.QDialog):
self.setWindowFlags(self.windowFlags() & Qt.WindowCloseButtonHint & ~Qt.WindowContextHelpButtonHint) self.setWindowFlags(self.windowFlags() & Qt.WindowCloseButtonHint & ~Qt.WindowContextHelpButtonHint)
self.setWindowIcon(QtGui.QIcon(resourcespath + u"syncplay.png")) self.setWindowIcon(QtGui.QIcon(resourcespath + u"syncplay.png"))
self.stackedLayout = QtGui.QStackedLayout() self.stackedLayout = QtWidgets.QStackedLayout()
self.stackedFrame = QtGui.QFrame() self.stackedFrame = QtWidgets.QFrame()
self.stackedFrame.setLayout(self.stackedLayout) self.stackedFrame.setLayout(self.stackedLayout)
self.mainLayout = QtGui.QGridLayout() self.mainLayout = QtWidgets.QGridLayout()
self.mainLayout.setSpacing(0) self.mainLayout.setSpacing(0)
self.mainLayout.setContentsMargins(0,0,0,0) self.mainLayout.setContentsMargins(0,0,0,0)

View File

@ -1,3 +1,9 @@
import os
if "QT_PREFERRED_BINDING" not in os.environ:
os.environ["QT_PREFERRED_BINDING"] = os.pathsep.join(
["PySide2", "PySide", "PyQt5", "PyQt4"]
)
try: try:
from syncplay.ui.gui import MainWindow as GraphicalUI from syncplay.ui.gui import MainWindow as GraphicalUI
except ImportError: except ImportError:

View File

@ -1,5 +1,8 @@
from PySide import QtGui from syncplay.vendor import Qt
from PySide.QtCore import Qt, QSettings, QSize, QPoint, QUrl, QLine from syncplay.vendor.Qt import QtWidgets, QtGui, __binding__, __binding_version__, IsPySide, IsPySide2
from syncplay.vendor.Qt.QtCore import Qt, QSettings, QSize, QPoint, QUrl, QLine, QDateTime
if IsPySide2:
from PySide2.QtCore import QStandardPaths
from syncplay import utils, constants, version, release_number from syncplay import utils, constants, version, release_number
from syncplay.messages import getMessage from syncplay.messages import getMessage
import sys import sys
@ -11,16 +14,16 @@ import os
from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider, formatSize, isURL from syncplay.utils import formatTime, sameFilename, sameFilesize, sameFileduration, RoomPasswordProvider, formatSize, isURL
from functools import wraps from functools import wraps
from twisted.internet import task from twisted.internet import task
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
from Foundation import NSURL from Foundation import NSURL
lastCheckedForUpdates = None lastCheckedForUpdates = None
class UserlistItemDelegate(QtGui.QStyledItemDelegate): class UserlistItemDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self): def __init__(self):
QtGui.QStyledItemDelegate.__init__(self) QtWidgets.QStyledItemDelegate.__init__(self)
def sizeHint(self, option, index): def sizeHint(self, option, index):
size = QtGui.QStyledItemDelegate.sizeHint(self, option, index) size = QtWidgets.QStyledItemDelegate.sizeHint(self, option, index)
if (index.column() == constants.USERLIST_GUI_USERNAME_COLUMN): if (index.column() == constants.USERLIST_GUI_USERNAME_COLUMN):
size.setWidth(size.width() + constants.USERLIST_GUI_USERNAME_OFFSET) size.setWidth(size.width() + constants.USERLIST_GUI_USERNAME_OFFSET)
return size return size
@ -84,9 +87,9 @@ class UserlistItemDelegate(QtGui.QStyledItemDelegate):
midY - 8, midY - 8,
streamSwitchIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio)) streamSwitchIconQPixmap.scaled(16, 16, Qt.KeepAspectRatio))
optionQStyleOptionViewItem.rect.setX(optionQStyleOptionViewItem.rect.x()+16) optionQStyleOptionViewItem.rect.setX(optionQStyleOptionViewItem.rect.x()+16)
QtGui.QStyledItemDelegate.paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex) QtWidgets.QStyledItemDelegate.paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex)
class AboutDialog(QtGui.QDialog): class AboutDialog(QtWidgets.QDialog):
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
resourcespath = utils.findWorkingDir() + u"\\resources\\" resourcespath = utils.findWorkingDir() + u"\\resources\\"
else: else:
@ -99,31 +102,31 @@ class AboutDialog(QtGui.QDialog):
else: else:
self.setWindowTitle(getMessage("about-dialog-title")) self.setWindowTitle(getMessage("about-dialog-title"))
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
nameLabel = QtGui.QLabel("<center><strong>Syncplay</strong></center>") nameLabel = QtWidgets.QLabel("<center><strong>Syncplay</strong></center>")
nameLabel.setFont(QtGui.QFont("Helvetica", 20)) nameLabel.setFont(QtGui.QFont("Helvetica", 20))
linkLabel = QtGui.QLabel("<center><a href=\"http://syncplay.pl\">syncplay.pl</a></center>") linkLabel = QtWidgets.QLabel("<center><a href=\"http://syncplay.pl\">syncplay.pl</a></center>")
linkLabel.setOpenExternalLinks(True) linkLabel.setOpenExternalLinks(True)
versionLabel = QtGui.QLabel("<center>" + getMessage("about-dialog-release").format(version, release_number) + "</center>") versionLabel = QtWidgets.QLabel("<center>" + getMessage("about-dialog-release").format(version, release_number, __binding__) + "</center>")
licenseLabel = QtGui.QLabel("<center><p>Copyright &copy; 2017 Syncplay</p><p>" + getMessage("about-dialog-license-text") + "</p></center>") licenseLabel = QtWidgets.QLabel("<center><p>Copyright &copy; 2017 Syncplay</p><p>" + getMessage("about-dialog-license-text") + "</p></center>")
aboutIconPixmap = QtGui.QPixmap(self.resourcespath + u"syncplay.png") aboutIconPixmap = QtGui.QPixmap(self.resourcespath + u"syncplay.png")
aboutIconLabel = QtGui.QLabel() aboutIconLabel = QtWidgets.QLabel()
aboutIconLabel.setPixmap(aboutIconPixmap.scaled(120, 120, Qt.KeepAspectRatio)) aboutIconLabel.setPixmap(aboutIconPixmap.scaled(120, 120, Qt.KeepAspectRatio))
aboutLayout = QtGui.QGridLayout() aboutLayout = QtWidgets.QGridLayout()
aboutLayout.addWidget(aboutIconLabel, 0, 0, 4, 2) aboutLayout.addWidget(aboutIconLabel, 0, 0, 4, 2)
aboutLayout.addWidget(nameLabel, 0, 2, 1, 2) aboutLayout.addWidget(nameLabel, 0, 2, 1, 2)
aboutLayout.addWidget(linkLabel, 1, 2, 1, 2) aboutLayout.addWidget(linkLabel, 1, 2, 1, 2)
aboutLayout.addWidget(versionLabel, 2, 2, 1, 2) aboutLayout.addWidget(versionLabel, 2, 2, 1, 2)
aboutLayout.addWidget(licenseLabel, 3, 2, 1, 2) aboutLayout.addWidget(licenseLabel, 3, 2, 1, 2)
licenseButton = QtGui.QPushButton(getMessage("about-dialog-license-button")) licenseButton = QtWidgets.QPushButton(getMessage("about-dialog-license-button"))
licenseButton.setAutoDefault(False) licenseButton.setAutoDefault(False)
licenseButton.clicked.connect(self.openLicense) licenseButton.clicked.connect(self.openLicense)
aboutLayout.addWidget(licenseButton, 4, 2) aboutLayout.addWidget(licenseButton, 4, 2)
dependenciesButton = QtGui.QPushButton(getMessage("about-dialog-dependencies")) dependenciesButton = QtWidgets.QPushButton(getMessage("about-dialog-dependencies"))
dependenciesButton.setAutoDefault(False) dependenciesButton.setAutoDefault(False)
dependenciesButton.clicked.connect(self.openDependencies) dependenciesButton.clicked.connect(self.openDependencies)
aboutLayout.addWidget(dependenciesButton, 4, 3) aboutLayout.addWidget(dependenciesButton, 4, 3)
aboutLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize) aboutLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
self.setSizeGripEnabled(False) self.setSizeGripEnabled(False)
self.setLayout(aboutLayout) self.setLayout(aboutLayout)
@ -139,7 +142,7 @@ class AboutDialog(QtGui.QDialog):
else: else:
QtGui.QDesktopServices.openUrl(QUrl("file://" + self.resourcespath + u"third-party-notices.rtf")) QtGui.QDesktopServices.openUrl(QUrl("file://" + self.resourcespath + u"third-party-notices.rtf"))
class MainWindow(QtGui.QMainWindow): class MainWindow(QtWidgets.QMainWindow):
insertPosition = None insertPosition = None
playlistState = [] playlistState = []
updatingPlaylist = False updatingPlaylist = False
@ -152,7 +155,7 @@ class MainWindow(QtGui.QMainWindow):
MainWindow.insertPosition = newPosition MainWindow.insertPosition = newPosition
self.playlist.forceUpdate() self.playlist.forceUpdate()
class PlaylistItemDelegate(QtGui.QStyledItemDelegate): class PlaylistItemDelegate(QtWidgets.QStyledItemDelegate):
def paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex): def paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex):
itemQPainter.save() itemQPainter.save()
currentQAbstractItemModel = indexQModelIndex.model() currentQAbstractItemModel = indexQModelIndex.model()
@ -170,7 +173,7 @@ class MainWindow(QtGui.QMainWindow):
currentlyplayingIconQPixmap.scaled(6, 16, Qt.KeepAspectRatio)) currentlyplayingIconQPixmap.scaled(6, 16, Qt.KeepAspectRatio))
optionQStyleOptionViewItem.rect.setX(optionQStyleOptionViewItem.rect.x()+10) optionQStyleOptionViewItem.rect.setX(optionQStyleOptionViewItem.rect.x()+10)
QtGui.QStyledItemDelegate.paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex) QtWidgets.QStyledItemDelegate.paint(self, itemQPainter, optionQStyleOptionViewItem, indexQModelIndex)
lineAbove = False lineAbove = False
lineBelow = False lineBelow = False
@ -186,7 +189,7 @@ class MainWindow(QtGui.QMainWindow):
itemQPainter.drawLine(line) itemQPainter.drawLine(line)
itemQPainter.restore() itemQPainter.restore()
class PlaylistGroupBox(QtGui.QGroupBox): class PlaylistGroupBox(QtWidgets.QGroupBox):
def dragEnterEvent(self, event): def dragEnterEvent(self, event):
data = event.mimeData() data = event.mimeData()
@ -216,10 +219,10 @@ class MainWindow(QtGui.QMainWindow):
indexRow = window.playlist.count() if window.clearedPlaylistNote else 0 indexRow = window.playlist.count() if window.clearedPlaylistNote else 0
for url in urls[::-1]: for url in urls[::-1]:
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
dropfilepath = os.path.abspath(NSURL.URLWithString_(str(url.toString())).filePathURL().path()) dropfilepath = os.path.abspath(NSURL.URLWithString_(str(url.toString())).filePathURL().path())
else: else:
dropfilepath = os.path.abspath(unicode(url.toLocalFile())) dropfilepath = os.path.abspath(unicode(url.toLocalFile()))
if os.path.isfile(dropfilepath): if os.path.isfile(dropfilepath):
window.addFileToPlaylist(dropfilepath, indexRow) window.addFileToPlaylist(dropfilepath, indexRow)
elif os.path.isdir(dropfilepath): elif os.path.isdir(dropfilepath):
@ -227,7 +230,7 @@ class MainWindow(QtGui.QMainWindow):
else: else:
super(MainWindow.PlaylistWidget, self).dropEvent(event) super(MainWindow.PlaylistWidget, self).dropEvent(event)
class PlaylistWidget(QtGui.QListWidget): class PlaylistWidget(QtWidgets.QListWidget):
selfWindow = None selfWindow = None
playlistIndexFilename = None playlistIndexFilename = None
@ -321,10 +324,10 @@ class MainWindow(QtGui.QMainWindow):
if indexRow == -1: if indexRow == -1:
indexRow = window.playlist.count() indexRow = window.playlist.count()
for url in urls[::-1]: for url in urls[::-1]:
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
dropfilepath = os.path.abspath(NSURL.URLWithString_(str(url.toString())).filePathURL().path()) dropfilepath = os.path.abspath(NSURL.URLWithString_(str(url.toString())).filePathURL().path())
else: else:
dropfilepath = os.path.abspath(unicode(url.toLocalFile())) dropfilepath = os.path.abspath(unicode(url.toLocalFile()))
if os.path.isfile(dropfilepath): if os.path.isfile(dropfilepath):
window.addFileToPlaylist(dropfilepath, indexRow) window.addFileToPlaylist(dropfilepath, indexRow)
elif os.path.isdir(dropfilepath): elif os.path.isdir(dropfilepath):
@ -334,17 +337,17 @@ class MainWindow(QtGui.QMainWindow):
class topSplitter(QtGui.QSplitter): class topSplitter(QtWidgets.QSplitter):
def createHandle(self): def createHandle(self):
return self.topSplitterHandle(self.orientation(), self) return self.topSplitterHandle(self.orientation(), self)
class topSplitterHandle(QtGui.QSplitterHandle): class topSplitterHandle(QtWidgets.QSplitterHandle):
def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
QtGui.QSplitterHandle.mouseReleaseEvent(self, event) QtWidgets.QSplitterHandle.mouseReleaseEvent(self, event)
self.parent().parent().parent().updateListGeometry() self.parent().parent().parent().updateListGeometry()
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
QtGui.QSplitterHandle.mouseMoveEvent(self, event) QtWidgets.QSplitterHandle.mouseMoveEvent(self, event)
self.parent().parent().parent().updateListGeometry() self.parent().parent().parent().updateListGeometry()
def needsClient(f): # @NoSelf def needsClient(f): # @NoSelf
@ -470,11 +473,11 @@ class MainWindow(QtGui.QMainWindow):
if isControlledRoom: if isControlledRoom:
if room == currentUser.room and currentUser.isController(): if room == currentUser.room and currentUser.isController():
roomitem.setIcon(QtGui.QIcon(self.resourcespath + 'lock_open.png')) roomitem.setIcon(QtGui.QPixmap(self.resourcespath + 'lock_open.png'))
else: else:
roomitem.setIcon(QtGui.QIcon(self.resourcespath + 'lock.png')) roomitem.setIcon(QtGui.QPixmap(self.resourcespath + 'lock.png'))
else: else:
roomitem.setIcon(QtGui.QIcon(self.resourcespath + 'chevrons_right.png')) roomitem.setIcon(QtGui.QPixmap(self.resourcespath + 'chevrons_right.png'))
for user in rooms[room]: for user in rooms[room]:
useritem = QtGui.QStandardItem(user.username) useritem = QtGui.QStandardItem(user.username)
@ -572,7 +575,7 @@ class MainWindow(QtGui.QMainWindow):
item = self.playlist.selectedIndexes()[0] item = self.playlist.selectedIndexes()[0]
else: else:
item = None item = None
menu = QtGui.QMenu() menu = QtWidgets.QMenu()
if item: if item:
firstFile = item.sibling(item.row(), 0).data() firstFile = item.sibling(item.row(), 0).data()
@ -615,7 +618,7 @@ class MainWindow(QtGui.QMainWindow):
else: else:
return return
menu = QtGui.QMenu() menu = QtWidgets.QMenu()
username = item.sibling(item.row(), 0).data() username = item.sibling(item.row(), 0).data()
if username == self._syncplayClient.userlist.currentUser.username: if username == self._syncplayClient.userlist.currentUser.username:
shortUsername = getMessage("item-is-yours-indicator") shortUsername = getMessage("item-is-yours-indicator")
@ -663,15 +666,24 @@ class MainWindow(QtGui.QMainWindow):
self.listTreeView.setFirstColumnSpanned(roomtocheck, self.listTreeView.rootIndex(), True) self.listTreeView.setFirstColumnSpanned(roomtocheck, self.listTreeView.rootIndex(), True)
roomtocheck += 1 roomtocheck += 1
self.listTreeView.header().setStretchLastSection(False) self.listTreeView.header().setStretchLastSection(False)
self.listTreeView.header().setResizeMode(0, QtGui.QHeaderView.ResizeToContents) if IsPySide2:
self.listTreeView.header().setResizeMode(1, QtGui.QHeaderView.ResizeToContents) self.listTreeView.header().setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
self.listTreeView.header().setResizeMode(2, QtGui.QHeaderView.ResizeToContents) self.listTreeView.header().setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
self.listTreeView.header().setResizeMode(3, QtGui.QHeaderView.ResizeToContents) self.listTreeView.header().setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
self.listTreeView.header().setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
if IsPySide:
self.listTreeView.header().setResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
self.listTreeView.header().setResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
self.listTreeView.header().setResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
self.listTreeView.header().setResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
NarrowTabsWidth = self.listTreeView.header().sectionSize(0)+self.listTreeView.header().sectionSize(1)+self.listTreeView.header().sectionSize(2) NarrowTabsWidth = self.listTreeView.header().sectionSize(0)+self.listTreeView.header().sectionSize(1)+self.listTreeView.header().sectionSize(2)
if self.listTreeView.header().width() < (NarrowTabsWidth+self.listTreeView.header().sectionSize(3)): if self.listTreeView.header().width() < (NarrowTabsWidth+self.listTreeView.header().sectionSize(3)):
self.listTreeView.header().resizeSection(3,self.listTreeView.header().width()-NarrowTabsWidth) self.listTreeView.header().resizeSection(3,self.listTreeView.header().width()-NarrowTabsWidth)
else: else:
self.listTreeView.header().setResizeMode(3, QtGui.QHeaderView.Stretch) if IsPySide2:
self.listTreeView.header().setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)
if IsPySide:
self.listTreeView.header().setResizeMode(3, QtWidgets.QHeaderView.Stretch)
self.listTreeView.expandAll() self.listTreeView.expandAll()
except: except:
pass pass
@ -744,7 +756,7 @@ class MainWindow(QtGui.QMainWindow):
def showErrorMessage(self, message, criticalerror=False): def showErrorMessage(self, message, criticalerror=False):
message = unicode(message) message = unicode(message)
if criticalerror: if criticalerror:
QtGui.QMessageBox.critical(self, "Syncplay", message) QtWidgets.QMessageBox.critical(self, "Syncplay", message)
message = message.replace(u"&", u"&amp;").replace(u'"', u"&quot;").replace(u"<", u"&lt;").replace(u">", u"&gt;") message = message.replace(u"&", u"&amp;").replace(u'"', u"&quot;").replace(u"<", u"&lt;").replace(u">", u"&gt;")
message = message.replace(u"\n", u"<br />") message = message.replace(u"\n", u"<br />")
message = u"<span style=\"{}\">".format(constants.STYLE_ERRORNOTIFICATION) + message + u"</span>" message = u"<span style=\"{}\">".format(constants.STYLE_ERRORNOTIFICATION) + message + u"</span>"
@ -765,8 +777,8 @@ class MainWindow(QtGui.QMainWindow):
self._syncplayClient.sendRoom() self._syncplayClient.sendRoom()
def seekPositionDialog(self): def seekPositionDialog(self):
seekTime, ok = QtGui.QInputDialog.getText(self, getMessage("seektime-menu-label"), seekTime, ok = QtWidgets.QInputDialog.getText(self, getMessage("seektime-menu-label"),
getMessage("seektime-msgbox-label"), QtGui.QLineEdit.Normal, getMessage("seektime-msgbox-label"), QtWidgets.QLineEdit.Normal,
u"0:00") u"0:00")
if ok and seekTime != '': if ok and seekTime != '':
self.seekPosition(seekTime) self.seekPosition(seekTime)
@ -829,16 +841,28 @@ class MainWindow(QtGui.QMainWindow):
settings.endGroup() settings.endGroup()
def getInitialMediaDirectory(self, includeUserSpecifiedDirectories=True): def getInitialMediaDirectory(self, includeUserSpecifiedDirectories=True):
if self.config["mediaSearchDirectories"] and os.path.isdir(self.config["mediaSearchDirectories"][0]) and includeUserSpecifiedDirectories: if IsPySide:
defaultdirectory = self.config["mediaSearchDirectories"][0] if self.config["mediaSearchDirectories"] and os.path.isdir(self.config["mediaSearchDirectories"][0]) and includeUserSpecifiedDirectories:
elif includeUserSpecifiedDirectories and os.path.isdir(self.mediadirectory): defaultdirectory = self.config["mediaSearchDirectories"][0]
defaultdirectory = self.mediadirectory elif includeUserSpecifiedDirectories and os.path.isdir(self.mediadirectory):
elif os.path.isdir(QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.MoviesLocation)): defaultdirectory = self.mediadirectory
defaultdirectory = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.MoviesLocation) elif os.path.isdir(QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.MoviesLocation)):
elif os.path.isdir(QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.HomeLocation)): defaultdirectory = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.MoviesLocation)
defaultdirectory = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.HomeLocation) elif os.path.isdir(QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.HomeLocation)):
else: defaultdirectory = QtGui.QDesktopServices.storageLocation(QtGui.QDesktopServices.HomeLocation)
defaultdirectory = "" else:
defaultdirectory = ""
elif IsPySide2:
if self.config["mediaSearchDirectories"] and os.path.isdir(self.config["mediaSearchDirectories"][0]) and includeUserSpecifiedDirectories:
defaultdirectory = self.config["mediaSearchDirectories"][0]
elif includeUserSpecifiedDirectories and os.path.isdir(self.mediadirectory):
defaultdirectory = self.mediadirectory
elif os.path.isdir(QStandardPaths.standardLocations(QStandardPaths.MoviesLocation)[0]):
defaultdirectory = QStandardPaths.standardLocations(QStandardPaths.MoviesLocation)[0]
elif os.path.isdir(QStandardPaths.standardLocations(QStandardPaths.HomeLocation)[0]):
defaultdirectory = QStandardPaths.standardLocations(QStandardPaths.HomeLocation)[0]
else:
defaultdirectory = ""
return defaultdirectory return defaultdirectory
@needsClient @needsClient
@ -848,10 +872,10 @@ class MainWindow(QtGui.QMainWindow):
return return
self.loadMediaBrowseSettings() self.loadMediaBrowseSettings()
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
options = QtGui.QFileDialog.Options(QtGui.QFileDialog.DontUseNativeDialog) options = QtWidgets.QFileDialog.Options(QtWidgets.QFileDialog.DontUseNativeDialog)
else: else:
options = QtGui.QFileDialog.Options() options = QtWidgets.QFileDialog.Options()
self.mediadirectory = "" self.mediadirectory = ""
currentdirectory = os.path.dirname(self._syncplayClient.userlist.currentUser.file["path"]) if self._syncplayClient.userlist.currentUser.file else None currentdirectory = os.path.dirname(self._syncplayClient.userlist.currentUser.file["path"]) if self._syncplayClient.userlist.currentUser.file else None
if currentdirectory and os.path.isdir(currentdirectory): if currentdirectory and os.path.isdir(currentdirectory):
@ -859,7 +883,7 @@ class MainWindow(QtGui.QMainWindow):
else: else:
defaultdirectory = self.getInitialMediaDirectory() defaultdirectory = self.getInitialMediaDirectory()
browserfilter = "All files (*)" browserfilter = "All files (*)"
fileName, filtr = QtGui.QFileDialog.getOpenFileName(self, getMessage("browseformedia-label"), defaultdirectory, fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self, getMessage("browseformedia-label"), defaultdirectory,
browserfilter, "", options) browserfilter, "", options)
if fileName: if fileName:
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
@ -876,10 +900,10 @@ class MainWindow(QtGui.QMainWindow):
return return
self.loadMediaBrowseSettings() self.loadMediaBrowseSettings()
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
options = QtGui.QFileDialog.Options(QtGui.QFileDialog.DontUseNativeDialog) options = QtWidgets.QFileDialog.Options(QtWidgets.QFileDialog.DontUseNativeDialog)
else: else:
options = QtGui.QFileDialog.Options() options = QtWidgets.QFileDialog.Options()
self.mediadirectory = "" self.mediadirectory = ""
currentdirectory = os.path.dirname(self._syncplayClient.userlist.currentUser.file["path"]) if self._syncplayClient.userlist.currentUser.file else None currentdirectory = os.path.dirname(self._syncplayClient.userlist.currentUser.file["path"]) if self._syncplayClient.userlist.currentUser.file else None
if currentdirectory and os.path.isdir(currentdirectory): if currentdirectory and os.path.isdir(currentdirectory):
@ -887,7 +911,7 @@ class MainWindow(QtGui.QMainWindow):
else: else:
defaultdirectory = self.getInitialMediaDirectory() defaultdirectory = self.getInitialMediaDirectory()
browserfilter = "All files (*)" browserfilter = "All files (*)"
fileNames, filtr = QtGui.QFileDialog.getOpenFileNames(self, getMessage("browseformedia-label"), defaultdirectory, fileNames, filtr = QtWidgets.QFileDialog.getOpenFileNames(self, getMessage("browseformedia-label"), defaultdirectory,
browserfilter, "", options) browserfilter, "", options)
self.updatingPlaylist = True self.updatingPlaylist = True
if fileNames: if fileNames:
@ -903,17 +927,17 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def OpenAddURIsToPlaylistDialog(self): def OpenAddURIsToPlaylistDialog(self):
URIsDialog = QtGui.QDialog() URIsDialog = QtWidgets.QDialog()
URIsDialog.setWindowTitle(getMessage("adduris-msgbox-label")) URIsDialog.setWindowTitle(getMessage("adduris-msgbox-label"))
URIsLayout = QtGui.QGridLayout() URIsLayout = QtWidgets.QGridLayout()
URIsLabel = QtGui.QLabel(getMessage("adduris-msgbox-label")) URIsLabel = QtWidgets.QLabel(getMessage("adduris-msgbox-label"))
URIsLayout.addWidget(URIsLabel, 0, 0, 1, 1) URIsLayout.addWidget(URIsLabel, 0, 0, 1, 1)
URIsTextbox = QtGui.QPlainTextEdit() URIsTextbox = QtWidgets.QPlainTextEdit()
URIsTextbox.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) URIsTextbox.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
URIsLayout.addWidget(URIsTextbox, 1, 0, 1, 1) URIsLayout.addWidget(URIsTextbox, 1, 0, 1, 1)
URIsButtonBox = QtGui.QDialogButtonBox() URIsButtonBox = QtWidgets.QDialogButtonBox()
URIsButtonBox.setOrientation(Qt.Horizontal) URIsButtonBox.setOrientation(Qt.Horizontal)
URIsButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel) URIsButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
URIsButtonBox.accepted.connect(URIsDialog.accept) URIsButtonBox.accepted.connect(URIsDialog.accept)
URIsButtonBox.rejected.connect(URIsDialog.reject) URIsButtonBox.rejected.connect(URIsDialog.reject)
URIsLayout.addWidget(URIsButtonBox, 2, 0, 1, 1) URIsLayout.addWidget(URIsButtonBox, 2, 0, 1, 1)
@ -921,7 +945,7 @@ class MainWindow(QtGui.QMainWindow):
URIsDialog.setModal(True) URIsDialog.setModal(True)
URIsDialog.show() URIsDialog.show()
result = URIsDialog.exec_() result = URIsDialog.exec_()
if result == QtGui.QDialog.Accepted: if result == QtWidgets.QDialog.Accepted:
URIsToAdd = utils.convertMultilineStringToList(URIsTextbox.toPlainText()) URIsToAdd = utils.convertMultilineStringToList(URIsTextbox.toPlainText())
self.updatingPlaylist = True self.updatingPlaylist = True
for URI in URIsToAdd: for URI in URIsToAdd:
@ -939,17 +963,17 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def openEditPlaylistDialog(self): def openEditPlaylistDialog(self):
oldPlaylist = utils.getListAsMultilineString(self.getPlaylistState()) oldPlaylist = utils.getListAsMultilineString(self.getPlaylistState())
editPlaylistDialog = QtGui.QDialog() editPlaylistDialog = QtWidgets.QDialog()
editPlaylistDialog.setWindowTitle(getMessage("editplaylist-msgbox-label")) editPlaylistDialog.setWindowTitle(getMessage("editplaylist-msgbox-label"))
editPlaylistLayout = QtGui.QGridLayout() editPlaylistLayout = QtWidgets.QGridLayout()
editPlaylistLabel = QtGui.QLabel(getMessage("editplaylist-msgbox-label")) editPlaylistLabel = QtWidgets.QLabel(getMessage("editplaylist-msgbox-label"))
editPlaylistLayout.addWidget(editPlaylistLabel, 0, 0, 1, 1) editPlaylistLayout.addWidget(editPlaylistLabel, 0, 0, 1, 1)
editPlaylistTextbox = QtGui.QPlainTextEdit(oldPlaylist) editPlaylistTextbox = QtWidgets.QPlainTextEdit(oldPlaylist)
editPlaylistTextbox.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) editPlaylistTextbox.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
editPlaylistLayout.addWidget(editPlaylistTextbox, 1, 0, 1, 1) editPlaylistLayout.addWidget(editPlaylistTextbox, 1, 0, 1, 1)
editPlaylistButtonBox = QtGui.QDialogButtonBox() editPlaylistButtonBox = QtWidgets.QDialogButtonBox()
editPlaylistButtonBox.setOrientation(Qt.Horizontal) editPlaylistButtonBox.setOrientation(Qt.Horizontal)
editPlaylistButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel) editPlaylistButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
editPlaylistButtonBox.accepted.connect(editPlaylistDialog.accept) editPlaylistButtonBox.accepted.connect(editPlaylistDialog.accept)
editPlaylistButtonBox.rejected.connect(editPlaylistDialog.reject) editPlaylistButtonBox.rejected.connect(editPlaylistDialog.reject)
editPlaylistLayout.addWidget(editPlaylistButtonBox, 2, 0, 1, 1) editPlaylistLayout.addWidget(editPlaylistButtonBox, 2, 0, 1, 1)
@ -959,7 +983,7 @@ class MainWindow(QtGui.QMainWindow):
editPlaylistDialog.setMinimumHeight(500) editPlaylistDialog.setMinimumHeight(500)
editPlaylistDialog.show() editPlaylistDialog.show()
result = editPlaylistDialog.exec_() result = editPlaylistDialog.exec_()
if result == QtGui.QDialog.Accepted: if result == QtWidgets.QDialog.Accepted:
newPlaylist = utils.convertMultilineStringToList(editPlaylistTextbox.toPlainText()) newPlaylist = utils.convertMultilineStringToList(editPlaylistTextbox.toPlainText())
if newPlaylist <> self.playlistState and self._syncplayClient and not self.updatingPlaylist: if newPlaylist <> self.playlistState and self._syncplayClient and not self.updatingPlaylist:
self.setPlaylist(newPlaylist) self.setPlaylist(newPlaylist)
@ -968,46 +992,46 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def openSetMediaDirectoriesDialog(self): def openSetMediaDirectoriesDialog(self):
MediaDirectoriesDialog = QtGui.QDialog() MediaDirectoriesDialog = QtWidgets.QDialog()
MediaDirectoriesDialog.setWindowTitle(getMessage("syncplay-mediasearchdirectories-title")) # TODO: Move to messages_*.py MediaDirectoriesDialog.setWindowTitle(getMessage("syncplay-mediasearchdirectories-title")) # TODO: Move to messages_*.py
MediaDirectoriesLayout = QtGui.QGridLayout() MediaDirectoriesLayout = QtWidgets.QGridLayout()
MediaDirectoriesLabel = QtGui.QLabel(getMessage("syncplay-mediasearchdirectories-title")) MediaDirectoriesLabel = QtWidgets.QLabel(getMessage("syncplay-mediasearchdirectories-title"))
MediaDirectoriesLayout.addWidget(MediaDirectoriesLabel, 0, 0, 1, 2) MediaDirectoriesLayout.addWidget(MediaDirectoriesLabel, 0, 0, 1, 2)
MediaDirectoriesTextbox = QtGui.QPlainTextEdit() MediaDirectoriesTextbox = QtWidgets.QPlainTextEdit()
MediaDirectoriesTextbox.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) MediaDirectoriesTextbox.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
MediaDirectoriesTextbox.setPlainText(utils.getListAsMultilineString(self.config["mediaSearchDirectories"])) MediaDirectoriesTextbox.setPlainText(utils.getListAsMultilineString(self.config["mediaSearchDirectories"]))
MediaDirectoriesLayout.addWidget(MediaDirectoriesTextbox, 1, 0, 1, 1) MediaDirectoriesLayout.addWidget(MediaDirectoriesTextbox, 1, 0, 1, 1)
MediaDirectoriesButtonBox = QtGui.QDialogButtonBox() MediaDirectoriesButtonBox = QtWidgets.QDialogButtonBox()
MediaDirectoriesButtonBox.setOrientation(Qt.Horizontal) MediaDirectoriesButtonBox.setOrientation(Qt.Horizontal)
MediaDirectoriesButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel) MediaDirectoriesButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
MediaDirectoriesButtonBox.accepted.connect(MediaDirectoriesDialog.accept) MediaDirectoriesButtonBox.accepted.connect(MediaDirectoriesDialog.accept)
MediaDirectoriesButtonBox.rejected.connect(MediaDirectoriesDialog.reject) MediaDirectoriesButtonBox.rejected.connect(MediaDirectoriesDialog.reject)
MediaDirectoriesLayout.addWidget(MediaDirectoriesButtonBox, 2, 0, 1, 1) MediaDirectoriesLayout.addWidget(MediaDirectoriesButtonBox, 2, 0, 1, 1)
MediaDirectoriesAddFolderButton = QtGui.QPushButton(getMessage("addfolder-label")) MediaDirectoriesAddFolderButton = QtWidgets.QPushButton(getMessage("addfolder-label"))
MediaDirectoriesAddFolderButton.pressed.connect(lambda: self.openAddMediaDirectoryDialog(MediaDirectoriesTextbox, MediaDirectoriesDialog)) MediaDirectoriesAddFolderButton.pressed.connect(lambda: self.openAddMediaDirectoryDialog(MediaDirectoriesTextbox, MediaDirectoriesDialog))
MediaDirectoriesLayout.addWidget(MediaDirectoriesAddFolderButton, 1, 1, 1, 1, Qt.AlignTop) MediaDirectoriesLayout.addWidget(MediaDirectoriesAddFolderButton, 1, 1, 1, 1, Qt.AlignTop)
MediaDirectoriesDialog.setLayout(MediaDirectoriesLayout) MediaDirectoriesDialog.setLayout(MediaDirectoriesLayout)
MediaDirectoriesDialog.setModal(True) MediaDirectoriesDialog.setModal(True)
MediaDirectoriesDialog.show() MediaDirectoriesDialog.show()
result = MediaDirectoriesDialog.exec_() result = MediaDirectoriesDialog.exec_()
if result == QtGui.QDialog.Accepted: if result == QtWidgets.QDialog.Accepted:
newMediaDirectories = utils.convertMultilineStringToList(MediaDirectoriesTextbox.toPlainText()) newMediaDirectories = utils.convertMultilineStringToList(MediaDirectoriesTextbox.toPlainText())
self._syncplayClient.fileSwitch.changeMediaDirectories(newMediaDirectories) self._syncplayClient.fileSwitch.changeMediaDirectories(newMediaDirectories)
@needsClient @needsClient
def openSetTrustedDomainsDialog(self): def openSetTrustedDomainsDialog(self):
TrustedDomainsDialog = QtGui.QDialog() TrustedDomainsDialog = QtWidgets.QDialog()
TrustedDomainsDialog.setWindowTitle(getMessage("syncplay-trusteddomains-title")) TrustedDomainsDialog.setWindowTitle(getMessage("syncplay-trusteddomains-title"))
TrustedDomainsLayout = QtGui.QGridLayout() TrustedDomainsLayout = QtWidgets.QGridLayout()
TrustedDomainsLabel = QtGui.QLabel(getMessage("trusteddomains-msgbox-label")) TrustedDomainsLabel = QtWidgets.QLabel(getMessage("trusteddomains-msgbox-label"))
TrustedDomainsLayout.addWidget(TrustedDomainsLabel, 0, 0, 1, 1) TrustedDomainsLayout.addWidget(TrustedDomainsLabel, 0, 0, 1, 1)
TrustedDomainsTextbox = QtGui.QPlainTextEdit() TrustedDomainsTextbox = QtWidgets.QPlainTextEdit()
TrustedDomainsTextbox.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) TrustedDomainsTextbox.setLineWrapMode(QtWidgets.QPlainTextEdit.NoWrap)
TrustedDomainsTextbox.setPlainText(utils.getListAsMultilineString(self.config["trustedDomains"])) TrustedDomainsTextbox.setPlainText(utils.getListAsMultilineString(self.config["trustedDomains"]))
TrustedDomainsLayout.addWidget(TrustedDomainsTextbox, 1, 0, 1, 1) TrustedDomainsLayout.addWidget(TrustedDomainsTextbox, 1, 0, 1, 1)
TrustedDomainsButtonBox = QtGui.QDialogButtonBox() TrustedDomainsButtonBox = QtWidgets.QDialogButtonBox()
TrustedDomainsButtonBox.setOrientation(Qt.Horizontal) TrustedDomainsButtonBox.setOrientation(Qt.Horizontal)
TrustedDomainsButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel) TrustedDomainsButtonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel)
TrustedDomainsButtonBox.accepted.connect(TrustedDomainsDialog.accept) TrustedDomainsButtonBox.accepted.connect(TrustedDomainsDialog.accept)
TrustedDomainsButtonBox.rejected.connect(TrustedDomainsDialog.reject) TrustedDomainsButtonBox.rejected.connect(TrustedDomainsDialog.reject)
TrustedDomainsLayout.addWidget(TrustedDomainsButtonBox, 2, 0, 1, 1) TrustedDomainsLayout.addWidget(TrustedDomainsButtonBox, 2, 0, 1, 1)
@ -1015,7 +1039,7 @@ class MainWindow(QtGui.QMainWindow):
TrustedDomainsDialog.setModal(True) TrustedDomainsDialog.setModal(True)
TrustedDomainsDialog.show() TrustedDomainsDialog.show()
result = TrustedDomainsDialog.exec_() result = TrustedDomainsDialog.exec_()
if result == QtGui.QDialog.Accepted: if result == QtWidgets.QDialog.Accepted:
newTrustedDomains = utils.convertMultilineStringToList(TrustedDomainsTextbox.toPlainText()) newTrustedDomains = utils.convertMultilineStringToList(TrustedDomainsTextbox.toPlainText())
self._syncplayClient.setTrustedDomains(newTrustedDomains) self._syncplayClient.setTrustedDomains(newTrustedDomains)
@needsClient @needsClient
@ -1027,11 +1051,12 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def openAddMediaDirectoryDialog(self, MediaDirectoriesTextbox, MediaDirectoriesDialog): def openAddMediaDirectoryDialog(self, MediaDirectoriesTextbox, MediaDirectoriesDialog):
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
options = QtGui.QFileDialog.Options(QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) options = QtWidgets.QFileDialog.Options(QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
else: else:
options = QtGui.QFileDialog.Options(QtGui.QFileDialog.ShowDirsOnly) options = QtWidgets.QFileDialog.Options(QtWidgets.QFileDialog.ShowDirsOnly)
folderName = unicode(QtGui.QFileDialog.getExistingDirectory(self,None,self.getInitialMediaDirectory(includeUserSpecifiedDirectories=False),options)) folderName = unicode(QtWidgets.QFileDialog.getExistingDirectory(self,None,self.getInitialMediaDirectory(includeUserSpecifiedDirectories=False),options))
if folderName: if folderName:
existingMediaDirs = MediaDirectoriesTextbox.toPlainText() existingMediaDirs = MediaDirectoriesTextbox.toPlainText()
if existingMediaDirs == "": if existingMediaDirs == "":
@ -1044,16 +1069,16 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def promptForStreamURL(self): def promptForStreamURL(self):
streamURL, ok = QtGui.QInputDialog.getText(self, getMessage("promptforstreamurl-msgbox-label"), streamURL, ok = QtWidgets.QInputDialog.getText(self, getMessage("promptforstreamurl-msgbox-label"),
getMessage("promptforstreamurlinfo-msgbox-label"), QtGui.QLineEdit.Normal, getMessage("promptforstreamurlinfo-msgbox-label"), QtWidgets.QLineEdit.Normal,
"") "")
if ok and streamURL != '': if ok and streamURL != '':
self._syncplayClient._player.openFile(streamURL) self._syncplayClient._player.openFile(streamURL)
@needsClient @needsClient
def createControlledRoom(self): def createControlledRoom(self):
controlroom, ok = QtGui.QInputDialog.getText(self, getMessage("createcontrolledroom-msgbox-label"), controlroom, ok = QtWidgets.QInputDialog.getText(self, getMessage("createcontrolledroom-msgbox-label"),
getMessage("controlledroominfo-msgbox-label"), QtGui.QLineEdit.Normal, getMessage("controlledroominfo-msgbox-label"), QtWidgets.QLineEdit.Normal,
utils.stripRoomName(self._syncplayClient.getRoom())) utils.stripRoomName(self._syncplayClient.getRoom()))
if ok and controlroom != '': if ok and controlroom != '':
self._syncplayClient.createControlledRoom(controlroom) self._syncplayClient.createControlledRoom(controlroom)
@ -1062,7 +1087,7 @@ class MainWindow(QtGui.QMainWindow):
def identifyAsController(self): def identifyAsController(self):
msgboxtitle = getMessage("identifyascontroller-msgbox-label") msgboxtitle = getMessage("identifyascontroller-msgbox-label")
msgboxtext = getMessage("identifyinfo-msgbox-label") msgboxtext = getMessage("identifyinfo-msgbox-label")
controlpassword, ok = QtGui.QInputDialog.getText(self, msgboxtitle, msgboxtext, QtGui.QLineEdit.Normal, "") controlpassword, ok = QtWidgets.QInputDialog.getText(self, msgboxtitle, msgboxtext, QtWidgets.QLineEdit.Normal, "")
if ok and controlpassword != '': if ok and controlpassword != '':
self._syncplayClient.identifyAsController(controlpassword) self._syncplayClient.identifyAsController(controlpassword)
@ -1077,8 +1102,8 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def setOffset(self): def setOffset(self):
newoffset, ok = QtGui.QInputDialog.getText(self, getMessage("setoffset-msgbox-label"), newoffset, ok = QtWidgets.QInputDialog.getText(self, getMessage("setoffset-msgbox-label"),
getMessage("offsetinfo-msgbox-label"), QtGui.QLineEdit.Normal, getMessage("offsetinfo-msgbox-label"), QtWidgets.QLineEdit.Normal,
"") "")
if ok and newoffset != '': if ok and newoffset != '':
o = re.match(constants.UI_OFFSET_REGEX, "o " + newoffset) o = re.match(constants.UI_OFFSET_REGEX, "o " + newoffset)
@ -1131,8 +1156,8 @@ class MainWindow(QtGui.QMainWindow):
def addTopLayout(self, window): def addTopLayout(self, window):
window.topSplit = self.topSplitter(Qt.Horizontal, self) window.topSplit = self.topSplitter(Qt.Horizontal, self)
window.outputLayout = QtGui.QVBoxLayout() window.outputLayout = QtWidgets.QVBoxLayout()
window.outputbox = QtGui.QTextBrowser() window.outputbox = QtWidgets.QTextBrowser()
window.outputbox.setReadOnly(True) window.outputbox.setReadOnly(True)
window.outputbox.setTextInteractionFlags(window.outputbox.textInteractionFlags() | Qt.TextSelectableByKeyboard) window.outputbox.setTextInteractionFlags(window.outputbox.textInteractionFlags() | Qt.TextSelectableByKeyboard)
window.outputbox.setOpenExternalLinks(True) window.outputbox.setOpenExternalLinks(True)
@ -1142,24 +1167,24 @@ class MainWindow(QtGui.QMainWindow):
window.outputbox.moveCursor(QtGui.QTextCursor.End) window.outputbox.moveCursor(QtGui.QTextCursor.End)
window.outputbox.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) window.outputbox.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
window.outputlabel = QtGui.QLabel(getMessage("notifications-heading-label")) window.outputlabel = QtWidgets.QLabel(getMessage("notifications-heading-label"))
window.chatInput = QtGui.QLineEdit() window.chatInput = QtWidgets.QLineEdit()
window.chatInput.setMaxLength(constants.MAX_CHAT_MESSAGE_LENGTH) window.chatInput.setMaxLength(constants.MAX_CHAT_MESSAGE_LENGTH)
window.chatInput.returnPressed.connect(self.sendChatMessage) window.chatInput.returnPressed.connect(self.sendChatMessage)
window.chatButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'email_go.png'), window.chatButton = QtWidgets.QPushButton(QtGui.QPixmap(self.resourcespath + 'email_go.png'),
getMessage("sendmessage-label")) getMessage("sendmessage-label"))
window.chatButton.pressed.connect(self.sendChatMessage) window.chatButton.pressed.connect(self.sendChatMessage)
window.chatLayout = QtGui.QHBoxLayout() window.chatLayout = QtWidgets.QHBoxLayout()
window.chatFrame = QtGui.QFrame() window.chatFrame = QtWidgets.QFrame()
window.chatFrame.setLayout(self.chatLayout) window.chatFrame.setLayout(self.chatLayout)
window.chatFrame.setContentsMargins(0,0,0,0) window.chatFrame.setContentsMargins(0,0,0,0)
window.chatFrame.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) window.chatFrame.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
window.chatLayout.setContentsMargins(0,0,0,0) window.chatLayout.setContentsMargins(0,0,0,0)
self.chatButton.setToolTip(getMessage("sendmessage-tooltip")) self.chatButton.setToolTip(getMessage("sendmessage-tooltip"))
window.chatLayout.addWidget(window.chatInput) window.chatLayout.addWidget(window.chatInput)
window.chatLayout.addWidget(window.chatButton) window.chatLayout.addWidget(window.chatButton)
window.chatFrame.setMaximumHeight(window.chatFrame.sizeHint().height()) window.chatFrame.setMaximumHeight(window.chatFrame.sizeHint().height())
window.outputFrame = QtGui.QFrame() window.outputFrame = QtWidgets.QFrame()
window.outputFrame.setLineWidth(0) window.outputFrame.setLineWidth(0)
window.outputFrame.setMidLineWidth(0) window.outputFrame.setMidLineWidth(0)
window.outputLayout.setContentsMargins(0, 0, 0, 0) window.outputLayout.setContentsMargins(0, 0, 0, 0)
@ -1168,47 +1193,47 @@ class MainWindow(QtGui.QMainWindow):
window.outputLayout.addWidget(window.chatFrame) window.outputLayout.addWidget(window.chatFrame)
window.outputFrame.setLayout(window.outputLayout) window.outputFrame.setLayout(window.outputLayout)
window.listLayout = QtGui.QVBoxLayout() window.listLayout = QtWidgets.QVBoxLayout()
window.listTreeModel = QtGui.QStandardItemModel() window.listTreeModel = QtGui.QStandardItemModel()
window.listTreeView = QtGui.QTreeView() window.listTreeView = QtWidgets.QTreeView()
window.listTreeView.setModel(window.listTreeModel) window.listTreeView.setModel(window.listTreeModel)
window.listTreeView.setIndentation(21) window.listTreeView.setIndentation(21)
window.listTreeView.doubleClicked.connect(self.roomClicked) window.listTreeView.doubleClicked.connect(self.roomClicked)
self.listTreeView.setContextMenuPolicy(Qt.CustomContextMenu) self.listTreeView.setContextMenuPolicy(Qt.CustomContextMenu)
self.listTreeView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.listTreeView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.listTreeView.customContextMenuRequested.connect(self.openRoomMenu) self.listTreeView.customContextMenuRequested.connect(self.openRoomMenu)
window.listlabel = QtGui.QLabel(getMessage("userlist-heading-label")) window.listlabel = QtWidgets.QLabel(getMessage("userlist-heading-label"))
window.listFrame = QtGui.QFrame() window.listFrame = QtWidgets.QFrame()
window.listFrame.setLineWidth(0) window.listFrame.setLineWidth(0)
window.listFrame.setMidLineWidth(0) window.listFrame.setMidLineWidth(0)
window.listFrame.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) window.listFrame.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
window.listLayout.setContentsMargins(0, 0, 0, 0) window.listLayout.setContentsMargins(0, 0, 0, 0)
window.userlistLayout = QtGui.QVBoxLayout() window.userlistLayout = QtWidgets.QVBoxLayout()
window.userlistFrame = QtGui.QFrame() window.userlistFrame = QtWidgets.QFrame()
window.userlistFrame.setLineWidth(0) window.userlistFrame.setLineWidth(0)
window.userlistFrame.setMidLineWidth(0) window.userlistFrame.setMidLineWidth(0)
window.userlistFrame.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) window.userlistFrame.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
window.userlistLayout.setContentsMargins(0, 0, 0, 0) window.userlistLayout.setContentsMargins(0, 0, 0, 0)
window.userlistFrame.setLayout(window.userlistLayout) window.userlistFrame.setLayout(window.userlistLayout)
window.userlistLayout.addWidget(window.listlabel) window.userlistLayout.addWidget(window.listlabel)
window.userlistLayout.addWidget(window.listTreeView) window.userlistLayout.addWidget(window.listTreeView)
window.listSplit = QtGui.QSplitter(Qt.Vertical, self) window.listSplit = QtWidgets.QSplitter(Qt.Vertical, self)
window.listSplit.addWidget(window.userlistFrame) window.listSplit.addWidget(window.userlistFrame)
window.listLayout.addWidget(window.listSplit) window.listLayout.addWidget(window.listSplit)
window.roomInput = QtGui.QLineEdit() window.roomInput = QtWidgets.QLineEdit()
window.roomInput.setMaxLength(constants.MAX_ROOM_NAME_LENGTH) window.roomInput.setMaxLength(constants.MAX_ROOM_NAME_LENGTH)
window.roomInput.returnPressed.connect(self.joinRoom) window.roomInput.returnPressed.connect(self.joinRoom)
window.roomButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'door_in.png'), window.roomButton = QtWidgets.QPushButton(QtGui.QPixmap(self.resourcespath + 'door_in.png'),
getMessage("joinroom-label")) getMessage("joinroom-label"))
window.roomButton.pressed.connect(self.joinRoom) window.roomButton.pressed.connect(self.joinRoom)
window.roomLayout = QtGui.QHBoxLayout() window.roomLayout = QtWidgets.QHBoxLayout()
window.roomFrame = QtGui.QFrame() window.roomFrame = QtWidgets.QFrame()
window.roomFrame.setLayout(self.roomLayout) window.roomFrame.setLayout(self.roomLayout)
window.roomFrame.setContentsMargins(0,0,0,0) window.roomFrame.setContentsMargins(0,0,0,0)
window.roomFrame.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) window.roomFrame.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
window.roomLayout.setContentsMargins(0,0,0,0) window.roomLayout.setContentsMargins(0,0,0,0)
self.roomButton.setToolTip(getMessage("joinroom-tooltip")) self.roomButton.setToolTip(getMessage("joinroom-tooltip"))
window.roomLayout.addWidget(window.roomInput) window.roomLayout.addWidget(window.roomInput)
@ -1223,11 +1248,11 @@ class MainWindow(QtGui.QMainWindow):
window.topSplit.setStretchFactor(0,4) window.topSplit.setStretchFactor(0,4)
window.topSplit.setStretchFactor(1,5) window.topSplit.setStretchFactor(1,5)
window.mainLayout.addWidget(window.topSplit) window.mainLayout.addWidget(window.topSplit)
window.topSplit.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding) window.topSplit.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
def addBottomLayout(self, window): def addBottomLayout(self, window):
window.bottomLayout = QtGui.QHBoxLayout() window.bottomLayout = QtWidgets.QHBoxLayout()
window.bottomFrame = QtGui.QFrame() window.bottomFrame = QtWidgets.QFrame()
window.bottomFrame.setLayout(window.bottomLayout) window.bottomFrame.setLayout(window.bottomLayout)
window.bottomLayout.setContentsMargins(0,0,0,0) window.bottomLayout.setContentsMargins(0,0,0,0)
@ -1236,8 +1261,8 @@ class MainWindow(QtGui.QMainWindow):
window.playlistGroup = self.PlaylistGroupBox(getMessage("sharedplaylistenabled-label")) window.playlistGroup = self.PlaylistGroupBox(getMessage("sharedplaylistenabled-label"))
window.playlistGroup.setCheckable(True) window.playlistGroup.setCheckable(True)
window.playlistGroup.toggled.connect(self.changePlaylistEnabledState) window.playlistGroup.toggled.connect(self.changePlaylistEnabledState)
window.playlistLayout = QtGui.QHBoxLayout() window.playlistLayout = QtWidgets.QHBoxLayout()
window.playlistGroup.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) window.playlistGroup.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
window.playlistGroup.setAcceptDrops(True) window.playlistGroup.setAcceptDrops(True)
window.playlist = self.PlaylistWidget() window.playlist = self.PlaylistWidget()
window.playlist.setWindow(window) window.playlist.setWindow(window)
@ -1245,18 +1270,18 @@ class MainWindow(QtGui.QMainWindow):
window.playlist.setDragEnabled(True) window.playlist.setDragEnabled(True)
window.playlist.setAcceptDrops(True) window.playlist.setAcceptDrops(True)
window.playlist.setDropIndicatorShown(True) window.playlist.setDropIndicatorShown(True)
window.playlist.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) window.playlist.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
window.playlist.setDefaultDropAction(Qt.MoveAction) window.playlist.setDefaultDropAction(Qt.MoveAction)
window.playlist.setDragDropMode(QtGui.QAbstractItemView.InternalMove) window.playlist.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
window.playlist.doubleClicked.connect(self.playlistItemClicked) window.playlist.doubleClicked.connect(self.playlistItemClicked)
window.playlist.setContextMenuPolicy(Qt.CustomContextMenu) window.playlist.setContextMenuPolicy(Qt.CustomContextMenu)
window.playlist.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) window.playlist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
window.playlist.customContextMenuRequested.connect(self.openPlaylistMenu) window.playlist.customContextMenuRequested.connect(self.openPlaylistMenu)
self.playlistUpdateTimer = task.LoopingCall(self.playlistChangeCheck) self.playlistUpdateTimer = task.LoopingCall(self.playlistChangeCheck)
self.playlistUpdateTimer.start(0.1, True) self.playlistUpdateTimer.start(0.1, True)
noteFont = QtGui.QFont() noteFont = QtGui.QFont()
noteFont.setItalic(True) noteFont.setItalic(True)
playlistItem = QtGui.QListWidgetItem(getMessage("playlist-instruction-item-message")) playlistItem = QtWidgets.QListWidgetItem(getMessage("playlist-instruction-item-message"))
playlistItem.setFont(noteFont) playlistItem.setFont(noteFont)
window.playlist.addItem(playlistItem) window.playlist.addItem(playlistItem)
playlistItem.setFont(noteFont) playlistItem.setFont(noteFont)
@ -1266,7 +1291,7 @@ class MainWindow(QtGui.QMainWindow):
window.playlistGroup.setLayout(window.playlistLayout) window.playlistGroup.setLayout(window.playlistLayout)
window.listSplit.addWidget(window.playlistGroup) window.listSplit.addWidget(window.playlistGroup)
window.readyPushButton = QtGui.QPushButton() window.readyPushButton = QtWidgets.QPushButton()
readyFont = QtGui.QFont() readyFont = QtGui.QFont()
readyFont.setWeight(QtGui.QFont.Bold) readyFont.setWeight(QtGui.QFont.Bold)
window.readyPushButton.setText(getMessage("ready-guipushbuttonlabel")) window.readyPushButton.setText(getMessage("ready-guipushbuttonlabel"))
@ -1278,12 +1303,12 @@ class MainWindow(QtGui.QMainWindow):
window.readyPushButton.setToolTip(getMessage("ready-tooltip")) window.readyPushButton.setToolTip(getMessage("ready-tooltip"))
window.listLayout.addWidget(window.readyPushButton, Qt.AlignRight) window.listLayout.addWidget(window.readyPushButton, Qt.AlignRight)
window.autoplayLayout = QtGui.QHBoxLayout() window.autoplayLayout = QtWidgets.QHBoxLayout()
window.autoplayFrame = QtGui.QFrame() window.autoplayFrame = QtWidgets.QFrame()
window.autoplayFrame.setVisible(False) window.autoplayFrame.setVisible(False)
window.autoplayLayout.setContentsMargins(0,0,0,0) window.autoplayLayout.setContentsMargins(0,0,0,0)
window.autoplayFrame.setLayout(window.autoplayLayout) window.autoplayFrame.setLayout(window.autoplayLayout)
window.autoplayPushButton = QtGui.QPushButton() window.autoplayPushButton = QtWidgets.QPushButton()
autoPlayFont = QtGui.QFont() autoPlayFont = QtGui.QFont()
autoPlayFont.setWeight(QtGui.QFont.Bold) autoPlayFont.setWeight(QtGui.QFont.Bold)
window.autoplayPushButton.setText(getMessage("autoplay-guipushbuttonlabel")) window.autoplayPushButton.setText(getMessage("autoplay-guipushbuttonlabel"))
@ -1292,13 +1317,13 @@ class MainWindow(QtGui.QMainWindow):
window.autoplayPushButton.toggled.connect(self.changeAutoplayState) window.autoplayPushButton.toggled.connect(self.changeAutoplayState)
window.autoplayPushButton.setFont(autoPlayFont) window.autoplayPushButton.setFont(autoPlayFont)
window.autoplayPushButton.setStyleSheet(constants.STYLE_AUTO_PLAY_PUSHBUTTON) window.autoplayPushButton.setStyleSheet(constants.STYLE_AUTO_PLAY_PUSHBUTTON)
window.autoplayPushButton.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) window.autoplayPushButton.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
window.autoplayPushButton.setToolTip(getMessage("autoplay-tooltip")) window.autoplayPushButton.setToolTip(getMessage("autoplay-tooltip"))
window.autoplayLabel = QtGui.QLabel(getMessage("autoplay-minimum-label")) window.autoplayLabel = QtWidgets.QLabel(getMessage("autoplay-minimum-label"))
window.autoplayLabel.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) window.autoplayLabel.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
window.autoplayLabel.setMaximumWidth(window.autoplayLabel.minimumSizeHint().width()) window.autoplayLabel.setMaximumWidth(window.autoplayLabel.minimumSizeHint().width())
window.autoplayLabel.setToolTip(getMessage("autoplay-tooltip")) window.autoplayLabel.setToolTip(getMessage("autoplay-tooltip"))
window.autoplayThresholdSpinbox = QtGui.QSpinBox() window.autoplayThresholdSpinbox = QtWidgets.QSpinBox()
window.autoplayThresholdSpinbox.setMaximumWidth(window.autoplayThresholdSpinbox.minimumSizeHint().width()) window.autoplayThresholdSpinbox.setMaximumWidth(window.autoplayThresholdSpinbox.minimumSizeHint().width())
window.autoplayThresholdSpinbox.setMinimum(2) window.autoplayThresholdSpinbox.setMinimum(2)
window.autoplayThresholdSpinbox.setMaximum(99) window.autoplayThresholdSpinbox.setMaximum(99)
@ -1314,33 +1339,33 @@ class MainWindow(QtGui.QMainWindow):
window.bottomFrame.setMaximumHeight(window.bottomFrame.minimumSizeHint().height()) window.bottomFrame.setMaximumHeight(window.bottomFrame.minimumSizeHint().height())
def addPlaybackLayout(self, window): def addPlaybackLayout(self, window):
window.playbackFrame = QtGui.QFrame() window.playbackFrame = QtWidgets.QFrame()
window.playbackFrame.setVisible(False) window.playbackFrame.setVisible(False)
window.playbackFrame.setContentsMargins(0,0,0,0) window.playbackFrame.setContentsMargins(0,0,0,0)
window.playbackLayout = QtGui.QHBoxLayout() window.playbackLayout = QtWidgets.QHBoxLayout()
window.playbackLayout.setAlignment(Qt.AlignLeft) window.playbackLayout.setAlignment(Qt.AlignLeft)
window.playbackLayout.setContentsMargins(0,0,0,0) window.playbackLayout.setContentsMargins(0,0,0,0)
window.playbackFrame.setLayout(window.playbackLayout) window.playbackFrame.setLayout(window.playbackLayout)
window.seekInput = QtGui.QLineEdit() window.seekInput = QtWidgets.QLineEdit()
window.seekInput.returnPressed.connect(self.seekFromButton) window.seekInput.returnPressed.connect(self.seekFromButton)
window.seekButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + u'clock_go.png'), "") window.seekButton = QtWidgets.QPushButton(QtGui.QPixmap(self.resourcespath + u'clock_go.png'), "")
window.seekButton.setToolTip(getMessage("seektime-menu-label")) window.seekButton.setToolTip(getMessage("seektime-menu-label"))
window.seekButton.pressed.connect(self.seekFromButton) window.seekButton.pressed.connect(self.seekFromButton)
window.seekInput.setText("0:00") window.seekInput.setText("0:00")
window.seekInput.setFixedWidth(60) window.seekInput.setFixedWidth(60)
window.playbackLayout.addWidget(window.seekInput) window.playbackLayout.addWidget(window.seekInput)
window.playbackLayout.addWidget(window.seekButton) window.playbackLayout.addWidget(window.seekButton)
window.unseekButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + u'arrow_undo.png'), "") window.unseekButton = QtWidgets.QPushButton(QtGui.QPixmap(self.resourcespath + u'arrow_undo.png'), "")
window.unseekButton.setToolTip(getMessage("undoseek-menu-label")) window.unseekButton.setToolTip(getMessage("undoseek-menu-label"))
window.unseekButton.pressed.connect(self.undoSeek) window.unseekButton.pressed.connect(self.undoSeek)
window.miscLayout = QtGui.QHBoxLayout() window.miscLayout = QtWidgets.QHBoxLayout()
window.playbackLayout.addWidget(window.unseekButton) window.playbackLayout.addWidget(window.unseekButton)
window.playButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + u'control_play_blue.png'), "") window.playButton = QtWidgets.QPushButton(QtGui.QPixmap(self.resourcespath + u'control_play_blue.png'), "")
window.playButton.setToolTip(getMessage("play-menu-label")) window.playButton.setToolTip(getMessage("play-menu-label"))
window.playButton.pressed.connect(self.play) window.playButton.pressed.connect(self.play)
window.playbackLayout.addWidget(window.playButton) window.playbackLayout.addWidget(window.playButton)
window.pauseButton = QtGui.QPushButton(QtGui.QIcon(self.resourcespath + 'control_pause_blue.png'), "") window.pauseButton = QtWidgets.QPushButton(QtGui.QPixmap(self.resourcespath + 'control_pause_blue.png'), "")
window.pauseButton.setToolTip(getMessage("pause-menu-label")) window.pauseButton.setToolTip(getMessage("pause-menu-label"))
window.pauseButton.pressed.connect(self.pause) window.pauseButton.pressed.connect(self.pause)
window.playbackLayout.addWidget(window.pauseButton) window.playbackLayout.addWidget(window.pauseButton)
@ -1349,54 +1374,54 @@ class MainWindow(QtGui.QMainWindow):
window.outputLayout.addWidget(window.playbackFrame) window.outputLayout.addWidget(window.playbackFrame)
def addMenubar(self, window): def addMenubar(self, window):
window.menuBar = QtGui.QMenuBar() window.menuBar = QtWidgets.QMenuBar()
# File menu # File menu
window.fileMenu = QtGui.QMenu(getMessage("file-menu-label"), self) window.fileMenu = QtWidgets.QMenu(getMessage("file-menu-label"), self)
window.openAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'folder_explore.png'), window.openAction = window.fileMenu.addAction(QtGui.QPixmap(self.resourcespath + 'folder_explore.png'),
getMessage("openmedia-menu-label")) getMessage("openmedia-menu-label"))
window.openAction.triggered.connect(self.browseMediapath) window.openAction.triggered.connect(self.browseMediapath)
window.openAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'world_explore.png'), window.openAction = window.fileMenu.addAction(QtGui.QPixmap(self.resourcespath + 'world_explore.png'),
getMessage("openstreamurl-menu-label")) getMessage("openstreamurl-menu-label"))
window.openAction.triggered.connect(self.promptForStreamURL) window.openAction.triggered.connect(self.promptForStreamURL)
window.openAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'film_folder_edit.png'), window.openAction = window.fileMenu.addAction(QtGui.QPixmap(self.resourcespath + 'film_folder_edit.png'),
getMessage("setmediadirectories-menu-label")) getMessage("setmediadirectories-menu-label"))
window.openAction.triggered.connect(self.openSetMediaDirectoriesDialog) window.openAction.triggered.connect(self.openSetMediaDirectoriesDialog)
window.exitAction = window.fileMenu.addAction(QtGui.QIcon(self.resourcespath + 'cross.png'), window.exitAction = window.fileMenu.addAction(QtGui.QPixmap(self.resourcespath + 'cross.png'),
getMessage("exit-menu-label")) getMessage("exit-menu-label"))
window.exitAction.triggered.connect(self.exitSyncplay) window.exitAction.triggered.connect(self.exitSyncplay)
window.menuBar.addMenu(window.fileMenu) window.menuBar.addMenu(window.fileMenu)
# Playback menu # Playback menu
window.playbackMenu = QtGui.QMenu(getMessage("playback-menu-label"), self) window.playbackMenu = QtWidgets.QMenu(getMessage("playback-menu-label"), self)
window.playAction = window.playbackMenu.addAction(QtGui.QIcon(self.resourcespath + 'control_play_blue.png'), getMessage("play-menu-label")) window.playAction = window.playbackMenu.addAction(QtGui.QPixmap(self.resourcespath + 'control_play_blue.png'), getMessage("play-menu-label"))
window.playAction.triggered.connect(self.play) window.playAction.triggered.connect(self.play)
window.pauseAction = window.playbackMenu.addAction(QtGui.QIcon(self.resourcespath + 'control_pause_blue.png'), getMessage("pause-menu-label")) window.pauseAction = window.playbackMenu.addAction(QtGui.QPixmap(self.resourcespath + 'control_pause_blue.png'), getMessage("pause-menu-label"))
window.pauseAction.triggered.connect(self.pause) window.pauseAction.triggered.connect(self.pause)
window.seekAction = window.playbackMenu.addAction(QtGui.QIcon(self.resourcespath + 'clock_go.png'), getMessage("seektime-menu-label")) window.seekAction = window.playbackMenu.addAction(QtGui.QPixmap(self.resourcespath + 'clock_go.png'), getMessage("seektime-menu-label"))
window.seekAction.triggered.connect(self.seekPositionDialog) window.seekAction.triggered.connect(self.seekPositionDialog)
window.unseekAction = window.playbackMenu.addAction(QtGui.QIcon(self.resourcespath + 'arrow_undo.png'), getMessage("undoseek-menu-label")) window.unseekAction = window.playbackMenu.addAction(QtGui.QPixmap(self.resourcespath + 'arrow_undo.png'), getMessage("undoseek-menu-label"))
window.unseekAction.triggered.connect(self.undoSeek) window.unseekAction.triggered.connect(self.undoSeek)
window.menuBar.addMenu(window.playbackMenu) window.menuBar.addMenu(window.playbackMenu)
# Advanced menu # Advanced menu
window.advancedMenu = QtGui.QMenu(getMessage("advanced-menu-label"), self) window.advancedMenu = QtWidgets.QMenu(getMessage("advanced-menu-label"), self)
window.setoffsetAction = window.advancedMenu.addAction(QtGui.QIcon(self.resourcespath + 'timeline_marker.png'), window.setoffsetAction = window.advancedMenu.addAction(QtGui.QPixmap(self.resourcespath + 'timeline_marker.png'),
getMessage("setoffset-menu-label")) getMessage("setoffset-menu-label"))
window.setoffsetAction.triggered.connect(self.setOffset) window.setoffsetAction.triggered.connect(self.setOffset)
window.setTrustedDomainsAction = window.advancedMenu.addAction(QtGui.QIcon(self.resourcespath + 'shield_edit.png'), window.setTrustedDomainsAction = window.advancedMenu.addAction(QtGui.QPixmap(self.resourcespath + 'shield_edit.png'),
getMessage("settrusteddomains-menu-label")) getMessage("settrusteddomains-menu-label"))
window.setTrustedDomainsAction.triggered.connect(self.openSetTrustedDomainsDialog) window.setTrustedDomainsAction.triggered.connect(self.openSetTrustedDomainsDialog)
window.createcontrolledroomAction = window.advancedMenu.addAction( window.createcontrolledroomAction = window.advancedMenu.addAction(
QtGui.QIcon(self.resourcespath + 'page_white_key.png'), getMessage("createcontrolledroom-menu-label")) QtGui.QPixmap(self.resourcespath + 'page_white_key.png'), getMessage("createcontrolledroom-menu-label"))
window.createcontrolledroomAction.triggered.connect(self.createControlledRoom) window.createcontrolledroomAction.triggered.connect(self.createControlledRoom)
window.identifyascontroller = window.advancedMenu.addAction(QtGui.QIcon(self.resourcespath + 'key_go.png'), window.identifyascontroller = window.advancedMenu.addAction(QtGui.QPixmap(self.resourcespath + 'key_go.png'),
getMessage("identifyascontroller-menu-label")) getMessage("identifyascontroller-menu-label"))
window.identifyascontroller.triggered.connect(self.identifyAsController) window.identifyascontroller.triggered.connect(self.identifyAsController)
@ -1404,7 +1429,7 @@ class MainWindow(QtGui.QMainWindow):
# Window menu # Window menu
window.windowMenu = QtGui.QMenu(getMessage("window-menu-label"), self) window.windowMenu = QtWidgets.QMenu(getMessage("window-menu-label"), self)
window.playbackAction = window.windowMenu.addAction(getMessage("playbackbuttons-menu-label")) window.playbackAction = window.windowMenu.addAction(getMessage("playbackbuttons-menu-label"))
window.playbackAction.setCheckable(True) window.playbackAction.setCheckable(True)
@ -1418,18 +1443,18 @@ class MainWindow(QtGui.QMainWindow):
# Help menu # Help menu
window.helpMenu = QtGui.QMenu(getMessage("help-menu-label"), self) window.helpMenu = QtWidgets.QMenu(getMessage("help-menu-label"), self)
window.userguideAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'help.png'), window.userguideAction = window.helpMenu.addAction(QtGui.QPixmap(self.resourcespath + 'help.png'),
getMessage("userguide-menu-label")) getMessage("userguide-menu-label"))
window.userguideAction.triggered.connect(self.openUserGuide) window.userguideAction.triggered.connect(self.openUserGuide)
window.updateAction = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'application_get.png'), window.updateAction = window.helpMenu.addAction(QtGui.QPixmap(self.resourcespath + 'application_get.png'),
getMessage("update-menu-label")) getMessage("update-menu-label"))
window.updateAction.triggered.connect(self.userCheckForUpdates) window.updateAction.triggered.connect(self.userCheckForUpdates)
if not sys.platform.startswith('darwin'): if not sys.platform.startswith('darwin'):
window.helpMenu.addSeparator() window.helpMenu.addSeparator()
window.about = window.helpMenu.addAction(QtGui.QIcon(self.resourcespath + 'syncplay.png'), window.about = window.helpMenu.addAction(QtGui.QPixmap(self.resourcespath + 'syncplay.png'),
getMessage("about-menu-label")) getMessage("about-menu-label"))
else: else:
window.about = window.helpMenu.addAction("&About") window.about = window.helpMenu.addAction("&About")
@ -1442,9 +1467,9 @@ class MainWindow(QtGui.QMainWindow):
def openAbout(self): def openAbout(self):
aboutMsgBox = AboutDialog() aboutMsgBox = AboutDialog()
aboutMsgBox.exec_() aboutMsgBox.exec_()
def addMainFrame(self, window): def addMainFrame(self, window):
window.mainFrame = QtGui.QFrame() window.mainFrame = QtWidgets.QFrame()
window.mainFrame.setLineWidth(0) window.mainFrame.setLineWidth(0)
window.mainFrame.setMidLineWidth(0) window.mainFrame.setMidLineWidth(0)
window.mainFrame.setContentsMargins(0, 0, 0, 0) window.mainFrame.setContentsMargins(0, 0, 0, 0)
@ -1504,29 +1529,29 @@ class MainWindow(QtGui.QMainWindow):
def updateReadyIcon(self): def updateReadyIcon(self):
ready = self.readyPushButton.isChecked() ready = self.readyPushButton.isChecked()
if ready: if ready:
self.readyPushButton.setIcon(QtGui.QIcon(self.resourcespath + 'tick_checkbox.png')) self.readyPushButton.setIcon(QtGui.QPixmap(self.resourcespath + 'tick_checkbox.png'))
else: else:
self.readyPushButton.setIcon(QtGui.QIcon(self.resourcespath + 'empty_checkbox.png')) self.readyPushButton.setIcon(QtGui.QPixmap(self.resourcespath + 'empty_checkbox.png'))
def updateAutoPlayIcon(self): def updateAutoPlayIcon(self):
ready = self.autoplayPushButton.isChecked() ready = self.autoplayPushButton.isChecked()
if ready: if ready:
self.autoplayPushButton.setIcon(QtGui.QIcon(self.resourcespath + 'tick_checkbox.png')) self.autoplayPushButton.setIcon(QtGui.QPixmap(self.resourcespath + 'tick_checkbox.png'))
else: else:
self.autoplayPushButton.setIcon(QtGui.QIcon(self.resourcespath + 'empty_checkbox.png')) self.autoplayPushButton.setIcon(QtGui.QPixmap(self.resourcespath + 'empty_checkbox.png'))
def automaticUpdateCheck(self): def automaticUpdateCheck(self):
currentDateTime = datetime.utcnow() currentDateTimeValue = QDateTime.currentDateTime()
if not self.config['checkForUpdatesAutomatically']: if not self.config['checkForUpdatesAutomatically']:
return return
if self.config['lastCheckedForUpdates']: if self.config['lastCheckedForUpdates']:
configLastChecked = datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f") configLastChecked = datetime.strptime(self.config["lastCheckedForUpdates"], "%Y-%m-%d %H:%M:%S.%f")
if self.lastCheckedForUpdates is None or configLastChecked > self.lastCheckedForUpdates: if self.lastCheckedForUpdates is None or configLastChecked > self.lastCheckedForUpdates.toPython():
self.lastCheckedForUpdates = configLastChecked self.lastCheckedForUpdates = QDateTime.fromString(self.config["lastCheckedForUpdates"],'yyyy-MM-dd HH-mm-ss')
if self.lastCheckedForUpdates is None: if self.lastCheckedForUpdates is None:
self.checkForUpdates() self.checkForUpdates()
else: else:
timeDelta = currentDateTime - self.lastCheckedForUpdates timeDelta = currentDateTimeValue.toPython() - self.lastCheckedForUpdates.toPython()
if timeDelta.total_seconds() > constants.AUTOMATIC_UPDATE_CHECK_FREQUENCY: if timeDelta.total_seconds() > constants.AUTOMATIC_UPDATE_CHECK_FREQUENCY:
self.checkForUpdates() self.checkForUpdates()
@ -1535,7 +1560,7 @@ class MainWindow(QtGui.QMainWindow):
@needsClient @needsClient
def checkForUpdates(self, userInitiated=False): def checkForUpdates(self, userInitiated=False):
self.lastCheckedForUpdates = datetime.utcnow() self.lastCheckedForUpdates = QDateTime.currentDateTime()
updateStatus, updateMessage, updateURL, self.publicServerList = self._syncplayClient.checkForUpdate(userInitiated) updateStatus, updateMessage, updateURL, self.publicServerList = self._syncplayClient.checkForUpdate(userInitiated)
if updateMessage is None: if updateMessage is None:
@ -1549,12 +1574,12 @@ class MainWindow(QtGui.QMainWindow):
if userInitiated == True: if userInitiated == True:
updateURL = constants.SYNCPLAY_DOWNLOAD_URL updateURL = constants.SYNCPLAY_DOWNLOAD_URL
if updateURL is not None: if updateURL is not None:
reply = QtGui.QMessageBox.question(self, "Syncplay", reply = QtWidgets.QMessageBox.question(self, "Syncplay",
updateMessage, QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No) updateMessage, QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
if reply == QtGui.QMessageBox.Yes: if reply == QtWidgets.QMessageBox.Yes:
self.QtGui.QDesktopServices.openUrl(QUrl(updateURL)) self.QtGui.QDesktopServices.openUrl(QUrl(updateURL))
elif userInitiated: elif userInitiated:
QtGui.QMessageBox.information(self, "Syncplay", updateMessage) QtWidgets.QMessageBox.information(self, "Syncplay", updateMessage)
else: else:
self.showMessage(updateMessage) self.showMessage(updateMessage)
@ -1572,10 +1597,10 @@ class MainWindow(QtGui.QMainWindow):
data = event.mimeData() data = event.mimeData()
urls = data.urls() urls = data.urls()
if urls and urls[0].scheme() == 'file': if urls and urls[0].scheme() == 'file':
if sys.platform.startswith('darwin'): if sys.platform.startswith('darwin') and IsPySide:
dropfilepath = os.path.abspath(NSURL.URLWithString_(str(event.mimeData().urls()[0].toString())).filePathURL().path()) dropfilepath = os.path.abspath(NSURL.URLWithString_(str(url.toString())).filePathURL().path())
else: else:
dropfilepath = os.path.abspath(unicode(event.mimeData().urls()[0].toLocalFile())) dropfilepath = os.path.abspath(unicode(url.toLocalFile()))
if rewindFile == False: if rewindFile == False:
self._syncplayClient._player.openFile(dropfilepath) self._syncplayClient._player.openFile(dropfilepath)
else: else:
@ -1667,7 +1692,7 @@ class MainWindow(QtGui.QMainWindow):
settings.endGroup() settings.endGroup()
settings = QSettings("Syncplay", "Interface") settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update") settings.beginGroup("Update")
settings.setValue("lastChecked", self.lastCheckedForUpdates) settings.setValue("lastCheckedQt", self.lastCheckedForUpdates)
settings.endGroup() settings.endGroup()
settings.beginGroup("PublicServerList") settings.beginGroup("PublicServerList")
if self.publicServerList: if self.publicServerList:
@ -1694,7 +1719,7 @@ class MainWindow(QtGui.QMainWindow):
settings.endGroup() settings.endGroup()
settings = QSettings("Syncplay", "Interface") settings = QSettings("Syncplay", "Interface")
settings.beginGroup("Update") settings.beginGroup("Update")
self.lastCheckedForUpdates = settings.value("lastChecked", None) self.lastCheckedForUpdates = settings.value("lastCheckedQt", None)
settings.endGroup() settings.endGroup()
settings.beginGroup("PublicServerList") settings.beginGroup("PublicServerList")
self.publicServerList = settings.value("publicServers", None) self.publicServerList = settings.value("publicServers", None)
@ -1716,13 +1741,13 @@ class MainWindow(QtGui.QMainWindow):
else: else:
self.setWindowFlags(self.windowFlags() & Qt.AA_DontUseNativeMenuBar) self.setWindowFlags(self.windowFlags() & Qt.AA_DontUseNativeMenuBar)
self.setWindowTitle("Syncplay v" + version) self.setWindowTitle("Syncplay v" + version)
self.mainLayout = QtGui.QVBoxLayout() self.mainLayout = QtWidgets.QVBoxLayout()
self.addTopLayout(self) self.addTopLayout(self)
self.addBottomLayout(self) self.addBottomLayout(self)
self.addMenubar(self) self.addMenubar(self)
self.addMainFrame(self) self.addMainFrame(self)
self.loadSettings() self.loadSettings()
self.setWindowIcon(QtGui.QIcon(self.resourcespath + u"syncplay.png")) self.setWindowIcon(QtGui.QPixmap(self.resourcespath + u"syncplay.png"))
self.setWindowFlags(self.windowFlags() & Qt.WindowCloseButtonHint & Qt.AA_DontUseNativeMenuBar & Qt.WindowMinimizeButtonHint & ~Qt.WindowContextHelpButtonHint) self.setWindowFlags(self.windowFlags() & Qt.WindowCloseButtonHint & Qt.AA_DontUseNativeMenuBar & Qt.WindowMinimizeButtonHint & ~Qt.WindowContextHelpButtonHint)
self.show() self.show()
self.setAcceptDrops(True) self.setAcceptDrops(True)

1620
syncplay/vendor/Qt.py vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,76 @@
# Copyright (c) 2001-2011 Twisted Matrix Laboratories. # -*- coding: utf-8 -*-
# See LICENSE for details. # Copyright (c) 2001-2017
# Allen Short
# Andy Gayton
# Andrew Bennetts
# Antoine Pitrou
# Apple Computer, Inc.
# Ashwini Oruganti
# bakbuk
# Benjamin Bruheim
# Bob Ippolito
# Burak Nehbit
# Canonical Limited
# Christopher Armstrong
# Christopher R. Wood
# David Reid
# Donovan Preston
# Elvis Stansvik
# Eric Mangold
# Eyal Lotem
# Glenn Tarbox
# Google Inc.
# Hybrid Logic Ltd.
# Hynek Schlawack
# Itamar Turner-Trauring
# James Knight
# Jason A. Mobarak
# Jean-Paul Calderone
# Jessica McKellar
# Jonathan Jacobs
# Jonathan Lange
# Jonathan D. Simms
# Jürgen Hermann
# Julian Berman
# Kevin Horn
# Kevin Turner
# Kyle Altendorf
# Laurens Van Houtven
# Mary Gardiner
# Matthew Lefkowitz
# Massachusetts Institute of Technology
# Moshe Zadka
# Paul Swartz
# Pavel Pergamenshchik
# Ralph Meijer
# Richard Wall
# Sean Riley
# Software Freedom Conservancy
# Tarashish Mishra
# Travis B. Hartwell
# Thijs Triemstra
# Thomas Herve
# Timothy Allen
# Tom Prince
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
@ -7,13 +78,8 @@ This module provides support for Twisted to be driven by the Qt mainloop.
In order to use this support, simply do the following:: In order to use this support, simply do the following::
| app = QApplication(sys.argv) # your code to init Qt | app = QApplication(sys.argv) # your code to init Qt
| import qt4reactor | import qt5reactor
| qt4reactor.install() | qt5reactor.install()
alternatively:
| from twisted.application import reactors
| reactors.installReactor('qt4')
Then use twisted.internet APIs as usual. The other methods here are not Then use twisted.internet APIs as usual. The other methods here are not
intended to be called directly. intended to be called directly.
@ -27,65 +93,61 @@ Twisted can be initialized after QApplication.exec_() with a call to
reactor.runReturn(). calling reactor.stop() will unhook twisted but reactor.runReturn(). calling reactor.stop() will unhook twisted but
leave your Qt application running leave your Qt application running
API Stability: stable Qt5 Port: U{Burak Nehbit<mailto:burak@nehbit.net>}
Maintainer: U{Glenn H Tarbox, PhD<mailto:glenn@tarbox.org>} Current maintainer: U{Christopher R. Wood<mailto:chris@leastauthority.com>}
Previous maintainer: U{Tarashish Mishra<mailto:sunu@sunu.in>}
Previous maintainer: U{Glenn H Tarbox, PhD<mailto:glenn@tarbox.org>}
Previous maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>} Previous maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>}
Original port to QT4: U{Gabe Rudy<mailto:rudy@goldenhelix.com>} Original port to QT4: U{Gabe Rudy<mailto:rudy@goldenhelix.com>}
Subsequent port by therve Subsequent port by therve
""" """
import sys import sys
import time
from zope.interface import implements from syncplay.vendor.Qt.QtCore import (
QCoreApplication, QEventLoop, QObject, QSocketNotifier, QTimer, Signal)
from twisted.internet import posixbase
from twisted.internet.interfaces import IReactorFDSet from twisted.internet.interfaces import IReactorFDSet
from twisted.python import log, runtime from twisted.python import log, runtime
from twisted.internet import posixbase from zope.interface import implementer
from twisted.python.runtime import platformType, platform
try:
from PyQt4.QtCore import QSocketNotifier, QObject, SIGNAL, QTimer, QCoreApplication
from PyQt4.QtCore import QEventLoop
except ImportError:
from PySide.QtCore import QSocketNotifier, QObject, SIGNAL, QTimer, QCoreApplication
from PySide.QtCore import QEventLoop
class TwistedSocketNotifier(QObject): class TwistedSocketNotifier(QObject):
""" """Connection between an fd event and reader/writer callbacks."""
Connection between an fd event and reader/writer callbacks.
""" activated = Signal(int)
def __init__(self, parent, reactor, watcher, socketType): def __init__(self, parent, reactor, watcher, socketType):
QObject.__init__(self, parent) QObject.__init__(self, parent)
self.reactor = reactor self.reactor = reactor
self.watcher = watcher self.watcher = watcher
fd = watcher.fileno() fd = self.watcher.fileno()
self.notifier = QSocketNotifier(fd, socketType, parent) self.notifier = QSocketNotifier(watcher, socketType, parent)
self.notifier.setEnabled(True) self.notifier.setEnabled(True)
if socketType == QSocketNotifier.Read: if socketType == QSocketNotifier.Read:
self.fn = self.read self.fn = self.read
else: else:
self.fn = self.write self.fn = self.write
QObject.connect(self.notifier, SIGNAL("activated(int)"), self.fn) self.notifier.activated.connect(self.fn)
def shutdown(self): def shutdown(self):
self.notifier.setEnabled(False) self.notifier.setEnabled(False)
self.disconnect(self.notifier, SIGNAL("activated(int)"), self.fn) self.notifier.activated.disconnect(self.fn)
self.fn = self.watcher = None self.fn = self.watcher = None
self.notifier.deleteLater() self.notifier.deleteLater()
self.deleteLater() self.deleteLater()
def read(self, fd): def read(self, fd):
if not self.watcher: if not self.watcher:
return return
w = self.watcher w = self.watcher
# doRead can cause self.shutdown to be called so keep a reference to self.watcher # doRead can cause self.shutdown to be called so keep
# a reference to self.watcher
def _read(): def _read():
#Don't call me again, until the data has been read # Don't call me again, until the data has been read
self.notifier.setEnabled(False) self.notifier.setEnabled(False)
why = None why = None
try: try:
@ -98,18 +160,20 @@ class TwistedSocketNotifier(QObject):
if why: if why:
self.reactor._disconnectSelectable(w, why, inRead) self.reactor._disconnectSelectable(w, why, inRead)
elif self.watcher: elif self.watcher:
self.notifier.setEnabled(True) # Re enable notification following sucessfull read self.notifier.setEnabled(True)
# Re enable notification following sucessfull read
self.reactor._iterate(fromqt=True) self.reactor._iterate(fromqt=True)
log.callWithLogger(w, _read) log.callWithLogger(w, _read)
def write(self, sock): def write(self, sock):
if not self.watcher: if not self.watcher:
return return
w = self.watcher w = self.watcher
def _write(): def _write():
why = None why = None
self.notifier.setEnabled(False) self.notifier.setEnabled(False)
try: try:
why = w.doWrite() why = w.doWrite()
except: except:
@ -120,12 +184,13 @@ class TwistedSocketNotifier(QObject):
elif self.watcher: elif self.watcher:
self.notifier.setEnabled(True) self.notifier.setEnabled(True)
self.reactor._iterate(fromqt=True) self.reactor._iterate(fromqt=True)
log.callWithLogger(w, _write) log.callWithLogger(w, _write)
@implementer(IReactorFDSet)
class QtReactor(posixbase.PosixReactorBase): class QtReactor(posixbase.PosixReactorBase):
implements(IReactorFDSet) # implements(IReactorFDSet)
def __init__(self): def __init__(self):
self._reads = {} self._reads = {}
@ -133,19 +198,17 @@ class QtReactor(posixbase.PosixReactorBase):
self._notifiers = {} self._notifiers = {}
self._timer = QTimer() self._timer = QTimer()
self._timer.setSingleShot(True) self._timer.setSingleShot(True)
QObject.connect(self._timer, SIGNAL("timeout()"), self.iterate) self._timer.timeout.connect(self.iterate_qt)
if QCoreApplication.instance() is None: if QCoreApplication.instance() is None:
# Application Object has not been started yet # Application Object has not been started yet
self.qApp=QCoreApplication([]) self.qApp = QCoreApplication([])
self._ownApp=True self._ownApp = True
else: else:
self.qApp = QCoreApplication.instance() self.qApp = QCoreApplication.instance()
self._ownApp=False self._ownApp = False
self._blockApp = None self._blockApp = None
posixbase.PosixReactorBase.__init__(self) posixbase.PosixReactorBase.__init__(self)
def _add(self, xer, primary, type): def _add(self, xer, primary, type):
""" """
Private method for adding a descriptor from the event loop. Private method for adding a descriptor from the event loop.
@ -156,21 +219,14 @@ class QtReactor(posixbase.PosixReactorBase):
if xer not in primary: if xer not in primary:
primary[xer] = TwistedSocketNotifier(None, self, xer, type) primary[xer] = TwistedSocketNotifier(None, self, xer, type)
def addReader(self, reader): def addReader(self, reader):
""" """Add a FileDescriptor for notification of data available to read."""
Add a FileDescriptor for notification of data available to read.
"""
self._add(reader, self._reads, QSocketNotifier.Read) self._add(reader, self._reads, QSocketNotifier.Read)
def addWriter(self, writer): def addWriter(self, writer):
""" """Add a FileDescriptor for notification of data available to write."""
Add a FileDescriptor for notification of data available to write.
"""
self._add(writer, self._writes, QSocketNotifier.Write) self._add(writer, self._writes, QSocketNotifier.Write)
def _remove(self, xer, primary): def _remove(self, xer, primary):
""" """
Private method for removing a descriptor from the event loop. Private method for removing a descriptor from the event loop.
@ -182,81 +238,66 @@ class QtReactor(posixbase.PosixReactorBase):
notifier = primary.pop(xer) notifier = primary.pop(xer)
notifier.shutdown() notifier.shutdown()
def removeReader(self, reader): def removeReader(self, reader):
""" """Remove a Selectable for notification of data available to read."""
Remove a Selectable for notification of data available to read.
"""
self._remove(reader, self._reads) self._remove(reader, self._reads)
def removeWriter(self, writer): def removeWriter(self, writer):
""" """Remove a Selectable for notification of data available to write."""
Remove a Selectable for notification of data available to write.
"""
self._remove(writer, self._writes) self._remove(writer, self._writes)
def removeAll(self): def removeAll(self):
""" """Remove all selectables, and return a list of them."""
Remove all selectables, and return a list of them. return self._removeAll(self._reads, self._writes)
"""
rv = self._removeAll(self._reads, self._writes)
return rv
def getReaders(self): def getReaders(self):
return self._reads.keys() return self._reads.keys()
def getWriters(self): def getWriters(self):
return self._writes.keys() return self._writes.keys()
def callLater(self, howlong, *args, **kargs):
def callLater(self,howlong, *args, **kargs): rval = super(QtReactor, self).callLater(howlong, *args, **kargs)
rval = super(QtReactor,self).callLater(howlong, *args, **kargs)
self.reactorInvocation() self.reactorInvocation()
return rval return rval
def reactorInvocation(self): def reactorInvocation(self):
self._timer.stop() self._timer.stop()
self._timer.setInterval(0) self._timer.setInterval(0)
self._timer.start() self._timer.start()
def _iterate(self, delay=None, fromqt=False): def _iterate(self, delay=None, fromqt=False):
"""See twisted.internet.interfaces.IReactorCore.iterate. """See twisted.internet.interfaces.IReactorCore.iterate."""
"""
self.runUntilCurrent() self.runUntilCurrent()
self.doIteration(delay, fromqt) self.doIteration(delay, fromqt=fromqt)
iterate = _iterate iterate = _iterate
def iterate_qt(self, delay=None):
self.iterate(delay=delay, fromqt=True)
def doIteration(self, delay=None, fromqt=False): def doIteration(self, delay=None, fromqt=False):
'This method is called by a Qt timer or by network activity on a file descriptor' """This method is called by a Qt timer or by network activity on a file descriptor"""
if not self.running and self._blockApp: if not self.running and self._blockApp:
self._blockApp.quit() self._blockApp.quit()
self._timer.stop() self._timer.stop()
if delay is None:
delay = 0
delay = max(delay, 1) delay = max(delay, 1)
if not fromqt: if not fromqt:
self.qApp.processEvents(QEventLoop.AllEvents, delay * 1000) self.qApp.processEvents(QEventLoop.AllEvents, delay * 1000)
if self.timeout() is None: t = self.timeout()
timeout = 0.1 if t is None:
elif self.timeout() == 0: timeout = 0.01
timeout = 0
else: else:
timeout = self.timeout() timeout = min(t, 0.01)
self._timer.setInterval(timeout * 1000) self._timer.setInterval(timeout * 1000)
self._timer.start() self._timer.start()
def runReturn(self, installSignalHandlers=True): def runReturn(self, installSignalHandlers=True):
self.startRunning(installSignalHandlers=installSignalHandlers) self.startRunning(installSignalHandlers=installSignalHandlers)
self.reactorInvocation() self.reactorInvocation()
def run(self, installSignalHandlers=True): def run(self, installSignalHandlers=True):
if self._ownApp: if self._ownApp:
self._blockApp = self.qApp self._blockApp = self.qApp
@ -264,6 +305,21 @@ class QtReactor(posixbase.PosixReactorBase):
self._blockApp = QEventLoop() self._blockApp = QEventLoop()
self.runReturn() self.runReturn()
self._blockApp.exec_() self._blockApp.exec_()
if self.running:
self.stop()
self.runUntilCurrent()
# def sigInt(self, *args):
# print('I received a sigint. BAIBAI')
# posixbase.PosixReactorBase.sigInt()
#
# def sigTerm(self, *args):
# print('I received a sigterm. BAIBAI')
# posixbase.PosixReactorBase.sigTerm()
#
# def sigBreak(self, *args):
# print('I received a sigbreak. BAIBAI')
# posixbase.PosixReactorBase.sigBreak()
class QtEventReactor(QtReactor): class QtEventReactor(QtReactor):
@ -271,22 +327,15 @@ class QtEventReactor(QtReactor):
self._events = {} self._events = {}
super(QtEventReactor, self).__init__() super(QtEventReactor, self).__init__()
def addEvent(self, event, fd, action): def addEvent(self, event, fd, action):
""" """Add a new win32 event to the event loop."""
Add a new win32 event to the event loop.
"""
self._events[event] = (fd, action) self._events[event] = (fd, action)
def removeEvent(self, event): def removeEvent(self, event):
""" """Remove an event."""
Remove an event.
"""
if event in self._events: if event in self._events:
del self._events[event] del self._events[event]
def doEvents(self): def doEvents(self):
handles = self._events.keys() handles = self._events.keys()
if len(handles) > 0: if len(handles) > 0:
@ -304,46 +353,33 @@ class QtEventReactor(QtReactor):
#print 'Got an unexpected return of %r' % val #print 'Got an unexpected return of %r' % val
return return
def _runAction(self, action, fd): def _runAction(self, action, fd):
try: try:
closed = getattr(fd, action)() closed = getattr(fd, action)()
except: except:
closed = sys.exc_info()[1] closed = sys.exc_info()[1]
log.deferr() log.deferr()
if closed: if closed:
self._disconnectSelectable(fd, closed, action == 'doRead') self._disconnectSelectable(fd, closed, action == 'doRead')
def iterate(self, delay=None, fromqt=False):
def timeout(self): """See twisted.internet.interfaces.IReactorCore.iterate."""
t = super(QtEventReactor, self).timeout()
return min(t, 0.01)
def iterate(self, delay=None):
"""See twisted.internet.interfaces.IReactorCore.iterate.
"""
self.runUntilCurrent() self.runUntilCurrent()
self.doEvents() self.doEvents()
self.doIteration(delay) self.doIteration(delay, fromqt=fromqt)
def posixinstall(): def posixinstall():
""" """Install the Qt reactor."""
Install the Qt reactor.
"""
p = QtReactor()
from twisted.internet.main import installReactor from twisted.internet.main import installReactor
p = QtReactor()
installReactor(p) installReactor(p)
def win32install(): def win32install():
""" """Install the Qt reactor."""
Install the Qt reactor.
"""
p = QtEventReactor()
from twisted.internet.main import installReactor from twisted.internet.main import installReactor
p = QtEventReactor()
installReactor(p) installReactor(p)
@ -356,4 +392,3 @@ else:
__all__ = ["install"] __all__ = ["install"]