def setupUi(self): """create all Ui elements but do not fill them""" self.buttonBox = KDialogButtonBox(self) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) # Ubuntu 11.10 unity is a bit strange - without this, it sets focus on # the cancel button (which it shows on the left). I found no obvious # way to use setDefault and setAutoDefault for fixing this. self.buttonBox.button(QDialogButtonBox.Ok).setFocus(True) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) vbox = QVBoxLayout(self) self.grid = QFormLayout() self.cbServer = QComboBox() self.cbServer.setEditable(True) self.grid.addRow(i18n('Game server:'), self.cbServer) self.cbUser = QComboBox() self.cbUser.setEditable(True) self.grid.addRow(i18n('Username:'******'Password:'******'kajongg', 'Ruleset:'), self.cbRuleset) vbox.addLayout(self.grid) vbox.addWidget(self.buttonBox) pol = QSizePolicy() pol.setHorizontalPolicy(QSizePolicy.Expanding) self.cbUser.setSizePolicy(pol) self.__port = None
def __init__(self, leftRulesets, rightRulesets, parent=None): QDialog.__init__(self, parent) if not isinstance(leftRulesets, list): leftRulesets = list([leftRulesets]) if not isinstance(rightRulesets, list): rightRulesets = list([rightRulesets]) leftRulesets, rightRulesets = leftRulesets[:], rightRulesets[:] # remove rulesets from right which are also on the left side for left in leftRulesets: left.load() for right in rightRulesets: right.load() for left in leftRulesets: for right in rightRulesets[:]: if left == right and left.name == right.name: # rightRulesets.remove(right) this is wrong because it # removes the first ruleset with the same hash rightRulesets = list( x for x in rightRulesets if id(x) != id(right)) self.leftRulesets = leftRulesets self.rightRulesets = rightRulesets self.model = None self.modelTest = None self.view = MJTableView(self) self.buttonBox = QDialogButtonBox() self.buttonBox.setStandardButtons(QDialogButtonBox.Ok) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) cbLayout = QHBoxLayout() self.cbRuleset1 = ListComboBox(self.leftRulesets) if len(self.leftRulesets) == 1: self.lblRuleset1 = QLabel(self.leftRulesets[0].name) cbLayout.addWidget(self.lblRuleset1) else: cbLayout.addWidget(self.cbRuleset1) self.cbRuleset2 = ListComboBox(self.rightRulesets) cbLayout.addWidget(self.cbRuleset2) cmdLayout = QHBoxLayout() cmdLayout.addWidget(self.buttonBox) layout = QVBoxLayout() layout.addLayout(cbLayout) layout.addWidget(self.view) layout.addLayout(cmdLayout) self.setLayout(layout) decorateWindow(self, i18n("Compare")) self.setObjectName('RulesetDiffer') self.cbRuleset1.currentIndexChanged.connect(self.leftRulesetChanged) self.cbRuleset2.currentIndexChanged.connect(self.rulesetChanged) self.leftRulesetChanged() StateSaver(self)
def __init__(self, game): """selection for this player, tiles are the still available tiles""" QDialog.__init__(self, None) decorateWindow(self, i18n("Penalty")) self.game = game grid = QGridLayout(self) lblOffense = QLabel(i18n('Offense:')) crimes = list([ x for x in game.ruleset.penaltyRules if not ('absolute' in x.options and game.winner) ]) self.cbCrime = ListComboBox(crimes) lblOffense.setBuddy(self.cbCrime) grid.addWidget(lblOffense, 0, 0) grid.addWidget(self.cbCrime, 0, 1, 1, 4) lblPenalty = QLabel(i18n('Total Penalty')) self.spPenalty = PenaltyBox(2) self.spPenalty.setRange(0, 9999) lblPenalty.setBuddy(self.spPenalty) self.lblUnits = QLabel(i18n('points')) grid.addWidget(lblPenalty, 1, 0) grid.addWidget(self.spPenalty, 1, 1) grid.addWidget(self.lblUnits, 1, 2) self.payers = [] self.payees = [] # a penalty can never involve the winner, neither as payer nor as payee for idx in range(3): self.payers.append(ListComboBox(game.losers())) self.payees.append(ListComboBox(game.losers())) for idx, payer in enumerate(self.payers): grid.addWidget(payer, 3 + idx, 0) payer.lblPayment = QLabel() grid.addWidget(payer.lblPayment, 3 + idx, 1) for idx, payee in enumerate(self.payees): grid.addWidget(payee, 3 + idx, 3) payee.lblPayment = QLabel() grid.addWidget(payee.lblPayment, 3 + idx, 4) grid.addWidget(QLabel(''), 6, 0) grid.setRowStretch(6, 10) for player in self.payers + self.payees: player.currentIndexChanged.connect(self.playerChanged) self.spPenalty.valueChanged.connect(self.penaltyChanged) self.cbCrime.currentIndexChanged.connect(self.crimeChanged) buttonBox = KDialogButtonBox(self) grid.addWidget(buttonBox, 7, 0, 1, 5) buttonBox.setStandardButtons(QDialogButtonBox.Cancel) buttonBox.rejected.connect(self.reject) self.btnExecute = buttonBox.addButton(i18n("&Execute"), QDialogButtonBox.AcceptRole) self.btnExecute.clicked.connect(self.accept) self.crimeChanged() StateSaver(self)
def setupUi(self): """create all Ui elements but do not fill them""" buttonBox = KDialogButtonBox(self) buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) # Ubuntu 11.10 unity is a bit strange - without this, it sets focus on # the cancel button (which it shows on the left). I found no obvious # way to use setDefault and setAutoDefault for fixing this. buttonBox.button(QDialogButtonBox.Ok).setFocus(True) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) vbox = QVBoxLayout(self) self.grid = QFormLayout() self.cbServer = QComboBox() self.cbServer.setEditable(True) self.grid.addRow(m18n('Game server:'), self.cbServer) self.cbUser = QComboBox() self.cbUser.setEditable(True) self.grid.addRow(m18n('Username:'******'Password:'******'kajongg', 'Ruleset:'), self.cbRuleset) vbox.addLayout(self.grid) vbox.addWidget(buttonBox) pol = QSizePolicy() pol.setHorizontalPolicy(QSizePolicy.Expanding) self.cbUser.setSizePolicy(pol)
def __init__(self, leftRulesets, rightRulesets, parent=None): QDialog.__init__(self, parent) if not isinstance(leftRulesets, list): leftRulesets = list([leftRulesets]) if not isinstance(rightRulesets, list): rightRulesets = list([rightRulesets]) leftRulesets, rightRulesets = leftRulesets[:], rightRulesets[:] # remove rulesets from right which are also on the left side for left in leftRulesets: left.load() for right in rightRulesets: right.load() for left in leftRulesets: for right in rightRulesets[:]: if left == right and left.name == right.name: # rightRulesets.remove(right) this is wrong because it # removes the first ruleset with the same hash rightRulesets = list(x for x in rightRulesets if id(x) != id(right)) self.leftRulesets = leftRulesets self.rightRulesets = rightRulesets self.model = None self.modelTest = None self.view = MJTableView(self) self.buttonBox = QDialogButtonBox() self.buttonBox.setStandardButtons(QDialogButtonBox.Ok) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) cbLayout = QHBoxLayout() self.cbRuleset1 = ListComboBox(self.leftRulesets) if len(self.leftRulesets) == 1: self.lblRuleset1 = QLabel(self.leftRulesets[0].name) cbLayout.addWidget(self.lblRuleset1) else: cbLayout.addWidget(self.cbRuleset1) self.cbRuleset2 = ListComboBox(self.rightRulesets) cbLayout.addWidget(self.cbRuleset2) cmdLayout = QHBoxLayout() cmdLayout.addWidget(self.buttonBox) layout = QVBoxLayout() layout.addLayout(cbLayout) layout.addWidget(self.view) layout.addLayout(cmdLayout) self.setLayout(layout) decorateWindow(self, m18n("Compare")) self.setObjectName("RulesetDiffer") self.cbRuleset1.currentIndexChanged.connect(self.leftRulesetChanged) self.cbRuleset2.currentIndexChanged.connect(self.rulesetChanged) self.leftRulesetChanged() StateSaver(self)
def __init__(self, server=None): QDialog.__init__(self, None) decorateWindow(self, i18n('Select a ruleset')) self.buttonBox = KDialogButtonBox(self) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.cbRuleset = ListComboBox(Ruleset.selectableRulesets(server)) self.grid = QGridLayout() # our child SelectPlayers needs this self.grid.setColumnStretch(0, 1) self.grid.setColumnStretch(1, 6) vbox = QVBoxLayout(self) vbox.addLayout(self.grid) vbox.addWidget(self.cbRuleset) vbox.addWidget(self.buttonBox)
class RulesetDiffer(QDialog): """Shows differences between rulesets""" def __init__(self, leftRulesets, rightRulesets, parent=None): QDialog.__init__(self, parent) if not isinstance(leftRulesets, list): leftRulesets = list([leftRulesets]) if not isinstance(rightRulesets, list): rightRulesets = list([rightRulesets]) leftRulesets, rightRulesets = leftRulesets[:], rightRulesets[:] # remove rulesets from right which are also on the left side for left in leftRulesets: left.load() for right in rightRulesets: right.load() for left in leftRulesets: for right in rightRulesets[:]: if left == right and left.name == right.name: # rightRulesets.remove(right) this is wrong because it # removes the first ruleset with the same hash rightRulesets = list( x for x in rightRulesets if id(x) != id(right)) self.leftRulesets = leftRulesets self.rightRulesets = rightRulesets self.model = None self.modelTest = None self.view = MJTableView(self) self.buttonBox = QDialogButtonBox() self.buttonBox.setStandardButtons(QDialogButtonBox.Ok) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) cbLayout = QHBoxLayout() self.cbRuleset1 = ListComboBox(self.leftRulesets) if len(self.leftRulesets) == 1: self.lblRuleset1 = QLabel(self.leftRulesets[0].name) cbLayout.addWidget(self.lblRuleset1) else: cbLayout.addWidget(self.cbRuleset1) self.cbRuleset2 = ListComboBox(self.rightRulesets) cbLayout.addWidget(self.cbRuleset2) cmdLayout = QHBoxLayout() cmdLayout.addWidget(self.buttonBox) layout = QVBoxLayout() layout.addLayout(cbLayout) layout.addWidget(self.view) layout.addLayout(cmdLayout) self.setLayout(layout) decorateWindow(self, i18n("Compare")) self.setObjectName('RulesetDiffer') self.cbRuleset1.currentIndexChanged.connect(self.leftRulesetChanged) self.cbRuleset2.currentIndexChanged.connect(self.rulesetChanged) self.leftRulesetChanged() StateSaver(self) def leftRulesetChanged(self): """slot to be called if the left ruleset changes""" if len(self.leftRulesets) == 1: self.orderRight() self.rulesetChanged() def rulesetChanged(self): """slot to be called if the right ruleset changes""" self.model = DifferModel(self.formattedDiffs(), self) if Debug.modelTest: self.modelTest = ModelTest(self.model, self) self.view.setModel(self.model) def orderRight(self): """order the right rulesets by similarity to current left ruleset. Similarity is defined by the length of the diff list.""" leftRuleset = self.cbRuleset1.current diffPairs = sorted([(len(x.diff(leftRuleset)), x) for x in self.rightRulesets]) combo = self.cbRuleset2 with BlockSignals(combo): combo.items = [x[1] for x in diffPairs] combo.setCurrentIndex(0) def formattedDiffs(self): """a list of tuples with 3 values: name, left, right""" formatted = [] leftRuleset = self.cbRuleset1.current rightRuleset = self.cbRuleset2.current assert rightRuleset, self.cbRuleset2.count() leftRuleset.load() rightRuleset.load() for rule1, rule2 in leftRuleset.diff(rightRuleset): name = i18n(rule1.name if rule1 else rule2.name) left = rule1.i18nStr() if rule1 else i18nc( 'Kajongg-Rule', 'not defined') right = rule2.i18nStr() if rule2 else i18nc( 'Kajongg-Rule', 'not defined') formatted.append((name, left, right)) if rule1 and rule2 and rule1.definition != rule2.definition: formatted.append(('', rule1.definition, rule2.definition)) return formatted
class RulesetDiffer(QDialog): """Shows differences between rulesets""" def __init__(self, leftRulesets, rightRulesets, parent=None): QDialog.__init__(self, parent) if not isinstance(leftRulesets, list): leftRulesets = list([leftRulesets]) if not isinstance(rightRulesets, list): rightRulesets = list([rightRulesets]) leftRulesets, rightRulesets = leftRulesets[:], rightRulesets[:] # remove rulesets from right which are also on the left side for left in leftRulesets: left.load() for right in rightRulesets: right.load() for left in leftRulesets: for right in rightRulesets[:]: if left == right and left.name == right.name: # rightRulesets.remove(right) this is wrong because it # removes the first ruleset with the same hash rightRulesets = list(x for x in rightRulesets if id(x) != id(right)) self.leftRulesets = leftRulesets self.rightRulesets = rightRulesets self.model = None self.modelTest = None self.view = MJTableView(self) self.buttonBox = QDialogButtonBox() self.buttonBox.setStandardButtons(QDialogButtonBox.Ok) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) cbLayout = QHBoxLayout() self.cbRuleset1 = ListComboBox(self.leftRulesets) if len(self.leftRulesets) == 1: self.lblRuleset1 = QLabel(self.leftRulesets[0].name) cbLayout.addWidget(self.lblRuleset1) else: cbLayout.addWidget(self.cbRuleset1) self.cbRuleset2 = ListComboBox(self.rightRulesets) cbLayout.addWidget(self.cbRuleset2) cmdLayout = QHBoxLayout() cmdLayout.addWidget(self.buttonBox) layout = QVBoxLayout() layout.addLayout(cbLayout) layout.addWidget(self.view) layout.addLayout(cmdLayout) self.setLayout(layout) decorateWindow(self, m18n("Compare")) self.setObjectName("RulesetDiffer") self.cbRuleset1.currentIndexChanged.connect(self.leftRulesetChanged) self.cbRuleset2.currentIndexChanged.connect(self.rulesetChanged) self.leftRulesetChanged() StateSaver(self) def leftRulesetChanged(self): """slot to be called if the left ruleset changes""" if len(self.leftRulesets) == 1: self.orderRight() self.rulesetChanged() def rulesetChanged(self): """slot to be called if the right ruleset changes""" self.model = DifferModel(self.formattedDiffs(), self) if Debug.modelTest: self.modelTest = ModelTest(self.model, self) self.view.setModel(self.model) def orderRight(self): """order the right rulesets by similarity to current left ruleset. Similarity is defined by the length of the diff list.""" leftRuleset = self.cbRuleset1.current diffPairs = sorted([(len(x.diff(leftRuleset)), x) for x in self.rightRulesets]) combo = self.cbRuleset2 with BlockSignals(combo): combo.items = [x[1] for x in diffPairs] combo.setCurrentIndex(0) def formattedDiffs(self): """a list of tuples with 3 values: name, left, right""" formatted = [] leftRuleset = self.cbRuleset1.current rightRuleset = self.cbRuleset2.current assert rightRuleset, self.cbRuleset2.count() leftRuleset.load() rightRuleset.load() for rule1, rule2 in leftRuleset.diff(rightRuleset): name = m18n(rule1.name if rule1 else rule2.name) left = rule1.contentStr() if rule1 else m18nc("Kajongg-Rule", "not defined") right = rule2.contentStr() if rule2 else m18nc("Kajongg-Rule", "not defined") formatted.append((name, left, right)) if rule1 and rule2 and rule1.definition != rule2.definition: formatted.append(("", rule1.definition, rule2.definition)) return formatted
class LoginDlg(QDialog): """login dialog for server""" def __init__(self): """self.servers is a list of tuples containing server and last playername""" QDialog.__init__(self, None) decorateWindow(self, i18nc('kajongg', 'Login')) self.setupUi() localName = i18nc('kajongg name for local game server', Query.localServerName) self.servers = Query( 'select url,lastname from server order by lasttime desc').records servers = list(x[0] for x in self.servers if x[0] != Query.localServerName) # the first server combobox item should be default: either the last used server # or localName for autoPlay if localName not in servers: servers.append(localName) if 'kajongg.org' not in servers: servers.append('kajongg.org') if Internal.autoPlay: demoHost = Options.host or localName if demoHost in servers: servers.remove( demoHost ) # we want a unique list, it will be re-used for all following games servers.insert(0, demoHost) # in this process but they will not be autoPlay self.cbServer.addItems(servers) self.passwords = Query( 'select url, p.name, passwords.password from passwords, player p ' 'where passwords.player=p.id').records Players.load() self.cbServer.editTextChanged.connect(self.serverChanged) self.cbUser.editTextChanged.connect(self.userChanged) self.serverChanged() StateSaver(self) def returns(self, dummyButton=None): """login data returned by this dialog""" return (Url(self.url), self.username, self.password, self.__defineRuleset()) def setupUi(self): """create all Ui elements but do not fill them""" self.buttonBox = KDialogButtonBox(self) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) # Ubuntu 11.10 unity is a bit strange - without this, it sets focus on # the cancel button (which it shows on the left). I found no obvious # way to use setDefault and setAutoDefault for fixing this. self.buttonBox.button(QDialogButtonBox.Ok).setFocus(True) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) vbox = QVBoxLayout(self) self.grid = QFormLayout() self.cbServer = QComboBox() self.cbServer.setEditable(True) self.grid.addRow(i18n('Game server:'), self.cbServer) self.cbUser = QComboBox() self.cbUser.setEditable(True) self.grid.addRow(i18n('Username:'******'Password:'******'kajongg', 'Ruleset:'), self.cbRuleset) vbox.addLayout(self.grid) vbox.addWidget(self.buttonBox) pol = QSizePolicy() pol.setHorizontalPolicy(QSizePolicy.Expanding) self.cbUser.setSizePolicy(pol) self.__port = None def serverChanged(self, dummyText=None): """the user selected a different server""" records = Query( 'select player.name from player, passwords ' 'where passwords.url=? and passwords.player = player.id', (self.url, )).records players = list(x[0] for x in records) preferPlayer = Options.player if preferPlayer: if preferPlayer in players: players.remove(preferPlayer) players.insert(0, preferPlayer) self.cbUser.clear() self.cbUser.addItems(players) if not self.cbUser.count(): user = KUser() if os.name == 'nt' else KUser(os.geteuid()) self.cbUser.addItem(user.fullName() or user.loginName()) if not preferPlayer: userNames = [x[1] for x in self.servers if x[0] == self.url] if userNames: userIdx = self.cbUser.findText(userNames[0]) if userIdx >= 0: self.cbUser.setCurrentIndex(userIdx) showPW = bool(self.url) and not Url(self.url).isLocalHost self.grid.labelForField(self.edPassword).setVisible(showPW) self.edPassword.setVisible(showPW) self.grid.labelForField(self.cbRuleset).setVisible( not showPW and not Options.ruleset) self.cbRuleset.setVisible(not showPW and not Options.ruleset) if not showPW: self.cbRuleset.clear() if Options.ruleset: self.cbRuleset.items = [Options.ruleset] else: self.cbRuleset.items = Ruleset.selectableRulesets(self.url) self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(bool(self.url)) def __defineRuleset(self): """find out what ruleset to use""" if Options.ruleset: return Options.ruleset elif Internal.autoPlay or bool(Options.host): return Ruleset.selectableRulesets()[0] else: return self.cbRuleset.current def userChanged(self, text): """the username has been changed, lookup password""" if text == '': self.edPassword.clear() return passw = None for entry in self.passwords: if entry[0] == self.url and entry[1] == text: passw = entry[2] if passw: self.edPassword.setText(passw) else: self.edPassword.clear() @property def url(self): """abstracts the url of the dialog""" return english(self.cbServer.currentText()) @property def username(self): """abstracts the username of the dialog""" return self.cbUser.currentText() @property def password(self): """abstracts the password of the dialog""" return self.edPassword.text() @password.setter def password(self, password): """abstracts the password of the dialog""" self.edPassword.setText(password)
class LoginDlg(QDialog): """login dialog for server""" def __init__(self): """self.servers is a list of tuples containing server and last playername""" QDialog.__init__(self, None) self.setWindowTitle(m18n('Login') + ' - Kajongg') self.setupUi() localName = m18nc('kajongg name for local game server', Query.localServerName) self.servers = Query('select url,lastname from server order by lasttime desc').records servers = [m18nc('kajongg name for local game server', x[0]) for x in self.servers] # the first server combobox item should be default: either the last used server # or localName for autoPlay if localName not in servers: servers.append(localName) if 'kajongg.org' not in servers: servers.append('kajongg.org') demoHost = Options.host or localName if demoHost in servers: servers.remove(demoHost) # we want a unique list, it will be re-used for all following games servers.insert(0, demoHost) # in this process but they will not be autoPlay self.cbServer.addItems(servers) self.passwords = Query('select url, p.name, passwords.password from passwords, player p ' 'where passwords.player=p.id').records Players.load() self.cbServer.editTextChanged.connect(self.serverChanged) self.cbUser.editTextChanged.connect(self.userChanged) self.serverChanged() StateSaver(self) def returns(self, dummyButton=None): """maybe we should return an class ServerConnection""" return (self.useSocket, self.url, self.username, self.__defineRuleset()) def setupUi(self): """create all Ui elements but do not fill them""" buttonBox = KDialogButtonBox(self) buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) # Ubuntu 11.10 unity is a bit strange - without this, it sets focus on # the cancel button (which it shows on the left). I found no obvious # way to use setDefault and setAutoDefault for fixing this. buttonBox.button(QDialogButtonBox.Ok).setFocus(True) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) vbox = QVBoxLayout(self) self.grid = QFormLayout() self.cbServer = QComboBox() self.cbServer.setEditable(True) self.grid.addRow(m18n('Game server:'), self.cbServer) self.cbUser = QComboBox() self.cbUser.setEditable(True) self.grid.addRow(m18n('Username:'******'Password:'******'kajongg', 'Ruleset:'), self.cbRuleset) vbox.addLayout(self.grid) vbox.addWidget(buttonBox) pol = QSizePolicy() pol.setHorizontalPolicy(QSizePolicy.Expanding) self.cbUser.setSizePolicy(pol) def serverChanged(self, dummyText=None): """the user selected a different server""" records = Query('select player.name from player, passwords ' 'where passwords.url=? and passwords.player = player.id', list([self.url])).records players = list(x[0] for x in records) preferPlayer = Options.player if preferPlayer: if preferPlayer in players: players.remove(preferPlayer) players.insert(0, preferPlayer) self.cbUser.clear() self.cbUser.addItems(players) if not self.cbUser.count(): user = KUser() if os.name == 'nt' else KUser(os.geteuid()) self.cbUser.addItem(user.fullName() or user.loginName()) if not preferPlayer: userNames = [x[1] for x in self.servers if x[0] == self.url] if userNames: userIdx = self.cbUser.findText(userNames[0]) if userIdx >= 0: self.cbUser.setCurrentIndex(userIdx) showPW = self.url != Query.localServerName self.grid.labelForField(self.edPassword).setVisible(showPW) self.edPassword.setVisible(showPW) self.grid.labelForField(self.cbRuleset).setVisible(not showPW and not Options.ruleset) self.cbRuleset.setVisible(not showPW and not Options.ruleset) if not showPW: self.cbRuleset.clear() if Options.ruleset: self.cbRuleset.items = [Options.ruleset] else: self.cbRuleset.items = Ruleset.selectableRulesets(self.url) def __defineRuleset(self): """find out what ruleset to use""" if Options.ruleset: return Options.ruleset elif Internal.autoPlay or bool(Options.host): return Ruleset.selectableRulesets()[0] else: return self.cbRuleset.current def userChanged(self, text): """the username has been changed, lookup password""" if text == '': self.edPassword.clear() return passw = None for entry in self.passwords: if entry[0] == self.url and entry[1] == unicode(text): passw = entry[2] if passw: self.edPassword.setText(passw) else: self.edPassword.clear() @property def url(self): """abstracts the url of the dialog""" return english(unicode(self.cbServer.currentText())) @property def host(self): """abstracts the host of the dialog""" return self.url.partition(':')[0] @property def useSocket(self): """do we use socket for current host?""" return self.host == Query.localServerName @property def port(self): """abstracts the port of the dialog""" try: return int(self.url.partition(':')[2]) except ValueError: return Options.defaultPort() @property def username(self): """abstracts the username of the dialog""" return unicode(self.cbUser.currentText()) @property def password(self): """abstracts the password of the dialog""" return unicode(self.edPassword.text()) @password.setter def password(self, password): """abstracts the password of the dialog""" self.edPassword.setText(password) def updateServerInfoInDatabase(self): """we are online. Update table server.""" lasttime = datetime.datetime.now().replace(microsecond=0).isoformat() url = english(self.url) # use unique name for Local Game with Transaction(): serverKnown = Query('update server set lastname=?,lasttime=? where url=?', list([self.username, lasttime, url])).rowcount() == 1 if not serverKnown: Query('insert into server(url,lastname,lasttime) values(?,?,?)', list([url, self.username, lasttime])) # needed if the server knows our name but our local data base does not: Players.createIfUnknown(self.username) playerId = Players.allIds[self.username] with Transaction(): if Query('update passwords set password=? where url=? and player=?', list([self.password, url, playerId])).rowcount() == 0: Query('insert into passwords(url,player,password) values(?,?,?)', list([url, playerId, self.password]))
class LoginDlg(QDialog): """login dialog for server""" def __init__(self): """self.servers is a list of tuples containing server and last playername""" QDialog.__init__(self, None) self.setWindowTitle(m18n('Login') + ' - Kajongg') self.setupUi() localName = m18nc('kajongg name for local game server', Query.localServerName) self.servers = Query( 'select url,lastname from server order by lasttime desc').records servers = [ m18nc('kajongg name for local game server', x[0]) for x in self.servers ] # the first server combobox item should be default: either the last used server # or localName for autoPlay if localName not in servers: servers.append(localName) if 'kajongg.org' not in servers: servers.append('kajongg.org') demoHost = Options.host or localName if demoHost in servers: servers.remove( demoHost ) # we want a unique list, it will be re-used for all following games servers.insert( 0, demoHost) # in this process but they will not be autoPlay self.cbServer.addItems(servers) self.passwords = Query( 'select url, p.name, passwords.password from passwords, player p ' 'where passwords.player=p.id').records Players.load() self.cbServer.editTextChanged.connect(self.serverChanged) self.cbUser.editTextChanged.connect(self.userChanged) self.serverChanged() StateSaver(self) def returns(self, dummyButton=None): """maybe we should return an class ServerConnection""" return (self.useSocket, self.url, self.username, self.__defineRuleset()) def setupUi(self): """create all Ui elements but do not fill them""" buttonBox = KDialogButtonBox(self) buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) # Ubuntu 11.10 unity is a bit strange - without this, it sets focus on # the cancel button (which it shows on the left). I found no obvious # way to use setDefault and setAutoDefault for fixing this. buttonBox.button(QDialogButtonBox.Ok).setFocus(True) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) vbox = QVBoxLayout(self) self.grid = QFormLayout() self.cbServer = QComboBox() self.cbServer.setEditable(True) self.grid.addRow(m18n('Game server:'), self.cbServer) self.cbUser = QComboBox() self.cbUser.setEditable(True) self.grid.addRow(m18n('Username:'******'Password:'******'kajongg', 'Ruleset:'), self.cbRuleset) vbox.addLayout(self.grid) vbox.addWidget(buttonBox) pol = QSizePolicy() pol.setHorizontalPolicy(QSizePolicy.Expanding) self.cbUser.setSizePolicy(pol) def serverChanged(self, dummyText=None): """the user selected a different server""" records = Query( 'select player.name from player, passwords ' 'where passwords.url=? and passwords.player = player.id', list([self.url])).records players = list(x[0] for x in records) preferPlayer = Options.player if preferPlayer: if preferPlayer in players: players.remove(preferPlayer) players.insert(0, preferPlayer) self.cbUser.clear() self.cbUser.addItems(players) if not self.cbUser.count(): user = KUser() if os.name == 'nt' else KUser(os.geteuid()) self.cbUser.addItem(user.fullName() or user.loginName()) if not preferPlayer: userNames = [x[1] for x in self.servers if x[0] == self.url] if userNames: userIdx = self.cbUser.findText(userNames[0]) if userIdx >= 0: self.cbUser.setCurrentIndex(userIdx) showPW = self.url != Query.localServerName self.grid.labelForField(self.edPassword).setVisible(showPW) self.edPassword.setVisible(showPW) self.grid.labelForField(self.cbRuleset).setVisible( not showPW and not Options.ruleset) self.cbRuleset.setVisible(not showPW and not Options.ruleset) if not showPW: self.cbRuleset.clear() if Options.ruleset: self.cbRuleset.items = [Options.ruleset] else: self.cbRuleset.items = Ruleset.selectableRulesets(self.url) def __defineRuleset(self): """find out what ruleset to use""" if Options.ruleset: return Options.ruleset elif Internal.autoPlay or bool(Options.host): return Ruleset.selectableRulesets()[0] else: return self.cbRuleset.current def userChanged(self, text): """the username has been changed, lookup password""" if text == '': self.edPassword.clear() return passw = None for entry in self.passwords: if entry[0] == self.url and entry[1] == unicode(text): passw = entry[2] if passw: self.edPassword.setText(passw) else: self.edPassword.clear() @property def url(self): """abstracts the url of the dialog""" return english(unicode(self.cbServer.currentText())) @property def host(self): """abstracts the host of the dialog""" return self.url.partition(':')[0] @property def useSocket(self): """do we use socket for current host?""" return self.host == Query.localServerName @property def port(self): """abstracts the port of the dialog""" try: return int(self.url.partition(':')[2]) except ValueError: return Options.defaultPort() @property def username(self): """abstracts the username of the dialog""" return unicode(self.cbUser.currentText()) @property def password(self): """abstracts the password of the dialog""" return unicode(self.edPassword.text()) @password.setter def password(self, password): """abstracts the password of the dialog""" self.edPassword.setText(password) def updateServerInfoInDatabase(self): """we are online. Update table server.""" lasttime = datetime.datetime.now().replace(microsecond=0).isoformat() url = english(self.url) # use unique name for Local Game with Transaction(): serverKnown = Query( 'update server set lastname=?,lasttime=? where url=?', list([self.username, lasttime, url])).rowcount() == 1 if not serverKnown: Query( 'insert into server(url,lastname,lasttime) values(?,?,?)', list([url, self.username, lasttime])) # needed if the server knows our name but our local data base does not: Players.createIfUnknown(self.username) playerId = Players.allIds[self.username] with Transaction(): if Query( 'update passwords set password=? where url=? and player=?', list([self.password, url, playerId])).rowcount() == 0: Query( 'insert into passwords(url,player,password) values(?,?,?)', list([url, playerId, self.password]))