Merge branch 'v0.6' into qt5-wip #2237

Open
kashikoibumi wants to merge 38 commits from kashikoibumi/qt5-wip into v0.6
2 changed files with 144 additions and 117 deletions
Showing only changes of commit b9fca03ed1 - Show all commits

View File

@ -1,14 +1,16 @@
"""
Address validator module.
The validator for address and passphrase QLineEdits
used in `.dialogs.NewChanDialog`.
"""
# pylint: disable=too-many-branches,too-many-arguments
# pylint: disable=too-many-arguments
from PyQt4 import QtGui
from Queue import Empty
from PyQt5 import QtGui
from account import getSortedAccounts
from addresses import decodeAddress, addBMIfNotPresent
from queues import apiAddressGeneratorReturnQueue, addressGeneratorQueue
from queues import addressGeneratorQueue, apiAddressGeneratorReturnQueue
from tr import _translate
from utils import str_chan
@ -16,22 +18,18 @@ from utils import str_chan
class AddressPassPhraseValidatorMixin(object):
"""Bitmessage address or passphrase validator class for Qt UI"""
def setParams(
self,
passPhraseObject=None,
addressObject=None,
feedBackObject=None,
buttonBox=None,
addressMandatory=True,
self, passPhraseObject=None, addressObject=None,
feedBackObject=None, button=None, addressMandatory=True
):
"""Initialisation"""
"""Initialization"""
self.addressObject = addressObject
self.passPhraseObject = passPhraseObject
self.feedBackObject = feedBackObject
self.buttonBox = buttonBox
self.addressMandatory = addressMandatory
self.isValid = False
# save default text
self.okButtonLabel = self.buttonBox.button(QtGui.QDialogButtonBox.Ok).text()
self.okButton = button
self.okButtonLabel = button.text()
def setError(self, string):
"""Indicate that the validation is pending or failed"""
@ -42,13 +40,13 @@ class AddressPassPhraseValidatorMixin(object):
self.feedBackObject.setStyleSheet("QLabel { color : red; }")
self.feedBackObject.setText(string)
self.isValid = False
if self.buttonBox:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
if self.okButton:
self.okButton.setEnabled(False)
if string is not None and self.feedBackObject is not None:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(
self.okButton.setText(
_translate("AddressValidator", "Invalid"))
else:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(
self.okButton.setText(
_translate("AddressValidator", "Validating..."))
def setOK(self, string):
@ -60,9 +58,9 @@ class AddressPassPhraseValidatorMixin(object):
self.feedBackObject.setStyleSheet("QLabel { }")
self.feedBackObject.setText(string)
self.isValid = True
if self.buttonBox:
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True)
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(self.okButtonLabel)
if self.okButton:
self.okButton.setEnabled(True)
self.okButton.setText(self.okButtonLabel)
def checkQueue(self):
"""Validator queue loop"""
@ -75,7 +73,8 @@ class AddressPassPhraseValidatorMixin(object):
while True:
try:
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(False)
addressGeneratorReturnValue = \
apiAddressGeneratorReturnQueue.get(False)
except Empty:
if gotOne:
break
@ -85,96 +84,120 @@ class AddressPassPhraseValidatorMixin(object):
gotOne = True
if not addressGeneratorReturnValue:
self.setError(_translate("AddressValidator", "Address already present as one of your identities."))
return (QtGui.QValidator.Intermediate, 0)
if addressGeneratorReturnValue[0] == 'chan name does not match address':
self.setError(
_translate(
self.setError(_translate(
"AddressValidator",
"Although the Bitmessage address you "
"entered was valid, it doesn't match the chan name."))
return (QtGui.QValidator.Intermediate, 0)
self.setOK(_translate("MainWindow", "Passphrase and address appear to be valid."))
"Address already present as one of your identities."
))
return
if addressGeneratorReturnValue[0] == \
'chan name does not match address':
self.setError(_translate(
"AddressValidator",
"Although the Bitmessage address you entered was valid,"
" it doesn\'t match the chan name."
))
return
self.setOK(_translate(
"MainWindow", "Passphrase and address appear to be valid."))
def returnValid(self):
"""Return the value of whether the validation was successful"""
if self.isValid:
return QtGui.QValidator.Acceptable
return QtGui.QValidator.Intermediate
return QtGui.QValidator.Acceptable if self.isValid \
else QtGui.QValidator.Intermediate
def validate(self, s, pos):
"""Top level validator method"""
if self.addressObject is None:
try:
address = self.addressObject.text().encode('utf-8')
except AttributeError:
address = None
else:
address = str(self.addressObject.text().toUtf8())
if address == "":
address = None
if self.passPhraseObject is None:
try:
passPhrase = self.passPhraseObject.text().encode('utf-8')
except AttributeError:
passPhrase = ""
else:
passPhrase = str(self.passPhraseObject.text().toUtf8())
if passPhrase == "":
passPhrase = None
# no chan name
if passPhrase is None:
self.setError(_translate("AddressValidator", "Chan name/passphrase needed. You didn't enter a chan name."))
return (QtGui.QValidator.Intermediate, pos)
if not passPhrase:
self.setError(_translate(
"AddressValidator",
"Chan name/passphrase needed. You didn't enter a chan name."
))
return (QtGui.QValidator.Intermediate, s, pos)
if self.addressMandatory or address is not None:
if self.addressMandatory or address:
# check if address already exists:
if address in getSortedAccounts():
self.setError(_translate("AddressValidator", "Address already present as one of your identities."))
return (QtGui.QValidator.Intermediate, pos)
# version too high
if decodeAddress(address)[0] == 'versiontoohigh':
self.setError(
_translate(
self.setError(_translate(
"AddressValidator",
"Address too new. Although that Bitmessage"
" address might be valid, its version number"
" is too new for us to handle. Perhaps you need"
" to upgrade Bitmessage."))
return (QtGui.QValidator.Intermediate, pos)
"Address already present as one of your identities."
))
return (QtGui.QValidator.Intermediate, s, pos)
status = decodeAddress(address)[0]
# version too high
if status == 'versiontoohigh':
self.setError(_translate(
"AddressValidator",
"Address too new. Although that Bitmessage address"
" might be valid, its version number is too new"
" for us to handle. Perhaps you need to upgrade"
" Bitmessage."
))
return (QtGui.QValidator.Intermediate, s, pos)
# invalid
if decodeAddress(address)[0] != 'success':
self.setError(_translate("AddressValidator", "The Bitmessage address is not valid."))
return (QtGui.QValidator.Intermediate, pos)
if status != 'success':
self.setError(_translate(
"AddressValidator",
"The Bitmessage address is not valid."
))
return (QtGui.QValidator.Intermediate, s, pos)
# this just disables the OK button without changing the feedback text
# but only if triggered by textEdited, not by clicking the Ok button
if not self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
if not self.okButton.hasFocus():
self.setError(None)
# check through generator
if address is None:
addressGeneratorQueue.put(('createChan', 4, 1, str_chan + ' ' + str(passPhrase), passPhrase, False))
if not address:
addressGeneratorQueue.put((
'createChan', 4, 1,
str_chan + ' ' + passPhrase, passPhrase, False
))
else:
addressGeneratorQueue.put(
('joinChan', addBMIfNotPresent(address),
"{} {}".format(str_chan, passPhrase), passPhrase, False))
addressGeneratorQueue.put((
'joinChan', addBMIfNotPresent(address),
"{} {}".format(str_chan, passPhrase), passPhrase, False
))
if self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
return (self.returnValid(), pos)
return (QtGui.QValidator.Intermediate, pos)
if self.okButton.hasFocus():
return (self.returnValid(), s, pos)
else:
return (QtGui.QValidator.Intermediate, s, pos)
def checkData(self):
"""Validator Qt signal interface"""
return self.validate("", 0)
return self.validate(u"", 0)
class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
"""AddressValidator class for Qt UI"""
def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True):
def __init__(
self, parent=None, passPhraseObject=None, feedBackObject=None,
button=None, addressMandatory=True
):
super(AddressValidator, self).__init__(parent)
self.setParams(passPhraseObject, parent, feedBackObject, buttonBox, addressMandatory)
self.setParams(
passPhraseObject, parent, feedBackObject, button,
addressMandatory)
class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
"""PassPhraseValidator class for Qt UI"""
def __init__(self, parent=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=False):
def __init__(
self, parent=None, addressObject=None, feedBackObject=None,
button=None, addressMandatory=False
):
super(PassPhraseValidator, self).__init__(parent)
self.setParams(parent, addressObject, feedBackObject, buttonBox, addressMandatory)
self.setParams(
parent, addressObject, feedBackObject, button,
addressMandatory)

View File

@ -1,10 +1,8 @@
"""
src/bitmessageqt/newchandialog.py
=================================
NewChanDialog class definition
"""
from PyQt4 import QtCore, QtGui
from PyQt5 import QtCore, QtWidgets
import widgets
from addresses import addBMIfNotPresent
@ -15,30 +13,21 @@ from tr import _translate
from utils import str_chan
class NewChanDialog(QtGui.QDialog):
"""The `New Chan` dialog"""
class NewChanDialog(QtWidgets.QDialog):
"""The "New Chan" dialog"""
def __init__(self, parent=None):
super(NewChanDialog, self).__init__(parent)
widgets.load('newchandialog.ui', self)
self.parent = parent
self.chanAddress.setValidator(
AddressValidator(
self.chanAddress,
self.chanPassPhrase,
self.validatorFeedback,
self.buttonBox,
False))
self.chanPassPhrase.setValidator(
PassPhraseValidator(
self.chanPassPhrase,
self.chanAddress,
self.validatorFeedback,
self.buttonBox,
False))
self.chanAddress.setValidator(AddressValidator(
self.chanAddress, self.chanPassPhrase, self.validatorFeedback,
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
self.chanPassPhrase.setValidator(PassPhraseValidator(
self.chanPassPhrase, self.chanAddress, self.validatorFeedback,
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
self.timer = QtCore.QTimer()
QtCore.QObject.connect( # pylint: disable=no-member
self.timer, QtCore.SIGNAL("timeout()"), self.delayedUpdateStatus)
self.timer.timeout.connect(self.delayedUpdateStatus)
self.timer.start(500) # milliseconds
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.show()
@ -52,32 +41,47 @@ class NewChanDialog(QtGui.QDialog):
self.timer.stop()
self.hide()
apiAddressGeneratorReturnQueue.queue.clear()
if self.chanAddress.text().toUtf8() == "":
addressGeneratorQueue.put(
('createChan', 4, 1, str_chan + ' ' + str(self.chanPassPhrase.text().toUtf8()),
self.chanPassPhrase.text().toUtf8(),
True))
passPhrase = self.chanPassPhrase.text().encode('utf-8')
if self.chanAddress.text() == "":
addressGeneratorQueue.put((
'createChan', 4, 1,
str_chan + ' ' + passPhrase, passPhrase, True
))
else:
addressGeneratorQueue.put(
('joinChan', addBMIfNotPresent(self.chanAddress.text().toUtf8()),
str_chan + ' ' + str(self.chanPassPhrase.text().toUtf8()),
self.chanPassPhrase.text().toUtf8(),
True))
addressGeneratorQueue.put((
'joinChan', addBMIfNotPresent(self.chanAddress.text()),
str_chan + ' ' + passPhrase, passPhrase, True
))
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True)
if addressGeneratorReturnValue and addressGeneratorReturnValue[0] != 'chan name does not match address':
UISignalQueue.put(('updateStatusBar', _translate(
"newchandialog", "Successfully created / joined chan %1").arg(unicode(self.chanPassPhrase.text()))))
if (
len(addressGeneratorReturnValue) > 0
and addressGeneratorReturnValue[0]
!= 'chan name does not match address'
):
UISignalQueue.put((
'updateStatusBar',
_translate(
"newchandialog",
"Successfully created / joined chan {0}"
).format(passPhrase)
))
self.parent.ui.tabWidget.setCurrentIndex(
self.parent.ui.tabWidget.indexOf(self.parent.ui.chans)
)
self.done(QtGui.QDialog.Accepted)
self.done(QtWidgets.QDialog.Accepted)
else:
UISignalQueue.put(('updateStatusBar', _translate("newchandialog", "Chan creation / joining failed")))
self.done(QtGui.QDialog.Rejected)
UISignalQueue.put((
'updateStatusBar',
_translate("newchandialog", "Chan creation / joining failed")
))
self.done(QtWidgets.QDialog.Rejected)
def reject(self):
"""Cancel joining the chan"""
self.timer.stop()
self.hide()
UISignalQueue.put(('updateStatusBar', _translate("newchandialog", "Chan creation / joining cancelled")))
self.done(QtGui.QDialog.Rejected)
UISignalQueue.put((
'updateStatusBar',
_translate("newchandialog", "Chan creation / joining cancelled")
))
self.done(QtWidgets.QDialog.Rejected)