class GPSMarker(QgsMapCanvasItem): def __init__(self, canvas): QgsMapCanvasItem.__init__(self, canvas) self.canvas = canvas self.size = 24 self.map_pos = QgsPoint(0.0, 0.0) self.svgrender = QSvgRenderer(":/icons/gps_marker") def setSize(self, size): self.size = size def paint(self, painter, xxx, xxx2): self.setPos(self.toCanvasCoordinates(self.map_pos)) halfSize = self.size / 2.0 self.svgrender.render(painter, QRectF(0 - halfSize, 0 - halfSize, self.size, self.size ) ) def boundingRect(self): halfSize = self.size / 2.0 return QRectF(-halfSize, -halfSize, 2.0 * halfSize, 2.0 * halfSize) def setCenter(self, map_pos): self.map_pos = map_pos self.setPos(self.toCanvasCoordinates(self.map_pos)) def updatePosition(self): self.setCenter(self.map_pos)
def __init__(self, main_view): super().__init__() self.board_svg = QSvgRenderer("assets/boards/blue.svg") self.main_view = main_view self.board = chess.Board() self.piece_images = {} self.ranks = "87654321" self.files = "abcdefgh" self.move = WHITE self.board_size = 0 self.tile_size = 0 self.selected = None self.engine_handler = EngineHandler(self) self.best_move = None self.show_best_move = True self.move_history = [] self.arrows = [] self.dragging = False self.dragX = 0 self.dragY = 0 for c in "QRPBNK": self.piece_images[WHITE + c] = QSvgRenderer("assets/pieces/w" + c + ".svg") self.piece_images[BLACK + c] = QSvgRenderer("assets/pieces/b" + c + ".svg")
def get_png_image( input_svg_file, newWidth = None, verify = True ): assert( os.path.basename( input_svg_file ).endswith( '.svg' ) or os.path.basename( input_svg_file ).endswith( '.svgz') ) assert( os.path.isfile( input_svg_file ) ) if os.path.basename( input_svg_file ).endswith( '.svgz' ): r = QSvgRenderer( QByteArray( gzip.open( input_svg_file, 'rb' ).read( ) ) ) files = { 'file' : gzip.open( input_svg_file, 'rb' ) } else: r = QSvgRenderer( input_svg_file ) files = { 'file' : open( input_svg_file, 'rb' ) } width = r.defaultSize().width() height = r.defaultSize().height() apiKey = get_cloudconvert_api_key( ) params = { 'apikey' : apiKey, 'input' : 'upload', 'inputformat' : 'svg', 'outputformat' : 'png', } if newWidth is not None: assert( isinstance( newWidth, int ) ) assert( newWidth > 10 ) newHeight = int( height * 1.0 * newWidth / width ) params['converteroptions[resize]'] = '%dx%d' % ( newWidth, newHeight ) # ## response = requests.post( "https://api.cloudconvert.com/convert", params = params, files = files, verify = verify ) if response.status_code != 200: raise ValueError("Error, could not upload and convert SVG file %s." % input_svg_file ) img = Image.open( StringIO( response.content ) ) return img
def requestPixmap(self, id, size, requestedSize): head = """<svg viewBox=\"0 -1 512 2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"none\">\n""" s1 = self._callback(0) s2 = self._callback(1) beginpoly = "<polyline points=\"" def endpoly(color): return "\" style=\"fill:none;stroke:"+color+";stroke-width:0.03\"></polyline>" bytes = QByteArray(head + beginpoly + s1 + endpoly("green") + beginpoly + s2 + endpoly("red") + "</svg>") #self._iter = (self._iter + 1) % 256 #f = open('./waveforms/instantaneousWaveform%03d.svg' % self._iter, 'w') #f.write(head + beginpoly + s1 + endpoly("green") + beginpoly + s2 + endpoly("red") + "</svg>") #f.close() renderer = QSvgRenderer() worked = renderer.load(bytes) if not worked: print("SVG parse failed.") size = renderer.defaultSize() image = QPixmap(requestedSize) image.fill(QColor(0,0,0)) painter = QPainter(image) renderer.render(painter) return image
class GPSMarker(QgsMapCanvasItem): def __init__(self, canvas): QgsMapCanvasItem.__init__(self, canvas) self.canvas = canvas self.size = 24 self.map_pos = QgsPoint(0.0, 0.0) self.svgrender = QSvgRenderer(":/icons/gps_marker") def setSize(self, size): self.size = size def paint(self, painter, xxx, xxx2): self.setPos(self.toCanvasCoordinates(self.map_pos)) halfSize = self.size / 2.0 self.svgrender.render( painter, QRectF(0 - halfSize, 0 - halfSize, self.size, self.size)) def boundingRect(self): halfSize = self.size / 2.0 return QRectF(-halfSize, -halfSize, 2.0 * halfSize, 2.0 * halfSize) def setCenter(self, map_pos): self.map_pos = map_pos self.setPos(self.toCanvasCoordinates(self.map_pos)) def updatePosition(self): self.setCenter(self.map_pos)
def __init__(self, player, visible, parent = None): super(BoardView, self).__init__(parent) self.player = player self.visible = visible self.panel = QSvgRenderer(self.PANEL, self) self.hit = QSvgRenderer(self.HIT, self) self.miss = QSvgRenderer(self.MISS, self) self.ship = [QSvgRenderer(filename, self) for filename in self.SHIPS] self.moving, self.x0, self.y0, self.dx, self.dy = None, 0, 0, 0, 0
def __init__(self, parent=None, **kwargs): self.m_value=False self.m_onColour=QLed.Red self.m_offColour=QLed.Grey self.m_shape=QLed.Circle QWidget.__init__(self, parent, **kwargs) self._pressed=False self.renderer=QSvgRenderer()
def init(self): self.m_backgroundRenderer = QSvgRenderer("images/"+self.m_skin+"/background.svg", self) self.m_needleShadowRenderer = QSvgRenderer("images/"+self.m_skin+"/needle_shadow.svg", self) self.m_needleRenderer = QSvgRenderer("images/"+self.m_skin+"/needle.svg", self) self.m_overlayRenderer = QSvgRenderer("images/"+self.m_skin+"/overlay.svg", self) self.updateGeometry() self.update()
def rasterize_svg(self, elem, width=0, height=0, format='PNG'): view_box = elem.get('viewBox', elem.get('viewbox', None)) sizes = None logger = self.oeb.logger if view_box is not None: try: box = [ float(x) for x in filter(None, re.split('[, ]', view_box)) ] sizes = [box[2] - box[0], box[3] - box[1]] except (TypeError, ValueError, IndexError): logger.warn( 'SVG image has invalid viewBox="%s", ignoring the viewBox' % view_box) else: for image in elem.xpath( 'descendant::*[local-name()="image" and ' '@height and contains(@height, "%")]'): logger.info( 'Found SVG image height in %, trying to convert...') try: h = float(image.get('height').replace('%', '')) / 100. image.set('height', str(h * sizes[1])) except: logger.exception( 'Failed to convert percentage height:', image.get('height')) data = QByteArray(xml2str(elem, with_tail=False)) svg = QSvgRenderer(data) size = svg.defaultSize() if size.width() == 100 and size.height() == 100 and sizes: size.setWidth(sizes[0]) size.setHeight(sizes[1]) if width or height: size.scale(width, height, Qt.KeepAspectRatio) logger.info('Rasterizing %r to %dx%d' % (elem, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, format) return str(array)
def pixmap(name, size, mode, state): """Returns a (possibly cached) pixmap of the name and size with the default text color. The state argument is ignored for now. """ if mode == QIcon.Selected: color = QApplication.palette().highlightedText().color() else: color = QApplication.palette().text().color() key = (name, size.width(), size.height(), color.rgb(), mode) try: return _pixmaps[key] except KeyError: i = QImage(size, QImage.Format_ARGB32_Premultiplied) i.fill(0) painter = QPainter(i) # render SVG symbol QSvgRenderer(os.path.join(__path__[0], name + ".svg")).render(painter) # recolor to text color painter.setCompositionMode(QPainter.CompositionMode_SourceIn) painter.fillRect(i.rect(), color) painter.end() # let style alter the drawing based on mode, and create QPixmap pixmap = QApplication.style().generatedIconPixmap( mode, QPixmap.fromImage(i), QStyleOption()) _pixmaps[key] = pixmap return pixmap
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # line 1909, near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) # width and height in pixels # svg_w = int(self._c.paperWidth() * self._c.printResolution() / 25.4) # svg_h = int(self._c.paperHeight() * self._c.printResolution() / 25.4) svg_w = width svg_h = height svg_g.setSize(QSize(svg_w, svg_h)) svg_g.setViewBox(QRect(0, 0, svg_w, svg_h)) # because the rendering is done in mm, convert the dpi # svg_g.setResolution(self._c.printResolution()) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): # something went pear-shaped return False, '' image = QImage(width, height, QImage.Format_ARGB32) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def paintEvent(self, e): """This event handler is reimplemented in this subclass to receive paint events passed in event. A paint event is a request to repaint all or part of a widget. It can happen for one of the following reasons: repaint() or update() was invoked,the widget was obscured and has now been uncovered, or many other reasons. """ qp = QPainter() qp.begin(self) # if no steos have been receive draw last_diagram_bytes if not self.steps and self.last_diagram_bytes: diagram_bytes = self.last_diagram_bytes else: diagram = self.build_graph() diagram_bytes = diagram.pipe('svg') self.last_diagram_bytes = diagram_bytes svg = QSvgRenderer(diagram_bytes) svg.render(qp) qp.end()
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) svg_g.setSize(QSize(width, height)) svg_g.setViewBox(QRect(0, 0, width, height)) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): return False, '' image = QImage(width, height, self._TestMapSettings.outputImageFormat()) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) p.setRenderHint( QPainter.Antialiasing, self._TestMapSettings.testFlag(QgsMapSettings.Antialiasing)) p.setRenderHint(QPainter.TextAntialiasing) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) svg_g.setSize(QSize(width, height)) svg_g.setViewBox(QRect(0, 0, width, height)) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): return False, '' image = QImage(width, height, self._TestMapSettings.outputImageFormat()) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) p.setRenderHint( QPainter.Antialiasing, self._TestMapSettings.testFlag(QgsMapSettings.Antialiasing) ) p.setRenderHint(QPainter.TextAntialiasing) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def rasterize_svg(self, elem, width=0, height=0, format='PNG'): view_box = elem.get('viewBox', elem.get('viewbox', None)) sizes = None logger = self.oeb.logger if view_box is not None: try: box = [float(x) for x in filter(None, re.split('[, ]', view_box))] sizes = [box[2]-box[0], box[3] - box[1]] except (TypeError, ValueError, IndexError): logger.warn('SVG image has invalid viewBox="%s", ignoring the viewBox' % view_box) else: for image in elem.xpath('descendant::*[local-name()="image" and ' '@height and contains(@height, "%")]'): logger.info('Found SVG image height in %, trying to convert...') try: h = float(image.get('height').replace('%', ''))/100. image.set('height', str(h*sizes[1])) except: logger.exception('Failed to convert percentage height:', image.get('height')) data = QByteArray(xml2str(elem, with_tail=False)) svg = QSvgRenderer(data) size = svg.defaultSize() if size.width() == 100 and size.height() == 100 and sizes: size.setWidth(sizes[0]) size.setHeight(sizes[1]) if width or height: size.scale(width, height, Qt.KeepAspectRatio) logger.info('Rasterizing %r to %dx%d' % (elem, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, format) return str(array)
def rasterize_external(self, elem, style, item, svgitem): width = style['width'] height = style['height'] width = (width / 72) * self.profile.dpi height = (height / 72) * self.profile.dpi data = QByteArray(str(svgitem)) svg = QSvgRenderer(data) size = svg.defaultSize() size.scale(width, height, Qt.KeepAspectRatio) key = (svgitem.href, size.width(), size.height()) if key in self.images: href = self.images[key] else: logger = self.oeb.logger logger.info('Rasterizing %r to %dx%d' % (svgitem.href, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, 'PNG') data = str(array) manifest = self.oeb.manifest href = os.path.splitext(svgitem.href)[0] + '.png' id, href = manifest.generate(svgitem.id, href) manifest.add(id, href, PNG_MIME, data=data) self.images[key] = href elem.tag = XHTML('img') for attr in elem.attrib: if attr not in KEEP_ATTRS: del elem.attrib[attr] elem.attrib['src'] = item.relhref(href) if elem.text: elem.attrib['alt'] = elem.text elem.text = None for child in elem: elem.remove(child)
class BoardView(QWidget): message = pyqtSignal(QString) computerMove = pyqtSignal() PANEL = ":/images/panel.svg" HIT = ":/images/hit.svg" MISS = ":/images/miss.svg" SHIPS = [':/images/carrier.svg', ':/images/battleship.svg', ':/images/destroyer.svg', ':/images/submarine.svg', ':/images/patrol boat.svg'] def __init__(self, player, visible, parent = None): super(BoardView, self).__init__(parent) self.player = player self.visible = visible self.panel = QSvgRenderer(self.PANEL, self) self.hit = QSvgRenderer(self.HIT, self) self.miss = QSvgRenderer(self.MISS, self) self.ship = [QSvgRenderer(filename, self) for filename in self.SHIPS] self.moving, self.x0, self.y0, self.dx, self.dy = None, 0, 0, 0, 0 def setBoard(self, value): self.player = value self.update() def paintEvent(self, e): w, h = self.width() / Player.N, self.height() / Player.N painter = QPainter(self) for j in range(0, Player.N): for i in range(0, Player.N): self.panel.render(painter, QRectF(i * w, j * h, w, h)) if self.visible: for i in range(0, self.ship.__len__()): ship = self.ship[i] x, y, vertical = self.player.getShip(i) if not i == self.moving: dx, dy = 0, 0 else: dx, dy = self.dx, self.dy if not vertical: ship.render(painter, QRectF(x * w + dx, y * h + dy, w * Player.LENGTH[i], h)) else: painter.setTransform(QTransform(0, 1, 1, 0, 0, 0)) ship.render(painter, QRectF(y * h + dy, x * w + dx, h * Player.LENGTH[i], w)) painter.resetTransform()
def qt_svg_to_png_renderer(impact_report, component): """Render SVG into PNG. :param impact_report: ImpactReport contains data about the report that is going to be generated. :type impact_report: safe.report.impact_report.ImpactReport :param component: Contains the component metadata and context for rendering the output. :type component: safe.report.report_metadata.QgisComposerComponentsMetadata :return: Whatever type of output the component should be. .. versionadded:: 4.0 """ context = component.context filepath = context['filepath'] width = component.extra_args['width'] height = component.extra_args['height'] image_format = QImage.Format_ARGB32 qimage = QImage(width, height, image_format) qimage.fill(0x00000000) renderer = QSvgRenderer(filepath) painter = QPainter(qimage) renderer.render(painter) # Should call painter.end() so that QImage is not used painter.end() # in case output folder not specified if impact_report.output_folder is None: impact_report.output_folder = mkdtemp(dir=temp_dir()) output_path = impact_report.component_absolute_output_path( component.key) qimage.save(output_path) component.output = output_path return component.output
def qt_svg_to_png_renderer(impact_report, component): """Render SVG into PNG. :param impact_report: ImpactReport contains data about the report that is going to be generated :type impact_report: safe.report.impact_report.ImpactReport :param component: Contains the component metadata and context for rendering the output :type component: safe.report.report_metadata.QgisComposerComponentsMetadata :return: whatever type of output the component should be .. versionadded:: 4.0 """ context = component.context filepath = context['filepath'] width = component.extra_args['width'] height = component.extra_args['height'] image_format = QImage.Format_ARGB32 qimage = QImage(width, height, image_format) qimage.fill(0x00000000) renderer = QSvgRenderer(filepath) painter = QPainter(qimage) renderer.render(painter) # Should call painter.end() so that QImage is not used painter.end() # in case output folder not specified if impact_report.output_folder is None: impact_report.output_folder = mkdtemp(dir=temp_dir()) output_path = impact_report.component_absolute_output_path( component.key) qimage.save(output_path) component.output = output_path return component.output
def pixmap(self, size): """returns a background pixmap or None for isPlain""" self.__pmap = None if not self.isPlain: width = size.width() height = size.height() if self.tiled: width = self.imageWidth height = self.imageHeight cachekey = QString("%1W%2H%3") \ .arg(self.name).arg(width).arg(height) self.__pmap = QPixmapCache.find(cachekey) if not self.__pmap: renderer = QSvgRenderer(self.__graphicspath) if not renderer.isValid(): logException(BackgroundException( \ m18n('file <filename>%1</filename> contains no valid SVG', self.__graphicspath))) self.__pmap = QPixmap(width, height) self.__pmap.fill(Qt.transparent) painter = QPainter(self.__pmap) renderer.render(painter) QPixmapCache.insert(cachekey, self.__pmap) return self.__pmap
def Printout(self): # Version utilisant QSvg # Fixme: l'alpha n'est pas bien rendu # (le fond des polygones est absent) # Le fond est bien présent après export avec matplotlib pourtant. printer = QPrinter(QPrinter.HighResolution) dialog = QPrintDialog(printer, self) dialog.setOption(QPrintDialog.PrintPageRange, False) dialog.setOption(QPrintDialog.PrintToFile, True) dialog.setOption(QPrintDialog.PrintShowPageSize, True) dialog.setWindowTitle("Imprimer le document") if (dialog.exec_() == QDialog.Accepted): painter = QPainter(printer) try: output = StringIO() self.onglet_actuel.canvas.exporter(output, format='svg') svg = QSvgRenderer(QByteArray(output.getvalue()), self) size = svg.defaultSize() size.scale(painter.viewport().size(), Qt.KeepAspectRatio) rect = QRectF(0, 0, size.width(), size.height()) svg.render(painter, rect) finally: painter.end()
def renderer(self): """initialise the svg renderer with the selected svg file""" if self.__renderer is None: self.__renderer = QSvgRenderer(self.__graphicspath) if not self.__renderer.isValid(): logException(TileException( \ m18n('file <filename>%1</filename> contains no valid SVG'), self.__graphicspath)) distance = 0 if self.desktopFileName == 'classic': distance = 2 distanceSize = QSizeF(distance, distance) self.faceSize = self.__renderer.boundsOnElement('BAMBOO_1').size()+distanceSize self.tileSize = self.__renderer.boundsOnElement('TILE_2').size()+distanceSize if not Internal.scaleScene: self.faceSize /= 2 self.tileSize /= 2 shW = self.shadowWidth() shH = self.shadowHeight() self.__shadowOffsets = [[(-shW, 0), (0, 0), (0, shH), (-shH, shW)], [(0, 0), (shH, 0), (shW, shH), (0, shW)], [(0, -shH), (shH, -shW), (shW, 0), (0, 0)], [(-shW, -shH), (0, -shW), (0, 0), (-shH, 0)]] return self.__renderer
def requestPixmap(self, id, size, requestedSize): bytes = QByteArray(id) renderer = QSvgRenderer() renderer.load(bytes) size = renderer.defaultSize() image = QPixmap(requestedSize) painter = QPainter(image) renderer.render(painter) return image
def __init__(self, parent): self._descriptionWidgets = [] self._descriptionActiveRects = [ QRect(), QRect(), QRect() ] # descriptions will be visible if mouse cursor is in the rect VispaWidget.__init__(self, parent) self._filenewIcon = QIcon(QPixmap(":/resources/filenew.svg")) self._fileopenIcon = QIcon(QPixmap(":/resources/fileopen.svg")) self.setImage( QSvgRenderer(":/resources/startup_development_cycle.svg")) self.setDragable(False) self.setMouseTracking( True) # receive mouse events even if no button is pressed self._hideDescriptions = False self.createPrototypingWidget() self.createExecutionWidget() self.createVerifyingWidget()
def save_png(filename, sc, background=(255, 255, 255, 0)): """Create a png image from a scene :Parameters: - `filename` (str) - name to write the image - `sc` (SVGScene) - `background` (int, int, int, int) - background color as (R, G, B, alpha) 0-255 tuple """ qapp = QApplication.instance() if qapp is None: qapp = QApplication([]) r = QSvgRenderer(None) data = QByteArray(str(to_xml(sc))) r.load(data) pix = QPixmap(r.defaultSize()) pix.fill(QColor(*background)) painter = QPainter(pix) r.render(painter) painter.end() pix.save(filename)
def save_png (filename, sc, background = (255,255,255, 0) ) : """Create a png image from a scene :Parameters: - `filename` (str) - name to write the image - `sc` (SVGScene) - `background` (int, int, int, int) - background color as (R, G, B, alpha) 0-255 tuple """ qapp = QApplication.instance() if qapp is None : qapp = QApplication([]) r = QSvgRenderer(None) data = QByteArray(str(to_xml(sc) ) ) r.load(data) pix = QPixmap(r.defaultSize() ) pix.fill(QColor(*background) ) painter = QPainter(pix) r.render(painter) painter.end() pix.save(filename)
class ChessBoard(QWidget): def __init__(self, main_view): super().__init__() self.board_svg = QSvgRenderer("assets/boards/blue.svg") self.main_view = main_view self.board = chess.Board() self.piece_images = {} self.ranks = "87654321" self.files = "abcdefgh" self.move = WHITE self.board_size = 0 self.tile_size = 0 self.selected = None self.engine_handler = EngineHandler(self) self.best_move = None self.show_best_move = True self.move_history = [] self.arrows = [] self.dragging = False self.dragX = 0 self.dragY = 0 for c in "QRPBNK": self.piece_images[WHITE + c] = QSvgRenderer("assets/pieces/w" + c + ".svg") self.piece_images[BLACK + c] = QSvgRenderer("assets/pieces/b" + c + ".svg") def paintEvent(self, event): self.board_size = min(self.width(), self.height()) self.tile_size = self.board_size / 8 painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) self.board_svg.render(painter, QRectF(0, 0, self.board_size, self.board_size)) if self.selected != None: painter.setBrush(QBrush(QColor(0, 120, 255, 100), Qt.SolidPattern)) painter.setPen(QPen(QColor(0, 120, 255, 100), Qt.SolidLine)) sx = self.selected[0] sy = self.selected[1] painter.drawRect(sx * self.tile_size, sy * self.tile_size, self.tile_size, self.tile_size) for f in range(len(self.files)): for r in range(len(self.ranks)): if sx == f and sy == r: continue if self.islegalmove(sx, sy, f, r): x = f * self.tile_size + self.tile_size / 4 y = r * self.tile_size + self.tile_size / 4 painter.drawEllipse(x, y, self.tile_size / 2, self.tile_size / 2) for f in range(len(self.files)): for r in range(len(self.ranks)): sn = self.files[f] + self.ranks[r] s = chess.parse_square(sn) piece = self.board.piece_at(s) if piece != None: ps = piece.symbol() color = WHITE if ps.isupper() else BLACK renderer = self.piece_images[color + ps.upper()] bounds = QRectF(f * self.tile_size, r * self.tile_size, self.tile_size, self.tile_size) renderer.render(painter, bounds) for arrow in self.arrows: fx = arrow[0] * self.tile_size + self.tile_size / 2 fy = arrow[1] * self.tile_size + self.tile_size / 2 tx = arrow[2] * self.tile_size + self.tile_size / 2 ty = arrow[3] * self.tile_size + self.tile_size / 2 painter.setBrush(QBrush(QColor(34, 139, 34, 130), Qt.SolidPattern)) painter.setPen(Qt.NoPen) painter.drawPolygon(draw_arrow(fx, fy, tx, ty, 40, 10)) if self.best_move != None and self.show_best_move: bm = self.best_move fx, fy = self.coordsofsquare(bm.from_square) tx, ty = self.coordsofsquare(bm.to_square) fx = fx * self.tile_size + self.tile_size / 2 fy = fy * self.tile_size + self.tile_size / 2 tx = tx * self.tile_size + self.tile_size / 2 ty = ty * self.tile_size + self.tile_size / 2 painter.setBrush(QBrush(QColor(0, 92, 153, 130), Qt.SolidPattern)) painter.setPen(Qt.NoPen) painter.drawPolygon(draw_arrow(fx, fy, tx, ty, 70, 15)) painter.end() self.update() def mouse_press(self, event): if event.button() == Qt.RightButton: x = event.x() y = event.y() if x <= self.board_size and y <= self.board_size: tx = floor(x / self.tile_size) ty = floor(y / self.tile_size) self.dragging = True self.dragX = tx self.dragY = ty else: self.dragging = False self.arrows.clear() def mouse_release(self, event): if event.button() == Qt.RightButton and self.dragging: x = event.x() y = event.y() if x <= self.board_size and y <= self.board_size: tx = floor(x / self.tile_size) ty = floor(y / self.tile_size) if self.dragX != tx or self.dragY != ty: already_arr = False for arr in self.arrows: # if arrow already exists, remove it if arr[0] == self.dragX and arr[ 1] == self.dragY and arr[2] == tx and arr[ 3] == ty: already_arr = True self.arrows.remove(arr) if not already_arr: self.arrows.append((self.dragX, self.dragY, tx, ty)) else: self.dragging = False if event.button() != Qt.LeftButton: return x = event.x() y = event.y() if x <= self.board_size and y <= self.board_size: tx = floor(x / self.tile_size) ty = floor(y / self.tile_size) pc = self.getpiece(tx, ty) if self.selected == None: if pc != None and pc.color == self.board.turn: self.selected = (tx, ty) else: if pc != None: if pc.color == self.board.turn: self.selected = (tx, ty) else: self.makemoveiflegal(tx, ty) else: self.makemoveiflegal(tx, ty) else: self.selected = None def islegalmove(self, fx, fy, tx, ty): lm = self.board.legal_moves f = self.coordstopos(fx, fy) t = self.coordstopos(tx, ty) move = chess.Move.from_uci(f + t) return move in lm def makemove(self, move): self.board.push(move) self.selected = None self.engine_handler.analyze(self.board) self.main_view.fen_field.setText(self.fen()) self.arrows.clear() def makemoveiflegal(self, x, y): lm = self.board.legal_moves sx = self.selected[0] sy = self.selected[1] f = self.coordstopos(sx, sy) t = self.coordstopos(x, y) move = chess.Move.from_uci(f + t) if move in lm: self.makemove(move) else: # try with promotion move = chess.Move.from_uci(f + t + "q") if move in lm: self.makemove(move) def haspiece(self, x, y): return self.getpiece(x, y) != None def getpiece(self, x, y): s = chess.parse_square(self.files[x] + self.ranks[y]) piece = self.board.piece_at(s) return piece def coordsofsquare(self, sq): return (chess.square_file(sq), 7 - chess.square_rank(sq)) def coordstopos(self, x, y): return self.files[x] + self.ranks[y] def _domove(self): mv = self.move_history.pop() if mv != None: self.board.push(mv) self.main_view.fen_field.setText(self.board.fen()) self.engine_handler.analyze(self.board) self.arrows.clear() def _undomove(self): try: self.move_history.append(self.board.pop()) except: pass self.engine_handler.analyze(self.board) self.main_view.fen_field.setText(self.board.fen()) self.arrows.clear() def startpos(self): self.loadfen(chess.STARTING_FEN) def loadfen(self, fen): self.move_history = [] self.board.set_fen(fen) self.engine_handler.analyze(self.board) self.main_view.fen_field.setText(self.board.fen()) def fen(self): return self.board.fen() def show_best_move_changed(self, state): self.show_best_move = state == Qt.Checked def change_engine(self, engine): self.engine_handler.change_engine(engine) self.engine_handler.stop_current() self.engine_handler.analyze(self.board) def set_best_move(self, best_move): self.best_move = best_move def next_move(self): if len(self.move_history) > 0: self._domove() else: if self.best_move != None: self.makemove(self.best_move) def back_move(self): self._undomove() def set_thoughts(self, pv): if len(pv) > 0: thoughts = "Engine thoughts: " + pv[0].uci() if len(pv) > 1: for m in range(1, len(pv)): move = pv[m].uci() thoughts += "->" + move self.main_view.engine_thoughts.setText(thoughts) def set_score(self, score): self.main_view.game_score.setText("Score: " + score)
class QLed(QWidget): Circle = 1 Round = 2 Square = 3 Triangle = 4 Red = 1 Green = 2 Yellow = 3 Grey = 4 Orange = 5 Purple = 6 Blue = 7 shapes={ Circle:""" <svg height="50.000000px" id="svg9493" width="50.000000px" xmlns="http://www.w3.org/2000/svg"> <defs id="defs9495"> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient6650" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient6494"> <stop id="stop6496" offset="0.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> <stop id="stop6498" offset="1.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient6648" x1="23.213980" x2="23.201290" xlink:href="#linearGradient6494" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient6646" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient6644" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient id="linearGradient6506"> <stop id="stop6508" offset="0.0000000" style="stop-color:#ffffff;stop-opacity:0.0000000;"/> <stop id="stop6510" offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.87450981;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7498" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient7464"> <stop id="stop7466" offset="0.0000000" style="stop-color:#00039a;stop-opacity:1.0000000;"/> <stop id="stop7468" offset="1.0000000" style="stop-color:#afa5ff;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7496" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient id="linearGradient5756"> <stop id="stop5758" offset="0.0000000" style="stop-color:#828282;stop-opacity:1.0000000;"/> <stop id="stop5760" offset="1.0000000" style="stop-color:#929292;stop-opacity:0.35294119;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9321" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient id="linearGradient5742"> <stop id="stop5744" offset="0.0000000" style="stop-color:#adadad;stop-opacity:1.0000000;"/> <stop id="stop5746" offset="1.0000000" style="stop-color:#f0f0f0;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7492" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9527" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9529" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9531" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9533" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> </defs> <g id="layer1"> <g id="g9447" style="overflow:visible" transform="matrix(31.25000,0.000000,0.000000,31.25000,-625.0232,-1325.000)"> <path d="M 24.000001,43.200001 C 24.000001,43.641601 23.641601,44.000001 23.200001,44.000001 C 22.758401,44.000001 22.400001,43.641601 22.400001,43.200001 C 22.400001,42.758401 22.758401,42.400001 23.200001,42.400001 C 23.641601,42.400001 24.000001,42.758401 24.000001,43.200001 z " id="path6596" style="fill:url(#linearGradient6644);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible" transform="translate(-2.399258,-1.000000e-6)"/> <path d="M 23.906358,43.296204 C 23.906358,43.625433 23.639158,43.892633 23.309929,43.892633 C 22.980700,43.892633 22.713500,43.625433 22.713500,43.296204 C 22.713500,42.966975 22.980700,42.699774 23.309929,42.699774 C 23.639158,42.699774 23.906358,42.966975 23.906358,43.296204 z " id="path6598" style="fill:url(#linearGradient6646);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible" transform="matrix(1.082474,0.000000,0.000000,1.082474,-4.431649,-3.667015)"/> <path d="M 23.906358,43.296204 C 23.906358,43.625433 23.639158,43.892633 23.309929,43.892633 C 22.980700,43.892633 22.713500,43.625433 22.713500,43.296204 C 22.713500,42.966975 22.980700,42.699774 23.309929,42.699774 C 23.639158,42.699774 23.906358,42.966975 23.906358,43.296204 z " id="path6600" style="fill:url(#linearGradient6648);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible" transform="matrix(0.969072,0.000000,0.000000,0.969072,-1.788256,1.242861)"/> <path d="M 23.906358,43.296204 C 23.906358,43.625433 23.639158,43.892633 23.309929,43.892633 C 22.980700,43.892633 22.713500,43.625433 22.713500,43.296204 C 22.713500,42.966975 22.980700,42.699774 23.309929,42.699774 C 23.639158,42.699774 23.906358,42.966975 23.906358,43.296204 z " id="path6602" style="fill:url(#linearGradient6650);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible" transform="matrix(0.773196,0.000000,0.000000,0.597938,2.776856,17.11876)"/> </g> </g> </svg> """, Round:""" <svg height="50.000000px" id="svg9493" width="100.00000px" xmlns="http://www.w3.org/2000/svg"> <defs id="defs9495"> <linearGradient gradientTransform="matrix(0.928127,0.000000,0.000000,0.639013,13.55634,12.87587)" gradientUnits="userSpaceOnUse" id="linearGradient13424" x1="21.593750" x2="21.593750" xlink:href="#linearGradient6506" y1="47.917328" y2="46.774261"/> <linearGradient id="linearGradient6494"> <stop id="stop6496" offset="0.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> <stop id="stop6498" offset="1.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientTransform="translate(12.00000,-4.000002)" gradientUnits="userSpaceOnUse" id="linearGradient13427" x1="21.591305" x2="21.593750" xlink:href="#linearGradient6494" y1="46.617390" y2="47.781250"/> <linearGradient gradientTransform="translate(12.00000,-4.000002)" gradientUnits="userSpaceOnUse" id="linearGradient13430" x1="21.408695" x2="21.834784" xlink:href="#linearGradient5756" y1="46.556522" y2="47.843750"/> <linearGradient gradientTransform="translate(12.00000,-4.000002)" gradientUnits="userSpaceOnUse" id="linearGradient13433" x1="21.594427" x2="21.600000" xlink:href="#linearGradient5742" y1="46.376728" y2="48.000000"/> <linearGradient gradientTransform="matrix(0.928127,0.000000,0.000000,0.639013,21.55634,15.27587)" gradientUnits="userSpaceOnUse" id="linearGradient13472" x1="21.593750" x2="21.593750" xlink:href="#linearGradient6506" y1="47.917328" y2="46.774261"/> <linearGradient gradientTransform="translate(20.00000,-1.600002)" gradientUnits="userSpaceOnUse" id="linearGradient13475" x1="21.591305" x2="21.593750" xlink:href="#linearGradient9163" y1="46.617390" y2="47.781250"/> <linearGradient gradientTransform="translate(20.00000,-1.600002)" gradientUnits="userSpaceOnUse" id="linearGradient13478" x1="21.408695" x2="21.834784" xlink:href="#linearGradient5756" y1="46.556522" y2="47.843750"/> <linearGradient gradientTransform="translate(20.00000,-1.600002)" gradientUnits="userSpaceOnUse" id="linearGradient13481" x1="21.594427" x2="21.600000" xlink:href="#linearGradient5742" y1="46.376728" y2="48.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9199" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient9163"> <stop id="stop9165" offset="0.0000000" style="stop-color:#000000;stop-opacity:1.0000000;"/> <stop id="stop9167" offset="1.0000000" style="stop-color:#8c8c8c;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9197" x1="23.213980" x2="23.201290" xlink:href="#linearGradient9163" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9195" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9193" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient id="linearGradient6506"> <stop id="stop6508" offset="0.0000000" style="stop-color:#ffffff;stop-opacity:0.0000000;"/> <stop id="stop6510" offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.87450981;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7498" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient7464"> <stop id="stop7466" offset="0.0000000" style="stop-color:#00039a;stop-opacity:1.0000000;"/> <stop id="stop7468" offset="1.0000000" style="stop-color:#afa5ff;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7496" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient id="linearGradient5756"> <stop id="stop5758" offset="0.0000000" style="stop-color:#828282;stop-opacity:1.0000000;"/> <stop id="stop5760" offset="1.0000000" style="stop-color:#929292;stop-opacity:0.35294119;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9321" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient id="linearGradient5742"> <stop id="stop5744" offset="0.0000000" style="stop-color:#adadad;stop-opacity:1.0000000;"/> <stop id="stop5746" offset="1.0000000" style="stop-color:#f0f0f0;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7492" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9527" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9529" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9531" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9533" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient gradientTransform="matrix(24.16238,0.000000,0.000000,18.68556,-538.2464,-790.0391)" gradientUnits="userSpaceOnUse" id="linearGradient1336" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient gradientTransform="matrix(30.28350,0.000000,0.000000,30.28350,-680.9062,-1286.161)" gradientUnits="userSpaceOnUse" id="linearGradient1339" x1="23.213980" x2="23.201290" xlink:href="#linearGradient9163" y1="42.754631" y2="43.892632"/> <linearGradient gradientTransform="matrix(33.82731,0.000000,0.000000,33.82731,-763.5122,-1439.594)" gradientUnits="userSpaceOnUse" id="linearGradient1342" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientTransform="matrix(31.25000,0.000000,0.000000,31.25000,-700.0000,-1325.000)" gradientUnits="userSpaceOnUse" id="linearGradient1345" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> </defs> <g id="layer1"> <g id="g13543" style="overflow:visible" transform="matrix(31.25000,0.000000,0.000000,31.25000,-999.9999,-1325.000)"> <path d="M 32.799998,42.400000 L 34.399998,42.400000 C 34.843198,42.400000 35.199998,42.756800 35.199998,43.200000 C 35.199998,43.643200 34.843198,44.000000 34.399998,44.000000 L 32.799998,44.000000 C 32.356798,44.000000 31.999998,43.643200 31.999998,43.200000 C 31.999998,42.756800 32.356798,42.400000 32.799998,42.400000 z " id="path13335" style="fill:url(#linearGradient13433);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/> <path d="M 32.812498,42.562498 C 32.447387,42.562498 32.156248,42.829606 32.156248,43.187498 C 32.156248,43.545390 32.454607,43.843750 32.812498,43.843748 L 34.406248,43.843748 C 34.764141,43.843748 35.031248,43.552611 35.031248,43.187498 C 35.031248,42.822387 34.771358,42.562498 34.406248,42.562498 L 32.812498,42.562498 z " id="path13337" style="fill:url(#linearGradient13430);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> <path d="M 32.812498,42.624998 C 32.485887,42.624998 32.218748,42.871665 32.218748,43.187498 C 32.218748,43.503332 32.496667,43.781249 32.812498,43.781248 L 34.406248,43.781248 C 34.722082,43.781248 34.968748,43.514111 34.968748,43.187498 C 34.968748,42.860887 34.732858,42.624998 34.406248,42.624998 L 32.812498,42.624998 z " id="path13339" style="fill:url(#linearGradient13427);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> <path d="M 32.872983,42.669849 C 32.569847,42.669849 32.321908,42.827473 32.321908,43.029294 C 32.321908,43.231116 32.579852,43.408709 32.872983,43.408708 L 34.352185,43.408708 C 34.645320,43.408708 34.874257,43.238004 34.874257,43.029294 C 34.874257,42.820585 34.655321,42.669849 34.352185,42.669849 L 32.872983,42.669849 z " id="path13341" style="fill:url(#linearGradient13424);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> </g> </g> </svg> """, Square:""" <svg height="50.000000px" id="svg9493" width="50.000000px" xmlns="http://www.w3.org/2000/svg"> <defs id="defs9495"> <linearGradient gradientTransform="matrix(0.388435,0.000000,0.000000,0.618097,2.806900,2.626330)" gradientUnits="userSpaceOnUse" id="linearGradient31681" x1="21.593750" x2="21.593750" xlink:href="#linearGradient6506" y1="47.917328" y2="46.774261"/> <linearGradient id="linearGradient6494"> <stop id="stop6496" offset="0.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> <stop id="stop6498" offset="1.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient31704" x1="18.390625" x2="18.390625" xlink:href="#linearGradient6494" y1="43.400002" y2="44.593750"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient31624" x1="17.728125" x2="19.031250" xlink:href="#linearGradient5756" y1="43.337502" y2="44.656250"/> <linearGradient gradientTransform="matrix(0.500000,0.000000,0.000000,1.000000,-3.600000,-8.800000)" gradientUnits="userSpaceOnUse" id="linearGradient31686" x1="29.600000" x2="29.600000" xlink:href="#linearGradient5742" y1="39.991302" y2="41.599998"/> <linearGradient gradientTransform="matrix(0.388435,0.000000,0.000000,0.618097,7.606900,5.026330)" gradientUnits="userSpaceOnUse" id="linearGradient31649" x1="21.593750" x2="21.593750" xlink:href="#linearGradient6506" y1="47.917328" y2="46.774261"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient31710" x1="18.390625" x2="18.390625" xlink:href="#linearGradient9163" y1="43.400002" y2="44.593750"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient31570" x1="17.728125" x2="19.031250" xlink:href="#linearGradient5756" y1="43.337502" y2="44.656250"/> <linearGradient gradientTransform="matrix(0.500000,0.000000,0.000000,1.000000,1.200000,-6.400000)" gradientUnits="userSpaceOnUse" id="linearGradient31654" x1="29.600000" x2="29.600000" xlink:href="#linearGradient5742" y1="39.991302" y2="41.599998"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9199" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient9163"> <stop id="stop9165" offset="0.0000000" style="stop-color:#000000;stop-opacity:1.0000000;"/> <stop id="stop9167" offset="1.0000000" style="stop-color:#8c8c8c;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9197" x1="23.213980" x2="23.201290" xlink:href="#linearGradient9163" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9195" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9193" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient id="linearGradient6506"> <stop id="stop6508" offset="0.0000000" style="stop-color:#ffffff;stop-opacity:0.0000000;"/> <stop id="stop6510" offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.87450981;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7498" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient7464"> <stop id="stop7466" offset="0.0000000" style="stop-color:#00039a;stop-opacity:1.0000000;"/> <stop id="stop7468" offset="1.0000000" style="stop-color:#afa5ff;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7496" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient id="linearGradient5756"> <stop id="stop5758" offset="0.0000000" style="stop-color:#828282;stop-opacity:1.0000000;"/> <stop id="stop5760" offset="1.0000000" style="stop-color:#929292;stop-opacity:0.35294119;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9321" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient id="linearGradient5742"> <stop id="stop5744" offset="0.0000000" style="stop-color:#adadad;stop-opacity:1.0000000;"/> <stop id="stop5746" offset="1.0000000" style="stop-color:#f0f0f0;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7492" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9527" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9529" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9531" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9533" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient gradientTransform="matrix(24.16238,0.000000,0.000000,18.68556,-538.2464,-790.0391)" gradientUnits="userSpaceOnUse" id="linearGradient1336" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient gradientTransform="matrix(30.28350,0.000000,0.000000,30.28350,-680.9062,-1286.161)" gradientUnits="userSpaceOnUse" id="linearGradient1339" x1="23.213980" x2="23.201290" xlink:href="#linearGradient9163" y1="42.754631" y2="43.892632"/> <linearGradient gradientTransform="matrix(33.82731,0.000000,0.000000,33.82731,-763.5122,-1439.594)" gradientUnits="userSpaceOnUse" id="linearGradient1342" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientTransform="matrix(31.25000,0.000000,0.000000,31.25000,-700.0000,-1325.000)" gradientUnits="userSpaceOnUse" id="linearGradient1345" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> </defs> <g id="layer1"> <g id="g31718" style="overflow:visible" transform="matrix(31.25000,0.000000,0.000000,31.25000,-325.0000,-975.0000)"> <path d="M 10.400000,31.200000 L 12.000000,31.200000 L 12.000000,32.800000 L 10.400000,32.800000 L 10.400000,31.200000 z " id="path31614" style="fill:url(#linearGradient31686);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/> <path d="M 17.750000,43.343750 L 17.750000,44.656250 L 19.031250,44.656250 L 19.031250,43.343750 L 17.750000,43.343750 z " id="path31616" style="fill:url(#linearGradient31624);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible" transform="translate(-7.190625,-12.00000)"/> <path d="M 17.812500,43.406250 L 17.812500,44.593750 L 18.968750,44.593750 L 18.968750,43.406250 L 17.812500,43.406250 z " id="path31618" style="fill:url(#linearGradient31704);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible" transform="translate(-7.190625,-12.00000)"/> <path d="M 10.891195,31.445120 C 10.630356,31.445967 10.660563,31.393294 10.660563,31.792800 C 10.660563,31.988016 10.768517,32.159796 10.891195,32.159795 L 11.510263,32.159795 C 11.632945,32.159795 11.728757,31.994678 11.728757,31.792800 C 11.728757,31.389990 11.754584,31.441761 11.510263,31.445120 L 10.891195,31.445120 z " id="path31620" sodipodi:nodetypes="csccscc" style="fill:url(#linearGradient31681);fill-opacity:1.0000000;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> </g> </g> </svg> """, Triangle:""" <svg height="50.000000px" id="svg9493" width="50.000000px" xmlns="http://www.w3.org/2000/svg" > <defs id="defs9495"> <linearGradient gradientTransform="matrix(0.389994,0.000000,0.000000,0.403942,4.557010,29.83582)" gradientUnits="userSpaceOnUse" id="linearGradient28861" x1="23.187498" x2="23.187498" xlink:href="#linearGradient6506" y1="28.449617" y2="26.670279"/> <linearGradient id="linearGradient6494"> <stop id="stop6496" offset="0.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> <stop id="stop6498" offset="1.0000000" style="stop-color:%s;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientTransform="translate(-9.587500,13.60000)" gradientUnits="userSpaceOnUse" id="linearGradient28864" x1="23.181250" x2="23.187500" xlink:href="#linearGradient6494" y1="26.793751" y2="27.843750"/> <linearGradient gradientTransform="translate(-9.587500,13.60000)" gradientUnits="userSpaceOnUse" id="linearGradient28867" x1="22.762501" x2="23.812500" xlink:href="#linearGradient5756" y1="26.687500" y2="27.906250"/> <linearGradient gradientTransform="translate(-9.600000,13.60000)" gradientUnits="userSpaceOnUse" id="linearGradient28870" x1="23.187500" x2="23.200001" xlink:href="#linearGradient5742" y1="26.400000" y2="28.000000"/> <linearGradient gradientTransform="matrix(0.389994,0.000000,0.000000,0.403942,9.357010,32.23582)" gradientUnits="userSpaceOnUse" id="linearGradient28801" x1="23.187498" x2="23.187498" xlink:href="#linearGradient6506" y1="28.449617" y2="26.670279"/> <linearGradient gradientTransform="translate(-4.787500,16.00000)" gradientUnits="userSpaceOnUse" id="linearGradient28804" x1="23.181250" x2="23.187500" xlink:href="#linearGradient9163" y1="26.793751" y2="27.843750"/> <linearGradient gradientTransform="translate(-4.787500,16.00000)" gradientUnits="userSpaceOnUse" id="linearGradient28807" x1="22.762501" x2="23.812500" xlink:href="#linearGradient5756" y1="26.687500" y2="27.906250"/> <linearGradient gradientTransform="translate(-4.800000,16.00000)" gradientUnits="userSpaceOnUse" id="linearGradient28810" x1="23.187500" x2="23.200001" xlink:href="#linearGradient5742" y1="26.400000" y2="28.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9199" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient9163"> <stop id="stop9165" offset="0.0000000" style="stop-color:#000000;stop-opacity:1.0000000;"/> <stop id="stop9167" offset="1.0000000" style="stop-color:#8c8c8c;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9197" x1="23.213980" x2="23.201290" xlink:href="#linearGradient9163" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9195" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9193" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient id="linearGradient6506"> <stop id="stop6508" offset="0.0000000" style="stop-color:#ffffff;stop-opacity:0.0000000;"/> <stop id="stop6510" offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.87450981;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7498" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient id="linearGradient7464"> <stop id="stop7466" offset="0.0000000" style="stop-color:#00039a;stop-opacity:1.0000000;"/> <stop id="stop7468" offset="1.0000000" style="stop-color:#afa5ff;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7496" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient id="linearGradient5756"> <stop id="stop5758" offset="0.0000000" style="stop-color:#828282;stop-opacity:1.0000000;"/> <stop id="stop5760" offset="1.0000000" style="stop-color:#929292;stop-opacity:0.35294119;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9321" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient id="linearGradient5742"> <stop id="stop5744" offset="0.0000000" style="stop-color:#adadad;stop-opacity:1.0000000;"/> <stop id="stop5746" offset="1.0000000" style="stop-color:#f0f0f0;stop-opacity:1.0000000;"/> </linearGradient> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient7492" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9527" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9529" x1="22.935030" x2="23.662106" xlink:href="#linearGradient5756" y1="42.699776" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9531" x1="23.213980" x2="23.201290" xlink:href="#linearGradient7464" y1="42.754631" y2="43.892632"/> <linearGradient gradientUnits="userSpaceOnUse" id="linearGradient9533" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient gradientTransform="matrix(24.16238,0.000000,0.000000,18.68556,-538.2464,-790.0391)" gradientUnits="userSpaceOnUse" id="linearGradient1336" x1="23.402565" x2="23.389874" xlink:href="#linearGradient6506" y1="44.066776" y2="42.883698"/> <linearGradient gradientTransform="matrix(30.28350,0.000000,0.000000,30.28350,-680.9062,-1286.161)" gradientUnits="userSpaceOnUse" id="linearGradient1339" x1="23.213980" x2="23.201290" xlink:href="#linearGradient9163" y1="42.754631" y2="43.892632"/> <linearGradient gradientTransform="matrix(33.82731,0.000000,0.000000,33.82731,-763.5122,-1439.594)" gradientUnits="userSpaceOnUse" id="linearGradient1342" x1="23.349695" x2="23.440580" xlink:href="#linearGradient5756" y1="42.767944" y2="43.710873"/> <linearGradient gradientTransform="matrix(31.25000,0.000000,0.000000,31.25000,-700.0000,-1325.000)" gradientUnits="userSpaceOnUse" id="linearGradient1345" x1="23.193102" x2="23.200001" xlink:href="#linearGradient5742" y1="42.429230" y2="44.000000"/> </defs> <g id="layer1"> <g id="g28884" style="overflow:visible" transform="matrix(31.25000,0.000000,0.000000,31.25000,-400.0000,-1250.000)"> <path d="M 14.400000,41.600000 L 12.800000,41.600000 L 13.600000,40.000000 L 14.400000,41.600000 z " id="path28664" sodipodi:nodetypes="cccc" style="fill:url(#linearGradient28870);fill-opacity:1.0000000;stroke:none;stroke-width:0.064000003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/> <path d="M 13.600000,40.256250 L 12.975000,41.506250 L 14.225000,41.506250 L 13.600000,40.256250 z " id="path28666" style="fill:url(#linearGradient28867);fill-opacity:1.0000000;stroke:none;stroke-width:0.064000003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> <path d="M 13.600000,40.381250 L 13.068750,41.443750 L 14.131250,41.443750 L 13.600000,40.381250 z " id="path28668" style="fill:url(#linearGradient28864);fill-opacity:1.0000000;stroke:none;stroke-width:0.064000003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> <path d="M 13.575621,40.552906 C 13.555816,40.559679 13.538695,40.572979 13.526872,40.590776 C 13.522451,40.594595 13.518372,40.598819 13.514685,40.603399 L 13.307500,41.032587 C 13.299161,41.047990 13.294953,41.065424 13.295313,41.083080 C 13.296850,41.096430 13.300996,41.109315 13.307500,41.120950 C 13.310377,41.129925 13.314481,41.138427 13.319688,41.146196 C 13.323375,41.150775 13.327454,41.155000 13.331875,41.158819 C 13.339376,41.164212 13.347584,41.168462 13.356250,41.171442 C 13.367483,41.178179 13.379923,41.182474 13.392812,41.184066 L 13.807180,41.184066 C 13.835802,41.183428 13.862639,41.169530 13.880304,41.146196 C 13.884725,41.142377 13.888804,41.138152 13.892491,41.133573 C 13.898995,41.121938 13.903142,41.109053 13.904679,41.095703 C 13.905039,41.078047 13.900831,41.060614 13.892491,41.045211 C 13.892751,41.041007 13.892751,41.036791 13.892491,41.032587 L 13.685307,40.603399 C 13.681620,40.598819 13.677541,40.594595 13.673120,40.590776 C 13.650701,40.559305 13.612491,40.544463 13.575621,40.552906 z " id="path28670" style="fill:url(#linearGradient28861);fill-opacity:1.0000000;stroke:none;stroke-width:0.064000003;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;overflow:visible"/> </g> </g> </svg> """ } colours={Red : (0xCF, 0x00, 0x00), Green : (0x0f, 0x69, 0x00), Yellow : (0xd2, 0xcd, 0x00), Grey : (0x5a, 0x5a, 0x5a), Orange : (0xda, 0x46, 0x15), Purple : (0x87, 0x00, 0x83), Blue : (0x00, 0x03, 0x9a)} clicked=pyqtSignal() def __init__(self, parent=None, **kwargs): self.m_value=False self.m_onColour=QLed.Red self.m_offColour=QLed.Grey self.m_shape=QLed.Circle QWidget.__init__(self, parent, **kwargs) self._pressed=False self.renderer=QSvgRenderer() def value(self): return self.m_value def setValue(self, value): self.m_value=value self.update() value=pyqtProperty(bool, value, setValue) def onColour(self): return self.m_onColour def setOnColour(self, newColour): self.m_onColour=newColour self.update() onColour=pyqtProperty(int, onColour, setOnColour) def offColour(self): return self.m_offColour def setOffColour(self, newColour): self.m_offColour=newColour self.update() offColour=pyqtProperty(int, offColour, setOffColour) def shape(self): return self.m_shape def setShape(self, newShape): self.m_shape=newShape self.update() shape=pyqtProperty(int, shape, setShape) def sizeHint(self): if self.m_shape==QLed.Triangle: return QSize(64,48) elif self.m_shape==QLed.Round: return QSize(96, 48) return QSize(48,48) def adjust(self, r, g, b): def normalise(x): return x/255.0 def denormalise(x): return int(x*255.0) (h,l,s)=rgb_to_hls(normalise(r),normalise(g),normalise(b)) (nr,ng,nb)=hls_to_rgb(h,l*1.5,s) return (denormalise(nr),denormalise(ng),denormalise(nb)) def paintEvent(self, event): option=QStyleOption() option.initFrom(self) h=option.rect.height() w=option.rect.width() if self.m_shape in (QLed.Triangle, QLed.Round): aspect=(4/3.0) if self.m_shape==QLed.Triangle else 2.0 ah=w/aspect aw=w if ah>h: ah=h aw=h*aspect x=abs(aw-w)/2.0 y=abs(ah-h)/2.0 bounds=QRectF(x,y,aw,ah) else: size=min(w,h) x=abs(size-w)/2.0 y=abs(size-h)/2.0 bounds=QRectF(x,y,size,size) painter=QPainter(self); painter.setRenderHint(QPainter.Antialiasing, True); (dark_r,dark_g,dark_b)=self.colours[self.m_onColour if self.m_value else self.m_offColour] dark_str="rgb(%d,%d,%d)" % (dark_r,dark_g,dark_b) light_str="rgb(%d,%d,%d)" % self.adjust(dark_r,dark_g,dark_b) self.renderer.load(QByteArray(self.shapes[self.m_shape] % (dark_str,light_str))) self.renderer.render(painter, bounds) def mousePressEvent(self, event): self._pressed=True QWidget.mousePressEvent(self, event) def mouseReleaseEvent(self, event): if self._pressed: self._pressed=False self.clicked.emit() QWidget.mouseReleaseEvent(self, event) def toggleValue(self): self.m_value=not self.m_value; self.update()
class Tileset(object): """represents a complete tileset""" # pylint: disable=R0902 # pylint - we need more than 10 attributes catalogDefined = False @staticmethod def defineCatalog(): """whatever this does""" if not Tileset.catalogDefined: KGlobal.dirs().addResourceType("kmahjonggtileset", "data", QString.fromLatin1("kmahjongglib/tilesets")) KGlobal.locale().insertCatalog("libkmahjongglib") Tileset.catalogDefined = True @staticmethod def tilesAvailable(): """returns all available tile sets""" Tileset.defineCatalog() tilesAvailableQ = KGlobal.dirs().findAllResources( "kmahjonggtileset", "*.desktop", KStandardDirs.Recursive) # now we have a list of full paths. Use the base name minus .desktop # put result into a set, avoiding duplicates tilesets = set(str(x).rsplit('/')[-1].split('.')[0] for x in tilesAvailableQ) if 'default' in tilesets: # we want default to be first in list sortedTilesets = ['default'] sortedTilesets.extend(tilesets-set(['default'])) tilesets = sortedTilesets for dontWant in ['alphabet', 'egypt']: if dontWant in tilesets: tilesets.remove(dontWant) return [Tileset(x) for x in tilesets] def __init__(self, desktopFileName=None): if desktopFileName is None: desktopFileName = 'default' self.tileSize = None self.faceSize = None self.__renderer = None self.__shadowOffsets = None self.defineCatalog() self.path = locateTileset(desktopFileName + '.desktop') if self.path.isEmpty(): self.path = locateTileset('default.desktop') if self.path.isEmpty(): directories = '\n\n' +'\n'.join(str(x) for x in KGlobal.dirs().resourceDirs("kmahjonggtileset")) logException(TileException(m18n( \ 'cannot find any tileset in the following directories, is libkmahjongg installed?') + directories)) else: logWarning(m18n('cannot find tileset %1, using default', desktopFileName)) self.desktopFileName = 'default' else: self.desktopFileName = desktopFileName self.darkenerAlpha = 120 if self.desktopFileName == 'jade' else 50 tileconfig = KConfig(self.path, KConfig.SimpleConfig) group = KConfigGroup(tileconfig.group("KMahjonggTileset")) self.name = group.readEntry("Name", "unknown tileset").toString() # Returns translated data self.author = group.readEntry("Author", "unknown author").toString() self.description = group.readEntry("Description", "no description available").toString() self.authorEmail = group.readEntry("AuthorEmail", "no E-Mail address available").toString() #Version control tileversion, entryOK = group.readEntry("VersionFormat", QVariant(0)).toInt() #Format is increased when we have incompatible changes, meaning that # older clients are not able to use the remaining information safely if not entryOK or tileversion > TILESETVERSIONFORMAT: logException(TileException('tileversion file / program: %d/%d' % \ (tileversion, TILESETVERSIONFORMAT))) graphName = QString(group.readEntry("FileName")) self.__graphicspath = locateTileset(graphName) if self.__graphicspath.isEmpty(): logException(TileException('cannot find kmahjongglib/tilesets/%s for %s' % \ (graphName, self.desktopFileName ))) self.renderer() # now that we get the sizes from the svg, we need the renderer right away self.svgName = { 'wn': 'WIND_1', 'ws': 'WIND_2', 'we': 'WIND_3', 'ww': 'WIND_4', 'db': 'DRAGON_1', 'dg': 'DRAGON_2', 'dr': 'DRAGON_3'} for value in '123456789': self.svgName['s%s' % value] = 'ROD_%s' % value self.svgName['b%s' % value] = 'BAMBOO_%s' % value self.svgName['c%s' % value] = 'CHARACTER_%s' % value for idx, wind in enumerate('eswn'): self.svgName['f%s' % wind] = 'FLOWER_%d' % (idx + 1) self.svgName['y%s' % wind] = 'SEASON_%d' % (idx + 1) def __str__(self): return "tileset id=%d name=%s, name id=%d" % \ (id(self), self.desktopFileName, id(self.desktopFileName)) def shadowWidth(self): """the size of border plus shadow""" return self.tileSize.width() - self.faceSize.width() def shadowHeight(self): """the size of border plus shadow""" return self.tileSize.height() - self.faceSize.height() def renderer(self): """initialise the svg renderer with the selected svg file""" if self.__renderer is None: self.__renderer = QSvgRenderer(self.__graphicspath) if not self.__renderer.isValid(): logException(TileException( \ m18n('file <filename>%1</filename> contains no valid SVG'), self.__graphicspath)) distance = 0 if self.desktopFileName == 'classic': distance = 2 distanceSize = QSizeF(distance, distance) self.faceSize = self.__renderer.boundsOnElement('BAMBOO_1').size()+distanceSize self.tileSize = self.__renderer.boundsOnElement('TILE_2').size()+distanceSize if not Internal.scaleScene: self.faceSize /= 2 self.tileSize /= 2 shW = self.shadowWidth() shH = self.shadowHeight() self.__shadowOffsets = [[(-shW, 0), (0, 0), (0, shH), (-shH, shW)], [(0, 0), (shH, 0), (shW, shH), (0, shW)], [(0, -shH), (shH, -shW), (shW, 0), (0, 0)], [(-shW, -shH), (0, -shW), (0, 0), (-shH, 0)]] return self.__renderer def shadowOffsets(self, lightSource, rotation): """real offset of the shadow on the screen""" if not Preferences.showShadows: return (0, 0) lightSourceIndex = LIGHTSOURCES.index(lightSource) return self.__shadowOffsets[lightSourceIndex][rotation//90] def tileFaceRelation(self): """returns how much bigger the tile is than the face""" return self.tileSize.width() / self.faceSize.width(), self.tileSize.height() / self.faceSize.height()
class QtSvgDialGauge(QWidget): def __init__(self, parent, skin): QWidget.__init__(self, parent) self.m_minimum=0 self.m_maximum=100 self.m_value=0 self.m_startAngle=0 self.m_endAngle=100 self.m_originX=0.5 self.m_originY=0.5 self.m_showOverlay=True self.m_skin=skin self.init() self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) def init(self): self.m_backgroundRenderer = QSvgRenderer("images/"+self.m_skin+"/background.svg", self) self.m_needleShadowRenderer = QSvgRenderer("images/"+self.m_skin+"/needle_shadow.svg", self) self.m_needleRenderer = QSvgRenderer("images/"+self.m_skin+"/needle.svg", self) self.m_overlayRenderer = QSvgRenderer("images/"+self.m_skin+"/overlay.svg", self) self.updateGeometry() self.update() def setValue(self, value): if value < self.m_minimum: value = self.m_minimum elif value > self.m_maximum: value = self.m_maximum self.m_value = value self.update() def setMinimum(self, minimum): self.m_minimum = minimum if self.m_value < self.m_minimum: self.m_value = self.m_minimum; self.update() def setMaximum(self, maximum): self.m_maximum = maximum; if self.m_value > self.m_maximum: self.m_value = self.m_maximum self.update() def setNeedleOrigin(self, x, y): self.m_originX = min(1.0, max(0.0, x)) self.m_originY = min(1.0, max(0.0, y)) def setStartAngle(self, angle): self.m_startAngle = angle def setEndAngle(self, angle): self.m_endAngle = angle def value(self): return self.m_value def minimum(self): return self.m_minimum def maximum(self): return self.m_maximum def needleOriginX(self): return self.m_originX def needleOriginY(self): return self.m_originY def startAngle(self): return self.m_startAngle def endAngle(self): return self.m_endAngle def availableRect(self, renderObject): svgSize = renderObject.defaultSize() svgSize.scale(self.size(), Qt.KeepAspectRatio) return QRectF(0.0, 0.0, svgSize.width(), svgSize.height()) def paintEvent(self, event): painter=QPainter(self) angleSpan = self.m_endAngle - self.m_startAngle valueSpan = self.m_maximum - self.m_minimum rotate = (self.m_value - self.m_minimum) / valueSpan * angleSpan + self.m_startAngle targetRect = self.availableRect(self.m_backgroundRenderer) painter.translate((self.width() - targetRect.width()) / 2.0, (self.height() - targetRect.height()) / 2.0) painter.save() self.m_backgroundRenderer.render(painter, targetRect) targetRect = self.availableRect(self.m_needleRenderer) targetRect.moveTopLeft(QPointF(-targetRect.width() * self.m_originX, -targetRect.height() * self.m_originY)) painter.translate(targetRect.width() * self.m_originX, targetRect.height() * self.m_originY) painter.save() painter.translate(2, 4) painter.rotate(rotate) self.m_needleShadowRenderer.render(painter, targetRect) painter.restore() painter.rotate(rotate) self.m_needleRenderer.render(painter, targetRect) painter.restore(); if self.m_showOverlay: targetRect = self.availableRect(self.m_overlayRenderer) self.m_overlayRenderer.render(painter, targetRect) def minimumSizeHint(self): return QSize(100, 100) def sizeHint(self): return QSize(400, 400) def setShowOverlay(self, show): self.m_showOverlay = show self.update();
from PyQt4.QtCore import Qt from PyQt4.QtCore import QByteArray from PyQt4.QtCore import QBuffer from PyQt4.QtCore import QIODevice, QFile from PyQt4.QtGui import QColor from PyQt4.QtGui import QImage from PyQt4.QtGui import QPainter from PyQt4.QtSvg import QSvgRenderer from PyQt4.QtGui import QApplication import sys, os app = QApplication(sys.argv) svg = QSvgRenderer() current = os.getcwd() os.chdir(os.path.dirname(sys.argv[1])) svg.load(os.path.basename(sys.argv[1])) size = svg.defaultSize() size.scale(600, 800, Qt.KeepAspectRatio) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() os.chdir(current) f = QFile(sys.argv[2]) f.open(QIODevice.WriteOnly) image.save(f, 'PNG')
def __init__(self, canvas): QgsMapCanvasItem.__init__(self, canvas) self.canvas = canvas self.size = 24 self.map_pos = QgsPoint(0.0, 0.0) self.svgrender = QSvgRenderer(":/icons/gps_marker")
def __init__(self, dataDir="", parent=None): QWidget.__init__(self, parent) self.renderer = QSvgRenderer(dataDir + "poker.svg") self.scene = QGraphicsScene() self.chat = QGraphicsSimpleTextItem() self.table = QGraphicsSvgItem(dataDir + "poker.svg") self.table.setSharedRenderer(self.renderer) self.table.setElementId("table") self.table.setMatrix(self.renderer.matrixForElement("transform_table")) self.scene.addItem(self.chat) self.scene.addItem(self.table) self.board = [] for i in range(5): card = AnimatedGraphicsSvgItem(dataDir + "svg-cards.svg", self.table) card.setElementId("back") parent = self.renderer.matrixForElement("transform_table") child = self.renderer.matrixForElement("transform_card%i" % i) cardMatrix = child.translate(-parent.dx(), -parent.dy()) card.setMatrix(cardMatrix) #card.setFlag(QGraphicsSvgItem.ItemIsMovable, True) card.scale(0.5, 0.5) card.hide() self.scene.addItem(card) self.board.append(card) self.seats = [] self.names = [] self.moneys = [] self.bets = [] for i in range(10): seat = SeatItem() def seatClickedEvent(seat=i): seatClickedCallback = self.seatClicked seatClickedCallback(seat) seat.event = seatClickedEvent seat.setSharedRenderer(self.renderer) seat.setElementId("seat") seat.setMatrix( self.renderer.matrixForElement("transform_seat%i" % i)) self.scene.addItem(seat) self.seats.append(seat) name = QGraphicsSimpleTextItem(seat) name.setMatrix(self.renderer.matrixForElement("seat_name")) self.scene.addItem(name) self.names.append(name) money = QGraphicsSimpleTextItem(seat) money.setMatrix(self.renderer.matrixForElement("seat_money")) self.scene.addItem(money) self.moneys.append(money) bet = QGraphicsSimpleTextItem() bet.setMatrix(self.renderer.matrixForElement("transform_bet%i" % i)) self.scene.addItem(bet) self.bets.append(bet) self.pots = [] for i in range(9): pot = QGraphicsSimpleTextItem() pot.setMatrix(self.renderer.matrixForElement("transform_pot%i" % i)) self.scene.addItem(pot) self.pots.append(pot) self.view = QGraphicsView(self) self.view.setScene(self.scene) self.view.resize(800, 600) self.fold = ActionItem() self.fold.setText("fold") self.fold.setPos(0, 550) self.scene.addItem(self.fold) self.fold.event = lambda: self.foldClicked() self.check = ActionItem() self.check.setText("check") self.check.setPos(50, 550) self.scene.addItem(self.check) self.check.event = lambda: self.checkClicked() self.call = ActionItem() self.call.setText("call") self.call.setPos(100, 550) self.scene.addItem(self.call) self.call.event = lambda: self.callClicked() self.bet = ActionItem() self.bet.setText("bet") self.bet.setPos(150, 550) self.scene.addItem(self.bet) self.bet.event = lambda: self.betClicked()
class QPokerWidget(QWidget): def __init__(self, dataDir="", parent=None): QWidget.__init__(self, parent) self.renderer = QSvgRenderer(dataDir + "poker.svg") self.scene = QGraphicsScene() self.chat = QGraphicsSimpleTextItem() self.table = QGraphicsSvgItem(dataDir + "poker.svg") self.table.setSharedRenderer(self.renderer) self.table.setElementId("table") self.table.setMatrix(self.renderer.matrixForElement("transform_table")) self.scene.addItem(self.chat) self.scene.addItem(self.table) self.board = [] for i in range(5): card = AnimatedGraphicsSvgItem(dataDir + "svg-cards.svg", self.table) card.setElementId("back") parent = self.renderer.matrixForElement("transform_table") child = self.renderer.matrixForElement("transform_card%i" % i) cardMatrix = child.translate(-parent.dx(), -parent.dy()) card.setMatrix(cardMatrix) #card.setFlag(QGraphicsSvgItem.ItemIsMovable, True) card.scale(0.5, 0.5) card.hide() self.scene.addItem(card) self.board.append(card) self.seats = [] self.names = [] self.moneys = [] self.bets = [] for i in range(10): seat = SeatItem() def seatClickedEvent(seat=i): seatClickedCallback = self.seatClicked seatClickedCallback(seat) seat.event = seatClickedEvent seat.setSharedRenderer(self.renderer) seat.setElementId("seat") seat.setMatrix( self.renderer.matrixForElement("transform_seat%i" % i)) self.scene.addItem(seat) self.seats.append(seat) name = QGraphicsSimpleTextItem(seat) name.setMatrix(self.renderer.matrixForElement("seat_name")) self.scene.addItem(name) self.names.append(name) money = QGraphicsSimpleTextItem(seat) money.setMatrix(self.renderer.matrixForElement("seat_money")) self.scene.addItem(money) self.moneys.append(money) bet = QGraphicsSimpleTextItem() bet.setMatrix(self.renderer.matrixForElement("transform_bet%i" % i)) self.scene.addItem(bet) self.bets.append(bet) self.pots = [] for i in range(9): pot = QGraphicsSimpleTextItem() pot.setMatrix(self.renderer.matrixForElement("transform_pot%i" % i)) self.scene.addItem(pot) self.pots.append(pot) self.view = QGraphicsView(self) self.view.setScene(self.scene) self.view.resize(800, 600) self.fold = ActionItem() self.fold.setText("fold") self.fold.setPos(0, 550) self.scene.addItem(self.fold) self.fold.event = lambda: self.foldClicked() self.check = ActionItem() self.check.setText("check") self.check.setPos(50, 550) self.scene.addItem(self.check) self.check.event = lambda: self.checkClicked() self.call = ActionItem() self.call.setText("call") self.call.setPos(100, 550) self.scene.addItem(self.call) self.call.event = lambda: self.callClicked() self.bet = ActionItem() self.bet.setText("bet") self.bet.setPos(150, 550) self.scene.addItem(self.bet) self.bet.event = lambda: self.betClicked() def renderChat(self, message): self.chat.setText(message) def renderBoard(self, cards): for i in range(len(cards)): item = self.board[i] card = cards[i] item.setElementId(card2SvgElement(card)) if item.isVisible() == False: item.show() for i in range(len(cards), len(self.board)): item = self.board[i] item.hide() item.setElementId('back') def renderStart(self): map(lambda svgItem: svgItem.setElementId('back'), self.board) map(lambda svgItem: svgItem.hide(), self.board) def renderPlayerArrive(self, seat, name): self.names[seat].setText(name) self.names[seat].show() def renderPlayerLeave(self, seat): self.names[seat].setText('') self.names[seat].hide() self.moneys[seat].hide() self.bets[seat].hide() def renderPlayerChips(self, seat, money, bet): if bet > 0: self.bets[seat].setText(str(bet)) self.bets[seat].show() else: self.bets[seat].hide() self.moneys[seat].setText(str(money)) self.moneys[seat].show() def renderPot(self, index, amount): self.pots[index].setText(str(amount)) self.pots[index].show() def renderPotReset(self): for pot in self.pots: pot.setText("") pot.hide() def renderPosition(self, seatInPosition): for i in range(len(self.seats)): seat = self.seats[i] if i == seatInPosition: seat.setElementId("seat_inposition") else: seat.setElementId("seat") def renderPositionReset(self): for seat in self.seats: seat.setElementId("seat") def keyPressEvent(self, event): if event.text() == "q": self.view.scale(1.1, 1.1) elif event.text() == "a": self.view.scale(0.9, 0.9) seatClicked = lambda seat: None foldClicked = lambda: None checkClicked = lambda: None callClicked = lambda: None betClicked = lambda: None
def __init__(self, dataDir = "", parent = None): QWidget.__init__(self, parent) self.renderer = QSvgRenderer(dataDir + "poker.svg") self.scene = QGraphicsScene() self.chat = QGraphicsSimpleTextItem() self.table = QGraphicsSvgItem(dataDir + "poker.svg") self.table.setSharedRenderer(self.renderer) self.table.setElementId("table") self.table.setMatrix(self.renderer.matrixForElement("transform_table")) self.scene.addItem(self.chat) self.scene.addItem(self.table) self.board = [] for i in range(5): card = AnimatedGraphicsSvgItem(dataDir + "svg-cards.svg", self.table) card.setElementId("back") parent = self.renderer.matrixForElement("transform_table") child = self.renderer.matrixForElement("transform_card%i" % i) cardMatrix = child.translate(-parent.dx(), -parent.dy()) card.setMatrix(cardMatrix) #card.setFlag(QGraphicsSvgItem.ItemIsMovable, True) card.scale(0.5, 0.5) card.hide() self.scene.addItem(card) self.board.append(card) self.seats = [] self.names = [] self.moneys = [] self.bets = [] for i in range(10): seat = SeatItem() def seatClickedEvent(seat = i): seatClickedCallback = self.seatClicked seatClickedCallback(seat) seat.event = seatClickedEvent seat.setSharedRenderer(self.renderer) seat.setElementId("seat") seat.setMatrix(self.renderer.matrixForElement("transform_seat%i" % i)) self.scene.addItem(seat) self.seats.append(seat) name = QGraphicsSimpleTextItem(seat) name.setMatrix(self.renderer.matrixForElement("seat_name")) self.scene.addItem(name) self.names.append(name) money = QGraphicsSimpleTextItem(seat) money.setMatrix(self.renderer.matrixForElement("seat_money")) self.scene.addItem(money) self.moneys.append(money) bet = QGraphicsSimpleTextItem() bet.setMatrix(self.renderer.matrixForElement("transform_bet%i" % i)) self.scene.addItem(bet) self.bets.append(bet) self.pots = [] for i in range(9): pot = QGraphicsSimpleTextItem() pot.setMatrix(self.renderer.matrixForElement("transform_pot%i" %i)) self.scene.addItem(pot) self.pots.append(pot) self.view = QGraphicsView(self) self.view.setScene(self.scene) self.view.resize(800, 600) self.fold = ActionItem() self.fold.setText("fold") self.fold.setPos(0, 550) self.scene.addItem(self.fold) self.fold.event = lambda: self.foldClicked() self.check = ActionItem() self.check.setText("check") self.check.setPos(50, 550) self.scene.addItem(self.check) self.check.event = lambda: self.checkClicked() self.call = ActionItem() self.call.setText("call") self.call.setPos(100, 550) self.scene.addItem(self.call) self.call.event = lambda: self.callClicked() self.bet = ActionItem() self.bet.setText("bet") self.bet.setPos(150, 550) self.scene.addItem(self.bet) self.bet.event = lambda: self.betClicked()
class QPokerWidget(QWidget): def __init__(self, dataDir = "", parent = None): QWidget.__init__(self, parent) self.renderer = QSvgRenderer(dataDir + "poker.svg") self.scene = QGraphicsScene() self.chat = QGraphicsSimpleTextItem() self.table = QGraphicsSvgItem(dataDir + "poker.svg") self.table.setSharedRenderer(self.renderer) self.table.setElementId("table") self.table.setMatrix(self.renderer.matrixForElement("transform_table")) self.scene.addItem(self.chat) self.scene.addItem(self.table) self.board = [] for i in range(5): card = AnimatedGraphicsSvgItem(dataDir + "svg-cards.svg", self.table) card.setElementId("back") parent = self.renderer.matrixForElement("transform_table") child = self.renderer.matrixForElement("transform_card%i" % i) cardMatrix = child.translate(-parent.dx(), -parent.dy()) card.setMatrix(cardMatrix) #card.setFlag(QGraphicsSvgItem.ItemIsMovable, True) card.scale(0.5, 0.5) card.hide() self.scene.addItem(card) self.board.append(card) self.seats = [] self.names = [] self.moneys = [] self.bets = [] for i in range(10): seat = SeatItem() def seatClickedEvent(seat = i): seatClickedCallback = self.seatClicked seatClickedCallback(seat) seat.event = seatClickedEvent seat.setSharedRenderer(self.renderer) seat.setElementId("seat") seat.setMatrix(self.renderer.matrixForElement("transform_seat%i" % i)) self.scene.addItem(seat) self.seats.append(seat) name = QGraphicsSimpleTextItem(seat) name.setMatrix(self.renderer.matrixForElement("seat_name")) self.scene.addItem(name) self.names.append(name) money = QGraphicsSimpleTextItem(seat) money.setMatrix(self.renderer.matrixForElement("seat_money")) self.scene.addItem(money) self.moneys.append(money) bet = QGraphicsSimpleTextItem() bet.setMatrix(self.renderer.matrixForElement("transform_bet%i" % i)) self.scene.addItem(bet) self.bets.append(bet) self.pots = [] for i in range(9): pot = QGraphicsSimpleTextItem() pot.setMatrix(self.renderer.matrixForElement("transform_pot%i" %i)) self.scene.addItem(pot) self.pots.append(pot) self.view = QGraphicsView(self) self.view.setScene(self.scene) self.view.resize(800, 600) self.fold = ActionItem() self.fold.setText("fold") self.fold.setPos(0, 550) self.scene.addItem(self.fold) self.fold.event = lambda: self.foldClicked() self.check = ActionItem() self.check.setText("check") self.check.setPos(50, 550) self.scene.addItem(self.check) self.check.event = lambda: self.checkClicked() self.call = ActionItem() self.call.setText("call") self.call.setPos(100, 550) self.scene.addItem(self.call) self.call.event = lambda: self.callClicked() self.bet = ActionItem() self.bet.setText("bet") self.bet.setPos(150, 550) self.scene.addItem(self.bet) self.bet.event = lambda: self.betClicked() def renderChat(self, message): self.chat.setText(message) def renderBoard(self, cards): for i in range(len(cards)): item = self.board[i] card = cards[i] item.setElementId(card2SvgElement(card)) if item.isVisible() == False: item.show() for i in range(len(cards), len(self.board)): item = self.board[i] item.hide() item.setElementId('back') def renderStart(self): map(lambda svgItem: svgItem.setElementId('back'), self.board) map(lambda svgItem: svgItem.hide(), self.board) def renderPlayerArrive(self, seat, name): self.names[seat].setText(name) self.names[seat].show() def renderPlayerLeave(self, seat): self.names[seat].setText('') self.names[seat].hide() self.moneys[seat].hide() self.bets[seat].hide() def renderPlayerChips(self, seat, money, bet): if bet > 0: self.bets[seat].setText(str(bet)) self.bets[seat].show() else: self.bets[seat].hide() self.moneys[seat].setText(str(money)) self.moneys[seat].show() def renderPot(self, index, amount): self.pots[index].setText(str(amount)) self.pots[index].show() def renderPotReset(self): for pot in self.pots: pot.setText("") pot.hide() def renderPosition(self, seatInPosition): for i in range(len(self.seats)): seat = self.seats[i] if i == seatInPosition: seat.setElementId("seat_inposition") else: seat.setElementId("seat") def renderPositionReset(self): for seat in self.seats: seat.setElementId("seat") def keyPressEvent(self, event): if event.text() == "q": self.view.scale(1.1, 1.1) elif event.text() == "a": self.view.scale(0.9, 0.9) seatClicked = lambda seat: None foldClicked = lambda: None checkClicked = lambda: None callClicked = lambda: None betClicked = lambda: None