-
Notifications
You must be signed in to change notification settings - Fork 0
/
button.py
85 lines (74 loc) · 3.56 KB
/
button.py
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
73
74
75
76
77
78
79
80
81
82
83
84
85
import pygame
class Button():
"""
This is a class for the GUI buttons in the pygame application.
Attributes:
color (tuple): Background color of the button in RGB format.
x (int): X-position of the button.
y (int): Y-position of the button.
width (int): Width of the button.
height (int): Height of the button.
font (pygame.font): Pygame font object to store font type and size.
text (str): Text inside the button.
foreground_color (tuple): Text color of the button in RGB format.
clicked (bool): Bool to represent whether or not the button is clicked.
rect (pygame.Rect): Pygame Rect object for rendering and collision detection.
hover_color (tuple): Background color of the button when mouse is hovering over in RGB format.
hover_box (HoverBox): HoverBox object to show a box with text when mouse is hovering over button (if present).
Methods:
draw(self, surface)
Draws the button on the pygame surface and returns True if button is clicked.
"""
def __init__(self, color, x, y, width, height, text, foreground_color, hover_color, *, small_text=False, big_text=False, hover_box=None, hover_box_group=None):
self.color = color
self.x = x
self.y = y
self.width = width
self.height = height
self.font = pygame.font.SysFont('Arial Bold', 25)
self.text = text
self.foreground_color = foreground_color
self.clicked = False
self.rect = pygame.Rect(self.x, self.y, self.width, self.height)
self.hover_color = hover_color
self.has_hover_box = False
if small_text:
self.font = pygame.font.SysFont('Arial Bold', 16)
if big_text:
self.font = pygame.font.SysFont('Arial Bold', 32)
if hover_box is not None:
self.hover_box = hover_box
self.hover_box_group = hover_box_group
self.is_showing_hover_box = False
self.has_hover_box = True
def draw(self, surface) -> bool:
action = False
pygame.draw.rect(surface, self.color, self.rect)
button_text = self.font.render(self.text, True, self.foreground_color)
# Center text in button
button_text_rect = button_text.get_rect(center = (self.x+self.width/2, self.y+self.height/2))
pos = pygame.mouse.get_pos()
if self.rect.collidepoint(pos):
# If mouse hovers over the button
pygame.draw.rect(surface, self.hover_color, self.rect)
if pygame.mouse.get_pressed()[0] and self.clicked == False:
# If Button is being left-clicked
self.clicked = True
action = True
if self.has_hover_box:
# Draw HoverBox at mouse position if button has HoverBox attached
self.hover_box.update_image(pos[0], pos[1])
self.hover_box_group.add(self.hover_box)
self.is_showing_hover_box = True
else:
# Stop drawing HoverBox when mouse is off button
if self.has_hover_box and self.is_showing_hover_box:
self.hover_box_group.remove(self.hover_box)
self.is_showing_hover_box = False
if pygame.mouse.get_pressed()[0] == False:
self.clicked = False
# Button Text
surface.blit(button_text, button_text_rect)
# Button Border
pygame.draw.rect(surface, (0,0,0), (self.x, self.y, self.width + 1, self.height + 1), 1) # Border
return action