#!/usr/bin/env python3
"""
Widgets that can display images
"""
import pyglet
import autoprop
from vecrec import Vector, Rect
from glooey import drawing, containers
from glooey.widget import Widget
from glooey.containers import Bin, claim_stacked_widgets
from glooey.helpers import *
[docs]@autoprop
class Image(Widget):
custom_image = None
custom_alignment = 'center'
[docs] def __init__(self, image=None, responsive=False):
if responsive:
self.custom_alignment = 'fill'
super().__init__()
self._image = image or self.custom_image
self._responsive = responsive
self._sprite = None
[docs] def do_claim(self):
if self.image is not None and not self._responsive:
return self.image.width, self.image.height
else:
return 0, 0
[docs] def do_regroup(self):
if self._sprite is not None:
self._sprite.batch = self.batch
self._sprite.group = self.group
[docs] def do_draw(self):
if self.image is None:
self.do_undraw()
return
if self._sprite is None:
self._sprite = pyglet.sprite.Sprite(
self.image, batch=self.batch, group=self.group)
else:
self._sprite.image = self.image
self._sprite.x = self.rect.left
self._sprite.y = self.rect.bottom
if self._responsive:
scale_x = self.rect.width / self.image.width
scale_y = self.rect.height / self.image.height
scale = min(scale_x, scale_y)
self._sprite.scale = scale
self._sprite.x += (self.rect.width - self._sprite.width) / 2
self._sprite.y += (self.rect.height - self._sprite.height) / 2
[docs] def do_undraw(self):
if self._sprite is not None:
self._sprite.delete()
self._sprite = None
[docs] def get_image(self):
return self._image
[docs] def set_image(self, new_image):
if self._image is not new_image:
self._image = new_image
self._repack()
[docs] def del_image(self):
self.set_image(None)
[docs] def get_appearance(self):
return {'image': self._image}
[docs] def set_appearance(self, *, image=None):
self.set_image(image)
@property
def is_empty(self):
return self._image is None
[docs]@autoprop
class Background(Widget):
custom_color = None
custom_outline = None
custom_image = None
custom_center = None
custom_top = None
custom_bottom = None
custom_left = None
custom_right = None
custom_top_left = None
custom_top_right = None
custom_bottom_left = None
custom_bottom_right = None
custom_vtile = 'auto'
custom_htile = 'auto'
[docs] def __init__(self, **kwargs):
super().__init__()
self._artist = drawing.Background(
color=kwargs.get('color', self.custom_color),
outline=kwargs.get('outline', self.custom_outline),
image=kwargs.get('image', self.custom_image),
center=kwargs.get('center', self.custom_center),
top=kwargs.get('top', self.custom_top),
bottom=kwargs.get('bottom', self.custom_bottom),
left=kwargs.get('left', self.custom_left),
right=kwargs.get('right', self.custom_right),
top_left=kwargs.get('top_left', self.custom_top_left),
top_right=kwargs.get('top_right', self.custom_top_right),
bottom_left=kwargs.get('bottom_left', self.custom_bottom_left),
bottom_right=kwargs.get('bottom_right', self.custom_bottom_right),
vtile=kwargs.get('vtile', self.custom_vtile),
htile=kwargs.get('htile', self.custom_htile),
hidden=True,
)
[docs] def do_attach(self):
self._artist.batch = self.batch
[docs] def do_claim(self):
return self._artist.min_size
[docs] def do_resize(self):
self._artist.rect = self.rect
[docs] def do_regroup(self):
self._artist.group = self.group
[docs] def do_draw(self):
self._artist.show()
[docs] def do_undraw(self):
self._artist.hide()
[docs] def get_color(self):
return self._artist.color
[docs] def set_color(self, new_color):
self._artist.color = new_color
[docs] def get_outline(self):
return self._artist.outline
[docs] def set_outline(self, new_outline):
self._artist.outline = new_outline
[docs] def set_image(self, image):
self._artist.set_image(image)
self._repack()
[docs] def get_appearance(self):
return self._artist.appearance
[docs] def set_appearance(self, *, color=None, image=None, center=None, top=None,
bottom=None, left=None, right=None, top_left=None, top_right=None,
bottom_left=None, bottom_right=None, vtile='auto', htile='auto'):
self._artist.set_appearance(
color=color,
image=image,
center=center,
top=top,
bottom=bottom,
left=left,
right=right,
top_left=top_left,
top_right=top_right,
bottom_left=bottom_left,
bottom_right=bottom_right,
vtile=vtile,
htile=htile,
)
self._repack()
@property
def is_empty(self):
return self._artist.is_empty