# Path: PyEngine3D/Render/Font.py
# class TextRenderData:
#     def __init__(self):
#         self._text = ""
#         self.column = 0
#         self.row = 0
#         self.font_size = 10
#         self.width = 0.0
#         self.height = 0.0
#         self.initial_column = 0
#         self.initial_row = 0
#         self.font_data = None
#         self.render_count = 0
#         self.render_queue = np.zeros(1, (np.float32, 4))
# 
#     @property
#     def text(self):
#         return self._text
# 
#     @text.setter
#     def text(self, text):
#         self._text = text
# 
#         ratio = 1.0 / self.font_data.count_of_side
#         text_count = len(text)
# 
#         if len(self.render_queue) < text_count:
#             self.render_queue.resize((text_count, 4), refcheck=False)
# 
#         render_index = 0
#         max_column = self.initial_column
#         column = self.initial_column
#         row = self.initial_row
# 
#         for c in text:
#             if c == '\n':
#                 column = self.initial_column
#                 row += 1
#             elif c == '\t':
#                 column += 1
#             elif c == ' ':
#                 column += 1
#             else:
#                 index = max(0, ord(c) - self.font_data.range_min)
#                 texcoord_x = (index % self.font_data.count_of_side) * ratio
#                 texcoord_y = (self.font_data.count_of_side - 1 - int(index * ratio)) * ratio
#                 self.render_queue[render_index][...] = [column, row, texcoord_x, texcoord_y]
#                 render_index += 1
#                 column += 1
#             max_column = max(max_column, column)
#         row += 1
# 
#         self.column = max_column - self.initial_column
#         self.row = row - self.initial_row
#         self.width = self.column * self.font_size
#         self.height = self.row * self.font_size
#         self.render_count = render_index
# 
#     def set_text(self, text, font_data, initial_column=0, initial_row=0, font_size=10, skip_check=False):
#         if not skip_check and text == self.text:
#             return False
# 
#         self.font_data = font_data
#         self.font_size = font_size
#         self.initial_column = initial_column
#         self.initial_row = initial_row
# 
#         self.text = text
#         return True


from enum import Enum
from PyEngine3D.Common import *
from PyEngine3D.Render import TextRenderData
import numpy as np
            self.changed_layout = True
            self.pos_hint_y = None
            self._y = y

    @property
    def pos_hint_x(self):
        return self._pos_hint_x

    @pos_hint_x.setter
    def pos_hint_x(self, pos_hint_x):
        if pos_hint_x is not None and self._pos_hint_x != pos_hint_x:
            self.changed_layout = True
        self._pos_hint_x = pos_hint_x

    @property
    def pos_hint_y(self):
        return self._pos_hint_y

    @pos_hint_y.setter
    def pos_hint_y(self, pos_hint_y):
        if pos_hint_y is not None and self._pos_hint_y != pos_hint_y:
            self.changed_layout = True
        self._pos_hint_y = pos_hint_y

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, width):

# Path: PyEngine3D/Render/Font.py
# class TextRenderData:
#     def __init__(self):
#         self._text = ""
#         self.column = 0
#         self.row = 0
#         self.font_size = 10
#         self.width = 0.0
#         self.height = 0.0
#         self.initial_column = 0
#         self.initial_row = 0
#         self.font_data = None
#         self.render_count = 0
#         self.render_queue = np.zeros(1, (np.float32, 4))
# 
#     @property
#     def text(self):
#         return self._text
# 
#     @text.setter
#     def text(self, text):
#         self._text = text
# 
#         ratio = 1.0 / self.font_data.count_of_side
#         text_count = len(text)
# 
#         if len(self.render_queue) < text_count:
#             self.render_queue.resize((text_count, 4), refcheck=False)
# 
#         render_index = 0
#         max_column = self.initial_column
#         column = self.initial_column
#         row = self.initial_row
# 
#         for c in text:
#             if c == '\n':
#                 column = self.initial_column
#                 row += 1
#             elif c == '\t':
#                 column += 1
#             elif c == ' ':
#                 column += 1
#             else:
#                 index = max(0, ord(c) - self.font_data.range_min)
#                 texcoord_x = (index % self.font_data.count_of_side) * ratio
#                 texcoord_y = (self.font_data.count_of_side - 1 - int(index * ratio)) * ratio
#                 self.render_queue[render_index][...] = [column, row, texcoord_x, texcoord_y]
#                 render_index += 1
#                 column += 1
#             max_column = max(max_column, column)
#         row += 1
# 
#         self.column = max_column - self.initial_column
#         self.row = row - self.initial_row
#         self.width = self.column * self.font_size
#         self.height = self.row * self.font_size
#         self.render_count = render_index
# 
#     def set_text(self, text, font_data, initial_column=0, initial_row=0, font_size=10, skip_check=False):
#         if not skip_check and text == self.text:
#             return False
# 
#         self.font_data = font_data
#         self.font_size = font_size
#         self.initial_column = initial_column
#         self.initial_row = initial_row
# 
#         self.text = text
#         return True


# Path: PyEngine3D/UI/Widget.py
from enum import Enum
from PyEngine3D.Common import *
from PyEngine3D.Render import TextRenderData
import numpy as np

            self.changed_layout = True
            self.pos_hint_y = None
            self._y = y

    @property
    def pos_hint_x(self):
        return self._pos_hint_x

    @pos_hint_x.setter
    def pos_hint_x(self, pos_hint_x):
        if pos_hint_x is not None and self._pos_hint_x != pos_hint_x:
            self.changed_layout = True
        self._pos_hint_x = pos_hint_x

    @property
    def pos_hint_y(self):
        return self._pos_hint_y

    @pos_hint_y.setter
    def pos_hint_y(self, pos_hint_y):
        if pos_hint_y is not None and self._pos_hint_y != pos_hint_y:
            self.changed_layout = True
        self._pos_hint_y = pos_hint_y

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, width):

        if self._width != width: