File size: 3,525 Bytes
c70fcb3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
86
87
88
89
90
91
92
93
94
95
96
97
98
from .utils import random_circle_init

import math
import pygame

class Point:
    # Point representing a prompt/generation
    """
    :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 # Tuple of x and y in R2 space (not screen space)
        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()

        # Margins
        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)  # Fill rectangle with black
        pygame.draw.rect(self.screen, (255, 255, 255), rect, border_thickness)  # Draw white border

        text_surface = self.font.render(self.prompt_text, True, (255, 255, 255))  # Render text
        text_rect = text_surface.get_rect()  # Get text rectangle
        text_rect.centerx = rect.centerx  # Center text horizontally
        text_rect.y = rect.y + int(rect.height * text_prompt_fraction)  # Position text vertically based on fraction
        self.screen.blit(text_surface, text_rect)  # Draw text

        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