def __init__(self, parent=None, width=200, value=50, show_label=True): """ Constructs a new progress bar. If show_label is True, a label indicating the current progress is shown """ LUIObject.__init__(self) self.set_width(width) self._bg_layout = LUIHorizontalStretchedLayout(parent=self, prefix="ProgressbarBg", width="100%") self._fg_left = LUISprite(self, "ProgressbarFg_Left", "skin") self._fg_mid = LUISprite(self, "ProgressbarFg", "skin") self._fg_right = LUISprite(self, "ProgressbarFg_Right", "skin") self._fg_finish = LUISprite(self, "ProgressbarFg_Finish", "skin") self._show_label = show_label self._progress_pixel = 0 self._fg_finish.right = 0 if self._show_label: self._progress_label = LUILabel(parent=self, text=u"33 %") self._progress_label.centered = (True, True) self.set_value(value) self._update_progress() if parent is not None: self.parent = parent
def __init__(self, text=u"Label", shadow=None, font_size=14, font="label", color=None, wordwrap=False, **kwargs): """ Creates a new label. If shadow is True, a small text shadow will be rendered below the actual text. """ LUIObject.__init__(self) LUIInitialState.init(self, kwargs) self._text = LUIText(self, unicode(text), font, font_size, 0, 0, wordwrap) self._text.z_offset = 1 if color is None: self.color = LUILabel.DEFAULT_COLOR else: self.color = color if shadow is None: shadow = LUILabel.DEFAULT_USE_SHADOW self._have_shadow = shadow if self._have_shadow: self._shadow_text = LUIText(self, unicode(text), font, font_size, 0, 0, wordwrap) self._shadow_text.top = 1 self._shadow_text.color = (0, 0, 0, 0.6)
def __init__(self, parent=None, width=200, value=50, show_label=True): """ Constructs a new progress bar. If show_label is True, a label indicating the current progress is shown """ LUIObject.__init__(self) self.set_width(width) self._bg_layout = LUIHorizontalStretchedLayout( parent=self, prefix="ProgressbarBg", width="100%") self._fg_left = LUISprite(self, "ProgressbarFg_Left", "skin") self._fg_mid = LUISprite(self, "ProgressbarFg", "skin") self._fg_right = LUISprite(self, "ProgressbarFg_Right", "skin") self._fg_finish = LUISprite(self, "ProgressbarFg_Finish", "skin") self._show_label = show_label self._progress_pixel = 0 self._fg_finish.right = 0 if self._show_label: self._progress_label = LUILabel(parent=self, text=u"33 %") self._progress_label.centered = (True, True) self.set_value(value) self._update_progress() if parent is not None: self.parent = parent
def __init__(self, width=200, options=None, selected_option=None, **kwargs): """ Constructs a new selectbox with a given width """ LUIObject.__init__(self, x=0, y=0, w=width+4, solid=True) LUIInitialState.init(self, kwargs) # The selectbox has a small border, to correct this we move it self.margin.left = -2 self._bg_layout = LUIHorizontalStretchedLayout(parent=self, prefix="Selectbox", width="100%") self._label_container = LUIObject(self, x=10, y=0) self._label_container.set_size("100%", "100%") self._label_container.clip_bounds = (0,0,0,0) self._label = LUILabel(parent=self._label_container, text=u"Select an option ..") self._label.center_vertical = True self._drop_menu = LUISelectdrop(parent=self, width=width) self._drop_menu.top = self._bg_layout._sprite_right.height - 7 self._drop_menu.topmost = True self._drop_open = False self._drop_menu.hide() self._options = [] self._current_option_id = None if options is not None: self._options = options self._select_option(selected_option)
def __init__(self, text=u"Label", shadow=None, font_size=14, font="label", color=None, wordwrap=False, **kwargs): """ Creates a new label. If shadow is True, a small text shadow will be rendered below the actual text. """ LUIObject.__init__(self) LUIInitialState.init(self, kwargs) self._text = LUIText( self, unicode(text), font, font_size, 0, 0, wordwrap ) self._text.z_offset = 1 if color is None: self.color = LUILabel.DEFAULT_COLOR else: self.color = color if shadow is None: shadow = LUILabel.DEFAULT_USE_SHADOW self._have_shadow = shadow if self._have_shadow: self._shadow_text = LUIText( self, unicode(text), font, font_size, 0, 0, wordwrap ) self._shadow_text.top = 1 self._shadow_text.color = (0,0,0,0.6)
def __init__(self, template="ButtonDefault", **kwargs): LUIObject.__init__(self, x=0, y=0, solid=True) self._template = template self._button_sprite = LUISprite(self, template, "skin") self._button_sprite.width = width self._button_sprite.height = height LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, group=None, value=None, active=False, label=u"Radiobox", **kwargs): """ Constructs a new radiobox. group should be a handle to a LUIRadioboxGroup. value will be the value returned by group.value, in case the box was selected. By default, the radiobox is not active. """ assert group is not None, "LUIRadiobox needs a LUIRadioboxGroup!" LUIObject.__init__(self, x=0, y=0, solid=True) self._sprite = LUISprite(self, "Radiobox_Default", "skin") self._label = LUILabel(parent=self, text=label, margin=(0, 0, 0, 23), center_vertical=True) self._value = value self._active = False self._hovered = False self._group = group self._group.register_box(self) if active: self.set_active() if parent: self.parent = parent LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, color=None): LUIObject.__init__(self, x=0, y=0, w=27, h=27) self.previewBg = LUISprite(self, "ColorpickerPreviewBg", "skin") self.filler = LUISprite(self, "blank", "skin") self.filler.width = 21 self.filler.height = 21 self.filler.pos = (5, 5) self.filler.color = (0.2, 0.6, 1.0, 1.0) self.overlay = LUISprite(self, "ColorpickerPreviewOverlay", "skin") self.overlay.pos = (2, 2) self.overlay.bind("click", self._open_dialog) self.fit_to_children() self.popup = LUIColorpickerPopup(self) self.popup.hide() if color is not None: self.colorValue = color else: # My favourite color self.colorValue = (0.2, 0.6, 1.0) self.set_color_value(self.colorValue) self.popup.add_change_callback(self._on_popup_color_changed) if parent is not None: self.parent = parent
def __init__(self, **kwargs): """ Creates a new block of text. """ LUIObject.__init__(self) LUIInitialState.init(self, kwargs) self._cursor = LVecBase2i(0) self._last_size = 14 self.labels = []
def __init__(self, parent=None, width=100, height=100, padding=10, **kwargs): LUIObject.__init__(self) self.set_size(width, height) self._content_parent = LUIObject(self) self._content_parent.set_size("100%", "100%") self._content_parent.clip_bounds = (0,0,0,0) self._content_clip = LUIObject(self._content_parent, x=padding, y=padding) self._content_clip.set_size("100%", "100%") self._content_scroller = LUIObject(self._content_clip) self._content_scroller.width = "100%" self._scrollbar = LUIObject(self, x=0, y=0, w=20) self._scrollbar.height = "100%" self._scrollbar.right = -10 self._scrollbar_bg = LUISprite(self._scrollbar, "blank", "skin") self._scrollbar_bg.color = (1,1,1,0.05) self._scrollbar_bg.set_size(3, "100%") self._scrollbar_bg.center_horizontal = True # Handle self._scrollbar_handle = LUIObject(self._scrollbar, x=5, y=0, w=10) self._scroll_handle_top = LUISprite(self._scrollbar_handle, "ScrollbarHandle_Top", "skin") self._scroll_handle_mid = LUISprite(self._scrollbar_handle, "ScrollbarHandle", "skin") self._scroll_handle_bottom = LUISprite(self._scrollbar_handle, "ScrollbarHandle_Bottom", "skin") self._scrollbar_handle.solid = True self._scrollbar.solid = True self._scrollbar_handle.bind("mousedown", self._start_scrolling) self._scrollbar_handle.bind("mouseup", self._stop_scrolling) self._scrollbar.bind("mousedown", self._on_bar_click) self._scrollbar.bind("mouseup", self._stop_scrolling) self._handle_dragging = False self._drag_start_y = 0 self._scroll_top_position = 0 self._content_height = 400 scroll_shadow_width = self.width - 10 # Scroll shadow self._scroll_shadow_top = LUIHorizontalStretchedLayout(parent=self, prefix="ScrollShadowTop", width="100%") self._scroll_shadow_bottom = LUIHorizontalStretchedLayout(parent=self, prefix="ScrollShadowBottom", width="100%") self._scroll_shadow_bottom.bottom = 0 self._handle_height = 100 if parent is not None: self.parent = parent LUIInitialState.init(self, kwargs) self.content_node = self._content_scroller taskMgr.doMethodLater(0.05, lambda task: self._update(), "update_scrollbar")
def __init__(self, template="ButtonDefault", **kwargs): LUIObject.__init__(self, x=0, y=0, solid=True) self._template = template self._button_sprite = LUISprite(self, template, "skin") if 'width' in kwargs: self._button_sprite.width = kwargs['width'] if 'height' in kwargs: self._button_sprite.height = kwargs['height'] LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, key=u"A", instruction=u"Instruction"): LUIObject.__init__(self) self.marker = LUIKeyMarker(parent=self, key=key) self.instructionLabel = LUILabel(parent=self, text=instruction, shadow=True) self.instructionLabel.centered = (False, True) self.instructionLabel.margin.top = -4 self.set_key(key)
def __init__(self, image_prefix="", **kwargs): """ Creates a new layout, using the image_prefix as prefix. """ LUIObject.__init__(self) self.set_size("100%", "100%") self._prefix = image_prefix self._parts = {} for i in self._MODES: self._parts[i] = LUISprite(self, "blank", "skin") self._update_layout() LUIInitialState.init(self, kwargs)
def __init__(self, checked=False, label=u"Checkbox", **kwargs): """ Constructs a new checkbox with the given label and state. By default, the checkbox is not checked. """ LUIObject.__init__(self, x=0, y=0, solid=True) self._checked = checked self._checkbox_sprite = LUISprite(self, "Checkbox_Default", "skin") self._label = LUILabel(parent=self, text=label, margin=(0, 0, 0, 25), center_vertical=True, alpha=0.4) self._hovered = False LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, prefix="ButtonDefault", **kwargs): LUIObject.__init__(self) self._layout = LUIHorizontalLayout(self, spacing=0) self._layout.width = "100%" self._sprite_left = LUISprite(self._layout.cell(), "blank", "skin") self._sprite_mid = LUISprite(self._layout.cell('*'), "blank", "skin") self._sprite_right = LUISprite(self._layout.cell(), "blank", "skin") if parent is not None: self.parent = parent self.prefix = prefix LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, filled=True, min_value=0.0, max_value=1.0, width=100.0, value=None, **kwargs): """ Constructs a new slider. If filled is True, the part behind the knob will be solid """ LUIObject.__init__(self, x=0, y=0, solid=True) self.set_width(width) self._knob = LUISprite(self, "SliderKnob", "skin") self._knob.z_offset = 2 self._knob.solid = True # Construct the background self._slider_bg = LUIHorizontalStretchedLayout(parent=self, prefix="SliderBg", center_vertical=True, width="100%", margin=(-1, 0, 0, 0)) self._filled = filled self._min_value = min_value self._max_value = max_value self._side_margin = self._knob.width / 4 self._effective_width = self.width - 2 * self._side_margin if self._filled: self._slider_fill = LUIObject(self) self._fill_left = LUISprite(self._slider_fill, "SliderBgFill_Left", "skin") self._fill_mid = LUISprite(self._slider_fill, "SliderBgFill", "skin") self._fill_mid.left = self._fill_left.width self._slider_fill.z_offset = 1 self._slider_fill.center_vertical = True if parent is not None: self.parent = parent # Handle various events self._knob.bind("mousedown", self._start_drag) self._knob.bind("mousemove", self._update_drag) self._knob.bind("mouseup", self._stop_drag) self._knob.bind("keydown", self._on_keydown) self._knob.bind("blur", self._stop_drag) self._knob.bind("keyrepeat", self._on_keydown) self._drag_start_pos = None self._dragging = False self._drag_start_val = 0 self.current_val = 10 # Set initial value if value is None: self.set_value( (self._min_value + self._max_value) / 2.0 ) else: self.set_value(value) self._update_knob() LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, key=u"A"): LUIObject.__init__(self) self.bgLeft = LUISprite(self, "Keymarker_Left", "skin") self.bgMid = LUISprite(self, "Keymarker", "skin") self.bgRight = LUISprite(self, "Keymarker_Right", "skin") self.label = LUILabel(parent=self, text=key, shadow=True) self.label.centered = (True, True) self.label.margin = (-3, 0, 0, -1) self.margin = (-1, 0, 0, -1) self.set_key(key) if parent is not None: self.parent = parent self.fit_to_children()
def __init__(self, inner_padding=5, scrollable=False, style=FS_raised, **kwargs): """ Creates a new frame with the given options and style. If scrollable is True, the contents of the frame will scroll if they don't fit into the frame height. inner_padding only has effect if scrollable is True. You can call fit_to_children() to make the frame fit automatically to it's contents.""" LUIObject.__init__(self) # Each *style* has a different border size (size of the shadow). The # border size shouldn't get calculated to the actual framesize, so we # are determining it first and then substracting it. # TODO: We could do this automatically, determined by the sprite size # probably? self._border_size = 0 self.padding = 10 self.solid = True prefix = "" if style == LUIFrame.FS_raised: temp = LUISprite(self, "Frame_Left", "skin") self._border_size = temp.width self.remove_child(temp) prefix = "Frame_" elif style == LUIFrame.FS_sunken: self._border_size = 0 prefix = "SunkenFrame_" else: raise Exception("Unkown LUIFrame style: " + style) self._scrollable = scrollable self._layout = LUICornerLayout(parent=self, image_prefix=prefix) self._layout.margin = -(self.padding.top + self._border_size) if self._scrollable: self._content = LUIObject(self) self._content.size = (self.width, self.height) self._content.pos = (self._border_size, self._border_size) self._scroll_content = LUIScrollableRegion( self._content, width=self.width - 2 * self.padding.left, height=self.height - 2 * self.padding.left, padding=inner_padding) self.content_node = self._scroll_content.content_node LUIInitialState.init(self, kwargs)
def __init__(self, text=u"Button", template="ButtonDefault", **kwargs): """ Constructs a new button. The template controls which sprites to use. If the template is "ButtonDefault" for example, the sprites "ButtonDefault_Left", "ButtonDefault" and "ButtonDefault_Right" will be used. The sprites used when the button is pressed should be named "ButtonDefaultFocus_Left" and so on then. If an explicit width is set on the button, the button will stick to that width, otherwise it will automatically resize to fit the label """ LUIObject.__init__(self, x=0, y=0, solid=True) self._template = template self._layout = LUIHorizontalStretchedLayout( parent=self, prefix=self._template, width="100%") self._label = LUILabel(parent=self, text=text) self._label.z_offset = 1 self._label.center_vertical = True self._label.margin = 0, 20, 0, 20 self.margin.left = -1 LUIInitialState.init(self, kwargs)
def __init__(self, text=u"Button", template="ButtonDefault", **kwargs): """ Constructs a new button. The template controls which sprites to use. If the template is "ButtonDefault" for example, the sprites "ButtonDefault_Left", "ButtonDefault" and "ButtonDefault_Right" will be used. The sprites used when the button is pressed should be named "ButtonDefaultFocus_Left" and so on then. If an explicit width is set on the button, the button will stick to that width, otherwise it will automatically resize to fit the label """ LUIObject.__init__(self, x=0, y=0, solid=True) self._template = template self._layout = LUIHorizontalStretchedLayout(parent=self, prefix=self._template, width="100%") self._label = LUILabel(parent=self, text=text) self._label.z_offset = 1 self._label.center_vertical = True self._label.margin = 0, 20, 0, 20 self.margin.left = -1 LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, width=100.0, filled=False, min_value=0, max_value=1.0, precision=2, value=None): LUIObject.__init__(self, x=0, y=0, w=width, h=0) LUICallback.__init__(self) max_numbers_before = max(len(str(int(max_value))), len(str(int(min_value)))) number_space_required = max_numbers_before if precision > 0: number_space_required += 1 + precision pixels_per_number = 7 self.precision = precision self.slider = LUISlider(self, width=width - pixels_per_number * number_space_required - 5, filled=filled, min_value=min_value, max_value=max_value, value=value) self.label = LUILabel(parent=self, shadow=True, text=u"1.23") self.label.right = 0 self.label.top = self.label.height - self.slider.height self.label.color = (1, 1, 1, 0.5) self.slider.add_change_callback(self._on_slider_changed) self.slider.add_change_callback(self._trigger_callback) self._on_slider_changed(self.slider, self.slider.get_value()) if parent is not None: self.parent = parent self.fit_to_children()
def __init__(self, parent=None, width=200, placeholder=u"Enter some text ..", value=u"", **kwargs): """ Constructs a new input field. An input field always needs a width specified """ LUIObject.__init__(self, x=0, y=0, solid=True) self.set_width(width) self._layout = LUIHorizontalStretchedLayout(parent=self, prefix="InputField", width="100%") # Container for the text self._text_content = LUIObject(self) self._text_content.margin = (5, 7, 5, 7) self._text_content.clip_bounds = (0,0,0,0) self._text_content.set_size("100%", "100%") # Scroller for the text, so we can move right and left self._text_scroller = LUIObject(parent=self._text_content) self._text_scroller.center_vertical = True self._text = LUILabel(parent=self._text_scroller, text=u"") # Cursor for the current position self._cursor = LUISprite(self._text_scroller, "blank", "skin", x=0, y=0, w=2, h=15) self._cursor.color = (0.5, 0.5, 0.5) self._cursor.margin.top = 2 self._cursor.z_offset = 20 self._cursor_index = 0 self._cursor.hide() self._value = value # Placeholder text, shown when out of focus and no value exists self._placeholder = LUILabel(parent=self._text_content, text=placeholder, shadow=False, center_vertical=True, alpha=0.2) # Various states self._tickrate = 1.0 self._tickstart = 0.0 self._render_text() if parent is not None: self.parent = parent LUIInitialState.init(self, kwargs)
def __init__(self, parent, width=200): LUIObject.__init__(self, x=0, y=0, w=width, h=1, solid=True) self._layout = LUICornerLayout(parent=self, image_prefix="Selectdrop_", width=width + 10, height=100) self._layout.margin.left = -3 self._opener = LUISprite(self, "SelectboxOpen_Right", "skin") self._opener.right = -4 self._opener.top = -25 self._opener.z_offset = 3 self._container = LUIObject(self._layout, 0, 0, 0, 0) self._container.width = self.width self._container.clip_bounds = (0,0,0,0) self._container.left = 5 self._container.solid = True self._container.bind("mousedown", lambda *args: self.request_focus()) self._selectbox = parent self._option_focus = False self.parent = self._selectbox
def __init__(self, width=200, options=None, selected_option=None, **kwargs): """ Constructs a new selectbox with a given width """ LUIObject.__init__(self, x=0, y=0, w=width + 4, solid=True) LUIInitialState.init(self, kwargs) # The selectbox has a small border, to correct this we move it self.margin.left = -2 self._bg_layout = LUIHorizontalStretchedLayout(parent=self, prefix="Selectbox", width="100%") self._label_container = LUIObject(self, x=10, y=0) self._label_container.set_size("100%", "100%") self._label_container.clip_bounds = (0, 0, 0, 0) self._label = LUILabel(parent=self._label_container, text=u"Select an option ..") self._label.center_vertical = True self._drop_menu = LUISelectdrop(parent=self, width=width) self._drop_menu.top = self._bg_layout._sprite_right.height - 7 self._drop_menu.topmost = True self._drop_open = False self._drop_menu.hide() self._options = [] self._current_option_id = None if options is not None: self._options = options self._select_option(selected_option)
def __init__(self, parent, width=200): LUIObject.__init__(self, x=0, y=0, w=width, h=1, solid=True) self._layout = LUICornerLayout(parent=self, image_prefix="Selectdrop_", width=width + 10, height=100) self._layout.margin.left = -3 self._opener = LUISprite(self, "SelectboxOpen_Right", "skin") self._opener.right = -4 self._opener.top = -25 self._opener.z_offset = 3 self._container = LUIObject(self._layout, 0, 0, 0, 0) self._container.width = self.width self._container.clip_bounds = (0, 0, 0, 0) self._container.left = 5 self._container.solid = True self._container.bind("mousedown", lambda *args: self.request_focus()) self._selectbox = parent self._option_focus = False self.parent = self._selectbox
def __init__(self, parent=None, filled=True, min_value=0.0, max_value=1.0, width=100.0, value=None, **kwargs): """ Constructs a new slider. If filled is True, the part behind the knob will be solid """ LUIObject.__init__(self, x=0, y=0, solid=True) self.set_width(width) self._knob = LUISprite(self, "SliderKnob", "skin") self._knob.z_offset = 2 self._knob.solid = True # Construct the background self._slider_bg = LUIHorizontalStretchedLayout(parent=self, prefix="SliderBg", center_vertical=True, width="100%", margin=(-1, 0, 0, 0)) self._filled = filled self._min_value = min_value self._max_value = max_value self._side_margin = self._knob.width / 4 self._effective_width = self.width - 2 * self._side_margin if self._filled: self._slider_fill = LUIObject(self) self._fill_left = LUISprite(self._slider_fill, "SliderBgFill_Left", "skin") self._fill_mid = LUISprite(self._slider_fill, "SliderBgFill", "skin") self._fill_mid.left = self._fill_left.width self._slider_fill.z_offset = 1 self._slider_fill.center_vertical = True if parent is not None: self.parent = parent # Handle various events self._knob.bind("mousedown", self._start_drag) self._knob.bind("mousemove", self._update_drag) self._knob.bind("mouseup", self._stop_drag) self._knob.bind("keydown", self._on_keydown) self._knob.bind("blur", self._stop_drag) self._knob.bind("keyrepeat", self._on_keydown) self._drag_start_pos = None self._dragging = False self._drag_start_val = 0 self.current_val = 10 # Set initial value if value is None: self.set_value((self._min_value + self._max_value) / 2.0) else: self.set_value(value) self._update_knob() LUIInitialState.init(self, kwargs)
def __init__(self, parent=None, width=100, height=100, padding=10, **kwargs): LUIObject.__init__(self) self.set_size(width, height) self._content_parent = LUIObject(self) self._content_parent.set_size("100%", "100%") self._content_parent.clip_bounds = (0, 0, 0, 0) self._content_clip = LUIObject(self._content_parent, x=padding, y=padding) self._content_clip.set_size("100%", "100%") self._content_scroller = LUIObject(self._content_clip) self._content_scroller.width = "100%" self._scrollbar = LUIObject(self, x=0, y=0, w=20) self._scrollbar.height = "100%" self._scrollbar.right = -10 self._scrollbar_bg = LUISprite(self._scrollbar, "blank", "skin") self._scrollbar_bg.color = (1, 1, 1, 0.05) self._scrollbar_bg.set_size(3, "100%") self._scrollbar_bg.center_horizontal = True # Handle self._scrollbar_handle = LUIObject(self._scrollbar, x=5, y=0, w=10) self._scroll_handle_top = LUISprite(self._scrollbar_handle, "ScrollbarHandle_Top", "skin") self._scroll_handle_mid = LUISprite(self._scrollbar_handle, "ScrollbarHandle", "skin") self._scroll_handle_bottom = LUISprite(self._scrollbar_handle, "ScrollbarHandle_Bottom", "skin") self._scrollbar_handle.solid = True self._scrollbar.solid = True self._scrollbar_handle.bind("mousedown", self._start_scrolling) self._scrollbar_handle.bind("mouseup", self._stop_scrolling) self._scrollbar.bind("mousedown", self._on_bar_click) self._scrollbar.bind("mouseup", self._stop_scrolling) self._handle_dragging = False self._drag_start_y = 0 self._scroll_top_position = 0 self._content_height = 400 # Scroll shadow self._scroll_shadow_top = LUIHorizontalStretchedLayout( parent=self, prefix="ScrollShadowTop", width="100%") self._scroll_shadow_bottom = LUIHorizontalStretchedLayout( parent=self, prefix="ScrollShadowBottom", width="100%") self._scroll_shadow_bottom.bottom = 0 self._handle_height = 100 if parent is not None: self.parent = parent LUIInitialState.init(self, kwargs) self.content_node = self._content_scroller taskMgr.doMethodLater(0.05, lambda task: self._update(), "update_scrollbar")
def __init__(self, **kwargs): """ Creates a new formatted label. """ LUIObject.__init__(self) LUIInitialState.init(self, kwargs) self._cursor = LVecBase2i(0) self._last_size = 14