Delete plugins/utilities/bs_text_on_map.py

This commit is contained in:
Anas 2026-02-07 14:25:15 +01:00 committed by GitHub
parent 03051f2da1
commit c3944b93e9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,677 +0,0 @@
# ba_meta require api 9
# by ATD
from __future__ import annotations
from bascenev1lib.actor.spaz import Spaz
from bauiv1lib.popup import PopupWindow
from bauiv1lib.confirm import ConfirmWindow
from babase._mgen.enums import SpecialChar
from bauiv1lib.settings import advanced
import os
import json
import weakref
import datetime
import time
import random
import _babase
import bascenev1 as bs
import bauiv1 as bui
import babase
from typing import TYPE_CHECKING
if TYPE_CHECKING:
pass
plugman = dict(
plugin_name="bs_text_on_map",
description="now your able to add text on every maps",
external_url="",
authors=[
{"name": "ATD", "email": "anasdhaoidi001@gmail.com", "discord": ""},
],
version="1.5.0",
)
def getlanguage(txt):
lang = bs.app.lang.language
texts = {"Tittle": {"Spanish": "Añade tus textos",
"English": "Add your texts",
"Portuguese": "Adicione seus textos"},
"Tittle2": {"Spanish": "Todos tus textos guardados",
"English": "All your saved texts",
"Portuguese": "Todos os seus textos salvos"},
"Confirm": {"Spanish": "¿Estás seguro de querer \n borrar todos los textos?",
"English": "Are you sure you want to delete all the texts?",
"Portuguese": "Tem certeza de que deseja excluir todos os textos?"},
"Add Text": {"Spanish": "Texto Guardardo",
"English": "Saved Text",
"Portuguese": "Texto Salvo"},
"Del Tex": {"Spanish": "Texto eliminado",
"English": "Text removed",
"Portuguese": "Texto removido"},
"Double Text": {"Spanish": "Este texto ya existe",
"English": "This text already exists",
"Portuguese": "Este texto já existe"},
"Nothing text": {"Spanish": "Ya no hay textos",
"English": "There are no texts",
"Portuguese": "Não há textos"},
"Confirm date": {"Spanish": "Todos los textos han sido eliminados",
"English": "All texts have been removed",
"Portuguese": "Todos os textos foram removidos"},
"Multicolor Text": {"Spanish": "Color Cambiante",
"English": "Changing Color",
"Portuguese": "Mudança de cor"},
"Add": {"Spanish": "Agregar",
"English": "Add",
"Portuguese": "Adicionar"},
"Del": {"Spanish": "Borrar",
"English": "Delete",
"Portuguese": "Excluir"},
"Del All": {"Spanish": "Borrar todo",
"English": "Delete everything",
"Portuguese": "Limpar tudo"},
"Flags": {"Spanish": "Banderas",
"English": "Flags",
"Portuguese": "Bandeiras"},
"Icons": {"Spanish": "Íconos",
"English": "Icons",
"Portuguese": "Ícones"},
"Picker Color": {"Spanish": "Escoge tu color personalizado",
"English": "Choose your custom color",
"Portuguese": "Escolha sua cor personalizada"},
"Tittle3": {"Spanish": "Añade un texto aquí",
"English": "Add text here",
"Portuguese": "Adicione texto aqui"}}
language = ['Spanish', 'Portuguese', 'English']
if lang not in language:
lang = 'English'
return texts[txt][lang]
def thanks():
return ['By ATD']
def getcolors():
return {"Rojo":
(1, 0, 0),
"Naranja":
(1, 0.5, 0),
"Amarillo":
(1, 1, 0),
"Verde":
(0, 1, 0),
"Azul":
(0, 1, 1),
"Indigo":
(0.5, 0.5, 1),
"Violeta":
(1, 0, 1)}
def configs():
return [("Window", True),
("Multicolor", False),
("Texts", 'TextMod'),
("Icon List", 'Icons'),
("Texts List", thanks()),
("Colors", (1, 1, 1)),
("Color Text", {thanks()[0]: (1, 1, 1)})]
cfg = babase.app.config
for config, settings in configs():
if cfg.get(config) is None:
cfg[config] = settings
cfg.apply_and_commit()
def random_colors():
c = [(1, 0, 0), (1, 0.5, 0), (1, 1, 0), (0, 1, 0),
(0, 1, 1), (0.5, 0.5, 1), (0, 0, 1), (1, 0, 1)]
return random.choice(c)
def random_texts():
return random.choice(cfg['Texts List'])
def colors(color):
c = [(1, 0, 0), (1, 0.5, 0), (1, 1, 0), (0, 1, 0),
(0, 1, 1), (0.5, 0.5, 1), (0, 0, 1), (1, 0, 1)]
return c[color]
def window(self):
self.up_time_color = None
bui.containerwidget(edit=self._root_widget, transition='out_left')
TextWindow()
def set_icons():
return [_babase.charstr(SpecialChar.CROWN),
_babase.charstr(SpecialChar.DRAGON),
_babase.charstr(SpecialChar.SKULL),
_babase.charstr(SpecialChar.HEART),
_babase.charstr(SpecialChar.FEDORA),
_babase.charstr(SpecialChar.HAL),
_babase.charstr(SpecialChar.YIN_YANG),
_babase.charstr(SpecialChar.EYE_BALL),
_babase.charstr(SpecialChar.HELMET),
_babase.charstr(SpecialChar.MUSHROOM),
_babase.charstr(SpecialChar.NINJA_STAR),
_babase.charstr(SpecialChar.VIKING_HELMET),
_babase.charstr(SpecialChar.MOON),
_babase.charstr(SpecialChar.SPIDER),
_babase.charstr(SpecialChar.FIREBALL),
_babase.charstr(SpecialChar.MIKIROG),
"\ue026", "\ue020", "\ue01e", "\ue027"]
def set_flags():
return [_babase.charstr(SpecialChar.FLAG_MEXICO),
_babase.charstr(SpecialChar.FLAG_UNITED_STATES),
_babase.charstr(SpecialChar.FLAG_CANADA),
_babase.charstr(SpecialChar.FLAG_ARGENTINA),
_babase.charstr(SpecialChar.FLAG_CHILE),
_babase.charstr(SpecialChar.FLAG_BRAZIL),
_babase.charstr(SpecialChar.FLAG_RUSSIA),
_babase.charstr(SpecialChar.FLAG_JAPAN),
_babase.charstr(SpecialChar.FLAG_CHINA),
_babase.charstr(SpecialChar.FLAG_SOUTH_KOREA),
_babase.charstr(SpecialChar.FLAG_GERMANY),
_babase.charstr(SpecialChar.FLAG_UNITED_KINGDOM),
_babase.charstr(SpecialChar.FLAG_INDIA),
_babase.charstr(SpecialChar.FLAG_FRANCE),
_babase.charstr(SpecialChar.FLAG_INDONESIA),
_babase.charstr(SpecialChar.FLAG_ITALY),
_babase.charstr(SpecialChar.FLAG_NETHERLANDS),
_babase.charstr(SpecialChar.FLAG_QATAR),
_babase.charstr(SpecialChar.FLAG_ALGERIA),
_babase.charstr(SpecialChar.FLAG_KUWAIT),
_babase.charstr(SpecialChar.FLAG_EGYPT),
_babase.charstr(SpecialChar.FLAG_MALAYSIA),
_babase.charstr(SpecialChar.FLAG_CZECH_REPUBLIC),
_babase.charstr(SpecialChar.FLAG_AUSTRALIA),
_babase.charstr(SpecialChar.FLAG_SINGAPORE),
_babase.charstr(SpecialChar.FLAG_IRAN),
_babase.charstr(SpecialChar.FLAG_POLAND),
_babase.charstr(SpecialChar.FLAG_PHILIPPINES),
_babase.charstr(SpecialChar.FLAG_SAUDI_ARABIA),
_babase.charstr(SpecialChar.FLAG_UNITED_ARAB_EMIRATES)]
class TextWindow(PopupWindow):
def __init__(self, transition='in_right'):
self._transition = transition
self._container = None
self._refresh()
def _refresh(self):
if self._container is not None and self._container.exists():
self._container.delete()
app = bui.app.ui_v1
uiscale = app.uiscale
self._width = width = 800
self._height = height = 500
self._sub_height = 200
self._scroll_width = self._width*0.90
self._scroll_height = self._height - 180
self._sub_width = self._scroll_width*0.95
self._window = cfg['Window']
self._name = cfg['Texts List']
self._root_widget = bui.containerwidget(size=(width+90, height+80), transition=self._transition,
scale=1.5 if uiscale is babase.UIScale.SMALL else 1.0,
stack_offset=(0, -30) if uiscale is babase.UIScale.SMALL else (0, 0))
self._backButton = b = bui.buttonwidget(parent=self._root_widget, autoselect=True,
position=(60, self._height-50), size=(130, 60),
scale=0.8, text_scale=1.2, label=babase.Lstr(resource='backText'),
button_type='back', on_activate_call=babase.CallPartial(self._back))
bui.buttonwidget(edit=self._backButton, button_type='backSmall', size=(
60, 60), label=babase.charstr(babase.SpecialChar.BACK))
bui.containerwidget(edit=self._root_widget, cancel_button=b)
self.titletext = bui.textwidget(parent=self._root_widget, position=(40, height), size=(width, 50),
h_align="center", color=bui.app.ui_v1.title_color, v_align="center", maxwidth=width*1.3)
self.oth = bui.buttonwidget(parent=self._root_widget, autoselect=True,
position=(55, self._height-130), size=(60, 60),
color=(0, 0, 1) if self._window else (0, 1, 1), scale=0.8, label='', button_type='square',
texture=bui.gettexture('replayIcon'), on_activate_call=babase.CallPartial(self._other))
self._scrollwidget = bui.scrollwidget(parent=self._root_widget,
position=(self._width*0.14, 51*1.7),
size=(self._sub_width, self._scroll_height+100), selection_loops_to_parent=True)
self._tab_container = None
self._set_window(self._window)
def _other(self):
if self._window:
self._window = False
bui.buttonwidget(edit=self.oth, color=(0, 1, 1))
self._saved_text()
else:
self._window = True
bui.buttonwidget(edit=self.oth, color=(0, 0, 1))
self._set_window(self._window)
cfg.apply_and_commit()
def _set_window(self, tag):
cfg['Window'] = tag
cfg.apply_and_commit()
if self._tab_container is not None and self._tab_container.exists():
self._tab_container.delete()
self.text_time = None
if tag:
sub_height = 300
v = sub_height - 55
width = 300
bui.textwidget(edit=self.titletext, text=getlanguage('Tittle'))
self._tab_container = c = bui.containerwidget(parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
up = 60
upx = 10
t = bui.textwidget(parent=c, position=(60*2.2+upx, v-80+up), size=(205 * 1.8, 53), h_align="center",
color=bui.app.ui_v1.title_color, text=getlanguage('Tittle3'), v_align="center", maxwidth=width*1.6)
self.editable_text = bui.textwidget(parent=c, position=(60*2.2+upx, v-70*2+up), size=(205 * 1.8, 53), selectable=True,
editable=True, max_chars=40, description=babase.Lstr(resource='editProfileWindow.nameText'),
h_align="center", color=(1, 1, 1), text=cfg['Texts'], v_align="center", maxwidth=width*1.6)
b = bui.buttonwidget(parent=c, autoselect=True,
position=(120*3.4+upx, v-70*2.7+up), size=(130, 60),
color=(0, 1, 0), scale=0.8, label=getlanguage('Add'), button_type='square',
textcolor=bui.app.ui_v1.title_color, on_activate_call=babase.CallPartial(self.do_not_duplicate, 'Color'))
b2 = bui.buttonwidget(parent=c, autoselect=True,
position=(120*2.2+upx, v-70*2.7+up), size=(130, 60),
color=(1, 1, 0), scale=0.8, label=getlanguage('Del'), button_type='square',
textcolor=bui.app.ui_v1.title_color, on_activate_call=babase.CallPartial(self._remove))
b3 = bui.buttonwidget(parent=c, autoselect=True,
position=(120*1+upx, v-70*2.7+up), size=(130, 60),
color=(1, 0, 0), scale=0.8, label=getlanguage('Del All'), button_type='square',
textcolor=bui.app.ui_v1.title_color, on_activate_call=babase.CallPartial(self._remove_all))
self.iconpos = (120*4.4, v-70*1.1)
b4 = bui.buttonwidget(parent=c, autoselect=True,
position=self.iconpos, size=(60, 60),
color=(0.52, 0.48, 0.63), scale=0.8, label=set_icons()[1],
button_type='square', on_activate_call=babase.CallPartial(self._icon))
u = -30
self.check = bui.checkboxwidget(parent=c, position=(120*1.8, v-70*4-u), value=cfg['Multicolor'],
on_value_change_call=babase.CallPartial(self._switches, 'Multicolor'), maxwidth=self._scroll_width*0.9,
text=getlanguage('Multicolor Text'), autoselect=True)
else:
if len(self._name) >= 8:
sub_height = (len(self._name) / 0.5 * 30)
else:
sub_height = 400
width = 700
v = sub_height - 55
self.texts_widgets = {}
bui.textwidget(edit=self.titletext, text=getlanguage('Tittle2'))
self._tab_container = c = bui.containerwidget(parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
position = 0
for names in self._name:
self.txtnames = bui.textwidget(parent=c, position=(-40, v-position), size=(width, 50), selectable=True,
h_align="center", color=cfg['Color Text'][names], text=names, v_align="center", maxwidth=width*1.6)
self.texts_widgets[names] = self.txtnames
position += 60
if self.texts_widgets == {}:
self.text_time = None
else:
if cfg['Multicolor']:
with babase.ContextRef.empty():
self.text_time = bs.Timer(0.1, babase.CallPartial(
self.text_update_color), repeat=True)
else:
pass
def _multicolor(self):
if cfg['Multicolor']:
cfg['Multicolor'] = False
bui.buttonwidget(edit=self.button_color, color=(1, 0, 0))
else:
bui.buttonwidget(edit=self.button_color, color=(0, 1, 0))
cfg['Multicolor'] = True
def _switches(self, tag, m):
cfg[tag] = False if m == 0 else True
try:
apg.apply_and_commit()
except NameError:
pass
def _save(self):
self._name.append(cfg['Texts'])
bs.broadcastmessage(f"{getlanguage('Add Text')}: {self._name[-1]}", cfg['Colors'])
cfg['Color Text'][self._name[-1]] = cfg['Colors']
bui.getsound('gunCocking').play()
cfg.apply_and_commit()
def _remove(self):
if len(self._name) == 0:
bs.broadcastmessage(getlanguage('Nothing text'), (1, 0, 0))
else:
bs.broadcastmessage(f"{getlanguage('Del Tex')}: {self._name[-1]}", (1, 0, 0))
del cfg['Color Text'][self._name[-1]]
self._name.pop()
def _remove_all(self):
def confirm():
delname = []
for x in cfg['Texts List']:
delname.append(x)
for n in delname:
del cfg['Color Text'][n]
cfg['Texts List'].remove(n)
bs.broadcastmessage(getlanguage('Confirm date'), (1, 1, 0))
cfg.apply_and_commit()
ConfirmWindow(getlanguage('Confirm'),
width=400, height=120, action=confirm, ok_text=babase.Lstr(resource='okText'))
def do_not_duplicate(self, c):
self._saved_text()
if cfg['Texts'] not in self._name:
self._make_picker(c)
else:
bui.getsound('error').play()
bs.broadcastmessage(getlanguage('Double Text'), (1, 1, 0))
def _make_picker(self, tag):
from bauiv1lib.colorpicker import ColorPicker
if tag == 'Color':
initial_color = cfg['Colors']
ColorPicker(parent=self._root_widget, position=(0, 0),
initial_color=initial_color, delegate=self, tag=tag)
def color_picker_closing(self, picker):
pass
def color_picker_selected_color(self, picker, color):
tag = picker.get_tag()
if tag == 'Color':
cfg['Colors'] = color
self._save()
def _saved_text(self):
if hasattr(self, 'editable_text') and self.editable_text:
self._name_editable = bui.textwidget(query=self.editable_text)
cfg['Texts'] = self._name_editable
def text_update_color(self):
for update in self._name:
bui.textwidget(edit=self.texts_widgets[update], color=(random_colors()))
def _icon(self):
IconWindow(pos=(self.iconpos[0]-60*6, self.iconpos[1]-60*2),
callback=babase.CallPartial(window, self))
self._saved_text()
def _back(self):
self.text_time = None
bui.containerwidget(edit=self._root_widget, transition='out_left')
advanced.AdvancedSettingsWindow()
if hasattr(self, '_saved_text'):
self._saved_text()
class IconWindow(PopupWindow):
def __init__(self, pos=(0, 0), callback=None):
self.callback = callback
uiscale = bui.app.ui_v1.uiscale
self._transitioning_out = False
scale = 2 if uiscale is babase.UIScale.SMALL else 1.3
ipos = 0
self._width = 380
self._height = 300
sub_width = self._width - 90
sub_height = 100*6
v = sub_height - 30
bg_color = (0.5, 0.4, 0.6)
self._current_tab = cfg['Icon List']
self.collect = {}
PopupWindow.__init__(self, position=pos,
size=(self._width, self._height),
scale=scale, bg_color=bg_color)
self._cancel_button = bui.buttonwidget(parent=self.root_widget,
position=(50, self._height - 30), size=(50, 50),
scale=0.5, label=babase.charstr(babase.SpecialChar.BACK), button_type='backSmall',
color=(1, 0, 0), on_activate_call=self.on_popup_cancel, autoselect=True)
bui.containerwidget(edit=self.root_widget, cancel_button=self._cancel_button)
self._scrollwidget = bui.scrollwidget(parent=self.root_widget,
size=(self._width - 60,
self._height - 70),
position=(30, 30))
iconlist = [("Icons", getlanguage('Icons')), ("Flags", getlanguage('Flags'))]
for x, j in iconlist:
self.collect[x] = bui.buttonwidget(parent=self.root_widget, size=(150*1.3, 60),
scale=0.5, position=(60*1.5+ipos, self._height - 45), label=j,
button_type='tab', enable_sound=False, autoselect=True,
on_activate_call=babase.CallPartial(self._set_tab, x, sound=True))
ipos += 100
self._subcontainer = None
self._set_tab(self._current_tab)
def _set_tab(self, tab, sound=False):
self.sound = sound
cfg['Icon List'] = tab
cfg.apply_and_commit()
if self._subcontainer is not None and self._subcontainer.exists():
self._subcontainer.delete()
if self.sound:
self._tick_and_call()
if tab == 'Icons':
sub_height = 240
v = sub_height - 50
u = 10
self._subcontainer = c = bui.containerwidget(parent=self._scrollwidget,
size=(self._width, sub_height),
background=False)
pos1 = 0
for icon1 in range(5):
b = bui.buttonwidget(parent=c, position=(u+pos1, v), size=(40, 40), button_type='square',
label=set_icons()[icon1], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._icons, icon1), autoselect=True)
pos1 += 60
pos2 = 0
for icon2 in range(5, 10):
b = bui.buttonwidget(parent=c, position=(u+pos2, v-60), size=(40, 40), button_type='square',
label=set_icons()[icon2], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._icons, icon2), autoselect=True)
pos2 += 60
pos3 = 0
for icon3 in range(10, 15):
b = bui.buttonwidget(parent=c, position=(u+pos3, v-60*2), size=(40, 40), button_type='square',
label=set_icons()[icon3], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._icons, icon3), autoselect=True)
pos3 += 60
pos4 = 0
for icon4 in range(15, 20):
b = bui.buttonwidget(parent=c, position=(u+pos4, v-60*3), size=(40, 40), button_type='square',
label=set_icons()[icon4], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._icons, icon4), autoselect=True)
pos4 += 60
elif tab == 'Flags':
sub_height = 360
v = sub_height - 50
u = 10
self._subcontainer = c = bui.containerwidget(parent=self._scrollwidget,
size=(self._width, sub_height),
background=False)
pos1 = 0
for flag1 in range(5):
b = bui.buttonwidget(parent=c, position=(u+pos1, v), size=(40, 40), button_type='square',
label=set_flags()[flag1], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._flags, flag1), autoselect=True)
pos1 += 60
pos2 = 0
for flag2 in range(5, 10):
b = bui.buttonwidget(parent=c, position=(u+pos2, v-60), size=(40, 40), button_type='square',
label=set_flags()[flag2], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._flags, flag2), autoselect=True)
pos2 += 60
pos3 = 0
for flag3 in range(10, 15):
b = bui.buttonwidget(parent=c, position=(u+pos3, v-60*2), size=(40, 40), button_type='square',
label=set_flags()[flag3], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._flags, flag3), autoselect=True)
pos3 += 60
pos4 = 0
for flag4 in range(15, 20):
b = bui.buttonwidget(parent=c, position=(u+pos4, v-60*3), size=(40, 40), button_type='square',
label=set_flags()[flag4], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._flags, flag4), autoselect=True)
pos4 += 60
pos5 = 0
for flag5 in range(20, 25):
b = bui.buttonwidget(parent=c, position=(u+pos5, v-60*4), size=(40, 40), button_type='square',
label=set_flags()[flag5], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._flags, flag5), autoselect=True)
pos5 += 60
pos6 = 0
for flag6 in range(25, 30):
b = bui.buttonwidget(parent=c, position=(u+pos6, v-60*5), size=(40, 40), button_type='square',
label=set_flags()[flag6], color=(0.8, 0.8, 0.8), on_activate_call=babase.CallPartial(self._flags, flag6), autoselect=True)
pos6 += 60
for icons in self.collect:
if icons == tab:
bui.buttonwidget(edit=self.collect[icons], color=(0.5, 0.4, 0.93))
else:
bui.buttonwidget(edit=self.collect[icons], color=(0.52, 0.48, 0.63))
def _icons(self, icon):
cfg['Texts'] += set_icons()[icon]
self._on_cancel_press()
def _flags(self, flag):
cfg['Texts'] += set_flags()[flag]
self._on_cancel_press()
def _tick_and_call(self):
bui.getsound('click01').play()
def _on_cancel_press(self) -> None:
self._transition_out()
self.callback()
def _transition_out(self) -> None:
if not self._transitioning_out:
self._transitioning_out = True
bui.containerwidget(edit=self.root_widget, transition='out_scale')
def on_popup_cancel(self) -> None:
bui.getsound('swish').play()
self._transition_out()
GLOBAL = {"Alm": list()}
super_map = bs.Map.__init__
def text_init(self, *args, **kwargs):
super_map(self, *args, **kwargs)
texts = cfg['Texts List']
color_texts = cfg['Color Text']
GLOBAL['Alm'] = []
def text(scale=1.5,
position=(0, -200),
shadow=1, h_align='center'):
random_txt = random_texts()
self.txt = bs.newnode('text',
attrs={'text': random_txt,
'scale': scale,
'shadow': shadow,
'color': cfg['Color Text'][random_txt],
'position': position,
'h_align': h_align})
bs.animate(self.txt, 'opacity',
{0: 0, 2: 0, 2.5: 1, 27: 1, 28: 0}, True)
if cfg['Multicolor']:
bs.animate_array(self.txt, "color", 3,
{0: colors(0), 1: colors(1), 2: colors(2), 3: colors(3), 4: colors(4),
5: colors(5), 6: colors(6), 7: colors(7), 8: colors(0)},
loop=True)
if any(texts) or any(color_texts):
text()
def update():
alm = GLOBAL['Alm']
while (True):
if len(texts) == len(alm):
alm = []
t = random_texts()
if t not in alm:
self.txt.text = t
alm.append(t)
break
GLOBAL['Alm'] = [alm[-1]]
self.uptime = bs.Timer(28.0,
babase.CallPartial(update), repeat=True)
def add_plugin():
try:
bs.timer(2.5, lambda e=e: bs.broadcastmessage('Error plugin: ' + str(e), (1, 0, 0)))
except:
pass
try:
with babase.ContextRef.empty():
bs.timer(2.5, lambda: bs.broadcastmessage('Error plugin', (1, 0, 0)))
except:
pass
# ba_meta export babase.Plugin
class Text(babase.Plugin):
bs.Map.__init__ = text_init
def __init__(self) -> None:
add_plugin()
def has_settings_ui(self):
return True
def show_settings_ui(self, origin_widget):
TextWindow()