Prepare qidenticon module for using qtpy

This commit is contained in:
Dmitri Bogomolov 2021-03-03 18:15:00 +02:00
parent 5a5f57eddf
commit abc4b5ebfc
Signed by untrusted user: g1itch
GPG Key ID: 720A756F18DEED13

View File

@ -10,9 +10,7 @@ Return a PIL Image class instance which have generated identicon image.
``size`` specifies `patch size`. Generated image size is 3 * ``size``.
"""
from PyQt4 import QtGui
from PyQt4.QtCore import QPointF, QSize, Qt
from PyQt4.QtGui import QPainter, QPixmap, QPolygonF
from qtpy import QtCore, QtGui
class IdenticonRendererBase(object):
@ -37,10 +35,12 @@ class IdenticonRendererBase(object):
"""
# decode the code
middle, corner, side, foreColor, secondColor, swap_cross = self.decode(self.code, twoColor)
middle, corner, side, foreColor, secondColor, swap_cross = \
self.decode(self.code, twoColor)
# make image
image = QPixmap(QSize(size * 3 + penwidth, size * 3 + penwidth))
image = QtGui.QPixmap(
QtCore.QSize(size * 3 + penwidth, size * 3 + penwidth))
# fill background
backColor = QtGui.QColor(255, 255, 255, opacity)
@ -54,7 +54,8 @@ class IdenticonRendererBase(object):
'backColor': backColor}
# middle patch
image = self.drawPatchQt((1, 1), middle[2], middle[1], middle[0], **kwds)
image = self.drawPatchQt(
(1, 1), middle[2], middle[1], middle[0], **kwds)
# side patch
kwds['foreColor'] = foreColor
@ -72,7 +73,8 @@ class IdenticonRendererBase(object):
return image
def drawPatchQt(self, pos, turn, invert, patch_type, image, size, foreColor,
def drawPatchQt(
self, pos, turn, invert, patch_type, image, size, foreColor,
backColor, penwidth): # pylint: disable=unused-argument
"""
:param size: patch size
@ -83,47 +85,50 @@ class IdenticonRendererBase(object):
invert = not invert
path = [(0., 0.), (1., 0.), (1., 1.), (0., 1.), (0., 0.)]
polygon = QPolygonF([QPointF(x * size, y * size) for x, y in path])
polygon = QtGui.QPolygonF([
QtCore.QPointF(x * size, y * size) for x, y in path])
rot = turn % 4
rect = [QPointF(0., 0.), QPointF(size, 0.), QPointF(size, size), QPointF(0., size)]
rect = [
QtCore.QPointF(0., 0.), QtCore.QPointF(size, 0.),
QtCore.QPointF(size, size), QtCore.QPointF(0., size)]
rotation = [0, 90, 180, 270]
nopen = QtGui.QPen(foreColor, Qt.NoPen)
foreBrush = QtGui.QBrush(foreColor, Qt.SolidPattern)
nopen = QtGui.QPen(foreColor, QtCore.Qt.NoPen)
foreBrush = QtGui.QBrush(foreColor, QtCore.Qt.SolidPattern)
if penwidth > 0:
pen_color = QtGui.QColor(255, 255, 255)
pen = QtGui.QPen(pen_color, Qt.SolidPattern)
pen = QtGui.QPen(pen_color, QtCore.Qt.SolidPattern)
pen.setWidth(penwidth)
painter = QPainter()
painter = QtGui.QPainter()
painter.begin(image)
painter.setPen(nopen)
painter.translate(pos[0] * size + penwidth / 2, pos[1] * size + penwidth / 2)
painter.translate(
pos[0] * size + penwidth / 2, pos[1] * size + penwidth / 2)
painter.translate(rect[rot])
painter.rotate(rotation[rot])
if invert:
# subtract the actual polygon from a rectangle to invert it
poly_rect = QPolygonF(rect)
poly_rect = QtGui.QPolygonF(rect)
polygon = poly_rect.subtracted(polygon)
painter.setBrush(foreBrush)
if penwidth > 0:
# draw the borders
painter.setPen(pen)
painter.drawPolygon(polygon, Qt.WindingFill)
painter.drawPolygon(polygon, QtCore.Qt.WindingFill)
# draw the fill
painter.setPen(nopen)
painter.drawPolygon(polygon, Qt.WindingFill)
painter.drawPolygon(polygon, QtCore.Qt.WindingFill)
painter.end()
return image
def decode(self, code, twoColor):
def decode(self, code):
"""virtual functions"""
raise NotImplementedError
@ -166,7 +171,8 @@ class DonRenderer(IdenticonRendererBase):
[(0, 0), (2, 0), (0, 2)],
# [15] empty:
[]]
# get the [0] full square, [4] square standing on diagonale, [8] small centered square, or [15] empty tile:
# get the [0] full square, [4] square standing on diagonale,
# [8] small centered square, or [15] empty tile:
MIDDLE_PATCH_SET = [0, 4, 8, 15]
# modify path set
@ -215,7 +221,8 @@ class DonRenderer(IdenticonRendererBase):
foreColor = QtGui.QColor(*foreColor)
if twoColor:
secondColor = (second_blue << 3, second_green << 3, second_red << 3)
secondColor = (
second_blue << 3, second_green << 3, second_red << 3)
secondColor = QtGui.QColor(*secondColor)
else:
secondColor = foreColor
@ -226,9 +233,9 @@ class DonRenderer(IdenticonRendererBase):
foreColor, secondColor, swap_cross
def render_identicon(code, size, twoColor=False, opacity=255, penwidth=0, renderer=None):
def render_identicon(
code, size, twoColor=False, opacity=255, penwidth=0, renderer=None):
"""Render an image"""
if not renderer:
renderer = DonRenderer
return renderer(code).render(size, twoColor, opacity, penwidth)