def game(self, value): # pylint: disable=arguments-differ game = self._game changing = value != game GameScene.game.fset(self, value) if changing: if value is not None: self.scoringDialog = ScoringDialog(scene=self) else: self.scoringDialog.hide() self.scoringDialog = None
class ScoringScene(GameScene): """a scoring game""" # pylint: disable=too-many-instance-attributes def __init__(self, parent=None): self.scoringDialog = None super(ScoringScene, self).__init__(parent) self.selectorBoard.hasFocus = True @GameScene.game.setter def game(self, value): # pylint: disable=arguments-differ game = self._game changing = value != game GameScene.game.fset(self, value) if changing: if value is not None: self.scoringDialog = ScoringDialog(scene=self) else: self.scoringDialog.hide() self.scoringDialog = None def handSelectorChanged(self, handBoard): """update all relevant dialogs""" GameScene.handSelectorChanged(self, handBoard) if self.scoringDialog: self.scoringDialog.slotInputChanged() def setupUi(self): """create all other widgets""" GameScene.setupUi(self) self.setObjectName("ScoringScene") self.selectorBoard = SelectorBoard() self.addItem(self.selectorBoard) QMetaObject.connectSlotsByName(self) def abort(self): """abort current game""" def answered(result): """got answer""" if result: self.game = None return result if Debug.quit: logDebug('ScoringScene.abort invoked') if not self.game: return succeed(True) elif self.game.finished(): self.game = None return succeed(True) else: return QuestionYesNo( i18n("Do you really want to abort this game?"), always=True).addCallback(answered) def __moveTile(self, uiTile, wind, toConcealed): """the user pressed a wind letter or X for center, wanting to move a uiTile there""" # this tells the receiving board that this is keyboard, not mouse navigation> # needed for useful placement of the popup menu currentBoard = uiTile.board if wind == 'X': receiver = self.selectorBoard else: receiver = self.game.players[wind].handBoard movingMeld = currentBoard.uiMeldWithTile(uiTile) if receiver != currentBoard or toConcealed != movingMeld.meld.isConcealed: movingLastMeld = movingMeld.meld == self.computeLastMeld() if movingLastMeld: self.scoringDialog.clearLastTileCombo() receiver.dropTile(uiTile, toConcealed) if movingLastMeld and receiver == currentBoard: self.scoringDialog.fillLastTileCombo() def __navigateScoringGame(self, event): """keyboard navigation in a scoring game""" mod = event.modifiers() key = event.key() wind = chr(key % 128) windsX = ''.join(x.char for x in Wind.all) moveCommands = i18nc( 'kajongg:keyboard commands for moving tiles to the players ' 'with wind ESWN or to the central tile selector (X)', windsX) uiTile = self.focusItem() if wind in moveCommands: # translate i18n wind key to ESWN: wind = windsX[moveCommands.index(wind)] self.__moveTile(uiTile, wind, bool(mod & Qt.ShiftModifier)) return True if key == Qt.Key_Tab and self.game: tabItems = [self.selectorBoard] tabItems.extend( list(p.handBoard for p in self.game.players if p.handBoard.uiTiles)) tabItems.append(tabItems[0]) currentBoard = uiTile.board currIdx = 0 while tabItems[currIdx] != currentBoard and currIdx < len( tabItems) - 2: currIdx += 1 tabItems[currIdx + 1].hasFocus = True return True def keyPressEvent(self, event): """navigate in the selectorboard""" mod = event.modifiers() if mod in (Qt.NoModifier, Qt.ShiftModifier): if self.game: if self.__navigateScoringGame(event): return GameScene.keyPressEvent(self, event) def adjustSceneView(self): """adjust the view such that exactly the wanted things are displayed without having to scroll""" if self.game: with AnimationSpeed(): self.selectorBoard.maximize() GameScene.adjustSceneView(self) def prepareHand(self): """redecorate wall""" GameScene.prepareHand(self) if self.scoringDialog: self.scoringDialog.clearLastTileCombo() def updateSceneGUI(self): """update some actions, all auxiliary windows and the statusbar""" if not isAlive(self): return GameScene.updateSceneGUI(self) game = self.game mainWindow = self.mainWindow for action in [mainWindow.actionScoreGame, mainWindow.actionPlayGame]: action.setEnabled(not bool(game)) mainWindow.actionAbortGame.setEnabled(bool(game)) self.selectorBoard.setVisible(bool(game)) self.selectorBoard.setEnabled(bool(game)) def changeAngle(self): """now that no animation is running, really change""" self.selectorBoard.lightSource = self.newLightSource() GameScene.changeAngle(self) def computeLastTile(self): """compile hand info into a string as needed by the scoring engine""" if self.scoringDialog: # is None while ScoringGame is created return self.scoringDialog.computeLastTile() def computeLastMeld(self): """compile hand info into a string as needed by the scoring engine""" if self.scoringDialog: # is None while ScoringGame is created cbLastMeld = self.scoringDialog.cbLastMeld idx = cbLastMeld.currentIndex() if idx >= 0: return Meld(cbLastMeld.itemData(idx)) return Meld()
class ScoringScene(GameScene): """a scoring game""" # pylint: disable=too-many-instance-attributes def __init__(self, parent=None): self.scoringDialog = None super(ScoringScene, self).__init__(parent) self.selectorBoard.hasFocus = True @GameScene.game.setter def game(self, value): # pylint: disable=arguments-differ game = self._game changing = value != game GameScene.game.fset(self, value) if changing: if value is not None: self.scoringDialog = ScoringDialog(scene=self) else: self.scoringDialog.hide() self.scoringDialog = None def handSelectorChanged(self, handBoard): """update all relevant dialogs""" GameScene.handSelectorChanged(self, handBoard) if self.scoringDialog: self.scoringDialog.slotInputChanged() def setupUi(self): """create all other widgets""" GameScene.setupUi(self) self.setObjectName("ScoringScene") self.selectorBoard = SelectorBoard() self.addItem(self.selectorBoard) QMetaObject.connectSlotsByName(self) def abort(self): """abort current game""" def answered(result): """got answer""" if result: self.game = None return result if Debug.quit: logDebug(u'ScoringScene.abort invoked') if not self.game: return succeed(True) elif self.game.finished(): self.game = None return succeed(True) else: return QuestionYesNo(m18n("Do you really want to abort this game?"), always=True).addCallback(answered) def __moveTile(self, uiTile, wind, lowerHalf): """the user pressed a wind letter or X for center, wanting to move a uiTile there""" # this tells the receiving board that this is keyboard, not mouse navigation> # needed for useful placement of the popup menu currentBoard = uiTile.board if wind == 'X': receiver = self.selectorBoard else: receiver = self.game.players[wind].handBoard if receiver != currentBoard or bool(lowerHalf) != bool(uiTile.yoffset): movingLastMeld = uiTile.tile in self.computeLastMeld() if movingLastMeld: self.scoringDialog.clearLastTileCombo() receiver.dropTile(uiTile, lowerHalf) if movingLastMeld and receiver == currentBoard: self.scoringDialog.fillLastTileCombo() def __navigateScoringGame(self, event): """keyboard navigation in a scoring game""" mod = event.modifiers() key = event.key() wind = chr(key % 128) windsX = ''.join(x.char for x in Wind.all) moveCommands = m18nc('kajongg:keyboard commands for moving tiles to the players ' 'with wind ESWN or to the central tile selector (X)', windsX) uiTile = self.focusItem() if wind in moveCommands: # translate i18n wind key to ESWN: wind = windsX[moveCommands.index(wind)] self.__moveTile(uiTile, wind, bool(mod & Qt.ShiftModifier)) return True if key == Qt.Key_Tab and self.game: tabItems = [self.selectorBoard] tabItems.extend( list(p.handBoard for p in self.game.players if p.handBoard.uiTiles)) tabItems.append(tabItems[0]) currentBoard = uiTile.board currIdx = 0 while tabItems[currIdx] != currentBoard and currIdx < len(tabItems) - 2: currIdx += 1 tabItems[currIdx + 1].hasFocus = True return True def keyPressEvent(self, event): """navigate in the selectorboard""" mod = event.modifiers() if mod in (Qt.NoModifier, Qt.ShiftModifier): if self.game: if self.__navigateScoringGame(event): return GameScene.keyPressEvent(self, event) def adjustView(self): """adjust the view such that exactly the wanted things are displayed without having to scroll""" if self.game: with MoveImmediate(): self.selectorBoard.maximize() GameScene.adjustView(self) def prepareHand(self): """redecorate wall""" GameScene.prepareHand(self) if self.scoringDialog: self.scoringDialog.clearLastTileCombo() def updateSceneGUI(self): """update some actions, all auxiliary windows and the statusbar""" if not isAlive(self): return GameScene.updateSceneGUI(self) game = self.game mainWindow = self.mainWindow for action in [mainWindow.actionScoreGame, mainWindow.actionPlayGame]: action.setEnabled(not bool(game)) mainWindow.actionAbortGame.setEnabled(bool(game)) self.selectorBoard.setVisible(bool(game)) self.selectorBoard.setEnabled(bool(game)) def changeAngle(self): """now that no animation is running, really change""" self.selectorBoard.lightSource = self.newLightSource() GameScene.changeAngle(self) def computeLastTile(self): """compile hand info into a string as needed by the scoring engine""" if self.scoringDialog: # is None while ScoringGame is created return self.scoringDialog.computeLastTile() def computeLastMeld(self): """compile hand info into a string as needed by the scoring engine""" if self.scoringDialog: # is None while ScoringGame is created cbLastMeld = self.scoringDialog.cbLastMeld idx = cbLastMeld.currentIndex() if idx >= 0: return Meld(nativeString( variantValue(cbLastMeld.itemData(idx)))) return Meld()