mirror of
https://github.com/bombsquad-community/plugin-manager.git
synced 2026-08-15 13:03:08 +00:00
ok
This commit is contained in:
parent
bb28e48969
commit
ac3de42739
1 changed files with 554 additions and 148 deletions
|
|
@ -1,8 +1,5 @@
|
|||
# ba_meta require api 9
|
||||
import babase
|
||||
import _babase
|
||||
import _bauiv1
|
||||
import _bascenev1
|
||||
import bauiv1 as bui
|
||||
from bauiv1lib import popup, confirm
|
||||
from babase._meta import EXPORT_CLASS_NAME_SHORTCUTS
|
||||
|
|
@ -23,7 +20,7 @@ import pathlib
|
|||
import hashlib
|
||||
import contextlib
|
||||
|
||||
from typing import cast, override
|
||||
from typing import override
|
||||
from datetime import datetime
|
||||
|
||||
# Modules used for overriding AllSettingsWindow
|
||||
|
|
@ -35,9 +32,11 @@ REPOSITORY_URL = "https://github.com/bombsquad-community/plugin-manager"
|
|||
# plugin manager repo for testing purpose.
|
||||
CURRENT_TAG = "main"
|
||||
|
||||
_env = _babase.env()
|
||||
_env = babase.env()
|
||||
_app_api_version = babase.app.env.api_version
|
||||
|
||||
PLUGIN_ISSUE_TEMPLATE = "plugin-bug-report.md"
|
||||
GITHUB_ISSUE_META = "{repository_url}/issues/new?template={issue_template}"
|
||||
INDEX_META = "{repository_url}/{content_type}/{tag}/index.json"
|
||||
CHANGELOG_META = "{repository_url}/{content_type}/{tag}/CHANGELOG.md"
|
||||
HEADERS = {
|
||||
|
|
@ -48,20 +47,21 @@ loop = babase._asyncio._asyncio_event_loop
|
|||
|
||||
open_popups = []
|
||||
|
||||
|
||||
def _add_popup(popup): open_popups.append(popup)
|
||||
|
||||
|
||||
def _add_popup(popup):
|
||||
open_popups.append(popup)
|
||||
def _remove_popup(popup):
|
||||
try:
|
||||
open_popups.remove(popup)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
def _uiscale(): return bui.app.ui_v1.uiscale
|
||||
def _regexp_friendly_class_name_shortcut(string): return string.replace(".", "\\.")
|
||||
|
||||
def _by_scale(a,b,c):
|
||||
return (
|
||||
a if _uiscale is babase.UIScale.SMALL else
|
||||
b if _uiscale is babase.UIScale.MEDIUM else
|
||||
c
|
||||
)
|
||||
|
||||
REGEXP = {
|
||||
"plugin_api_version": re.compile(b"(?<=ba_meta require api )(.*)"),
|
||||
|
|
@ -425,7 +425,7 @@ class Category:
|
|||
self.get_plugins(),
|
||||
)
|
||||
except KeyError:
|
||||
raise CategoryMetadataParseError(f"Failed to parse JSON; missing required fields.")
|
||||
raise CategoryMetadataParseError("Failed to parse JSON; missing required fields.")
|
||||
else:
|
||||
return True
|
||||
|
||||
|
|
@ -1296,38 +1296,50 @@ class PluginWindow(popup.PopupWindow):
|
|||
self.plugins_list[i+1] if (i+1 < len(self.plugins_list)) else None
|
||||
]
|
||||
|
||||
if self.p_n_plugins is not None:
|
||||
if self.p_n_plugins[0] is not None:
|
||||
previous_plugin_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(-12.5*s + (4 if _uiscale() is babase.UIScale.SMALL else -5),
|
||||
height/2 - 20*s),
|
||||
label=bui.charstr(bui.SpecialChar.LEFT_ARROW),
|
||||
size=(25, 40),
|
||||
color=(1, 0.5, 0.5),
|
||||
scale=s,
|
||||
on_activate_call=self.show_previous_plugin,
|
||||
enable_sound=False,
|
||||
textcolor=(1,1,1)
|
||||
)
|
||||
# initialize all widgets
|
||||
previous_plugin_button = None
|
||||
next_plugin_button = None
|
||||
author_text_control_btn = None
|
||||
button1 = None
|
||||
button2 = None
|
||||
button3 = None
|
||||
more_button = None
|
||||
settings_button = None
|
||||
tutorial_button = None
|
||||
|
||||
if self.p_n_plugins[1] is not None:
|
||||
next_plugin_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(width - 12.5*s - (8 if _uiscale()
|
||||
is babase.UIScale.SMALL else 0), height/2 - 20*s),
|
||||
label=bui.charstr(bui.SpecialChar.RIGHT_ARROW),
|
||||
size=(25, 40),
|
||||
color=(1, 0.5, 0.5),
|
||||
scale=s,
|
||||
on_activate_call=self.show_next_plugin,
|
||||
enable_sound=False,
|
||||
textcolor=(1,1,1)
|
||||
)
|
||||
# previous plugin button
|
||||
if self.p_n_plugins[0] is not None:
|
||||
previous_plugin_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(-12.5*s + (4 if _uiscale() is babase.UIScale.SMALL else -5),
|
||||
height/2 - 20*s),
|
||||
label=bui.charstr(bui.SpecialChar.LEFT_ARROW),
|
||||
size=(25, 40),
|
||||
color=(1, 0.5, 0.5),
|
||||
scale=s,
|
||||
on_activate_call=self.show_previous_plugin,
|
||||
enable_sound=False,
|
||||
textcolor=(1,1,1)
|
||||
)
|
||||
|
||||
# next plugin button
|
||||
if self.p_n_plugins[1] is not None:
|
||||
next_plugin_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(width - 12.5*s - (8 if _uiscale()
|
||||
is babase.UIScale.SMALL else 0), height/2 - 20*s),
|
||||
label=bui.charstr(bui.SpecialChar.RIGHT_ARROW),
|
||||
size=(25, 40),
|
||||
color=(1, 0.5, 0.5),
|
||||
scale=s,
|
||||
on_activate_call=self.show_next_plugin,
|
||||
enable_sound=False,
|
||||
textcolor=(1,1,1)
|
||||
)
|
||||
|
||||
pos = height * 0.85
|
||||
plug_name = self.plugin.name.replace('_', ' ').title()
|
||||
plugin_title = f"{plug_name} (v{self.plugin.latest_compatible_version.number})"
|
||||
plugin_title = plug_name
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(width * 0.49, pos),
|
||||
|
|
@ -1337,10 +1349,11 @@ class PluginWindow(popup.PopupWindow):
|
|||
text=plugin_title,
|
||||
scale=text_scale * 1.25,
|
||||
color=color,
|
||||
maxwidth=width * 0.9
|
||||
maxwidth=width * 0.7 - 40
|
||||
)
|
||||
pos -= 25
|
||||
# Author
|
||||
|
||||
# author
|
||||
text = 'by ' + ', '.join([author["name"] for author in self.plugin.info["authors"]])
|
||||
author_text_control_btn = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
|
|
@ -1363,7 +1376,8 @@ class PluginWindow(popup.PopupWindow):
|
|||
draw_controller=author_text_control_btn,
|
||||
)
|
||||
pos -= 60
|
||||
# Info
|
||||
|
||||
# info
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(width * 0.49, pos),
|
||||
|
|
@ -1375,6 +1389,7 @@ class PluginWindow(popup.PopupWindow):
|
|||
color=color,
|
||||
maxwidth=width * 0.95
|
||||
)
|
||||
|
||||
b1_color = None
|
||||
b2_color = (0.8, 0.15, 0.35)
|
||||
b3_color = (0.2, 0.8, 0.3)
|
||||
|
|
@ -1382,7 +1397,9 @@ class PluginWindow(popup.PopupWindow):
|
|||
button_size = (80 * s, 40 * s)
|
||||
|
||||
to_draw_button1 = True
|
||||
to_draw_button4 = False
|
||||
to_draw_settings_button = False
|
||||
has_update = False
|
||||
|
||||
if self.plugin.is_installed:
|
||||
self.local_plugin = self.plugin.get_local()
|
||||
if not await self.local_plugin.has_plugins():
|
||||
|
|
@ -1393,7 +1410,7 @@ class PluginWindow(popup.PopupWindow):
|
|||
b1_color = (0.6, 0.53, 0.63)
|
||||
button1_action = self.disable
|
||||
if self.local_plugin.has_settings():
|
||||
to_draw_button4 = True
|
||||
to_draw_settings_button = True
|
||||
else:
|
||||
button1_label = "Enable"
|
||||
button1_action = self.enable
|
||||
|
|
@ -1407,8 +1424,9 @@ class PluginWindow(popup.PopupWindow):
|
|||
button1_label = "Install"
|
||||
button1_action = self.install
|
||||
|
||||
# button1
|
||||
if to_draw_button1:
|
||||
selected_btn = bui.buttonwidget(
|
||||
button1 = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(
|
||||
width * (0.1 if self.plugin.is_installed and has_update else
|
||||
|
|
@ -1423,8 +1441,9 @@ class PluginWindow(popup.PopupWindow):
|
|||
label=button1_label
|
||||
)
|
||||
|
||||
# button2
|
||||
if self.plugin.is_installed:
|
||||
selected_btn = bui.buttonwidget(
|
||||
button2 = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(
|
||||
width * (0.4 if has_update or not to_draw_button1 else 0.55), pos),
|
||||
|
|
@ -1437,8 +1456,9 @@ class PluginWindow(popup.PopupWindow):
|
|||
label=button2_label
|
||||
)
|
||||
|
||||
# button3
|
||||
if has_update:
|
||||
selected_btn = bui.buttonwidget(
|
||||
button3 = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(width * 0.7, pos),
|
||||
size=button_size,
|
||||
|
|
@ -1451,112 +1471,71 @@ class PluginWindow(popup.PopupWindow):
|
|||
label=button3_label
|
||||
)
|
||||
|
||||
# determine selected button
|
||||
selected_btn = button3 if has_update and self.plugin.is_installed else (
|
||||
button2 if self.plugin.is_installed else button1
|
||||
)
|
||||
|
||||
bui.containerwidget(
|
||||
edit=self._root_widget,
|
||||
on_cancel_call=self._cancel,
|
||||
selected_child=selected_btn
|
||||
)
|
||||
|
||||
tool_top = 195
|
||||
|
||||
open_pos_x = (60 if _uiscale() is babase.UIScale.SMALL else
|
||||
60 if _uiscale() is babase.UIScale.MEDIUM else 60)
|
||||
open_pos_y = tool_top - 45 - (
|
||||
5 if _uiscale() is babase.UIScale.SMALL else
|
||||
10 if _uiscale() is babase.UIScale.MEDIUM else
|
||||
15
|
||||
)
|
||||
open_button = bui.buttonwidget(
|
||||
# button math
|
||||
button_x = width - 90
|
||||
button_y = 210 - _by_scale(5,10,15)
|
||||
button_color = (0, 0.75, 0.75)
|
||||
button_image_color = (0.8, 0.95, 1)
|
||||
button_text_color = (1,1,1,1)
|
||||
|
||||
# more button
|
||||
more_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
autoselect=True,
|
||||
position=(open_pos_x, open_pos_y),
|
||||
position=(button_x, button_y),
|
||||
size=(40, 40),
|
||||
button_type="square",
|
||||
label="",
|
||||
color=(0.6, 0.53, 0.63),
|
||||
on_activate_call=lambda: bui.open_url(self.plugin.view_url)
|
||||
button_type='square',
|
||||
label='',
|
||||
color=button_color
|
||||
)
|
||||
bui.buttonwidget(
|
||||
edit=more_button,
|
||||
on_activate_call=babase.CallPartial(
|
||||
MoreWindow,
|
||||
plugin=self.plugin,
|
||||
origin=more_button
|
||||
)
|
||||
)
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(open_pos_x, open_pos_y),
|
||||
position=(button_x, button_y),
|
||||
size=(40, 40),
|
||||
color=(0.8, 0.95, 1),
|
||||
texture=bui.gettexture("file"),
|
||||
draw_controller=open_button
|
||||
color=button_image_color,
|
||||
texture=bui.gettexture('file'),
|
||||
draw_controller=more_button
|
||||
)
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(open_pos_x-3, open_pos_y+12),
|
||||
text="Source",
|
||||
position=(button_x-3, button_y+12),
|
||||
text='More...',
|
||||
size=(10, 10),
|
||||
draw_controller=open_button,
|
||||
color=(1, 1, 1, 1),
|
||||
draw_controller=more_button,
|
||||
color=button_text_color,
|
||||
rotate=25,
|
||||
scale=0.45
|
||||
)
|
||||
|
||||
# Below snippet handles the tutorial button in the plugin window
|
||||
tutorial_url = self.plugin.info["external_url"]
|
||||
if tutorial_url:
|
||||
def tutorial_confirm_window():
|
||||
text = "This will take you to \n\""+self.plugin.info["external_url"] + "\""
|
||||
tutorial_confirm_window = confirm.ConfirmWindow(
|
||||
text=text,
|
||||
action=lambda: bui.open_url(self.plugin.info["external_url"]),
|
||||
)
|
||||
open_pos_x = (60 if _uiscale() is babase.UIScale.SMALL else
|
||||
60 if _uiscale() is babase.UIScale.MEDIUM else 60)
|
||||
open_pos_y = tool_top - 90 - (
|
||||
5 if _uiscale() is babase.UIScale.SMALL else
|
||||
10 if _uiscale() is babase.UIScale.MEDIUM else
|
||||
15
|
||||
)
|
||||
open_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
autoselect=True,
|
||||
position=(open_pos_x, open_pos_y),
|
||||
size=(40, 40),
|
||||
button_type="square",
|
||||
label="",
|
||||
color=(0.6, 0.53, 0.63),
|
||||
on_activate_call=tutorial_confirm_window
|
||||
)
|
||||
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(open_pos_x, open_pos_y),
|
||||
size=(40, 40),
|
||||
color=(0.8, 0.95, 1),
|
||||
texture=bui.gettexture("frameInset"),
|
||||
draw_controller=open_button
|
||||
)
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(open_pos_x - 3, open_pos_y + 12),
|
||||
text="Tutorial",
|
||||
size=(10, 10),
|
||||
draw_controller=open_button,
|
||||
color=(1, 1, 1, 1),
|
||||
rotate=25,
|
||||
scale=0.45
|
||||
)
|
||||
|
||||
if to_draw_button4:
|
||||
settings_pos_x = (60 if _uiscale() is babase.UIScale.SMALL else
|
||||
60 if _uiscale() is babase.UIScale.MEDIUM else 60)
|
||||
settings_pos_y = tool_top - (
|
||||
5 if _uiscale() is babase.UIScale.SMALL else
|
||||
10 if _uiscale() is babase.UIScale.MEDIUM else
|
||||
15
|
||||
)
|
||||
# settings button
|
||||
if to_draw_settings_button:
|
||||
button_y -= 50
|
||||
settings_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
autoselect=True,
|
||||
position=(settings_pos_x, settings_pos_y),
|
||||
position=(button_x, button_y),
|
||||
size=(40, 40),
|
||||
button_type="square",
|
||||
label="",
|
||||
color=(0, 0.75, 0.75)
|
||||
color=button_color
|
||||
)
|
||||
bui.buttonwidget(
|
||||
edit=settings_button,
|
||||
|
|
@ -1564,13 +1543,176 @@ class PluginWindow(popup.PopupWindow):
|
|||
)
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(settings_pos_x, settings_pos_y),
|
||||
position=(button_x, button_y),
|
||||
size=(40, 40),
|
||||
color=(0.8, 0.95, 1),
|
||||
color=button_image_color,
|
||||
texture=bui.gettexture("settingsIcon"),
|
||||
draw_controller=settings_button
|
||||
)
|
||||
|
||||
# tutorial
|
||||
tutorial_url = self.plugin.info['external_url']
|
||||
if tutorial_url:
|
||||
button_y -= 50
|
||||
tutorial_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
autoselect=True,
|
||||
position=(button_x, button_y),
|
||||
size=(40, 40),
|
||||
button_type="square",
|
||||
label="",
|
||||
color=button_color
|
||||
)
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(button_x, button_y),
|
||||
size=(40, 40),
|
||||
color=button_image_color,
|
||||
texture=bui.gettexture("frameInset"),
|
||||
draw_controller=tutorial_button
|
||||
)
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(button_x - 3, button_y + 12),
|
||||
text="Tutorial",
|
||||
size=(10, 10),
|
||||
draw_controller=tutorial_button,
|
||||
color=button_text_color,
|
||||
rotate=25,
|
||||
scale=0.45
|
||||
)
|
||||
bui.buttonwidget(
|
||||
tutorial_button,
|
||||
on_activate_call=bui.CallPartial(
|
||||
confirm.ConfirmWindow,
|
||||
text=f'This will take you to:\n{tutorial_url}',
|
||||
origin_widget=tutorial_button,
|
||||
action=bui.CallPartial(
|
||||
bui.open_url, tutorial_url
|
||||
)
|
||||
)
|
||||
)
|
||||
# navigation #XXX
|
||||
if button1 and button2 and button3:
|
||||
# three buttons
|
||||
leftmost_button = button1
|
||||
center_button = button2
|
||||
rightmost_button = button3
|
||||
elif button1 and button2:
|
||||
# two buttons
|
||||
leftmost_button = button1
|
||||
center_button = None
|
||||
rightmost_button = button2
|
||||
elif button2 and button3:
|
||||
# two buttons
|
||||
leftmost_button = button2
|
||||
center_button = None
|
||||
rightmost_button = button3
|
||||
elif button1:
|
||||
# one button
|
||||
leftmost_button = button1
|
||||
center_button = None
|
||||
rightmost_button = button1
|
||||
elif button2:
|
||||
# one button
|
||||
leftmost_button = button2
|
||||
center_button = None
|
||||
rightmost_button = button2
|
||||
else:
|
||||
leftmost_button = center_button = rightmost_button = None
|
||||
|
||||
# determine vertical stack
|
||||
bottom_stack = tutorial_button or settings_button or more_button
|
||||
top_stack = more_button
|
||||
|
||||
# previous plugin button
|
||||
if previous_plugin_button is not None:
|
||||
bui.buttonwidget(
|
||||
edit=previous_plugin_button,
|
||||
left_widget=next_plugin_button,
|
||||
right_widget=leftmost_button,
|
||||
up_widget=author_text_control_btn,
|
||||
down_widget=leftmost_button
|
||||
)
|
||||
|
||||
# next plugin button
|
||||
if next_plugin_button is not None:
|
||||
bui.buttonwidget(
|
||||
edit=next_plugin_button,
|
||||
left_widget=bottom_stack,
|
||||
right_widget=bui.get_special_widget('squad_button'),
|
||||
up_widget=author_text_control_btn,
|
||||
down_widget=bottom_stack
|
||||
)
|
||||
|
||||
# author button
|
||||
bui.buttonwidget(
|
||||
edit=author_text_control_btn,
|
||||
left_widget=previous_plugin_button,
|
||||
right_widget=top_stack,
|
||||
up_widget=center_button or leftmost_button,
|
||||
down_widget=leftmost_button
|
||||
)
|
||||
|
||||
# button1
|
||||
if button1 is not None:
|
||||
bui.buttonwidget(
|
||||
edit=button1,
|
||||
left_widget=previous_plugin_button,
|
||||
right_widget=center_button or bottom_stack,
|
||||
up_widget=author_text_control_btn,
|
||||
down_widget=author_text_control_btn
|
||||
)
|
||||
|
||||
# button2
|
||||
if button2 is not None:
|
||||
bui.buttonwidget(
|
||||
edit=button2,
|
||||
left_widget=button1 or previous_plugin_button,
|
||||
right_widget=button3 or bottom_stack,
|
||||
up_widget=author_text_control_btn,
|
||||
down_widget=author_text_control_btn
|
||||
)
|
||||
|
||||
# button3
|
||||
if button3 is not None:
|
||||
bui.buttonwidget(
|
||||
edit=button3,
|
||||
left_widget=center_button or leftmost_button,
|
||||
right_widget=bottom_stack,
|
||||
up_widget=author_text_control_btn,
|
||||
down_widget=author_text_control_btn
|
||||
)
|
||||
|
||||
# more button
|
||||
bui.buttonwidget(
|
||||
edit=more_button,
|
||||
left_widget=rightmost_button,
|
||||
right_widget=next_plugin_button,
|
||||
up_widget=author_text_control_btn,
|
||||
down_widget=settings_button
|
||||
)
|
||||
|
||||
# settings button
|
||||
if settings_button is not None:
|
||||
bui.buttonwidget(
|
||||
edit=settings_button,
|
||||
left_widget=rightmost_button,
|
||||
right_widget=next_plugin_button,
|
||||
up_widget=more_button,
|
||||
down_widget=tutorial_button
|
||||
)
|
||||
|
||||
# tutorial button
|
||||
if tutorial_button is not None:
|
||||
bui.buttonwidget(
|
||||
edit=tutorial_button,
|
||||
left_widget=rightmost_button,
|
||||
right_widget=next_plugin_button,
|
||||
up_widget=settings_button or more_button,
|
||||
down_widget=rightmost_button
|
||||
)
|
||||
|
||||
def _ok(self) -> None:
|
||||
_remove_popup(self)
|
||||
bui.containerwidget(edit=self._root_widget, transition='out_scale')
|
||||
|
|
@ -1645,6 +1787,192 @@ class PluginWindow(popup.PopupWindow):
|
|||
await self.plugin.update()
|
||||
bui.getsound('shieldUp').play()
|
||||
|
||||
class MoreWindow:
|
||||
def __init__(self, plugin, origin=None):
|
||||
_add_popup(self)
|
||||
# collect info
|
||||
last_updated = None
|
||||
for value in plugin.info['versions'].values():
|
||||
if value['api_version'] == _app_api_version:
|
||||
last_updated = value['released_on']
|
||||
# math
|
||||
step = 40
|
||||
margin = 20
|
||||
width = 350
|
||||
px,py = margin,margin
|
||||
px2 = width-(margin+step)
|
||||
mw = px2-margin*2
|
||||
# root
|
||||
self.transition = origin and 'scale' or 'left'
|
||||
self._root_widget = bui.containerwidget(
|
||||
on_outside_click_call=self._back,
|
||||
transition=f'in_{self.transition}',
|
||||
scale=_by_scale(1.5,1.5,1),
|
||||
scale_origin_stack_offset=(
|
||||
origin and
|
||||
origin.get_screen_space_center()
|
||||
or None
|
||||
)
|
||||
)
|
||||
# last updated
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px,py),
|
||||
h_align='left',
|
||||
v_align='center',
|
||||
maxwidth=width-margin*2,
|
||||
max_height=step,
|
||||
size=(step,step),
|
||||
color=(1,1,1,0.5),
|
||||
text=(
|
||||
last_updated and
|
||||
f'Last updated on: {last_updated}'
|
||||
or 'Unknown'
|
||||
)
|
||||
)
|
||||
# version
|
||||
py += margin+step/3
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px,py),
|
||||
h_align='left',
|
||||
v_align='center',
|
||||
maxwidth=mw,
|
||||
max_height=step,
|
||||
size=(step,step),
|
||||
color=(1,1,1,0.5),
|
||||
text=f"Version {plugin.latest_compatible_version.number}"
|
||||
)
|
||||
# source url
|
||||
py += step+margin
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px,py),
|
||||
h_align='left',
|
||||
v_align='center',
|
||||
maxwidth=mw,
|
||||
max_height=step,
|
||||
size=(step,step),
|
||||
text='Source URL:'
|
||||
)
|
||||
source_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
autoselect=True,
|
||||
position=(px2,py),
|
||||
size=(step,step),
|
||||
color=(0.6, 0.53, 0.63),
|
||||
button_type='square',
|
||||
label='',
|
||||
on_activate_call=bui.CallPartial(
|
||||
bui.open_url,
|
||||
plugin.view_url
|
||||
)
|
||||
)
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(px2,py),
|
||||
size=(step,step),
|
||||
color=(0.8, 0.95, 1),
|
||||
texture=bui.gettexture('file'),
|
||||
draw_controller=source_button
|
||||
)
|
||||
# report bug
|
||||
py += step+margin
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px,py),
|
||||
h_align='left',
|
||||
v_align='center',
|
||||
maxwidth=mw,
|
||||
max_height=step,
|
||||
size=(step,step),
|
||||
text='Report a bug:'
|
||||
)
|
||||
report_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px2,py),
|
||||
size=(step,step),
|
||||
button_type='square',
|
||||
color=(0.6, 0.53, 0.63),
|
||||
label='',
|
||||
on_activate_call=bui.CallPartial(
|
||||
bui.open_url,
|
||||
GITHUB_ISSUE_META.format(
|
||||
repository_url=REPOSITORY_URL,
|
||||
issue_template=PLUGIN_ISSUE_TEMPLATE
|
||||
)
|
||||
)
|
||||
)
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(px2,py),
|
||||
size=(step,step),
|
||||
color=(0.8, 0.95, 1),
|
||||
texture=bui.gettexture('githubLogo'),
|
||||
draw_controller=report_button
|
||||
)
|
||||
# back
|
||||
py += step+margin
|
||||
back_button = bui.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px,py),
|
||||
size=(step,step),
|
||||
label=babase.charstr(babase.SpecialChar.BACK),
|
||||
button_type='backSmall',
|
||||
on_activate_call=self._back,
|
||||
enable_sound=False
|
||||
)
|
||||
# title
|
||||
px += margin
|
||||
bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(px+(step+margin),py),
|
||||
h_align='left',
|
||||
v_align='center',
|
||||
maxwidth=width-margin*2,
|
||||
max_height=step*2,
|
||||
size=(step,step),
|
||||
text='More info',
|
||||
scale=2
|
||||
)
|
||||
# finally
|
||||
py += step+margin
|
||||
bui.containerwidget(
|
||||
edit=self._root_widget,
|
||||
cancel_button=back_button,
|
||||
size=(width,py)
|
||||
)
|
||||
# navigation
|
||||
bui.buttonwidget(
|
||||
edit=back_button,
|
||||
left_widget=report_button,
|
||||
right_widget=report_button,
|
||||
up_widget=source_button,
|
||||
down_widget=report_button
|
||||
)
|
||||
|
||||
bui.buttonwidget(
|
||||
edit=source_button,
|
||||
left_widget=back_button,
|
||||
right_widget=back_button,
|
||||
up_widget=report_button,
|
||||
down_widget=back_button
|
||||
)
|
||||
|
||||
bui.buttonwidget(
|
||||
edit=report_button,
|
||||
left_widget=back_button,
|
||||
right_widget=back_button,
|
||||
up_widget=back_button,
|
||||
down_widget=source_button
|
||||
)
|
||||
def _back(self) -> None:
|
||||
_remove_popup(self)
|
||||
bui.getsound('swish').play()
|
||||
bui.containerwidget(
|
||||
edit=self._root_widget,
|
||||
transition=f'out_{self.transition}'
|
||||
)
|
||||
|
||||
class PluginCustomSourcesWindow(popup.PopupWindow):
|
||||
def __init__(self, origin_widget):
|
||||
|
|
@ -1983,12 +2311,11 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
@override
|
||||
def get_main_window_state(self) -> bui.MainWindowState:
|
||||
# Support recreating our window for back/refresh purposes.
|
||||
global open_popups
|
||||
# Close all open popups if ui changes.
|
||||
# check pr #390 for more info.
|
||||
for popup in open_popups:
|
||||
for pup in open_popups:
|
||||
try:
|
||||
bui.containerwidget(edit=popup._root_widget, transition='out_scale')
|
||||
bui.containerwidget(edit=pup._root_widget, transition='out_scale')
|
||||
except:
|
||||
pass
|
||||
cls = type(self)
|
||||
|
|
@ -2054,7 +2381,7 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
50 if _uiscale() is babase.UIScale.MEDIUM else 70)
|
||||
scroll_pos_y = (100 if _uiscale() is babase.UIScale.SMALL else
|
||||
35 if _uiscale() is babase.UIScale.MEDIUM else 40)
|
||||
self._scrollwidget = bui.scrollwidget(
|
||||
self._scrollwidget = sw = bui.scrollwidget(
|
||||
parent=self._root_widget,
|
||||
size=(scroll_size_x, scroll_size_y),
|
||||
position=(scroll_pos_x, scroll_pos_y)
|
||||
|
|
@ -2064,6 +2391,15 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
border=2,
|
||||
margin=0
|
||||
)
|
||||
bui.widget(
|
||||
sw,
|
||||
left_widget=self._back_button,
|
||||
up_widget=self._filter_widget
|
||||
)
|
||||
bui.widget(
|
||||
self._filter_widget,
|
||||
down_widget=sw
|
||||
)
|
||||
|
||||
def draw_category_selection_button(self, post_label):
|
||||
category_pos_x = (440 if _uiscale() is babase.UIScale.SMALL else
|
||||
|
|
@ -2083,7 +2419,10 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
button_type="square",
|
||||
textcolor=b_textcolor,
|
||||
text_scale=0.6,
|
||||
enable_sound=False
|
||||
enable_sound=False,
|
||||
left_widget=self._filter_widget,
|
||||
down_widget=self._scrollwidget,
|
||||
up_widget=self._back_button
|
||||
)
|
||||
else:
|
||||
b = self.alphabet_order_selection_button
|
||||
|
|
@ -2102,10 +2441,14 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
label=label,
|
||||
button_type="square",
|
||||
textcolor=b_textcolor,
|
||||
text_scale=0.6
|
||||
text_scale=0.6,
|
||||
up_widget=self._back_button
|
||||
)
|
||||
bui.buttonwidget(
|
||||
edit=b, on_activate_call=lambda: self.show_categories_window(source=b)),
|
||||
edit=b,
|
||||
down_widget=self._scrollwidget,
|
||||
on_activate_call=lambda: self.show_categories_window(source=b)
|
||||
)
|
||||
else:
|
||||
b = self.category_selection_button
|
||||
bui.buttonwidget(
|
||||
|
|
@ -2200,7 +2543,9 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
position=(settings_pos_x, settings_pos_y),
|
||||
size=(30, 30),
|
||||
button_type="square",
|
||||
label=""
|
||||
label="",
|
||||
left_widget=self._scrollwidget,
|
||||
right_widget=bui.get_special_widget('squad_button')
|
||||
)
|
||||
bui.buttonwidget(
|
||||
controller_button,
|
||||
|
|
@ -2235,7 +2580,13 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
bui.getsound('deek').play() or
|
||||
loop.create_task(self.refresh())
|
||||
),
|
||||
enable_sound=False
|
||||
enable_sound=False,
|
||||
left_widget=self._scrollwidget,
|
||||
right_widget=bui.get_special_widget('squad_button')
|
||||
)
|
||||
bui.widget(
|
||||
self._scrollwidget,
|
||||
right_widget=controller_button
|
||||
)
|
||||
bui.imagewidget(
|
||||
parent=self._root_widget,
|
||||
|
|
@ -2310,21 +2661,25 @@ class PluginManagerWindow(bui.MainWindow):
|
|||
else:
|
||||
plugin_names_to_draw = plugins
|
||||
|
||||
[plugin.delete() for plugin in self._columnwidget.get_children()]
|
||||
for plugin in self._columnwidget.get_children():
|
||||
plugin.delete()
|
||||
text_widget = bui.textwidget(parent=self._columnwidget)
|
||||
text_widget.delete()
|
||||
# await asyncio.gather(*plugin_names_to_draw)
|
||||
|
||||
plugin_names_ready_to_draw = []
|
||||
for plugin in plugin_names_to_draw:
|
||||
try:
|
||||
lcv = plugin.latest_compatible_version
|
||||
try: plugin.latest_compatible_version
|
||||
except NoCompatibleVersion:
|
||||
continue
|
||||
plugin_names_ready_to_draw += [plugin]
|
||||
|
||||
for i, plugin in enumerate(plugin_names_ready_to_draw):
|
||||
await self.draw_plugin_name(plugin, plugin_names_ready_to_draw)
|
||||
kids = self._columnwidget.get_children()
|
||||
first_child,last_child = kids[::len(kids)-1]
|
||||
bui.widget(first_child,up_widget=self._filter_widget)
|
||||
bui.widget(last_child,down_widget=self._back_button)
|
||||
|
||||
async def draw_plugin_name(self, plugin, plugins_list):
|
||||
|
||||
|
|
@ -2434,7 +2789,6 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
self._plugin_manager = plugin_manager
|
||||
self.scale_origin = origin_widget.get_screen_space_center()
|
||||
self.settings = babase.app.config["Community Plugin Manager"]["Settings"].copy()
|
||||
|
||||
loop.create_task(self.draw_ui())
|
||||
|
||||
async def draw_ui(self):
|
||||
|
|
@ -2512,8 +2866,9 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
)
|
||||
pos -= 40
|
||||
|
||||
self.checkboxes = []
|
||||
for setting, value in self.settings.items():
|
||||
bui.checkboxwidget(
|
||||
chk = bui.checkboxwidget(
|
||||
parent=self._root_widget,
|
||||
position=(width * 0.1, pos),
|
||||
size=(170, 30),
|
||||
|
|
@ -2524,7 +2879,18 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
textcolor=(0.9, 0.9, 0.9),
|
||||
scale=text_scale * 0.8
|
||||
)
|
||||
self.checkboxes.append(chk)
|
||||
pos -= 34 * text_scale
|
||||
bui.widget(
|
||||
self.checkboxes[0],
|
||||
up_widget=self._changelog_button
|
||||
)
|
||||
bui.widget(
|
||||
self._changelog_button,
|
||||
down_widget=self.checkboxes[0],
|
||||
left_widget=self.checkboxes[0],
|
||||
right_widget=self.checkboxes[0]
|
||||
)
|
||||
|
||||
pos = height - 200
|
||||
bui.textwidget(
|
||||
|
|
@ -2554,7 +2920,12 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
color=discord_bg_color,
|
||||
button_type='square',
|
||||
text_scale=1,
|
||||
label=""
|
||||
label="",
|
||||
down_widget=self._changelog_button
|
||||
)
|
||||
bui.widget(
|
||||
self._changelog_button,
|
||||
up_widget=self.discord_button
|
||||
)
|
||||
|
||||
bui.imagewidget(
|
||||
|
|
@ -2576,7 +2947,9 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
color=github_bg_color,
|
||||
button_type='square',
|
||||
text_scale=1,
|
||||
label=''
|
||||
label='',
|
||||
up_widget=self.checkboxes[-1],
|
||||
down_widget=self._changelog_button
|
||||
)
|
||||
|
||||
bui.imagewidget(
|
||||
|
|
@ -2608,7 +2981,14 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
button_type='square',
|
||||
text_scale=1,
|
||||
color=(0, 0.7, 0),
|
||||
label=update_button_label
|
||||
label=update_button_label,
|
||||
up_widget=self.checkboxes[-1],
|
||||
down_widget=self._changelog_button,
|
||||
right_widget=self.discord_button
|
||||
)
|
||||
bui.widget(
|
||||
self.discord_button,
|
||||
left_widget=self._update_button
|
||||
)
|
||||
self._restart_to_reload_changes_text = bui.textwidget(
|
||||
parent=self._root_widget,
|
||||
|
|
@ -2658,6 +3038,28 @@ class PluginManagerSettingsWindow(popup.PopupWindow):
|
|||
scale=0 if check else 1,
|
||||
selectable=(not check)
|
||||
)
|
||||
bui.widget(
|
||||
self._changelog_button,
|
||||
right_widget=(
|
||||
check and self.checkboxes[0]
|
||||
or self._save_button
|
||||
),
|
||||
left_widget=(
|
||||
check and self.checkboxes[0]
|
||||
or self._save_button
|
||||
)
|
||||
)
|
||||
bui.widget(
|
||||
self._update_button,
|
||||
up_widget=(
|
||||
check and self.checkboxes[0]
|
||||
or self._save_button
|
||||
),
|
||||
down_widget=(
|
||||
check and self._changelog_button
|
||||
or self._save_button
|
||||
)
|
||||
)
|
||||
|
||||
def save_settings_button(self):
|
||||
babase.app.config["Community Plugin Manager"]["Settings"] = self.settings.copy()
|
||||
|
|
@ -2837,9 +3239,12 @@ class NewAllSettingsWindow(AllSettingsWindow):
|
|||
position=(x_offs4, v),
|
||||
size=(basew, baseh),
|
||||
button_type='square',
|
||||
up_widget=pbtn,
|
||||
right_widget=pbtn,
|
||||
label='',
|
||||
on_activate_call=self._do_audio,
|
||||
)
|
||||
bui.buttonwidget(gfxb,right_widget=abtn)
|
||||
_b_title(x_offs4, v, abtn, bui.Lstr(resource=f'{self._r}.audioText'))
|
||||
imgw = imgh = 120
|
||||
bui.imagewidget(
|
||||
|
|
@ -2880,6 +3285,7 @@ class NewAllSettingsWindow(AllSettingsWindow):
|
|||
size=(basew, baseh),
|
||||
button_type='square',
|
||||
label='',
|
||||
up_widget=abtn,
|
||||
on_activate_call=self._do_plugman
|
||||
)
|
||||
_b_title(x_offs6, v, pmb, bui.Lstr(value="Plugin Manager"))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue