Sorted things out with validation of NewChanDialog
This commit is contained in:
parent
d07ab6dfd3
commit
fc6613faa3
|
@ -1,22 +1,32 @@
|
|||
from PyQt4 import QtGui
|
||||
"""
|
||||
The validator for address and passphrase QLineEdits
|
||||
used in `.dialogs.NewChanDialog`.
|
||||
"""
|
||||
|
||||
from Queue import Empty
|
||||
|
||||
from qtpy import QtGui
|
||||
|
||||
from addresses import decodeAddress, addBMIfNotPresent
|
||||
from account import getSortedAccounts
|
||||
from queues import apiAddressGeneratorReturnQueue, addressGeneratorQueue
|
||||
from tr import _translate
|
||||
from utils import str_chan
|
||||
|
||||
class AddressPassPhraseValidatorMixin():
|
||||
def setParams(self, passPhraseObject=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True):
|
||||
|
||||
class AddressPassPhraseValidatorMixin(object):
|
||||
def setParams(
|
||||
self, passPhraseObject=None, addressObject=None,
|
||||
feedBackObject=None, button=None, addressMandatory=True
|
||||
):
|
||||
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):
|
||||
if string is not None and self.feedBackObject is not None:
|
||||
|
@ -26,12 +36,14 @@ class AddressPassPhraseValidatorMixin():
|
|||
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(_translate("AddressValidator", "Invalid"))
|
||||
self.okButton.setText(
|
||||
_translate("AddressValidator", "Invalid"))
|
||||
else:
|
||||
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(_translate("AddressValidator", "Validating..."))
|
||||
self.okButton.setText(
|
||||
_translate("AddressValidator", "Validating..."))
|
||||
|
||||
def setOK(self, string):
|
||||
if string is not None and self.feedBackObject is not None:
|
||||
|
@ -41,9 +53,9 @@ class AddressPassPhraseValidatorMixin():
|
|||
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):
|
||||
gotOne = False
|
||||
|
@ -55,7 +67,8 @@ class AddressPassPhraseValidatorMixin():
|
|||
|
||||
while True:
|
||||
try:
|
||||
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(False)
|
||||
addressGeneratorReturnValue = \
|
||||
apiAddressGeneratorReturnQueue.get(False)
|
||||
except Empty:
|
||||
if gotOne:
|
||||
break
|
||||
|
@ -65,80 +78,115 @@ class AddressPassPhraseValidatorMixin():
|
|||
gotOne = True
|
||||
|
||||
if len(addressGeneratorReturnValue) == 0:
|
||||
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("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."))
|
||||
self.setError(_translate(
|
||||
"AddressValidator",
|
||||
"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):
|
||||
if self.isValid:
|
||||
return QtGui.QValidator.Acceptable
|
||||
else:
|
||||
return QtGui.QValidator.Intermediate
|
||||
return QtGui.QValidator.Acceptable if self.isValid \
|
||||
else QtGui.QValidator.Intermediate
|
||||
|
||||
def validate(self, s, pos):
|
||||
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)
|
||||
self.setError(_translate(
|
||||
"AddressValidator",
|
||||
"Address already present as one of your identities."
|
||||
))
|
||||
return (QtGui.QValidator.Intermediate, s, pos)
|
||||
|
||||
status = decodeAddress(address)[0]
|
||||
# version too high
|
||||
if decodeAddress(address)[0] == '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, pos)
|
||||
|
||||
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), str_chan + ' ' + str(passPhrase), passPhrase, False))
|
||||
addressGeneratorQueue.put((
|
||||
'joinChan', addBMIfNotPresent(address),
|
||||
str_chan + ' ' + passPhrase, passPhrase, False
|
||||
))
|
||||
|
||||
if self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
|
||||
return (self.returnValid(), pos)
|
||||
if self.okButton.hasFocus():
|
||||
return (self.returnValid(), s, pos)
|
||||
else:
|
||||
return (QtGui.QValidator.Intermediate, pos)
|
||||
return (QtGui.QValidator.Intermediate, s, pos)
|
||||
|
||||
def checkData(self):
|
||||
return self.validate("", 0)
|
||||
return self.validate(u"", 0)
|
||||
|
||||
|
||||
class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
|
||||
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):
|
||||
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)
|
||||
|
|
|
@ -21,10 +21,10 @@ class NewChanDialog(QtWidgets.QDialog):
|
|||
self.parent = parent
|
||||
self.chanAddress.setValidator(AddressValidator(
|
||||
self.chanAddress, self.chanPassPhrase, self.validatorFeedback,
|
||||
self.buttonBox, False))
|
||||
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
|
||||
self.chanPassPhrase.setValidator(PassPhraseValidator(
|
||||
self.chanPassPhrase, self.chanAddress, self.validatorFeedback,
|
||||
self.buttonBox, False))
|
||||
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
|
||||
|
||||
self.timer = QtCore.QTimer()
|
||||
self.timer.timeout.connect(self.delayedUpdateStatus)
|
||||
|
@ -41,17 +41,16 @@ class NewChanDialog(QtWidgets.QDialog):
|
|||
self.timer.stop()
|
||||
self.hide()
|
||||
apiAddressGeneratorReturnQueue.queue.clear()
|
||||
passPhrase = self.chanPassPhrase.text().encode('utf-8')
|
||||
if self.chanAddress.text() == "":
|
||||
addressGeneratorQueue.put((
|
||||
'createChan', 4, 1,
|
||||
str_chan + ' ' + str(self.chanPassPhrase.text()),
|
||||
self.chanPassPhrase.text(), True
|
||||
str_chan + ' ' + passPhrase, passPhrase, True
|
||||
))
|
||||
else:
|
||||
addressGeneratorQueue.put((
|
||||
'joinChan', addBMIfNotPresent(self.chanAddress.text()),
|
||||
str_chan + ' ' + str(self.chanPassPhrase.text()),
|
||||
self.chanPassPhrase.text(), True
|
||||
str_chan + ' ' + passPhrase, passPhrase, True
|
||||
))
|
||||
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True)
|
||||
if (len(addressGeneratorReturnValue) > 0
|
||||
|
@ -62,7 +61,7 @@ class NewChanDialog(QtWidgets.QDialog):
|
|||
_translate(
|
||||
"newchandialog",
|
||||
"Successfully created / joined chan {0}"
|
||||
).format(self.chanPassPhrase.text())
|
||||
).format(passPhrase)
|
||||
))
|
||||
self.parent.ui.tabWidget.setCurrentIndex(
|
||||
self.parent.ui.tabWidget.indexOf(self.parent.ui.chans)
|
||||
|
|
Reference in New Issue
Block a user