|
|
|
@ -42,14 +42,9 @@ Builder.load_string(''' |
|
|
|
class QRCodeWidget(FloatLayout): |
|
|
|
class QRCodeWidget(FloatLayout): |
|
|
|
|
|
|
|
|
|
|
|
data = StringProperty(None, allow_none=True) |
|
|
|
data = StringProperty(None, allow_none=True) |
|
|
|
|
|
|
|
|
|
|
|
background_color = ListProperty((1, 1, 1, 1)) |
|
|
|
background_color = ListProperty((1, 1, 1, 1)) |
|
|
|
|
|
|
|
|
|
|
|
foreground_color = ListProperty((0, 0, 0, 0)) |
|
|
|
foreground_color = ListProperty((0, 0, 0, 0)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#loading_image = StringProperty('gui/kivy/theming/loading.gif') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, **kwargs): |
|
|
|
def __init__(self, **kwargs): |
|
|
|
super(QRCodeWidget, self).__init__(**kwargs) |
|
|
|
super(QRCodeWidget, self).__init__(**kwargs) |
|
|
|
self.data = None |
|
|
|
self.data = None |
|
|
|
@ -57,21 +52,11 @@ class QRCodeWidget(FloatLayout): |
|
|
|
self._qrtexture = None |
|
|
|
self._qrtexture = None |
|
|
|
|
|
|
|
|
|
|
|
def on_data(self, instance, value): |
|
|
|
def on_data(self, instance, value): |
|
|
|
print "on data", value |
|
|
|
|
|
|
|
if not (self.canvas or value): |
|
|
|
if not (self.canvas or value): |
|
|
|
return |
|
|
|
return |
|
|
|
img = self.ids.get('qrimage', None) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not img: |
|
|
|
|
|
|
|
# if texture hasn't yet been created delay the texture updation |
|
|
|
|
|
|
|
Clock.schedule_once(lambda dt: self.on_data(instance, value)) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#Thread(target=partial(self.update_qr, )).start() |
|
|
|
|
|
|
|
self.update_qr() |
|
|
|
self.update_qr() |
|
|
|
|
|
|
|
|
|
|
|
def set_data(self, data): |
|
|
|
def set_data(self, data): |
|
|
|
print "set data", data |
|
|
|
|
|
|
|
if self.data == data: |
|
|
|
if self.data == data: |
|
|
|
return |
|
|
|
return |
|
|
|
MinSize = 210 if len(data) < 128 else 500 |
|
|
|
MinSize = 210 if len(data) < 128 else 500 |
|
|
|
@ -98,7 +83,7 @@ class QRCodeWidget(FloatLayout): |
|
|
|
# currently unused, do we need this? |
|
|
|
# currently unused, do we need this? |
|
|
|
self._texture_size = size |
|
|
|
self._texture_size = size |
|
|
|
|
|
|
|
|
|
|
|
def _create_texture(self, k, dt): |
|
|
|
def _create_texture(self, k): |
|
|
|
self._qrtexture = texture = Texture.create(size=(k,k), colorfmt='rgb') |
|
|
|
self._qrtexture = texture = Texture.create(size=(k,k), colorfmt='rgb') |
|
|
|
# don't interpolate texture |
|
|
|
# don't interpolate texture |
|
|
|
texture.min_filter = 'nearest' |
|
|
|
texture.min_filter = 'nearest' |
|
|
|
@ -107,32 +92,24 @@ class QRCodeWidget(FloatLayout): |
|
|
|
def update_texture(self): |
|
|
|
def update_texture(self): |
|
|
|
if not self.qr: |
|
|
|
if not self.qr: |
|
|
|
return |
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
matrix = self.qr.get_matrix() |
|
|
|
matrix = self.qr.get_matrix() |
|
|
|
k = len(matrix) |
|
|
|
k = len(matrix) |
|
|
|
# create the texture in main UI thread otherwise |
|
|
|
# create the texture |
|
|
|
# this will lead to memory corruption |
|
|
|
self._create_texture(k) |
|
|
|
Clock.schedule_once(partial(self._create_texture, k), -1) |
|
|
|
|
|
|
|
buff = [] |
|
|
|
buff = [] |
|
|
|
bext = buff.extend |
|
|
|
bext = buff.extend |
|
|
|
cr, cg, cb, ca = self.background_color[:] |
|
|
|
cr, cg, cb, ca = self.background_color[:] |
|
|
|
cr, cg, cb = cr*255, cg*255, cb*255 |
|
|
|
cr, cg, cb = cr*255, cg*255, cb*255 |
|
|
|
|
|
|
|
|
|
|
|
for r in range(k): |
|
|
|
for r in range(k): |
|
|
|
for c in range(k): |
|
|
|
for c in range(k): |
|
|
|
bext([0, 0, 0] if matrix[r][c] else [cr, cg, cb]) |
|
|
|
bext([0, 0, 0] if matrix[r][c] else [cr, cg, cb]) |
|
|
|
|
|
|
|
|
|
|
|
# then blit the buffer |
|
|
|
# then blit the buffer |
|
|
|
buff = ''.join(map(chr, buff)) |
|
|
|
buff = ''.join(map(chr, buff)) |
|
|
|
# update texture in UI thread. |
|
|
|
# update texture |
|
|
|
Clock.schedule_once(lambda dt: self._upd_texture(buff), .1) |
|
|
|
self._upd_texture(buff) |
|
|
|
|
|
|
|
|
|
|
|
def _upd_texture(self, buff): |
|
|
|
def _upd_texture(self, buff): |
|
|
|
texture = self._qrtexture |
|
|
|
texture = self._qrtexture |
|
|
|
if not texture: |
|
|
|
|
|
|
|
# if texture hasn't yet been created delay the texture updation |
|
|
|
|
|
|
|
Clock.schedule_once(lambda dt: self._upd_texture(buff), .1) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
texture.blit_buffer(buff, colorfmt='rgb', bufferfmt='ubyte') |
|
|
|
texture.blit_buffer(buff, colorfmt='rgb', bufferfmt='ubyte') |
|
|
|
img =self.ids.qrimage |
|
|
|
img =self.ids.qrimage |
|
|
|
img.anim_delay = -1 |
|
|
|
img.anim_delay = -1 |
|
|
|
|