class PlayerWind(QGraphicsEllipseItem): """a round wind tile""" def __init__(self, name, tileset, roundsFinished=0, parent = None): """generate new wind tile""" if not len(WINDPIXMAPS): WINDPIXMAPS[('E', False)] = None # avoid recursion self.genWINDPIXMAPS() QGraphicsEllipseItem.__init__(self) if parent: self.setParentItem(parent) self.name = name self.face = QGraphicsSvgItem() self.face.setParentItem(self) self.prevailing = None self.setWind(name, roundsFinished) self.tileset = tileset self.__sizeFace() @staticmethod def genWINDPIXMAPS(): """prepare wind tiles""" tileset = Tileset(Preferences.windTilesetName) for wind in WINDS: for prevailing in False, True: pwind = PlayerWind(wind, tileset, prevailing) pMap = QPixmap(40, 40) pMap.fill(Qt.transparent) painter = QPainter(pMap) painter.setRenderHint(QPainter.Antialiasing) painter.scale(0.40, 0.40) pwind.paint(painter, QStyleOptionGraphicsItem()) for child in pwind.childItems(): if isinstance(child, QGraphicsSvgItem): painter.save() painter.translate(child.mapToParent(0.0, 0.0)) child.paint(painter, QStyleOptionGraphicsItem()) painter.restore() WINDPIXMAPS[(wind, prevailing)] = pMap def __sizeFace(self): """size the chinese character depending on the wind tileset""" self.resetTransform() size = self.tileset.faceSize self.setFlag(QGraphicsItem.ItemClipsChildrenToShape) diameter = size.height() * 1.1 scaleFactor = 0.9 facePos = {'traditional':(10, 10), 'default':(15, 10), 'classic':(19, 1), 'jade':(19, 1)} self.setRect(0, 0, diameter, diameter) self.setScale(scaleFactor) faceX, faceY = facePos[self.tileset.desktopFileName] self.face.setPos(faceX, faceY) self.face.setSharedRenderer(self.tileset.renderer()) def setWind(self, name, roundsFinished): """change the wind""" self.name = name if isinstance(roundsFinished, bool): self.prevailing = roundsFinished else: self.prevailing = name == WINDS[roundsFinished % 4] self.setBrush(ROUNDWINDCOLOR if self.prevailing else QColor('white')) windtilenr = {'N':1, 'S':2, 'E':3, 'W':4} self.face.setElementId('WIND_%d' % windtilenr[name])
class PlayerWind(QGraphicsEllipseItem): """a round wind tile""" def __init__(self, name, tileset, roundsFinished=0, parent = None): """generate new wind tile""" if not len(WINDPIXMAPS): WINDPIXMAPS[('E', False)] = None # avoid recursion self.genWINDPIXMAPS() QGraphicsEllipseItem.__init__(self) if parent: self.setParentItem(parent) self.name = name self.face = QGraphicsSvgItem() self.face.setParentItem(self) self.prevailing = None self.setWind(name, roundsFinished) self.tileset = tileset self.__sizeFace() @staticmethod def genWINDPIXMAPS(): """prepare wind tiles""" tileset = Tileset(common.PREF.windTilesetName) for wind in WINDS: for prevailing in False, True: pwind = PlayerWind(wind, tileset, prevailing) pMap = QPixmap(40, 40) pMap.fill(Qt.transparent) painter = QPainter(pMap) painter.setRenderHint(QPainter.Antialiasing) painter.scale(0.40, 0.40) pwind.paint(painter, QStyleOptionGraphicsItem()) for child in pwind.childItems(): if isinstance(child, QGraphicsSvgItem): painter.save() painter.translate(child.mapToParent(0.0, 0.0)) child.paint(painter, QStyleOptionGraphicsItem()) painter.restore() WINDPIXMAPS[(wind, prevailing)] = pMap def __sizeFace(self): """size the chinese character depending on the wind tileset""" self.resetTransform() size = self.tileset.faceSize self.setFlag(QGraphicsItem.ItemClipsChildrenToShape) diameter = size.height() * 1.1 scaleFactor = 0.9 facePos = {'traditional':(10, 10), 'default':(15, 10), 'classic':(19, 1), 'jade':(19, 1)} self.setRect(0, 0, diameter, diameter) self.setScale(scaleFactor) faceX, faceY = facePos[self.tileset.desktopFileName] self.face.setPos(faceX, faceY) self.face.setSharedRenderer(self.tileset.renderer()) def setWind(self, name, roundsFinished): """change the wind""" self.name = name if isinstance(roundsFinished, bool): self.prevailing = roundsFinished else: self.prevailing = name == WINDS[roundsFinished % 4] self.setBrush(ROUNDWINDCOLOR if self.prevailing else QColor('white')) windtilenr = {'N':1, 'S':2, 'E':3, 'W':4} self.face.setElementId('WIND_%d' % windtilenr[name])
class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ Class documentation goes here. """ def __init__(self, parent = None): """ Constructor """ QtGui.QMainWindow.__init__(self, parent) self.setupUi(self) self.themeDir="/hometheme/Cockpit/" self.theme=["clock-drop-shadow.svg", "clock-face.svg", "clock-face-shadow.svg", "clock-marks.svg", "clock-frame.svg", "clock-glass.svg" ] #Variables that keep track of the angle of the hands, and Time self.pHour=0 self.pMinute=0 self.pSecond=0 self.secTimer = QtCore.QBasicTimer() self.minTimer=QtCore.QTimer() self.calibrateTimer=QtCore.QTimer() #The second hand counter 166=6 beats per second, 1000 =1 beat per sec self.secTimerType=166.9 self.secTimerBeat=1 #Variables that keep track of scene self.sceneWidth=0 self.sceneHeight=0 self.centerx=0 self.centery=0 self.xoffset=10 #self.setGeometry(0,0,800, 480) self.setWindowTitle('Nclock') self.themeDir="/home/user/MyDocs/Nclocktheme/" #Check to see if files in /user/MyDocs/Nclock try: f=open (self.themeDir+"clock-face.svg") except : reply = QtGui.QMessageBox.question(self, 'Message',"No Theme Files in directory /home/user/MyDocs/Nclocktheme. load default theme? No to Exit", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply==QtGui.QMessageBox.Yes :self.themeDir="theme/" else : exit() #Initialize the Graphics Scene, Graphicsview is setup in QtDesigner UI self.scene = QtGui.QGraphicsScene() for path in self.theme: self.fileExist=1 try: f=open (self.themeDir+path) except : self.fileExist=0 if self.fileExist==1: self.svgItem=QGraphicsSvgItem(self.themeDir+path) renderer=self.svgItem.renderer() self.scene.addItem(self.svgItem) #get the bounding box for the scene #self.rect=self.scene.itemsBoundingRect() #self.scene.setSceneRect(0, 0, 150, 150) self.rect=self.scene.itemsBoundingRect() self.sceneWidth=self.rect.width() self.sceneHeight=self.rect.height() self.centerx=self.sceneWidth/2 self.centery=self.sceneHeight/2 self.grView.centerOn(self.centerx, self.centery) #draw the Hourhand self.svgHour=QGraphicsSvgItem(self.themeDir+"clock-hour-hand.svg",) renderer=self.svgHour.renderer() self.svgHour.setPos(self.centerx, self.centery) #self.scene.addItem(self.svgHour) #draw the Minutehand self.svgMinute=QGraphicsSvgItem(self.themeDir+"clock-minute-hand.svg",) renderer=self.svgMinute.renderer() self.svgMinute.setPos(self.centerx, self.centery) #self.scene.addItem(self.svgMinute) #draw the Second hand self.svgSecond=QGraphicsSvgItem(self.themeDir+"clock-second-hand.svg",) renderer=self.svgSecond.renderer() svgRect=QtCore.QRect() print svgRect svgRect.setX(-10) svgRect.setY(-1) svgRect.setWidth(100) svgRect.setHeight(100) print svgRect renderer.setViewBox(svgRect) self.svgSecond.setPos(self.centerx-10, self.centery-1) self.scene.addItem(self.svgSecond) #Paint the Scene and center self.rect=self.scene.itemsBoundingRect() height=self.rect.height() width=self.rect.width() if width>height: dimension=width else :dimension =height self.scene.setSceneRect(0, 0, dimension, dimension) self.rect=self.scene.itemsBoundingRect() self.grView.setScene(self.scene) self.grView.scale(3, 3) @pyqtSignature("") # sets the second hands tick to Quartz style def on_actionQuartz_triggered(self): self.secTimerType=1000 self.secTimerBeat=6 self.calibrateTime() @pyqtSignature("") #Sets the seconds hand to Automatic smooth style def on_actionAutomatic_triggered(self): self.secTimerType=166.9 self.secTimerBeat=1 self.calibrateTime() @pyqtSignature("") #Sets the seconds hand standstill def on_actionEco_triggered(self): self.secTimer.stop() self.calibrateTimer.stop() self.svgSecond.resetTransform() self.svgSecond.rotate(-90) @pyqtSignature("") #Sets the seconds hand to Automatic smooth style def on_actionZoom_In_triggered(self): self.grView.scale(2, 2) self.grView.setScene(self.scene) @pyqtSignature("") #Sets the seconds hand to Automatic smooth style def on_actionZoom_Out_triggered(self): self.grView.scale(0.9, 0.9) self.grView.setScene(self.scene)