class BackgroundSelector(QWidget): """presents all available backgrounds with previews""" def __init__(self, parent): super(BackgroundSelector, self).__init__(parent) loadUi(self) self.kcfg_backgroundName = QLineEdit(self) self.kcfg_backgroundName.setVisible(False) self.kcfg_backgroundName.setObjectName('kcfg_backgroundName') self.setUp() def setUp(self): """fill the selector""" # The lineEdit widget holds our background path, but the user does # not manipulate it directly self.kcfg_backgroundName.hide() self.backgroundNameList.currentRowChanged.connect( self.backgroundRowChanged) self.kcfg_backgroundName.textChanged.connect( self.backgroundNameChanged) self.backgroundList = Background.available() for aset in self.backgroundList: self.backgroundNameList.addItem(aset.name) self.kcfg_backgroundName.setText(Internal.Preferences.backgroundName) def backgroundNameChanged(self, name): """the name changed: update the current row""" igrindex = 0 for idx, aset in enumerate(self.backgroundList): if aset.desktopFileName == name: igrindex = idx break self.backgroundNameList.setCurrentRow(igrindex) def backgroundRowChanged(self): """user selected a new background, update our information about it and paint preview""" selBackground = self.backgroundList[ self.backgroundNameList.currentRow()] self.kcfg_backgroundName.setText(selBackground.desktopFileName) self.backgroundAuthor.setText(selBackground.author) self.backgroundContact.setText(selBackground.authorEmail) self.backgroundDescription.setText(selBackground.description) selBackground.setPalette(self.backgroundPreview) self.backgroundPreview.setAutoFillBackground(True)
class TilesetSelector(QWidget): """presents all available tiles with previews""" def __init__(self, parent): super(TilesetSelector, self).__init__(parent) loadUi(self) self.kcfg_tilesetName = QLineEdit(self) self.kcfg_tilesetName.setVisible(False) self.kcfg_tilesetName.setObjectName('kcfg_tilesetName') self.tileScene = SceneWithFocusRect() self.tileView = FittingView() self.tileView.setScene(self.tileScene) self.tileset = Tileset(Internal.Preferences.tilesetName) self.uiTiles = [UITile('w' + s.char.lower()) for s in Wind.all4] self.board = Board(2, 2, self.tileset) self.board.showShadows = True self.tileScene.addItem(self.board) self.tileView.setParent(self.tilesetPreview) layout = QHBoxLayout(self.tilesetPreview) layout.addWidget(self.tileView) for idx, offsets in enumerate([(0, 0), (0, 1), (1, 0), (1, 1)]): self.uiTiles[idx].setBoard(self.board, *offsets) self.uiTiles[idx].focusable = False self.setUp() def setUp(self): """set-up the selector""" # The lineEdit widget holds our tileset path, but the user does # not manipulate it directly self.kcfg_tilesetName.hide() self.tilesetNameList.currentRowChanged.connect(self.tilesetRowChanged) self.kcfg_tilesetName.textChanged.connect(self.tilesetNameChanged) Tileset.loadAll() # list default tileset first self.tilesetList = Tileset.available() for aset in self.tilesetList: self.tilesetNameList.addItem(aset.name) self.kcfg_tilesetName.setText(Internal.Preferences.tilesetName) def tilesetNameChanged(self, name): """the name changed: update the current row""" igrindex = 0 for idx, aset in enumerate(self.tilesetList): if aset.desktopFileName == name: igrindex = idx break self.tilesetNameList.setCurrentRow(igrindex) def tilesetRowChanged(self): """user selected a new tileset, update our information about it and paint preview""" selTileset = self.tilesetList[self.tilesetNameList.currentRow()] self.kcfg_tilesetName.setText(selTileset.desktopFileName) self.tilesetAuthor.setText(selTileset.author) self.tilesetContact.setText(selTileset.authorEmail) self.tilesetDescription.setText(selTileset.description) with AnimationSpeed(): self.board.tileset = selTileset
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)