class ChatWindow(QWidget): """a widget for showing chat messages""" def __init__(self, scene=None, table=None): super(ChatWindow, self).__init__(None) self.scene = scene self.table = table or scene.game.client.table self.table.chatWindow = self self.setObjectName('chatWindow') title = i18n('Chat on table %1 at %2', self.table.tableid, self.table.client.connection.url) decorateWindow(self, title) self.messageView = ChatView() self.messageView.setModel(ChatModel()) self.messageView.setFocusPolicy(Qt.NoFocus) self.messageView.setShowGrid(False) self.messageView.setWordWrap(False) self.messageView.setSelectionMode(QAbstractItemView.NoSelection) if Debug.modelTest: self.debugModelTest = ModelTest(self.messageView.model(), self.messageView) self.edit = QLineEdit() layout = QVBoxLayout() layout.addWidget(self.messageView) layout.addWidget(self.edit) self.setLayout(layout) self.edit.returnPressed.connect(self.sendLine) self.edit.setFocus() self.show() StateSaver(self) def show(self): """not only show but also restore and raise""" self.activateWindow() self.setWindowState(self.windowState() & ~Qt.WindowMinimized) self.raise_() QWidget.show(self) def isVisible(self): """not only visible but also not minimized""" return QWidget.isVisible( self) and not self.windowState() & Qt.WindowMinimized def kill(self): """hide and null on table""" if Debug.chat: logDebug('chat.kill for %s on table %s' % (self, self.table)) self.hide() self.table.chatWindow = None def sendLine(self, line=None, isStatusMessage=False): """send line to others. Either the edited line or parameter line.""" if line is None: line = self.edit.text() self.edit.clear() if line: if Debug.chat: logDebug('sending line %s to others' % line) msg = ChatMessage(self.table.tableid, self.table.client.name, line, isStatusMessage) self.table.client.sendChat(msg).addErrback(self.chatError) def chatError(self, result): """tableList may already have gone away""" if self.table.client.tableList: self.table.client.tableList.tableError(result) def leave(self): """leaving the chat""" self.hide() def receiveLine(self, chatLine): """show a new line in protocol""" self.show() self.messageView.model().appendLines(chatLine) for row in range(self.messageView.model().rowCount()): self.messageView.setRowHeight( row, self.messageView.fontMetrics().height()) self.messageView.resizeColumnsToContents() self.messageView.scrollToBottom()
class ChatWindow(QWidget): """a widget for showing chat messages""" def __init__(self, scene=None, table=None): super(ChatWindow, self).__init__(None) self.scene = scene self.table = table or scene.game.client.table self.table.chatWindow = self self.setObjectName('chatWindow') title = m18n( 'Chat on table %1 at %2', self.table.tableid, self.table.client.connection.url) decorateWindow(self, title) self.messageView = ChatView() self.messageView.setModel(ChatModel()) self.messageView.setFocusPolicy(Qt.NoFocus) self.messageView.setShowGrid(False) self.messageView.setWordWrap(False) self.messageView.setSelectionMode(QAbstractItemView.NoSelection) if Debug.modelTest: self.debugModelTest = ModelTest( self.messageView.model(), self.messageView) self.edit = QLineEdit() layout = QVBoxLayout() layout.addWidget(self.messageView) layout.addWidget(self.edit) self.setLayout(layout) self.edit.returnPressed.connect(self.sendLine) self.edit.setFocus() self.show() StateSaver(self) def show(self): """not only show but also restore and raise""" self.activateWindow() self.setWindowState(self.windowState() & ~Qt.WindowMinimized) self.raise_() QWidget.show(self) def isVisible(self): """not only visible but also not minimized""" return QWidget.isVisible(self) and not self.windowState() & Qt.WindowMinimized def kill(self): """hide and null on table""" if Debug.chat: logDebug(u'chat.kill for %s on table %s' % (self, self.table)) self.hide() self.table.chatWindow = None def sendLine(self, line=None, isStatusMessage=False): """send line to others. Either the edited line or parameter line.""" if line is None: line = unicode(self.edit.text()) self.edit.clear() if line: if Debug.chat: logDebug(u'sending line %s to others' % line) msg = ChatMessage( self.table.tableid, self.table.client.name, line, isStatusMessage) self.table.client.sendChat(msg).addErrback(self.chatError) def chatError(self, result): """tableList may already have gone away""" if self.table.client.tableList: self.table.client.tableList.tableError(result) def leave(self): """leaving the chat""" self.hide() def receiveLine(self, chatLine): """show a new line in protocol""" self.show() self.messageView.model().appendLines(chatLine) for row in range(self.messageView.model().rowCount()): self.messageView.setRowHeight( row, self.messageView.fontMetrics().height()) self.messageView.resizeColumnsToContents() self.messageView.scrollToBottom()
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)