|
from .utils import random_circle_init |
|
|
|
import math |
|
import pygame |
|
|
|
class Point: |
|
|
|
""" |
|
:param text: Text associated with the point |
|
:param encoding: Encoding associated with the point |
|
:param xy_pos: Tuple (x, y) for the position of point in R2. If not given, will initialize randomly |
|
:param xy_init_kwargs: kwargs to random_circle_init for randomly init'ing xy_pos |
|
""" |
|
def __init__(self, text, encoding, xy_pos = None, xy_init_kwargs = {}): |
|
self.text = text |
|
|
|
if xy_pos is not None: |
|
self.xy_pos = xy_pos |
|
else: |
|
self.xy_pos = random_circle_init(**xy_init_kwargs) |
|
self.encoding = encoding |
|
|
|
if "on_edge" in xy_init_kwargs: |
|
self.on_edge = xy_init_kwargs['on_edge'] |
|
else: |
|
self.on_edge = False |
|
|
|
def move(self, new_xy_pos): |
|
if self.on_edge: |
|
x, y = new_xy_pos |
|
length = math.sqrt(x**2 + y**2) |
|
self.xy_pos = (x/length, y/length) |
|
else: |
|
self.xy_pos = new_xy_pos |
|
|
|
class TextPrompt: |
|
def __init__(self, prompt_text, font, screen): |
|
self.prompt_text = prompt_text |
|
self.font = font |
|
self.screen = screen |
|
|
|
self.user_input = "" |
|
|
|
def draw_main_blocks(self): |
|
""" |
|
Draw main text block and text inside it |
|
""" |
|
screen_width, screen_height = pygame.display.get_surface().get_size() |
|
|
|
|
|
rect_height_fraction = 0.3 |
|
rect_width_fraction = 0.7 |
|
text_prompt_fraction = 0.3 |
|
border_thickness = 10 |
|
|
|
rect_height = int(screen_height * rect_height_fraction) |
|
rect_width = int(screen_width * rect_width_fraction) |
|
|
|
rect_x = (screen_width - rect_width) // 2 |
|
rect_y = (screen_height - rect_height) // 2 |
|
|
|
rect = pygame.Rect(rect_x, rect_y, rect_width, rect_height) |
|
|
|
pygame.draw.rect(self.screen, (0, 0, 0), rect) |
|
pygame.draw.rect(self.screen, (255, 255, 255), rect, border_thickness) |
|
|
|
text_surface = self.font.render(self.prompt_text, True, (255, 255, 255)) |
|
text_rect = text_surface.get_rect() |
|
text_rect.centerx = rect.centerx |
|
text_rect.y = rect.y + int(rect.height * text_prompt_fraction) |
|
self.screen.blit(text_surface, text_rect) |
|
|
|
user_text_surface = self.font.render(self.user_input, True, (255, 255,255)) |
|
user_text_rect = user_text_surface.get_rect() |
|
user_text_rect.centerx = rect.centerx |
|
user_text_rect.y = rect.y + int(rect.height * (1 - text_prompt_fraction)) |
|
self.screen.blit(user_text_surface, user_text_rect) |
|
|
|
def get_user_input(self) -> bool: |
|
""" |
|
Get user input, update self.user_input, and return True if user pressed enter |
|
""" |
|
for event in pygame.event.get(): |
|
if event.type == pygame.KEYDOWN: |
|
if event.key == pygame.K_BACKSPACE: |
|
self.user_input = self.user_input[:-1] |
|
elif event.key == pygame.K_RETURN: |
|
return True |
|
else: |
|
self.user_input += event.unicode |
|
return False |
|
|
|
def update(self): |
|
is_done = self.get_user_input() |
|
self.draw_main_blocks() |
|
|
|
return is_done |
|
|