1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# -*- coding: utf-8 -*-
import pygame
class Widget:
# Un widget representa cualquier cosa "pintable"
def __init__(self, container, rect_in_container, frame_rate, surface=None, tooltip=None):
self.container = container # Ventana (Rect) que "contiene" al widget
self.set_rect_in_container(rect_in_container)
self.frame_rate = frame_rate
self.background = surface
self.parent = None
# El widget puede (opcionalmente) tener un tooltip
self.tooltip = tooltip
self.super_tooltip = None
self.showing_tooltip = False
self.visible = True
def draw(self, screen):
if self.visible:
if self.background:
screen.blit(self.background, self.rect_absolute)
return self.rect_absolute
def force_update(self): # Forzamos la actualizacion del widget independientemente del frame_rate
#screen.blit(self.background, self.rect_in_container)
#pygame.display.update(self.rect_in_container)
pass
def set_rect_in_container(self, rect):
# Rect del widget (relativo al container)
self.rect_in_container = rect
# Rect del widget (absoluto al screen)
self.rect_absolute = pygame.Rect((self.container.left + self.rect_in_container.left, self.container.top + self.rect_in_container.top), (self.rect_in_container.size))
def set_rect_size(self, size):
# Rect del widget (relativo al container)
self.rect_in_container.size = size
# Rect del widget (absoluto al screen)
self.rect_absolute.size = size
def get_background_and_owner(self):
if self.background:
return (self.background, self)
elif self.parent:
return self.parent.get_background_and_owner()
else:
return (None, None)
def get_background(self):
return self.get_background_and_owner()[0]
def get_background_rect(self):
background, owner = self.get_background_and_owner()
if background:
if self is owner:
return background.copy()
else:
parents_relative_pos = self.rect_absolute.x - owner.rect.x, self.rect_absolute.y - owner.rect.y
rect = pygame.Rect(parents_relative_pos, self.rect_absolute.size)
return background.subsurface(rect)
return pygame.Surface(self.rect_absolute.size)
def contains_point(self, x, y):
return self.rect_absolute.collidepoint(x, y)
|