From: <umg...@us...> - 2007-04-02 13:24:10
|
Revision: 389 http://svn.sourceforge.net/pybridge/?rev=389&view=rev Author: umgangee Date: 2007-04-02 06:24:11 -0700 (Mon, 02 Apr 2007) Log Message: ----------- Cleaned up the set*() method code. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-04-02 13:23:15 UTC (rev 388) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-04-02 13:24:11 UTC (rev 389) @@ -160,20 +160,19 @@ position = self.table.game.bidding.whoCalled(call) self.addCall(call, position) - self.setDealer(self.table.game.board['dealer']) - self.setVuln(self.table.game.board['vuln']) + self.setDealer() + self.setVulnerability() # If contract, set contract. if self.table.game.bidding.isComplete(): - contract = self.table.game.bidding.getContract() - self.setContract(contract) + self.setContract() # If playing, set trick counts. if self.table.game.play: for position, cards in self.table.game.play.played.items(): for card in cards: self.addCard(card, position) - self.setTrickCount(self.table.game.getTrickCount()) + self.setTrickCount() # If user is a player and bidding in progress, open bidding box. if self.player and not self.table.game.bidding.isComplete(): @@ -201,8 +200,8 @@ # self.cardarea.clear() self.call_store.clear() # Reset bidding history. self.trick_store.clear() # Reset trick history. - self.setContract(None) # Reset contract. - self.setTrickCount(None) # Reset trick counts. + self.setContract() # Reset contract. + self.setTrickCount() # Reset trick counts. def addCall(self, call, position): @@ -244,7 +243,7 @@ def addScore(self, contract, made, score): - textContract = self.getContractFormat(contract) + textContract = self.formatContract(contract) textMade = '%s' % made if contract['declarer'] in (Direction.North, Direction.South) and score > 0 \ or contract['declarer'] in (Direction.East, Direction.West) and score < 0: @@ -288,6 +287,54 @@ self.cardarea.set_trick(trick) +# Methods to set information displayed on side panel. + + + def setContract(self): + """Sets the contract label from contract.""" + format = "<span size=\"x-large\">%s</span>" + + if self.table.game.contract: + text = self.formatContract(self.table.game.contract) + self.label_contract.set_markup(format % text) + self.label_contract.set_property('sensitive', True) + else: + self.label_contract.set_markup(format % _('No contract')) + self.label_contract.set_property('sensitive', False) + + + def setDealer(self): + format = "<b>%s</b>" + + dealer = '' + if self.table.game.inProgress(): + dealer = DIRECTION_SYMBOLS[self.table.game.board['dealer']] + + self.label_dealer.set_markup(format % dealer) + + + def setTrickCount(self): + """Sets the trick counter labels for declarer and defence.""" + format = "<span size=\"x-large\"><b>%s</b> (%s)</span>" + + if self.table.game.play: + declarer, defence = self.table.game.play.getTrickCount() + required = self.table.game.contract['bid'].level.index + 7 + declarerNeeds = max(0, required - declarer) + defenceNeeds = max(0, 13 + 1 - required - defence) + + self.label_declarer.set_markup(format % (declarer, declarerNeeds)) + self.label_defence.set_markup(format % (defence, defenceNeeds)) + self.frame_declarer.set_property('sensitive', True) + self.frame_defence.set_property('sensitive', True) + + else: # Reset trick counters. + self.label_declarer.set_markup(format % (0, 0)) + self.label_defence.set_markup(format % (0, 0)) + self.frame_declarer.set_property('sensitive', False) + self.frame_defence.set_property('sensitive', False) + + def setTurnIndicator(self): """Sets the statusbar text to indicate which player is on turn.""" context = self.statusbar.get_context_id('turn') @@ -301,38 +348,17 @@ self.cardarea.set_turn(turn) - def setContract(self, contract=None): - """Sets the contract label from contract.""" - format = (contract and self.getContractFormat(contract)) or _('No contract') - self.label_contract.set_property('sensitive', contract!=None) - self.label_contract.set_markup('<span size="x-large">%s</span>' % format) + def setVulnerability(self): + """Sets the vulnerability indicators.""" + format = "<b>%s</b>" + vulnerable = '' + if self.table.game.inProgress(): + vulnerable = VULN_SYMBOLS[self.table.game.board['vuln']] - def setDealer(self, dealer): - self.label_dealer.set_markup('<b>%s</b>' % DIRECTION_SYMBOLS[dealer]) + self.label_vuln.set_markup(format % vulnerable) - def setTrickCount(self, count=None): - """Sets the trick counter labels for declarer and defence. - - @param count: - """ - if count: - declarer = count['declarerWon'], count['declarerNeeds'] - defence = count['defenceWon'], count['defenceNeeds'] - else: - declarer = defence = (0, 0) - - self.frame_declarer.set_property('sensitive', count!=None) - self.frame_defence.set_property('sensitive', count!=None) - self.label_declarer.set_markup('<span size="x-large"><b>%s</b> (%s)</span>' % declarer) - self.label_defence.set_markup('<span size="x-large"><b>%s</b> (%s)</span>' % defence) - - - def setVuln(self, vulnerable): - self.label_vuln.set_markup('<b>%s</b>' % VULN_SYMBOLS[vulnerable]) - - # Registered event handlers. @@ -387,8 +413,8 @@ self.redrawHand(position) self.setTurnIndicator() - self.setDealer(board['dealer']) - self.setVuln(board['vuln']) + self.setDealer() + self.setVulnerability() if self.player: d = self.player.callRemote('getHand') @@ -402,8 +428,7 @@ self.setTurnIndicator() if self.table.game.bidding.isComplete(): self.children.close('window_bidbox') # If playing. - contract = self.table.game.bidding.getContract() - self.setContract(contract) + self.setContract() def event_playCard(self, card, position): @@ -411,8 +436,7 @@ playfrom = self.table.game.play.whoPlayed(card) self.addCard(card, playfrom) self.setTurnIndicator() - count = self.table.game.getTrickCount() - self.setTrickCount(count) + self.setTrickCount() self.redrawTrick() self.redrawHand(playfrom) @@ -430,7 +454,7 @@ score = self.table.game.score() self.addScore(contract, trickCount['declarerWon'], score) - textContract = _('Contract %s') % self.getContractFormat(contract) + textContract = _('Contract %s') % self.formatContract(contract) textTrick = (offset > 0 and _('made by %s tricks') % offset) or \ (offset < 0 and _('failed by %s tricks') % abs(offset)) or \ _('made exactly') @@ -459,23 +483,26 @@ # Utility methods. - def getContractFormat(self, contract): - """Returns a format string representing the contract. + def formatContract(self, contract): + """Produce a format string representing the contract. - @param contract: a dict from bidding.getContract(). + @param contract: a contract object. + @type contract: dict + @return: a format string representing the contract. + @rtype: str """ bidlevel = LEVEL_SYMBOLS[contract['bid'].level] bidstrain = STRAIN_SYMBOLS[contract['bid'].strain] - double = '' + doubled = '' if contract['redoubleBy']: - double = CALLTYPE_SYMBOLS[Redouble] + doubled = ' (%s)' % CALLTYPE_SYMBOLS[Redouble] elif contract['doubleBy']: - double = CALLTYPE_SYMBOLS[Double] + doubled = ' (%s)' % CALLTYPE_SYMBOLS[Double] declarer = contract['declarer'] - - return _('%s%s%s by %s') % (bidlevel, bidstrain, double, declarer) + return _('%s%s%s by %s') % (bidlevel, bidstrain, doubled, declarer) + # Signal handlers. @@ -517,6 +544,7 @@ def on_leaveseat_clicked(self, widget, *args): def success(r): + self.player = None self.position = None self.takeseat.set_property('sensitive', True) self.leaveseat.set_property('sensitive', False) @@ -562,6 +590,7 @@ def on_window_delete_event(self, widget, *args): + # TODO: if playing, "are you sure" dialog? d = self.parent.leaveTable(self.table.id) d.addCallback(lambda _: utils.windows.close(self.glade_name, instance=self)) return True # Stops window deletion taking place. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-04-03 11:57:28
|
Revision: 394 http://svn.sourceforge.net/pybridge/?rev=394&view=rev Author: umgangee Date: 2007-04-03 04:57:29 -0700 (Tue, 03 Apr 2007) Log Message: ----------- Remove calls to WindowMain when closing WindowBridgeTable (WindowMain now acts upon leaveTable notification); switch from utils to manager for WindowManager. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-04-03 11:45:40 UTC (rev 393) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-04-03 11:57:29 UTC (rev 394) @@ -20,8 +20,10 @@ from wrapper import GladeWrapper from cardarea import CardArea +from pybridge.network.client import client from eventhandler import SimpleEventHandler -import utils +from manager import WindowManager + from pybridge.network.error import GameError from pybridge.bridge.call import Bid, Pass, Double, Redouble from pybridge.bridge.symbols import Direction, Level, Strain, Rank, Vulnerable @@ -59,12 +61,11 @@ glade_name = 'window_bridgetable' - def new(self): - self.children = utils.WindowManager() + def setUp(self): + self.children = WindowManager() self.eventHandler = SimpleEventHandler(self) self.table = None # Table currently displayed in window. - self.handler = None self.player, self.position = None, None # Set up "Take Seat" menu. @@ -122,7 +123,7 @@ self.treeview_observers.append_column(column) - def cleanup(self): + def tearDown(self): print "Cleaning up" self.table = None # Dereference table. # Close all child windows. @@ -572,8 +573,8 @@ def on_leavetable_clicked(self, widget, *args): - d = self.parent.leaveTable(self.table.id) - d.addCallback(lambda _: utils.windows.close(self.glade_name, instance=self)) + d = client.leaveTable(self.table.id) + d.addErrback(self.errback) def on_chat_message_changed(self, widget, *args): @@ -590,8 +591,6 @@ def on_window_delete_event(self, widget, *args): - # TODO: if playing, "are you sure" dialog? - d = self.parent.leaveTable(self.table.id) - d.addCallback(lambda _: utils.windows.close(self.glade_name, instance=self)) + self.on_leavetable_clicked(widget, *args) return True # Stops window deletion taking place. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-04-09 15:31:55
|
Revision: 410 http://svn.sourceforge.net/pybridge/?rev=410&view=rev Author: umgangee Date: 2007-04-09 08:31:52 -0700 (Mon, 09 Apr 2007) Log Message: ----------- Move game result message box into gameComplete(). Support hand-click to join game. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-04-09 11:56:19 UTC (rev 409) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-04-09 15:31:52 UTC (rev 410) @@ -84,6 +84,7 @@ # Set up CardArea widget. self.cardarea = CardArea() self.cardarea.on_card_clicked = self.on_card_clicked + self.cardarea.on_hand_clicked = self.on_hand_clicked self.cardarea.set_size_request(640, 480) self.scrolled_cardarea.add_with_viewport(self.cardarea) self.cardarea.show() @@ -258,6 +259,44 @@ self.score_store.prepend([textContract, textMade, textNS, textEW]) + def gameComplete(self): + for position in Direction: + self.redrawHand(position, all=True) + self.setTurnIndicator() + + dialog = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_MODAL, + type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK) + dialog.set_title(_('Game result')) + + # Determine and display score in dialog box. + if self.table.game.contract: + declarerWon, defenceWon = self.table.game.play.getTrickCount() + required = self.table.game.contract['bid'].level.index + 7 + offset = declarerWon - required + score = self.table.game.getScore() + self.addScore(self.table.game.contract, declarerWon, score) + + contractText = self.formatContract(self.table.game.contract) + if offset > 0: + dialog.set_markup(_('Contract %s made by %s tricks.') \ + % (contractText, offset)) + elif offset < 0: + dialog.set_markup(_('Contract %s failed by %s tricks.') \ + % (contractText, abs(offset))) + else: + dialog.set_markup(_('Contract %s made exactly.') % contractText) + + scorer = (score >= 0 and _('declarer')) or _('defence') + dialog.format_secondary_text(_('Score %s points for %s.' % (abs(score), scorer))) + + else: + dialog.set_markup(_('Bidding passed out.')) + dialog.format_secondary_text(_('No score.')) + + dialog.run() + dialog.destroy() + + def redrawHand(self, position, all=False): """Redraws cards making up the hand at position. @@ -349,8 +388,7 @@ text = _("It is %s's turn") % str(turn) self.statusbar.push(context, text) except GameError: # Game not in progress - turn = None - self.cardarea.set_turn(turn) + pass def setVulnerability(self): @@ -413,7 +451,7 @@ #self.children.close('dialog_gameresult') self.resetGame() - #self.redrawTrick() # Clear trick. + self.redrawTrick() # Clear trick. for position in Direction: self.redrawHand(position) @@ -432,12 +470,16 @@ def event_makeCall(self, call, position): self.addCall(call, position) self.setTurnIndicator() + if self.table.game.bidding.isComplete(): self.setContract() if self.children.get(WindowBidbox): # If a player. self.children.close(self.children[WindowBidbox]) + if not self.table.game.inProgress(): + self.gameComplete() + def event_playCard(self, card, position): # Determine the position of the hand from which card was played. playfrom = self.table.game.play.whoPlayed(card) @@ -446,36 +488,11 @@ self.setTrickCount() self.redrawTrick() self.redrawHand(playfrom) + + if not self.table.game.inProgress(): + self.gameComplete() - def event_gameFinished(self): - for position in self.table.game.deal: - self.redrawHand(position, all=True) - self.setTurnIndicator() - - # Determine and display score in dialog box. - contract = self.table.game.bidding.getContract() - if contract: - trickCount = self.table.game.getTrickCount() - offset = trickCount['declarerWon'] - trickCount['required'] - score = self.table.game.score() - self.addScore(contract, trickCount['declarerWon'], score) - - textContract = _('Contract %s') % self.formatContract(contract) - textTrick = (offset > 0 and _('made by %s tricks') % offset) or \ - (offset < 0 and _('failed by %s tricks') % abs(offset)) or \ - _('made exactly') - scorer = (score >= 0 and _('declarer')) or _('defence') - textScore = _('Score %s points for %s') % (abs(score), scorer) - - message = '%s %s.\n\n%s.' % (textContract, textTrick, textScore) - else: - message = _('Bidding passed out.') - - dialog = self.children.open('dialog_gameresult', parent=self) - dialog.setup(message) - - def event_revealHand(self, hand, position): self.redrawHand(position) @@ -519,10 +536,17 @@ d.addErrback(self.errback) + def on_hand_clicked(self, position): + if not self.player and not self.table.players.get(position): + # Join game at position. + self.on_seat_activated(self.cardarea, position) + + def on_card_clicked(self, card, position): if self.player: - d = self.player.callRemote('playCard', card) - d.addErrback(self.errback) + if self.table.game.inProgress() and self.table.game.play: + d = self.player.callRemote('playCard', card) + d.addErrback(self.errback) def on_seat_activated(self, widget, position): @@ -531,8 +555,8 @@ self.player = player # RemoteReference to BridgePlayer object. self.position = position - self.takeseat.set_property('sensitive', False) - self.leaveseat.set_property('sensitive', True) + self.takeseat.set_property('visible', False) + self.leaveseat.set_property('visible', True) # If game is running and bidding is active, open bidding box. if self.table.game.inProgress(): d = self.player.callRemote('getHand') @@ -559,8 +583,8 @@ def success(r): self.player = None self.position = None - self.takeseat.set_property('sensitive', True) - self.leaveseat.set_property('sensitive', False) + self.takeseat.set_property('visible', True) + self.leaveseat.set_property('visible', False) if self.children.get(WindowBidbox): self.children.close(self.children[WindowBidbox]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-14 13:15:38
|
Revision: 418 http://svn.sourceforge.net/pybridge/?rev=418&view=rev Author: umgangee Date: 2007-06-14 06:15:37 -0700 (Thu, 14 Jun 2007) Log Message: ----------- Add more informative messages to the status bar of WindowBridgetable, when playing a game. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-13 15:18:35 UTC (rev 417) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-14 13:15:37 UTC (rev 418) @@ -394,14 +394,30 @@ """Sets the statusbar text to indicate which player is on turn.""" context = self.statusbar.get_context_id('turn') self.statusbar.pop(context) + try: turn = self.table.game.getTurn() - text = _("It is %s's turn") % str(turn) - self.statusbar.push(context, text) - except GameError: # Game not in progress - pass + if self.table.game.play: + declarer, dummy = self.table.game.play.declarer, self.table.game.play.dummy + if self.position and self.position == turn != dummy: + text = _("Play a card from your hand.") + elif self.position and self.position == declarer and turn == dummy: + text = _("Play a card from dummy's hand.") + else: + text = _("It is %s's turn to play a card.") % DIRECTION_SYMBOLS[turn] + else: # Bidding. + if self.position and self.position == turn: + text = _("Make a call from the bidding box.") + else: + text = _("It is %s's turn to make a call.") % DIRECTION_SYMBOLS[turn] + + except GameError: # Game not in progress. + text = _("Waiting for next game to start.") + + self.statusbar.push(context, text) + def setVulnerability(self): """Sets the vulnerability indicators.""" format = "<b>%s</b>" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-14 16:22:07
|
Revision: 420 http://svn.sourceforge.net/pybridge/?rev=420&view=rev Author: umgangee Date: 2007-06-14 09:22:05 -0700 (Thu, 14 Jun 2007) Log Message: ----------- Add display of all hands when game complete. Make results dialog non-blocking, to allow UI events in the background. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-14 16:19:10 UTC (rev 419) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-14 16:22:05 UTC (rev 420) @@ -261,8 +261,10 @@ def gameComplete(self): - for position in Direction: + # Display all previously revealed hands - the server will reveal the others. + for position in self.table.game.visibleHands: self.redrawHand(position, all=True) + self.setTurnIndicator() dialog = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_MODAL, @@ -294,12 +296,14 @@ dialog.set_markup(_('Bidding passed out.')) dialog.format_secondary_text(_('No score.')) - dialog.run() - dialog.destroy() + def dialog_response_cb(dialog, response_id): + dialog.destroy() + if self.player and self.table.game.isNextGameReady(): + d = self.player.callRemote('startNextGame') + d.addErrback(self.errback) - if self.player and self.table.game.isNextGameReady(): - d = self.player.callRemote('startNextGame') - d.addErrback(self.errback) + dialog.connect('response', dialog_response_cb) + dialog.show() def redrawHand(self, position, all=False): @@ -486,6 +490,8 @@ if self.player: d = self.player.callRemote('getHand') + # When player's hand is returned by server, reveal it to client-side Game. + # TODO: is there a better way of synchronising hands? d.addCallbacks(self.table.game.revealHand, self.errback, callbackKeywords={'position' : self.position}) bidbox = self.children.open(WindowBidbox, parent=self) @@ -519,7 +525,8 @@ def event_revealHand(self, hand, position): - self.redrawHand(position) + all = not self.table.game.inProgress() # Show all cards if game has finished. + self.redrawHand(position, all) def event_sendMessage(self, message, sender, recipients): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-18 11:56:26
|
Revision: 425 http://svn.sourceforge.net/pybridge/?rev=425&view=rev Author: umgangee Date: 2007-06-18 04:56:20 -0700 (Mon, 18 Jun 2007) Log Message: ----------- Enhance game result dialog with "Leave Seat" option if playing, switch to ConfigObj configuration management. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-18 11:55:03 UTC (rev 424) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-18 11:56:20 UTC (rev 425) @@ -21,6 +21,7 @@ from cardarea import CardArea from pybridge.network.client import client +from config import config from eventhandler import SimpleEventHandler from manager import WindowManager @@ -220,7 +221,7 @@ iter = self.call_store.get_iter_first() while self.call_store.iter_next(iter) != None: iter = self.call_store.iter_next(iter) - + if isinstance(call, Bid): format = '%s%s' % (LEVEL_SYMBOLS[call.level], STRAIN_SYMBOLS[call.strain]) @@ -234,7 +235,7 @@ position = self.table.game.play.whoPlayed(card) column = position.index row = self.table.game.play.played[position].index(card) - + if self.trick_store.get_iter_first() == None: self.trick_store.append() iter = self.trick_store.get_iter_first() @@ -242,10 +243,9 @@ iter = self.trick_store.iter_next(iter) if iter is None: iter = self.trick_store.append() - + strain_equivalent = getattr(Strain, card.suit.key) # TODO: clean up. - format = '%s%s' % (STRAIN_SYMBOLS[strain_equivalent], - RANK_SYMBOLS[card.rank]) + format = '%s%s' % (RANK_SYMBOLS[card.rank], STRAIN_SYMBOLS[strain_equivalent]) self.trick_store.set(iter, column, format) @@ -268,7 +268,7 @@ self.setTurnIndicator() dialog = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_MODAL, - type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK) + type=gtk.MESSAGE_INFO) dialog.set_title(_('Game result')) # Determine and display score in dialog box. @@ -292,15 +292,23 @@ scorer = (score >= 0 and _('declarer')) or _('defence') dialog.format_secondary_text(_('Score %s points for %s.' % (abs(score), scorer))) + if self.player: + dialog.add_button(_('Leave Seat'), gtk.RESPONSE_CANCEL) + dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + + else: dialog.set_markup(_('Bidding passed out.')) dialog.format_secondary_text(_('No score.')) def dialog_response_cb(dialog, response_id): dialog.destroy() - if self.player and self.table.game.isNextGameReady(): - d = self.player.callRemote('startNextGame') - d.addErrback(self.errback) + if self.player: + if response_id == gtk.RESPONSE_OK and self.table.game.isNextGameReady(): + d = self.player.callRemote('startNextGame') + d.addErrback(self.errback) + elif response_id == gtk.RESPONSE_CANCEL: + self.on_leaveseat_clicked(dialog) dialog.connect('response', dialog_response_cb) dialog.show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-20 15:13:24
|
Revision: 431 http://svn.sourceforge.net/pybridge/?rev=431&view=rev Author: umgangee Date: 2007-06-20 08:13:03 -0700 (Wed, 20 Jun 2007) Log Message: ----------- Add "click to start next game" message to game result dialog, fix "show no buttons when bidding passed out" bug. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-20 15:10:30 UTC (rev 430) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-20 15:13:03 UTC (rev 431) @@ -267,8 +267,7 @@ self.setTurnIndicator() - dialog = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_MODAL, - type=gtk.MESSAGE_INFO) + dialog = gtk.MessageDialog(parent=self.window, type=gtk.MESSAGE_INFO) dialog.set_title(_('Game result')) # Determine and display score in dialog box. @@ -281,26 +280,24 @@ contractText = self.formatContract(self.table.game.contract) if offset > 0: - dialog.set_markup(_('Contract %s made by %s tricks.') \ - % (contractText, offset)) + resultText = _('Contract %s made by %s tricks.') % (contractText, offset) elif offset < 0: - dialog.set_markup(_('Contract %s failed by %s tricks.') \ - % (contractText, abs(offset))) + resultText = _('Contract %s failed by %s tricks.') % (contractText, abs(offset)) else: - dialog.set_markup(_('Contract %s made exactly.') % contractText) - + resultText = _('Contract %s made exactly.') % contractText scorer = (score >= 0 and _('declarer')) or _('defence') - dialog.format_secondary_text(_('Score %s points for %s.' % (abs(score), scorer))) + scoreText = _('Score %s points for %s.' % (abs(score), scorer)) + dialog.set_markup(resultText + '\n' + scoreText) - if self.player: - dialog.add_button(_('Leave Seat'), gtk.RESPONSE_CANCEL) - dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) - - else: dialog.set_markup(_('Bidding passed out.')) dialog.format_secondary_text(_('No score.')) + if self.player: + dialog.add_button(_('Leave Seat'), gtk.RESPONSE_CANCEL) + dialog.format_secondary_text(_('Click OK to start next game.')) + dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + def dialog_response_cb(dialog, response_id): dialog.destroy() if self.player: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-21 15:57:43
|
Revision: 435 http://svn.sourceforge.net/pybridge/?rev=435&view=rev Author: umgangee Date: 2007-06-21 08:57:33 -0700 (Thu, 21 Jun 2007) Log Message: ----------- Make translation strings verbose, so xgettext doesn't complain when parsing. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-20 18:04:19 UTC (rev 434) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-21 15:57:33 UTC (rev 435) @@ -279,14 +279,25 @@ self.addScore(self.table.game.contract, declarerWon, score) contractText = self.formatContract(self.table.game.contract) + fields = {'contract': self.formatContract(self.table.game.contract), + 'offset': abs(offset) } + if offset > 0: - resultText = _('Contract %s made by %s tricks.') % (contractText, offset) + if offset == 1: + resultText = _('Contract %(contract)s made by 1 trick.') % fields + else: + resultText = _('Contract %(contract)s made by %(offset)s tricks.') % fields elif offset < 0: - resultText = _('Contract %s failed by %s tricks.') % (contractText, abs(offset)) + if offset == -1: + resultText = _('Contract %(contract)s failed by 1 trick.') % fields + else: + resultText = _('Contract %(contract)s failed by %(offset)s tricks.') % fields else: - resultText = _('Contract %s made exactly.') % contractText - scorer = (score >= 0 and _('declarer')) or _('defence') - scoreText = _('Score %s points for %s.' % (abs(score), scorer)) + resultText = _('Contract %(contract)s made exactly.') % fields + + pair = (score >= 0 and _('declarer')) or _('defence') + scoreText = _('Score %(points)s points for %(pair)s.') % {'points': abs(score), 'pair': pair} + dialog.set_markup(resultText + '\n' + scoreText) else: @@ -297,6 +308,7 @@ dialog.add_button(_('Leave Seat'), gtk.RESPONSE_CANCEL) dialog.format_secondary_text(_('Click OK to start next game.')) dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + dialog.set_default_response(gtk.RESPONSE_OK) def dialog_response_cb(dialog, response_id): dialog.destroy() @@ -537,7 +549,7 @@ def event_sendMessage(self, message, sender, recipients): buffer = self.chat_messagehistory.get_buffer() iter = buffer.get_end_iter() - buffer.insert(iter, '%s: %s\n' % (sender, message)) + buffer.insert(iter, '\n' + _('%(sender)s: %(message)s' % {'sender': sender, 'message': message})) self.chat_messagehistory.scroll_to_iter(iter, 0) @@ -552,16 +564,14 @@ @return: a format string representing the contract. @rtype: str """ - bidlevel = LEVEL_SYMBOLS[contract['bid'].level] - bidstrain = STRAIN_SYMBOLS[contract['bid'].strain] - doubled = '' - if contract['redoubleBy']: - doubled = ' (%s)' % CALLTYPE_SYMBOLS[Redouble] - elif contract['doubleBy']: - doubled = ' (%s)' % CALLTYPE_SYMBOLS[Double] - declarer = contract['declarer'] + doubled = contract['redoubleBy'] and ' (%s)' % CALLTYPE_SYMBOLS[Redouble] \ + or contract['doubleBy'] and ' (%s)' % CALLTYPE_SYMBOLS[Double] or '' - return _('%s%s%s by %s') % (bidlevel, bidstrain, doubled, declarer) + return _('%(bidlevel)s%(bidstrain)s%(doubled)s by %(declarer)s') \ + % {'bidlevel' : LEVEL_SYMBOLS[contract['bid'].level], + 'bidstrain' : STRAIN_SYMBOLS[contract['bid'].strain], + 'doubled' : doubled, + 'declarer' : DIRECTION_SYMBOLS[contract['declarer']] } # Signal handlers. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-22 15:26:16
|
Revision: 438 http://svn.sourceforge.net/pybridge/?rev=438&view=rev Author: umgangee Date: 2007-06-22 08:26:18 -0700 (Fri, 22 Jun 2007) Log Message: ----------- Relocate translatable elements to vocabulary module, a few tweaks to appearance here and there. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-22 15:23:33 UTC (rev 437) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-22 15:26:18 UTC (rev 438) @@ -19,46 +19,18 @@ import gtk from wrapper import GladeWrapper -from cardarea import CardArea from pybridge.network.client import client +from pybridge.network.error import GameError + +from cardarea import CardArea from config import config from eventhandler import SimpleEventHandler from manager import WindowManager +from vocabulary import * from window_bidbox import WindowBidbox -from pybridge.network.error import GameError -from pybridge.bridge.call import Bid, Pass, Double, Redouble -from pybridge.bridge.symbols import Direction, Level, Strain, Rank, Vulnerable - -# Translatable symbols for elements of bridge. - -CALLTYPE_SYMBOLS = {Pass : _('pass'), Double : _('dbl'), Redouble : _('rdbl') } - -DIRECTION_SYMBOLS = {Direction.North : _('North'), Direction.East : _('East'), - Direction.South : _('South'), Direction.West : _('West') } - -LEVEL_SYMBOLS = {Level.One : _('1'), Level.Two : _('2'), Level.Three : _('3'), - Level.Four : _('4'), Level.Five : _('5'), Level.Six : _('6'), - Level.Seven : _('7') } - -RANK_SYMBOLS = {Rank.Two : _('2'), Rank.Three : _('3'), Rank.Four : _('4'), - Rank.Five : _('5'), Rank.Six : _('6'), Rank.Seven : _('7'), - Rank.Eight : _('8'), Rank.Nine : _('9'), Rank.Ten : _('10'), - Rank.Jack : _('J'), Rank.Queen : _('Q'), Rank.King : _('K'), - Rank.Ace : _('A') } - -STRAIN_SYMBOLS = {Strain.Club : u'\N{BLACK CLUB SUIT}', - Strain.Diamond : u'\N{BLACK DIAMOND SUIT}', - Strain.Heart : u'\N{BLACK HEART SUIT}', - Strain.Spade : u'\N{BLACK SPADE SUIT}', - Strain.NoTrump : u'NT' } - -VULN_SYMBOLS = {Vulnerable.All : _('All'), Vulnerable.NorthSouth : _('N/S'), - Vulnerable.EastWest : _('E/W'), Vulnerable.None : _('None') } - - class WindowBridgetable(GladeWrapper): glade_name = 'window_bridgetable' @@ -75,7 +47,7 @@ self.takeseat_items = {} menu = gtk.Menu() for position in Direction: - item = gtk.MenuItem(DIRECTION_SYMBOLS[position], True) + item = gtk.MenuItem(DIRECTION_NAMES[position], True) item.connect('activate', self.on_seat_activated, position) item.show() menu.append(item) @@ -91,13 +63,15 @@ self.cardarea.show() renderer = gtk.CellRendererText() + renderer.set_property('size-points', 12) + renderer.set_property('xalign', 0.5) # Set up bidding history and column display. self.call_store = gtk.ListStore(str, str, str, str) self.biddingview.set_model(self.call_store) for index, position in enumerate(Direction): - title = DIRECTION_SYMBOLS[position] - column = gtk.TreeViewColumn(str(title), renderer, text=index) + title = DIRECTION_NAMES[position] + column = gtk.TreeViewColumn(title, renderer, markup=index) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_fixed_width(50) self.biddingview.append_column(column) @@ -106,8 +80,8 @@ self.trick_store = gtk.ListStore(str, str, str, str) self.trickview.set_model(self.trick_store) for index, position in enumerate(Direction): - title = DIRECTION_SYMBOLS[position] - column = gtk.TreeViewColumn(str(title), renderer, text=index) + title = DIRECTION_NAMES[position] + column = gtk.TreeViewColumn(str(title), renderer, markup=index) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_fixed_width(50) self.trickview.append_column(column) @@ -222,11 +196,7 @@ while self.call_store.iter_next(iter) != None: iter = self.call_store.iter_next(iter) - if isinstance(call, Bid): - format = '%s%s' % (LEVEL_SYMBOLS[call.level], - STRAIN_SYMBOLS[call.strain]) - else: - format = CALLTYPE_SYMBOLS[call.__class__] + format = render_call(call) self.call_store.set(iter, column, format) @@ -244,13 +214,12 @@ if iter is None: iter = self.trick_store.append() - strain_equivalent = getattr(Strain, card.suit.key) # TODO: clean up. - format = '%s%s' % (RANK_SYMBOLS[card.rank], STRAIN_SYMBOLS[strain_equivalent]) + format = render_card(card) self.trick_store.set(iter, column, format) def addScore(self, contract, made, score): - textContract = self.formatContract(contract) + textContract = render_contract(contract) textMade = '%s' % made if contract['declarer'] in (Direction.North, Direction.South) and score > 0 \ or contract['declarer'] in (Direction.East, Direction.West) and score < 0: @@ -278,10 +247,8 @@ score = self.table.game.getScore() self.addScore(self.table.game.contract, declarerWon, score) - contractText = self.formatContract(self.table.game.contract) - fields = {'contract': self.formatContract(self.table.game.contract), + fields = {'contract': render_contract(self.table.game.contract), 'offset': abs(offset) } - if offset > 0: if offset == 1: resultText = _('Contract %(contract)s made by 1 trick.') % fields @@ -309,6 +276,9 @@ dialog.format_secondary_text(_('Click OK to start next game.')) dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) dialog.set_default_response(gtk.RESPONSE_OK) + # If user leaves table (ie. closes window), close dialog as well. + dialog.set_transient_for(self.window) + dialog.set_destroy_with_parent(True) def dialog_response_cb(dialog, response_id): dialog.destroy() @@ -371,7 +341,7 @@ format = "<span size=\"x-large\">%s</span>" if self.table.game.contract: - text = self.formatContract(self.table.game.contract) + text = render_contract(self.table.game.contract) self.label_contract.set_markup(format % text) self.label_contract.set_property('sensitive', True) else: @@ -384,7 +354,7 @@ dealer = '' if self.table.game.inProgress(): - dealer = DIRECTION_SYMBOLS[self.table.game.board['dealer']] + dealer = DIRECTION_NAMES[self.table.game.board['dealer']] self.label_dealer.set_markup(format % dealer) @@ -426,13 +396,13 @@ elif self.position and self.position == declarer and turn == dummy: text = _("Play a card from dummy's hand.") else: - text = _("It is %s's turn to play a card.") % DIRECTION_SYMBOLS[turn] + text = _("It is %s's turn to play a card.") % DIRECTION_NAMES[turn] else: # Bidding. if self.position and self.position == turn: text = _("Make a call from the bidding box.") else: - text = _("It is %s's turn to make a call.") % DIRECTION_SYMBOLS[turn] + text = _("It is %s's turn to make a call.") % DIRECTION_NAMES[turn] except GameError: # Game not in progress. text = _("Waiting for next game to start.") @@ -553,27 +523,6 @@ self.chat_messagehistory.scroll_to_iter(iter, 0) -# Utility methods. - - - def formatContract(self, contract): - """Produce a format string representing the contract. - - @param contract: a contract object. - @type contract: dict - @return: a format string representing the contract. - @rtype: str - """ - doubled = contract['redoubleBy'] and ' (%s)' % CALLTYPE_SYMBOLS[Redouble] \ - or contract['doubleBy'] and ' (%s)' % CALLTYPE_SYMBOLS[Double] or '' - - return _('%(bidlevel)s%(bidstrain)s%(doubled)s by %(declarer)s') \ - % {'bidlevel' : LEVEL_SYMBOLS[contract['bid'].level], - 'bidstrain' : STRAIN_SYMBOLS[contract['bid'].strain], - 'doubled' : doubled, - 'declarer' : DIRECTION_SYMBOLS[contract['declarer']] } - - # Signal handlers. @@ -630,7 +579,7 @@ def on_leaveseat_clicked(self, widget, *args): - + def success(r): self.player = None self.position = None @@ -638,7 +587,7 @@ self.leaveseat.set_property('sensitive', False) if self.children.get(WindowBidbox): self.children.close(self.children[WindowBidbox]) - + d = self.table.leaveGame(self.position) d.addCallbacks(success, self.errback) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <umg...@us...> - 2007-06-25 09:46:38
|
Revision: 451 http://svn.sourceforge.net/pybridge/?rev=451&view=rev Author: umgangee Date: 2007-06-25 02:46:35 -0700 (Mon, 25 Jun 2007) Log Message: ----------- Add a confirmation dialog when user requests to leave table whilst playing a game. Modified Paths: -------------- trunk/pybridge/pybridge/ui/window_bridgetable.py Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-24 16:28:19 UTC (rev 450) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-06-25 09:46:35 UTC (rev 451) @@ -615,10 +615,30 @@ def on_leavetable_clicked(self, widget, *args): - d = client.leaveTable(self.table.id) - d.addErrback(self.errback) + # If user is currently playing a game, request confirmation. + if self.player and self.table.game.inProgress(): + dialog = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_MODAL, + type=gtk.MESSAGE_QUESTION) + dialog.set_title(_('Leave table?')) + dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) + dialog.add_button(_('Leave Table'), gtk.RESPONSE_OK) + dialog.set_markup(_('Are you sure you wish to leave this table?')) + dialog.format_secondary_text(_('You are currently playing a game. Leaving may forfeit the game, or incur penalties.')) + def dialog_response_cb(dialog, response_id): + dialog.destroy() + if response_id == gtk.RESPONSE_OK: + d = client.leaveTable(self.table.id) + d.addErrback(self.errback) + dialog.connect('response', dialog_response_cb) + dialog.show() + + else: + d = client.leaveTable(self.table.id) + d.addErrback(self.errback) + + def on_chat_message_changed(self, widget, *args): sensitive = self.chat_message.get_text() != '' self.chat_send.set_property('sensitive', sensitive) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |