コード例 #1
0
ファイル: WaveFactory.py プロジェクト: iSFX-Team/iSFX
 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
コード例 #2
0
ファイル: gps_action.py プロジェクト: NathanW2/qmap
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)
コード例 #3
0
ファイル: SvgFactory.py プロジェクト: iSFX-Team/iSFX
 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
コード例 #4
0
    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
コード例 #5
0
ファイル: graphwidget.py プロジェクト: TarekHC/ctapipe
 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()
コード例 #6
0
    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
コード例 #7
0
ファイル: rasterize.py プロジェクト: Hainish/calibre
    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)
コード例 #8
0
ファイル: rasterize.py プロジェクト: 089git/calibre
 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)
コード例 #9
0
ファイル: boardview.py プロジェクト: wedesoft/battleship-qt4
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()
コード例 #10
0
ファイル: rasterize.py プロジェクト: sss/calibre
    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:
            box = [float(x) for x in view_box.split()]
            sizes = [box[2] - box[0], box[3] - box[1]]
            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)
コード例 #11
0
ファイル: default.py プロジェクト: north-road/inasafe
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
コード例 #12
0
    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, 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
コード例 #13
0
ファイル: default.py プロジェクト: ismailsunni/inasafe
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
コード例 #14
0
 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()
コード例 #15
0
 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
コード例 #16
0
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)
コード例 #17
0
ファイル: background.py プロジェクト: jsj2008/kdegames
 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
コード例 #18
0
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)
コード例 #19
0
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();
コード例 #20
0
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()
コード例 #21
0
ファイル: qtraster.py プロジェクト: devernay/xkcd-kindle
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')
コード例 #22
0
ファイル: board.py プロジェクト: QuikkHakk/nchess
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)