From 891308056231ad9872b75b3545e91bbabc9cd9fb Mon Sep 17 00:00:00 2001 From: Ayush Saini <36878972+imayushsaini@users.noreply.github.com> Date: Sun, 9 Feb 2025 00:17:58 +0530 Subject: [PATCH 01/12] syncing changes from ballistica/master --- config.toml | 15 +- dist/ba_data/python/babase/__init__.py | 40 +- dist/ba_data/python/babase/_accountv2.py | 88 +- dist/ba_data/python/babase/_app.py | 225 ++- dist/ba_data/python/babase/_appconfig.py | 39 +- dist/ba_data/python/babase/_appmode.py | 18 +- .../ba_data/python/babase/_appmodeselector.py | 4 +- dist/ba_data/python/babase/_appsubsystem.py | 21 +- dist/ba_data/python/babase/_apputils.py | 21 +- dist/ba_data/python/babase/_cloud.py | 197 +-- dist/ba_data/python/babase/_devconsole.py | 106 +- dist/ba_data/python/babase/_devconsoletabs.py | 671 ++++++++ dist/ba_data/python/babase/_emptyappmode.py | 13 +- dist/ba_data/python/babase/_env.py | 9 +- dist/ba_data/python/babase/_general.py | 22 +- dist/ba_data/python/babase/_hooks.py | 37 + dist/ba_data/python/babase/_keyboard.py | 33 - dist/ba_data/python/babase/_language.py | 50 +- dist/ba_data/python/babase/_logging.py | 12 + dist/ba_data/python/babase/_login.py | 114 +- dist/ba_data/python/babase/_meta.py | 24 +- dist/ba_data/python/babase/_mgen/enums.py | 4 +- dist/ba_data/python/babase/_net.py | 2 +- dist/ba_data/python/babase/_plugin.py | 2 +- dist/ba_data/python/baclassic/__init__.py | 49 +- dist/ba_data/python/baclassic/_accountv1.py | 28 +- dist/ba_data/python/baclassic/_achievement.py | 669 ++++---- dist/ba_data/python/baclassic/_ads.py | 24 +- dist/ba_data/python/baclassic/_appdelegate.py | 46 - dist/ba_data/python/baclassic/_appmode.py | 658 +++++++ .../{_subsystem.py => _appsubsystem.py} | 378 +++-- dist/ba_data/python/baclassic/_benchmark.py | 27 +- dist/ba_data/python/baclassic/_chest.py | 91 + .../ba_data/python/baclassic/_clienteffect.py | 77 + dist/ba_data/python/baclassic/_displayitem.py | 109 ++ dist/ba_data/python/baclassic/_music.py | 7 +- dist/ba_data/python/baclassic/_net.py | 7 +- dist/ba_data/python/baclassic/_store.py | 60 +- dist/ba_data/python/baclassic/_tournament.py | 108 +- dist/ba_data/python/baclassic/macmusicapp.py | 4 +- dist/ba_data/python/baclassic/osmusic.py | 4 +- dist/ba_data/python/bacommon/app.py | 20 +- dist/ba_data/python/bacommon/bs.py | 887 ++++++++++ dist/ba_data/python/bacommon/cloud.py | 27 +- dist/ba_data/python/bacommon/loggercontrol.py | 212 +++ dist/ba_data/python/bacommon/logging.py | 27 + dist/ba_data/python/bacommon/servermanager.py | 5 + dist/ba_data/python/baenv.py | 129 +- dist/ba_data/python/baplus/__init__.py | 12 +- .../{_subsystem.py => _appsubsystem.py} | 19 +- dist/ba_data/python/baplus/_cloud.py | 114 +- dist/ba_data/python/bascenev1/__init__.py | 8 +- dist/ba_data/python/bascenev1/_appmode.py | 60 - .../ba_data/python/bascenev1/_gameactivity.py | 147 +- dist/ba_data/python/bascenev1/_gameutils.py | 3 +- dist/ba_data/python/bascenev1/_level.py | 1 + dist/ba_data/python/bascenev1/_lobby.py | 7 +- dist/ba_data/python/bascenev1/_messages.py | 1 + dist/ba_data/python/bascenev1/_playlist.py | 1 + dist/ba_data/python/bascenev1/_session.py | 1 + dist/ba_data/python/bascenev1/_stats.py | 2 + dist/ba_data/python/bascenev1lib/__init__.py | 2 +- .../python/bascenev1lib/activity/coopscore.py | 424 +++-- .../bascenev1lib/activity/dualteamscore.py | 1 + .../activity/freeforallvictory.py | 1 + .../bascenev1lib/activity/multiteamscore.py | 2 + .../bascenev1lib/activity/multiteamvictory.py | 60 +- .../ba_data/python/bascenev1lib/actor/bomb.py | 2 + .../bascenev1lib/actor/controlsguide.py | 1 + .../ba_data/python/bascenev1lib/actor/flag.py | 14 +- .../python/bascenev1lib/actor/image.py | 13 +- .../python/bascenev1lib/actor/playerspaz.py | 2 + .../python/bascenev1lib/actor/popuptext.py | 1 + .../python/bascenev1lib/actor/scoreboard.py | 25 +- .../python/bascenev1lib/actor/spawner.py | 1 + .../ba_data/python/bascenev1lib/actor/spaz.py | 12 +- .../bascenev1lib/actor/spazappearance.py | 2 +- .../python/bascenev1lib/actor/spazbot.py | 4 +- .../ba_data/python/bascenev1lib/actor/text.py | 1 + .../python/bascenev1lib/actor/zoomtext.py | 1 + .../python/bascenev1lib/game/assault.py | 2 +- .../bascenev1lib/game/capturetheflag.py | 4 +- .../python/bascenev1lib/game/chosenone.py | 2 +- .../python/bascenev1lib/game/conquest.py | 2 +- .../python/bascenev1lib/game/deathmatch.py | 2 +- .../python/bascenev1lib/game/easteregghunt.py | 2 +- .../python/bascenev1lib/game/elimination.py | 3 +- .../python/bascenev1lib/game/football.py | 33 +- .../python/bascenev1lib/game/hockey.py | 2 +- .../python/bascenev1lib/game/keepaway.py | 2 +- .../python/bascenev1lib/game/kingofthehill.py | 2 +- .../python/bascenev1lib/game/meteorshower.py | 2 +- .../python/bascenev1lib/game/ninjafight.py | 2 +- .../python/bascenev1lib/game/onslaught.py | 17 +- dist/ba_data/python/bascenev1lib/game/race.py | 6 +- .../python/bascenev1lib/game/runaround.py | 16 +- .../bascenev1lib/game/targetpractice.py | 2 +- dist/ba_data/python/bascenev1lib/mainmenu.py | 376 ++-- dist/ba_data/python/bascenev1lib/maps.py | 24 + dist/ba_data/python/bascenev1lib/tutorial.py | 2 + dist/ba_data/python/batemplatefs/__init__.py | 6 +- .../{_subsystem.py => _appsubsystem.py} | 8 +- dist/ba_data/python/bauiv1/__init__.py | 41 +- dist/ba_data/python/bauiv1/_appsubsystem.py | 469 +++++ dist/ba_data/python/bauiv1/_hooks.py | 145 +- dist/ba_data/python/bauiv1/_subsystem.py | 250 --- dist/ba_data/python/bauiv1/_uitypes.py | 382 +++-- dist/ba_data/python/bauiv1lib/__init__.py | 2 +- .../python/bauiv1lib/account/__init__.py | 35 - dist/ba_data/python/bauiv1lib/account/link.py | 4 +- .../python/bauiv1lib/account/settings.py | 610 +++---- .../python/bauiv1lib/account/signin.py | 51 + .../python/bauiv1lib/account/v2proxy.py | 4 +- .../python/bauiv1lib/account/viewer.py | 19 +- dist/ba_data/python/bauiv1lib/achievements.py | 161 +- dist/ba_data/python/bauiv1lib/appinvite.py | 2 +- .../python/bauiv1lib/characterpicker.py | 27 +- dist/ba_data/python/bauiv1lib/chest.py | 1096 ++++++++++++ dist/ba_data/python/bauiv1lib/colorpicker.py | 10 +- dist/ba_data/python/bauiv1lib/config.py | 2 + dist/ba_data/python/bauiv1lib/configerror.py | 80 - dist/ba_data/python/bauiv1lib/confirm.py | 3 +- dist/ba_data/python/bauiv1lib/connectivity.py | 55 +- dist/ba_data/python/bauiv1lib/continues.py | 256 --- dist/ba_data/python/bauiv1lib/coop/browser.py | 607 +++---- .../python/bauiv1lib/coop/gamebutton.py | 52 +- .../python/bauiv1lib/coop/tournamentbutton.py | 542 +++--- .../bauiv1lib/{creditslist.py => credits.py} | 153 +- dist/ba_data/python/bauiv1lib/discord.py | 2 +- dist/ba_data/python/bauiv1lib/fileselector.py | 49 +- .../python/bauiv1lib/gather/__init__.py | 248 ++- .../python/bauiv1lib/gather/abouttab.py | 4 +- .../python/bauiv1lib/gather/manualtab.py | 38 +- .../python/bauiv1lib/gather/nearbytab.py | 6 + .../python/bauiv1lib/gather/privatetab.py | 84 +- .../python/bauiv1lib/gather/publictab.py | 217 +-- dist/ba_data/python/bauiv1lib/getcurrency.py | 796 --------- dist/ba_data/python/bauiv1lib/gettickets.py | 881 ---------- dist/ba_data/python/bauiv1lib/gettokens.py | 386 ++--- .../python/bauiv1lib/{helpui.py => help.py} | 228 +-- dist/ba_data/python/bauiv1lib/iconpicker.py | 27 +- dist/ba_data/python/bauiv1lib/inbox.py | 1129 ++++++++++++ dist/ba_data/python/bauiv1lib/ingamemenu.py | 592 +++++++ dist/ba_data/python/bauiv1lib/inventory.py | 143 ++ .../bauiv1lib/keyboard/englishkeyboard.py | 2 +- dist/ba_data/python/bauiv1lib/kiosk.py | 41 +- .../python/bauiv1lib/league/rankbutton.py | 422 ----- .../python/bauiv1lib/league/rankwindow.py | 359 ++-- dist/ba_data/python/bauiv1lib/mainmenu.py | 1511 ++++------------- dist/ba_data/python/bauiv1lib/party.py | 31 +- dist/ba_data/python/bauiv1lib/partyqueue.py | 26 +- dist/ba_data/python/bauiv1lib/play.py | 322 ++-- .../python/bauiv1lib/playlist/addgame.py | 161 +- .../python/bauiv1lib/playlist/browser.py | 299 ++-- .../bauiv1lib/playlist/customizebrowser.py | 462 +++-- .../ba_data/python/bauiv1lib/playlist/edit.py | 100 +- .../bauiv1lib/playlist/editcontroller.py | 147 +- .../python/bauiv1lib/playlist/editgame.py | 104 +- .../python/bauiv1lib/playlist/mapselect.py | 140 +- dist/ba_data/python/bauiv1lib/playoptions.py | 48 +- dist/ba_data/python/bauiv1lib/popup.py | 15 +- .../python/bauiv1lib/profile/browser.py | 161 +- dist/ba_data/python/bauiv1lib/profile/edit.py | 160 +- .../python/bauiv1lib/profile/upgrade.py | 73 +- dist/ba_data/python/bauiv1lib/promocode.py | 223 --- dist/ba_data/python/bauiv1lib/purchase.py | 27 +- .../python/bauiv1lib/resourcetypeinfo.py | 94 +- dist/ba_data/python/bauiv1lib/sendinfo.py | 84 +- .../python/bauiv1lib/settings/advanced.py | 312 ++-- .../python/bauiv1lib/settings/allsettings.py | 375 ++-- .../python/bauiv1lib/settings/audio.py | 267 ++- .../{debug.py => settings/benchmarks.py} | 187 +- .../python/bauiv1lib/settings/controls.py | 363 ++-- .../python/bauiv1lib/settings/devtools.py | 178 +- .../python/bauiv1lib/settings/gamepad.py | 129 +- .../bauiv1lib/settings/gamepadadvanced.py | 5 +- .../bauiv1lib/settings/gamepadselect.py | 245 +-- .../python/bauiv1lib/settings/graphics.py | 175 +- .../python/bauiv1lib/settings/keyboard.py | 71 +- .../python/bauiv1lib/settings/nettesting.py | 219 ++- .../python/bauiv1lib/settings/plugins.py | 166 +- .../bauiv1lib/settings/pluginsettings.py | 148 +- .../python/bauiv1lib/settings/remoteapp.py | 127 +- .../python/bauiv1lib/settings/testing.py | 159 +- .../python/bauiv1lib/settings/touchscreen.py | 130 +- .../python/bauiv1lib/soundtrack/browser.py | 190 +-- .../python/bauiv1lib/soundtrack/edit.py | 169 +- .../bauiv1lib/soundtrack/entrytypeselect.py | 78 +- .../bauiv1lib/soundtrack/macmusicapp.py | 43 +- dist/ba_data/python/bauiv1lib/specialoffer.py | 569 ------- .../ba_data/python/bauiv1lib/store/browser.py | 440 ++--- dist/ba_data/python/bauiv1lib/store/button.py | 324 ---- dist/ba_data/python/bauiv1lib/store/item.py | 33 +- dist/ba_data/python/bauiv1lib/tabs.py | 5 +- .../python/bauiv1lib/tournamententry.py | 174 +- .../python/bauiv1lib/tournamentscores.py | 54 +- dist/ba_data/python/bauiv1lib/trophies.py | 9 +- dist/ba_data/python/bauiv1lib/v2upgrade.py | 10 +- dist/ba_data/python/bauiv1lib/watch.py | 218 +-- dist/ba_data/python/efro/call.py | 96 +- dist/ba_data/python/efro/dataclassio/_api.py | 32 +- dist/ba_data/python/efro/dataclassio/_base.py | 74 +- .../python/efro/dataclassio/_inputter.py | 137 +- .../python/efro/dataclassio/_outputter.py | 15 +- dist/ba_data/python/efro/dataclassio/_prep.py | 23 +- .../efro/dataclassio/templatemultitype.py | 63 + dist/ba_data/python/efro/debug.py | 1 + dist/ba_data/python/efro/error.py | 79 + .../python/efro/{log.py => logging.py} | 210 ++- dist/ba_data/python/efro/message/_module.py | 2 + dist/ba_data/python/efro/message/_protocol.py | 40 +- dist/ba_data/python/efro/message/_sender.py | 14 + dist/ba_data/python/efro/rpc.py | 2 + dist/ba_data/python/efro/threadpool.py | 87 + dist/ba_data/python/efro/util.py | 152 +- dist/ba_root/config.json | 16 +- dist/ba_root/config.json.prev | 16 +- dist/ba_root/mods/changelogs.json | 4 + .../chatcommands/commands/management.py | 2 +- dist/ba_root/mods/custom_hooks.py | 40 +- dist/ba_root/mods/playersdata/profiles.json | 23 + .../mods/playersdata/profiles.json.backup | 31 +- dist/ba_root/mods/playersdata/roles.json | 2 +- dist/ba_root/mods/setting.py | 2 +- dist/ba_root/mods/spazmod/tag.py | 6 +- dist/ba_root/mods/tools/server_update.py | 5 +- dist/bombsquad_headless | Bin 7718112 -> 7878960 bytes 227 files changed, 15756 insertions(+), 12772 deletions(-) create mode 100644 dist/ba_data/python/babase/_devconsoletabs.py delete mode 100644 dist/ba_data/python/babase/_keyboard.py create mode 100644 dist/ba_data/python/babase/_logging.py delete mode 100644 dist/ba_data/python/baclassic/_appdelegate.py create mode 100644 dist/ba_data/python/baclassic/_appmode.py rename dist/ba_data/python/baclassic/{_subsystem.py => _appsubsystem.py} (71%) create mode 100644 dist/ba_data/python/baclassic/_chest.py create mode 100644 dist/ba_data/python/baclassic/_clienteffect.py create mode 100644 dist/ba_data/python/baclassic/_displayitem.py create mode 100644 dist/ba_data/python/bacommon/bs.py create mode 100644 dist/ba_data/python/bacommon/loggercontrol.py create mode 100644 dist/ba_data/python/bacommon/logging.py rename dist/ba_data/python/baplus/{_subsystem.py => _appsubsystem.py} (94%) delete mode 100644 dist/ba_data/python/bascenev1/_appmode.py rename dist/ba_data/python/batemplatefs/{_subsystem.py => _appsubsystem.py} (61%) create mode 100644 dist/ba_data/python/bauiv1/_appsubsystem.py delete mode 100644 dist/ba_data/python/bauiv1/_subsystem.py create mode 100644 dist/ba_data/python/bauiv1lib/account/signin.py create mode 100644 dist/ba_data/python/bauiv1lib/chest.py delete mode 100644 dist/ba_data/python/bauiv1lib/configerror.py delete mode 100644 dist/ba_data/python/bauiv1lib/continues.py rename dist/ba_data/python/bauiv1lib/{creditslist.py => credits.py} (76%) delete mode 100644 dist/ba_data/python/bauiv1lib/getcurrency.py delete mode 100644 dist/ba_data/python/bauiv1lib/gettickets.py rename dist/ba_data/python/bauiv1lib/{helpui.py => help.py} (81%) create mode 100644 dist/ba_data/python/bauiv1lib/inbox.py create mode 100644 dist/ba_data/python/bauiv1lib/ingamemenu.py create mode 100644 dist/ba_data/python/bauiv1lib/inventory.py delete mode 100644 dist/ba_data/python/bauiv1lib/league/rankbutton.py delete mode 100644 dist/ba_data/python/bauiv1lib/promocode.py rename dist/ba_data/python/bauiv1lib/{debug.py => settings/benchmarks.py} (70%) delete mode 100644 dist/ba_data/python/bauiv1lib/specialoffer.py delete mode 100644 dist/ba_data/python/bauiv1lib/store/button.py create mode 100644 dist/ba_data/python/efro/dataclassio/templatemultitype.py rename dist/ba_data/python/efro/{log.py => logging.py} (81%) create mode 100644 dist/ba_data/python/efro/threadpool.py diff --git a/config.toml b/config.toml index a64cdc3..2e5fac1 100644 --- a/config.toml +++ b/config.toml @@ -18,10 +18,11 @@ party_name = "BombSquad Community Server" # internet connection. #authenticate_clients = true -# IDs of server admins. Server admins are not kickable through the default -# kick vote system and they are able to kick players without a vote. To get -# your account id, enter 'getaccountid' in settings->advanced->enter-code. -admins = ["pb-yOuRAccOuNtIdHErE", "pb-aNdMayBeAnotherHeRE"] +# IDs of server admins. Server admins are not kickable through the +# default kick vote system and they are able to kick players without +# a vote. To get your account id, enter 'getaccountid' in +# settings->advanced->enter-code. +#admins = ["pb-yOuRAccOuNtIdHErE", "pb-aNdMayBeAnotherHeRE"] # Whether the default kick-voting system is enabled. #enable_default_kick_voting = true @@ -108,9 +109,9 @@ playlist_code = 12345 # get 4 wins) teams_series_length = 7 -# Points to win in free-for-all mode (Points are awarded per game based on -# performance) -ffa_series_length = 24 +# Points to win in free-for-all mode (Points are awarded per game +# based on performance) +#ffa_series_length = 24 # If you have a custom stats webpage for your server, you can use # this to provide a convenient in-game link to it in the diff --git a/dist/ba_data/python/babase/__init__.py b/dist/ba_data/python/babase/__init__.py index 61b75ae..fb1a414 100644 --- a/dist/ba_data/python/babase/__init__.py +++ b/dist/ba_data/python/babase/__init__.py @@ -9,6 +9,8 @@ a more focused way. """ # pylint: disable=redefined-builtin +# ba_meta require api 9 + # The stuff we expose here at the top level is our 'public' api for use # from other modules/packages. Code *within* this package should import # things from this package's submodules directly to reduce the chance of @@ -17,11 +19,12 @@ a more focused way. from efro.util import set_canonical_module_names - import _babase from _babase import ( add_clean_frame_callback, + allows_ticket_sales, android_get_external_files_dir, + app_instance_uuid, appname, appnameupper, apptime, @@ -55,12 +58,16 @@ from _babase import ( get_replays_dir, get_string_height, get_string_width, + get_ui_scale, get_v1_cloud_log_file_path, + get_virtual_safe_area_size, + get_virtual_screen_size, getsimplesound, has_user_run_commands, have_chars, have_permission, in_logic_thread, + in_main_menu, increment_analytics_count, invoke_main_menu, is_os_playing_music, @@ -86,6 +93,7 @@ from _babase import ( overlay_web_browser_is_supported, overlay_web_browser_open_url, print_load_info, + push_back_press, pushcall, quit, reload_media, @@ -95,7 +103,9 @@ from _babase import ( set_analytics_screen, set_low_level_config_value, set_thread_name, + set_ui_account_state, set_ui_input_device, + set_ui_scale, show_progress_bar, shutdown_suppress_begin, shutdown_suppress_end, @@ -103,8 +113,11 @@ from _babase import ( SimpleSound, supports_max_fps, supports_vsync, + supports_unicode_display, unlock_all_input, + update_internal_logger_levels, user_agent_string, + user_ran_commands, Vec3, workspaces_in_use, ) @@ -123,7 +136,9 @@ from babase._apputils import ( garbage_collect, get_remote_app_name, AppHealthMonitor, + utc_now_cloud, ) +from babase._cloud import CloudSubscription from babase._devconsole import ( DevConsoleTab, DevConsoleTabEntry, @@ -162,10 +177,9 @@ from babase._general import ( get_type_name, ) from babase._language import Lstr, LanguageSubsystem +from babase._logging import balog, applog, lifecyclelog from babase._login import LoginAdapter, LoginInfo -# noinspection PyProtectedMember -# (PyCharm inspection bug?) from babase._mgen.enums import ( Permission, SpecialChar, @@ -180,6 +194,7 @@ from babase._plugin import PluginSpec, Plugin, PluginSubsystem from babase._stringedit import StringEditAdapter, StringEditSubsystem from babase._text import timestring + _babase.app = app = App() app.postinit() @@ -188,6 +203,7 @@ __all__ = [ 'AccountV2Subsystem', 'ActivityNotFoundError', 'ActorNotFoundError', + 'allows_ticket_sales', 'add_clean_frame_callback', 'android_get_external_files_dir', 'app', @@ -199,6 +215,8 @@ __all__ = [ 'AppIntentDefault', 'AppIntentExec', 'AppMode', + 'app_instance_uuid', + 'applog', 'appname', 'appnameupper', 'AppModeSelector', @@ -209,6 +227,7 @@ __all__ = [ 'apptimer', 'AppTimer', 'asset_loads_allowed', + 'balog', 'Call', 'fullscreen_control_available', 'fullscreen_control_get', @@ -218,6 +237,7 @@ __all__ = [ 'clipboard_get_text', 'clipboard_has_text', 'clipboard_is_supported', + 'CloudSubscription', 'clipboard_set_text', 'commit_app_config', 'ContextCall', @@ -250,8 +270,11 @@ __all__ = [ 'get_replays_dir', 'get_string_height', 'get_string_width', - 'get_v1_cloud_log_file_path', 'get_type_name', + 'get_ui_scale', + 'get_virtual_safe_area_size', + 'get_virtual_screen_size', + 'get_v1_cloud_log_file_path', 'getclass', 'getsimplesound', 'handle_leftover_v1_cloud_log_file', @@ -259,6 +282,7 @@ __all__ = [ 'have_chars', 'have_permission', 'in_logic_thread', + 'in_main_menu', 'increment_analytics_count', 'InputDeviceNotFoundError', 'InputType', @@ -269,6 +293,7 @@ __all__ = [ 'is_point_in_box', 'is_xcode_build', 'LanguageSubsystem', + 'lifecyclelog', 'lock_all_input', 'LoginAdapter', 'LoginInfo', @@ -305,6 +330,7 @@ __all__ = [ 'print_error', 'print_exception', 'print_load_info', + 'push_back_press', 'pushcall', 'quit', 'QuitType', @@ -318,7 +344,9 @@ __all__ = [ 'set_analytics_screen', 'set_low_level_config_value', 'set_thread_name', + 'set_ui_account_state', 'set_ui_input_device', + 'set_ui_scale', 'show_progress_bar', 'shutdown_suppress_begin', 'shutdown_suppress_end', @@ -330,11 +358,15 @@ __all__ = [ 'StringEditSubsystem', 'supports_max_fps', 'supports_vsync', + 'supports_unicode_display', 'TeamNotFoundError', 'timestring', 'UIScale', 'unlock_all_input', + 'update_internal_logger_levels', 'user_agent_string', + 'user_ran_commands', + 'utc_now_cloud', 'utf8_all', 'Vec3', 'vec3validate', diff --git a/dist/ba_data/python/babase/_accountv2.py b/dist/ba_data/python/babase/_accountv2.py index f6544a5..b04bec6 100644 --- a/dist/ba_data/python/babase/_accountv2.py +++ b/dist/ba_data/python/babase/_accountv2.py @@ -10,16 +10,16 @@ from functools import partial from typing import TYPE_CHECKING, assert_never from efro.error import CommunicationError +from efro.call import CallbackSet from bacommon.login import LoginType import _babase if TYPE_CHECKING: - from typing import Any + from typing import Any, Callable from babase._login import LoginAdapter, LoginInfo - -DEBUG_LOG = False +logger = logging.getLogger('ba.accountv2') class AccountV2Subsystem: @@ -31,10 +31,22 @@ class AccountV2Subsystem: """ def __init__(self) -> None: + assert _babase.in_logic_thread() + from babase._login import LoginAdapterGPGS, LoginAdapterGameCenter - # Whether or not everything related to an initial login - # (or lack thereof) has completed. This includes things like + # Register to be informed when connectivity changes. + plus = _babase.app.plus + self._connectivity_changed_cb = ( + None + if plus is None + else plus.cloud.on_connectivity_changed_callbacks.register( + self._on_cloud_connectivity_changed + ) + ) + + # Whether or not everything related to an initial sign in (or + # lack thereof) has completed. This includes things like # workspace syncing. Completion of this is what flips the app # into 'running' state. self._initial_sign_in_completed = False @@ -46,6 +58,9 @@ class AccountV2Subsystem: self._implicit_signed_in_adapter: LoginAdapter | None = None self._implicit_state_changed = False self._can_do_auto_sign_in = True + self.on_primary_account_changed_callbacks: CallbackSet[ + Callable[[AccountV2Handle | None], None] + ] = CallbackSet() adapter: LoginAdapter if _babase.using_google_play_game_services(): @@ -64,11 +79,11 @@ class AccountV2Subsystem: def have_primary_credentials(self) -> bool: """Are credentials currently set for the primary app account? - Note that this does not mean these credentials are currently valid; - only that they exist. If/when credentials are validated, the 'primary' - account handle will be set. + Note that this does not mean these credentials have been checked + for validity; only that they exist. If/when credentials are + validated, the 'primary' account handle will be set. """ - raise NotImplementedError('This should be overridden.') + raise NotImplementedError() @property def primary(self) -> AccountV2Handle | None: @@ -85,6 +100,13 @@ class AccountV2Subsystem: """ assert _babase.in_logic_thread() + # Fire any registered callbacks. + for call in self.on_primary_account_changed_callbacks.getcalls(): + try: + call(account) + except Exception: + logging.exception('Error in primary-account-changed callback.') + # Currently don't do anything special on sign-outs. if account is None: return @@ -105,9 +127,9 @@ class AccountV2Subsystem: on_completed=self._on_set_active_workspace_completed, ) else: - # Don't activate workspaces if we've already told the game - # that initial-log-in is done or if we've already kicked - # off a workspace load. + # Don't activate workspaces if we've already told the + # game that initial-log-in is done or if we've already + # kicked off a workspace load. _babase.screenmessage( f'\'{account.workspacename}\'' f' will be activated at next app launch.', @@ -242,19 +264,18 @@ class AccountV2Subsystem: # generally this means the user has explicitly signed in/out or # switched accounts within that back-end. if prev_state != new_state: - if DEBUG_LOG: - logging.debug( - 'AccountV2: Implicit state changed (%s -> %s);' - ' will update app sign-in state accordingly.', - prev_state, - new_state, - ) + logger.debug( + 'Implicit state changed (%s -> %s);' + ' will update app sign-in state accordingly.', + prev_state, + new_state, + ) self._implicit_state_changed = True # We may want to auto-sign-in based on this new state. self._update_auto_sign_in() - def on_cloud_connectivity_changed(self, connected: bool) -> None: + def _on_cloud_connectivity_changed(self, connected: bool) -> None: """Should be called with cloud connectivity changes.""" del connected # Unused. assert _babase.in_logic_thread() @@ -264,11 +285,11 @@ class AccountV2Subsystem: def do_get_primary(self) -> AccountV2Handle | None: """Internal - should be overridden by subclass.""" - raise NotImplementedError('This should be overridden.') + raise NotImplementedError() def set_primary_credentials(self, credentials: str | None) -> None: """Set credentials for the primary app account.""" - raise NotImplementedError('This should be overridden.') + raise NotImplementedError() def _update_auto_sign_in(self) -> None: plus = _babase.app.plus @@ -279,11 +300,9 @@ class AccountV2Subsystem: if self._implicit_signed_in_adapter is None: # If implicit back-end has signed out, we follow suit # immediately; no need to wait for network connectivity. - if DEBUG_LOG: - logging.debug( - 'AccountV2: Signing out as result' - ' of implicit state change...', - ) + logger.debug( + 'Signing out as result of implicit state change...', + ) plus.accounts.set_primary_credentials(None) self._implicit_state_changed = False @@ -300,11 +319,9 @@ class AccountV2Subsystem: # switching accounts via the back-end). NOTE: should # test case where we don't have connectivity here. if plus.cloud.is_connected(): - if DEBUG_LOG: - logging.debug( - 'AccountV2: Signing in as result' - ' of implicit state change...', - ) + logger.debug( + 'Signing in as result of implicit state change...', + ) self._implicit_signed_in_adapter.sign_in( self._on_explicit_sign_in_completed, description='implicit state change', @@ -335,10 +352,9 @@ class AccountV2Subsystem: and not signed_in_v2 and self._implicit_signed_in_adapter is not None ): - if DEBUG_LOG: - logging.debug( - 'AccountV2: Signing in due to on-launch-auto-sign-in...', - ) + logger.debug( + 'Signing in due to on-launch-auto-sign-in...', + ) self._can_do_auto_sign_in = False # Only ATTEMPT once self._implicit_signed_in_adapter.sign_in( self._on_implicit_sign_in_completed, description='auto-sign-in' diff --git a/dist/ba_data/python/babase/_app.py b/dist/ba_data/python/babase/_app.py index 58ba2fc..6aa4d02 100644 --- a/dist/ba_data/python/babase/_app.py +++ b/dist/ba_data/python/babase/_app.py @@ -9,9 +9,10 @@ import logging from enum import Enum from functools import partial from typing import TYPE_CHECKING, TypeVar, override -from concurrent.futures import ThreadPoolExecutor from threading import RLock +from efro.threadpool import ThreadPoolExecutorPlus + import _babase from babase._language import LanguageSubsystem from babase._plugin import PluginSubsystem @@ -23,6 +24,8 @@ from babase._appmodeselector import AppModeSelector from babase._appintent import AppIntentDefault, AppIntentExec from babase._stringedit import StringEditSubsystem from babase._devconsole import DevConsoleSubsystem +from babase._appconfig import AppConfig +from babase._logging import lifecyclelog, applog if TYPE_CHECKING: import asyncio @@ -36,9 +39,9 @@ if TYPE_CHECKING: # __FEATURESET_APP_SUBSYSTEM_IMPORTS_BEGIN__ # This section generated by batools.appmodule; do not edit. - from baclassic import ClassicSubsystem - from baplus import PlusSubsystem - from bauiv1 import UIV1Subsystem + from baclassic import ClassicAppSubsystem + from baplus import PlusAppSubsystem + from bauiv1 import UIV1AppSubsystem # __FEATURESET_APP_SUBSYSTEM_IMPORTS_END__ @@ -65,9 +68,10 @@ class App: health_monitor: AppHealthMonitor # How long we allow shutdown tasks to run before killing them. - # Currently the entire app hard-exits if shutdown takes 10 seconds, - # so we need to keep it under that. - SHUTDOWN_TASK_TIMEOUT_SECONDS = 5 + # Currently the entire app hard-exits if shutdown takes 15 seconds, + # so we need to keep it under that. Staying above 10 should allow + # 10 second network timeouts to happen though. + SHUTDOWN_TASK_TIMEOUT_SECONDS = 12 class State(Enum): """High level state the app can be in.""" @@ -137,11 +141,11 @@ class App: # Ask our default app modes to handle it. # (generated from 'default_app_modes' in projectconfig). - import bascenev1 + import baclassic import babase for appmode in [ - bascenev1.SceneV1AppMode, + baclassic.ClassicAppMode, babase.EmptyAppMode, ]: if appmode.can_handle_intent(intent): @@ -164,6 +168,11 @@ class App: if os.environ.get('BA_RUNNING_WITH_DUMMY_MODULES') == '1': return + # Wrap our raw app config in our special wrapper and pass it to + # the native layer. + self.config = AppConfig(_babase.get_initial_app_config()) + _babase.set_app_config(self.config) + self.env: babase.Env = _babase.Env() self.state = self.State.NOT_STARTED @@ -171,7 +180,7 @@ class App: # processing. It should also be passed to any additional asyncio # loops we create so that everything shares the same single set # of worker threads. - self.threadpool = ThreadPoolExecutor( + self.threadpool = ThreadPoolExecutorPlus( thread_name_prefix='baworker', initializer=self._thread_pool_thread_init, ) @@ -205,11 +214,11 @@ class App: self._asyncio_loop: asyncio.AbstractEventLoop | None = None self._asyncio_tasks: set[asyncio.Task] = set() self._asyncio_timer: babase.AppTimer | None = None - self._config: babase.AppConfig | None = None self._pending_intent: AppIntent | None = None self._intent: AppIntent | None = None - self._mode: AppMode | None = None self._mode_selector: babase.AppModeSelector | None = None + self._mode_instances: dict[type[AppMode], AppMode] = {} + self._mode: AppMode | None = None self._shutdown_task: asyncio.Task[None] | None = None self._shutdown_tasks: list[Coroutine[None, None, None]] = [ self._wait_for_shutdown_suppressions(), @@ -250,6 +259,12 @@ class App: """ return _babase.app_is_active() + @property + def mode(self) -> AppMode | None: + """The app's current mode.""" + assert _babase.in_logic_thread() + return self._mode + @property def asyncio_loop(self) -> asyncio.AbstractEventLoop: """The logic thread's asyncio event loop. @@ -289,7 +304,7 @@ class App: """ assert _babase.in_logic_thread() - # Hold a strong reference to the task until it is done. + # We hold a strong reference to the task until it is done. # Otherwise it is possible for it to be garbage collected and # disappear midway if the caller does not hold on to the # returned task, which seems like a great way to introduce @@ -311,12 +326,6 @@ class App: self._asyncio_tasks.remove(task) - @property - def config(self) -> babase.AppConfig: - """The babase.AppConfig instance representing the app's config state.""" - assert self._config is not None - return self._config - @property def mode_selector(self) -> babase.AppModeSelector: """Controls which app-modes are used for handling given intents. @@ -387,19 +396,19 @@ class App: # This section generated by batools.appmodule; do not edit. @property - def classic(self) -> ClassicSubsystem | None: + def classic(self) -> ClassicAppSubsystem | None: """Our classic subsystem (if available).""" return self._get_subsystem_property( 'classic', self._create_classic_subsystem ) # type: ignore @staticmethod - def _create_classic_subsystem() -> ClassicSubsystem | None: + def _create_classic_subsystem() -> ClassicAppSubsystem | None: # pylint: disable=cyclic-import try: - from baclassic import ClassicSubsystem + from baclassic import ClassicAppSubsystem - return ClassicSubsystem() + return ClassicAppSubsystem() except ImportError: return None except Exception: @@ -407,19 +416,19 @@ class App: return None @property - def plus(self) -> PlusSubsystem | None: + def plus(self) -> PlusAppSubsystem | None: """Our plus subsystem (if available).""" return self._get_subsystem_property( 'plus', self._create_plus_subsystem ) # type: ignore @staticmethod - def _create_plus_subsystem() -> PlusSubsystem | None: + def _create_plus_subsystem() -> PlusAppSubsystem | None: # pylint: disable=cyclic-import try: - from baplus import PlusSubsystem + from baplus import PlusAppSubsystem - return PlusSubsystem() + return PlusAppSubsystem() except ImportError: return None except Exception: @@ -427,19 +436,19 @@ class App: return None @property - def ui_v1(self) -> UIV1Subsystem: + def ui_v1(self) -> UIV1AppSubsystem: """Our ui_v1 subsystem (always available).""" return self._get_subsystem_property( 'ui_v1', self._create_ui_v1_subsystem ) # type: ignore @staticmethod - def _create_ui_v1_subsystem() -> UIV1Subsystem: + def _create_ui_v1_subsystem() -> UIV1AppSubsystem: # pylint: disable=cyclic-import - from bauiv1 import UIV1Subsystem + from bauiv1 import UIV1AppSubsystem - return UIV1Subsystem() + return UIV1AppSubsystem() # __FEATURESET_APP_SUBSYSTEM_PROPERTIES_END__ @@ -481,18 +490,6 @@ class App: """ _babase.run_app() - def threadpool_submit_no_wait(self, call: Callable[[], Any]) -> None: - """Submit a call to the app threadpool where result is not needed. - - Normally, doing work in a thread-pool involves creating a future - and waiting for its result, which is an important step because it - propagates any Exceptions raised by the submitted work. When the - result in not important, however, this call can be used. The app - will log any exceptions that occur. - """ - fut = self.threadpool.submit(call) - fut.add_done_callback(self._threadpool_no_wait_done) - def set_intent(self, intent: AppIntent) -> None: """Set the intent for the app. @@ -510,7 +507,7 @@ class App: # Do the actual work of calcing our app-mode/etc. in a bg thread # since it may block for a moment to load modules/etc. - self.threadpool_submit_no_wait(partial(self._set_intent, intent)) + self.threadpool.submit_no_wait(self._set_intent, intent) def push_apply_app_config(self) -> None: """Internal. Use app.config.apply() to apply app config changes.""" @@ -566,12 +563,6 @@ class App: if self._mode is not None: self._mode.on_app_active_changed() - def read_config(self) -> None: - """(internal)""" - from babase._appconfig import read_app_config - - self._config = read_app_config() - def handle_deep_link(self, url: str) -> None: """Handle a deep link URL.""" from babase._language import Lstr @@ -610,18 +601,71 @@ class App: self._initial_sign_in_completed = True self._update_state() + def set_ui_scale(self, scale: babase.UIScale) -> None: + """Change ui-scale on the fly. + + Currently this is mainly for debugging and will not be called as + part of normal app operation. + """ + assert _babase.in_logic_thread() + + # Apply to the native layer. + _babase.set_ui_scale(scale.name.lower()) + + # Inform all subsystems that something screen-related has + # changed. We assume subsystems won't be added at this point so + # we can use the list directly. + assert self._subsystem_registration_ended + for subsystem in self._subsystems: + try: + subsystem.on_ui_scale_change() + except Exception: + logging.exception( + 'Error in on_ui_scale_change() for subsystem %s.', subsystem + ) + + def on_screen_size_change(self) -> None: + """Screen size has changed.""" + + # Inform all app subsystems in the same order they were inited. + # Operate on a copy of the list here because this can be called + # while subsystems are still being added. + for subsystem in self._subsystems.copy(): + try: + subsystem.on_screen_size_change() + except Exception: + logging.exception( + 'Error in on_screen_size_change() for subsystem %s.', + subsystem, + ) + def _set_intent(self, intent: AppIntent) -> None: + from babase._appmode import AppMode + # This should be happening in a bg thread. assert not _babase.in_logic_thread() try: # Ask the selector what app-mode to use for this intent. if self.mode_selector is None: raise RuntimeError('No AppModeSelector set.') - modetype = self.mode_selector.app_mode_for_intent(intent) - # NOTE: Since intents are somewhat high level things, should - # we do some universal thing like a screenmessage saying - # 'The app cannot handle that request' on failure? + modetype: type[AppMode] | None + + # Special case - for testing we may force a specific + # app-mode to handle this intent instead of going through our + # usual selector. + forced_mode_type = getattr(intent, '_force_app_mode_handler', None) + if isinstance(forced_mode_type, type) and issubclass( + forced_mode_type, AppMode + ): + modetype = forced_mode_type + else: + modetype = self.mode_selector.app_mode_for_intent(intent) + + # NOTE: Since intents are somewhat high level things, + # perhaps we should do some universal thing like a + # screenmessage saying 'The app cannot handle the request' + # on failure. if modetype is None: raise RuntimeError( @@ -640,7 +684,9 @@ class App: # Ok; seems legit. Now instantiate the mode if necessary and # kick back to the logic thread to apply. - mode = modetype() + mode = self._mode_instances.get(modetype) + if mode is None: + self._mode_instances[modetype] = mode = modetype() _babase.pushcall( partial(self._apply_intent, intent, mode), from_other_thread=True, @@ -661,7 +707,7 @@ class App: return # If the app-mode for this intent is different than the active - # one, switch. + # one, switch modes. if type(mode) is not type(self._mode): if self._mode is None: is_initial_mode = True @@ -673,6 +719,18 @@ class App: logging.exception( 'Error deactivating app-mode %s.', self._mode ) + + # Reset all subsystems. We assume subsystems won't be added + # at this point so we can use the list directly. + assert self._subsystem_registration_ended + for subsystem in self._subsystems: + try: + subsystem.reset() + except Exception: + logging.exception( + 'Error in reset() for subsystem %s.', subsystem + ) + self._mode = mode try: mode.on_activate() @@ -750,14 +808,14 @@ class App: self.meta.start_scan(scan_complete_cb=self._on_meta_scan_complete) # Inform all app subsystems in the same order they were inited. - # Operate on a copy here because subsystems can still be added - # at this point. + # Operate on a copy of the list here because subsystems can + # still be added at this point. for subsystem in self._subsystems.copy(): try: subsystem.on_app_loading() except Exception: logging.exception( - 'Error in on_app_loading for subsystem %s.', subsystem + 'Error in on_app_loading() for subsystem %s.', subsystem ) # Normally plus tells us when initial sign-in is done. If plus @@ -806,7 +864,7 @@ class App: subsystem.on_app_running() except Exception: logging.exception( - 'Error in on_app_running for subsystem %s.', subsystem + 'Error in on_app_running() for subsystem %s.', subsystem ) # Cut off new subsystem additions at this point. @@ -825,7 +883,7 @@ class App: def _apply_app_config(self) -> None: assert _babase.in_logic_thread() - _babase.lifecyclelog('apply-app-config') + lifecyclelog.info('apply-app-config') # If multiple apply calls have been made, only actually apply # once. @@ -842,7 +900,8 @@ class App: subsystem.do_apply_app_config() except Exception: logging.exception( - 'Error in do_apply_app_config for subsystem %s.', subsystem + 'Error in do_apply_app_config() for subsystem %s.', + subsystem, ) # Let the native layer do its thing. @@ -856,7 +915,7 @@ class App: if self._native_shutdown_complete_called: if self.state is not self.State.SHUTDOWN_COMPLETE: self.state = self.State.SHUTDOWN_COMPLETE - _babase.lifecyclelog('app state shutdown complete') + lifecyclelog.info('app-state is now %s', self.state.name) self._on_shutdown_complete() # Shutdown trumps all. Though we can't start shutting down until @@ -866,7 +925,8 @@ class App: # Entering shutdown state: if self.state is not self.State.SHUTTING_DOWN: self.state = self.State.SHUTTING_DOWN - _babase.lifecyclelog('app state shutting down') + applog.info('Shutting down...') + lifecyclelog.info('app-state is now %s', self.state.name) self._on_shutting_down() elif self._native_suspended: @@ -883,15 +943,16 @@ class App: if self._initial_sign_in_completed and self._meta_scan_completed: if self.state != self.State.RUNNING: self.state = self.State.RUNNING - _babase.lifecyclelog('app state running') + lifecyclelog.info('app-state is now %s', self.state.name) if not self._called_on_running: self._called_on_running = True self._on_running() + # Entering or returning to loading state: elif self._init_completed: if self.state is not self.State.LOADING: self.state = self.State.LOADING - _babase.lifecyclelog('app state loading') + lifecyclelog.info('app-state is now %s', self.state.name) if not self._called_on_loading: self._called_on_loading = True self._on_loading() @@ -900,7 +961,7 @@ class App: elif self._native_bootstrapping_completed: if self.state is not self.State.INITING: self.state = self.State.INITING - _babase.lifecyclelog('app state initing') + lifecyclelog.info('app-state is now %s', self.state.name) if not self._called_on_initing: self._called_on_initing = True self._on_initing() @@ -909,7 +970,7 @@ class App: elif self._native_start_called: if self.state is not self.State.NATIVE_BOOTSTRAPPING: self.state = self.State.NATIVE_BOOTSTRAPPING - _babase.lifecyclelog('app state native bootstrapping') + lifecyclelog.info('app-state is now %s', self.state.name) else: # Only logical possibility left is NOT_STARTED, in which # case we should not be getting called. @@ -965,7 +1026,7 @@ class App: subsystem.on_app_suspend() except Exception: logging.exception( - 'Error in on_app_suspend for subsystem %s.', subsystem + 'Error in on_app_suspend() for subsystem %s.', subsystem ) def _on_unsuspend(self) -> None: @@ -979,7 +1040,7 @@ class App: subsystem.on_app_unsuspend() except Exception: logging.exception( - 'Error in on_app_unsuspend for subsystem %s.', subsystem + 'Error in on_app_unsuspend() for subsystem %s.', subsystem ) def _on_shutting_down(self) -> None: @@ -993,7 +1054,7 @@ class App: subsystem.on_app_shutdown() except Exception: logging.exception( - 'Error in on_app_shutdown for subsystem %s.', subsystem + 'Error in on_app_shutdown() for subsystem %s.', subsystem ) # Now kick off any async shutdown task(s). @@ -1011,7 +1072,7 @@ class App: subsystem.on_app_shutdown_complete() except Exception: logging.exception( - 'Error in on_app_shutdown_complete for subsystem %s.', + 'Error in on_app_shutdown_complete() for subsystem %s.', subsystem, ) @@ -1020,10 +1081,10 @@ class App: # Spin and wait for anything blocking shutdown to complete. starttime = _babase.apptime() - _babase.lifecyclelog('shutdown-suppress wait begin') + lifecyclelog.info('shutdown-suppress-wait begin') while _babase.shutdown_suppress_count() > 0: await asyncio.sleep(0.001) - _babase.lifecyclelog('shutdown-suppress wait end') + lifecyclelog.info('shutdown-suppress-wait end') duration = _babase.apptime() - starttime if duration > 1.0: logging.warning( @@ -1036,7 +1097,7 @@ class App: import asyncio # Kick off a short fade and give it time to complete. - _babase.lifecyclelog('fade-and-shutdown-graphics begin') + lifecyclelog.info('fade-and-shutdown-graphics begin') _babase.fade_screen(False, time=0.15) await asyncio.sleep(0.15) @@ -1045,27 +1106,19 @@ class App: _babase.graphics_shutdown_begin() while not _babase.graphics_shutdown_is_complete(): await asyncio.sleep(0.01) - _babase.lifecyclelog('fade-and-shutdown-graphics end') + lifecyclelog.info('fade-and-shutdown-graphics end') async def _fade_and_shutdown_audio(self) -> None: import asyncio # Tell the audio system to go down and give it a bit of # time to do so gracefully. - _babase.lifecyclelog('fade-and-shutdown-audio begin') + lifecyclelog.info('fade-and-shutdown-audio begin') _babase.audio_shutdown_begin() await asyncio.sleep(0.15) while not _babase.audio_shutdown_is_complete(): await asyncio.sleep(0.01) - _babase.lifecyclelog('fade-and-shutdown-audio end') - - def _threadpool_no_wait_done(self, fut: Future) -> None: - try: - fut.result() - except Exception: - logging.exception( - 'Error in work submitted via threadpool_submit_no_wait()' - ) + lifecyclelog.info('fade-and-shutdown-audio end') def _thread_pool_thread_init(self) -> None: # Help keep things clear in profiling tools/etc. diff --git a/dist/ba_data/python/babase/_appconfig.py b/dist/ba_data/python/babase/_appconfig.py index 92efc73..aca886b 100644 --- a/dist/ba_data/python/babase/_appconfig.py +++ b/dist/ba_data/python/babase/_appconfig.py @@ -3,7 +3,6 @@ """Provides the AppConfig class.""" from __future__ import annotations -import logging from typing import TYPE_CHECKING import _babase @@ -101,43 +100,6 @@ class AppConfig(dict): self.commit() -def read_app_config() -> AppConfig: - """Read the app config.""" - import os - import json - - # NOTE: it is assumed that this only gets called once and the config - # object will not change from here on out - config_file_path = _babase.app.env.config_file_path - config_contents = '' - try: - if os.path.exists(config_file_path): - with open(config_file_path, encoding='utf-8') as infile: - config_contents = infile.read() - config = AppConfig(json.loads(config_contents)) - else: - config = AppConfig() - - except Exception: - logging.exception( - "Error reading config file '%s' at time %.3f.\n" - "Backing up broken config to'%s.broken'.", - config_file_path, - _babase.apptime(), - config_file_path, - ) - - try: - import shutil - - shutil.copyfile(config_file_path, config_file_path + '.broken') - except Exception: - logging.exception('Error copying broken config.') - config = AppConfig() - - return config - - def commit_app_config() -> None: """Commit the config to persistent storage. @@ -145,6 +107,7 @@ def commit_app_config() -> None: (internal) """ + # FIXME - this should not require plus. plus = _babase.app.plus assert plus is not None diff --git a/dist/ba_data/python/babase/_appmode.py b/dist/ba_data/python/babase/_appmode.py index cfe01f7..6de1d2b 100644 --- a/dist/ba_data/python/babase/_appmode.py +++ b/dist/ba_data/python/babase/_appmode.py @@ -27,20 +27,22 @@ class AppMode: """Return whether this mode can handle the provided intent. For this to return True, the AppMode must claim to support the - provided intent (via its _supports_intent() method) AND the + provided intent (via its _can_handle_intent() method) AND the AppExperience associated with the AppMode must be supported by the current app and runtime environment. """ - # FIXME: check AppExperience. - return cls._supports_intent(intent) + # TODO: check AppExperience against current environment. + return cls._can_handle_intent(intent) @classmethod - def _supports_intent(cls, intent: AppIntent) -> bool: + def _can_handle_intent(cls, intent: AppIntent) -> bool: """Return whether our mode can handle the provided intent. - AppModes should override this to define what they can handle. - Note that AppExperience does not have to be considered here; that - is handled automatically by the can_handle_intent() call.""" + AppModes should override this to communicate what they can + handle. Note that AppExperience does not have to be considered + here; that is handled automatically by the can_handle_intent() + call. + """ raise NotImplementedError('AppMode subclasses must override this.') def handle_intent(self, intent: AppIntent) -> None: @@ -54,7 +56,7 @@ class AppMode: """Called when the mode is being deactivated.""" def on_app_active_changed(self) -> None: - """Called when babase.app.active changes. + """Called when ba*.app.active changes while this mode is active. The app-mode may want to take action such as pausing a running game in such cases. diff --git a/dist/ba_data/python/babase/_appmodeselector.py b/dist/ba_data/python/babase/_appmodeselector.py index 9dff2cb..82acc48 100644 --- a/dist/ba_data/python/babase/_appmodeselector.py +++ b/dist/ba_data/python/babase/_appmodeselector.py @@ -11,7 +11,7 @@ if TYPE_CHECKING: class AppModeSelector: - """Defines which AppModes to use to handle given AppIntents. + """Defines which AppModes are available or used to handle given AppIntents. Category: **App Classes** @@ -29,4 +29,4 @@ class AppModeSelector: This may be called in a background thread, so avoid any calls limited to logic thread use/etc. """ - raise NotImplementedError('app_mode_for_intent() should be overridden.') + raise NotImplementedError() diff --git a/dist/ba_data/python/babase/_appsubsystem.py b/dist/ba_data/python/babase/_appsubsystem.py index 78ba01d..8f086ff 100644 --- a/dist/ba_data/python/babase/_appsubsystem.py +++ b/dist/ba_data/python/babase/_appsubsystem.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING import _babase if TYPE_CHECKING: - pass + from babase import UIScale class AppSubsystem: @@ -53,3 +53,22 @@ class AppSubsystem: def do_apply_app_config(self) -> None: """Called when the app config should be applied.""" + + def on_ui_scale_change(self) -> None: + """Called when screen ui-scale changes. + + Will not be called for the initial ui scale. + """ + + def on_screen_size_change(self) -> None: + """Called when the screen size changes. + + Will not be called for the initial screen size. + """ + + def reset(self) -> None: + """Reset the subsystem to a default state. + + This is called when switching app modes, but may be called + at other times too. + """ diff --git a/dist/ba_data/python/babase/_apputils.py b/dist/ba_data/python/babase/_apputils.py index 05d2b3d..0ff3960 100644 --- a/dist/ba_data/python/babase/_apputils.py +++ b/dist/ba_data/python/babase/_apputils.py @@ -11,25 +11,38 @@ from functools import partial from dataclasses import dataclass from typing import TYPE_CHECKING, override -from efro.log import LogLevel +from efro.util import utc_now +from efro.logging import LogLevel from efro.dataclassio import ioprepped, dataclass_to_json, dataclass_from_json import _babase from babase._appsubsystem import AppSubsystem if TYPE_CHECKING: + import datetime from typing import Any, TextIO, Callable import babase +def utc_now_cloud() -> datetime.datetime: + """Returns estimated utc time regardless of local clock settings. + + Applies offsets pulled from server communication/etc. + """ + # TODO: wire this up. Just using local time for now. Make sure that + # BaseFeatureSet::TimeSinceEpochCloudSeconds() and this are synced + # up. + return utc_now() + + def is_browser_likely_available() -> bool: """Return whether a browser likely exists on the current device. category: General Utility Functions - If this returns False you may want to avoid calling babase.show_url() - with any lengthy addresses. (ba.show_url() will display an address + If this returns False you may want to avoid calling babase.open_url() + with any lengthy addresses. (babase.open_url() will display an address as a string in a window if unable to bring up a browser, but that is only useful for simple URLs.) """ @@ -115,7 +128,7 @@ def handle_v1_cloud_log() -> None: 'userRanCommands': _babase.has_user_run_commands(), 'time': _babase.apptime(), 'userModded': _babase.workspaces_in_use(), - 'newsShow': plus.get_news_show(), + 'newsShow': plus.get_classic_news_show(), } def response(data: Any) -> None: diff --git a/dist/ba_data/python/babase/_cloud.py b/dist/ba_data/python/babase/_cloud.py index 3f5643d..bb96662 100644 --- a/dist/ba_data/python/babase/_cloud.py +++ b/dist/ba_data/python/babase/_cloud.py @@ -1,197 +1,26 @@ # Released under the MIT License. See LICENSE for details. # -"""Functionality related to the cloud.""" - +"""Cloud related functionality.""" from __future__ import annotations -import logging -from typing import TYPE_CHECKING, overload +from typing import TYPE_CHECKING import _babase -from babase._appsubsystem import AppSubsystem if TYPE_CHECKING: - from typing import Callable, Any - - from efro.message import Message, Response - import bacommon.cloud - -DEBUG_LOG = False - -# TODO: Should make it possible to define a protocol in bacommon.cloud and -# autogenerate this. That would give us type safety between this and -# internal protocols. + pass -class CloudSubsystem(AppSubsystem): - """Manages communication with cloud components.""" +class CloudSubscription: + """User handle to a subscription to some cloud data. - @property - def connected(self) -> bool: - """Property equivalent of CloudSubsystem.is_connected().""" - return self.is_connected() + Do not instantiate these directly; use the subscribe methods + in *.app.plus.cloud to create them. + """ - def is_connected(self) -> bool: - """Return whether a connection to the cloud is present. + def __init__(self, subscription_id: int) -> None: + self._subscription_id = subscription_id - This is a good indicator (though not for certain) that sending - messages will succeed. - """ - return False # Needs to be overridden - - def on_connectivity_changed(self, connected: bool) -> None: - """Called when cloud connectivity state changes.""" - if DEBUG_LOG: - logging.debug('CloudSubsystem: Connectivity is now %s.', connected) - - plus = _babase.app.plus - assert plus is not None - - # Inform things that use this. - # (TODO: should generalize this into some sort of registration system) - plus.accounts.on_cloud_connectivity_changed(connected) - - @overload - def send_message_cb( - self, - msg: bacommon.cloud.LoginProxyRequestMessage, - on_response: Callable[ - [bacommon.cloud.LoginProxyRequestResponse | Exception], None - ], - ) -> None: - ... - - @overload - def send_message_cb( - self, - msg: bacommon.cloud.LoginProxyStateQueryMessage, - on_response: Callable[ - [bacommon.cloud.LoginProxyStateQueryResponse | Exception], None - ], - ) -> None: - ... - - @overload - def send_message_cb( - self, - msg: bacommon.cloud.LoginProxyCompleteMessage, - on_response: Callable[[None | Exception], None], - ) -> None: - ... - - @overload - def send_message_cb( - self, - msg: bacommon.cloud.PingMessage, - on_response: Callable[[bacommon.cloud.PingResponse | Exception], None], - ) -> None: - ... - - @overload - def send_message_cb( - self, - msg: bacommon.cloud.SignInMessage, - on_response: Callable[ - [bacommon.cloud.SignInResponse | Exception], None - ], - ) -> None: - ... - - @overload - def send_message_cb( - self, - msg: bacommon.cloud.ManageAccountMessage, - on_response: Callable[ - [bacommon.cloud.ManageAccountResponse | Exception], None - ], - ) -> None: - ... - - def send_message_cb( - self, - msg: Message, - on_response: Callable[[Any], None], - ) -> None: - """Asynchronously send a message to the cloud from the logic thread. - - The provided on_response call will be run in the logic thread - and passed either the response or the error that occurred. - """ - from babase._general import Call - - del msg # Unused. - - _babase.pushcall( - Call( - on_response, - RuntimeError('Cloud functionality is not available.'), - ) - ) - - @overload - def send_message( - self, msg: bacommon.cloud.WorkspaceFetchMessage - ) -> bacommon.cloud.WorkspaceFetchResponse: - ... - - @overload - def send_message( - self, msg: bacommon.cloud.MerchAvailabilityMessage - ) -> bacommon.cloud.MerchAvailabilityResponse: - ... - - @overload - def send_message( - self, msg: bacommon.cloud.TestMessage - ) -> bacommon.cloud.TestResponse: - ... - - def send_message(self, msg: Message) -> Response | None: - """Synchronously send a message to the cloud. - - Must be called from a background thread. - """ - raise RuntimeError('Cloud functionality is not available.') - - -def cloud_console_exec(code: str) -> None: - """Called by the cloud console to run code in the logic thread.""" - import sys - import __main__ - - try: - # First try it as eval. - try: - evalcode = compile(code, '', 'eval') - except SyntaxError: - evalcode = None - except Exception: - # hmm; when we can't compile it as eval will we always get - # syntax error? - logging.exception( - 'unexpected error compiling code for cloud-console eval.' - ) - evalcode = None - if evalcode is not None: - # pylint: disable=eval-used - value = eval(evalcode, vars(__main__), vars(__main__)) - # For eval-able statements, print the resulting value if - # it is not None (just like standard Python interpreter). - if value is not None: - print(repr(value), file=sys.stderr) - - # Fall back to exec if we couldn't compile it as eval. - else: - execcode = compile(code, '', 'exec') - # pylint: disable=exec-used - exec(execcode, vars(__main__), vars(__main__)) - except Exception: - import traceback - - apptime = _babase.apptime() - print(f'Exec error at time {apptime:.2f}.', file=sys.stderr) - traceback.print_exc() - - # This helps the logging system ship stderr back to the - # cloud promptly. - sys.stderr.flush() + def __del__(self) -> None: + if _babase.app.plus is not None: + _babase.app.plus.cloud.unsubscribe(self._subscription_id) diff --git a/dist/ba_data/python/babase/_devconsole.py b/dist/ba_data/python/babase/_devconsole.py index d4e7099..66632ba 100644 --- a/dist/ba_data/python/babase/_devconsole.py +++ b/dist/ba_data/python/babase/_devconsole.py @@ -4,9 +4,9 @@ from __future__ import annotations import os -from typing import TYPE_CHECKING, override -from dataclasses import dataclass import logging +from dataclasses import dataclass +from typing import TYPE_CHECKING import _babase @@ -30,10 +30,27 @@ class DevConsoleTab: pos: tuple[float, float], size: tuple[float, float], call: Callable[[], Any] | None = None, + *, h_anchor: Literal['left', 'center', 'right'] = 'center', label_scale: float = 1.0, corner_radius: float = 8.0, - style: Literal['normal', 'dark'] = 'normal', + style: Literal[ + 'normal', + 'bright', + 'red', + 'red_bright', + 'purple', + 'purple_bright', + 'yellow', + 'yellow_bright', + 'blue', + 'blue_bright', + 'white', + 'white_bright', + 'black', + 'black_bright', + ] = 'normal', + disabled: bool = False, ) -> None: """Add a button to the tab being refreshed.""" assert _babase.app.devconsole.is_refreshing @@ -48,12 +65,14 @@ class DevConsoleTab: label_scale, corner_radius, style, + disabled, ) def text( self, text: str, pos: tuple[float, float], + *, h_anchor: Literal['left', 'center', 'right'] = 'center', h_align: Literal['left', 'center', 'right'] = 'center', v_align: Literal['top', 'center', 'bottom', 'none'] = 'center', @@ -93,47 +112,6 @@ class DevConsoleTab: return _babase.dev_console_base_scale() -class DevConsoleTabPython(DevConsoleTab): - """The Python dev-console tab.""" - - @override - def refresh(self) -> None: - self.python_terminal() - - -class DevConsoleTabTest(DevConsoleTab): - """Test dev-console tab.""" - - @override - def refresh(self) -> None: - import random - - self.button( - f'FLOOP-{random.randrange(200)}', - pos=(10, 10), - size=(100, 30), - h_anchor='left', - label_scale=0.6, - call=self.request_refresh, - ) - self.button( - f'FLOOP2-{random.randrange(200)}', - pos=(120, 10), - size=(100, 30), - h_anchor='left', - label_scale=0.6, - style='dark', - ) - self.text( - 'TestText', - scale=0.8, - pos=(15, 50), - h_anchor='left', - h_align='left', - v_align='none', - ) - - @dataclass class DevConsoleTabEntry: """Represents a distinct tab in the dev-console.""" @@ -154,26 +132,50 @@ class DevConsoleSubsystem: """ def __init__(self) -> None: + # pylint: disable=cyclic-import + from babase._devconsoletabs import ( + DevConsoleTabPython, + DevConsoleTabAppModes, + DevConsoleTabUI, + DevConsoleTabLogging, + DevConsoleTabTest, + ) + # All tabs in the dev-console. Add your own stuff here via # plugins or whatnot. self.tabs: list[DevConsoleTabEntry] = [ - DevConsoleTabEntry('Python', DevConsoleTabPython) + DevConsoleTabEntry('Python', DevConsoleTabPython), + DevConsoleTabEntry('AppModes', DevConsoleTabAppModes), + DevConsoleTabEntry('UI', DevConsoleTabUI), + DevConsoleTabEntry('Logging', DevConsoleTabLogging), ] if os.environ.get('BA_DEV_CONSOLE_TEST_TAB', '0') == '1': self.tabs.append(DevConsoleTabEntry('Test', DevConsoleTabTest)) self.is_refreshing = False + self._tab_instances: dict[str, DevConsoleTab] = {} def do_refresh_tab(self, tabname: str) -> None: """Called by the C++ layer when a tab should be filled out.""" assert _babase.in_logic_thread() - # FIXME: We currently won't handle multiple tabs with the same - # name. We should give a clean error or something in that case. - tab: DevConsoleTab | None = None - for tabentry in self.tabs: - if tabentry.name == tabname: - tab = tabentry.factory() - break + # Make noise if we have repeating tab names, as that breaks our + # logic. + if __debug__: + alltabnames = set[str](tabentry.name for tabentry in self.tabs) + if len(alltabnames) != len(self.tabs): + logging.error( + 'Duplicate dev-console tab names found;' + ' tabs may behave unpredictably.' + ) + + tab: DevConsoleTab | None = self._tab_instances.get(tabname) + + # If we haven't instantiated this tab yet, do so. + if tab is None: + for tabentry in self.tabs: + if tabentry.name == tabname: + tab = self._tab_instances[tabname] = tabentry.factory() + break if tab is None: logging.error( diff --git a/dist/ba_data/python/babase/_devconsoletabs.py b/dist/ba_data/python/babase/_devconsoletabs.py new file mode 100644 index 0000000..6429fa6 --- /dev/null +++ b/dist/ba_data/python/babase/_devconsoletabs.py @@ -0,0 +1,671 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Predefined tabs for the dev console.""" +from __future__ import annotations + +import math +import random +import logging +from functools import partial +from typing import TYPE_CHECKING, override, TypeVar, Generic + +import _babase + +from babase._devconsole import DevConsoleTab + +if TYPE_CHECKING: + from typing import Callable, Literal + + from bacommon.loggercontrol import LoggerControlConfig + from babase import AppMode + +T = TypeVar('T') + + +class DevConsoleTabPython(DevConsoleTab): + """The Python dev-console tab.""" + + @override + def refresh(self) -> None: + self.python_terminal() + + +class DevConsoleTabAppModes(DevConsoleTab): + """Tab to switch app modes.""" + + def __init__(self) -> None: + self._app_modes: list[type[AppMode]] | None = None + self._app_modes_loading = False + + def _on_app_modes_loaded(self, modes: list[type[AppMode]]) -> None: + from babase._appintent import AppIntentDefault + + intent = AppIntentDefault() + + # Limit to modes that can handle default intents since that's + # what we use. + self._app_modes = [ + mode for mode in modes if mode.can_handle_intent(intent) + ] + self.request_refresh() + + @override + def refresh(self) -> None: + from babase import AppMode + + # Kick off a load if applicable. + if self._app_modes is None and not self._app_modes_loading: + _babase.app.meta.load_exported_classes( + AppMode, self._on_app_modes_loaded + ) + + # Just say 'loading' if we don't have app-modes yet. + if self._app_modes is None: + self.text( + 'Loading...', pos=(0, 30), h_anchor='center', h_align='center' + ) + return + + bwidth = 260 + bpadding = 5 + + xoffs = -0.5 * bwidth * len(self._app_modes) + + self.text( + 'Available AppModes:', + scale=0.8, + pos=(0, 75), + h_align='center', + v_align='center', + ) + # pylint: disable=protected-access + for i, mode in enumerate(self._app_modes): + self.button( + f'{mode.__module__}.{mode.__qualname__}', + pos=(xoffs + i * bwidth + bpadding, 10), + size=(bwidth - 2.0 * bpadding, 40), + label_scale=0.6, + call=partial(self._set_app_mode, mode), + style=( + 'bright' + if isinstance(_babase.app._mode, mode) + else 'normal' + ), + ) + + def _set_app_mode(self, mode: type[AppMode]) -> None: + from babase._appintent import AppIntentDefault + + intent = AppIntentDefault() + + # Use private functionality to force a specific app-mode to + # handle this intent. Note that this should never be done + # outside of this explicit testing case. It is the app's job to + # determine which app-mode should be used to handle a given + # intent. + setattr(intent, '_force_app_mode_handler', mode) + + _babase.app.set_intent(intent) + + # Slight hackish: need to wait a moment before refreshing to + # pick up the newly current mode, as mode switches are + # asynchronous. + _babase.apptimer(0.1, self.request_refresh) + + +class DevConsoleTabUI(DevConsoleTab): + """Tab to debug/test UI stuff.""" + + @override + def refresh(self) -> None: + from babase._mgen.enums import UIScale + + xoffs = -375 + + self.text( + 'Make sure all UIs either fit in the virtual safe area' + ' or dynamically respond to screen size changes.', + scale=0.6, + pos=(xoffs + 15, 70), + h_align='left', + v_align='center', + ) + + ui_overlay = _babase.get_draw_virtual_safe_area_bounds() + self.button( + 'Virtual Safe Area ON' if ui_overlay else 'Virtual Safe Area OFF', + pos=(xoffs + 10, 10), + size=(200, 30), + label_scale=0.6, + call=self.toggle_ui_overlay, + style='bright' if ui_overlay else 'normal', + ) + x = 300 + self.text( + 'UI-Scale', + pos=(xoffs + x - 5, 15), + h_align='right', + v_align='none', + scale=0.6, + ) + + bwidth = 100 + for scale in UIScale: + self.button( + scale.name.capitalize(), + pos=(xoffs + x, 10), + size=(bwidth, 30), + label_scale=0.6, + call=partial(_babase.app.set_ui_scale, scale), + style=( + 'bright' + if scale.name.lower() == _babase.get_ui_scale() + else 'normal' + ), + ) + x += bwidth + 2 + + def toggle_ui_overlay(self) -> None: + """Toggle UI overlay drawing.""" + _babase.set_draw_virtual_safe_area_bounds( + not _babase.get_draw_virtual_safe_area_bounds() + ) + self.request_refresh() + + +class Table(Generic[T]): + """Used to show controls for arbitrarily large data in a grid form.""" + + def __init__( + self, + title: str, + entries: list[T], + draw_entry_call: Callable[ + [int, T, DevConsoleTab, float, float, float, float], None + ], + *, + entry_width: float = 300.0, + entry_height: float = 40.0, + margin_left_right: float = 60.0, + debug_bounds: bool = False, + max_columns: int | None = None, + ) -> None: + self._title = title + self._entry_width = entry_width + self._entry_height = entry_height + self._margin_left_right = margin_left_right + self._focus_entry_index = 0 + self._entries_per_page = 1 + self._debug_bounds = debug_bounds + self._entries = entries + self._draw_entry_call = draw_entry_call + self._max_columns = max_columns + + # Values updated on refresh (for aligning other custom + # widgets/etc.) + self.top_left: tuple[float, float] = (0.0, 0.0) + self.top_right: tuple[float, float] = (0.0, 0.0) + + def set_entries(self, entries: list[T]) -> None: + """Update table entries.""" + self._entries = entries + + # Clamp focus to new entries. + self._focus_entry_index = max( + 0, min(len(self._entries) - 1, self._focus_entry_index) + ) + + def set_focus_entry_index(self, index: int) -> None: + """Explicitly set the focused entry. + + This affects which page is shown at the next refresh. + """ + self._focus_entry_index = max(0, min(len(self._entries) - 1, index)) + + def refresh(self, tab: DevConsoleTab) -> None: + """Call to refresh the data.""" + # pylint: disable=too-many-locals + + margin_top = 50.0 + margin_bottom = 10.0 + + # Update how much we can fit on a page based on our current size. + max_entry_area_width = tab.width - (self._margin_left_right * 2.0) + max_entry_area_height = tab.height - (margin_top + margin_bottom) + columns = max(1, int(max_entry_area_width / self._entry_width)) + if self._max_columns is not None: + columns = min(columns, self._max_columns) + rows = max(1, int(max_entry_area_height / self._entry_height)) + self._entries_per_page = rows * columns + + # See which page our focus index falls in. + pagemax = math.ceil(len(self._entries) / self._entries_per_page) + + page = self._focus_entry_index // self._entries_per_page + entry_offset = page * self._entries_per_page + + entries_on_this_page = min( + self._entries_per_page, len(self._entries) - entry_offset + ) + columns_on_this_page = math.ceil(entries_on_this_page / rows) + rows_on_this_page = min(entries_on_this_page, rows) + + # We attach things to the center so resizes are smooth but we do + # some math in a left-centric way. + center_to_left = tab.width * -0.5 + + # Center our columns. + xoffs = 0.5 * ( + max_entry_area_width - columns_on_this_page * self._entry_width + ) + + # Align everything to the bottom of the dev-console. + # + # UPDATE: Nevermind; top feels better. Keeping this code around + # in case we ever want to make it an option though. + if bool(False): + yoffs = -1.0 * ( + tab.height + - ( + rows_on_this_page * self._entry_height + + margin_top + + margin_bottom + ) + ) + else: + yoffs = 0 + + # Keep our corners up to date for user use. + self.top_left = (center_to_left + xoffs, tab.height + yoffs) + self.top_right = ( + self.top_left[0] + + self._margin_left_right * 2.0 + + columns_on_this_page * self._entry_width, + self.top_left[1], + ) + + # Page left/right buttons. + tab.button( + '<', + pos=( + center_to_left + xoffs, + yoffs + tab.height - margin_top - rows * self._entry_height, + ), + size=( + self._margin_left_right, + rows * self._entry_height, + ), + call=partial(self._page_left, tab), + disabled=entry_offset == 0, + ) + tab.button( + '>', + pos=( + center_to_left + + xoffs + + self._margin_left_right + + columns_on_this_page * self._entry_width, + yoffs + tab.height - margin_top - rows * self._entry_height, + ), + size=( + self._margin_left_right, + rows * self._entry_height, + ), + call=partial(self._page_right, tab), + disabled=( + entry_offset + entries_on_this_page >= len(self._entries) + ), + ) + + for column in range(columns): + for row in range(rows): + entry_index = entry_offset + column * rows + row + if entry_index >= len(self._entries): + break + + xpos = ( + xoffs + self._margin_left_right + self._entry_width * column + ) + ypos = ( + yoffs + + tab.height + - margin_top + - self._entry_height * (row + 1.0) + ) + # Draw debug bounds. + if self._debug_bounds: + tab.button( + str(entry_index), + pos=( + center_to_left + xpos, + ypos, + ), + size=(self._entry_width, self._entry_height), + # h_anchor='left', + ) + # Run user drawing. + self._draw_entry_call( + entry_index, + self._entries[entry_index], + tab, + center_to_left + xpos, + ypos, + self._entry_width, + self._entry_height, + ) + + if entry_index >= len(self._entries): + break + + tab.text( + f'{self._title} ({page + 1}/{pagemax})', + scale=0.8, + pos=(0, yoffs + tab.height - margin_top * 0.5), + h_align='center', + v_align='center', + ) + + def _page_right(self, tab: DevConsoleTab) -> None: + # Set focus on the first entry in the page before the current. + page = self._focus_entry_index // self._entries_per_page + page += 1 + self.set_focus_entry_index(page * self._entries_per_page) + tab.request_refresh() + + def _page_left(self, tab: DevConsoleTab) -> None: + # Set focus on the first entry in the page after the current. + page = self._focus_entry_index // self._entries_per_page + page -= 1 + self.set_focus_entry_index(page * self._entries_per_page) + tab.request_refresh() + + +class DevConsoleTabLogging(DevConsoleTab): + """Tab to wrangle logging levels.""" + + def __init__(self) -> None: + + self._table = Table( + title='Logging Levels', + entry_width=800, + entry_height=42, + debug_bounds=False, + entries=list[str](), + draw_entry_call=self._draw_entry, + max_columns=1, + ) + + @override + def refresh(self) -> None: + assert self._table is not None + + # Update table entries with the latest set of loggers (this can + # change over time). + self._table.set_entries( + ['root'] + sorted(logging.root.manager.loggerDict) + ) + + # Draw the table. + self._table.refresh(self) + + # Draw our control buttons in the corners. + tl = self._table.top_left + tr = self._table.top_right + bwidth = 140.0 + bheight = 30.0 + bvpad = 10.0 + self.button( + 'Reset', + pos=(tl[0], tl[1] - bheight - bvpad), + size=(bwidth, bheight), + label_scale=0.6, + call=self._reset, + disabled=( + not self._get_reset_logger_control_config().would_make_changes() + ), + ) + self.button( + 'Cloud Control OFF', + pos=(tr[0] - bwidth, tl[1] - bheight - bvpad), + size=(bwidth, bheight), + label_scale=0.6, + disabled=True, + ) + + def _get_reset_logger_control_config(self) -> LoggerControlConfig: + from bacommon.logging import get_base_logger_control_config_client + + return get_base_logger_control_config_client() + + def _reset(self) -> None: + + self._get_reset_logger_control_config().apply() + + # Let the native layer know that levels changed. + _babase.update_internal_logger_levels() + + # Blow away any existing values in app-config. + appconfig = _babase.app.config + if 'Log Levels' in appconfig: + del appconfig['Log Levels'] + appconfig.commit() + + self.request_refresh() + + def _set_entry_val(self, entry_index: int, entry: str, val: int) -> None: + + from bacommon.logging import get_base_logger_control_config_client + from bacommon.loggercontrol import LoggerControlConfig + + # Focus on this entry with any interaction, so if we get resized + # it'll still be visible. + self._table.set_focus_entry_index(entry_index) + + logging.getLogger(entry).setLevel(val) + + # Let the native layer know that levels changed. + _babase.update_internal_logger_levels() + + # Store only changes compared to the base config. + baseconfig = get_base_logger_control_config_client() + config = LoggerControlConfig.from_current_loggers().diff(baseconfig) + + appconfig = _babase.app.config + appconfig['Log Levels'] = config.levels + appconfig.commit() + + self.request_refresh() + + def _draw_entry( + self, + entry_index: int, + entry: str, + tab: DevConsoleTab, + x: float, + y: float, + width: float, + height: float, + ) -> None: + # pylint: disable=too-many-positional-arguments + # pylint: disable=too-many-locals + + xoffs = -15.0 + bwidth = 80.0 + btextscale = 0.5 + tab.text( + entry, + ( + x + width - bwidth * 6.5 - 10.0 + xoffs, + y + height * 0.5, + ), + h_align='right', + scale=0.7, + ) + + logger = logging.getLogger(entry) + level = logger.level + index = 0 + effectivelevel = logger.getEffectiveLevel() + # if entry != 'root' and level == logging.NOTSET: + # # Show the level being inherited in NOTSET cases. + # notsetlevelname = logging.getLevelName(logger.getEffectiveLevel()) + # if notsetlevelname == 'NOTSET': + # notsetname = 'Not Set' + # else: + # notsetname = f'Not Set ({notsetlevelname.capitalize()})' + # else: + notsetname = 'Not Set' + tab.button( + notsetname, + pos=(x + width - bwidth * 6.5 + xoffs + 1.0, y + 5.0), + size=(bwidth * 1.0 - 2.0, height - 10), + label_scale=btextscale, + style='white_bright' if level == logging.NOTSET else 'black', + call=partial( + self._set_entry_val, entry_index, entry, logging.NOTSET + ), + ) + index += 1 + tab.button( + 'Debug', + pos=(x + width - bwidth * 5 + xoffs + 1.0, y + 5.0), + size=(bwidth - 2.0, height - 10), + label_scale=btextscale, + style=( + 'white_bright' + if level == logging.DEBUG + else 'blue' if effectivelevel <= logging.DEBUG else 'black' + ), + # style='bright' if level == logging.DEBUG else 'normal', + call=partial( + self._set_entry_val, entry_index, entry, logging.DEBUG + ), + ) + index += 1 + tab.button( + 'Info', + pos=(x + width - bwidth * 4 + xoffs + 1.0, y + 5.0), + size=(bwidth - 2.0, height - 10), + label_scale=btextscale, + style=( + 'white_bright' + if level == logging.INFO + else 'white' if effectivelevel <= logging.INFO else 'black' + ), + # style='bright' if level == logging.INFO else 'normal', + call=partial(self._set_entry_val, entry_index, entry, logging.INFO), + ) + index += 1 + tab.button( + 'Warning', + pos=(x + width - bwidth * 3 + xoffs + 1.0, y + 5.0), + size=(bwidth - 2.0, height - 10), + label_scale=btextscale, + style=( + 'white_bright' + if level == logging.WARNING + else 'yellow' if effectivelevel <= logging.WARNING else 'black' + ), + call=partial( + self._set_entry_val, entry_index, entry, logging.WARNING + ), + ) + index += 1 + tab.button( + 'Error', + pos=(x + width - bwidth * 2 + xoffs + 1.0, y + 5.0), + size=(bwidth - 2.0, height - 10), + label_scale=btextscale, + style=( + 'white_bright' + if level == logging.ERROR + else 'red' if effectivelevel <= logging.ERROR else 'black' + ), + call=partial( + self._set_entry_val, entry_index, entry, logging.ERROR + ), + ) + index += 1 + tab.button( + 'Critical', + pos=(x + width - bwidth * 1 + xoffs + 1.0, y + 5.0), + size=(bwidth - 2.0, height - 10), + label_scale=btextscale, + style=( + 'white_bright' + if level == logging.CRITICAL + else ( + 'purple' if effectivelevel <= logging.CRITICAL else 'black' + ) + ), + call=partial( + self._set_entry_val, entry_index, entry, logging.CRITICAL + ), + ) + + +class DevConsoleTabTest(DevConsoleTab): + """Test dev-console tab.""" + + @override + def refresh(self) -> None: + + self.button( + f'FLOOP-{random.randrange(200)}', + pos=(10, 10), + size=(100, 30), + h_anchor='left', + label_scale=0.6, + call=self.request_refresh, + ) + self.button( + f'FLOOP2-{random.randrange(200)}', + pos=(120, 10), + size=(100, 30), + h_anchor='left', + label_scale=0.6, + style='bright', + ) + self.text( + 'TestText', + scale=0.8, + pos=(15, 50), + h_anchor='left', + h_align='left', + v_align='none', + ) + + # Throw little bits of text in the corners to make sure + # widths/heights are correct. + self.text( + 'BL', + scale=0.25, + pos=(0, 0), + h_anchor='left', + h_align='left', + v_align='bottom', + ) + self.text( + 'BR', + scale=0.25, + pos=(self.width, 0), + h_anchor='left', + h_align='right', + v_align='bottom', + ) + self.text( + 'TL', + scale=0.25, + pos=(0, self.height), + h_anchor='left', + h_align='left', + v_align='top', + ) + self.text( + 'TR', + scale=0.25, + pos=(self.width, self.height), + h_anchor='left', + h_align='right', + v_align='top', + ) diff --git a/dist/ba_data/python/babase/_emptyappmode.py b/dist/ba_data/python/babase/_emptyappmode.py index 6745d21..f1a7b8f 100644 --- a/dist/ba_data/python/babase/_emptyappmode.py +++ b/dist/ba_data/python/babase/_emptyappmode.py @@ -15,8 +15,9 @@ if TYPE_CHECKING: from babase import AppIntent +# ba_meta export babase.AppMode class EmptyAppMode(AppMode): - """An empty app mode that can be used as a fallback/etc.""" + """An AppMode that does not do much at all.""" @override @classmethod @@ -25,24 +26,24 @@ class EmptyAppMode(AppMode): @override @classmethod - def _supports_intent(cls, intent: AppIntent) -> bool: + def _can_handle_intent(cls, intent: AppIntent) -> bool: # We support default and exec intents currently. return isinstance(intent, AppIntentExec | AppIntentDefault) @override def handle_intent(self, intent: AppIntent) -> None: if isinstance(intent, AppIntentExec): - _babase.empty_app_mode_handle_intent_exec(intent.code) + _babase.empty_app_mode_handle_app_intent_exec(intent.code) return assert isinstance(intent, AppIntentDefault) - _babase.empty_app_mode_handle_intent_default() + _babase.empty_app_mode_handle_app_intent_default() @override def on_activate(self) -> None: # Let the native layer do its thing. - _babase.on_empty_app_mode_activate() + _babase.empty_app_mode_activate() @override def on_deactivate(self) -> None: # Let the native layer do its thing. - _babase.on_empty_app_mode_deactivate() + _babase.empty_app_mode_deactivate() diff --git a/dist/ba_data/python/babase/_env.py b/dist/ba_data/python/babase/_env.py index 5efc253..41b1234 100644 --- a/dist/ba_data/python/babase/_env.py +++ b/dist/ba_data/python/babase/_env.py @@ -9,11 +9,11 @@ import logging import warnings from typing import TYPE_CHECKING, override -from efro.log import LogLevel +from efro.logging import LogLevel if TYPE_CHECKING: from typing import Any - from efro.log import LogEntry, LogHandler + from efro.logging import LogEntry, LogHandler _g_babase_imported = False # pylint: disable=invalid-name _g_babase_app_started = False # pylint: disable=invalid-name @@ -186,7 +186,10 @@ def _feed_logs_to_babase(log_handler: LogHandler) -> None: # Forward this along to the engine to display in the in-app # console, in the Android log, etc. _babase.emit_log( - name=entry.name, level=entry.level.name, message=entry.message + name=entry.name, + level=entry.level.name, + timestamp=entry.time.timestamp(), + message=entry.message, ) # We also want to feed some logs to the old v1-cloud-log system. diff --git a/dist/ba_data/python/babase/_general.py b/dist/ba_data/python/babase/_general.py index d9c2185..209589f 100644 --- a/dist/ba_data/python/babase/_general.py +++ b/dist/ba_data/python/babase/_general.py @@ -63,7 +63,7 @@ def existing(obj: ExistableT | None) -> ExistableT | None: For more info, see notes on 'existables' here: https://ballistica.net/wiki/Coding-Style-Guide """ - assert obj is None or hasattr(obj, 'exists'), f'No "exists" on {obj}' + assert obj is None or hasattr(obj, 'exists'), f'No "exists" attr on {obj}.' return obj if obj is not None and obj.exists() else None @@ -156,6 +156,9 @@ class _WeakCall: to wrap them in weakrefs manually if desired. """ + # Optimize performance a bit; we shouldn't need to be super dynamic. + __slots__ = ['_call', '_args', '_keywds'] + _did_invalid_call_warning = False def __init__(self, *args: Any, **keywds: Any) -> None: @@ -173,9 +176,10 @@ class _WeakCall: 'Warning: callable passed to babase.WeakCall() is not' ' weak-referencable (%s); use functools.partial instead' ' to avoid this warning.', + args[0], stack_info=True, ) - self._did_invalid_call_warning = True + type(self)._did_invalid_call_warning = True self._call = args[0] self._args = args[1:] self._keywds = keywds @@ -214,6 +218,9 @@ class _Call: without keeping its object alive. """ + # Optimize performance a bit; we shouldn't need to be super dynamic. + __slots__ = ['_call', '_args', '_keywds'] + def __init__(self, *args: Any, **keywds: Any): """Instantiate a Call. @@ -252,6 +259,14 @@ if TYPE_CHECKING: # type checking on both positional and keyword arguments (as of mypy # 1.11). + # FIXME: Actually, currently (as of Dec 2024) mypy doesn't fully + # type check partial. The partial() call itself is checked, but the + # resulting callable seems to be essentially untyped. We should + # probably revise this stuff so that Call and WeakCall are for 100% + # complete calls so we can fully type check them using ParamSpecs or + # whatnot. We could then write a weak_partial() call if we actually + # need that particular combination of functionality. + # Note: Something here is wonky with pylint, possibly related to our # custom pylint plugin. Disabling all checks seems to fix it. # pylint: disable=all @@ -272,6 +287,9 @@ class WeakMethod: free to die. If called with a dead target, is simply a no-op. """ + # Optimize performance a bit; we shouldn't need to be super dynamic. + __slots__ = ['_func', '_obj'] + def __init__(self, call: types.MethodType): assert isinstance(call, types.MethodType) self._func = call.__func__ diff --git a/dist/ba_data/python/babase/_hooks.py b/dist/ba_data/python/babase/_hooks.py index c344d26..ed16fe0 100644 --- a/dist/ba_data/python/babase/_hooks.py +++ b/dist/ba_data/python/babase/_hooks.py @@ -430,3 +430,40 @@ def unsupported_controller_message(name: str) -> None: Lstr(resource='unsupportedControllerText', subs=[('${NAME}', name)]), color=(1, 0, 0), ) + + +def copy_dev_console_history() -> None: + """Copy log history from the dev console.""" + import baenv + from babase._language import Lstr + + if not _babase.clipboard_is_supported(): + _babase.getsimplesound('error').play() + _babase.screenmessage( + 'Clipboard not supported on this build.', + color=(1, 0, 0), + ) + return + + # This requires us to be running with a log-handler set up. + envconfig = baenv.get_config() + if envconfig.log_handler is None: + _babase.getsimplesound('error').play() + _babase.screenmessage( + 'Not available; standard engine logging is not enabled.', + color=(1, 0, 0), + ) + return + + # Just dump everything that's in the log-handler's cache. + archive = envconfig.log_handler.get_cached() + lines: list[str] = [] + stdnames = ('stdout', 'stderr') + for entry in archive.entries: + reltime = entry.time.timestamp() - envconfig.launch_time + level_ex = '' if entry.name in stdnames else f' {entry.level.name}' + lines.append(f'{reltime:.3f}{level_ex} {entry.name}: {entry.message}') + + _babase.clipboard_set_text('\n'.join(lines)) + _babase.screenmessage(Lstr(resource='copyConfirmText'), color=(0, 1, 0)) + _babase.getsimplesound('gunCocking').play() diff --git a/dist/ba_data/python/babase/_keyboard.py b/dist/ba_data/python/babase/_keyboard.py deleted file mode 100644 index 6d18ac6..0000000 --- a/dist/ba_data/python/babase/_keyboard.py +++ /dev/null @@ -1,33 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""On-screen Keyboard related functionality.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - pass - - -class Keyboard: - """Chars definitions for on-screen keyboard. - - Category: **App Classes** - - Keyboards are discoverable by the meta-tag system - and the user can select which one they want to use. - On-screen keyboard uses chars from active babase.Keyboard. - """ - - name: str - """Displays when user selecting this keyboard.""" - - chars: list[tuple[str, ...]] - """Used for row/column lengths.""" - - pages: dict[str, tuple[str, ...]] - """Extra chars like emojis.""" - - nums: tuple[str, ...] - """The 'num' page.""" diff --git a/dist/ba_data/python/babase/_language.py b/dist/ba_data/python/babase/_language.py index 4e118b5..0f7af39 100644 --- a/dist/ba_data/python/babase/_language.py +++ b/dist/ba_data/python/babase/_language.py @@ -44,8 +44,13 @@ class LanguageSubsystem(AppSubsystem): (which may differ from locale if the user sets a language, etc.) """ env = _babase.env() - assert isinstance(env['locale'], str) - return env['locale'] + locale = env.get('locale') + if not isinstance(locale, str): + logging.warning( + 'Seem to be running in a dummy env; returning en_US locale.' + ) + locale = 'en_US' + return locale @property def language(self) -> str: @@ -83,6 +88,8 @@ class LanguageSubsystem(AppSubsystem): for i, name in enumerate(names): if name == 'Chinesetraditional': names[i] = 'ChineseTraditional' + elif name == 'Piratespeak': + names[i] = 'PirateSpeak' except Exception: from babase import _error @@ -431,7 +438,7 @@ class LanguageSubsystem(AppSubsystem): 'Thai', 'Tamil', } - and not _babase.can_display_full_unicode() + and not _babase.supports_unicode_display() ): return False return True @@ -522,8 +529,10 @@ class Lstr: ... subs=[('${NAME}', babase.Lstr(resource='res_b'))]) """ - # pylint: disable=dangerous-default-value - # noinspection PyDefaultArgument + # This class is used a lot in UI stuff and doesn't need to be + # flexible, so let's optimize its performance a bit. + __slots__ = ['args'] + @overload def __init__( self, @@ -531,29 +540,28 @@ class Lstr: resource: str, fallback_resource: str = '', fallback_value: str = '', - subs: Sequence[tuple[str, str | Lstr]] = [], + subs: Sequence[tuple[str, str | Lstr]] | None = None, ) -> None: """Create an Lstr from a string resource.""" - # noinspection PyShadowingNames,PyDefaultArgument @overload def __init__( self, *, translate: tuple[str, str], - subs: Sequence[tuple[str, str | Lstr]] = [], + subs: Sequence[tuple[str, str | Lstr]] | None = None, ) -> None: """Create an Lstr by translating a string in a category.""" - # noinspection PyDefaultArgument @overload def __init__( - self, *, value: str, subs: Sequence[tuple[str, str | Lstr]] = [] + self, + *, + value: str, + subs: Sequence[tuple[str, str | Lstr]] | None = None, ) -> None: """Create an Lstr from a raw string value.""" - # pylint: enable=redefined-outer-name, dangerous-default-value - def __init__(self, *args: Any, **keywds: Any) -> None: """Instantiate a Lstr. @@ -581,14 +589,16 @@ class Lstr: if isinstance(self.args.get('value'), our_type): raise TypeError("'value' must be a regular string; not an Lstr") - if 'subs' in self.args: - subs_new = [] - for key, value in keywds['subs']: - if isinstance(value, our_type): - subs_new.append((key, value.args)) - else: - subs_new.append((key, value)) - self.args['subs'] = subs_new + if 'subs' in keywds: + subs = keywds.get('subs') + subs_filtered = [] + if subs is not None: + for key, value in keywds['subs']: + if isinstance(value, our_type): + subs_filtered.append((key, value.args)) + else: + subs_filtered.append((key, value)) + self.args['subs'] = subs_filtered # As of protocol 31 we support compact key names # ('t' instead of 'translate', etc). Convert as needed. diff --git a/dist/ba_data/python/babase/_logging.py b/dist/ba_data/python/babase/_logging.py new file mode 100644 index 0000000..42d063d --- /dev/null +++ b/dist/ba_data/python/babase/_logging.py @@ -0,0 +1,12 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Logging functionality.""" + +from __future__ import annotations + +import logging + +# Our standard set of loggers. +balog = logging.getLogger('ba') +applog = logging.getLogger('ba.app') +lifecyclelog = logging.getLogger('ba.lifecycle') diff --git a/dist/ba_data/python/babase/_login.py b/dist/ba_data/python/babase/_login.py index 0f3d1c4..eb0cc89 100644 --- a/dist/ba_data/python/babase/_login.py +++ b/dist/ba_data/python/babase/_login.py @@ -17,8 +17,7 @@ import _babase if TYPE_CHECKING: from typing import Callable - -DEBUG_LOG = False +logger = logging.getLogger('ba.loginadapter') @dataclass @@ -94,20 +93,17 @@ class LoginAdapter: if state == self._implicit_login_state: return - if DEBUG_LOG: - if state is None: - logging.debug( - 'LoginAdapter: %s implicit state changed;' - ' now signed out.', - self.login_type.name, - ) - else: - logging.debug( - 'LoginAdapter: %s implicit state changed;' - ' now signed in as %s.', - self.login_type.name, - state.display_name, - ) + if state is None: + logger.debug( + '%s implicit state changed; now signed out.', + self.login_type.name, + ) + else: + logger.debug( + '%s implicit state changed; now signed in as %s.', + self.login_type.name, + state.display_name, + ) self._implicit_login_state = state self._implicit_login_state_dirty = True @@ -128,12 +124,11 @@ class LoginAdapter: only a reference to it is stored, not a copy. """ assert _babase.in_logic_thread() - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter got active logins %s.', - self.login_type.name, - {k: v[:4] + '...' + v[-4:] for k, v in logins.items()}, - ) + logger.debug( + '%s adapter got active logins %s.', + self.login_type.name, + {k: v[:4] + '...' + v[-4:] for k, v in logins.items()}, + ) self._active_login_id = logins.get(self.login_type) self._update_back_end_active() @@ -197,24 +192,21 @@ class LoginAdapter: self._last_sign_in_desc = description self._last_sign_in_time = now - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter sign_in() called;' - ' fetching sign-in-token...', - self.login_type.name, - ) + logger.debug( + '%s adapter sign_in() called; fetching sign-in-token...', + self.login_type.name, + ) def _got_sign_in_token_result(result: str | None) -> None: import bacommon.cloud # Failed to get a sign-in-token. if result is None: - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter sign-in-token fetch failed;' - ' aborting sign-in.', - self.login_type.name, - ) + logger.debug( + '%s adapter sign-in-token fetch failed;' + ' aborting sign-in.', + self.login_type.name, + ) _babase.pushcall( partial( result_cb, @@ -227,25 +219,22 @@ class LoginAdapter: # Got a sign-in token! Now pass it to the cloud which will use # it to verify our identity and give us app credentials on # success. - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter sign-in-token fetch succeeded;' - ' passing to cloud for verification...', - self.login_type.name, - ) + logger.debug( + '%s adapter sign-in-token fetch succeeded;' + ' passing to cloud for verification...', + self.login_type.name, + ) def _got_sign_in_response( response: bacommon.cloud.SignInResponse | Exception, ) -> None: # This likely means we couldn't communicate with the server. if isinstance(response, Exception): - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter got error' - ' sign-in response: %s', - self.login_type.name, - response, - ) + logger.debug( + '%s adapter got error sign-in response: %s', + self.login_type.name, + response, + ) _babase.pushcall(partial(result_cb, self, response)) else: # This means our credentials were explicitly rejected. @@ -254,12 +243,10 @@ class LoginAdapter: RuntimeError('Sign-in-token was rejected.') ) else: - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter got successful' - ' sign-in response', - self.login_type.name, - ) + logger.debug( + '%s adapter got successful sign-in response', + self.login_type.name, + ) result2 = self.SignInResult( credentials=response.credentials ) @@ -305,12 +292,10 @@ class LoginAdapter: # any existing state so it can properly respond to this. if self._implicit_login_state_dirty and self._on_app_loading_called: - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter sending' - ' implicit-state-changed to app.', - self.login_type.name, - ) + logger.debug( + '%s adapter sending implicit-state-changed to app.', + self.login_type.name, + ) assert _babase.app.plus is not None _babase.pushcall( @@ -331,12 +316,11 @@ class LoginAdapter: self._implicit_login_state.login_id == self._active_login_id ) if was_active != is_active: - if DEBUG_LOG: - logging.debug( - 'LoginAdapter: %s adapter back-end-active is now %s.', - self.login_type.name, - is_active, - ) + logger.debug( + '%s adapter back-end-active is now %s.', + self.login_type.name, + is_active, + ) self.on_back_end_active_change(is_active) self._back_end_active = is_active diff --git a/dist/ba_data/python/babase/_meta.py b/dist/ba_data/python/babase/_meta.py index 9a66d77..9354874 100644 --- a/dist/ba_data/python/babase/_meta.py +++ b/dist/ba_data/python/babase/_meta.py @@ -279,7 +279,7 @@ class DirectoryScan: except Exception: logging.exception("metascan: Error scanning '%s'.", subpath) - # Sort our results + # Sort our results. for exportlist in self.results.exports.values(): exportlist.sort() @@ -327,7 +327,11 @@ class DirectoryScan: meta_lines = { lnum: l[1:].split() for lnum, l in enumerate(flines) - if '# ba_meta ' in l + # Do a simple 'in' check for speed but then make sure its + # also at the beginning of the line. This allows disabling + # meta-lines and avoids false positives from code that + # wrangles them. + if ('# ba_meta' in l and l.strip().startswith('# ba_meta ')) } is_top_level = len(subpath.parts) <= 1 required_api = self._get_api_requirement( @@ -384,12 +388,16 @@ class DirectoryScan: # meta_lines is just anything containing '# ba_meta '; make sure # the ba_meta is in the right place. if mline[0] != 'ba_meta': - logging.warning( - 'metascan: %s:%d: malformed ba_meta statement.', - subpath, - lindex + 1, - ) - self.results.announce_errors_occurred = True + # Make an exception for this specific file, otherwise we + # get lots of warnings about ba_meta showing up in weird + # places here. + if subpath.as_posix() != 'babase/_meta.py': + logging.warning( + 'metascan: %s:%d: malformed ba_meta statement.', + subpath, + lindex + 1, + ) + self.results.announce_errors_occurred = True elif ( len(mline) == 4 and mline[1] == 'require' and mline[2] == 'api' ): diff --git a/dist/ba_data/python/babase/_mgen/enums.py b/dist/ba_data/python/babase/_mgen/enums.py index 9eb72b0..99b0f10 100644 --- a/dist/ba_data/python/babase/_mgen/enums.py +++ b/dist/ba_data/python/babase/_mgen/enums.py @@ -80,9 +80,9 @@ class UIScale(Enum): readable from an average distance. """ - LARGE = 0 + SMALL = 0 MEDIUM = 1 - SMALL = 2 + LARGE = 2 class Permission(Enum): diff --git a/dist/ba_data/python/babase/_net.py b/dist/ba_data/python/babase/_net.py index 93522ad..f871a4f 100644 --- a/dist/ba_data/python/babase/_net.py +++ b/dist/ba_data/python/babase/_net.py @@ -33,7 +33,7 @@ class NetworkSubsystem: # that a nearby server has been pinged. self.zone_pings: dict[str, float] = {} - # For debugging. + # For debugging/progress. self.v1_test_log: str = '' self.v1_ctest_results: dict[int, str] = {} self.connectivity_state = 'uninited' diff --git a/dist/ba_data/python/babase/_plugin.py b/dist/ba_data/python/babase/_plugin.py index 5e5f675..3aad9bc 100644 --- a/dist/ba_data/python/babase/_plugin.py +++ b/dist/ba_data/python/babase/_plugin.py @@ -93,7 +93,7 @@ class PluginSubsystem(AppSubsystem): # that weren't covered by the meta stuff above, either creating # plugin-specs for them or clearing them out. This covers # plugins with api versions not matching ours, plugins without - # ba_meta tags, and plugins that have since disappeared. + # ba_*meta tags, and plugins that have since disappeared. assert isinstance(plugstates, dict) wrong_api_prefixes = [f'{m}.' for m in results.incorrect_api_modules] diff --git a/dist/ba_data/python/baclassic/__init__.py b/dist/ba_data/python/baclassic/__init__.py index 51f50da..7b5a049 100644 --- a/dist/ba_data/python/baclassic/__init__.py +++ b/dist/ba_data/python/baclassic/__init__.py @@ -1,38 +1,49 @@ # Released under the MIT License. See LICENSE for details. # -"""Classic ballistica components. +"""Components for the classic BombSquad experience. -This package is used as a 'dumping ground' for functionality that is -necessary to keep legacy parts of the app working, but which may no -longer be the best way to do things going forward. - -New code should try to avoid using code from here when possible. - -Functionality in this package should be exposed through the -ClassicSubsystem. This allows type-checked code to go through the -babase.app.classic singleton which forces it to explicitly handle the -possibility of babase.app.classic being None. When code instead imports -classic submodules directly, it is much harder to make it cleanly handle -classic not being present. +This package/feature-set contains functionality related to the classic +BombSquad experience. Note that much legacy BombSquad code is still a +bit tangled and thus this feature-set is largely inseperable from +scenev1 and uiv1. Future feature-sets will be designed in a more modular +way. """ -# ba_meta require api 8 +# ba_meta require api 9 # Note: Code relying on classic should import things from here *only* -# for type-checking and use the versions in app.classic at runtime; that -# way type-checking will cleanly cover the classic-not-present case -# (app.classic being None). +# for type-checking and use the versions in ba*.app.classic at runtime; +# that way type-checking will cleanly cover the classic-not-present case +# (ba*.app.classic being None). import logging -from baclassic._subsystem import ClassicSubsystem +from efro.util import set_canonical_module_names + +from baclassic._appmode import ClassicAppMode +from baclassic._appsubsystem import ClassicAppSubsystem from baclassic._achievement import Achievement, AchievementSubsystem +from baclassic._chest import ( + ChestAppearanceDisplayInfo, + CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT, + CHEST_APPEARANCE_DISPLAY_INFOS, +) +from baclassic._displayitem import show_display_item __all__ = [ - 'ClassicSubsystem', + 'ChestAppearanceDisplayInfo', + 'CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT', + 'CHEST_APPEARANCE_DISPLAY_INFOS', + 'ClassicAppMode', + 'ClassicAppSubsystem', 'Achievement', 'AchievementSubsystem', + 'show_display_item', ] +# We want stuff here to show up as packagename.Foo instead of +# packagename._submodule.Foo. +set_canonical_module_names(globals()) + # Sanity check: we want to keep ballistica's dependencies and # bootstrapping order clearly defined; let's check a few particular # modules to make sure they never directly or indirectly import us diff --git a/dist/ba_data/python/baclassic/_accountv1.py b/dist/ba_data/python/baclassic/_accountv1.py index 47b7dae..10406f4 100644 --- a/dist/ba_data/python/baclassic/_accountv1.py +++ b/dist/ba_data/python/baclassic/_accountv1.py @@ -125,7 +125,11 @@ class AccountV1Subsystem: if subset is not None: raise ValueError('invalid subset value: ' + str(subset)) - if data['p']: + # We used to give this bonus for pro, but on recent versions of + # the game give it for everyone (since we are phasing out Pro). + + # if data['p']: + if bool(True): if babase.app.plus is None: pro_mult = 1.0 else: @@ -176,7 +180,9 @@ class AccountV1Subsystem: else {} ) for item_name, item in list(store_items.items()): - if item_name.startswith('icons.') and plus.get_purchased(item_name): + if item_name.startswith( + 'icons.' + ) and plus.get_v1_account_product_purchased(item_name): icons.append(item['icon']) return icons @@ -227,13 +233,12 @@ class AccountV1Subsystem: if plus is None: return False - # Check our tickets-based pro upgrade and our two real-IAP based - # upgrades. Also always unlock this stuff in ballistica-core builds. + # Check various server-side purchases that mean we have pro. return bool( - plus.get_purchased('upgrades.pro') - or plus.get_purchased('static.pro') - or plus.get_purchased('static.pro_sale') - or 'ballistica' + 'kit' == babase.appname() + plus.get_v1_account_product_purchased('gold_pass') + or plus.get_v1_account_product_purchased('upgrades.pro') + or plus.get_v1_account_product_purchased('static.pro') + or plus.get_v1_account_product_purchased('static.pro_sale') ) def have_pro_options(self) -> bool: @@ -247,10 +252,9 @@ class AccountV1Subsystem: if plus is None: return False - # We expose pro options if the server tells us to - # (which is generally just when we own pro), - # or also if we've been grandfathered in - # or are using ballistica-core builds. + # We expose pro options if the server tells us to (which is + # generally just when we own pro), or also if we've been + # grandfathered in. return self.have_pro() or bool( plus.get_v1_account_misc_read_val_2('proOptionsUnlocked', False) or babase.app.config.get('lc14292', 0) > 1 diff --git a/dist/ba_data/python/baclassic/_achievement.py b/dist/ba_data/python/baclassic/_achievement.py index 3ef3bed..b00f410 100644 --- a/dist/ba_data/python/baclassic/_achievement.py +++ b/dist/ba_data/python/baclassic/_achievement.py @@ -6,6 +6,11 @@ from __future__ import annotations import logging from typing import TYPE_CHECKING +from bacommon.bs import ClassicChestAppearance +from baclassic._chest import ( + CHEST_APPEARANCE_DISPLAY_INFOS, + CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT, +) import babase import bascenev1 import bauiv1 @@ -86,429 +91,311 @@ class AchievementSubsystem: def _init_achievements(self) -> None: """Fill in available achievements.""" - achs = self.achievements - - # 5 - achs.append( - Achievement('In Control', 'achievementInControl', (1, 1, 1), '', 5) - ) - # 15 - achs.append( + self.achievements += [ + Achievement( + 'In Control', + 'achievementInControl', + (1, 1, 1), + '', + award=5, + ), Achievement( 'Sharing is Caring', 'achievementSharingIsCaring', (1, 1, 1), '', - 15, - ) - ) - # 10 - achs.append( + award=15, + ), Achievement( - 'Dual Wielding', 'achievementDualWielding', (1, 1, 1), '', 10 - ) - ) - - # 10 - achs.append( + 'Dual Wielding', + 'achievementDualWielding', + (1, 1, 1), + '', + award=10, + ), Achievement( - 'Free Loader', 'achievementFreeLoader', (1, 1, 1), '', 10 - ) - ) - # 20 - achs.append( + 'Free Loader', + 'achievementFreeLoader', + (1, 1, 1), + '', + award=10, + ), Achievement( - 'Team Player', 'achievementTeamPlayer', (1, 1, 1), '', 20 - ) - ) - - # 5 - achs.append( + 'Team Player', + 'achievementTeamPlayer', + (1, 1, 1), + '', + award=20, + ), Achievement( 'Onslaught Training Victory', 'achievementOnslaught', (1, 1, 1), 'Default:Onslaught Training', - 5, - ) - ) - # 5 - achs.append( + award=5, + ), Achievement( 'Off You Go Then', 'achievementOffYouGo', (1, 1.1, 1.3), 'Default:Onslaught Training', - 5, - ) - ) - # 10 - achs.append( + award=5, + ), Achievement( 'Boxer', 'achievementBoxer', (1, 0.6, 0.6), 'Default:Onslaught Training', - 10, + award=10, hard_mode_only=True, - ) - ) - - # 10 - achs.append( + ), Achievement( 'Rookie Onslaught Victory', 'achievementOnslaught', (0.5, 1.4, 0.6), 'Default:Rookie Onslaught', - 10, - ) - ) - # 10 - achs.append( + award=10, + ), Achievement( 'Mine Games', 'achievementMine', (1, 1, 1.4), 'Default:Rookie Onslaught', - 10, - ) - ) - # 15 - achs.append( + award=10, + ), Achievement( 'Flawless Victory', 'achievementFlawlessVictory', (1, 1, 1), 'Default:Rookie Onslaught', - 15, + award=15, hard_mode_only=True, - ) - ) - - # 10 - achs.append( + ), Achievement( 'Rookie Football Victory', 'achievementFootballVictory', (1.0, 1, 0.6), 'Default:Rookie Football', - 10, - ) - ) - # 10 - achs.append( + award=10, + ), Achievement( 'Super Punch', 'achievementSuperPunch', (1, 1, 1.8), 'Default:Rookie Football', - 10, - ) - ) - # 15 - achs.append( + award=10, + ), Achievement( 'Rookie Football Shutout', 'achievementFootballShutout', (1, 1, 1), 'Default:Rookie Football', - 15, + award=15, hard_mode_only=True, - ) - ) - - # 15 - achs.append( + ), Achievement( 'Pro Onslaught Victory', 'achievementOnslaught', (0.3, 1, 2.0), 'Default:Pro Onslaught', - 15, - ) - ) - # 15 - achs.append( + award=15, + ), Achievement( 'Boom Goes the Dynamite', 'achievementTNT', (1.4, 1.2, 0.8), 'Default:Pro Onslaught', - 15, - ) - ) - # 20 - achs.append( + award=15, + ), Achievement( 'Pro Boxer', 'achievementBoxer', (2, 2, 0), 'Default:Pro Onslaught', - 20, + award=20, hard_mode_only=True, - ) - ) - - # 15 - achs.append( + ), Achievement( 'Pro Football Victory', 'achievementFootballVictory', (1.3, 1.3, 2.0), 'Default:Pro Football', - 15, - ) - ) - # 15 - achs.append( + award=15, + ), Achievement( 'Super Mega Punch', 'achievementSuperPunch', (2, 1, 0.6), 'Default:Pro Football', - 15, - ) - ) - # 20 - achs.append( + award=15, + ), Achievement( 'Pro Football Shutout', 'achievementFootballShutout', (0.7, 0.7, 2.0), 'Default:Pro Football', - 20, + award=20, hard_mode_only=True, - ) - ) - - # 15 - achs.append( + ), Achievement( 'Pro Runaround Victory', 'achievementRunaround', (1, 1, 1), 'Default:Pro Runaround', - 15, - ) - ) - # 20 - achs.append( + award=15, + ), Achievement( 'Precision Bombing', 'achievementCrossHair', (1, 1, 1.3), 'Default:Pro Runaround', - 20, + award=20, hard_mode_only=True, - ) - ) - # 25 - achs.append( + ), Achievement( 'The Wall', 'achievementWall', (1, 0.7, 0.7), 'Default:Pro Runaround', - 25, + award=25, hard_mode_only=True, - ) - ) - - # 30 - achs.append( + ), Achievement( 'Uber Onslaught Victory', 'achievementOnslaught', (2, 2, 1), 'Default:Uber Onslaught', - 30, - ) - ) - # 30 - achs.append( + award=30, + ), Achievement( 'Gold Miner', 'achievementMine', (2, 1.6, 0.2), 'Default:Uber Onslaught', - 30, + award=30, hard_mode_only=True, - ) - ) - # 30 - achs.append( + ), Achievement( 'TNT Terror', 'achievementTNT', (2, 1.8, 0.3), 'Default:Uber Onslaught', - 30, + award=30, hard_mode_only=True, - ) - ) - - # 30 - achs.append( + ), Achievement( 'Uber Football Victory', 'achievementFootballVictory', (1.8, 1.4, 0.3), 'Default:Uber Football', - 30, - ) - ) - # 30 - achs.append( + award=30, + ), Achievement( 'Got the Moves', 'achievementGotTheMoves', (2, 1, 0), 'Default:Uber Football', - 30, + award=30, hard_mode_only=True, - ) - ) - # 40 - achs.append( + ), Achievement( 'Uber Football Shutout', 'achievementFootballShutout', (2, 2, 0), 'Default:Uber Football', - 40, + award=40, hard_mode_only=True, - ) - ) - - # 30 - achs.append( + ), Achievement( 'Uber Runaround Victory', 'achievementRunaround', (1.5, 1.2, 0.2), 'Default:Uber Runaround', - 30, - ) - ) - # 40 - achs.append( + award=30, + ), Achievement( 'The Great Wall', 'achievementWall', (2, 1.7, 0.4), 'Default:Uber Runaround', - 40, + award=40, hard_mode_only=True, - ) - ) - # 40 - achs.append( + ), Achievement( 'Stayin\' Alive', 'achievementStayinAlive', (2, 2, 1), 'Default:Uber Runaround', - 40, + award=40, hard_mode_only=True, - ) - ) - - # 20 - achs.append( + ), Achievement( 'Last Stand Master', 'achievementMedalSmall', (2, 1.5, 0.3), 'Default:The Last Stand', - 20, + award=20, hard_mode_only=True, - ) - ) - # 40 - achs.append( + ), Achievement( 'Last Stand Wizard', 'achievementMedalMedium', (2, 1.5, 0.3), 'Default:The Last Stand', - 40, + award=40, hard_mode_only=True, - ) - ) - # 60 - achs.append( + ), Achievement( 'Last Stand God', 'achievementMedalLarge', (2, 1.5, 0.3), 'Default:The Last Stand', - 60, + award=60, hard_mode_only=True, - ) - ) - - # 5 - achs.append( + ), Achievement( 'Onslaught Master', 'achievementMedalSmall', (0.7, 1, 0.7), 'Challenges:Infinite Onslaught', - 5, - ) - ) - # 15 - achs.append( + award=5, + ), Achievement( 'Onslaught Wizard', 'achievementMedalMedium', (0.7, 1.0, 0.7), 'Challenges:Infinite Onslaught', - 15, - ) - ) - # 30 - achs.append( + award=15, + ), Achievement( 'Onslaught God', 'achievementMedalLarge', (0.7, 1.0, 0.7), 'Challenges:Infinite Onslaught', - 30, - ) - ) - - # 5 - achs.append( + award=30, + ), Achievement( 'Runaround Master', 'achievementMedalSmall', (1.0, 1.0, 1.2), 'Challenges:Infinite Runaround', - 5, - ) - ) - # 15 - achs.append( + award=5, + ), Achievement( 'Runaround Wizard', 'achievementMedalMedium', (1.0, 1.0, 1.2), 'Challenges:Infinite Runaround', - 15, - ) - ) - # 30 - achs.append( + award=15, + ), Achievement( 'Runaround God', 'achievementMedalLarge', (1.0, 1.0, 1.2), 'Challenges:Infinite Runaround', - 30, - ) - ) + award=30, + ), + ] def award_local_achievement(self, achname: str) -> None: """For non-game-based achievements such as controller-connection.""" @@ -652,14 +539,16 @@ class Achievement: self, name: str, icon_name: str, - icon_color: Sequence[float], + icon_color: tuple[float, float, float], level_name: str, + *, award: int, hard_mode_only: bool = False, ): self._name = name self._icon_name = icon_name - self._icon_color: Sequence[float] = list(icon_color) + [1] + assert len(icon_color) == 3 + self._icon_color = icon_color + (1.0,) self._level_name = level_name self._completion_banner_slot: int | None = None self._award = award @@ -842,16 +731,48 @@ class Achievement: ], ) - def get_award_ticket_value(self, include_pro_bonus: bool = False) -> int: - """Get the ticket award value for this achievement.""" + def get_award_chest_type(self) -> ClassicChestAppearance: + """Return the type of chest given for this achievement.""" + + # For now just map our old ticket values to chest types. + # Can add distinct values if need be later. plus = babase.app.plus - if plus is None: - return 0 - val: int = plus.get_v1_account_misc_read_val( - 'achAward.' + self._name, self._award - ) * _get_ach_mult(include_pro_bonus) - assert isinstance(val, int) - return val + assert plus is not None + t = plus.get_v1_account_misc_read_val( + f'achAward.{self.name}', self._award + ) + return ( + ClassicChestAppearance.L6 + if t >= 30 + else ( + ClassicChestAppearance.L5 + if t >= 25 + else ( + ClassicChestAppearance.L4 + if t >= 20 + else ( + ClassicChestAppearance.L3 + if t >= 15 + else ( + ClassicChestAppearance.L2 + if t >= 10 + else ClassicChestAppearance.L1 + ) + ) + ) + ) + ) + + # def get_award_ticket_value(self, include_pro_bonus: bool = False) -> int: + # """Get the ticket award value for this achievement.""" + # plus = babase.app.plus + # if plus is None: + # return 0 + # val: int = plus.get_v1_account_misc_read_val( + # 'achAward.' + self._name, self._award + # ) * _get_ach_mult(include_pro_bonus) + # assert isinstance(val, int) + # return val @property def power_ranking_value(self) -> int: @@ -870,6 +791,7 @@ class Achievement: x: float, y: float, delay: float, + *, outdelay: float | None = None, color: Sequence[float] | None = None, style: str = 'post_game', @@ -1015,42 +937,72 @@ class Achievement: txtactor.node.rotate = 10 objs.append(txtactor) - # Ticket-award. + # Chest award. award_x = -100 - objs.append( - Text( - babase.charstr(babase.SpecialChar.TICKET), - host_only=True, - position=(x + award_x + 33, y + 7), - transition=Text.Transition.FADE_IN, - scale=1.5, - h_attach=h_attach, - v_attach=v_attach, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - color=(1, 1, 1, 0.2 if hmo else 0.4), - transition_delay=delay + 0.05, - transition_out_delay=out_delay_fin, - ).autoretain() + chesttype = self.get_award_chest_type() + chestdisplayinfo = CHEST_APPEARANCE_DISPLAY_INFOS.get( + chesttype, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT ) objs.append( - Text( - '+' + str(self.get_award_ticket_value()), - host_only=True, - position=(x + award_x + 28, y + 16), - transition=Text.Transition.FADE_IN, - scale=0.7, - flatness=1, - h_attach=h_attach, - v_attach=v_attach, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - color=cl2, + Image( + # Provide magical extended dict version of texture + # that Image actor supports. + texture={ + 'texture': bascenev1.gettexture( + chestdisplayinfo.texclosed + ), + 'tint_texture': bascenev1.gettexture( + chestdisplayinfo.texclosedtint + ), + 'tint_color': chestdisplayinfo.tint, + 'tint2_color': chestdisplayinfo.tint2, + 'mask_texture': None, + }, + color=chestdisplayinfo.color + (0.5 if hmo else 1.0,), + position=(x + award_x + 37, y + 12), + scale=(32.0, 32.0), + transition=Image.Transition.FADE_IN, transition_delay=delay + 0.05, transition_out_delay=out_delay_fin, + host_only=True, + attach=Image.Attach.TOP_LEFT, ).autoretain() ) + # objs.append( + # Text( + # babase.charstr(babase.SpecialChar.TICKET), + # host_only=True, + # position=(x + award_x + 33, y + 7), + # transition=Text.Transition.FADE_IN, + # scale=1.5, + # h_attach=h_attach, + # v_attach=v_attach, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # color=(1, 1, 1, 0.2 if hmo else 0.4), + # transition_delay=delay + 0.05, + # transition_out_delay=out_delay_fin, + # ).autoretain() + # ) + # objs.append( + # Text( + # '+' + str(self.get_award_ticket_value()), + # host_only=True, + # position=(x + award_x + 28, y + 16), + # transition=Text.Transition.FADE_IN, + # scale=0.7, + # flatness=1, + # h_attach=h_attach, + # v_attach=v_attach, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # color=cl2, + # transition_delay=delay + 0.05, + # transition_out_delay=out_delay_fin, + # ).autoretain() + # ) + else: complete = self.complete objs = [] @@ -1092,40 +1044,71 @@ class Achievement: else: if not complete: award_x = -100 - objs.append( - Text( - babase.charstr(babase.SpecialChar.TICKET), - host_only=True, - position=(x + award_x + 33, y + 7), - transition=Text.Transition.IN_RIGHT, - scale=1.5, - h_attach=h_attach, - v_attach=v_attach, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - color=(1, 1, 1, (0.1 if hmo else 0.2)), - transition_delay=delay + 0.05, - transition_out_delay=None, - ).autoretain() + # objs.append( + # Text( + # babase.charstr(babase.SpecialChar.TICKET), + # host_only=True, + # position=(x + award_x + 33, y + 7), + # transition=Text.Transition.IN_RIGHT, + # scale=1.5, + # h_attach=h_attach, + # v_attach=v_attach, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # color=(1, 1, 1, (0.1 if hmo else 0.2)), + # transition_delay=delay + 0.05, + # transition_out_delay=None, + # ).autoretain() + # ) + chesttype = self.get_award_chest_type() + chestdisplayinfo = CHEST_APPEARANCE_DISPLAY_INFOS.get( + chesttype, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT ) objs.append( - Text( - '+' + str(self.get_award_ticket_value()), - host_only=True, - position=(x + award_x + 28, y + 16), - transition=Text.Transition.IN_RIGHT, - scale=0.7, - flatness=1, - h_attach=h_attach, - v_attach=v_attach, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - color=(0.6, 0.6, 0.6, (0.2 if hmo else 0.4)), + Image( + # Provide magical extended dict version of texture + # that Image actor supports. + texture={ + 'texture': bascenev1.gettexture( + chestdisplayinfo.texclosed + ), + 'tint_texture': bascenev1.gettexture( + chestdisplayinfo.texclosedtint + ), + 'tint_color': chestdisplayinfo.tint, + 'tint2_color': chestdisplayinfo.tint2, + 'mask_texture': None, + }, + color=chestdisplayinfo.color + + (0.5 if hmo else 1.0,), + position=(x + award_x + 38, y + 14), + scale=(32.0, 32.0), + transition=Image.Transition.IN_RIGHT, transition_delay=delay + 0.05, transition_out_delay=None, + host_only=True, + attach=attach, ).autoretain() ) + # objs.append( + # Text( + # '+' + str(self.get_award_ticket_value()), + # host_only=True, + # position=(x + award_x + 28, y + 16), + # transition=Text.Transition.IN_RIGHT, + # scale=0.7, + # flatness=1, + # h_attach=h_attach, + # v_attach=v_attach, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # color=(0.6, 0.6, 0.6, (0.2 if hmo else 0.4)), + # transition_delay=delay + 0.05, + # transition_out_delay=None, + # ).autoretain() + # ) + # Show 'hard-mode-only' only over incomplete achievements # when that's the case. if hmo: @@ -1457,68 +1440,70 @@ class Achievement: assert objt.node objt.node.host_only = True - objt = Text( - babase.charstr(babase.SpecialChar.TICKET), - position=(-120 - 170 + 5, 75 + y_offs - 20), - front=True, - v_attach=Text.VAttach.BOTTOM, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - transition=Text.Transition.IN_BOTTOM, - vr_depth=base_vr_depth, - transition_delay=in_time, - transition_out_delay=out_time, - flash=True, - color=(0.5, 0.5, 0.5, 1), - scale=3.0, - ).autoretain() - objs.append(objt) - assert objt.node - objt.node.host_only = True + # objt = Text( + # babase.charstr(babase.SpecialChar.TICKET), + # position=(-120 - 170 + 5, 75 + y_offs - 20), + # front=True, + # v_attach=Text.VAttach.BOTTOM, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # transition=Text.Transition.IN_BOTTOM, + # vr_depth=base_vr_depth, + # transition_delay=in_time, + # transition_out_delay=out_time, + # flash=True, + # color=(0.5, 0.5, 0.5, 1), + # scale=3.0, + # ).autoretain() + # objs.append(objt) + # assert objt.node + # objt.node.host_only = True + + # print('FIXME SHOW ACH CHEST3') + # objt = Text( + # '+' + str(self.get_award_ticket_value()), + # position=(-120 - 180 + 5, 80 + y_offs - 20), + # v_attach=Text.VAttach.BOTTOM, + # front=True, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # transition=Text.Transition.IN_BOTTOM, + # vr_depth=base_vr_depth, + # flatness=0.5, + # shadow=1.0, + # transition_delay=in_time, + # transition_out_delay=out_time, + # flash=True, + # color=(0, 1, 0, 1), + # scale=1.5, + # ).autoretain() + # objs.append(objt) - objt = Text( - '+' + str(self.get_award_ticket_value()), - position=(-120 - 180 + 5, 80 + y_offs - 20), - v_attach=Text.VAttach.BOTTOM, - front=True, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - transition=Text.Transition.IN_BOTTOM, - vr_depth=base_vr_depth, - flatness=0.5, - shadow=1.0, - transition_delay=in_time, - transition_out_delay=out_time, - flash=True, - color=(0, 1, 0, 1), - scale=1.5, - ).autoretain() - objs.append(objt) assert objt.node objt.node.host_only = True # Add the 'x 2' if we've got pro. - if app.classic.accounts.have_pro(): - objt = Text( - 'x 2', - position=(-120 - 180 + 45, 80 + y_offs - 50), - v_attach=Text.VAttach.BOTTOM, - front=True, - h_align=Text.HAlign.CENTER, - v_align=Text.VAlign.CENTER, - transition=Text.Transition.IN_BOTTOM, - vr_depth=base_vr_depth, - flatness=0.5, - shadow=1.0, - transition_delay=in_time, - transition_out_delay=out_time, - flash=True, - color=(0.4, 0, 1, 1), - scale=0.9, - ).autoretain() - objs.append(objt) - assert objt.node - objt.node.host_only = True + # if app.classic.accounts.have_pro(): + # objt = Text( + # 'x 2', + # position=(-120 - 180 + 45, 80 + y_offs - 50), + # v_attach=Text.VAttach.BOTTOM, + # front=True, + # h_align=Text.HAlign.CENTER, + # v_align=Text.VAlign.CENTER, + # transition=Text.Transition.IN_BOTTOM, + # vr_depth=base_vr_depth, + # flatness=0.5, + # shadow=1.0, + # transition_delay=in_time, + # transition_out_delay=out_time, + # flash=True, + # color=(0.4, 0, 1, 1), + # scale=0.9, + # ).autoretain() + # objs.append(objt) + # assert objt.node + # objt.node.host_only = True objt = Text( self.description_complete, diff --git a/dist/ba_data/python/baclassic/_ads.py b/dist/ba_data/python/baclassic/_ads.py index 5cd454d..b2f6917 100644 --- a/dist/ba_data/python/baclassic/_ads.py +++ b/dist/ba_data/python/baclassic/_ads.py @@ -48,19 +48,7 @@ class AdsSubsystem: 1.0, lambda: babase.screenmessage( babase.Lstr( - resource='removeInGameAdsText', - subs=[ - ( - '${PRO}', - babase.Lstr( - resource='store.bombSquadProNameText' - ), - ), - ( - '${APP_NAME}', - babase.Lstr(resource='titleText'), - ), - ], + resource='removeInGameAdsTokenPurchaseText' ), color=(1, 1, 0), ), @@ -100,8 +88,14 @@ class AdsSubsystem: # No ads without net-connections, etc. if not plus.can_show_ad(): show = False - if classic.accounts.have_pro(): - show = False # Pro disables interstitials. + + # Pro or other upgrades disable interstitials. + if ( + classic.accounts.have_pro() + or classic.gold_pass + or classic.remove_ads + ): + show = False try: session = bascenev1.get_foreground_host_session() assert session is not None diff --git a/dist/ba_data/python/baclassic/_appdelegate.py b/dist/ba_data/python/baclassic/_appdelegate.py deleted file mode 100644 index 1dd1a6b..0000000 --- a/dist/ba_data/python/baclassic/_appdelegate.py +++ /dev/null @@ -1,46 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""Defines AppDelegate class for handling high level app functionality.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -import babase - -if TYPE_CHECKING: - from typing import Callable - import bascenev1 - - -class AppDelegate: - """Defines handlers for high level app functionality. - - Category: App Classes - """ - - def create_default_game_settings_ui( - self, - gameclass: type[bascenev1.GameActivity], - sessiontype: type[bascenev1.Session], - settings: dict | None, - completion_call: Callable[[dict | None], None], - ) -> None: - """Launch a UI to configure the given game config. - - It should manipulate the contents of config and call completion_call - when done. - """ - # Replace the main window once we come up successfully. - from bauiv1lib.playlist.editgame import PlaylistEditGameWindow - - assert babase.app.classic is not None - babase.app.ui_v1.clear_main_menu_window(transition='out_left') - babase.app.ui_v1.set_main_menu_window( - PlaylistEditGameWindow( - gameclass, - sessiontype, - settings, - completion_call=completion_call, - ).get_root_widget(), - from_window=False, # Disable check since we don't know. - ) diff --git a/dist/ba_data/python/baclassic/_appmode.py b/dist/ba_data/python/baclassic/_appmode.py new file mode 100644 index 0000000..50fa333 --- /dev/null +++ b/dist/ba_data/python/baclassic/_appmode.py @@ -0,0 +1,658 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Contains ClassicAppMode.""" +from __future__ import annotations + +import os +import logging +from functools import partial +from typing import TYPE_CHECKING, override + +from bacommon.app import AppExperience +import babase +import bauiv1 +from bauiv1lib.connectivity import wait_for_connectivity +from bauiv1lib.account.signin import show_sign_in_prompt + +import _baclassic + +if TYPE_CHECKING: + from typing import Callable, Any, Literal + + from efro.call import CallbackRegistration + import bacommon.cloud + from bauiv1lib.chest import ChestWindow + + +# ba_meta export babase.AppMode +class ClassicAppMode(babase.AppMode): + """AppMode for the classic BombSquad experience.""" + + def __init__(self) -> None: + self._on_primary_account_changed_callback: ( + CallbackRegistration | None + ) = None + self._on_connectivity_changed_callback: CallbackRegistration | None = ( + None + ) + self._test_sub: babase.CloudSubscription | None = None + self._account_data_sub: babase.CloudSubscription | None = None + + self._have_account_values = False + self._have_connectivity = False + + @override + @classmethod + def get_app_experience(cls) -> AppExperience: + return AppExperience.MELEE + + @override + @classmethod + def _can_handle_intent(cls, intent: babase.AppIntent) -> bool: + # We support default and exec intents currently. + return isinstance( + intent, babase.AppIntentExec | babase.AppIntentDefault + ) + + @override + def handle_intent(self, intent: babase.AppIntent) -> None: + if isinstance(intent, babase.AppIntentExec): + _baclassic.classic_app_mode_handle_app_intent_exec(intent.code) + return + assert isinstance(intent, babase.AppIntentDefault) + _baclassic.classic_app_mode_handle_app_intent_default() + + @override + def on_activate(self) -> None: + + # Let the native layer do its thing. + _baclassic.classic_app_mode_activate() + + app = babase.app + plus = app.plus + assert plus is not None + + # Wire up the root ui to do what we want. + ui = app.ui_v1 + ui.root_ui_calls[ui.RootUIElement.ACCOUNT_BUTTON] = ( + self._root_ui_account_press + ) + ui.root_ui_calls[ui.RootUIElement.MENU_BUTTON] = ( + self._root_ui_menu_press + ) + ui.root_ui_calls[ui.RootUIElement.SQUAD_BUTTON] = ( + self._root_ui_squad_press + ) + ui.root_ui_calls[ui.RootUIElement.SETTINGS_BUTTON] = ( + self._root_ui_settings_press + ) + ui.root_ui_calls[ui.RootUIElement.STORE_BUTTON] = ( + self._root_ui_store_press + ) + ui.root_ui_calls[ui.RootUIElement.INVENTORY_BUTTON] = ( + self._root_ui_inventory_press + ) + ui.root_ui_calls[ui.RootUIElement.GET_TOKENS_BUTTON] = ( + self._root_ui_get_tokens_press + ) + ui.root_ui_calls[ui.RootUIElement.INBOX_BUTTON] = ( + self._root_ui_inbox_press + ) + ui.root_ui_calls[ui.RootUIElement.TICKETS_METER] = ( + self._root_ui_tickets_meter_press + ) + ui.root_ui_calls[ui.RootUIElement.TOKENS_METER] = ( + self._root_ui_tokens_meter_press + ) + ui.root_ui_calls[ui.RootUIElement.TROPHY_METER] = ( + self._root_ui_trophy_meter_press + ) + ui.root_ui_calls[ui.RootUIElement.LEVEL_METER] = ( + self._root_ui_level_meter_press + ) + ui.root_ui_calls[ui.RootUIElement.ACHIEVEMENTS_BUTTON] = ( + self._root_ui_achievements_press + ) + ui.root_ui_calls[ui.RootUIElement.CHEST_SLOT_0] = partial( + self._root_ui_chest_slot_pressed, 0 + ) + ui.root_ui_calls[ui.RootUIElement.CHEST_SLOT_1] = partial( + self._root_ui_chest_slot_pressed, 1 + ) + ui.root_ui_calls[ui.RootUIElement.CHEST_SLOT_2] = partial( + self._root_ui_chest_slot_pressed, 2 + ) + ui.root_ui_calls[ui.RootUIElement.CHEST_SLOT_3] = partial( + self._root_ui_chest_slot_pressed, 3 + ) + + # We want to be informed when connectivity changes. + self._on_connectivity_changed_callback = ( + plus.cloud.on_connectivity_changed_callbacks.register( + self._update_for_connectivity_change + ) + ) + # We want to be informed when primary account changes. + self._on_primary_account_changed_callback = ( + plus.accounts.on_primary_account_changed_callbacks.register( + self._update_for_primary_account + ) + ) + # Establish subscriptions/etc. for any current primary account. + self._update_for_primary_account(plus.accounts.primary) + self._have_connectivity = plus.cloud.is_connected() + self._update_for_connectivity_change(self._have_connectivity) + + @override + def on_deactivate(self) -> None: + + classic = babase.app.classic + + # Stop being informed of account changes. + self._on_primary_account_changed_callback = None + + # Remove anything following any current account. + self._update_for_primary_account(None) + + # Save where we were in the UI so we return there next time. + if classic is not None: + classic.save_ui_state() + + # Let the native layer do its thing. + _baclassic.classic_app_mode_deactivate() + + @override + def on_app_active_changed(self) -> None: + # If we've gone inactive, bring up the main menu, which has the + # side effect of pausing the action (when possible). + if not babase.app.active: + babase.invoke_main_menu() + + def _update_for_primary_account( + self, account: babase.AccountV2Handle | None + ) -> None: + """Update subscriptions/etc. for a new primary account state.""" + assert babase.in_logic_thread() + plus = babase.app.plus + + assert plus is not None + + classic = babase.app.classic + assert classic is not None + + if account is not None: + babase.set_ui_account_state(True, account.tag) + else: + babase.set_ui_account_state(False) + + # For testing subscription functionality. + if os.environ.get('BA_SUBSCRIPTION_TEST') == '1': + if account is None: + self._test_sub = None + else: + with account: + self._test_sub = plus.cloud.subscribe_test( + self._on_sub_test_update + ) + else: + self._test_sub = None + + if account is None: + classic.gold_pass = False + classic.chest_dock_full = False + classic.remove_ads = False + self._account_data_sub = None + _baclassic.set_root_ui_account_values( + tickets=-1, + tokens=-1, + league_rank=-1, + league_type='', + achievements_percent_text='', + level_text='', + xp_text='', + inbox_count_text='', + gold_pass=False, + chest_0_appearance='', + chest_1_appearance='', + chest_2_appearance='', + chest_3_appearance='', + chest_0_unlock_time=-1.0, + chest_1_unlock_time=-1.0, + chest_2_unlock_time=-1.0, + chest_3_unlock_time=-1.0, + chest_0_ad_allow_time=-1.0, + chest_1_ad_allow_time=-1.0, + chest_2_ad_allow_time=-1.0, + chest_3_ad_allow_time=-1.0, + ) + self._have_account_values = False + self._update_ui_live_state() + + else: + with account: + self._account_data_sub = ( + plus.cloud.subscribe_classic_account_data( + self._on_classic_account_data_change + ) + ) + + def _update_for_connectivity_change(self, connected: bool) -> None: + """Update when the app's connectivity state changes.""" + self._have_connectivity = connected + self._update_ui_live_state() + + def _update_ui_live_state(self) -> None: + # We want to show ui elements faded if we don't have a live + # connection to the master-server OR if we haven't received a + # set of account values from them yet. If we just plug in raw + # connectivity state here we get UI stuff un-fading a moment or + # two before values appear (since the subscriptions have not + # sent us any values yet) which looks odd. + _baclassic.set_root_ui_have_live_values( + self._have_connectivity and self._have_account_values + ) + + def _on_sub_test_update(self, val: int | None) -> None: + print(f'GOT SUB TEST UPDATE: {val}') + + def _on_classic_account_data_change( + self, val: bacommon.bs.ClassicAccountLiveData + ) -> None: + # print('ACCOUNT CHANGED:', val) + achp = round(val.achievements / max(val.achievements_total, 1) * 100.0) + ibc = str(val.inbox_count) + if val.inbox_count_is_max: + ibc += '+' + + chest0 = val.chests.get('0') + chest1 = val.chests.get('1') + chest2 = val.chests.get('2') + chest3 = val.chests.get('3') + + # Keep a few handy values on classic updated with the latest + # data. + classic = babase.app.classic + assert classic is not None + classic.remove_ads = val.remove_ads + classic.gold_pass = val.gold_pass + classic.chest_dock_full = ( + chest0 is not None + and chest1 is not None + and chest2 is not None + and chest3 is not None + ) + + _baclassic.set_root_ui_account_values( + tickets=val.tickets, + tokens=val.tokens, + league_rank=(-1 if val.league_rank is None else val.league_rank), + league_type=( + '' if val.league_type is None else val.league_type.value + ), + achievements_percent_text=f'{achp}%', + level_text=str(val.level), + xp_text=f'{val.xp}/{val.xpmax}', + inbox_count_text=ibc, + gold_pass=val.gold_pass, + chest_0_appearance=( + '' if chest0 is None else chest0.appearance.value + ), + chest_1_appearance=( + '' if chest1 is None else chest1.appearance.value + ), + chest_2_appearance=( + '' if chest2 is None else chest2.appearance.value + ), + chest_3_appearance=( + '' if chest3 is None else chest3.appearance.value + ), + chest_0_unlock_time=( + -1.0 if chest0 is None else chest0.unlock_time.timestamp() + ), + chest_1_unlock_time=( + -1.0 if chest1 is None else chest1.unlock_time.timestamp() + ), + chest_2_unlock_time=( + -1.0 if chest2 is None else chest2.unlock_time.timestamp() + ), + chest_3_unlock_time=( + -1.0 if chest3 is None else chest3.unlock_time.timestamp() + ), + chest_0_ad_allow_time=( + -1.0 + if chest0 is None or chest0.ad_allow_time is None + else chest0.ad_allow_time.timestamp() + ), + chest_1_ad_allow_time=( + -1.0 + if chest1 is None or chest1.ad_allow_time is None + else chest1.ad_allow_time.timestamp() + ), + chest_2_ad_allow_time=( + -1.0 + if chest2 is None or chest2.ad_allow_time is None + else chest2.ad_allow_time.timestamp() + ), + chest_3_ad_allow_time=( + -1.0 + if chest3 is None or chest3.ad_allow_time is None + else chest3.ad_allow_time.timestamp() + ), + ) + + # Note that we have values and updated faded state accordingly. + self._have_account_values = True + self._update_ui_live_state() + + def _root_ui_menu_press(self) -> None: + from babase import push_back_press + + ui = babase.app.ui_v1 + + # If *any* main-window is up, kill it and resume play. + old_window = ui.get_main_window() + if old_window is not None: + + classic = babase.app.classic + assert classic is not None + classic.resume() + + ui.clear_main_window() + return + + # Otherwise + push_back_press() + + def _root_ui_account_press(self) -> None: + from bauiv1lib.account.settings import AccountSettingsWindow + + self._auxiliary_window_nav( + win_type=AccountSettingsWindow, + win_create_call=lambda: AccountSettingsWindow( + origin_widget=bauiv1.get_special_widget('account_button') + ), + ) + + def _root_ui_squad_press(self) -> None: + btn = bauiv1.get_special_widget('squad_button') + center = btn.get_screen_space_center() + if bauiv1.app.classic is not None: + bauiv1.app.classic.party_icon_activate(center) + else: + logging.warning('party_icon_activate: no classic.') + + def _root_ui_settings_press(self) -> None: + from bauiv1lib.settings.allsettings import AllSettingsWindow + + self._auxiliary_window_nav( + win_type=AllSettingsWindow, + win_create_call=lambda: AllSettingsWindow( + origin_widget=bauiv1.get_special_widget('settings_button') + ), + ) + + def _auxiliary_window_nav( + self, + win_type: type[bauiv1.MainWindow], + win_create_call: Callable[[], bauiv1.MainWindow], + ) -> None: + """Navigate to or away from an Auxiliary window. + + Auxiliary windows can be thought of as 'side quests' in the + window hierarchy; places such as settings windows or league + ranking windows that the user might want to visit without losing + their place in the regular hierarchy. + """ + # pylint: disable=unidiomatic-typecheck + + ui = babase.app.ui_v1 + + current_main_window = ui.get_main_window() + + # Scan our ancestors for auxiliary states matching our type as + # well as auxiliary states in general. + aux_matching_state: bauiv1.MainWindowState | None = None + aux_state: bauiv1.MainWindowState | None = None + + if current_main_window is None: + raise RuntimeError( + 'Not currently handling no-top-level-window case.' + ) + + state = current_main_window.main_window_back_state + while state is not None: + assert state.window_type is not None + if state.is_auxiliary: + if state.window_type is win_type: + aux_matching_state = state + else: + aux_state = state + + state = state.parent + + # If there's an ancestor auxiliary window-state matching our + # type, back out past it (example: poking settings, navigating + # down a level or two, and then poking settings again should + # back out of settings). + if aux_matching_state is not None: + current_main_window.main_window_back_state = ( + aux_matching_state.parent + ) + current_main_window.main_window_back() + return + + # If there's an ancestory auxiliary state *not* matching our + # type, crop the state and swap in our new auxiliary UI + # (example: poking settings, then poking account, then poking + # back should end up where things were before the settings + # poke). + if aux_state is not None: + # Blow away the window stack and build a fresh one. + ui.clear_main_window() + ui.set_main_window( + win_create_call(), + from_window=False, # Disable from-check. + back_state=aux_state.parent, + suppress_warning=True, + is_auxiliary=True, + ) + return + + # Ok, no auxiliary states found. Now if current window is + # auxiliary and the type matches, simply do a back. + if ( + current_main_window.main_window_is_auxiliary + and type(current_main_window) is win_type + ): + current_main_window.main_window_back() + return + + # If current window is auxiliary but type doesn't match, + # swap it out for our new auxiliary UI. + if current_main_window.main_window_is_auxiliary: + ui.clear_main_window() + ui.set_main_window( + win_create_call(), + from_window=False, # Disable from-check. + back_state=current_main_window.main_window_back_state, + suppress_warning=True, + is_auxiliary=True, + ) + return + + # Ok, no existing auxiliary stuff was found period. Just + # navigate forward to this UI. + current_main_window.main_window_replace( + win_create_call(), is_auxiliary=True + ) + + def _root_ui_achievements_press(self) -> None: + from bauiv1lib.achievements import AchievementsWindow + + if not self._ensure_signed_in_v1(): + return + + wait_for_connectivity( + on_connected=lambda: self._auxiliary_window_nav( + win_type=AchievementsWindow, + win_create_call=lambda: AchievementsWindow( + origin_widget=bauiv1.get_special_widget( + 'achievements_button' + ) + ), + ) + ) + + def _root_ui_inbox_press(self) -> None: + from bauiv1lib.inbox import InboxWindow + + if not self._ensure_signed_in(): + return + + wait_for_connectivity( + on_connected=lambda: self._auxiliary_window_nav( + win_type=InboxWindow, + win_create_call=lambda: InboxWindow( + origin_widget=bauiv1.get_special_widget('inbox_button') + ), + ) + ) + + def _root_ui_store_press(self) -> None: + from bauiv1lib.store.browser import StoreBrowserWindow + + if not self._ensure_signed_in_v1(): + return + + wait_for_connectivity( + on_connected=lambda: self._auxiliary_window_nav( + win_type=StoreBrowserWindow, + win_create_call=lambda: StoreBrowserWindow( + origin_widget=bauiv1.get_special_widget('store_button') + ), + ) + ) + + def _root_ui_tickets_meter_press(self) -> None: + from bauiv1lib.resourcetypeinfo import ResourceTypeInfoWindow + + ResourceTypeInfoWindow( + 'tickets', origin_widget=bauiv1.get_special_widget('tickets_meter') + ) + + def _root_ui_tokens_meter_press(self) -> None: + from bauiv1lib.resourcetypeinfo import ResourceTypeInfoWindow + + ResourceTypeInfoWindow( + 'tokens', origin_widget=bauiv1.get_special_widget('tokens_meter') + ) + + def _root_ui_trophy_meter_press(self) -> None: + from bauiv1lib.league.rankwindow import LeagueRankWindow + + if not self._ensure_signed_in_v1(): + return + + self._auxiliary_window_nav( + win_type=LeagueRankWindow, + win_create_call=lambda: LeagueRankWindow( + origin_widget=bauiv1.get_special_widget('trophy_meter') + ), + ) + + def _root_ui_level_meter_press(self) -> None: + from bauiv1lib.resourcetypeinfo import ResourceTypeInfoWindow + + ResourceTypeInfoWindow( + 'xp', origin_widget=bauiv1.get_special_widget('level_meter') + ) + + def _root_ui_inventory_press(self) -> None: + from bauiv1lib.inventory import InventoryWindow + + if not self._ensure_signed_in_v1(): + return + + self._auxiliary_window_nav( + win_type=InventoryWindow, + win_create_call=lambda: InventoryWindow( + origin_widget=bauiv1.get_special_widget('inventory_button') + ), + ) + + def _ensure_signed_in(self) -> bool: + """Make sure we're signed in (requiring modern v2 accounts).""" + plus = bauiv1.app.plus + if plus is None: + bauiv1.screenmessage('This requires plus.', color=(1, 0, 0)) + bauiv1.getsound('error').play() + return False + if plus.accounts.primary is None: + show_sign_in_prompt() + return False + return True + + def _ensure_signed_in_v1(self) -> bool: + """Make sure we're signed in (allowing legacy v1-only accounts).""" + plus = bauiv1.app.plus + if plus is None: + bauiv1.screenmessage('This requires plus.', color=(1, 0, 0)) + bauiv1.getsound('error').play() + return False + if plus.get_v1_account_state() != 'signed_in': + show_sign_in_prompt() + return False + return True + + def _root_ui_get_tokens_press(self) -> None: + from bauiv1lib.gettokens import GetTokensWindow + + if not self._ensure_signed_in(): + return + + self._auxiliary_window_nav( + win_type=GetTokensWindow, + win_create_call=lambda: GetTokensWindow( + origin_widget=bauiv1.get_special_widget('get_tokens_button') + ), + ) + + def _root_ui_chest_slot_pressed(self, index: int) -> None: + from bauiv1lib.chest import ( + ChestWindow0, + ChestWindow1, + ChestWindow2, + ChestWindow3, + ) + + widgetid: Literal[ + 'chest_0_button', + 'chest_1_button', + 'chest_2_button', + 'chest_3_button', + ] + winclass: type[ChestWindow] + if index == 0: + widgetid = 'chest_0_button' + winclass = ChestWindow0 + elif index == 1: + widgetid = 'chest_1_button' + winclass = ChestWindow1 + elif index == 2: + widgetid = 'chest_2_button' + winclass = ChestWindow2 + elif index == 3: + widgetid = 'chest_3_button' + winclass = ChestWindow3 + else: + raise RuntimeError(f'Invalid index {index}') + + wait_for_connectivity( + on_connected=lambda: self._auxiliary_window_nav( + win_type=winclass, + win_create_call=lambda: winclass( + index=index, + origin_widget=bauiv1.get_special_widget(widgetid), + ), + ) + ) diff --git a/dist/ba_data/python/baclassic/_subsystem.py b/dist/ba_data/python/baclassic/_appsubsystem.py similarity index 71% rename from dist/ba_data/python/baclassic/_subsystem.py rename to dist/ba_data/python/baclassic/_appsubsystem.py index 16611ec..5879496 100644 --- a/dist/ba_data/python/baclassic/_subsystem.py +++ b/dist/ba_data/python/baclassic/_appsubsystem.py @@ -3,10 +3,10 @@ """Provides classic app subsystem.""" from __future__ import annotations -from typing import TYPE_CHECKING, override import random import logging import weakref +from typing import TYPE_CHECKING, override, assert_never from efro.dataclassio import dataclass_from_dict import babase @@ -26,15 +26,15 @@ from baclassic import _input if TYPE_CHECKING: from typing import Callable, Any, Sequence + import bacommon.bs from bascenev1lib.actor import spazappearance from bauiv1lib.party import PartyWindow - from baclassic._appdelegate import AppDelegate from baclassic._servermode import ServerController from baclassic._net import MasterServerCallback -class ClassicSubsystem(babase.AppSubsystem): +class ClassicAppSubsystem(babase.AppSubsystem): """Subsystem for classic functionality in the app. The single shared instance of this app can be accessed at @@ -45,7 +45,6 @@ class ClassicSubsystem(babase.AppSubsystem): # pylint: disable=too-many-public-methods - # noinspection PyUnresolvedReferences from baclassic._music import MusicPlayMode def __init__(self) -> None: @@ -72,10 +71,14 @@ class ClassicSubsystem(babase.AppSubsystem): self.stress_test_update_timer: babase.AppTimer | None = None self.stress_test_update_timer_2: babase.AppTimer | None = None self.value_test_defaults: dict = {} - self.special_offer: dict | None = None self.ping_thread_count = 0 self.allow_ticket_purchases: bool = True + # Classic-specific account state. + self.remove_ads = False + self.gold_pass = False + self.chest_dock_full = False + # Main Menu. self.main_menu_did_initial_transition = False self.main_menu_last_news_fetch_time: float | None = None @@ -93,17 +96,17 @@ class ClassicSubsystem(babase.AppSubsystem): # We include this extra hash with shared input-mapping names so # that we don't share mappings between differently-configured - # systems. For instance, different android devices may give different - # key values for the same controller type so we keep their mappings - # distinct. + # systems. For instance, different android devices may give + # different key values for the same controller type so we keep + # their mappings distinct. self.input_map_hash: str | None = None # Maps. self.maps: dict[str, type[bascenev1.Map]] = {} # Gameplay. - self.teams_series_length = 7 # deprecated, left for old mods - self.ffa_series_length = 24 # deprecated, left for old mods + self.teams_series_length = 7 # Deprecated, left for old mods. + self.ffa_series_length = 24 # Deprecated, left for old mods. self.coop_session_args: dict = {} # UI. @@ -111,8 +114,9 @@ class ClassicSubsystem(babase.AppSubsystem): self.did_menu_intro = False # FIXME: Move to mainmenu class. self.main_menu_window_refresh_check_count = 0 # FIXME: Mv to mainmenu. self.invite_confirm_windows: list[Any] = [] # FIXME: Don't use Any. - self.delegate: AppDelegate | None = None self.party_window: weakref.ref[PartyWindow] | None = None + self.main_menu_resume_callbacks: list = [] + self.saved_ui_state: bauiv1.MainWindowState | None = None # Store. self.store_layout: dict[str, list[dict[str, Any]]] | None = None @@ -120,6 +124,16 @@ class ClassicSubsystem(babase.AppSubsystem): self.pro_sale_start_time: int | None = None self.pro_sale_start_val: int | None = None + def add_main_menu_close_callback(self, call: Callable[[], Any]) -> None: + """(internal)""" + + # If there's no main window up, just call immediately. + if not babase.app.ui_v1.has_main_window(): + with babase.ContextRef.empty(): + call() + else: + self.main_menu_resume_callbacks.append(call) + @property def platform(self) -> str: """Name of the current platform. @@ -154,8 +168,6 @@ class ClassicSubsystem(babase.AppSubsystem): from bascenev1lib.actor import spazappearance from bascenev1lib import maps as stdmaps - from baclassic._appdelegate import AppDelegate - plus = babase.app.plus assert plus is not None @@ -164,34 +176,13 @@ class ClassicSubsystem(babase.AppSubsystem): self.music.on_app_loading() - self.delegate = AppDelegate() - - # Non-test, non-debug builds should generally be blessed; warn if not. - # (so I don't accidentally release a build that can't play tourneys) + # Non-test, non-debug builds should generally be blessed; warn + # if not (so I don't accidentally release a build that can't + # play tourneys). if not env.debug and not env.test and not plus.is_blessed(): babase.screenmessage('WARNING: NON-BLESSED BUILD', color=(1, 0, 0)) - # FIXME: This should not be hard-coded. - for maptype in [ - stdmaps.HockeyStadium, - stdmaps.FootballStadium, - stdmaps.Bridgit, - stdmaps.BigG, - stdmaps.Roundabout, - stdmaps.MonkeyFace, - stdmaps.ZigZag, - stdmaps.ThePad, - stdmaps.DoomShroom, - stdmaps.LakeFrigid, - stdmaps.TipTop, - stdmaps.CragCastle, - stdmaps.TowerD, - stdmaps.HappyThoughts, - stdmaps.StepRightUp, - stdmaps.Courtyard, - stdmaps.Rampage, - ]: - bascenev1.register_map(maptype) + stdmaps.register_all_maps() spazappearance.register_appearances() bascenev1.init_campaigns() @@ -207,24 +198,6 @@ class ClassicSubsystem(babase.AppSubsystem): cfg['launchCount'] = launch_count cfg.commit() - # Run a test in a few seconds to see if we should pop up an existing - # pending special offer. - def check_special_offer() -> None: - assert plus is not None - - from bauiv1lib.specialoffer import show_offer - - if ( - 'pendingSpecialOffer' in cfg - and plus.get_v1_account_public_login_id() - == cfg['pendingSpecialOffer']['a'] - ): - self.special_offer = cfg['pendingSpecialOffer']['o'] - show_offer() - - if babase.app.env.gui: - babase.apptimer(3.0, check_special_offer) - # If there's a leftover log file, attempt to upload it to the # master-server and/or get rid of it. babase.handle_leftover_v1_cloud_log_file() @@ -261,8 +234,8 @@ class ClassicSubsystem(babase.AppSubsystem): from babase import Lstr from bascenev1 import NodeActor - # FIXME: Shouldn't be touching scene stuff here; - # should just pass the request on to the host-session. + # FIXME: Shouldn't be touching scene stuff here; should just + # pass the request on to the host-session. with activity.context: globs = activity.globalsnode if not globs.paused: @@ -289,8 +262,8 @@ class ClassicSubsystem(babase.AppSubsystem): to resume. """ - # FIXME: Shouldn't be touching scene stuff here; - # should just pass the request on to the host-session. + # FIXME: Shouldn't be touching scene stuff here; should just + # pass the request on to the host-session. activity = bascenev1.get_foreground_host_activity() if activity is not None: with activity.context: @@ -340,6 +313,9 @@ class ClassicSubsystem(babase.AppSubsystem): ) return False + # Save where we are in the UI to come back to when done. + babase.app.classic.save_ui_state() + # Ok, we're good to go. self.coop_session_args = { 'campaign': campaignname, @@ -374,24 +350,24 @@ class ClassicSubsystem(babase.AppSubsystem): assert plus is not None if reset_ui: - babase.app.ui_v1.clear_main_menu_window() + babase.app.ui_v1.clear_main_window() if isinstance(bascenev1.get_foreground_host_session(), MainMenuSession): - # It may be possible we're on the main menu but the screen is faded - # so fade back in. + # It may be possible we're on the main menu but the screen + # is faded so fade back in. babase.fade_screen(True) return _benchmark.stop_stress_test() # Stop stress-test if in progress. - # If we're in a host-session, tell them to end. - # This lets them tear themselves down gracefully. + # If we're in a host-session, tell them to end. This lets them + # tear themselves down gracefully. host_session: bascenev1.Session | None = ( bascenev1.get_foreground_host_session() ) if host_session is not None: - # Kick off a little transaction so we'll hopefully have all the - # latest account state when we get back to the menu. + # Kick off a little transaction so we'll hopefully have all + # the latest account state when we get back to the menu. plus.add_v1_account_transaction( {'type': 'END_SESSION', 'sType': str(type(host_session))} ) @@ -518,11 +494,36 @@ class ClassicSubsystem(babase.AppSubsystem): request, 'post', data, callback, response_type ).start() - def get_tournament_prize_strings(self, entry: dict[str, Any]) -> list[str]: + def set_tournament_prize_image( + self, entry: dict[str, Any], index: int, image: bauiv1.Widget + ) -> None: """Given a tournament entry, return strings for its prize levels.""" from baclassic import _tournament - return _tournament.get_tournament_prize_strings(entry) + return _tournament.set_tournament_prize_chest_image(entry, index, image) + + def create_in_game_tournament_prize_image( + self, + entry: dict[str, Any], + index: int, + position: tuple[float, float], + ) -> None: + """Given a tournament entry, return strings for its prize levels.""" + from baclassic import _tournament + + _tournament.create_in_game_tournament_prize_image( + entry, index, position + ) + + def get_tournament_prize_strings( + self, entry: dict[str, Any], include_tickets: bool + ) -> list[str]: + """Given a tournament entry, return strings for its prize levels.""" + from baclassic import _tournament + + return _tournament.get_tournament_prize_strings( + entry, include_tickets=include_tickets + ) def getcampaign(self, name: str) -> bascenev1.Campaign: """Return a campaign by name.""" @@ -536,26 +537,21 @@ class ClassicSubsystem(babase.AppSubsystem): tip = self.tips.pop() return tip - def run_gpu_benchmark(self) -> None: - """Kick off a benchmark to test gpu speeds.""" - from baclassic._benchmark import run_gpu_benchmark as run - - run() - def run_cpu_benchmark(self) -> None: """Kick off a benchmark to test cpu speeds.""" - from baclassic._benchmark import run_cpu_benchmark as run + from baclassic._benchmark import run_cpu_benchmark - run() + run_cpu_benchmark() def run_media_reload_benchmark(self) -> None: """Kick off a benchmark to test media reloading speeds.""" - from baclassic._benchmark import run_media_reload_benchmark as run + from baclassic._benchmark import run_media_reload_benchmark - run() + run_media_reload_benchmark() def run_stress_test( self, + *, playlist_type: str = 'Random', playlist_name: str = '__default__', player_count: int = 8, @@ -563,9 +559,9 @@ class ClassicSubsystem(babase.AppSubsystem): attract_mode: bool = False, ) -> None: """Run a stress test.""" - from baclassic._benchmark import run_stress_test as run + from baclassic._benchmark import run_stress_test - run( + run_stress_test( playlist_type=playlist_type, playlist_name=playlist_name, player_count=player_count, @@ -684,14 +680,6 @@ class ClassicSubsystem(babase.AppSubsystem): babase.Call(ServerDialogWindow, sddata), ) - def ticket_icon_press(self) -> None: - """(internal)""" - from bauiv1lib.resourcetypeinfo import ResourceTypeInfoWindow - - ResourceTypeInfoWindow( - origin_widget=bauiv1.get_special_widget('tickets_info_button') - ) - def show_url_window(self, address: str) -> None: """(internal)""" from bauiv1lib.url import ShowURLWindow @@ -707,6 +695,7 @@ class ClassicSubsystem(babase.AppSubsystem): def tournament_entry_window( self, tournament_id: str, + *, tournament_activity: bascenev1.Activity | None = None, position: tuple[float, float] = (0.0, 0.0), delegate: Any = None, @@ -733,30 +722,32 @@ class ClassicSubsystem(babase.AppSubsystem): return MainMenuSession - def continues_window( - self, - activity: bascenev1.Activity, - cost: int, - continue_call: Callable[[], Any], - cancel_call: Callable[[], Any], - ) -> None: - """(internal)""" - from bauiv1lib.continues import ContinuesWindow - - ContinuesWindow(activity, cost, continue_call, cancel_call) - def profile_browser_window( self, transition: str = 'in_right', - in_main_menu: bool = True, - selected_profile: str | None = None, origin_widget: bauiv1.Widget | None = None, + selected_profile: str | None = None, ) -> None: """(internal)""" from bauiv1lib.profile.browser import ProfileBrowserWindow - ProfileBrowserWindow( - transition, in_main_menu, selected_profile, origin_widget + main_window = babase.app.ui_v1.get_main_window() + if main_window is not None: + logging.warning( + 'profile_browser_window()' + ' called with existing main window; should not happen.' + ) + return + + babase.app.ui_v1.set_main_window( + ProfileBrowserWindow( + transition=transition, + selected_profile=selected_profile, + origin_widget=origin_widget, + minimal_toolbar=True, + ), + is_top_level=True, + suppress_warning=True, ) def preload_map_preview_media(self) -> None: @@ -781,6 +772,9 @@ class ClassicSubsystem(babase.AppSubsystem): assert app.env.gui + # Play explicit swish sound so it occurs due to keypresses/etc. + # This means we have to disable it for any button or else we get + # double. bauiv1.getsound('swish').play() # If it exists, dismiss it; otherwise make a new one. @@ -794,18 +788,182 @@ class ClassicSubsystem(babase.AppSubsystem): def device_menu_press(self, device_id: int | None) -> None: """(internal)""" - from bauiv1lib.mainmenu import MainMenuWindow + from bauiv1lib.ingamemenu import InGameMenuWindow from bauiv1 import set_ui_input_device assert babase.app is not None - in_main_menu = babase.app.ui_v1.has_main_menu_window() + in_main_menu = babase.app.ui_v1.has_main_window() if not in_main_menu: set_ui_input_device(device_id) + # Hack(ish). We play swish sound here so it happens for + # device presses, but this means we need to disable default + # swish sounds for any menu buttons or we'll get double. if babase.app.env.gui: bauiv1.getsound('swish').play() - babase.app.ui_v1.set_main_menu_window( - MainMenuWindow().get_root_widget(), - from_window=False, # Disable check here. + babase.app.ui_v1.set_main_window( + InGameMenuWindow(), is_top_level=True, suppress_warning=True ) + + def save_ui_state(self) -> None: + """Store our current place in the UI.""" + ui = babase.app.ui_v1 + mainwindow = ui.get_main_window() + if mainwindow is not None: + self.saved_ui_state = ui.save_main_window_state(mainwindow) + else: + self.saved_ui_state = None + + def invoke_main_menu_ui(self) -> None: + """Bring up main menu ui.""" + + # Bring up the last place we were, or start at the main menu + # otherwise. + app = bauiv1.app + env = app.env + with bascenev1.ContextRef.empty(): + + assert app.classic is not None + if app.env.headless: + # UI stuff fails now in headless builds; avoid it. + pass + else: + + # When coming back from a kiosk-mode game, jump to the + # kiosk start screen. + if env.demo or env.arcade: + # pylint: disable=cyclic-import + from bauiv1lib.kiosk import KioskWindow + + app.ui_v1.set_main_window( + KioskWindow(), is_top_level=True, suppress_warning=True + ) + else: + # If there's a saved ui state, restore that. + if self.saved_ui_state is not None: + app.ui_v1.restore_main_window_state(self.saved_ui_state) + else: + # Otherwise start fresh at the main menu. + from bauiv1lib.mainmenu import MainMenuWindow + + app.ui_v1.set_main_window( + MainMenuWindow(transition=None), + is_top_level=True, + suppress_warning=True, + ) + + @staticmethod + def run_bs_client_effects(effects: list[bacommon.bs.ClientEffect]) -> None: + """Run client effects sent from the master server.""" + from baclassic._clienteffect import run_bs_client_effects + + run_bs_client_effects(effects) + + @staticmethod + def basic_client_ui_button_label_str( + label: bacommon.bs.BasicClientUI.ButtonLabel, + ) -> babase.Lstr: + """Given a client-ui label, return an Lstr.""" + import bacommon.bs + + cls = bacommon.bs.BasicClientUI.ButtonLabel + if label is cls.UNKNOWN: + # Server should not be sending us unknown stuff; make noise + # if they do. + logging.error( + 'Got BasicClientUI.ButtonLabel.UNKNOWN; should not happen.' + ) + return babase.Lstr(value='') + + rsrc: str | None = None + if label is cls.OK: + rsrc = 'okText' + elif label is cls.APPLY: + rsrc = 'applyText' + elif label is cls.CANCEL: + rsrc = 'cancelText' + elif label is cls.ACCEPT: + rsrc = 'gatherWindow.partyInviteAcceptText' + elif label is cls.DECLINE: + rsrc = 'gatherWindow.partyInviteDeclineText' + elif label is cls.IGNORE: + rsrc = 'gatherWindow.partyInviteIgnoreText' + elif label is cls.CLAIM: + rsrc = 'claimText' + elif label is cls.DISCARD: + rsrc = 'discardText' + else: + assert_never(label) + + return babase.Lstr(resource=rsrc) + + def required_purchases_for_game(self, game: str) -> list[str]: + """Return which purchase (if any) is required for a game.""" + # pylint: disable=too-many-return-statements + + if game in ( + 'Challenges:Infinite Runaround', + 'Challenges:Tournament Infinite Runaround', + ): + # Special case: Pro used to unlock this. + return ( + [] + if self.accounts.have_pro() + else ['upgrades.infinite_runaround'] + ) + if game in ( + 'Challenges:Infinite Onslaught', + 'Challenges:Tournament Infinite Onslaught', + ): + # Special case: Pro used to unlock this. + return ( + [] + if self.accounts.have_pro() + else ['upgrades.infinite_onslaught'] + ) + if game in ( + 'Challenges:Meteor Shower', + 'Challenges:Epic Meteor Shower', + ): + return ['games.meteor_shower'] + + if game in ( + 'Challenges:Target Practice', + 'Challenges:Target Practice B', + ): + return ['games.target_practice'] + + if game in ( + 'Challenges:Ninja Fight', + 'Challenges:Pro Ninja Fight', + ): + return ['games.ninja_fight'] + + if game in ('Challenges:Race', 'Challenges:Pro Race'): + return ['games.race'] + + if game in ('Challenges:Lake Frigid Race',): + return ['games.race', 'maps.lake_frigid'] + + if game in ( + 'Challenges:Easter Egg Hunt', + 'Challenges:Pro Easter Egg Hunt', + ): + return ['games.easter_egg_hunt'] + + return [] + + def is_game_unlocked(self, game: str) -> bool: + """Is a particular game unlocked?""" + plus = babase.app.plus + assert plus is not None + + purchases = self.required_purchases_for_game(game) + if not purchases: + return True + + for purchase in purchases: + if not plus.get_v1_account_product_purchased(purchase): + return False + return True diff --git a/dist/ba_data/python/baclassic/_benchmark.py b/dist/ba_data/python/baclassic/_benchmark.py index 0c25f59..b110e25 100644 --- a/dist/ba_data/python/baclassic/_benchmark.py +++ b/dist/ba_data/python/baclassic/_benchmark.py @@ -20,11 +20,14 @@ def run_cpu_benchmark() -> None: # pylint: disable=cyclic-import from bascenev1lib import tutorial + # Save our UI state that we'll return to when done. + if babase.app.classic is not None: + babase.app.classic.save_ui_state() + class BenchmarkSession(bascenev1.Session): """Session type for cpu benchmark.""" def __init__(self) -> None: - # print('FIXME: BENCHMARK SESSION WOULD CALC DEPS.') depsets: Sequence[bascenev1.DependencySet] = [] super().__init__(depsets) @@ -99,7 +102,9 @@ def _start_stress_test(args: _StressTestArgs) -> None: """(internal)""" from bascenev1 import DualTeamSession, FreeForAllSession - assert babase.app.classic is not None + classic = babase.app.classic + + assert classic is not None appconfig = babase.app.config playlist_type = args.playlist_type @@ -116,6 +121,10 @@ def _start_stress_test(args: _StressTestArgs) -> None: + args.playlist_name + '")...' ) + + # Save where we are in the UI so we'll return there when done. + classic.save_ui_state() + if playlist_type == 'Teams': appconfig['Team Tournament Playlist Selection'] = args.playlist_name appconfig['Team Tournament Playlist Randomize'] = 1 @@ -137,11 +146,11 @@ def _start_stress_test(args: _StressTestArgs) -> None: ), ) _baclassic.set_stress_testing(True, args.player_count, args.attract_mode) - babase.app.classic.stress_test_update_timer = babase.AppTimer( + classic.stress_test_update_timer = babase.AppTimer( args.round_duration, babase.Call(_reset_stress_test, args) ) if args.attract_mode: - babase.app.classic.stress_test_update_timer_2 = babase.AppTimer( + classic.stress_test_update_timer_2 = babase.AppTimer( 0.48, babase.Call(_update_attract_mode_test, args), repeat=True ) @@ -170,12 +179,6 @@ def _reset_stress_test(args: _StressTestArgs) -> None: babase.apptimer(1.0, babase.Call(_start_stress_test, args)) -def run_gpu_benchmark() -> None: - """Kick off a benchmark to test gpu speeds.""" - # FIXME: Not wired up yet. - babase.screenmessage('Not wired up yet.', color=(1, 0, 0)) - - def run_media_reload_benchmark() -> None: """Kick off a benchmark to test media reloading speeds.""" babase.reload_media() @@ -199,6 +202,6 @@ def run_media_reload_benchmark() -> None: babase.add_clean_frame_callback(babase.Call(doit, start_time)) - # The reload starts (should add a completion callback to the - # reload func to fix this). + # The reload starts (should add a completion callback to the reload + # func to fix this). babase.apptimer(0.05, babase.Call(delay_add, babase.apptime())) diff --git a/dist/ba_data/python/baclassic/_chest.py b/dist/ba_data/python/baclassic/_chest.py new file mode 100644 index 0000000..b5e18ce --- /dev/null +++ b/dist/ba_data/python/baclassic/_chest.py @@ -0,0 +1,91 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Chest related functionality.""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +from bacommon.bs import ClassicChestAppearance + +if TYPE_CHECKING: + pass + + +@dataclass +class ChestAppearanceDisplayInfo: + """Info about how to locally display chest appearances.""" + + # NOTE TO SELF: Don't rename these attrs; the C++ layer is hard + # coded to look for them. + + texclosed: str + texclosedtint: str + texopen: str + texopentint: str + color: tuple[float, float, float] + tint: tuple[float, float, float] + tint2: tuple[float, float, float] + + +# Info for chest types we know how to draw. Anything not found in here +# should fall back to the DEFAULT entry. +CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT = ChestAppearanceDisplayInfo( + texclosed='chestIcon', + texclosedtint='chestIconTint', + texopen='chestOpenIcon', + texopentint='chestOpenIconTint', + color=(1, 1, 1), + tint=(1, 1, 1), + tint2=(1, 1, 1), +) + +CHEST_APPEARANCE_DISPLAY_INFOS: dict[ + ClassicChestAppearance, ChestAppearanceDisplayInfo +] = { + ClassicChestAppearance.L2: ChestAppearanceDisplayInfo( + texclosed='chestIcon', + texclosedtint='chestIconTint', + texopen='chestOpenIcon', + texopentint='chestOpenIconTint', + color=(0.8, 1.0, 0.93), + tint=(0.65, 1.0, 0.8), + tint2=(0.65, 1.0, 0.8), + ), + ClassicChestAppearance.L3: ChestAppearanceDisplayInfo( + texclosed='chestIcon', + texclosedtint='chestIconTint', + texopen='chestOpenIcon', + texopentint='chestOpenIconTint', + color=(0.75, 0.9, 1.3), + tint=(0.7, 1, 1.9), + tint2=(0.7, 1, 1.9), + ), + ClassicChestAppearance.L4: ChestAppearanceDisplayInfo( + texclosed='chestIcon', + texclosedtint='chestIconTint', + texopen='chestOpenIcon', + texopentint='chestOpenIconTint', + color=(0.7, 1.0, 1.4), + tint=(1.4, 1.6, 2.0), + tint2=(1.4, 1.6, 2.0), + ), + ClassicChestAppearance.L5: ChestAppearanceDisplayInfo( + texclosed='chestIcon', + texclosedtint='chestIconTint', + texopen='chestOpenIcon', + texopentint='chestOpenIconTint', + color=(0.75, 0.5, 2.4), + tint=(1.0, 0.8, 0.0), + tint2=(1.0, 0.8, 0.0), + ), + ClassicChestAppearance.L6: ChestAppearanceDisplayInfo( + texclosed='chestIcon', + texclosedtint='chestIconTint', + texopen='chestOpenIcon', + texopentint='chestOpenIconTint', + color=(1.1, 0.8, 0.0), + tint=(2, 2, 2), + tint2=(2, 2, 2), + ), +} diff --git a/dist/ba_data/python/baclassic/_clienteffect.py b/dist/ba_data/python/baclassic/_clienteffect.py new file mode 100644 index 0000000..38b0d9c --- /dev/null +++ b/dist/ba_data/python/baclassic/_clienteffect.py @@ -0,0 +1,77 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Functionality related to running client-effects from the master server.""" + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, assert_never + +from efro.util import strict_partial + +import bacommon.bs +import bauiv1 + +if TYPE_CHECKING: + pass + + +def run_bs_client_effects(effects: list[bacommon.bs.ClientEffect]) -> None: + """Run effects.""" + # pylint: disable=too-many-branches + + delay = 0.0 + for effect in effects: + if isinstance(effect, bacommon.bs.ClientEffectScreenMessage): + textfin = bauiv1.Lstr( + translate=('serverResponses', effect.message) + ).evaluate() + if effect.subs is not None: + # Should always be even. + assert len(effect.subs) % 2 == 0 + for j in range(0, len(effect.subs) - 1, 2): + textfin = textfin.replace( + effect.subs[j], + effect.subs[j + 1], + ) + bauiv1.apptimer( + delay, + strict_partial( + bauiv1.screenmessage, textfin, color=effect.color + ), + ) + + elif isinstance(effect, bacommon.bs.ClientEffectSound): + smcls = bacommon.bs.ClientEffectSound.Sound + soundfile: str | None = None + if effect.sound is smcls.UNKNOWN: + # Server should avoid sending us sounds we don't + # support. Make some noise if it happens. + logging.error('Got unrecognized bacommon.bs.ClientEffectSound.') + elif effect.sound is smcls.CASH_REGISTER: + soundfile = 'cashRegister' + elif effect.sound is smcls.ERROR: + soundfile = 'error' + elif effect.sound is smcls.POWER_DOWN: + soundfile = 'powerdown01' + elif effect.sound is smcls.GUN_COCKING: + soundfile = 'gunCocking' + else: + assert_never(effect.sound) + if soundfile is not None: + bauiv1.apptimer( + delay, + strict_partial( + bauiv1.getsound(soundfile).play, volume=effect.volume + ), + ) + + elif isinstance(effect, bacommon.bs.ClientEffectDelay): + delay += effect.seconds + else: + # Server should not send us stuff we can't digest. Make + # some noise if it happens. + logging.error( + 'Got unrecognized bacommon.bs.ClientEffect;' + ' should not happen.' + ) diff --git a/dist/ba_data/python/baclassic/_displayitem.py b/dist/ba_data/python/baclassic/_displayitem.py new file mode 100644 index 0000000..da8215c --- /dev/null +++ b/dist/ba_data/python/baclassic/_displayitem.py @@ -0,0 +1,109 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Display-item related functionality.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +from efro.util import pairs_from_flat +import bacommon.bs +import bauiv1 + + +if TYPE_CHECKING: + pass + + +def show_display_item( + itemwrapper: bacommon.bs.DisplayItemWrapper, + parent: bauiv1.Widget, + pos: tuple[float, float], + width: float, +) -> None: + """Create ui to depict a display-item.""" + + height = width * 0.666 + + # Silent no-op if our parent ui is dead. + if not parent: + return + + img: str | None = None + img_y_offs = 0.0 + text_y_offs = 0.0 + show_text = True + + if isinstance(itemwrapper.item, bacommon.bs.TicketsDisplayItem): + img = 'tickets' + img_y_offs = width * 0.11 + text_y_offs = width * -0.15 + elif isinstance(itemwrapper.item, bacommon.bs.TokensDisplayItem): + img = 'coin' + img_y_offs = width * 0.11 + text_y_offs = width * -0.15 + elif isinstance(itemwrapper.item, bacommon.bs.ChestDisplayItem): + from baclassic._chest import ( + CHEST_APPEARANCE_DISPLAY_INFOS, + CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT, + ) + + img = None + show_text = False + c_info = CHEST_APPEARANCE_DISPLAY_INFOS.get( + itemwrapper.item.appearance, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT + ) + c_size = width * 0.85 + bauiv1.imagewidget( + parent=parent, + position=(pos[0] - c_size * 0.5, pos[1] - c_size * 0.5), + color=c_info.color, + size=(c_size, c_size), + texture=bauiv1.gettexture(c_info.texclosed), + tint_texture=bauiv1.gettexture(c_info.texclosedtint), + tint_color=c_info.tint, + tint2_color=c_info.tint2, + ) + + # Enable this for testing spacing. + if bool(False): + bauiv1.imagewidget( + parent=parent, + position=( + pos[0] - width * 0.5, + pos[1] - height * 0.5, + ), + size=(width, height), + texture=bauiv1.gettexture('white'), + color=(0, 1, 0), + opacity=0.1, + ) + + imgsize = width * 0.33 + if img is not None: + bauiv1.imagewidget( + parent=parent, + position=( + pos[0] - imgsize * 0.5, + pos[1] + img_y_offs - imgsize * 0.5, + ), + size=(imgsize, imgsize), + texture=bauiv1.gettexture(img), + ) + if show_text: + subs = itemwrapper.description_subs + if subs is None: + subs = [] + bauiv1.textwidget( + parent=parent, + position=(pos[0], pos[1] + text_y_offs), + scale=width * 0.006, + size=(0, 0), + text=bauiv1.Lstr( + translate=('displayItemNames', itemwrapper.description), + subs=pairs_from_flat(subs), + ), + maxwidth=width * 0.9, + color=(0.0, 1.0, 0.0), + h_align='center', + v_align='center', + ) diff --git a/dist/ba_data/python/baclassic/_music.py b/dist/ba_data/python/baclassic/_music.py index 8f439d7..5824637 100644 --- a/dist/ba_data/python/baclassic/_music.py +++ b/dist/ba_data/python/baclassic/_music.py @@ -16,6 +16,8 @@ from bascenev1 import MusicType if TYPE_CHECKING: from typing import Callable, Any + import bauiv1 + class MusicPlayMode(Enum): """Influences behavior when playing music. @@ -389,7 +391,7 @@ class MusicPlayer: callback: Callable[[Any], None], current_entry: Any, selection_target_name: str, - ) -> Any: + ) -> bauiv1.MainWindow: """Summons a UI to select a new soundtrack entry.""" return self.on_select_entry( callback, current_entry, selection_target_name @@ -432,11 +434,12 @@ class MusicPlayer: callback: Callable[[Any], None], current_entry: Any, selection_target_name: str, - ) -> Any: + ) -> bauiv1.MainWindow: """Present a GUI to select an entry. The callback should be called with a valid entry or None to signify that the default soundtrack should be used..""" + raise NotImplementedError() # Subclasses should override the following: diff --git a/dist/ba_data/python/baclassic/_net.py b/dist/ba_data/python/baclassic/_net.py index 359c442..185f24b 100644 --- a/dist/ba_data/python/baclassic/_net.py +++ b/dist/ba_data/python/baclassic/_net.py @@ -35,6 +35,8 @@ class MasterServerV1CallThread(threading.Thread): callback: MasterServerCallback | None, response_type: MasterServerResponseType, ): + # pylint: disable=too-many-positional-arguments + # Set daemon=True so long-running requests don't keep us from # quitting the app. super().__init__(daemon=True) @@ -52,8 +54,9 @@ class MasterServerV1CallThread(threading.Thread): self._activity = weakref.ref(activity) if activity is not None else None def _run_callback(self, arg: None | dict[str, Any]) -> None: - # If we were created in an activity context and that activity has - # since died, do nothing. + # If we were created in an activity context and that activity + # has since died, do nothing. + # FIXME: Should we just be using a ContextCall instead of doing # this check manually? if self._activity is not None: diff --git a/dist/ba_data/python/baclassic/_store.py b/dist/ba_data/python/baclassic/_store.py index f469012..ed5098b 100644 --- a/dist/ba_data/python/baclassic/_store.py +++ b/dist/ba_data/python/baclassic/_store.py @@ -26,6 +26,7 @@ class StoreSubsystem: def get_store_item_name_translated(self, item_name: str) -> babase.Lstr: """Return a babase.Lstr for a store item name.""" # pylint: disable=cyclic-import + # pylint: disable=too-many-return-statements item_info = self.get_store_item(item_name) if item_name.startswith('characters.'): return babase.Lstr( @@ -46,6 +47,14 @@ class StoreSubsystem: return gametype.get_display_string() if item_name.startswith('icons.'): return babase.Lstr(resource='editProfileWindow.iconText') + if item_name == 'upgrades.infinite_runaround': + return babase.Lstr( + translate=('coopLevelNames', 'Infinite Runaround') + ) + if item_name == 'upgrades.infinite_onslaught': + return babase.Lstr( + translate=('coopLevelNames', 'Infinite Onslaught') + ) raise ValueError('unrecognized item: ' + item_name) def get_store_item_display_size( @@ -81,14 +90,17 @@ class StoreSubsystem: assert babase.app.classic is not None if babase.app.classic.store_items is None: - from bascenev1lib.game import ninjafight - from bascenev1lib.game import meteorshower - from bascenev1lib.game import targetpractice - from bascenev1lib.game import easteregghunt + from bascenev1lib.game.race import RaceGame + from bascenev1lib.game.ninjafight import NinjaFightGame + from bascenev1lib.game.meteorshower import MeteorShowerGame + from bascenev1lib.game.targetpractice import TargetPracticeGame + from bascenev1lib.game.easteregghunt import EasterEggHuntGame # IMPORTANT - need to keep this synced with the master server. # (doing so manually for now) babase.app.classic.store_items = { + 'upgrades.infinite_runaround': {}, + 'upgrades.infinite_onslaught': {}, 'characters.kronk': {'character': 'Kronk'}, 'characters.zoe': {'character': 'Zoe'}, 'characters.jackmorgan': {'character': 'Jack Morgan'}, @@ -111,20 +123,28 @@ class StoreSubsystem: 'merch': {}, 'pro': {}, 'maps.lake_frigid': {'map_type': maps.LakeFrigid}, + 'games.race': { + 'gametype': RaceGame, + 'previewTex': 'bigGPreview', + }, 'games.ninja_fight': { - 'gametype': ninjafight.NinjaFightGame, + 'gametype': NinjaFightGame, 'previewTex': 'courtyardPreview', }, 'games.meteor_shower': { - 'gametype': meteorshower.MeteorShowerGame, + 'gametype': MeteorShowerGame, + 'previewTex': 'rampagePreview', + }, + 'games.infinite_onslaught': { + 'gametype': MeteorShowerGame, 'previewTex': 'rampagePreview', }, 'games.target_practice': { - 'gametype': targetpractice.TargetPracticeGame, + 'gametype': TargetPracticeGame, 'previewTex': 'doomShroomPreview', }, 'games.easter_egg_hunt': { - 'gametype': easteregghunt.EasterEggHuntGame, + 'gametype': EasterEggHuntGame, 'previewTex': 'towerDPreview', }, 'icons.flag_us': { @@ -365,9 +385,12 @@ class StoreSubsystem: store_layout['minigames'] = [ { 'items': [ + 'games.race', 'games.ninja_fight', 'games.meteor_shower', 'games.target_practice', + 'upgrades.infinite_onslaught', + 'upgrades.infinite_runaround', ] } ] @@ -446,8 +469,9 @@ class StoreSubsystem: 'price.' + item, None ) if ticket_cost is not None: - if our_tickets >= ticket_cost and not plus.get_purchased( - item + if ( + our_tickets >= ticket_cost + and not plus.get_v1_account_product_purchased(item) ): count += 1 return count @@ -522,7 +546,7 @@ class StoreSubsystem: for section in store_layout[tab]: for item in section['items']: if item in sales_raw: - if not plus.get_purchased(item): + if not plus.get_v1_account_product_purchased(item): to_end = ( datetime.datetime.fromtimestamp( sales_raw[item]['e'], datetime.UTC @@ -550,7 +574,10 @@ class StoreSubsystem: if babase.app.env.gui: for map_section in self.get_store_layout()['maps']: for mapitem in map_section['items']: - if plus is None or not plus.get_purchased(mapitem): + if ( + plus is None + or not plus.get_v1_account_product_purchased(mapitem) + ): m_info = self.get_store_item(mapitem) unowned_maps.add(m_info['map_type'].name) return sorted(unowned_maps) @@ -563,7 +590,14 @@ class StoreSubsystem: if babase.app.env.gui: for section in self.get_store_layout()['minigames']: for mname in section['items']: - if plus is None or not plus.get_purchased(mname): + if mname.startswith('upgrades.'): + # Ignore things like infinite onslaught which + # aren't actually game types. + continue + if ( + plus is None + or not plus.get_v1_account_product_purchased(mname) + ): m_info = self.get_store_item(mname) unowned_games.add(m_info['gametype']) return unowned_games diff --git a/dist/ba_data/python/baclassic/_tournament.py b/dist/ba_data/python/baclassic/_tournament.py index 242ba52..e71d960 100644 --- a/dist/ba_data/python/baclassic/_tournament.py +++ b/dist/ba_data/python/baclassic/_tournament.py @@ -6,13 +6,23 @@ from __future__ import annotations from typing import TYPE_CHECKING +from bacommon.bs import ClassicChestAppearance import babase +import bauiv1 +import bascenev1 + +from baclassic._chest import ( + CHEST_APPEARANCE_DISPLAY_INFOS, + CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT, +) if TYPE_CHECKING: from typing import Any -def get_tournament_prize_strings(entry: dict[str, Any]) -> list[str]: +def get_tournament_prize_strings( + entry: dict[str, Any], include_tickets: bool +) -> list[str]: """Given a tournament entry, return strings for its prize levels.""" # pylint: disable=too-many-locals from bascenev1 import get_trophy_string @@ -27,7 +37,7 @@ def get_tournament_prize_strings(entry: dict[str, Any]) -> list[str]: trophy_type_2 = entry.get('prizeTrophy2') trophy_type_3 = entry.get('prizeTrophy3') out_vals = [] - for rng, prize, trophy_type in ( + for rng, ticket_prize, trophy_type in ( (range1, prize1, trophy_type_1), (range2, prize2, trophy_type_2), (range3, prize3, trophy_type_3), @@ -45,14 +55,100 @@ def get_tournament_prize_strings(entry: dict[str, Any]) -> list[str]: if trophy_type is not None: pvval += get_trophy_string(trophy_type) - # If we've got trophies but not for this entry, throw some space - # in to compensate so the ticket counts line up. - if prize is not None: + if ticket_prize is not None and include_tickets: pvval = ( babase.charstr(babase.SpecialChar.TICKET_BACKING) - + str(prize) + + str(ticket_prize) + pvval ) out_vals.append(prval) out_vals.append(pvval) return out_vals + + +def set_tournament_prize_chest_image( + entry: dict[str, Any], index: int, image: bauiv1.Widget +) -> None: + """Set image attrs representing a tourney prize chest.""" + ranges = [ + entry.get('prizeRange1'), + entry.get('prizeRange2'), + entry.get('prizeRange3'), + ] + chests = [ + entry.get('prizeChest1'), + entry.get('prizeChest2'), + entry.get('prizeChest3'), + ] + + assert 0 <= index < 3 + + # If tourney doesn't include this prize, just hide the image. + if ranges[index] is None: + bauiv1.imagewidget(edit=image, opacity=0.0) + return + + try: + appearance = ClassicChestAppearance(chests[index]) + except ValueError: + appearance = ClassicChestAppearance.DEFAULT + chestdisplayinfo = CHEST_APPEARANCE_DISPLAY_INFOS.get( + appearance, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT + ) + bauiv1.imagewidget( + edit=image, + opacity=1.0, + color=chestdisplayinfo.color, + texture=bauiv1.gettexture(chestdisplayinfo.texclosed), + tint_texture=bauiv1.gettexture(chestdisplayinfo.texclosedtint), + tint_color=chestdisplayinfo.tint, + tint2_color=chestdisplayinfo.tint2, + ) + + +def create_in_game_tournament_prize_image( + entry: dict[str, Any], index: int, position: tuple[float, float] +) -> None: + """Create a display for the prize chest (if any) in-game.""" + from bascenev1lib.actor.image import Image + + ranges = [ + entry.get('prizeRange1'), + entry.get('prizeRange2'), + entry.get('prizeRange3'), + ] + chests = [ + entry.get('prizeChest1'), + entry.get('prizeChest2'), + entry.get('prizeChest3'), + ] + + # If tourney doesn't include this prize, no-op. + if ranges[index] is None: + return + + try: + appearance = ClassicChestAppearance(chests[index]) + except ValueError: + appearance = ClassicChestAppearance.DEFAULT + chestdisplayinfo = CHEST_APPEARANCE_DISPLAY_INFOS.get( + appearance, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT + ) + Image( + # Provide magical extended dict version of texture that Image + # actor supports. + texture={ + 'texture': bascenev1.gettexture(chestdisplayinfo.texclosed), + 'tint_texture': bascenev1.gettexture( + chestdisplayinfo.texclosedtint + ), + 'tint_color': chestdisplayinfo.tint, + 'tint2_color': chestdisplayinfo.tint2, + 'mask_texture': None, + }, + color=chestdisplayinfo.color + (1.0,), + position=position, + scale=(48.0, 48.0), + transition=Image.Transition.FADE_IN, + transition_delay=2.0, + ).autoretain() diff --git a/dist/ba_data/python/baclassic/macmusicapp.py b/dist/ba_data/python/baclassic/macmusicapp.py index 6b4b9b4..48a41e5 100644 --- a/dist/ba_data/python/baclassic/macmusicapp.py +++ b/dist/ba_data/python/baclassic/macmusicapp.py @@ -15,6 +15,8 @@ from baclassic._music import MusicPlayer if TYPE_CHECKING: from typing import Callable, Any + import bauiv1 + class MacMusicAppMusicPlayer(MusicPlayer): """A music-player that utilizes the macOS Music.app for playback. @@ -33,7 +35,7 @@ class MacMusicAppMusicPlayer(MusicPlayer): callback: Callable[[Any], None], current_entry: Any, selection_target_name: str, - ) -> Any: + ) -> bauiv1.MainWindow: # pylint: disable=cyclic-import from bauiv1lib.soundtrack import entrytypeselect as etsel diff --git a/dist/ba_data/python/baclassic/osmusic.py b/dist/ba_data/python/baclassic/osmusic.py index 919df49..8a79bf7 100644 --- a/dist/ba_data/python/baclassic/osmusic.py +++ b/dist/ba_data/python/baclassic/osmusic.py @@ -16,6 +16,8 @@ from baclassic._music import MusicPlayer if TYPE_CHECKING: from typing import Callable, Any + import bauiv1 + class OSMusicPlayer(MusicPlayer): """Music player that talks to internal C++ layer for functionality. @@ -39,7 +41,7 @@ class OSMusicPlayer(MusicPlayer): callback: Callable[[Any], None], current_entry: Any, selection_target_name: str, - ) -> Any: + ) -> bauiv1.MainWindow: # pylint: disable=cyclic-import from bauiv1lib.soundtrack.entrytypeselect import ( SoundtrackEntryTypeSelectWindow, diff --git a/dist/ba_data/python/bacommon/app.py b/dist/ba_data/python/bacommon/app.py index 5f42c89..7822811 100644 --- a/dist/ba_data/python/bacommon/app.py +++ b/dist/ba_data/python/bacommon/app.py @@ -31,8 +31,8 @@ class AppInterfaceIdiom(Enum): class AppExperience(Enum): """A particular experience that can be provided by a Ballistica app. - This is one metric used to isolate different playerbases from - each other where there might be no technical barriers doing so. For + This is one metric used to isolate different playerbases from each + other where there might be no technical barriers doing so. For example, a casual one-hand-playable phone game and an augmented reality tabletop game may both use the same scene-versions and networking-protocols and whatnot, but it would make no sense to @@ -75,10 +75,10 @@ class AppArchitecture(Enum): class AppPlatform(Enum): """Overall platform a Ballistica build is targeting. - Each distinct flavor of an app has a unique combination - of AppPlatform and AppVariant. Generally platform describes - a set of hardware, while variant describes a destination or - purpose for the build. + Each distinct flavor of an app has a unique combination of + AppPlatform and AppVariant. Generally platform describes a set of + hardware, while variant describes a destination or purpose for the + build. """ MAC = 'mac' @@ -92,10 +92,10 @@ class AppPlatform(Enum): class AppVariant(Enum): """A unique Ballistica build type within a single platform. - Each distinct flavor of an app has a unique combination - of AppPlatform and AppVariant. Generally platform describes - a set of hardware, while variant describes a destination or - purpose for the build. + Each distinct flavor of an app has a unique combination of + AppPlatform and AppVariant. Generally platform describes a set of + hardware, while variant describes a destination or purpose for the + build. """ # Default builds. diff --git a/dist/ba_data/python/bacommon/bs.py b/dist/ba_data/python/bacommon/bs.py new file mode 100644 index 0000000..37897a1 --- /dev/null +++ b/dist/ba_data/python/bacommon/bs.py @@ -0,0 +1,887 @@ +# Released under the MIT License. See LICENSE for details. +# +"""BombSquad specific bits.""" + +from __future__ import annotations + +import datetime +from enum import Enum +from dataclasses import dataclass, field +from typing import Annotated, override, assert_never + +from efro.util import pairs_to_flat +from efro.dataclassio import ioprepped, IOAttrs, IOMultiType +from efro.message import Message, Response + + +@ioprepped +@dataclass +class PrivatePartyMessage(Message): + """Message asking about info we need for private-party UI.""" + + need_datacode: Annotated[bool, IOAttrs('d')] + + @override + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [PrivatePartyResponse] + + +@ioprepped +@dataclass +class PrivatePartyResponse(Response): + """Here's that private party UI info you asked for, boss.""" + + success: Annotated[bool, IOAttrs('s')] + tokens: Annotated[int, IOAttrs('t')] + gold_pass: Annotated[bool, IOAttrs('g')] + datacode: Annotated[str | None, IOAttrs('d')] + + +class ClassicChestAppearance(Enum): + """Appearances bombsquad classic chests can have.""" + + UNKNOWN = 'u' + DEFAULT = 'd' + L1 = 'l1' + L2 = 'l2' + L3 = 'l3' + L4 = 'l4' + L5 = 'l5' + L6 = 'l6' + + @property + def pretty_name(self) -> str: + """Pretty name for the chest in English.""" + # pylint: disable=too-many-return-statements + cls = type(self) + + if self is cls.UNKNOWN: + return 'Unknown Chest' + if self is cls.DEFAULT: + return 'Chest' + if self is cls.L1: + return 'L1 Chest' + if self is cls.L2: + return 'L2 Chest' + if self is cls.L3: + return 'L3 Chest' + if self is cls.L4: + return 'L4 Chest' + if self is cls.L5: + return 'L5 Chest' + if self is cls.L6: + return 'L6 Chest' + + assert_never(self) + + +@ioprepped +@dataclass +class ClassicAccountLiveData: + """Live account data fed to the client in the bs classic app mode.""" + + @dataclass + class Chest: + """A lovely chest.""" + + appearance: Annotated[ + ClassicChestAppearance, + IOAttrs('a', enum_fallback=ClassicChestAppearance.UNKNOWN), + ] + unlock_time: Annotated[datetime.datetime, IOAttrs('t')] + ad_allow_time: Annotated[datetime.datetime | None, IOAttrs('at')] + + class LeagueType(Enum): + """Type of league we are in.""" + + BRONZE = 'b' + SILVER = 's' + GOLD = 'g' + DIAMOND = 'd' + + tickets: Annotated[int, IOAttrs('ti')] + + tokens: Annotated[int, IOAttrs('to')] + gold_pass: Annotated[bool, IOAttrs('g')] + remove_ads: Annotated[bool, IOAttrs('r')] + + achievements: Annotated[int, IOAttrs('a')] + achievements_total: Annotated[int, IOAttrs('at')] + + league_type: Annotated[LeagueType | None, IOAttrs('lt')] + league_num: Annotated[int | None, IOAttrs('ln')] + league_rank: Annotated[int | None, IOAttrs('lr')] + + level: Annotated[int, IOAttrs('lv')] + xp: Annotated[int, IOAttrs('xp')] + xpmax: Annotated[int, IOAttrs('xpm')] + + inbox_count: Annotated[int, IOAttrs('ibc')] + inbox_count_is_max: Annotated[bool, IOAttrs('ibcm')] + + chests: Annotated[dict[str, Chest], IOAttrs('c')] + + +class DisplayItemTypeID(Enum): + """Type ID for each of our subclasses.""" + + UNKNOWN = 'u' + TICKETS = 't' + TOKENS = 'k' + TEST = 's' + CHEST = 'c' + + +class DisplayItem(IOMultiType[DisplayItemTypeID]): + """Some amount of something that can be shown or described. + + Used to depict chest contents or other rewards or prices. + """ + + @override + @classmethod + def get_type_id(cls) -> DisplayItemTypeID: + # Require child classes to supply this themselves. If we did a + # full type registry/lookup here it would require us to import + # everything and would prevent lazy loading. + raise NotImplementedError() + + @override + @classmethod + def get_type(cls, type_id: DisplayItemTypeID) -> type[DisplayItem]: + """Return the subclass for each of our type-ids.""" + # pylint: disable=cyclic-import + + t = DisplayItemTypeID + if type_id is t.UNKNOWN: + return UnknownDisplayItem + if type_id is t.TICKETS: + return TicketsDisplayItem + if type_id is t.TOKENS: + return TokensDisplayItem + if type_id is t.TEST: + return TestDisplayItem + if type_id is t.CHEST: + return ChestDisplayItem + + # Important to make sure we provide all types. + assert_never(type_id) + + def get_description(self) -> tuple[str, list[tuple[str, str]]]: + """Return a string description and subs for the item. + + These decriptions are baked into the DisplayItemWrapper and + should be accessed from there when available. This allows + clients to give descriptions even for newer display items they + don't recognize. + """ + raise NotImplementedError() + + # Implement fallbacks so client can digest item lists even if they + # contain unrecognized stuff. DisplayItemWrapper contains basic + # baked down info that they can still use in such cases. + @override + @classmethod + def get_unknown_type_fallback(cls) -> DisplayItem: + return UnknownDisplayItem() + + +@ioprepped +@dataclass +class UnknownDisplayItem(DisplayItem): + """Something we don't know how to display.""" + + @override + @classmethod + def get_type_id(cls) -> DisplayItemTypeID: + return DisplayItemTypeID.UNKNOWN + + @override + def get_description(self) -> tuple[str, list[tuple[str, str]]]: + import logging + + # Make noise but don't break. + logging.exception( + 'UnknownDisplayItem.get_description() should never be called.' + ' Always access descriptions on the DisplayItemWrapper.' + ) + return 'Unknown', [] + + +@ioprepped +@dataclass +class TicketsDisplayItem(DisplayItem): + """Some amount of tickets.""" + + count: Annotated[int, IOAttrs('c')] + + @override + @classmethod + def get_type_id(cls) -> DisplayItemTypeID: + return DisplayItemTypeID.TICKETS + + @override + def get_description(self) -> tuple[str, list[tuple[str, str]]]: + return '${C} Tickets', [('${C}', str(self.count))] + + +@ioprepped +@dataclass +class TokensDisplayItem(DisplayItem): + """Some amount of tokens.""" + + count: Annotated[int, IOAttrs('c')] + + @override + @classmethod + def get_type_id(cls) -> DisplayItemTypeID: + return DisplayItemTypeID.TOKENS + + @override + def get_description(self) -> tuple[str, list[tuple[str, str]]]: + return '${C} Tokens', [('${C}', str(self.count))] + + +@ioprepped +@dataclass +class TestDisplayItem(DisplayItem): + """Fills usable space for a display-item - good for calibration.""" + + @override + @classmethod + def get_type_id(cls) -> DisplayItemTypeID: + return DisplayItemTypeID.TEST + + @override + def get_description(self) -> tuple[str, list[tuple[str, str]]]: + return 'Test Display Item Here', [] + + +@ioprepped +@dataclass +class ChestDisplayItem(DisplayItem): + """Display a chest.""" + + appearance: Annotated[ClassicChestAppearance, IOAttrs('a')] + + @override + @classmethod + def get_type_id(cls) -> DisplayItemTypeID: + return DisplayItemTypeID.CHEST + + @override + def get_description(self) -> tuple[str, list[tuple[str, str]]]: + return self.appearance.pretty_name, [] + + +@ioprepped +@dataclass +class DisplayItemWrapper: + """Wraps a DisplayItem and common info.""" + + item: Annotated[DisplayItem, IOAttrs('i')] + description: Annotated[str, IOAttrs('d')] + description_subs: Annotated[list[str] | None, IOAttrs('s')] + + @classmethod + def for_display_item(cls, item: DisplayItem) -> DisplayItemWrapper: + """Convenience method to wrap a DisplayItem.""" + desc, subs = item.get_description() + return DisplayItemWrapper(item, desc, pairs_to_flat(subs)) + + +@ioprepped +@dataclass +class ChestInfoMessage(Message): + """Request info about a chest.""" + + chest_id: Annotated[str, IOAttrs('i')] + + @override + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [ChestInfoResponse] + + +@ioprepped +@dataclass +class ChestInfoResponse(Response): + """Here's that chest info you asked for, boss.""" + + @dataclass + class Chest: + """A lovely chest.""" + + @dataclass + class PrizeSet: + """A possible set of prizes for this chest.""" + + weight: Annotated[float, IOAttrs('w')] + contents: Annotated[list[DisplayItemWrapper], IOAttrs('c')] + + appearance: Annotated[ + ClassicChestAppearance, + IOAttrs('a', enum_fallback=ClassicChestAppearance.UNKNOWN), + ] + + # How much it costs to unlock *now*. + unlock_tokens: Annotated[int, IOAttrs('tk')] + + # When it unlocks on its own. + unlock_time: Annotated[datetime.datetime, IOAttrs('t')] + + # Possible prizes we contain. + prizesets: Annotated[list[PrizeSet], IOAttrs('p')] + + # Are ads allowed now? + ad_allow: Annotated[bool, IOAttrs('aa')] + + chest: Annotated[Chest | None, IOAttrs('c')] + user_tokens: Annotated[int | None, IOAttrs('t')] + + +@ioprepped +@dataclass +class ChestActionMessage(Message): + """Request action about a chest.""" + + class Action(Enum): + """Types of actions we can request.""" + + # Unlocking (for free or with tokens). + UNLOCK = 'u' + + # Watched an ad to reduce wait. + AD = 'ad' + + action: Annotated[Action, IOAttrs('a')] + + # Tokens we are paying (only applies to unlock). + token_payment: Annotated[int, IOAttrs('t')] + + chest_id: Annotated[str, IOAttrs('i')] + + @override + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [ChestActionResponse] + + +@ioprepped +@dataclass +class ChestActionResponse(Response): + """Here's the results of that action you asked for, boss.""" + + # Tokens that were actually charged. + tokens_charged: Annotated[int, IOAttrs('t')] = 0 + + # If present, signifies the chest has been opened and we should show + # the user this stuff that was in it. + contents: Annotated[list[DisplayItemWrapper] | None, IOAttrs('c')] = None + + # If contents are present, which of the chest's prize-sets they + # represent. + prizeindex: Annotated[int, IOAttrs('i')] = 0 + + # Printable error if something goes wrong. + error: Annotated[str | None, IOAttrs('e')] = None + + # Printable warning. Shown in orange with an error sound. Does not + # mean the action failed; only that there's something to tell the + # users such as 'It looks like you are faking ad views; stop it or + # you won't have ad options anymore.' + warning: Annotated[str | None, IOAttrs('w')] = None + + # Printable success message. Shown in green with a cash-register + # sound. Can be used for things like successful wait reductions via + # ad views. + success_msg: Annotated[str | None, IOAttrs('s')] = None + + +class ClientUITypeID(Enum): + """Type ID for each of our subclasses.""" + + UNKNOWN = 'u' + BASIC = 'b' + + +class ClientUI(IOMultiType[ClientUITypeID]): + """Defines some user interface on the client.""" + + @override + @classmethod + def get_type_id(cls) -> ClientUITypeID: + # Require child classes to supply this themselves. If we did a + # full type registry/lookup here it would require us to import + # everything and would prevent lazy loading. + raise NotImplementedError() + + @override + @classmethod + def get_type(cls, type_id: ClientUITypeID) -> type[ClientUI]: + """Return the subclass for each of our type-ids.""" + # pylint: disable=cyclic-import + out: type[ClientUI] + + t = ClientUITypeID + if type_id is t.UNKNOWN: + out = UnknownClientUI + elif type_id is t.BASIC: + out = BasicClientUI + else: + # Important to make sure we provide all types. + assert_never(type_id) + return out + + @override + @classmethod + def get_unknown_type_fallback(cls) -> ClientUI: + # If we encounter some future message type we don't know + # anything about, drop in a placeholder. + return UnknownClientUI() + + +@ioprepped +@dataclass +class UnknownClientUI(ClientUI): + """Fallback type for unrecognized entries.""" + + @override + @classmethod + def get_type_id(cls) -> ClientUITypeID: + return ClientUITypeID.UNKNOWN + + +class BasicClientUIComponentTypeID(Enum): + """Type ID for each of our subclasses.""" + + UNKNOWN = 'u' + TEXT = 't' + LINK = 'l' + BS_CLASSIC_TOURNEY_RESULT = 'ct' + DISPLAY_ITEMS = 'di' + EXPIRE_TIME = 'd' + + +class BasicClientUIComponent(IOMultiType[BasicClientUIComponentTypeID]): + """Top level class for our multitype.""" + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + # Require child classes to supply this themselves. If we did a + # full type registry/lookup here it would require us to import + # everything and would prevent lazy loading. + raise NotImplementedError() + + @override + @classmethod + def get_type( + cls, type_id: BasicClientUIComponentTypeID + ) -> type[BasicClientUIComponent]: + """Return the subclass for each of our type-ids.""" + # pylint: disable=cyclic-import + + t = BasicClientUIComponentTypeID + if type_id is t.UNKNOWN: + return BasicClientUIComponentUnknown + if type_id is t.TEXT: + return BasicClientUIComponentText + if type_id is t.LINK: + return BasicClientUIComponentLink + if type_id is t.BS_CLASSIC_TOURNEY_RESULT: + return BasicClientUIBsClassicTourneyResult + if type_id is t.DISPLAY_ITEMS: + return BasicClientUIDisplayItems + if type_id is t.EXPIRE_TIME: + return BasicClientUIExpireTime + + # Important to make sure we provide all types. + assert_never(type_id) + + @override + @classmethod + def get_unknown_type_fallback(cls) -> BasicClientUIComponent: + # If we encounter some future message type we don't know + # anything about, drop in a placeholder. + return BasicClientUIComponentUnknown() + + +@ioprepped +@dataclass +class BasicClientUIComponentUnknown(BasicClientUIComponent): + """An unknown basic client component type. + + In practice these should never show up since the master-server + generates these on the fly for the client and so should not send + clients one they can't digest. + """ + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.UNKNOWN + + +@ioprepped +@dataclass +class BasicClientUIComponentText(BasicClientUIComponent): + """Show some text in the inbox message.""" + + text: Annotated[str, IOAttrs('t')] + subs: Annotated[list[str], IOAttrs('s', store_default=False)] = field( + default_factory=list + ) + scale: Annotated[float, IOAttrs('sc', store_default=False)] = 1.0 + color: Annotated[ + tuple[float, float, float, float], IOAttrs('c', store_default=False) + ] = (1.0, 1.0, 1.0, 1.0) + spacing_top: Annotated[float, IOAttrs('st', store_default=False)] = 0.0 + spacing_bottom: Annotated[float, IOAttrs('sb', store_default=False)] = 0.0 + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.TEXT + + +@ioprepped +@dataclass +class BasicClientUIComponentLink(BasicClientUIComponent): + """Show a link in the inbox message.""" + + url: Annotated[str, IOAttrs('u')] + label: Annotated[str, IOAttrs('l')] + subs: Annotated[list[str], IOAttrs('s', store_default=False)] = field( + default_factory=list + ) + spacing_top: Annotated[float, IOAttrs('st', store_default=False)] = 0.0 + spacing_bottom: Annotated[float, IOAttrs('sb', store_default=False)] = 0.0 + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.LINK + + +@ioprepped +@dataclass +class BasicClientUIBsClassicTourneyResult(BasicClientUIComponent): + """Show info about a classic tourney.""" + + tournament_id: Annotated[str, IOAttrs('t')] + game: Annotated[str, IOAttrs('g')] + players: Annotated[int, IOAttrs('p')] + rank: Annotated[int, IOAttrs('r')] + trophy: Annotated[str | None, IOAttrs('tr')] + prizes: Annotated[list[DisplayItemWrapper], IOAttrs('pr')] + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.BS_CLASSIC_TOURNEY_RESULT + + +@ioprepped +@dataclass +class BasicClientUIDisplayItems(BasicClientUIComponent): + """Show some display-items.""" + + items: Annotated[list[DisplayItemWrapper], IOAttrs('d')] + width: Annotated[float, IOAttrs('w')] = 100.0 + spacing_top: Annotated[float, IOAttrs('st', store_default=False)] = 0.0 + spacing_bottom: Annotated[float, IOAttrs('sb', store_default=False)] = 0.0 + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.DISPLAY_ITEMS + + +@ioprepped +@dataclass +class BasicClientUIExpireTime(BasicClientUIComponent): + """Show expire-time.""" + + time: Annotated[datetime.datetime, IOAttrs('d')] + spacing_top: Annotated[float, IOAttrs('st', store_default=False)] = 0.0 + spacing_bottom: Annotated[float, IOAttrs('sb', store_default=False)] = 0.0 + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.EXPIRE_TIME + + +@ioprepped +@dataclass +class BasicClientUI(ClientUI): + """A basic UI for the client.""" + + class ButtonLabel(Enum): + """Distinct button labels we support.""" + + UNKNOWN = 'u' + OK = 'o' + APPLY = 'a' + CANCEL = 'c' + ACCEPT = 'ac' + DECLINE = 'dn' + IGNORE = 'ig' + CLAIM = 'cl' + DISCARD = 'd' + + class InteractionStyle(Enum): + """Overall interaction styles we support.""" + + UNKNOWN = 'u' + BUTTON_POSITIVE = 'p' + BUTTON_POSITIVE_NEGATIVE = 'pn' + + components: Annotated[list[BasicClientUIComponent], IOAttrs('s')] + + interaction_style: Annotated[ + InteractionStyle, IOAttrs('i', enum_fallback=InteractionStyle.UNKNOWN) + ] = InteractionStyle.BUTTON_POSITIVE + + button_label_positive: Annotated[ + ButtonLabel, IOAttrs('p', enum_fallback=ButtonLabel.UNKNOWN) + ] = ButtonLabel.OK + + button_label_negative: Annotated[ + ButtonLabel, IOAttrs('n', enum_fallback=ButtonLabel.UNKNOWN) + ] = ButtonLabel.CANCEL + + @override + @classmethod + def get_type_id(cls) -> ClientUITypeID: + return ClientUITypeID.BASIC + + def contains_unknown_elements(self) -> bool: + """Whether something within us is an unknown type or enum.""" + return ( + self.interaction_style is self.InteractionStyle.UNKNOWN + or self.button_label_positive is self.ButtonLabel.UNKNOWN + or self.button_label_negative is self.ButtonLabel.UNKNOWN + or any( + c.get_type_id() is BasicClientUIComponentTypeID.UNKNOWN + for c in self.components + ) + ) + + +@ioprepped +@dataclass +class ClientUIWrapper: + """Wrapper for a ClientUI and its common data.""" + + id: Annotated[str, IOAttrs('i')] + createtime: Annotated[datetime.datetime, IOAttrs('c')] + ui: Annotated[ClientUI, IOAttrs('e')] + + +@ioprepped +@dataclass +class InboxRequestMessage(Message): + """Message requesting our inbox.""" + + @override + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [InboxRequestResponse] + + +@ioprepped +@dataclass +class InboxRequestResponse(Response): + """Here's that inbox contents you asked for, boss.""" + + wrappers: Annotated[list[ClientUIWrapper], IOAttrs('w')] + + # Printable error if something goes wrong. + error: Annotated[str | None, IOAttrs('e')] = None + + +class ClientUIAction(Enum): + """Types of actions we can run.""" + + BUTTON_PRESS_POSITIVE = 'p' + BUTTON_PRESS_NEGATIVE = 'n' + + +class ClientEffectTypeID(Enum): + """Type ID for each of our subclasses.""" + + UNKNOWN = 'u' + SCREEN_MESSAGE = 'm' + SOUND = 's' + DELAY = 'd' + + +class ClientEffect(IOMultiType[ClientEffectTypeID]): + """Something that can happen on the client. + + This can include screen messages, sounds, visual effects, etc. + """ + + @override + @classmethod + def get_type_id(cls) -> ClientEffectTypeID: + # Require child classes to supply this themselves. If we did a + # full type registry/lookup here it would require us to import + # everything and would prevent lazy loading. + raise NotImplementedError() + + @override + @classmethod + def get_type(cls, type_id: ClientEffectTypeID) -> type[ClientEffect]: + """Return the subclass for each of our type-ids.""" + # pylint: disable=cyclic-import + + t = ClientEffectTypeID + if type_id is t.UNKNOWN: + return ClientEffectUnknown + if type_id is t.SCREEN_MESSAGE: + return ClientEffectScreenMessage + if type_id is t.SOUND: + return ClientEffectSound + if type_id is t.DELAY: + return ClientEffectDelay + + # Important to make sure we provide all types. + assert_never(type_id) + + @override + @classmethod + def get_unknown_type_fallback(cls) -> ClientEffect: + # If we encounter some future message type we don't know + # anything about, drop in a placeholder. + return ClientEffectUnknown() + + +@ioprepped +@dataclass +class ClientEffectUnknown(ClientEffect): + """Fallback substitute for types we don't recognize.""" + + @override + @classmethod + def get_type_id(cls) -> ClientEffectTypeID: + return ClientEffectTypeID.UNKNOWN + + +@ioprepped +@dataclass +class ClientEffectScreenMessage(ClientEffect): + """Display a screen-message.""" + + message: Annotated[str, IOAttrs('m')] + subs: Annotated[list[str], IOAttrs('s')] + color: Annotated[tuple[float, float, float], IOAttrs('c')] = (1.0, 1.0, 1.0) + + @override + @classmethod + def get_type_id(cls) -> ClientEffectTypeID: + return ClientEffectTypeID.SCREEN_MESSAGE + + +@ioprepped +@dataclass +class ClientEffectSound(ClientEffect): + """Play a sound.""" + + class Sound(Enum): + """Sounds that can be made alongside the message.""" + + UNKNOWN = 'u' + CASH_REGISTER = 'c' + ERROR = 'e' + POWER_DOWN = 'p' + GUN_COCKING = 'g' + + sound: Annotated[Sound, IOAttrs('s', enum_fallback=Sound.UNKNOWN)] + volume: Annotated[float, IOAttrs('v')] = 1.0 + + @override + @classmethod + def get_type_id(cls) -> ClientEffectTypeID: + return ClientEffectTypeID.SOUND + + +@ioprepped +@dataclass +class ClientEffectDelay(ClientEffect): + """Delay effect processing.""" + + seconds: Annotated[float, IOAttrs('s')] + + @override + @classmethod + def get_type_id(cls) -> ClientEffectTypeID: + return ClientEffectTypeID.DELAY + + +@ioprepped +@dataclass +class ClientUIActionMessage(Message): + """Do something to a client ui.""" + + id: Annotated[str, IOAttrs('i')] + action: Annotated[ClientUIAction, IOAttrs('a')] + + @override + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [ClientUIActionResponse] + + +@ioprepped +@dataclass +class ClientUIActionResponse(Response): + """Did something to that inbox entry, boss.""" + + class ErrorType(Enum): + """Types of errors that may have occurred.""" + + # Probably a future error type we don't recognize. + UNKNOWN = 'u' + + # Something went wrong on the server, but specifics are not + # relevant. + INTERNAL = 'i' + + # The entry expired on the server. In various cases such as 'ok' + # buttons this can generally be ignored. + EXPIRED = 'e' + + error_type: Annotated[ + ErrorType | None, IOAttrs('et', enum_fallback=ErrorType.UNKNOWN) + ] + + # User facing error message in the case of errors. + error_message: Annotated[str | None, IOAttrs('em')] + + effects: Annotated[list[ClientEffect], IOAttrs('fx')] + + +@ioprepped +@dataclass +class ScoreSubmitMessage(Message): + """Let the server know we got some score in something.""" + + score_token: Annotated[str, IOAttrs('t')] + + @override + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [ScoreSubmitResponse] + + +@ioprepped +@dataclass +class ScoreSubmitResponse(Response): + """Did something to that inbox entry, boss.""" + + # Things we should show on our end. + effects: Annotated[list[ClientEffect], IOAttrs('fx')] diff --git a/dist/ba_data/python/bacommon/cloud.py b/dist/ba_data/python/bacommon/cloud.py index 223fb71..0d8aaf2 100644 --- a/dist/ba_data/python/bacommon/cloud.py +++ b/dist/ba_data/python/bacommon/cloud.py @@ -3,9 +3,10 @@ """Functionality related to cloud functionality.""" from __future__ import annotations + +from enum import Enum from dataclasses import dataclass, field from typing import TYPE_CHECKING, Annotated, override -from enum import Enum from efro.message import Message, Response from efro.dataclassio import ioprepped, IOAttrs @@ -299,27 +300,3 @@ class StoreQueryResponse(Response): available_purchases: Annotated[list[Purchase], IOAttrs('p')] token_info_url: Annotated[str, IOAttrs('tiu')] - - -@ioprepped -@dataclass -class BSPrivatePartyMessage(Message): - """Message asking about info we need for private-party UI.""" - - need_datacode: Annotated[bool, IOAttrs('d')] - - @override - @classmethod - def get_response_types(cls) -> list[type[Response] | None]: - return [BSPrivatePartyResponse] - - -@ioprepped -@dataclass -class BSPrivatePartyResponse(Response): - """Here's that private party UI info you asked for, boss.""" - - success: Annotated[bool, IOAttrs('s')] - tokens: Annotated[int, IOAttrs('t')] - gold_pass: Annotated[bool, IOAttrs('g')] - datacode: Annotated[str | None, IOAttrs('d')] diff --git a/dist/ba_data/python/bacommon/loggercontrol.py b/dist/ba_data/python/bacommon/loggercontrol.py new file mode 100644 index 0000000..e07e811 --- /dev/null +++ b/dist/ba_data/python/bacommon/loggercontrol.py @@ -0,0 +1,212 @@ +# Released under the MIT License. See LICENSE for details. +# +"""System for managing loggers.""" + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Annotated +from dataclasses import dataclass, field + +from efro.dataclassio import ioprepped, IOAttrs + +if TYPE_CHECKING: + from typing import Self, Sequence + + +@ioprepped +@dataclass +class LoggerControlConfig: + """A logging level configuration that applies to all loggers. + + Any loggers not explicitly contained in the configuration will be + set to NOTSET. + """ + + # Logger names mapped to log-level values (from system logging + # module). + levels: Annotated[dict[str, int], IOAttrs('l', store_default=False)] = ( + field(default_factory=dict) + ) + + def apply( + self, + *, + warn_unexpected_loggers: bool = False, + warn_missing_loggers: bool = False, + ignore_log_prefixes: list[str] | None = None, + ) -> None: + """Apply the config to all Python loggers. + + If 'warn_unexpected_loggers' is True, warnings will be issues for + any loggers not explicitly covered by the config. This is useful + to help ensure controls for all possible loggers are present in + a UI/etc. + + If 'warn_missing_loggers' is True, warnings will be issued for + any loggers present in the config that are not found at apply time. + This can be useful for pruning settings for no longer used loggers. + + Warnings for any log names beginning with any strings in + 'ignore_log_prefixes' will be suppressed. This can allow + ignoring loggers associated with submodules for a given package + and instead presenting only a top level logger (or none at all). + """ + if ignore_log_prefixes is None: + ignore_log_prefixes = [] + + existinglognames = ( + set(['root']) | logging.root.manager.loggerDict.keys() + ) + + # First issue any warnings they want. + if warn_unexpected_loggers: + for logname in sorted(existinglognames): + if logname not in self.levels and not any( + logname.startswith(pre) for pre in ignore_log_prefixes + ): + logging.warning( + 'Found a logger not covered by LoggerControlConfig:' + " '%s'.", + logname, + ) + if warn_missing_loggers: + for logname in sorted(self.levels.keys()): + if logname not in existinglognames and not any( + logname.startswith(pre) for pre in ignore_log_prefixes + ): + logging.warning( + 'Logger covered by LoggerControlConfig does not exist:' + ' %s.', + logname, + ) + + # First, update levels for all existing loggers. + for logname in existinglognames: + logger = logging.getLogger(logname) + level = self.levels.get(logname) + if level is None: + level = logging.NOTSET + logger.setLevel(level) + + # Next, assign levels to any loggers that don't exist. + for logname, level in self.levels.items(): + if logname not in existinglognames: + logging.getLogger(logname).setLevel(level) + + def sanity_check_effective_levels(self) -> None: + """Checks existing loggers to make sure they line up with us. + + This can be called periodically to ensure that a control-config + is properly driving log levels and that nothing else is changing + them behind our back. + """ + + existinglognames = ( + set(['root']) | logging.root.manager.loggerDict.keys() + ) + for logname in existinglognames: + logger = logging.getLogger(logname) + if logger.getEffectiveLevel() != self.get_effective_level(logname): + logging.error( + 'loggercontrol effective-level sanity check failed;' + ' expected logger %s to have effective level %s' + ' but it has %s.', + logname, + logging.getLevelName(self.get_effective_level(logname)), + logging.getLevelName(logger.getEffectiveLevel()), + ) + + def get_effective_level(self, logname: str) -> int: + """Given a log name, predict its level if this config is applied.""" + splits = logname.split('.') + + splen = len(splits) + for i in range(splen): + subname = '.'.join(splits[: splen - i]) + thisval = self.levels.get(subname) + if thisval is not None and thisval != logging.NOTSET: + return thisval + + # Haven't found anything; just return root value. + thisval = self.levels.get('root') + return ( + logging.DEBUG + if thisval is None + else logging.DEBUG if thisval == logging.NOTSET else thisval + ) + + def would_make_changes(self) -> bool: + """Return whether calling apply would change anything.""" + + existinglognames = ( + set(['root']) | logging.root.manager.loggerDict.keys() + ) + + # Return True if we contain any nonexistent loggers. Even if + # we wouldn't change their level, the fact that we'd create + # them still counts as a difference. + if any( + logname not in existinglognames for logname in self.levels.keys() + ): + return True + + # Now go through all existing loggers and return True if we + # would change their level. + for logname in existinglognames: + logger = logging.getLogger(logname) + level = self.levels.get(logname) + if level is None: + level = logging.NOTSET + if logger.level != level: + return True + + return False + + def diff(self, baseconfig: LoggerControlConfig) -> LoggerControlConfig: + """Return a config containing only changes compared to a base config. + + Note that this omits all NOTSET values that resolve to NOTSET in + the base config. + + This diffed config can later be used with apply_diff() against the + base config to recreate the state represented by self. + """ + cls = type(self) + config = cls() + for loggername, level in self.levels.items(): + baselevel = baseconfig.levels.get(loggername, logging.NOTSET) + if level != baselevel: + config.levels[loggername] = level + return config + + def apply_diff( + self, diffconfig: LoggerControlConfig + ) -> LoggerControlConfig: + """Apply a diff config to ourself. + + Note that values that resolve to NOTSET are left intact in the + output config. This is so all loggers expected by either the + base or diff config to exist can be created if desired/etc. + """ + cls = type(self) + + # Create a new config (with an indepenent levels dict copy). + config = cls(levels=dict(self.levels)) + + # Overlay the diff levels dict onto our new one. + config.levels.update(diffconfig.levels) + + # Note: we do NOT prune NOTSET values here. This is so all + # loggers mentioned in the base config get created if we are + # applied, even if they are assigned a default level. + return config + + @classmethod + def from_current_loggers(cls) -> Self: + """Build a config from the current set of loggers.""" + lognames = ['root'] + sorted(logging.root.manager.loggerDict) + config = cls() + for logname in lognames: + config.levels[logname] = logging.getLogger(logname).level + return config diff --git a/dist/ba_data/python/bacommon/logging.py b/dist/ba_data/python/bacommon/logging.py new file mode 100644 index 0000000..723c9fc --- /dev/null +++ b/dist/ba_data/python/bacommon/logging.py @@ -0,0 +1,27 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Logging functionality.""" + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING +from bacommon.loggercontrol import LoggerControlConfig + +if TYPE_CHECKING: + pass + + +def get_base_logger_control_config_client() -> LoggerControlConfig: + """Return the logger-control-config used by the ballistica client. + + This should remain consistent since local logger configurations + are stored relative to this. + """ + + # By default, go with WARNING on everything to keep things mostly + # clean but show INFO for ba.app to get basic app startup messages + # and whatnot. + return LoggerControlConfig( + levels={'root': logging.WARNING, 'ba.app': logging.INFO} + ) diff --git a/dist/ba_data/python/bacommon/servermanager.py b/dist/ba_data/python/bacommon/servermanager.py index 31f235f..20b9f4e 100644 --- a/dist/ba_data/python/bacommon/servermanager.py +++ b/dist/ba_data/python/bacommon/servermanager.py @@ -186,6 +186,11 @@ class ServerConfig: # involving leaving and rejoining or switching teams rapidly. player_rejoin_cooldown: float = 10.0 + # Log levels for particular loggers, overriding the engine's + # defaults. Valid values are NOTSET, DEBUG, INFO, WARNING, ERROR, or + # CRITICAL. + log_levels: dict[str, str] | None = None + # NOTE: as much as possible, communication from the server-manager to # the child-process should go through these and not ad-hoc Python string diff --git a/dist/ba_data/python/baenv.py b/dist/ba_data/python/baenv.py index a087524..b7da38f 100644 --- a/dist/ba_data/python/baenv.py +++ b/dist/ba_data/python/baenv.py @@ -18,6 +18,7 @@ from __future__ import annotations import os import sys +import time import logging from pathlib import Path from dataclasses import dataclass @@ -27,7 +28,7 @@ import __main__ if TYPE_CHECKING: from typing import Any - from efro.log import LogHandler + from efro.logging import LogHandler # IMPORTANT - It is likely (and in some cases expected) that this # module's code will be exec'ed multiple times. This is because it is @@ -52,7 +53,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21949 +TARGET_BALLISTICA_BUILD = 22278 TARGET_BALLISTICA_VERSION = '1.7.37' @@ -87,14 +88,13 @@ class EnvConfig: # stderr into the engine so they show up on in-app consoles, etc. log_handler: LogHandler | None - # Initial data from the ballisticakit-config.json file. This is - # passed mostly as an optimization to avoid reading the same config - # file twice, since config data is first needed in baenv and next in - # the engine. It will be cleared after passing it to the app's - # config management subsystem and should not be accessed by any - # other code. + # Initial data from the config.json file in the config dir. The + # config file is parsed by initial_app_config: Any + # Timestamp when we first started doing stuff. + launch_time: float + @dataclass class _EnvGlobals: @@ -156,6 +156,7 @@ def get_config() -> EnvConfig: def configure( + *, config_dir: str | None = None, data_dir: str | None = None, user_python_dir: str | None = None, @@ -171,6 +172,11 @@ def configure( are imported; the environment is locked in as soon as that happens. """ + # Measure when we start doing this stuff. We plug this in to show + # relative times in our log timestamp displays and also pass this to + # the engine to do the same there. + launch_time = time.time() + envglobals = _EnvGlobals.get() # Keep track of whether we've been *called*, not whether a config @@ -205,11 +211,19 @@ def configure( config_dir, ) - # The second thing we do is set up our logging system and pipe - # Python's stdout/stderr into it. At this point we can at least - # debug problems on systems where native stdout/stderr is not easily - # accessible such as Android. - log_handler = _setup_logging() if setup_logging else None + # Set up our log-handler and pipe Python's stdout/stderr into it. + # Later, once the engine comes up, the handler will feed its logs + # (including cached history) to the os-specific output location. + # This means anything printed or logged at this point forward should + # be visible on all platforms. + log_handler = _create_log_handler(launch_time) if setup_logging else None + + # Load the raw app-config dict. + app_config = _read_app_config(os.path.join(config_dir, 'config.json')) + + # Set logging levels to stored values or defaults. + if setup_logging: + _set_log_levels(app_config) # We want to always be run in UTF-8 mode; complain if we're not. if sys.flags.utf8_mode != 1: @@ -234,10 +248,46 @@ def configure( site_python_dir=site_python_dir, log_handler=log_handler, is_user_app_python_dir=is_user_app_python_dir, - initial_app_config=None, + initial_app_config=app_config, + launch_time=launch_time, ) +def _read_app_config(config_file_path: str) -> dict: + """Read the app config.""" + import json + + config: dict | Any + config_contents = '' + try: + if os.path.exists(config_file_path): + with open(config_file_path, encoding='utf-8') as infile: + config_contents = infile.read() + config = json.loads(config_contents) + if not isinstance(config, dict): + raise RuntimeError('Got non-dict for config root.') + else: + config = {} + + except Exception: + logging.exception( + "Error reading config file '%s'.\n" + "Backing up broken config to'%s.broken'.", + config_file_path, + config_file_path, + ) + + try: + import shutil + + shutil.copyfile(config_file_path, config_file_path + '.broken') + except Exception: + logging.exception('Error copying broken config.') + config = {} + + return config + + def _calc_data_dir(data_dir: str | None) -> str: if data_dir is None: # To calc default data_dir, we assume this module was imported @@ -261,23 +311,58 @@ def _calc_data_dir(data_dir: str | None) -> str: return data_dir -def _setup_logging() -> LogHandler: - from efro.log import setup_logging, LogLevel +def _create_log_handler(launch_time: float) -> LogHandler: + from efro.logging import setup_logging, LogLevel - # TODO: should set this up with individual loggers under a top level - # 'ba' logger, and at that point we can kill off the - # suppress_non_root_debug option since we'll only ever need to set - # 'ba' to DEBUG at most. log_handler = setup_logging( log_path=None, - level=LogLevel.DEBUG, - suppress_non_root_debug=True, + level=LogLevel.INFO, log_stdout_stderr=True, cache_size_limit=1024 * 1024, + launch_time=launch_time, ) return log_handler +def _set_log_levels(app_config: dict) -> None: + + from bacommon.logging import get_base_logger_control_config_client + from bacommon.loggercontrol import LoggerControlConfig + + try: + config = app_config.get('Log Levels', None) + + if config is None: + get_base_logger_control_config_client().apply() + return + + # Make sure data is expected types/values since this is user + # editable. + valid_levels = { + logging.NOTSET, + logging.DEBUG, + logging.INFO, + logging.WARNING, + logging.ERROR, + logging.CRITICAL, + } + for logname, loglevel in config.items(): + if ( + not isinstance(logname, str) + or not logname + or not isinstance(loglevel, int) + or not loglevel in valid_levels + ): + raise ValueError("Invalid 'Log Levels' data read from config.") + + get_base_logger_control_config_client().apply_diff( + LoggerControlConfig(levels=config) + ).apply() + + except Exception: + logging.exception('Error setting log levels.') + + def _setup_certs(contains_python_dist: bool) -> None: # In situations where we're bringing our own Python, let's also # provide our own root certs so ssl works. We can consider diff --git a/dist/ba_data/python/baplus/__init__.py b/dist/ba_data/python/baplus/__init__.py index 4040f7b..9b2dba2 100644 --- a/dist/ba_data/python/baplus/__init__.py +++ b/dist/ba_data/python/baplus/__init__.py @@ -5,23 +5,23 @@ This code concerns sensitive things like accounts and master-server communication so the native C++ parts of it remain closed. Native precompiled static libraries of this portion are provided for those who -want to compile the rest of the engine, and a fully open-source engine -can also be built by removing this 'plus' feature-set. +want to compile the rest of the engine, or a fully open-source app +can also be built by removing this feature-set. """ from __future__ import annotations -# Note: there's not much here. -# All comms with this feature-set should go through app.plus. +# Note: there's not much here. Most interaction with this feature-set +# should go through ba*.app.plus. import logging from baplus._cloud import CloudSubsystem -from baplus._subsystem import PlusSubsystem +from baplus._appsubsystem import PlusAppSubsystem __all__ = [ 'CloudSubsystem', - 'PlusSubsystem', + 'PlusAppSubsystem', ] # Sanity check: we want to keep ballistica's dependencies and diff --git a/dist/ba_data/python/baplus/_subsystem.py b/dist/ba_data/python/baplus/_appsubsystem.py similarity index 94% rename from dist/ba_data/python/baplus/_subsystem.py rename to dist/ba_data/python/baplus/_appsubsystem.py index c5ef5ff..809f387 100644 --- a/dist/ba_data/python/baplus/_subsystem.py +++ b/dist/ba_data/python/baplus/_appsubsystem.py @@ -12,12 +12,13 @@ import _baplus if TYPE_CHECKING: from typing import Callable, Any + import bacommon.bs from babase import AccountV2Subsystem from baplus._cloud import CloudSubsystem -class PlusSubsystem(AppSubsystem): +class PlusAppSubsystem(AppSubsystem): """Subsystem for plus functionality in the app. The single shared instance of this app can be accessed at @@ -40,7 +41,6 @@ class PlusSubsystem(AppSubsystem): _baplus.on_app_loading() self.accounts.on_app_loading() - # noinspection PyUnresolvedReferences @staticmethod def add_v1_account_transaction( transaction: dict, callback: Callable | None = None @@ -66,9 +66,9 @@ class PlusSubsystem(AppSubsystem): return _baplus.get_master_server_address(source, version) @staticmethod - def get_news_show() -> str: + def get_classic_news_show() -> str: """(internal)""" - return _baplus.get_news_show() + return _baplus.get_classic_news_show() @staticmethod def get_price(item: str) -> str | None: @@ -76,14 +76,14 @@ class PlusSubsystem(AppSubsystem): return _baplus.get_price(item) @staticmethod - def get_purchased(item: str) -> bool: + def get_v1_account_product_purchased(item: str) -> bool: """(internal)""" - return _baplus.get_purchased(item) + return _baplus.get_v1_account_product_purchased(item) @staticmethod - def get_purchases_state() -> int: + def get_v1_account_product_purchases_state() -> int: """(internal)""" - return _baplus.get_purchases_state() + return _baplus.get_v1_account_product_purchases_state() @staticmethod def get_v1_account_display_string(full: bool = True) -> str: @@ -129,7 +129,7 @@ class PlusSubsystem(AppSubsystem): def get_v1_account_ticket_count() -> int: """(internal) - Returns the number of tickets for the current account. + Return the number of tickets for the current account. """ return _baplus.get_v1_account_ticket_count() @@ -221,6 +221,7 @@ class PlusSubsystem(AppSubsystem): name: Any, score: int | None, callback: Callable, + *, order: str = 'increasing', tournament_id: str | None = None, score_type: str = 'points', diff --git a/dist/ba_data/python/baplus/_cloud.py b/dist/ba_data/python/baplus/_cloud.py index 0fcc0ae..c0d030d 100644 --- a/dist/ba_data/python/baplus/_cloud.py +++ b/dist/ba_data/python/baplus/_cloud.py @@ -7,6 +7,7 @@ from __future__ import annotations import logging from typing import TYPE_CHECKING, overload +from efro.call import CallbackSet import babase if TYPE_CHECKING: @@ -14,8 +15,8 @@ if TYPE_CHECKING: from efro.message import Message, Response import bacommon.cloud + import bacommon.bs -DEBUG_LOG = False # TODO: Should make it possible to define a protocol in bacommon.cloud and # autogenerate this. That would give us type safety between this and @@ -25,6 +26,12 @@ DEBUG_LOG = False class CloudSubsystem(babase.AppSubsystem): """Manages communication with cloud components.""" + def __init__(self) -> None: + super().__init__() + self.on_connectivity_changed_callbacks: CallbackSet[ + Callable[[bool], None] + ] = CallbackSet() + @property def connected(self) -> bool: """Property equivalent of CloudSubsystem.is_connected().""" @@ -40,15 +47,17 @@ class CloudSubsystem(babase.AppSubsystem): def on_connectivity_changed(self, connected: bool) -> None: """Called when cloud connectivity state changes.""" - if DEBUG_LOG: - logging.debug('CloudSubsystem: Connectivity is now %s.', connected) + babase.balog.debug('Connectivity is now %s.', connected) plus = babase.app.plus assert plus is not None - # Inform things that use this. - # (TODO: should generalize this into some sort of registration system) - plus.accounts.on_cloud_connectivity_changed(connected) + # Fire any registered callbacks for this. + for call in self.on_connectivity_changed_callbacks.getcalls(): + try: + call(connected) + except Exception: + logging.exception('Error in connectivity-changed callback.') @overload def send_message_cb( @@ -112,9 +121,54 @@ class CloudSubsystem(babase.AppSubsystem): @overload def send_message_cb( self, - msg: bacommon.cloud.BSPrivatePartyMessage, + msg: bacommon.bs.PrivatePartyMessage, on_response: Callable[ - [bacommon.cloud.BSPrivatePartyResponse | Exception], None + [bacommon.bs.PrivatePartyResponse | Exception], None + ], + ) -> None: ... + + @overload + def send_message_cb( + self, + msg: bacommon.bs.InboxRequestMessage, + on_response: Callable[ + [bacommon.bs.InboxRequestResponse | Exception], None + ], + ) -> None: ... + + @overload + def send_message_cb( + self, + msg: bacommon.bs.ClientUIActionMessage, + on_response: Callable[ + [bacommon.bs.ClientUIActionResponse | Exception], None + ], + ) -> None: ... + + @overload + def send_message_cb( + self, + msg: bacommon.bs.ChestInfoMessage, + on_response: Callable[ + [bacommon.bs.ChestInfoResponse | Exception], None + ], + ) -> None: ... + + @overload + def send_message_cb( + self, + msg: bacommon.bs.ChestActionMessage, + on_response: Callable[ + [bacommon.bs.ChestActionResponse | Exception], None + ], + ) -> None: ... + + @overload + def send_message_cb( + self, + msg: bacommon.bs.ScoreSubmitMessage, + on_response: Callable[ + [bacommon.bs.ScoreSubmitResponse | Exception], None ], ) -> None: ... @@ -128,14 +182,8 @@ class CloudSubsystem(babase.AppSubsystem): The provided on_response call will be run in the logic thread and passed either the response or the error that occurred. """ - - del msg # Unused. - - babase.pushcall( - babase.Call( - on_response, - RuntimeError('Cloud functionality is not available.'), - ) + raise NotImplementedError( + 'Cloud functionality is not present in this build.' ) @overload @@ -158,7 +206,9 @@ class CloudSubsystem(babase.AppSubsystem): Must be called from a background thread. """ - raise RuntimeError('Cloud functionality is not available.') + raise NotImplementedError( + 'Cloud functionality is not present in this build.' + ) @overload async def send_message_async( @@ -175,7 +225,35 @@ class CloudSubsystem(babase.AppSubsystem): Must be called from the logic thread. """ - raise RuntimeError('Cloud functionality is not available.') + raise NotImplementedError( + 'Cloud functionality is not present in this build.' + ) + + def subscribe_test( + self, updatecall: Callable[[int | None], None] + ) -> babase.CloudSubscription: + """Subscribe to some test data.""" + raise NotImplementedError( + 'Cloud functionality is not present in this build.' + ) + + def subscribe_classic_account_data( + self, + updatecall: Callable[[bacommon.bs.ClassicAccountLiveData], None], + ) -> babase.CloudSubscription: + """Subscribe to classic account data.""" + raise NotImplementedError( + 'Cloud functionality is not present in this build.' + ) + + def unsubscribe(self, subscription_id: int) -> None: + """Unsubscribe from some subscription. + + Do not call this manually; it is called by CloudSubscription. + """ + raise NotImplementedError( + 'Cloud functionality is not present in this build.' + ) def cloud_console_exec(code: str) -> None: diff --git a/dist/ba_data/python/bascenev1/__init__.py b/dist/ba_data/python/bascenev1/__init__.py index b351348..873e4f7 100644 --- a/dist/ba_data/python/bascenev1/__init__.py +++ b/dist/ba_data/python/bascenev1/__init__.py @@ -1,8 +1,8 @@ # Released under the MIT License. See LICENSE for details. # -"""Ballistica scene api version 1. Basically all gameplay related code.""" +"""Gameplay-centric api for classic BombSquad.""" -# ba_meta require api 8 +# ba_meta require api 9 # The stuff we expose here at the top level is our 'public' api for use # from other modules/packages. Code *within* this package should import @@ -18,6 +18,7 @@ import logging from efro.util import set_canonical_module_names from babase import ( + add_clean_frame_callback, app, AppIntent, AppIntentDefault, @@ -149,7 +150,6 @@ from _bascenev1 import ( from bascenev1._activity import Activity from bascenev1._activitytypes import JoinActivity, ScoreScreenActivity from bascenev1._actor import Actor -from bascenev1._appmode import SceneV1AppMode from bascenev1._campaign import init_campaigns, Campaign from bascenev1._collision import Collision, getcollision from bascenev1._coopgame import CoopGameActivity @@ -249,6 +249,7 @@ __all__ = [ 'Actor', 'animate', 'animate_array', + 'add_clean_frame_callback', 'app', 'AppIntent', 'AppIntentDefault', @@ -410,7 +411,6 @@ __all__ = [ 'seek_replay', 'safecolor', 'screenmessage', - 'SceneV1AppMode', 'ScoreConfig', 'ScoreScreenActivity', 'ScoreType', diff --git a/dist/ba_data/python/bascenev1/_appmode.py b/dist/ba_data/python/bascenev1/_appmode.py deleted file mode 100644 index 72a77ae..0000000 --- a/dist/ba_data/python/bascenev1/_appmode.py +++ /dev/null @@ -1,60 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""Provides AppMode functionality.""" -from __future__ import annotations - -from typing import TYPE_CHECKING, override - -from bacommon.app import AppExperience -from babase import ( - app, - AppMode, - AppIntentExec, - AppIntentDefault, - invoke_main_menu, -) - -import _bascenev1 - -if TYPE_CHECKING: - from babase import AppIntent - - -class SceneV1AppMode(AppMode): - """Our app-mode.""" - - @override - @classmethod - def get_app_experience(cls) -> AppExperience: - return AppExperience.MELEE - - @override - @classmethod - def _supports_intent(cls, intent: AppIntent) -> bool: - # We support default and exec intents currently. - return isinstance(intent, AppIntentExec | AppIntentDefault) - - @override - def handle_intent(self, intent: AppIntent) -> None: - if isinstance(intent, AppIntentExec): - _bascenev1.handle_app_intent_exec(intent.code) - return - assert isinstance(intent, AppIntentDefault) - _bascenev1.handle_app_intent_default() - - @override - def on_activate(self) -> None: - # Let the native layer do its thing. - _bascenev1.on_app_mode_activate() - - @override - def on_deactivate(self) -> None: - # Let the native layer do its thing. - _bascenev1.on_app_mode_deactivate() - - @override - def on_app_active_changed(self) -> None: - # If we've gone inactive, bring up the main menu, which has the - # side effect of pausing the action (when possible). - if not app.active: - invoke_main_menu() diff --git a/dist/ba_data/python/bascenev1/_gameactivity.py b/dist/ba_data/python/bascenev1/_gameactivity.py index 1517733..d0e3652 100644 --- a/dist/ba_data/python/bascenev1/_gameactivity.py +++ b/dist/ba_data/python/bascenev1/_gameactivity.py @@ -64,36 +64,6 @@ class GameActivity(Activity[PlayerT, TeamT]): # (unless overridden by the map). default_music: bascenev1.MusicType | None = None - @classmethod - def create_settings_ui( - cls, - sessiontype: type[bascenev1.Session], - settings: dict | None, - completion_call: Callable[[dict | None], None], - ) -> None: - """Launch an in-game UI to configure settings for a game type. - - 'sessiontype' should be the bascenev1.Session class the game will - be used in. - - 'settings' should be an existing settings dict (implies 'edit' - ui mode) or None (implies 'add' ui mode). - - 'completion_call' will be called with a filled-out settings dict on - success or None on cancel. - - Generally subclasses don't need to override this; if they override - bascenev1.GameActivity.get_available_settings() and - bascenev1.GameActivity.get_supported_maps() they can just rely on - the default implementation here which calls those methods. - """ - assert babase.app.classic is not None - delegate = babase.app.classic.delegate - assert delegate is not None - delegate.create_default_game_settings_ui( - cls, sessiontype, settings, completion_call - ) - @classmethod def getscoreconfig(cls) -> bascenev1.ScoreConfig: """Return info about game scoring setup; can be overridden by games.""" @@ -238,8 +208,6 @@ class GameActivity(Activity[PlayerT, TeamT]): """Instantiate the Activity.""" super().__init__(settings) - plus = babase.app.plus - # Holds some flattened info about the player set at the point # when on_begin() is called. self.initialplayerinfos: list[bascenev1.PlayerInfo] | None = None @@ -269,23 +237,6 @@ class GameActivity(Activity[PlayerT, TeamT]): None ) self._zoom_message_times: dict[int, float] = {} - self._is_waiting_for_continue = False - - self._continue_cost = ( - 25 - if plus is None - else plus.get_v1_account_misc_read_val('continueStartCost', 25) - ) - self._continue_cost_mult = ( - 2 - if plus is None - else plus.get_v1_account_misc_read_val('continuesMult', 2) - ) - self._continue_cost_offset = ( - 0 - if plus is None - else plus.get_v1_account_misc_read_val('continuesOffset', 0) - ) @property def map(self) -> _map.Map: @@ -392,103 +343,6 @@ class GameActivity(Activity[PlayerT, TeamT]): if music is not None: _music.setmusic(music) - def on_continue(self) -> None: - """ - This is called if a game supports and offers a continue and the player - accepts. In this case the player should be given an extra life or - whatever is relevant to keep the game going. - """ - - def _continue_choice(self, do_continue: bool) -> None: - plus = babase.app.plus - assert plus is not None - self._is_waiting_for_continue = False - if self.has_ended(): - return - with self.context: - if do_continue: - _bascenev1.getsound('shieldUp').play() - _bascenev1.getsound('cashRegister').play() - plus.add_v1_account_transaction( - {'type': 'CONTINUE', 'cost': self._continue_cost} - ) - if plus is not None: - plus.run_v1_account_transactions() - self._continue_cost = ( - self._continue_cost * self._continue_cost_mult - + self._continue_cost_offset - ) - self.on_continue() - else: - self.end_game() - - def is_waiting_for_continue(self) -> bool: - """Returns whether or not this activity is currently waiting for the - player to continue (or timeout)""" - return self._is_waiting_for_continue - - def continue_or_end_game(self) -> None: - """If continues are allowed, prompts the player to purchase a continue - and calls either end_game or continue_game depending on the result - """ - # pylint: disable=too-many-nested-blocks - # pylint: disable=cyclic-import - from bascenev1._coopsession import CoopSession - - classic = babase.app.classic - assert classic is not None - continues_window = classic.continues_window - - # Turning these off. I want to migrate towards monetization that - # feels less pay-to-win-ish. - allow_continues = False - - plus = babase.app.plus - try: - if ( - plus is not None - and plus.get_v1_account_misc_read_val('enableContinues', False) - and allow_continues - ): - session = self.session - - # We only support continuing in non-tournament games. - tournament_id = session.tournament_id - if tournament_id is None: - # We currently only support continuing in sequential - # co-op campaigns. - if isinstance(session, CoopSession): - assert session.campaign is not None - if session.campaign.sequential: - gnode = self.globalsnode - - # Only attempt this if we're not currently paused - # and there appears to be no UI. - assert babase.app.classic is not None - hmmw = babase.app.ui_v1.has_main_menu_window() - if not gnode.paused and not hmmw: - self._is_waiting_for_continue = True - with babase.ContextRef.empty(): - babase.apptimer( - 0.5, - lambda: continues_window( - self, - self._continue_cost, - continue_call=babase.WeakCall( - self._continue_choice, True - ), - cancel_call=babase.WeakCall( - self._continue_choice, False - ), - ), - ) - return - - except Exception: - logging.exception('Error handling continues.') - - self.end_game() - @override def on_begin(self) -> None: super().on_begin() @@ -1277,6 +1131,7 @@ class GameActivity(Activity[PlayerT, TeamT]): def show_zoom_message( self, message: babase.Lstr, + *, color: Sequence[float] = (0.9, 0.4, 0.0), scale: float = 0.8, duration: float = 2.0, diff --git a/dist/ba_data/python/bascenev1/_gameutils.py b/dist/ba_data/python/bascenev1/_gameutils.py index 814e4bb..c67f066 100644 --- a/dist/ba_data/python/bascenev1/_gameutils.py +++ b/dist/ba_data/python/bascenev1/_gameutils.py @@ -4,6 +4,7 @@ from __future__ import annotations +import random from dataclasses import dataclass from typing import TYPE_CHECKING, NewType @@ -111,6 +112,7 @@ def animate_array( attr: str, size: int, keys: dict[float, Sequence[float]], + *, loop: bool = False, offset: float = 0, ) -> None: @@ -243,7 +245,6 @@ def cameraflash(duration: float = 999.0) -> None: Duration is in seconds. """ # pylint: disable=too-many-locals - import random from bascenev1._nodeactor import NodeActor x_spread = 10 diff --git a/dist/ba_data/python/bascenev1/_level.py b/dist/ba_data/python/bascenev1/_level.py index 6da0a7e..ce8ddf5 100644 --- a/dist/ba_data/python/bascenev1/_level.py +++ b/dist/ba_data/python/bascenev1/_level.py @@ -27,6 +27,7 @@ class Level: gametype: type[bascenev1.GameActivity], settings: dict, preview_texture_name: str, + *, displayname: str | None = None, ): self._name = name diff --git a/dist/ba_data/python/bascenev1/_lobby.py b/dist/ba_data/python/bascenev1/_lobby.py index 001aa2d..68a51a6 100644 --- a/dist/ba_data/python/bascenev1/_lobby.py +++ b/dist/ba_data/python/bascenev1/_lobby.py @@ -588,10 +588,11 @@ class Chooser: # Handle '_edit' as a special case. if profilename == '_edit' and ready: with babase.ContextRef.empty(): - classic.profile_browser_window(in_main_menu=False) - # Give their input-device UI ownership too - # (prevent someone else from snatching it in crowded games) + classic.profile_browser_window() + + # Give their input-device UI ownership too (prevent + # someone else from snatching it in crowded games). babase.set_ui_input_device(self._sessionplayer.inputdevice.id) return diff --git a/dist/ba_data/python/bascenev1/_messages.py b/dist/ba_data/python/bascenev1/_messages.py index cecf8db..45f83c8 100644 --- a/dist/ba_data/python/bascenev1/_messages.py +++ b/dist/ba_data/python/bascenev1/_messages.py @@ -241,6 +241,7 @@ class HitMessage: def __init__( self, + *, srcnode: bascenev1.Node | None = None, pos: Sequence[float] | None = None, velocity: Sequence[float] | None = None, diff --git a/dist/ba_data/python/bascenev1/_playlist.py b/dist/ba_data/python/bascenev1/_playlist.py index 013f6e5..c06199d 100644 --- a/dist/ba_data/python/bascenev1/_playlist.py +++ b/dist/ba_data/python/bascenev1/_playlist.py @@ -21,6 +21,7 @@ PlaylistType = list[dict[str, Any]] def filter_playlist( playlist: PlaylistType, sessiontype: type[Session], + *, add_resolved_type: bool = False, remove_unowned: bool = True, mark_unowned: bool = False, diff --git a/dist/ba_data/python/bascenev1/_session.py b/dist/ba_data/python/bascenev1/_session.py index dd75734..85c341f 100644 --- a/dist/ba_data/python/bascenev1/_session.py +++ b/dist/ba_data/python/bascenev1/_session.py @@ -96,6 +96,7 @@ class Session: def __init__( self, depsets: Sequence[bascenev1.DependencySet], + *, team_names: Sequence[str] | None = None, team_colors: Sequence[Sequence[float]] | None = None, min_players: int = 1, diff --git a/dist/ba_data/python/bascenev1/_stats.py b/dist/ba_data/python/bascenev1/_stats.py index 4f3a0db..59e02bf 100644 --- a/dist/ba_data/python/bascenev1/_stats.py +++ b/dist/ba_data/python/bascenev1/_stats.py @@ -196,6 +196,7 @@ class PlayerRecord: scale2: float, sound2: bascenev1.Sound | None, ) -> None: + # pylint: disable=too-many-positional-arguments from bascenev1lib.actor.popuptext import PopupText # Only award this if they're still alive and we can get @@ -341,6 +342,7 @@ class Stats: self, player: bascenev1.Player, base_points: int = 1, + *, target: Sequence[float] | None = None, kill: bool = False, victim_player: bascenev1.Player | None = None, diff --git a/dist/ba_data/python/bascenev1lib/__init__.py b/dist/ba_data/python/bascenev1lib/__init__.py index 4e8f537..b1fa37e 100644 --- a/dist/ba_data/python/bascenev1lib/__init__.py +++ b/dist/ba_data/python/bascenev1lib/__init__.py @@ -2,4 +2,4 @@ # """Library of stuff using the bascenev1 api: games, actors, etc.""" -# ba_meta require api 8 +# ba_meta require api 9 diff --git a/dist/ba_data/python/bascenev1lib/activity/coopscore.py b/dist/ba_data/python/bascenev1lib/activity/coopscore.py index 4b92b69..2eca62a 100644 --- a/dist/ba_data/python/bascenev1lib/activity/coopscore.py +++ b/dist/ba_data/python/bascenev1lib/activity/coopscore.py @@ -9,6 +9,8 @@ import random import logging from typing import TYPE_CHECKING, override +from efro.util import strict_partial +import bacommon.bs from bacommon.login import LoginType import bascenev1 as bs import bauiv1 as bui @@ -19,9 +21,6 @@ from bascenev1lib.actor.zoomtext import ZoomText if TYPE_CHECKING: from typing import Any, Sequence - from bauiv1lib.store.button import StoreButton - from bauiv1lib.league.rankbutton import LeagueRankButton - class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): """Score screen showing the results of a cooperative game.""" @@ -105,10 +104,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): # Ui bits. self._corner_button_offs: tuple[float, float] | None = None - self._league_rank_button: LeagueRankButton | None = None - self._store_button_instance: StoreButton | None = None self._restart_button: bui.Widget | None = None - self._update_corner_button_positions_timer: bui.AppTimer | None = None self._next_level_error: bs.Actor | None = None # Score/gameplay bits. @@ -207,20 +203,12 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ) def _ui_menu(self) -> None: - from bauiv1lib import specialoffer - - if specialoffer.show_offer(): - return bui.containerwidget(edit=self._root_ui, transition='out_left') with self.context: bs.timer(0.1, bs.Call(bs.WeakCall(self.session.end))) def _ui_restart(self) -> None: from bauiv1lib.tournamententry import TournamentEntryWindow - from bauiv1lib import specialoffer - - if specialoffer.show_offer(): - return # If we're in a tournament and it looks like there's no time left, # disallow. @@ -268,10 +256,6 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): self.end({'outcome': 'restart'}) def _ui_next(self) -> None: - from bauiv1lib.specialoffer import show_offer - - if show_offer(): - return # If we didn't just complete this level but are choosing to play the # next one, set it as current (this won't happen otherwise). @@ -331,23 +315,30 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ) def _should_show_worlds_best_button(self) -> bool: + + # Old high score lists webpage for tourneys seems broken + # (looking at meteor shower at least). + if self.session.tournament_id is not None: + return False + # Link is too complicated to display with no browser. return bui.is_browser_likely_available() def request_ui(self) -> None: """Set up a callback to show our UI at the next opportune time.""" - assert bui.app.classic is not None + classic = bui.app.classic + assert classic is not None # We don't want to just show our UI in case the user already has the # main menu up, so instead we add a callback for when the menu # closes; if we're still alive, we'll come up then. # If there's no main menu this gets called immediately. - bui.app.ui_v1.add_main_menu_close_callback(bui.WeakCall(self.show_ui)) + classic.add_main_menu_close_callback(bui.WeakCall(self.show_ui)) def show_ui(self) -> None: """Show the UI for restarting, playing the next Level, etc.""" # pylint: disable=too-many-locals - from bauiv1lib.store.button import StoreButton - from bauiv1lib.league.rankbutton import LeagueRankButton + # pylint: disable=too-many-statements + # pylint: disable=too-many-branches assert bui.app.classic is not None @@ -361,11 +352,14 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): return rootc = self._root_ui = bui.containerwidget( - size=(0, 0), transition='in_right' + size=(0, 0), + transition='in_right', + toolbar_visibility='no_menu_minimal', ) h_offs = 7.0 v_offs = -280.0 + v_offs2 = -236.0 # We wanna prevent controllers users from popping up browsers # or game-center widgets in cases where they can't easily get back @@ -393,7 +387,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): bui.buttonwidget( parent=rootc, color=(0.45, 0.4, 0.5), - position=(160, v_offs + 480), + position=(240, v_offs2 + 439), size=(350, 62), label=( bui.Lstr(resource='tournamentStandingsText') @@ -415,40 +409,85 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): show_next_button = self._is_more_levels and not (env.demo or env.arcade) if not show_next_button: - h_offs += 70 + h_offs += 60 - menu_button = bui.buttonwidget( - parent=rootc, - autoselect=True, - position=(h_offs - 130 - 60, v_offs), - size=(110, 85), - label='', - on_activate_call=bui.WeakCall(self._ui_menu), - ) - bui.imagewidget( - parent=rootc, - draw_controller=menu_button, - position=(h_offs - 130 - 60 + 22, v_offs + 14), - size=(60, 60), - texture=self._menu_icon_texture, - opacity=0.8, - ) - self._restart_button = restart_button = bui.buttonwidget( - parent=rootc, - autoselect=True, - position=(h_offs - 60, v_offs), - size=(110, 85), - label='', - on_activate_call=bui.WeakCall(self._ui_restart), - ) - bui.imagewidget( - parent=rootc, - draw_controller=restart_button, - position=(h_offs - 60 + 19, v_offs + 7), - size=(70, 70), - texture=self._replay_icon_texture, - opacity=0.8, - ) + # Due to virtual-bounds changes, have to squish buttons a bit to + # avoid overlapping with tips at bottom. Could look nicer to + # rework things in the middle to get more space, but would + # rather not touch this old code more than necessary. + small_buttons = False + + if small_buttons: + menu_button = bui.buttonwidget( + parent=rootc, + autoselect=True, + position=(h_offs - 130 - 45, v_offs + 40), + size=(100, 50), + label='', + button_type='square', + on_activate_call=bui.WeakCall(self._ui_menu), + ) + bui.imagewidget( + parent=rootc, + draw_controller=menu_button, + position=(h_offs - 130 - 60 + 43, v_offs + 43), + size=(45, 45), + texture=self._menu_icon_texture, + opacity=0.8, + ) + else: + menu_button = bui.buttonwidget( + parent=rootc, + autoselect=True, + position=(h_offs - 130 - 60, v_offs), + size=(110, 85), + label='', + on_activate_call=bui.WeakCall(self._ui_menu), + ) + bui.imagewidget( + parent=rootc, + draw_controller=menu_button, + position=(h_offs - 130 - 60 + 22, v_offs + 14), + size=(60, 60), + texture=self._menu_icon_texture, + opacity=0.8, + ) + + if small_buttons: + self._restart_button = restart_button = bui.buttonwidget( + parent=rootc, + autoselect=True, + position=(h_offs - 60, v_offs + 40), + size=(100, 50), + label='', + button_type='square', + on_activate_call=bui.WeakCall(self._ui_restart), + ) + bui.imagewidget( + parent=rootc, + draw_controller=restart_button, + position=(h_offs - 60 + 25, v_offs + 42), + size=(47, 47), + texture=self._replay_icon_texture, + opacity=0.8, + ) + else: + self._restart_button = restart_button = bui.buttonwidget( + parent=rootc, + autoselect=True, + position=(h_offs - 60, v_offs), + size=(110, 85), + label='', + on_activate_call=bui.WeakCall(self._ui_restart), + ) + bui.imagewidget( + parent=rootc, + draw_controller=restart_button, + position=(h_offs - 60 + 19, v_offs + 7), + size=(70, 70), + texture=self._replay_icon_texture, + opacity=0.8, + ) next_button: bui.Widget | None = None @@ -465,58 +504,53 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): button_sound = False image_opacity = 0.2 color = (0.3, 0.3, 0.3) - next_button = bui.buttonwidget( - parent=rootc, - autoselect=True, - position=(h_offs + 130 - 60, v_offs), - size=(110, 85), - label='', - on_activate_call=call, - color=color, - enable_sound=button_sound, - ) - bui.imagewidget( - parent=rootc, - draw_controller=next_button, - position=(h_offs + 130 - 60 + 12, v_offs + 5), - size=(80, 80), - texture=self._next_level_icon_texture, - opacity=image_opacity, - ) + + if small_buttons: + next_button = bui.buttonwidget( + parent=rootc, + autoselect=True, + position=(h_offs + 130 - 75, v_offs + 40), + size=(100, 50), + label='', + button_type='square', + on_activate_call=call, + color=color, + enable_sound=button_sound, + ) + bui.imagewidget( + parent=rootc, + draw_controller=next_button, + position=(h_offs + 130 - 60 + 12, v_offs + 40), + size=(50, 50), + texture=self._next_level_icon_texture, + opacity=image_opacity, + ) + else: + next_button = bui.buttonwidget( + parent=rootc, + autoselect=True, + position=(h_offs + 130 - 60, v_offs), + size=(110, 85), + label='', + on_activate_call=call, + color=color, + enable_sound=button_sound, + ) + bui.imagewidget( + parent=rootc, + draw_controller=next_button, + position=(h_offs + 130 - 60 + 12, v_offs + 5), + size=(80, 80), + texture=self._next_level_icon_texture, + opacity=image_opacity, + ) x_offs_extra = 0 if show_next_button else -100 self._corner_button_offs = ( - h_offs + 300.0 + 100.0 + x_offs_extra, - v_offs + 560.0, + h_offs + 300.0 + x_offs_extra, + v_offs + 519.0, ) - if env.demo or env.arcade: - self._league_rank_button = None - self._store_button_instance = None - else: - self._league_rank_button = LeagueRankButton( - parent=rootc, - position=(h_offs + 300 + 100 + x_offs_extra, v_offs + 560), - size=(100, 60), - scale=0.9, - color=(0.4, 0.4, 0.9), - textcolor=(0.9, 0.9, 2.0), - transition_delay=0.0, - smooth_update_delay=5.0, - ) - self._store_button_instance = StoreButton( - parent=rootc, - position=(h_offs + 400 + 100 + x_offs_extra, v_offs + 560), - show_tickets=True, - sale_scale=0.85, - size=(100, 60), - scale=0.9, - button_type='square', - color=(0.35, 0.25, 0.45), - textcolor=(0.9, 0.7, 1.0), - transition_delay=0.0, - ) - bui.containerwidget( edit=rootc, selected_child=( @@ -527,26 +561,12 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): on_cancel_call=menu_button.activate, ) - self._update_corner_button_positions() - self._update_corner_button_positions_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update_corner_button_positions), repeat=True - ) - - def _update_corner_button_positions(self) -> None: - offs = -55 if bui.is_party_icon_visible() else 0 - assert self._corner_button_offs is not None - pos_x = self._corner_button_offs[0] + offs - pos_y = self._corner_button_offs[1] - if self._league_rank_button is not None: - self._league_rank_button.set_position((pos_x, pos_y)) - if self._store_button_instance is not None: - self._store_button_instance.set_position((pos_x + 100, pos_y)) - def _player_press(self) -> None: # (Only for headless builds). - # If this activity is a good 'end point', ask server-mode just once if - # it wants to do anything special like switch sessions or kill the app. + # If this activity is a good 'end point', ask server-mode just + # once if it wants to do anything special like switch sessions + # or kill the app. if ( self._allow_server_transition and bs.app.classic is not None @@ -597,7 +617,6 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): @override def on_begin(self) -> None: - # FIXME: Clean this up. # pylint: disable=too-many-statements # pylint: disable=too-many-branches # pylint: disable=too-many-locals @@ -865,7 +884,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): # If we're not doing the world's-best button, just show a title # instead. ts_height = 300 - ts_h_offs = 210 + ts_h_offs = 290 v_offs = 40 txt = Text( ( @@ -939,7 +958,6 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): if display_scores[i][1] is None: name_str = '-' else: - # noinspection PyUnresolvedReferences name_str = ', '.join( [p['name'] for p in display_scores[i][1]['players']] ) @@ -1008,9 +1026,8 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ts_h_offs = -480 v_offs = 40 - # Only make this if we don't have the button - # (never want clients to see it so no need for client-only - # version, etc). + # Only make this if we don't have the button (never want clients + # to see it so no need for client-only version, etc). if self._have_achievements: if not self._account_has_achievements: Text( @@ -1052,7 +1069,6 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ).autoretain() def _got_friend_score_results(self, results: list[Any] | None) -> None: - # FIXME: tidy this up # pylint: disable=too-many-locals # pylint: disable=too-many-branches # pylint: disable=too-many-statements @@ -1187,35 +1203,77 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): transition_delay=tdelay2, ).autoretain() + def _on_v2_score_results( + self, response: bacommon.bs.ScoreSubmitResponse | Exception + ) -> None: + + if isinstance(response, Exception): + logging.debug('Got error score-submit response: %s', response) + return + + assert isinstance(response, bacommon.bs.ScoreSubmitResponse) + + # Aim to have these effects run shortly after the final rating + # hit happens. + with self.context: + assert self._begin_time is not None + delay = max(0, 5.5 - (bs.time() - self._begin_time)) + + assert bui.app.classic is not None + bs.timer( + delay, + strict_partial( + bui.app.classic.run_bs_client_effects, response.effects + ), + ) + def _got_score_results(self, results: dict[str, Any] | None) -> None: - # FIXME: tidy this up # pylint: disable=too-many-locals # pylint: disable=too-many-branches # pylint: disable=too-many-statements plus = bs.app.plus assert plus is not None + classic = bs.app.classic + assert classic is not None # We need to manually run this in the context of our activity # and only if we aren't shutting down. # (really should make the submit_score call handle that stuff itself) if self.expired: return + with self.context: # Delay a bit if results come in too fast. assert self._begin_time is not None base_delay = max(0, 2.7 - (bs.time() - self._begin_time)) - v_offs = 20 + # v_offs = 20 + v_offs = 64 if results is None: self._score_loading_status = Text( bs.Lstr(resource='worldScoresUnavailableText'), - position=(230, 150 + v_offs), + position=(280, 130 + v_offs), color=(1, 1, 1, 0.4), transition=Text.Transition.FADE_IN, transition_delay=base_delay + 0.3, scale=0.7, ) else: + + # If there's a score-uuid bundled, ship it along to the + # v2 master server to ask about any rewards from that + # end. + score_token = results.get('token') + if ( + isinstance(score_token, str) + and plus.accounts.primary is not None + ): + with plus.accounts.primary: + plus.cloud.send_message_cb( + bacommon.bs.ScoreSubmitMessage(score_token), + on_response=bui.WeakCall(self._on_v2_score_results), + ) + self._score_link = results['link'] assert self._score_link is not None # Prepend our master-server addr if its a relative addr. @@ -1254,7 +1312,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): (1.5 + base_delay), bs.WeakCall(self._show_world_rank, offs_x), ) - ts_h_offs = 200 + ts_h_offs = 280 ts_height = 300 # Show world tops. @@ -1274,7 +1332,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ), position=( ts_h_offs - 35 + 95, - ts_height / 2 + 6 + v_offs, + ts_height / 2 + 6 + v_offs - 41, ), color=(0.4, 0.4, 0.4, 1.0), scale=0.7, @@ -1282,7 +1340,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): transition_delay=base_delay + 0.3, ).autoretain() else: - v_offs += 20 + v_offs += 40 h_offs_extra = 0 v_offs_names = 0 @@ -1309,6 +1367,37 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): random.randrange(0, len(times) + 1), (base_delay + i * 0.05, base_delay + 0.4 + i * 0.05), ) + + # Conundrum: We want to place line numbers to the + # left of our score column based on the largest + # score width. However scores may use Lstrs and thus + # may have different widths in different languages. + # We don't want to bake down the Lstrs we display + # because then clients can't view scores in their + # own language. So as a compromise lets measure + # max-width based on baked down Lstrs but then + # display regular Lstrs with max-width set based on + # that. Hopefully that'll look reasonable for most + # languages. + max_score_width = 10.0 + for tval in self._show_info['tops']: + score = int(tval[0]) + name_str = tval[1] + if name_str != '-': + max_score_width = max( + max_score_width, + bui.get_string_width( + ( + str(score) + if self._score_type == 'points' + else bs.timestring( + (score * 10) / 1000.0 + ).evaluate() + ), + suppress_warning=True, + ), + ) + for i, tval in enumerate(self._show_info['tops']): score = int(tval[0]) name_str = tval[1] @@ -1330,19 +1419,45 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): tdelay2 = times[i][1] if name_str != '-': + sstr = ( + str(score) + if self._score_type == 'points' + else bs.timestring((score * 10) / 1000.0) + ) + + # Line number. Text( - ( - str(score) - if self._score_type == 'points' - else bs.timestring((score * 10) / 1000.0) + str(i + 1), + position=( + ts_h_offs + + 20 + + h_offs_extra + - max_score_width + - 8.0, + ts_height / 2 + + -ts_height * (i + 1) / 10 + + v_offs + - 30.0, ), + scale=0.5, + h_align=Text.HAlign.RIGHT, + v_align=Text.VAlign.CENTER, + color=(0.3, 0.3, 0.3), + transition=Text.Transition.IN_LEFT, + transition_delay=tdelay1, + ).autoretain() + + # Score. + Text( + sstr, position=( ts_h_offs + 20 + h_offs_extra, ts_height / 2 + -ts_height * (i + 1) / 10 + v_offs - + 11.0, + - 30.0, ), + maxwidth=max_score_width, h_align=Text.HAlign.RIGHT, v_align=Text.VAlign.CENTER, color=color0, @@ -1350,6 +1465,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): transition=Text.Transition.IN_LEFT, transition_delay=tdelay1, ).autoretain() + # Player name. Text( bs.Lstr(value=name_str), position=( @@ -1358,7 +1474,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): + -ts_height * (i + 1) / 10 + v_offs_names + v_offs - + 11.0, + - 30.0, ), maxwidth=80.0 + 100.0 * len(self._playerinfos), v_align=Text.VAlign.CENTER, @@ -1453,16 +1569,12 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ] # pylint: disable=useless-suppression # pylint: disable=unbalanced-tuple-unpacking - ( - pr1, - pv1, - pr2, - pv2, - pr3, - pv3, - ) = bs.app.classic.get_tournament_prize_strings( - tourney_info + (pr1, pv1, pr2, pv2, pr3, pv3) = ( + bs.app.classic.get_tournament_prize_strings( + tourney_info, include_tickets=False + ) ) + # pylint: enable=unbalanced-tuple-unpacking # pylint: enable=useless-suppression @@ -1478,10 +1590,14 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): transition_delay=2.0, ).autoretain() vval = -107 + 70 - for rng, val in ((pr1, pv1), (pr2, pv2), (pr3, pv3)): + for i, rng, val in ( + (0, pr1, pv1), + (1, pr2, pv2), + (2, pr3, pv3), + ): Text( rng, - position=(-410 + 10, vval), + position=(-430 + 10, vval), color=(1, 1, 1, 0.7), h_align=Text.HAlign.RIGHT, v_align=Text.VAlign.CENTER, @@ -1492,7 +1608,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ).autoretain() Text( val, - position=(-390 + 10, vval), + position=(-410 + 10, vval), color=(0.7, 0.7, 0.7, 1.0), h_align=Text.HAlign.LEFT, v_align=Text.VAlign.CENTER, @@ -1501,6 +1617,9 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): maxwidth=300, transition_delay=2.0, ).autoretain() + bs.app.classic.create_in_game_tournament_prize_image( + tourney_info, i, (-410 + 70, vval) + ) vval -= 35 except Exception: logging.exception('Error showing prize ranges.') @@ -1573,6 +1692,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): transition_delay=1.0, ).autoretain() else: + assert rating is not None ZoomText( ( f'{rating:.1f}' diff --git a/dist/ba_data/python/bascenev1lib/activity/dualteamscore.py b/dist/ba_data/python/bascenev1lib/activity/dualteamscore.py index dc01ac5..6929a10 100644 --- a/dist/ba_data/python/bascenev1lib/activity/dualteamscore.py +++ b/dist/ba_data/python/bascenev1lib/activity/dualteamscore.py @@ -145,6 +145,7 @@ class TeamVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): kill_delay: float, shiftdelay: float, ) -> None: + # pylint: disable=too-many-positional-arguments del kill_delay # Unused arg. ZoomText( str(sessionteam.customdata['score']), diff --git a/dist/ba_data/python/bascenev1lib/activity/freeforallvictory.py b/dist/ba_data/python/bascenev1lib/activity/freeforallvictory.py index 5f2189f..3f88e3b 100644 --- a/dist/ba_data/python/bascenev1lib/activity/freeforallvictory.py +++ b/dist/ba_data/python/bascenev1lib/activity/freeforallvictory.py @@ -87,6 +87,7 @@ class FreeForAllVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): extrascale: float, flash: bool = False, ) -> Text: + # pylint: disable=too-many-positional-arguments return Text( text, position=( diff --git a/dist/ba_data/python/bascenev1lib/activity/multiteamscore.py b/dist/ba_data/python/bascenev1lib/activity/multiteamscore.py index 9feb385..b398f7d 100644 --- a/dist/ba_data/python/bascenev1lib/activity/multiteamscore.py +++ b/dist/ba_data/python/bascenev1lib/activity/multiteamscore.py @@ -57,6 +57,7 @@ class MultiTeamScoreScreenActivity(bs.ScoreScreenActivity): def show_player_scores( self, + *, delay: float = 2.5, results: bs.GameResults | None = None, scale: float = 1.0, @@ -134,6 +135,7 @@ class MultiTeamScoreScreenActivity(bs.ScoreScreenActivity): xoffs: float, yoffs: float, text: bs.Lstr, + *, h_align: Text.HAlign = Text.HAlign.RIGHT, extrascale: float = 1.0, maxwidth: float | None = 120.0, diff --git a/dist/ba_data/python/bascenev1lib/activity/multiteamvictory.py b/dist/ba_data/python/bascenev1lib/activity/multiteamvictory.py index a8ecc28..058ffd4 100644 --- a/dist/ba_data/python/bascenev1lib/activity/multiteamvictory.py +++ b/dist/ba_data/python/bascenev1lib/activity/multiteamvictory.py @@ -4,12 +4,15 @@ from __future__ import annotations -from typing import override +from typing import override, TYPE_CHECKING import bascenev1 as bs from bascenev1lib.activity.multiteamscore import MultiTeamScoreScreenActivity +if TYPE_CHECKING: + from typing import Any + class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): """Final score screen for a team series.""" @@ -24,6 +27,8 @@ class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): self._allow_server_transition = True self._tips_text = None self._default_show_tips = False + self._ffa_top_player_info: list[Any] | None = None + self._ffa_top_player_rec: bs.PlayerRecord | None = None @override def on_begin(self) -> None: @@ -70,6 +75,16 @@ class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): ) ) player_entries.sort(reverse=True, key=lambda x: x[0]) + if len(player_entries) > 0: + # Store some info for the top ffa player so we can + # show winner info even if they leave. + self._ffa_top_player_info = list(player_entries[0]) + self._ffa_top_player_info[1] = self._ffa_top_player_info[ + 2 + ].getname() + self._ffa_top_player_info[2] = self._ffa_top_player_info[ + 2 + ].get_icon() else: for _pkey, prec in self.stats.get_records().items(): player_entries.append((prec.score, prec.name_full, prec)) @@ -308,7 +323,7 @@ class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): most_killed = entry[2].killed_count if mkp is not None: Text( - bs.Lstr(resource='mostViolatedPlayerText'), + bs.Lstr(resource='mostDestroyedPlayerText'), color=(0.5, 0.5, 0.5, 1.0), v_align=Text.VAlign.CENTER, maxwidth=300, @@ -433,25 +448,42 @@ class TeamSeriesVictoryScoreScreenActivity(MultiTeamScoreScreenActivity): maxwidth=250, ).autoretain() else: - offs_v = -80.0 + offs_v = -80 + assert isinstance(self.session, bs.MultiTeamSession) + series_length = self.session.get_ffa_series_length() + icon: dict | None + # Pull live player info if they're still around. if len(team.players) == 1: + icon = team.players[0].get_icon() + player_name = team.players[0].getname(full=True, icon=False) + # Otherwise use the special info we stored when we came in. + elif ( + self._ffa_top_player_info is not None + and self._ffa_top_player_info[0] >= series_length + ): + icon = self._ffa_top_player_info[2] + player_name = self._ffa_top_player_info[1] + else: + icon = None + player_name = 'Player Not Found' + + if icon is not None: i = Image( - team.players[0].get_icon(), + icon, position=(0, 143), scale=(100, 100), ).autoretain() assert i.node bs.animate(i.node, 'opacity', {0.0: 0.0, 0.25: 1.0}) - ZoomText( - bs.Lstr( - value=team.players[0].getname(full=True, icon=False) - ), - position=(0, 97 + offs_v), - color=team.color, - scale=1.15, - jitter=1.0, - maxwidth=250, - ).autoretain() + + ZoomText( + bs.Lstr(value=player_name), + position=(0, 97 + offs_v + (0 if icon is not None else 60)), + color=team.color, + scale=1.15, + jitter=1.0, + maxwidth=250, + ).autoretain() s_extra = 1.0 if self._is_ffa else 1.0 diff --git a/dist/ba_data/python/bascenev1lib/actor/bomb.py b/dist/ba_data/python/bascenev1lib/actor/bomb.py index c73eceb..126f0f2 100644 --- a/dist/ba_data/python/bascenev1lib/actor/bomb.py +++ b/dist/ba_data/python/bascenev1lib/actor/bomb.py @@ -333,6 +333,7 @@ class Blast(bs.Actor): def __init__( self, + *, position: Sequence[float] = (0.0, 1.0, 0.0), velocity: Sequence[float] = (0.0, 0.0, 0.0), blast_radius: float = 2.0, @@ -715,6 +716,7 @@ class Bomb(bs.Actor): def __init__( self, + *, position: Sequence[float] = (0.0, 1.0, 0.0), velocity: Sequence[float] = (0.0, 0.0, 0.0), bomb_type: str = 'normal', diff --git a/dist/ba_data/python/bascenev1lib/actor/controlsguide.py b/dist/ba_data/python/bascenev1lib/actor/controlsguide.py index a750dfd..40b3f18 100644 --- a/dist/ba_data/python/bascenev1lib/actor/controlsguide.py +++ b/dist/ba_data/python/bascenev1lib/actor/controlsguide.py @@ -24,6 +24,7 @@ class ControlsGuide(bs.Actor): def __init__( self, + *, position: tuple[float, float] = (390.0, 120.0), scale: float = 1.0, delay: float = 0.0, diff --git a/dist/ba_data/python/bascenev1lib/actor/flag.py b/dist/ba_data/python/bascenev1lib/actor/flag.py index 0347203..2e5120f 100644 --- a/dist/ba_data/python/bascenev1lib/actor/flag.py +++ b/dist/ba_data/python/bascenev1lib/actor/flag.py @@ -144,6 +144,9 @@ class FlagDiedMessage: flag: Flag """The `Flag` that died.""" + self_kill: bool = False + """If the `Flag` killed itself or not.""" + @dataclass class FlagDroppedMessage: @@ -169,6 +172,7 @@ class Flag(bs.Actor): def __init__( self, + *, position: Sequence[float] = (0.0, 1.0, 0.0), color: Sequence[float] = (1.0, 1.0, 1.0), materials: Sequence[bs.Material] | None = None, @@ -282,7 +286,9 @@ class Flag(bs.Actor): ) self._counter.text = str(self._count) if self._count < 1: - self.handlemessage(bs.DieMessage()) + self.handlemessage( + bs.DieMessage(how=bs.DeathType.LEFT_GAME) + ) else: assert self._counter self._counter.text = '' @@ -336,7 +342,11 @@ class Flag(bs.Actor): if self.node: self.node.delete() if not msg.immediate: - self.activity.handlemessage(FlagDiedMessage(self)) + self.activity.handlemessage( + FlagDiedMessage( + self, (msg.how is bs.DeathType.LEFT_GAME) + ) + ) elif isinstance(msg, bs.HitMessage): assert self.node assert msg.force_direction is not None diff --git a/dist/ba_data/python/bascenev1lib/actor/image.py b/dist/ba_data/python/bascenev1lib/actor/image.py index daa648b..4e38f6b 100644 --- a/dist/ba_data/python/bascenev1lib/actor/image.py +++ b/dist/ba_data/python/bascenev1lib/actor/image.py @@ -37,6 +37,7 @@ class Image(bs.Actor): def __init__( self, texture: bs.Texture | dict[str, Any], + *, position: tuple[float, float] = (0, 0), transition: Transition | None = None, transition_delay: float = 0.0, @@ -55,15 +56,21 @@ class Image(bs.Actor): # pylint: disable=too-many-locals super().__init__() - # If they provided a dict as texture, assume its an icon. - # otherwise its just a texture value itself. + # If they provided a dict as texture, use it to wire up extended + # stuff like tints and masks. mask_texture: bs.Texture | None if isinstance(texture, dict): tint_color = texture['tint_color'] tint2_color = texture['tint2_color'] tint_texture = texture['tint_texture'] + + # Assume we're dealing with a character icon but allow + # overriding. + mask_tex_name = texture.get('mask_texture', 'characterIconMask') + mask_texture = ( + None if mask_tex_name is None else bs.gettexture(mask_tex_name) + ) texture = texture['texture'] - mask_texture = bs.gettexture('characterIconMask') else: tint_color = (1, 1, 1) tint2_color = None diff --git a/dist/ba_data/python/bascenev1lib/actor/playerspaz.py b/dist/ba_data/python/bascenev1lib/actor/playerspaz.py index 07caae5..1aa7ed5 100644 --- a/dist/ba_data/python/bascenev1lib/actor/playerspaz.py +++ b/dist/ba_data/python/bascenev1lib/actor/playerspaz.py @@ -46,6 +46,7 @@ class PlayerSpaz(Spaz): def __init__( self, player: bs.Player, + *, color: Sequence[float] = (1.0, 1.0, 1.0), highlight: Sequence[float] = (0.5, 0.5, 0.5), character: str = 'Spaz', @@ -102,6 +103,7 @@ class PlayerSpaz(Spaz): def connect_controls_to_player( self, + *, enable_jump: bool = True, enable_punch: bool = True, enable_pickup: bool = True, diff --git a/dist/ba_data/python/bascenev1lib/actor/popuptext.py b/dist/ba_data/python/bascenev1lib/actor/popuptext.py index ca375fc..9c0d09c 100644 --- a/dist/ba_data/python/bascenev1lib/actor/popuptext.py +++ b/dist/ba_data/python/bascenev1lib/actor/popuptext.py @@ -22,6 +22,7 @@ class PopupText(bs.Actor): def __init__( self, text: str | bs.Lstr, + *, position: Sequence[float] = (0.0, 0.0, 0.0), color: Sequence[float] = (1.0, 1.0, 1.0, 1.0), random_offset: float = 0.5, diff --git a/dist/ba_data/python/bascenev1lib/actor/scoreboard.py b/dist/ba_data/python/bascenev1lib/actor/scoreboard.py index 05a1ba5..18ba89d 100644 --- a/dist/ba_data/python/bascenev1lib/actor/scoreboard.py +++ b/dist/ba_data/python/bascenev1lib/actor/scoreboard.py @@ -22,14 +22,18 @@ class _Entry: scale: float, label: bs.Lstr | None, flash_length: float, + width: float | None = None, + height: float | None = None, ): + # pylint: disable=too-many-locals # pylint: disable=too-many-statements + # pylint: disable=too-many-positional-arguments self._scoreboard = weakref.ref(scoreboard) self._do_cover = do_cover self._scale = scale self._flash_length = flash_length - self._width = 140.0 * self._scale - self._height = 32.0 * self._scale + self._width = (140.0 if width is None else width) * self._scale + self._height = (32.0 if height is None else height) * self._scale self._bar_width = 2.0 * self._scale self._bar_height = 32.0 * self._scale self._bar_tex = self._backing_tex = bs.gettexture('bar') @@ -277,6 +281,7 @@ class _Entry: def set_value( self, score: float, + *, max_score: float | None = None, countdown: bool = False, flash: bool = True, @@ -368,16 +373,26 @@ class Scoreboard: _ENTRYSTORENAME = bs.storagename('entry') - def __init__(self, label: bs.Lstr | None = None, score_split: float = 0.7): + def __init__( + self, + label: bs.Lstr | None = None, + score_split: float = 0.7, + pos: Sequence[float] | None = None, + width: float | None = None, + height: float | None = None, + ): """Instantiate a scoreboard. Label can be something like 'points' and will show up on boards if provided. """ + # pylint: disable=too-many-positional-arguments self._flat_tex = bs.gettexture('null') self._entries: dict[int, _Entry] = {} self._label = label self.score_split = score_split + self._width = width + self._height = height # For free-for-all we go simpler since we have one per player. self._pos: Sequence[float] @@ -393,12 +408,14 @@ class Scoreboard: self._pos = (20.0, -70.0) self._scale = 1.0 self._flash_length = 1.0 + self._pos = self._pos if pos is None else pos def set_team_value( self, team: bs.Team, score: float, max_score: float | None = None, + *, countdown: bool = False, flash: bool = True, show_value: bool = True, @@ -430,6 +447,8 @@ class Scoreboard: do_cover=self._do_cover, scale=self._scale, label=self._label, + width=self._width, + height=self._height, flash_length=self._flash_length, ) self._update_teams() diff --git a/dist/ba_data/python/bascenev1lib/actor/spawner.py b/dist/ba_data/python/bascenev1lib/actor/spawner.py index 78fa56c..95cc283 100644 --- a/dist/ba_data/python/bascenev1lib/actor/spawner.py +++ b/dist/ba_data/python/bascenev1lib/actor/spawner.py @@ -50,6 +50,7 @@ class Spawner: def __init__( self, + *, data: Any = None, pt: Sequence[float] = (0, 0, 0), spawn_time: float = 1.0, diff --git a/dist/ba_data/python/bascenev1lib/actor/spaz.py b/dist/ba_data/python/bascenev1lib/actor/spaz.py index f70383f..e1e0040 100644 --- a/dist/ba_data/python/bascenev1lib/actor/spaz.py +++ b/dist/ba_data/python/bascenev1lib/actor/spaz.py @@ -71,6 +71,7 @@ class Spaz(bs.Actor): def __init__( self, + *, color: Sequence[float] = (1.0, 1.0, 1.0), highlight: Sequence[float] = (0.5, 0.5, 0.5), character: str = 'Spaz', @@ -1195,11 +1196,12 @@ class Spaz(bs.Actor): if self.node: self.node.delete() elif self.node: - self.node.hurt = 1.0 - if self.play_big_death_sound and not wasdead: - SpazFactory.get().single_player_death_sound.play() - self.node.dead = True - bs.timer(2.0, self.node.delete) + if not wasdead: + self.node.hurt = 1.0 + if self.play_big_death_sound: + SpazFactory.get().single_player_death_sound.play() + self.node.dead = True + bs.timer(2.0, self.node.delete) elif isinstance(msg, bs.OutOfBoundsMessage): # By default we just die here. diff --git a/dist/ba_data/python/bascenev1lib/actor/spazappearance.py b/dist/ba_data/python/bascenev1lib/actor/spazappearance.py index 7cff495..a2122d8 100644 --- a/dist/ba_data/python/bascenev1lib/actor/spazappearance.py +++ b/dist/ba_data/python/bascenev1lib/actor/spazappearance.py @@ -14,7 +14,7 @@ def get_appearances(include_locked: bool = False) -> list[str]: assert plus is not None assert bs.app.classic is not None - get_purchased = plus.get_purchased + get_purchased = plus.get_v1_account_product_purchased disallowed = [] if not include_locked: # Hmm yeah this'll be tough to hack... diff --git a/dist/ba_data/python/bascenev1lib/actor/spazbot.py b/dist/ba_data/python/bascenev1lib/actor/spazbot.py index 56118af..86d1620 100644 --- a/dist/ba_data/python/bascenev1lib/actor/spazbot.py +++ b/dist/ba_data/python/bascenev1lib/actor/spazbot.py @@ -947,9 +947,9 @@ class SpazBotSet: on_spawn_call: Callable[[SpazBot], Any] | None = None, ) -> None: """Spawn a bot from this set.""" - from bascenev1lib.actor import spawner + from bascenev1lib.actor.spawner import Spawner - spawner.Spawner( + Spawner( pt=pos, spawn_time=spawn_time, send_spawn_message=False, diff --git a/dist/ba_data/python/bascenev1lib/actor/text.py b/dist/ba_data/python/bascenev1lib/actor/text.py index cdea37d..42611e8 100644 --- a/dist/ba_data/python/bascenev1lib/actor/text.py +++ b/dist/ba_data/python/bascenev1lib/actor/text.py @@ -56,6 +56,7 @@ class Text(bs.Actor): def __init__( self, text: str | bs.Lstr, + *, position: tuple[float, float] = (0.0, 0.0), h_align: HAlign = HAlign.LEFT, v_align: VAlign = VAlign.NONE, diff --git a/dist/ba_data/python/bascenev1lib/actor/zoomtext.py b/dist/ba_data/python/bascenev1lib/actor/zoomtext.py index 46525aa..573c600 100644 --- a/dist/ba_data/python/bascenev1lib/actor/zoomtext.py +++ b/dist/ba_data/python/bascenev1lib/actor/zoomtext.py @@ -26,6 +26,7 @@ class ZoomText(bs.Actor): self, text: str | bs.Lstr, position: tuple[float, float] = (0.0, 0.0), + *, shiftposition: tuple[float, float] | None = None, shiftdelay: float | None = None, lifespan: float | None = None, diff --git a/dist/ba_data/python/bascenev1lib/game/assault.py b/dist/ba_data/python/bascenev1lib/game/assault.py index 051cb7f..4f8fb25 100644 --- a/dist/ba_data/python/bascenev1lib/game/assault.py +++ b/dist/ba_data/python/bascenev1lib/game/assault.py @@ -2,7 +2,7 @@ # """Defines assault minigame.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/capturetheflag.py b/dist/ba_data/python/bascenev1lib/game/capturetheflag.py index a5e65ed..de2ea8a 100644 --- a/dist/ba_data/python/bascenev1lib/game/capturetheflag.py +++ b/dist/ba_data/python/bascenev1lib/game/capturetheflag.py @@ -2,7 +2,7 @@ # """Defines a capture-the-flag game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations @@ -32,6 +32,7 @@ class CTFFlag(Flag): activity: CaptureTheFlagGame def __init__(self, team: Team): + assert team.flagmaterial is not None super().__init__( materials=[team.flagmaterial], @@ -73,6 +74,7 @@ class Team(bs.Team[Player]): def __init__( self, + *, base_pos: Sequence[float], base_region_material: bs.Material, base_region: bs.Node, diff --git a/dist/ba_data/python/bascenev1lib/game/chosenone.py b/dist/ba_data/python/bascenev1lib/game/chosenone.py index 1716010..1617f87 100644 --- a/dist/ba_data/python/bascenev1lib/game/chosenone.py +++ b/dist/ba_data/python/bascenev1lib/game/chosenone.py @@ -2,7 +2,7 @@ # """Provides the chosen-one mini-game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/conquest.py b/dist/ba_data/python/bascenev1lib/game/conquest.py index 7c14011..0002fab 100644 --- a/dist/ba_data/python/bascenev1lib/game/conquest.py +++ b/dist/ba_data/python/bascenev1lib/game/conquest.py @@ -2,7 +2,7 @@ # """Provides the Conquest game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/deathmatch.py b/dist/ba_data/python/bascenev1lib/game/deathmatch.py index 85ff142..ee331ed 100644 --- a/dist/ba_data/python/bascenev1lib/game/deathmatch.py +++ b/dist/ba_data/python/bascenev1lib/game/deathmatch.py @@ -2,7 +2,7 @@ # """DeathMatch game and support classes.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/easteregghunt.py b/dist/ba_data/python/bascenev1lib/game/easteregghunt.py index 260628a..50a1f00 100644 --- a/dist/ba_data/python/bascenev1lib/game/easteregghunt.py +++ b/dist/ba_data/python/bascenev1lib/game/easteregghunt.py @@ -2,7 +2,7 @@ # """Provides an easter egg hunt game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/elimination.py b/dist/ba_data/python/bascenev1lib/game/elimination.py index c0434fb..ef8627a 100644 --- a/dist/ba_data/python/bascenev1lib/game/elimination.py +++ b/dist/ba_data/python/bascenev1lib/game/elimination.py @@ -2,7 +2,7 @@ # """Elimination mini-game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations @@ -27,6 +27,7 @@ class Icon(bs.Actor): player: Player, position: tuple[float, float], scale: float, + *, show_lives: bool = True, show_death: bool = True, name_scale: float = 1.0, diff --git a/dist/ba_data/python/bascenev1lib/game/football.py b/dist/ba_data/python/bascenev1lib/game/football.py index 3555794..0fd603f 100644 --- a/dist/ba_data/python/bascenev1lib/game/football.py +++ b/dist/ba_data/python/bascenev1lib/game/football.py @@ -1,9 +1,8 @@ # Released under the MIT License. See LICENSE for details. # -# pylint: disable=too-many-lines """Implements football games (both co-op and teams varieties).""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations @@ -332,7 +331,10 @@ class FootballTeamGame(bs.TeamGameActivity[Player, Team]): # Respawn dead flags. elif isinstance(msg, FlagDiedMessage): if not self.has_ended(): - self._flag_respawn_timer = bs.Timer(3.0, self._spawn_flag) + if msg.self_kill: + self._spawn_flag() + else: + self._flag_respawn_timer = bs.Timer(3.0, self._spawn_flag) self._flag_respawn_light = bs.NodeActor( bs.newnode( 'light', @@ -655,11 +657,6 @@ class FootballCoopGame(bs.CoopGameActivity[Player, Team]): for bot in bots: bot.target_flag = None - # If we're waiting on a continue, stop here so they don't keep scoring. - if self.is_waiting_for_continue(): - self._bots.stop_moving() - return - # If we've got a flag and no player are holding it, find the closest # bot to it, and make them the designated flag-bearer. assert self._flag is not None @@ -816,14 +813,6 @@ class FootballCoopGame(bs.CoopGameActivity[Player, Team]): self._bots.final_celebrate() bs.timer(0.001, bs.Call(self.do_end, 'defeat')) - @override - def on_continue(self) -> None: - # Subtract one touchdown from the bots and get them moving again. - assert self._bot_team is not None - self._bot_team.score -= 7 - self._bots.start_moving() - self.update_scores() - def update_scores(self) -> None: """update scoreboard and check for winners""" # FIXME: tidy this up @@ -838,7 +827,7 @@ class FootballCoopGame(bs.CoopGameActivity[Player, Team]): if not have_scoring_team: self._scoring_team = team if team is self._bot_team: - self.continue_or_end_game() + self.end_game() else: bs.setmusic(bs.MusicType.VICTORY) @@ -893,8 +882,7 @@ class FootballCoopGame(bs.CoopGameActivity[Player, Team]): ) self._time_text_input.node.timemax = self._final_time_ms - # FIXME: Does this still need to be deferred? - bs.pushcall(bs.Call(self.do_end, 'victory')) + self.do_end('victory') def do_end(self, outcome: str) -> None: """End the game with the specified outcome.""" @@ -945,7 +933,10 @@ class FootballCoopGame(bs.CoopGameActivity[Player, Team]): # Respawn dead flags. elif isinstance(msg, FlagDiedMessage): assert isinstance(msg.flag, FootballFlag) - msg.flag.respawn_timer = bs.Timer(3.0, self._spawn_flag) + if msg.self_kill: + self._spawn_flag() + else: + msg.flag.respawn_timer = bs.Timer(3.0, self._spawn_flag) self._flag_respawn_light = bs.NodeActor( bs.newnode( 'light', @@ -962,7 +953,7 @@ class FootballCoopGame(bs.CoopGameActivity[Player, Team]): self._flag_respawn_light.node, 'intensity', {0: 0, 0.25: 0.15, 0.5: 0}, - loop=True, + loop=(not msg.self_kill), ) bs.timer(3.0, self._flag_respawn_light.node.delete) else: diff --git a/dist/ba_data/python/bascenev1lib/game/hockey.py b/dist/ba_data/python/bascenev1lib/game/hockey.py index c8b8449..63b4cef 100644 --- a/dist/ba_data/python/bascenev1lib/game/hockey.py +++ b/dist/ba_data/python/bascenev1lib/game/hockey.py @@ -2,7 +2,7 @@ # """Hockey game and support classes.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/keepaway.py b/dist/ba_data/python/bascenev1lib/game/keepaway.py index 874b03e..555e262 100644 --- a/dist/ba_data/python/bascenev1lib/game/keepaway.py +++ b/dist/ba_data/python/bascenev1lib/game/keepaway.py @@ -2,7 +2,7 @@ # """Defines a keep-away game type.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/kingofthehill.py b/dist/ba_data/python/bascenev1lib/game/kingofthehill.py index 24244f2..083e1b1 100644 --- a/dist/ba_data/python/bascenev1lib/game/kingofthehill.py +++ b/dist/ba_data/python/bascenev1lib/game/kingofthehill.py @@ -2,7 +2,7 @@ # """Defines the King of the Hill game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/meteorshower.py b/dist/ba_data/python/bascenev1lib/game/meteorshower.py index 7596632..f2a01ec 100644 --- a/dist/ba_data/python/bascenev1lib/game/meteorshower.py +++ b/dist/ba_data/python/bascenev1lib/game/meteorshower.py @@ -2,7 +2,7 @@ # """Defines a bomb-dodging mini-game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/ninjafight.py b/dist/ba_data/python/bascenev1lib/game/ninjafight.py index 67658cf..28a0e4d 100644 --- a/dist/ba_data/python/bascenev1lib/game/ninjafight.py +++ b/dist/ba_data/python/bascenev1lib/game/ninjafight.py @@ -2,7 +2,7 @@ # """Provides Ninja Fight mini-game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/game/onslaught.py b/dist/ba_data/python/bascenev1lib/game/onslaught.py index 6933a0c..f8d2182 100644 --- a/dist/ba_data/python/bascenev1lib/game/onslaught.py +++ b/dist/ba_data/python/bascenev1lib/game/onslaught.py @@ -5,7 +5,7 @@ # Yes this is a long one.. # pylint: disable=too-many-lines -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations @@ -805,6 +805,7 @@ class OnslaughtGame(bs.CoopGameActivity[Player, Team]): max_level: int, ) -> list[list[tuple[int, int]]]: """Calculate a distribution of bad guys given some params.""" + # pylint: disable=too-many-positional-arguments max_iterations = 10 + max_dudes * 2 groups: list[list[tuple[int, int]]] = [] @@ -1194,7 +1195,7 @@ class OnslaughtGame(bs.CoopGameActivity[Player, Team]): def _respawn_players_for_wave(self) -> None: # Respawn applicable players. - if self._wavenum > 1 and not self.is_waiting_for_continue(): + if self._wavenum > 1: for player in self.players: if ( not player.is_alive() @@ -1641,19 +1642,9 @@ class OnslaughtGame(bs.CoopGameActivity[Player, Team]): self.do_end('defeat', delay=2.0) bs.setmusic(None) - @override - def on_continue(self) -> None: - for player in self.players: - if not player.is_alive(): - self.spawn_player(player) - def _checkroundover(self) -> None: """Potentially end the round based on the state of the game.""" if self.has_ended(): return if not any(player.is_alive() for player in self.teams[0].players): - # Allow continuing after wave 1. - if self._wavenum > 1: - self.continue_or_end_game() - else: - self.end_game() + self.end_game() diff --git a/dist/ba_data/python/bascenev1lib/game/race.py b/dist/ba_data/python/bascenev1lib/game/race.py index c555616..766afa7 100644 --- a/dist/ba_data/python/bascenev1lib/game/race.py +++ b/dist/ba_data/python/bascenev1lib/game/race.py @@ -2,7 +2,7 @@ # """Defines Race mini-game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations @@ -138,7 +138,9 @@ class RaceGame(bs.TeamGameActivity[Player, Team]): @override @classmethod def supports_session_type(cls, sessiontype: type[bs.Session]) -> bool: - return issubclass(sessiontype, bs.MultiTeamSession) + return issubclass(sessiontype, bs.MultiTeamSession) or issubclass( + sessiontype, bs.CoopSession + ) @override @classmethod diff --git a/dist/ba_data/python/bascenev1lib/game/runaround.py b/dist/ba_data/python/bascenev1lib/game/runaround.py index 8d0b993..5cdf850 100644 --- a/dist/ba_data/python/bascenev1lib/game/runaround.py +++ b/dist/ba_data/python/bascenev1lib/game/runaround.py @@ -5,7 +5,7 @@ # We wear the cone of shame. # pylint: disable=too-many-lines -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations @@ -487,9 +487,9 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): assert bs.app.classic is not None uiscale = bs.app.ui_v1.uiscale l_offs = ( - -80 + -120 if uiscale is bs.UIScale.SMALL - else -40 if uiscale is bs.UIScale.MEDIUM else 0 + else -60 if uiscale is bs.UIScale.MEDIUM else -30 ) self._lives_bg = bs.NodeActor( @@ -550,7 +550,7 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): self._lives -= 1 if self._lives == 0: self._bots.stop_moving() - self.continue_or_end_game() + self.end_game() # Heartbeat behavior if self._lives < 5: @@ -613,14 +613,6 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): ), ) - @override - def on_continue(self) -> None: - self._lives = 3 - assert self._lives_text is not None - assert self._lives_text.node - self._lives_text.node.text = str(self._lives) - self._bots.start_moving() - @override def spawn_player(self, player: Player) -> bs.Actor: pos = ( diff --git a/dist/ba_data/python/bascenev1lib/game/targetpractice.py b/dist/ba_data/python/bascenev1lib/game/targetpractice.py index 18d9410..b78ad81 100644 --- a/dist/ba_data/python/bascenev1lib/game/targetpractice.py +++ b/dist/ba_data/python/bascenev1lib/game/targetpractice.py @@ -2,7 +2,7 @@ # """Implements Target Practice game.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bascenev1lib/mainmenu.py b/dist/ba_data/python/bascenev1lib/mainmenu.py index 4e90293..eb2215a 100644 --- a/dist/ba_data/python/bascenev1lib/mainmenu.py +++ b/dist/ba_data/python/bascenev1lib/mainmenu.py @@ -1,7 +1,6 @@ # Released under the MIT License. See LICENSE for details. # """Session and Activity for displaying the main menu bg.""" -# pylint: disable=too-many-lines from __future__ import annotations @@ -16,6 +15,8 @@ import bauiv1 as bui if TYPE_CHECKING: from typing import Any + import bacommon.bs + class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): """Activity showing the rotating main menu bg stuff.""" @@ -43,55 +44,23 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): self._update_timer: bs.Timer | None = None self._news: NewsDisplay | None = None self._attract_mode_timer: bs.Timer | None = None + self._logo_rotate_timer: bs.Timer | None = None @override def on_transition_in(self) -> None: # pylint: disable=too-many-locals # pylint: disable=too-many-statements - # pylint: disable=too-many-branches super().on_transition_in() random.seed(123) app = bs.app env = app.env assert app.classic is not None - plus = bui.app.plus + plus = bs.app.plus assert plus is not None - # FIXME: We shouldn't be doing things conditionally based on whether - # the host is VR mode or not (clients may differ in that regard). - # Any differences need to happen at the engine level so everyone - # sees things in their own optimal way. - vr_mode = bs.app.env.vr - - if not bs.app.ui_v1.use_toolbars: - color = (1.0, 1.0, 1.0, 1.0) if vr_mode else (0.5, 0.6, 0.5, 0.6) - - # FIXME: Need a node attr for vr-specific-scale. - scale = ( - 0.9 - if (app.ui_v1.uiscale is bs.UIScale.SMALL or vr_mode) - else 0.7 - ) - self.my_name = bs.NodeActor( - bs.newnode( - 'text', - attrs={ - 'v_attach': 'bottom', - 'h_align': 'center', - 'color': color, - 'flatness': 1.0, - 'shadow': 1.0 if vr_mode else 0.5, - 'scale': scale, - 'position': (0, 10), - 'vr_depth': -10, - 'text': '\xa9 2011-2024 Eric Froemling', - }, - ) - ) - - # Throw up some text that only clients can see so they know that the - # host is navigating menus while they're just staring at an + # Throw up some text that only clients can see so they know that + # the host is navigating menus while they're just staring at an # empty-ish screen. tval = bs.Lstr( resource='hostIsNavigatingMenusText', @@ -109,73 +78,16 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): }, ) ) - if not app.classic.main_menu_did_initial_transition and hasattr( - self, 'my_name' + if ( + not app.classic.main_menu_did_initial_transition + and self.my_name is not None ): - assert self.my_name is not None assert self.my_name.node bs.animate(self.my_name.node, 'opacity', {2.3: 0, 3.0: 1.0}) - # FIXME: We shouldn't be doing things conditionally based on whether - # the host is vr mode or not (clients may not be or vice versa). - # Any differences need to happen at the engine level so everyone sees - # things in their own optimal way. - vr_mode = app.env.vr - uiscale = app.ui_v1.uiscale - - # In cases where we're doing lots of dev work lets always show the - # build number. - force_show_build_number = False - - if not bs.app.ui_v1.use_toolbars: - if env.debug or env.test or force_show_build_number: - if env.debug: - text = bs.Lstr( - value='${V} (${B}) (${D})', - subs=[ - ('${V}', app.env.engine_version), - ('${B}', str(app.env.engine_build_number)), - ('${D}', bs.Lstr(resource='debugText')), - ], - ) - else: - text = bs.Lstr( - value='${V} (${B})', - subs=[ - ('${V}', app.env.engine_version), - ('${B}', str(app.env.engine_build_number)), - ], - ) - else: - text = bs.Lstr( - value='${V}', subs=[('${V}', app.env.engine_version)] - ) - scale = 0.9 if (uiscale is bs.UIScale.SMALL or vr_mode) else 0.7 - color = (1, 1, 1, 1) if vr_mode else (0.5, 0.6, 0.5, 0.7) - self.version = bs.NodeActor( - bs.newnode( - 'text', - attrs={ - 'v_attach': 'bottom', - 'h_attach': 'right', - 'h_align': 'right', - 'flatness': 1.0, - 'vr_depth': -10, - 'shadow': 1.0 if vr_mode else 0.5, - 'color': color, - 'scale': scale, - 'position': (-260, 10) if vr_mode else (-10, 10), - 'text': text, - }, - ) - ) - if not app.classic.main_menu_did_initial_transition: - assert self.version.node - bs.animate(self.version.node, 'opacity', {2.3: 0, 3.0: 1.0}) - # Throw in test build info. self.beta_info = self.beta_info_2 = None - if env.test and not (env.demo or env.arcade): + if env.test: pos = (230, 35) self.beta_info = bs.NodeActor( bs.newnode( @@ -292,125 +204,20 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): self._update() # Hopefully this won't hitch but lets space these out anyway. - bui.add_clean_frame_callback(bs.WeakCall(self._start_preloads)) + bs.add_clean_frame_callback(bs.WeakCall(self._start_preloads)) random.seed() - if not (env.demo or env.arcade) and not app.ui_v1.use_toolbars: - self._news = NewsDisplay(self) + # Need to update this for toolbar mode; currenly doesn't fit. + if bool(False): + if not (env.demo or env.arcade): + self._news = NewsDisplay(self) self._attract_mode_timer = bs.Timer( 3.12, self._update_attract_mode, repeat=True ) - # Bring up the last place we were, or start at the main menu otherwise. - with bs.ContextRef.empty(): - from bauiv1lib import specialoffer - - assert bs.app.classic is not None - if bui.app.env.headless: - # UI stuff fails now in headless builds; avoid it. - pass - elif bool(False): - uicontroller = bs.app.ui_v1.controller - assert uicontroller is not None - uicontroller.show_main_menu() - else: - main_menu_location = bs.app.ui_v1.get_main_menu_location() - - # When coming back from a kiosk-mode game, jump to - # the kiosk start screen. - if env.demo or env.arcade: - # pylint: disable=cyclic-import - from bauiv1lib.kiosk import KioskWindow - - bs.app.ui_v1.set_main_menu_window( - KioskWindow().get_root_widget(), - from_window=False, # Disable check here. - ) - # ..or in normal cases go back to the main menu - else: - if main_menu_location == 'Gather': - # pylint: disable=cyclic-import - from bauiv1lib.gather import GatherWindow - - bs.app.ui_v1.set_main_menu_window( - GatherWindow(transition=None).get_root_widget(), - from_window=False, # Disable check here. - ) - elif main_menu_location == 'Watch': - # pylint: disable=cyclic-import - from bauiv1lib.watch import WatchWindow - - bs.app.ui_v1.set_main_menu_window( - WatchWindow(transition=None).get_root_widget(), - from_window=False, # Disable check here. - ) - elif main_menu_location == 'Team Game Select': - # pylint: disable=cyclic-import - from bauiv1lib.playlist.browser import ( - PlaylistBrowserWindow, - ) - - bs.app.ui_v1.set_main_menu_window( - PlaylistBrowserWindow( - sessiontype=bs.DualTeamSession, transition=None - ).get_root_widget(), - from_window=False, # Disable check here. - ) - elif main_menu_location == 'Free-for-All Game Select': - # pylint: disable=cyclic-import - from bauiv1lib.playlist.browser import ( - PlaylistBrowserWindow, - ) - - bs.app.ui_v1.set_main_menu_window( - PlaylistBrowserWindow( - sessiontype=bs.FreeForAllSession, - transition=None, - ).get_root_widget(), - from_window=False, # Disable check here. - ) - elif main_menu_location == 'Coop Select': - # pylint: disable=cyclic-import - from bauiv1lib.coop.browser import CoopBrowserWindow - - bs.app.ui_v1.set_main_menu_window( - CoopBrowserWindow( - transition=None - ).get_root_widget(), - from_window=False, # Disable check here. - ) - elif main_menu_location == 'Benchmarks & Stress Tests': - # pylint: disable=cyclic-import - from bauiv1lib.debug import DebugWindow - - bs.app.ui_v1.set_main_menu_window( - DebugWindow(transition=None).get_root_widget(), - from_window=False, # Disable check here. - ) - else: - # pylint: disable=cyclic-import - from bauiv1lib.mainmenu import MainMenuWindow - - bs.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition=None).get_root_widget(), - from_window=False, # Disable check here. - ) - - # attempt to show any pending offers immediately. - # If that doesn't work, try again in a few seconds - # (we may not have heard back from the server) - # ..if that doesn't work they'll just have to wait - # until the next opportunity. - if not specialoffer.show_offer(): - - def try_again() -> None: - if not specialoffer.show_offer(): - # Try one last time.. - bui.apptimer(2.0, specialoffer.show_offer) - - bui.apptimer(2.0, try_again) + app.classic.invoke_main_menu_ui() app.classic.main_menu_did_initial_transition = True @@ -445,7 +252,7 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): y = 20 base_scale = 1.1 self._word_actors = [] - base_delay = 1.0 + base_delay = 0.8 delay = base_delay delay_inc = 0.02 @@ -628,6 +435,7 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): word: str, x: float, y: float, + *, scale: float = 1.0, delay: float = 0.0, vr_depth_offset: float = 0.0, @@ -676,9 +484,8 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): ) self._word_actors.append(word_obj) - # Add a bit of stop-motion-y jitter to the logo - # (unless we're in VR mode in which case its best to - # leave things still). + # Add a bit of stop-motion-y jitter to the logo (unless we're in + # VR mode in which case its best to leave things still). if not bs.app.env.vr: cmb: bs.Node | None cmb2: bs.Node | None @@ -757,13 +564,13 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): y: float, scale: float, delay: float, + *, custom_texture: str | None = None, jitter_scale: float = 1.0, rotate: float = 0.0, vr_depth_offset: float = 0.0, ) -> None: # pylint: disable=too-many-locals - # Temp easter goodness. if custom_texture is None: custom_texture = self._get_custom_logo_tex_name() self._custom_logo_tex_name = custom_texture @@ -776,60 +583,92 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): if custom_texture is not None else bs.getmesh('logoTransparent') ) - logo = bs.NodeActor( - bs.newnode( - 'image', - attrs={ - 'texture': ltex, - 'mesh_opaque': mopaque, - 'mesh_transparent': mtrans, - 'vr_depth': -10 + vr_depth_offset, - 'rotate': rotate, - 'attach': 'center', - 'tilt_translate': 0.21, - 'absolute_scale': True, - }, - ) - ) + logo_attrs = { + 'position': (x, y), + 'texture': ltex, + 'mesh_opaque': mopaque, + 'mesh_transparent': mtrans, + 'vr_depth': -10 + vr_depth_offset, + 'rotate': rotate, + 'attach': 'center', + 'tilt_translate': 0.21, + 'absolute_scale': True, + } + if custom_texture is None: + logo_attrs['scale'] = (2000.0, 2000.0) + logo = bs.NodeActor(bs.newnode('image', attrs=logo_attrs)) self._logo_node = logo.node self._word_actors.append(logo) - # Add a bit of stop-motion-y jitter to the logo - # (unless we're in VR mode in which case its best to - # leave things still). + # Add a bit of stop-motion-y jitter to the logo (unless we're in + # VR mode in which case its best to leave things still). assert logo.node - if not bs.app.env.vr: + + def jitter() -> None: + if not bs.app.env.vr: + cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) + cmb.connectattr('output', logo.node, 'position') + keys = {} + time_v = 0.0 + + # Gen some random keys for that stop-motion-y look + for _i in range(10): + keys[time_v] = ( + x + (random.random() - 0.5) * 0.7 * jitter_scale + ) + time_v += random.random() * 0.1 + bs.animate(cmb, 'input0', keys, loop=True) + keys = {} + time_v = 0.0 + for _i in range(10): + keys[time_v * self._ts] = ( + y + (random.random() - 0.5) * 0.7 * jitter_scale + ) + time_v += random.random() * 0.1 + bs.animate(cmb, 'input1', keys, loop=True) + + # Do a fun spinny animation on the logo the first time in. + if ( + custom_texture is None + and bs.app.classic is not None + and not bs.app.classic.main_menu_did_initial_transition + ): + jitter() cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) - cmb.connectattr('output', logo.node, 'position') - keys = {} - time_v = 0.0 - # Gen some random keys for that stop-motion-y look - for _i in range(10): - keys[time_v] = x + (random.random() - 0.5) * 0.7 * jitter_scale - time_v += random.random() * 0.1 - bs.animate(cmb, 'input0', keys, loop=True) - keys = {} - time_v = 0.0 - for _i in range(10): - keys[time_v * self._ts] = ( - y + (random.random() - 0.5) * 0.7 * jitter_scale - ) - time_v += random.random() * 0.1 - bs.animate(cmb, 'input1', keys, loop=True) + delay = 0.0 + keys = { + delay: 5000.0 * scale, + delay + 0.4: 530.0 * scale, + delay + 0.45: 620.0 * scale, + delay + 0.5: 590.0 * scale, + delay + 0.55: 605.0 * scale, + delay + 0.6: 600.0 * scale, + } + bs.animate(cmb, 'input0', keys) + bs.animate(cmb, 'input1', keys) + cmb.connectattr('output', logo.node, 'scale') + + keys = { + delay: 100.0, + delay + 0.4: 370.0, + delay + 0.45: 357.0, + delay + 0.5: 360.0, + } + bs.animate(logo.node, 'rotate', keys) else: - logo.node.position = (x, y) + # For all other cases do a simple scale up animation. + jitter() + cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) - cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) - - keys = { - delay: 0.0, - delay + 0.1: 700.0 * scale, - delay + 0.2: 600.0 * scale, - } - bs.animate(cmb, 'input0', keys) - bs.animate(cmb, 'input1', keys) - cmb.connectattr('output', logo.node, 'scale') + keys = { + delay: 0.0, + delay + 0.1: 700.0 * scale, + delay + 0.2: 600.0 * scale, + } + bs.animate(cmb, 'input0', keys) + bs.animate(cmb, 'input1', keys) + cmb.connectattr('output', logo.node, 'scale') def _start_preloads(self) -> None: # FIXME: The func that calls us back doesn't save/restore state @@ -879,8 +718,8 @@ class NewsDisplay: self._used_phrases: list[str] = [] self._phrase_change_timer: bs.Timer | None = None - # If we're signed in, fetch news immediately. - # Otherwise wait until we are signed in. + # If we're signed in, fetch news immediately. Otherwise wait + # until we are signed in. self._fetch_timer: bs.Timer | None = bs.Timer( 1.0, bs.WeakCall(self._try_fetching_news), repeat=True ) @@ -913,8 +752,8 @@ class NewsDisplay: app = bs.app assert app.classic is not None - # If our news is way out of date, lets re-request it; - # otherwise, rotate our phrase. + # If our news is way out of date, lets re-request it; otherwise, + # rotate our phrase. assert app.classic.main_menu_last_news_fetch_time is not None if time.time() - app.classic.main_menu_last_news_fetch_time > 600.0: self._fetch_news() @@ -981,17 +820,16 @@ class NewsDisplay: self._text.node.text = val def _got_news(self, news: str) -> None: - # Run this stuff in the context of our activity since we - # need to make nodes and stuff.. should fix the serverget - # call so it. + # Run this stuff in the context of our activity since we need to + # make nodes and stuff.. should fix the serverget call so it. activity = self._activity() if activity is None or activity.expired: return with activity.context: self._phrases.clear() - # Show upcoming achievements in non-vr versions - # (currently too hard to read in vr). + # Show upcoming achievements in non-vr versions (currently + # too hard to read in vr). self._used_phrases = (['__ACH__'] if not bs.app.env.vr else []) + [ s for s in news.split('
\n') if s != '' ] diff --git a/dist/ba_data/python/bascenev1lib/maps.py b/dist/ba_data/python/bascenev1lib/maps.py index 04f5b36..6646b72 100644 --- a/dist/ba_data/python/bascenev1lib/maps.py +++ b/dist/ba_data/python/bascenev1lib/maps.py @@ -15,6 +15,30 @@ if TYPE_CHECKING: from typing import Any +def register_all_maps() -> None: + """Registering all maps.""" + for maptype in [ + HockeyStadium, + FootballStadium, + Bridgit, + BigG, + Roundabout, + MonkeyFace, + ZigZag, + ThePad, + DoomShroom, + LakeFrigid, + TipTop, + CragCastle, + TowerD, + HappyThoughts, + StepRightUp, + Courtyard, + Rampage, + ]: + bs.register_map(maptype) + + class HockeyStadium(bs.Map): """Stadium map used for ice hockey games.""" diff --git a/dist/ba_data/python/bascenev1lib/tutorial.py b/dist/ba_data/python/bascenev1lib/tutorial.py index 541e611..d9b6e29 100644 --- a/dist/ba_data/python/bascenev1lib/tutorial.py +++ b/dist/ba_data/python/bascenev1lib/tutorial.py @@ -515,6 +515,7 @@ class TutorialActivity(bs.Activity[Player, Team]): self, num: int, position: Sequence[float], + *, color: Sequence[float] = (1.0, 1.0, 1.0), make_current: bool = False, relative_to: int | None = None, @@ -577,6 +578,7 @@ class TutorialActivity(bs.Activity[Player, Team]): self, num: int, position: Sequence[float], + *, color: Sequence[float] = (1.0, 1.0, 1.0), make_current: bool = False, relative_to: int | None = None, diff --git a/dist/ba_data/python/batemplatefs/__init__.py b/dist/ba_data/python/batemplatefs/__init__.py index 58ad2cd..ed09764 100644 --- a/dist/ba_data/python/batemplatefs/__init__.py +++ b/dist/ba_data/python/batemplatefs/__init__.py @@ -2,14 +2,14 @@ # """Ballistica Template Feature Set - just an example.""" -# ba_meta require api 8 +# ba_meta require api 9 # Package up various private bits (including stuff from our native # module) into a nice clean public API. from _batemplatefs import hello_again_world -from batemplatefs._subsystem import TemplateFsSubsystem +from batemplatefs._appsubsystem import TemplateFsAppSubsystem __all__ = [ - 'TemplateFsSubsystem', + 'TemplateFsAppSubsystem', 'hello_again_world', ] diff --git a/dist/ba_data/python/batemplatefs/_subsystem.py b/dist/ba_data/python/batemplatefs/_appsubsystem.py similarity index 61% rename from dist/ba_data/python/batemplatefs/_subsystem.py rename to dist/ba_data/python/batemplatefs/_appsubsystem.py index 2645fbf..2bc9fe3 100644 --- a/dist/ba_data/python/batemplatefs/_subsystem.py +++ b/dist/ba_data/python/batemplatefs/_appsubsystem.py @@ -1,6 +1,6 @@ # Released under the MIT License. See LICENSE for details. # -"""Provides the TemplateFs subsystem.""" +"""Provides the TemplateFs App-Subsystem.""" from __future__ import annotations from typing import TYPE_CHECKING @@ -9,11 +9,11 @@ if TYPE_CHECKING: pass -class TemplateFsSubsystem: +class TemplateFsAppSubsystem: """Subsystem for TemplateFs functionality in the app. - The single shared instance of this app can be accessed at - babase.app.templatefs. Note that it is possible for babase.app.templatefs + The single shared instance of this class can be accessed at + ba*.app.templatefs. Note that it is possible for ba*.app.templatefs to be None if the TemplateFs feature-set is not enabled, and code should handle that case gracefully. """ diff --git a/dist/ba_data/python/bauiv1/__init__.py b/dist/ba_data/python/bauiv1/__init__.py index 2e3144b..49a9503 100644 --- a/dist/ba_data/python/bauiv1/__init__.py +++ b/dist/ba_data/python/bauiv1/__init__.py @@ -2,7 +2,7 @@ # """Ballistica user interface api version 1""" -# ba_meta require api 8 +# ba_meta require api 9 # The stuff we expose here at the top level is our 'public' api. # It should only be imported by code outside of this package or @@ -19,6 +19,7 @@ import logging from efro.util import set_canonical_module_names from babase import ( add_clean_frame_callback, + allows_ticket_sales, app, AppIntent, AppIntentDefault, @@ -45,6 +46,7 @@ from babase import ( displaytimer, DisplayTimer, do_once, + existing, fade_screen, get_display_resolution, get_input_idle_time, @@ -56,9 +58,12 @@ from babase import ( get_string_height, get_string_width, get_type_name, + get_virtual_safe_area_size, + get_virtual_screen_size, getclass, have_permission, in_logic_thread, + in_main_menu, increment_analytics_count, is_browser_likely_available, is_xcode_build, @@ -90,9 +95,11 @@ from babase import ( SpecialChar, supports_max_fps, supports_vsync, + supports_unicode_display, timestring, UIScale, unlock_all_input, + utc_now_cloud, WeakCall, workspaces_in_use, ) @@ -109,12 +116,13 @@ from _bauiv1 import ( gettexture, hscrollwidget, imagewidget, - is_party_icon_visible, Mesh, + root_ui_pause_updates, + root_ui_resume_updates, rowwidget, scrollwidget, - set_party_icon_always_visible, set_party_window_open, + spinnerwidget, Sound, Texture, textwidget, @@ -123,11 +131,18 @@ from _bauiv1 import ( widget, ) from bauiv1._keyboard import Keyboard -from bauiv1._uitypes import Window, uicleanupcheck -from bauiv1._subsystem import UIV1Subsystem +from bauiv1._uitypes import ( + Window, + MainWindowState, + BasicMainWindowState, + uicleanupcheck, + MainWindow, +) +from bauiv1._appsubsystem import UIV1AppSubsystem __all__ = [ 'add_clean_frame_callback', + 'allows_ticket_sales', 'app', 'AppIntent', 'AppIntentDefault', @@ -140,6 +155,7 @@ __all__ = [ 'AppTime', 'apptimer', 'AppTimer', + 'BasicMainWindowState', 'buttonwidget', 'Call', 'fullscreen_control_available', @@ -159,6 +175,7 @@ __all__ = [ 'displaytimer', 'DisplayTimer', 'do_once', + 'existing', 'fade_screen', 'get_display_resolution', 'get_input_idle_time', @@ -172,6 +189,8 @@ __all__ = [ 'get_string_height', 'get_string_width', 'get_type_name', + 'get_virtual_safe_area_size', + 'get_virtual_screen_size', 'getclass', 'getmesh', 'getsound', @@ -180,15 +199,17 @@ __all__ = [ 'hscrollwidget', 'imagewidget', 'in_logic_thread', + 'in_main_menu', 'increment_analytics_count', 'is_browser_likely_available', - 'is_party_icon_visible', 'is_xcode_build', 'Keyboard', 'lock_all_input', 'LoginAdapter', 'LoginInfo', 'Lstr', + 'MainWindow', + 'MainWindowState', 'Mesh', 'native_review_request', 'native_review_request_supported', @@ -206,27 +227,31 @@ __all__ = [ 'quit', 'QuitType', 'request_permission', + 'root_ui_pause_updates', + 'root_ui_resume_updates', 'rowwidget', 'safecolor', 'screenmessage', 'scrollwidget', 'set_analytics_screen', 'set_low_level_config_value', - 'set_party_icon_always_visible', 'set_party_window_open', 'set_ui_input_device', 'Sound', 'SpecialChar', + 'spinnerwidget', 'supports_max_fps', 'supports_vsync', + 'supports_unicode_display', 'Texture', 'textwidget', 'timestring', 'uibounds', 'uicleanupcheck', 'UIScale', - 'UIV1Subsystem', + 'UIV1AppSubsystem', 'unlock_all_input', + 'utc_now_cloud', 'WeakCall', 'widget', 'Widget', diff --git a/dist/ba_data/python/bauiv1/_appsubsystem.py b/dist/ba_data/python/bauiv1/_appsubsystem.py new file mode 100644 index 0000000..8e7e743 --- /dev/null +++ b/dist/ba_data/python/bauiv1/_appsubsystem.py @@ -0,0 +1,469 @@ +# Released under the MIT License. See LICENSE for details. +# +"""User interface related functionality.""" + +from __future__ import annotations + +import time +import logging +import inspect +import weakref +import warnings +from enum import Enum +from typing import TYPE_CHECKING, override + +from efro.util import empty_weakref +import babase + +import _bauiv1 + +if TYPE_CHECKING: + from typing import Any, Callable + + from bauiv1._uitypes import ( + UICleanupCheck, + Window, + MainWindow, + MainWindowState, + ) + import bauiv1 + + +class UIV1AppSubsystem(babase.AppSubsystem): + """Consolidated UI functionality for the app. + + Category: **App Classes** + + To use this class, access the single instance of it at 'ba.app.ui'. + """ + + class RootUIElement(Enum): + """Stuff provided by the root ui.""" + + MENU_BUTTON = 'menu_button' + SQUAD_BUTTON = 'squad_button' + ACCOUNT_BUTTON = 'account_button' + SETTINGS_BUTTON = 'settings_button' + INBOX_BUTTON = 'inbox_button' + STORE_BUTTON = 'store_button' + INVENTORY_BUTTON = 'inventory_button' + ACHIEVEMENTS_BUTTON = 'achievements_button' + GET_TOKENS_BUTTON = 'get_tokens_button' + TICKETS_METER = 'tickets_meter' + TOKENS_METER = 'tokens_meter' + TROPHY_METER = 'trophy_meter' + LEVEL_METER = 'level_meter' + CHEST_SLOT_0 = 'chest_slot_0' + CHEST_SLOT_1 = 'chest_slot_1' + CHEST_SLOT_2 = 'chest_slot_2' + CHEST_SLOT_3 = 'chest_slot_3' + + def __init__(self) -> None: + from bauiv1._uitypes import MainWindow + + super().__init__() + + # We hold only a weak ref to the current main Window; we want it + # to be able to disappear on its own. That being said, we do + # expect MainWindows to keep themselves alive until replaced by + # another MainWindow and we complain if they don't. + self._main_window = empty_weakref(MainWindow) + self._main_window_widget: bauiv1.Widget | None = None + + self.quit_window: bauiv1.Widget | None = None + + # For storing arbitrary class-level state data for Windows or + # other UI related classes. + self.window_states: dict[type, Any] = {} + + self._uiscale: babase.UIScale + self._update_ui_scale() + + self.cleanupchecks: list[UICleanupCheck] = [] + self.upkeeptimer: babase.AppTimer | None = None + + self.title_color = (0.72, 0.7, 0.75) + self.heading_color = (0.72, 0.7, 0.75) + self.infotextcolor = (0.7, 0.9, 0.7) + + self._last_win_recreate_size: tuple[float, float] | None = None + self._last_screen_size_win_recreate_time: float | None = None + self._screen_size_win_recreate_timer: babase.AppTimer | None = None + + # Elements in our root UI will call anything here when + # activated. + self.root_ui_calls: dict[ + UIV1AppSubsystem.RootUIElement, Callable[[], None] + ] = {} + + def _update_ui_scale(self) -> None: + uiscalestr = babase.get_ui_scale() + if uiscalestr == 'large': + self._uiscale = babase.UIScale.LARGE + elif uiscalestr == 'medium': + self._uiscale = babase.UIScale.MEDIUM + elif uiscalestr == 'small': + self._uiscale = babase.UIScale.SMALL + else: + logging.error("Invalid UIScale '%s'.", uiscalestr) + self._uiscale = babase.UIScale.MEDIUM + + @property + def available(self) -> bool: + """Can uiv1 currently be used? + + Code that may run in headless mode, before the UI has been spun up, + while other ui systems are active, etc. can check this to avoid + likely erroring. + """ + return _bauiv1.is_available() + + @override + def reset(self) -> None: + from bauiv1._uitypes import MainWindow + + self.root_ui_calls.clear() + self._main_window = empty_weakref(MainWindow) + self._main_window_widget = None + + @property + def uiscale(self) -> babase.UIScale: + """Current ui scale for the app.""" + return self._uiscale + + @override + def on_app_loading(self) -> None: + from bauiv1._uitypes import ui_upkeep + + # IMPORTANT: If tweaking UI stuff, make sure it behaves for + # small, medium, and large UI modes. (doesn't run off screen, + # etc). The overrides below can be used to test with different + # sizes. Generally small is used on phones, medium is used on + # tablets/tvs, and large is on desktop computers or perhaps + # large tablets. When possible, run in windowed mode and resize + # the window to assure this holds true at all aspect ratios. + + # UPDATE: A better way to test this is now by setting the + # environment variable BA_UI_SCALE to "small", "medium", or + # "large". This will affect system UIs not covered by the values + # below such as screen-messages. The below values remain + # functional, however, for cases such as Android where + # environment variables can't be set easily. + + if bool(False): # force-test ui scale + self._uiscale = babase.UIScale.SMALL + with babase.ContextRef.empty(): + babase.pushcall( + lambda: babase.screenmessage( + f'FORCING UISCALE {self._uiscale.name} FOR TESTING', + color=(1, 0, 1), + log=True, + ) + ) + + # Kick off our periodic UI upkeep. + + # FIXME: Can probably kill this if we do immediate UI death + # checks. + self.upkeeptimer = babase.AppTimer(2.6543, ui_upkeep, repeat=True) + + def get_main_window(self) -> bauiv1.MainWindow | None: + """Return main window, if any.""" + return self._main_window() + + def set_main_window( + self, + window: bauiv1.MainWindow, + *, + from_window: bauiv1.MainWindow | None | bool = True, + is_back: bool = False, + is_top_level: bool = False, + is_auxiliary: bool = False, + back_state: MainWindowState | None = None, + suppress_warning: bool = False, + ) -> None: + """Set the current 'main' window. + + Generally this should not be called directly; The high level + MainWindow methods main_window_replace() and main_window_back() + should be used whenever possible to implement navigation. + + The caller is responsible for cleaning up any previous main + window. + """ + # pylint: disable=too-many-locals + # pylint: disable=too-many-branches + # pylint: disable=too-many-statements + from bauiv1._uitypes import MainWindow + + # Encourage migration to the new higher level nav calls. + if not suppress_warning: + warnings.warn( + 'set_main_window() should usually not be called directly;' + ' use the main_window_replace() or main_window_back()' + ' methods on MainWindow objects for navigation instead.' + ' If you truly need to use set_main_window(),' + ' pass suppress_warning=True to silence this warning.', + DeprecationWarning, + stacklevel=2, + ) + + # We used to accept Widgets but now want MainWindows. + if not isinstance(window, MainWindow): + raise RuntimeError( + f'set_main_window() now takes a MainWindow as its "window" arg.' + f' You passed a {type(window)}.', + ) + window_weakref = weakref.ref(window) + window_widget = window.get_root_widget() + + if not isinstance(from_window, MainWindow): + if from_window is not None and not isinstance(from_window, bool): + raise RuntimeError( + f'set_main_window() now takes a MainWindow or bool or None' + f'as its "from_window" arg.' + f' You passed a {type(from_window)}.', + ) + + existing = self._main_window() + + # If they passed a back-state, make sure it is fully filled out. + if back_state is not None: + if ( + back_state.is_top_level is None + or back_state.is_auxiliary is None + or back_state.window_type is None + ): + raise RuntimeError( + 'Provided back_state is incomplete.' + ' Make sure to only pass fully-filled-out MainWindowStates.' + ) + + # If a top-level main-window is being set, complain if there already + # is a main-window. + if is_top_level: + if existing: + logging.warning( + 'set_main_window() called with top-level window %s' + ' but found existing main-window %s.', + window, + existing, + ) + else: + # In other cases, sanity-check that the window asking for + # this switch is the one we're switching away from. + try: + if isinstance(from_window, bool): + # For default val True we warn that the arg wasn't + # passed. False can be explicitly passed to disable + # this check. + if from_window is True: + caller_frame = inspect.stack()[1] + caller_filename = caller_frame.filename + caller_line_number = caller_frame.lineno + logging.warning( + 'set_main_window() should be passed a' + " 'from_window' value to help ensure proper" + ' UI behavior (%s line %i).', + caller_filename, + caller_line_number, + ) + else: + # For everything else, warn if what they passed + # wasn't the previous main menu widget. + if from_window is not existing: + caller_frame = inspect.stack()[1] + caller_filename = caller_frame.filename + caller_line_number = caller_frame.lineno + logging.warning( + "set_main_window() was passed 'from_window' %s" + ' but existing main-menu-window is %s.' + ' (%s line %i).', + from_window, + existing, + caller_filename, + caller_line_number, + ) + except Exception: + # Prevent any bugs in these checks from causing problems. + logging.exception('Error checking from_window') + + if is_back: + # These values should only be passed for forward navigation. + assert not is_top_level + assert not is_auxiliary + # Make sure back state is complete. + assert back_state is not None + assert back_state.is_top_level is not None + assert back_state.is_auxiliary is not None + assert back_state.window_type is type(window) + window.main_window_back_state = back_state.parent + window.main_window_is_top_level = back_state.is_top_level + window.main_window_is_auxiliary = back_state.is_auxiliary + else: + # Store if the window is top-level so we won't complain later if + # we go back from it and there's nowhere to go to. + window.main_window_is_top_level = is_top_level + + window.main_window_is_auxiliary = is_auxiliary + + # When navigating forward, generate a back-window-state from + # the outgoing window. + if is_top_level: + # Top level windows don't have or expect anywhere to + # go back to. + window.main_window_back_state = None + elif back_state is not None: + window.main_window_back_state = back_state + else: + oldwin = self._main_window() + if oldwin is None: + # We currenty only hold weak refs to windows so that + # they are free to die on their own, but we expect + # the main menu window to keep itself alive as long + # as its the main one. Holler if that seems to not + # be happening. + logging.warning( + 'set_main_window: No old MainWindow found' + ' and is_top_level is False;' + ' this should not happen.' + ) + window.main_window_back_state = None + else: + window.main_window_back_state = self.save_main_window_state( + oldwin + ) + + self._main_window = window_weakref + self._main_window_widget = window_widget + + def has_main_window(self) -> bool: + """Return whether a main menu window is present.""" + return bool(self._main_window_widget) + + def clear_main_window(self, transition: str | None = None) -> None: + """Clear any existing main window.""" + from bauiv1._uitypes import MainWindow + + main_window = self._main_window() + if main_window: + main_window.main_window_close(transition=transition) + else: + # Fallback; if we have a widget but no window, nuke the widget. + if self._main_window_widget: + logging.error( + 'Have _main_window_widget but no main_window' + ' on clear_main_window; unexpected.' + ) + self._main_window_widget.delete() + + self._main_window = empty_weakref(MainWindow) + self._main_window_widget = None + + def save_main_window_state(self, window: MainWindow) -> MainWindowState: + """Fully initialize a window-state from a window. + + Use this to get a complete state for later restoration purposes. + Calling the window's get_main_window_state() directly is + insufficient. + """ + winstate = window.get_main_window_state() + + # Store some common window stuff on its state. + winstate.parent = window.main_window_back_state + winstate.is_top_level = window.main_window_is_top_level + winstate.is_auxiliary = window.main_window_is_auxiliary + winstate.window_type = type(window) + + return winstate + + def restore_main_window_state(self, state: MainWindowState) -> None: + """Restore UI to a saved state.""" + existing = self.get_main_window() + if existing is not None: + raise RuntimeError('There is already a MainWindow.') + + # Valid states should have a value here. + assert state.is_top_level is not None + assert state.is_auxiliary is not None + assert state.window_type is not None + + win = state.create_window(transition=None) + self.set_main_window( + win, + from_window=False, # disable check + is_top_level=state.is_top_level, + is_auxiliary=state.is_auxiliary, + back_state=state.parent, + suppress_warning=True, + ) + + @override + def on_ui_scale_change(self) -> None: + # Update our stored UIScale. + self._update_ui_scale() + + # Update native bits (allow root widget to rebuild itself/etc.) + _bauiv1.on_ui_scale_change() + + # Lastly, if we have a main window, recreate it to pick up the + # new UIScale/etc. + mainwindow = self.get_main_window() + if mainwindow is not None: + winstate = self.save_main_window_state(mainwindow) + self.clear_main_window(transition='instant') + self.restore_main_window_state(winstate) + + # Store the size we created this for to avoid redundant + # future recreates. + self._last_win_recreate_size = babase.get_virtual_screen_size() + + @override + def on_screen_size_change(self) -> None: + + # Recreating a MainWindow is a kinda heavy thing and it doesn't + # seem like we should be doing it at 120hz during a live window + # resize, so let's limit the max rate we do it. + now = time.monotonic() + + # 4 refreshes per second seems reasonable. + interval = 0.25 + + # If there is a timer set already, do nothing. + if self._screen_size_win_recreate_timer is not None: + return + + # Ok; there's no timer. Schedule one. + till_update = ( + 0.0 + if self._last_screen_size_win_recreate_time is None + else max( + 0.0, self._last_screen_size_win_recreate_time + interval - now + ) + ) + self._screen_size_win_recreate_timer = babase.AppTimer( + till_update, self._do_screen_size_win_recreate + ) + + def _do_screen_size_win_recreate(self) -> None: + self._last_screen_size_win_recreate_time = time.monotonic() + self._screen_size_win_recreate_timer = None + + # Avoid recreating if we're already at this size. This prevents + # a redundant recreate when ui scale changes. + virtual_screen_size = babase.get_virtual_screen_size() + if virtual_screen_size == self._last_win_recreate_size: + return + + mainwindow = self.get_main_window() + if ( + mainwindow is not None + and mainwindow.refreshes_on_screen_size_changes + ): + winstate = self.save_main_window_state(mainwindow) + self.clear_main_window(transition='instant') + self.restore_main_window_state(winstate) + + # Store the size we created this for to avoid redundant + # future recreates. + self._last_win_recreate_size = virtual_screen_size diff --git a/dist/ba_data/python/bauiv1/_hooks.py b/dist/ba_data/python/bauiv1/_hooks.py index b65c139..644ecd3 100644 --- a/dist/ba_data/python/bauiv1/_hooks.py +++ b/dist/ba_data/python/bauiv1/_hooks.py @@ -15,49 +15,130 @@ if TYPE_CHECKING: from typing import Sequence import babase - - -def ticket_icon_press() -> None: - from babase import app - - if app.classic is None: - logging.exception('Classic not present.') - return - - app.classic.ticket_icon_press() - - -def trophy_icon_press() -> None: - print('TROPHY ICON PRESSED') - - -def level_icon_press() -> None: - print('LEVEL ICON PRESSED') - - -def coin_icon_press() -> None: - print('COIN ICON PRESSED') + import bauiv1 def empty_call() -> None: pass -def back_button_press() -> None: - _bauiv1.back_press() +def _root_ui_button_press( + rootuitype: bauiv1.UIV1AppSubsystem.RootUIElement, +) -> None: + import babase + + ui = babase.app.ui_v1 + call = ui.root_ui_calls.get(rootuitype) + if call is not None: + call() -def friends_button_press() -> None: - print('FRIEND BUTTON PRESSED!') +def root_ui_account_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.ACCOUNT_BUTTON) -def party_icon_activate(origin: Sequence[float]) -> None: - from babase import app +def root_ui_inbox_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem - if app.classic is not None: - app.classic.party_icon_activate(origin) - else: - logging.warning('party_icon_activate: no classic.') + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.INBOX_BUTTON) + + +def root_ui_settings_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.SETTINGS_BUTTON) + + +def root_ui_achievements_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.ACHIEVEMENTS_BUTTON) + + +def root_ui_store_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.STORE_BUTTON) + + +def root_ui_chest_slot_0_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.CHEST_SLOT_0) + + +def root_ui_chest_slot_1_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.CHEST_SLOT_1) + + +def root_ui_chest_slot_2_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.CHEST_SLOT_2) + + +def root_ui_chest_slot_3_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.CHEST_SLOT_3) + + +def root_ui_inventory_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.INVENTORY_BUTTON) + + +def root_ui_ticket_icon_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.TICKETS_METER) + + +def root_ui_get_tokens_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.GET_TOKENS_BUTTON) + + +def root_ui_tokens_meter_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.TOKENS_METER) + + +def root_ui_trophy_meter_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.TROPHY_METER) + + +def root_ui_level_icon_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.LEVEL_METER) + + +def root_ui_menu_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.MENU_BUTTON) + + +def root_ui_back_button_press() -> None: + # Native layer handles this directly. (technically we could wire + # this up to not even come through Python). + _bauiv1.root_ui_back_press() + + +def root_ui_squad_button_press() -> None: + from bauiv1._appsubsystem import UIV1AppSubsystem + + _root_ui_button_press(UIV1AppSubsystem.RootUIElement.SQUAD_BUTTON) def on_button_press_x() ->None: diff --git a/dist/ba_data/python/bauiv1/_subsystem.py b/dist/ba_data/python/bauiv1/_subsystem.py deleted file mode 100644 index c9bd7f5..0000000 --- a/dist/ba_data/python/bauiv1/_subsystem.py +++ /dev/null @@ -1,250 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""User interface related functionality.""" - -from __future__ import annotations - -import logging -import inspect -from typing import TYPE_CHECKING, override - -import babase - -import _bauiv1 - -if TYPE_CHECKING: - from typing import Any, Callable - - from bauiv1._uitypes import UICleanupCheck, UIController - import bauiv1 - - -class UIV1Subsystem(babase.AppSubsystem): - """Consolidated UI functionality for the app. - - Category: **App Classes** - - To use this class, access the single instance of it at 'ba.app.ui'. - """ - - def __init__(self) -> None: - super().__init__() - env = babase.env() - - self.controller: UIController | None = None - - self._main_menu_window: bauiv1.Widget | None = None - self._main_menu_location: str | None = None - self.quit_window: bauiv1.Widget | None = None - - # From classic. - self.main_menu_resume_callbacks: list = [] # Can probably go away. - - self._uiscale: babase.UIScale - - interfacetype = babase.app.config.get('UI Scale', env['ui_scale']) - if interfacetype == 'auto': - interfacetype = env['ui_scale'] - - if interfacetype == 'large': - self._uiscale = babase.UIScale.LARGE - elif interfacetype == 'medium': - self._uiscale = babase.UIScale.MEDIUM - elif interfacetype == 'small': - self._uiscale = babase.UIScale.SMALL - else: - raise RuntimeError(f'Invalid UIScale value: {interfacetype}') - - self.window_states: dict[type, Any] = {} # FIXME: Kill this. - self.main_menu_selection: str | None = None # FIXME: Kill this. - self.have_party_queue_window = False - self.cleanupchecks: list[UICleanupCheck] = [] - self.upkeeptimer: babase.AppTimer | None = None - self.use_toolbars = _bauiv1.toolbar_test() - - self.title_color = (0.72, 0.7, 0.75) - self.heading_color = (0.72, 0.7, 0.75) - self.infotextcolor = (0.7, 0.9, 0.7) - - # Switch our overall game selection UI flow between Play and - # Private-party playlist selection modes; should do this in - # a more elegant way once we revamp high level UI stuff a bit. - self.selecting_private_party_playlist: bool = False - - @property - def available(self) -> bool: - """Can uiv1 currently be used? - - Code that may run in headless mode, before the UI has been spun up, - while other ui systems are active, etc. can check this to avoid - likely erroring. - """ - return _bauiv1.is_available() - - @property - def uiscale(self) -> babase.UIScale: - """Current ui scale for the app.""" - return self._uiscale - - @override - def on_app_loading(self) -> None: - from bauiv1._uitypes import UIController, ui_upkeep - - # IMPORTANT: If tweaking UI stuff, make sure it behaves for small, - # medium, and large UI modes. (doesn't run off screen, etc). - # The overrides below can be used to test with different sizes. - # Generally small is used on phones, medium is used on tablets/tvs, - # and large is on desktop computers or perhaps large tablets. When - # possible, run in windowed mode and resize the window to assure - # this holds true at all aspect ratios. - - # UPDATE: A better way to test this is now by setting the environment - # variable BA_UI_SCALE to "small", "medium", or "large". - # This will affect system UIs not covered by the values below such - # as screen-messages. The below values remain functional, however, - # for cases such as Android where environment variables can't be set - # easily. - - if bool(False): # force-test ui scale - self._uiscale = babase.UIScale.SMALL - with babase.ContextRef.empty(): - babase.pushcall( - lambda: babase.screenmessage( - f'FORCING UISCALE {self._uiscale.name} FOR TESTING', - color=(1, 0, 1), - log=True, - ) - ) - - self.controller = UIController() - - # Kick off our periodic UI upkeep. - # FIXME: Can probably kill this if we do immediate UI death checks. - self.upkeeptimer = babase.AppTimer(2.6543, ui_upkeep, repeat=True) - - def set_main_menu_window( - self, - window: bauiv1.Widget, - from_window: bauiv1.Widget | None | bool = True, - ) -> None: - """Set the current 'main' window, replacing any existing. - - If 'from_window' is passed as a bauiv1.Widget or None, a warning - will be issued if it that value does not match the current main - window. This can help clean up flawed code that can lead to bad - UI states. A value of False will disable the check. - """ - - existing = self._main_menu_window - - try: - if isinstance(from_window, bool): - # For default val True we warn that the arg wasn't - # passed. False can be explicitly passed to disable this - # check. - if from_window is True: - caller_frame = inspect.stack()[1] - caller_filename = caller_frame.filename - caller_line_number = caller_frame.lineno - logging.warning( - 'set_main_menu_window() should be passed a' - " 'from_window' value to help ensure proper UI behavior" - ' (%s line %i).', - caller_filename, - caller_line_number, - ) - else: - # For everything else, warn if what they passed wasn't - # the previous main menu widget. - if from_window is not existing: - caller_frame = inspect.stack()[1] - caller_filename = caller_frame.filename - caller_line_number = caller_frame.lineno - logging.warning( - "set_main_menu_window() was passed 'from_window' %s" - ' but existing main-menu-window is %s. (%s line %i).', - from_window, - existing, - caller_filename, - caller_line_number, - ) - except Exception: - # Prevent any bugs in these checks from causing problems. - logging.exception('Error checking from_window') - - # Once the above code leads to us fixing all leftover window bugs - # at the source, we can kill the code below. - - # Let's grab the location where we were called from to report - # if we have to force-kill the existing window (which normally - # should not happen). - frameline = None - try: - frame = inspect.currentframe() - if frame is not None: - frame = frame.f_back - if frame is not None: - frameinfo = inspect.getframeinfo(frame) - frameline = f'{frameinfo.filename} {frameinfo.lineno}' - except Exception: - logging.exception('Error calcing line for set_main_menu_window') - - # With our legacy main-menu system, the caller is responsible for - # clearing out the old main menu window when assigning the new. - # However there are corner cases where that doesn't happen and we get - # old windows stuck under the new main one. So let's guard against - # that. However, we can't simply delete the existing main window when - # a new one is assigned because the user may transition the old out - # *after* the assignment. Sigh. So, as a happy medium, let's check in - # on the old after a short bit of time and kill it if its still alive. - # That will be a bit ugly on screen but at least should un-break - # things. - def _delay_kill() -> None: - import time - - if existing: - print( - f'Killing old main_menu_window' - f' when called at: {frameline} t={time.time():.3f}' - ) - existing.delete() - - babase.apptimer(1.0, _delay_kill) - self._main_menu_window = window - - def clear_main_menu_window(self, transition: str | None = None) -> None: - """Clear any existing 'main' window with the provided transition.""" - assert transition is None or not transition.endswith('_in') - if self._main_menu_window: - if ( - transition is not None - and not self._main_menu_window.transitioning_out - ): - _bauiv1.containerwidget( - edit=self._main_menu_window, transition=transition - ) - else: - self._main_menu_window.delete() - self._main_menu_window = None - - def add_main_menu_close_callback(self, call: Callable[[], Any]) -> None: - """(internal)""" - - # If there's no main menu up, just call immediately. - if not self.has_main_menu_window(): - with babase.ContextRef.empty(): - call() - else: - self.main_menu_resume_callbacks.append(call) - - def has_main_menu_window(self) -> bool: - """Return whether a main menu window is present.""" - return bool(self._main_menu_window) - - def set_main_menu_location(self, location: str) -> None: - """Set the location represented by the current main menu window.""" - self._main_menu_location = location - - def get_main_menu_location(self) -> str | None: - """Return the current named main menu location, if any.""" - return self._main_menu_location diff --git a/dist/ba_data/python/bauiv1/_uitypes.py b/dist/ba_data/python/bauiv1/_uitypes.py index 6431a55..3dd8d89 100644 --- a/dist/ba_data/python/bauiv1/_uitypes.py +++ b/dist/ba_data/python/bauiv1/_uitypes.py @@ -6,6 +6,7 @@ from __future__ import annotations import os import weakref +import logging from dataclasses import dataclass from typing import TYPE_CHECKING, override @@ -14,7 +15,7 @@ import babase import _bauiv1 if TYPE_CHECKING: - from typing import Any, Type + from typing import Any, Type, Literal, Callable import bauiv1 @@ -27,6 +28,9 @@ class Window: """A basic window. Category: User Interface Classes + + Essentially wraps a ContainerWidget with some higher level + functionality. """ def __init__(self, root_widget: bauiv1.Widget, cleanupcheck: bool = True): @@ -41,6 +45,253 @@ class Window: return self._root_widget +class MainWindow(Window): + """A special type of window that can be set as 'main'. + + The UI system has at most one main window at any given time. + MainWindows support high level functionality such as saving and + restoring states, allowing them to be automatically recreated when + navigating back from other locations or when something like ui-scale + changes. + """ + + def __init__( + self, + root_widget: bauiv1.Widget, + *, + transition: str | None, + origin_widget: bauiv1.Widget | None, + cleanupcheck: bool = True, + refresh_on_screen_size_changes: bool = False, + ): + """Create a MainWindow given a root widget and transition info. + + Automatically handles in and out transitions on the provided widget, + so there is no need to set transitions when creating it. + """ + # A back-state supplied by the ui system. + self.main_window_back_state: MainWindowState | None = None + + self.main_window_is_top_level: bool = False + + # Windows that size tailor themselves to exact screen dimensions + # can pass True for this. Generally this only applies to small + # ui scale and at larger scales windows simply fit in the + # virtual safe area. + self.refreshes_on_screen_size_changes = refresh_on_screen_size_changes + + # Windows can be flagged as auxiliary when not related to the + # main UI task at hand. UI code may choose to handle auxiliary + # windows in special ways, such as by implicitly replacing + # existing auxiliary windows with new ones instead of keeping + # old ones as back targets. + self.main_window_is_auxiliary: bool = False + + self._main_window_transition = transition + self._main_window_origin_widget = origin_widget + super().__init__(root_widget, cleanupcheck) + + scale_origin: tuple[float, float] | None + if origin_widget is not None: + self._main_window_transition_out = 'out_scale' + scale_origin = origin_widget.get_screen_space_center() + transition = 'in_scale' + else: + self._main_window_transition_out = 'out_right' + scale_origin = None + _bauiv1.containerwidget( + edit=root_widget, + transition=transition, + scale_origin_stack_offset=scale_origin, + ) + + def main_window_close(self, transition: str | None = None) -> None: + """Get window transitioning out if still alive.""" + + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + # Transition ourself out. + try: + self.on_main_window_close() + except Exception: + logging.exception('Error in on_main_window_close() for %s.', self) + + # Note: normally transition of None means instant, but we use + # that to mean 'do the default' so we support a special + # 'instant' string.. + if transition == 'instant': + self._root_widget.delete() + else: + _bauiv1.containerwidget( + edit=self._root_widget, + transition=( + self._main_window_transition_out + if transition is None + else transition + ), + ) + + def main_window_has_control(self) -> bool: + """Is this MainWindow allowed to change the global main window? + + It is a good idea to make sure this is True before calling + main_window_replace(). This prevents fluke UI breakage such as + multiple simultaneous events causing a MainWindow to spawn + multiple replacements for itself. + """ + # We are allowed to change main windows if we are the current one + # AND our underlying widget is still alive and not transitioning out. + return ( + babase.app.ui_v1.get_main_window() is self + and bool(self._root_widget) + and not self._root_widget.transitioning_out + ) + + def main_window_back(self) -> None: + """Move back in the main window stack. + + Is a no-op if the main window does not have control; + no need to check main_window_has_control() first. + """ + + # Users should always check main_window_has_control() before + # calling us. Error if it seems they did not. + if not self.main_window_has_control(): + return + + uiv1 = babase.app.ui_v1 + + # Get the 'back' window coming in. + if not self.main_window_is_top_level: + + back_state = self.main_window_back_state + if back_state is None: + raise RuntimeError( + f'Main window {self} provides no back-state.' + ) + + # Valid states should have values here. + assert back_state.is_top_level is not None + assert back_state.is_auxiliary is not None + assert back_state.window_type is not None + + backwin = back_state.create_window(transition='in_left') + + uiv1.set_main_window( + backwin, + from_window=self, + is_back=True, + back_state=back_state, + suppress_warning=True, + ) + + # Transition ourself out. + self.main_window_close() + + def main_window_replace( + self, + new_window: MainWindow, + back_state: MainWindowState | None = None, + is_auxiliary: bool = False, + ) -> None: + """Replace ourself with a new MainWindow.""" + + # Users should always check main_window_has_control() *before* + # creating new MainWindows and passing them in here. Kill the + # passed window and Error if it seems they did not. + if not self.main_window_has_control(): + new_window.get_root_widget().delete() + raise RuntimeError( + f'main_window_replace() called on a not-in-control window' + f' ({self}); always check main_window_has_control() before' + f' calling main_window_replace().' + ) + + # Just shove the old out the left to give the feel that we're + # adding to the nav stack. + transition = 'out_left' + + # Transition ourself out. + try: + self.on_main_window_close() + except Exception: + logging.exception('Error in on_main_window_close() for %s.', self) + + _bauiv1.containerwidget(edit=self._root_widget, transition=transition) + babase.app.ui_v1.set_main_window( + new_window, + from_window=self, + back_state=back_state, + is_auxiliary=is_auxiliary, + suppress_warning=True, + ) + + def on_main_window_close(self) -> None: + """Called before transitioning out a main window. + + A good opportunity to save window state/etc. + """ + + def get_main_window_state(self) -> MainWindowState: + """Return a WindowState to recreate this window, if supported.""" + raise NotImplementedError() + + +class MainWindowState: + """Persistent state for a specific MainWindow. + + This allows MainWindows to be automatically recreated for back-button + purposes, when switching app-modes, etc. + """ + + def __init__(self) -> None: + # The window that back/cancel navigation should take us to. + self.parent: MainWindowState | None = None + self.is_top_level: bool | None = None + self.is_auxiliary: bool | None = None + self.window_type: type[MainWindow] | None = None + self.selection: str | None = None + + def create_window( + self, + transition: Literal['in_right', 'in_left', 'in_scale'] | None = None, + origin_widget: bauiv1.Widget | None = None, + ) -> MainWindow: + """Create a window based on this state. + + WindowState child classes should override this to recreate their + particular type of window. + """ + raise NotImplementedError() + + +class BasicMainWindowState(MainWindowState): + """A basic MainWindowState holding a lambda to recreate a MainWindow.""" + + def __init__( + self, + create_call: Callable[ + [ + Literal['in_right', 'in_left', 'in_scale'] | None, + bauiv1.Widget | None, + ], + bauiv1.MainWindow, + ], + ) -> None: + super().__init__() + self.create_call = create_call + + @override + def create_window( + self, + transition: Literal['in_right', 'in_left', 'in_scale'] | None = None, + origin_widget: bauiv1.Widget | None = None, + ) -> bauiv1.MainWindow: + return self.create_call(transition, origin_widget) + + @dataclass class UICleanupCheck: """Holds info about a uicleanupcheck target.""" @@ -50,127 +301,8 @@ class UICleanupCheck: widget_death_time: float | None -class UILocation: - """Defines a specific 'place' in the UI the user can navigate to. - - Category: User Interface Classes - """ - - def __init__(self) -> None: - pass - - def save_state(self) -> None: - """Serialize this instance's state to a dict.""" - - def restore_state(self) -> None: - """Restore this instance's state from a dict.""" - - def push_location(self, location: str) -> None: - """Push a new location to the stack and transition to it.""" - - -class UILocationWindow(UILocation): - """A UILocation consisting of a single root window widget. - - Category: User Interface Classes - """ - - def __init__(self) -> None: - super().__init__() - self._root_widget: bauiv1.Widget | None = None - - def get_root_widget(self) -> bauiv1.Widget: - """Return the root widget for this window.""" - assert self._root_widget is not None - return self._root_widget - - -class UIEntry: - """State for a UILocation on the stack.""" - - def __init__(self, name: str, controller: UIController): - self._name = name - self._state = None - self._args = None - self._instance: UILocation | None = None - self._controller = weakref.ref(controller) - - def create(self) -> None: - """Create an instance of our UI.""" - cls = self._get_class() - self._instance = cls() - - def destroy(self) -> None: - """Transition out our UI if it exists.""" - if self._instance is None: - return - print('WOULD TRANSITION OUT', self._name) - - def _get_class(self) -> Type[UILocation]: - """Returns the UI class our name points to.""" - # pylint: disable=cyclic-import - - # TEMP HARD CODED - WILL REPLACE THIS WITH BA_META LOOKUPS. - if self._name == 'mainmenu': - # Shut pylint up. - if bool(False): - return UILocation - raise RuntimeError('FIXME UNIMPLEMENTED') - # from bauiv1lib import mainmenu - # return cast(Type[UILocation], mainmenu.MainMenuWindow) - - raise ValueError('unknown ui class ' + str(self._name)) - - -class UIController: - """Wrangles bauiv1.UILocations. - - Category: User Interface Classes - """ - - def __init__(self) -> None: - # FIXME: document why we have separate stacks for game and menu... - self._main_stack_game: list[UIEntry] = [] - self._main_stack_menu: list[UIEntry] = [] - - # This points at either the game or menu stack. - self._main_stack: list[UIEntry] | None = None - - # There's only one of these since we don't need to preserve its state - # between sessions. - self._dialog_stack: list[UIEntry] = [] - - def show_main_menu(self, in_game: bool = True) -> None: - """Show the main menu, clearing other UIs from location stacks.""" - self._main_stack = [] - self._dialog_stack = [] - self._main_stack = ( - self._main_stack_game if in_game else self._main_stack_menu - ) - self._main_stack.append(UIEntry('mainmenu', self)) - self._update_ui() - - def _update_ui(self) -> None: - """Instantiate the topmost ui in our stacks.""" - - # First tell any existing UIs to get outta here. - for stack in (self._dialog_stack, self._main_stack): - assert stack is not None - for entry in stack: - entry.destroy() - - # Now create the topmost one if there is one. - entrynew = ( - self._dialog_stack[-1] - if self._dialog_stack - else self._main_stack[-1] if self._main_stack else None - ) - if entrynew is not None: - entrynew.create() - - def uicleanupcheck(obj: Any, widget: bauiv1.Widget) -> None: - """Add a check to ensure a widget-owning object gets cleaned up properly. + """Checks to ensure a widget-owning object gets cleaned up properly. Category: User Interface Functions @@ -232,9 +364,11 @@ def ui_upkeep() -> None: print( 'WARNING:', obj, - 'is still alive 5 second after its widget died;' - ' you might have a memory leak. See efro.debug module' - ' for tools to help debug this.', + 'is still alive 5 second after its Widget died;' + ' you might have a memory leak. Look for circular' + ' references or outside things referencing your Window' + ' class instance. See efro.debug module' + ' for tools that can help debug this sort of thing.', ) else: remainingchecks.append(check) diff --git a/dist/ba_data/python/bauiv1lib/__init__.py b/dist/ba_data/python/bauiv1lib/__init__.py index f7720bd..454e03f 100644 --- a/dist/ba_data/python/bauiv1lib/__init__.py +++ b/dist/ba_data/python/bauiv1lib/__init__.py @@ -2,4 +2,4 @@ # """Library of stuff using the bauiv1 api: windows, custom controls, etc.""" -# ba_meta require api 8 +# ba_meta require api 9 diff --git a/dist/ba_data/python/bauiv1lib/account/__init__.py b/dist/ba_data/python/bauiv1lib/account/__init__.py index 5ce2650..1d25ed0 100644 --- a/dist/ba_data/python/bauiv1lib/account/__init__.py +++ b/dist/ba_data/python/bauiv1lib/account/__init__.py @@ -1,38 +1,3 @@ # Released under the MIT License. See LICENSE for details. # """UI functionality related to accounts.""" - -from __future__ import annotations - -import bauiv1 as bui - - -def show_sign_in_prompt(account_type: str | None = None) -> None: - """Bring up a prompt telling the user they must sign in.""" - from bauiv1lib.confirm import ConfirmWindow - from bauiv1lib.account import settings - - if account_type == 'Google Play': - - def _do_sign_in() -> None: - plus = bui.app.plus - assert plus is not None - plus.sign_in_v1('Google Play') - - ConfirmWindow( - bui.Lstr(resource='notSignedInGooglePlayErrorText'), - _do_sign_in, - ok_text=bui.Lstr(resource='accountSettingsWindow.signInText'), - width=460, - height=130, - ) - else: - ConfirmWindow( - bui.Lstr(resource='notSignedInErrorText'), - lambda: settings.AccountSettingsWindow( - modal=True, close_once_signed_in=True - ), - ok_text=bui.Lstr(resource='accountSettingsWindow.signInText'), - width=460, - height=130, - ) diff --git a/dist/ba_data/python/bauiv1lib/account/link.py b/dist/ba_data/python/bauiv1lib/account/link.py index 58828ad..d19ed06 100644 --- a/dist/ba_data/python/bauiv1lib/account/link.py +++ b/dist/ba_data/python/bauiv1lib/account/link.py @@ -105,13 +105,13 @@ class AccountLinkWindow(bui.Window): ) def _generate_press(self) -> None: - from bauiv1lib import account + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() + show_sign_in_prompt() return bui.screenmessage( bui.Lstr(resource='gatherWindow.requestingAPromoCodeText'), diff --git a/dist/ba_data/python/bauiv1lib/account/settings.py b/dist/ba_data/python/bauiv1lib/account/settings.py index 9476f32..b2d02b2 100644 --- a/dist/ba_data/python/bauiv1lib/account/settings.py +++ b/dist/ba_data/python/bauiv1lib/account/settings.py @@ -7,12 +7,14 @@ from __future__ import annotations import time import logging +from typing import override from bacommon.cloud import WebLocation from bacommon.login import LoginType import bacommon.cloud import bauiv1 as bui +from bauiv1lib.connectivity import wait_for_connectivity # These days we're directing people to the web based account settings # for V2 account linking and trying to get them to disconnect remaining @@ -20,17 +22,17 @@ import bauiv1 as bui FORCE_ENABLE_V1_LINKING = False -class AccountSettingsWindow(bui.Window): +class AccountSettingsWindow(bui.MainWindow): """Window for account related functionality.""" def __init__( self, - transition: str = 'in_right', - modal: bool = False, + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, close_once_signed_in: bool = False, ): # pylint: disable=too-many-statements + # pylint: disable=too-many-locals plus = bui.app.plus assert plus is not None @@ -46,18 +48,7 @@ class AccountSettingsWindow(bui.Window): self._explicitly_signed_out_of_gpgs = False - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - self._r = 'accountSettingsWindow' - self._modal = modal self._needs_refresh = False self._v1_signed_in = plus.get_v1_account_state() == 'signed_in' self._v1_account_state_num = plus.get_v1_account_state_num() @@ -71,19 +62,39 @@ class AccountSettingsWindow(bui.Window): assert app.classic is not None uiscale = app.ui_v1.uiscale - self._width = 860 if uiscale is bui.UIScale.SMALL else 660 - x_offs = 100 if uiscale is bui.UIScale.SMALL else 0 + self._width = 980 if uiscale is bui.UIScale.SMALL else 660 self._height = ( - 390 + 600 if uiscale is bui.UIScale.SMALL else 430 if uiscale is bui.UIScale.MEDIUM else 490 ) + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + + scale = ( + 1.9 + if uiscale is bui.UIScale.SMALL + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 80, screensize[0] / scale) + target_height = min(self._height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 33 + scroll_bottom = yoffs - 61 - self._scroll_height + self._sign_in_button = None self._sign_in_text = None - self._scroll_width = self._width - (100 + x_offs * 2) - self._scroll_height = self._height - 120 self._sub_width = self._scroll_width - 20 # Determine which sign-in/sign-out buttons we should show. @@ -98,62 +109,63 @@ class AccountSettingsWindow(bui.Window): # Always want to show our web-based v2 login option. self._show_sign_in_buttons.append('V2Proxy') - # Legacy v1 device accounts available only if the user - # has explicitly enabled deprecated login types. + # Legacy v1 device accounts available only if the user has + # explicitly enabled deprecated login types. if bui.app.config.resolve('Show Deprecated Login Types'): self._show_sign_in_buttons.append('Device') - top_extra = 15 if uiscale is bui.UIScale.SMALL else 0 super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.09 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -19) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - if uiscale is bui.UIScale.SMALL and app.ui_v1.use_toolbars: + if uiscale is bui.UIScale.SMALL: self._back_button = None bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back + edit=self._root_widget, on_cancel_call=self.main_window_back ) else: self._back_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(51 + x_offs, self._height - 62), + position=(51, yoffs - 52.0), size=(120, 60), scale=0.8, text_scale=1.2, autoselect=True, - label=bui.Lstr( - resource='doneText' if self._modal else 'backText' - ), - button_type='regular' if self._modal else 'back', - on_activate_call=self._back, + label=bui.Lstr(resource='backText'), + button_type='back', + on_activate_call=self.main_window_back, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) - if not self._modal: - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 56), - label=bui.charstr(bui.SpecialChar.BACK), - ) + bui.buttonwidget( + edit=btn, + button_type='backSmall', + size=(60, 56), + label=bui.charstr(bui.SpecialChar.BACK), + ) + titleyoffs = -45.0 if uiscale is bui.UIScale.SMALL else -28.0 + titlescale = 0.7 if uiscale is bui.UIScale.SMALL else 1.0 bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 41), + position=( + self._width * 0.5, + yoffs + titleyoffs, + ), size=(0, 0), text=bui.Lstr(resource=f'{self._r}.titleText'), color=app.ui_v1.title_color, + scale=titlescale, maxwidth=self._width - 340, h_align='center', v_align='center', @@ -162,31 +174,45 @@ class AccountSettingsWindow(bui.Window): self._scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, - position=( - (self._width - self._scroll_width) * 0.5, - self._height - 65 - self._scroll_height, - ), size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + scroll_bottom, + ), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, + border_opacity=0.4, ) self._subcontainer: bui.Widget | None = None self._refresh() self._restore_state() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _update(self) -> None: plus = bui.app.plus assert plus is not None # If they want us to close once we're signed in, do so. if self._close_once_signed_in and self._v1_signed_in: - self._back() + self.main_window_back() return # Hmm should update this to use get_account_state_num. - # Theoretically if we switch from one signed-in account to another - # in the background this would break. + # Theoretically if we switch from one signed-in account to + # another in the background this would break. v1_account_state_num = plus.get_v1_account_state_num() v1_account_state = plus.get_v1_account_state() show_legacy_unlink_button = self._should_show_legacy_unlink_button() @@ -201,8 +227,8 @@ class AccountSettingsWindow(bui.Window): self._show_legacy_unlink_button = show_legacy_unlink_button self._refresh() - # Go ahead and refresh some individual things - # that may change under us. + # Go ahead and refresh some individual things that may change + # under us. self._update_linked_accounts_text() self._update_unlink_accounts_button() self._refresh_campaign_progress_text() @@ -215,7 +241,6 @@ class AccountSettingsWindow(bui.Window): # pylint: disable=too-many-branches # pylint: disable=too-many-locals # pylint: disable=cyclic-import - from bauiv1lib import confirm plus = bui.app.plus assert plus is not None @@ -316,54 +341,57 @@ class AccountSettingsWindow(bui.Window): show_game_service_button = game_center_active game_service_button_space = 60.0 - # Phasing this out. - show_what_is_v2 = False - # show_what_is_v2 = self._v1_signed_in and v1_account_type == 'V2' - # Phasing this out (for V2 accounts at least). show_linked_accounts_text = ( self._v1_signed_in and v1_account_type != 'V2' ) linked_accounts_text_space = 60.0 - # Always show achievements except in the game-center case where - # its unified UI covers them. - show_achievements_button = self._v1_signed_in and not game_center_active - achievements_button_space = 60.0 - - show_achievements_text = ( - self._v1_signed_in and not show_achievements_button - ) + # Update: No longer showing this since its visible on main + # toolbar. + show_achievements_text = False achievements_text_space = 27.0 show_leaderboards_button = self._v1_signed_in and gpgs_active leaderboards_button_space = 60.0 - show_campaign_progress = self._v1_signed_in + # Update: No longer showing this; trying to get progress type + # stuff out of the account panel. + # show_campaign_progress = self._v1_signed_in + show_campaign_progress = False campaign_progress_space = 27.0 - show_tickets = self._v1_signed_in + # show_tickets = self._v1_signed_in + show_tickets = False tickets_space = 27.0 - show_reset_progress_button = False - reset_progress_button_space = 70.0 + show_manage_account_button = primary_v2_account is not None + manage_account_button_space = 70.0 - show_manage_v2_account_button = primary_v2_account is not None - manage_v2_account_button_space = 100.0 + show_create_account_button = show_v2_proxy_sign_in_button + create_account_button_space = 70.0 - show_delete_account_button = primary_v2_account is not None - delete_account_button_space = 80.0 - - show_player_profiles_button = self._v1_signed_in - player_profiles_button_space = ( - 70.0 if show_manage_v2_account_button else 100.0 + # Apple asks us to make a delete-account button directly + # available in the UI. Currently disabling this elsewhere + # however as I feel that poking 'Manage Account' and scrolling + # down to 'Delete Account' is not hard to find. + show_delete_account_button = primary_v2_account is not None and ( + bui.app.classic is not None + and bui.app.classic.platform == 'mac' + and bui.app.classic.subplatform == 'appstore' ) + delete_account_button_space = 70.0 show_link_accounts_button = self._v1_signed_in and ( primary_v2_account is None or FORCE_ENABLE_V1_LINKING ) link_accounts_button_space = 70.0 + show_v1_obsolete_note = self._v1_signed_in and ( + primary_v2_account is None + ) + v1_obsolete_note_space = 80.0 + show_unlink_accounts_button = show_link_accounts_button unlink_accounts_button_space = 90.0 @@ -376,7 +404,7 @@ class AccountSettingsWindow(bui.Window): show_sign_out_button = primary_v2_account is not None or ( self._v1_signed_in and v1_account_type == 'Local' ) - sign_out_button_space = 80.0 + sign_out_button_space = 70.0 # We can show cancel if we're either waiting on an adapter to # provide us with v2 credentials or waiting for those @@ -409,8 +437,6 @@ class AccountSettingsWindow(bui.Window): self._sub_height += linked_accounts_text_space if show_achievements_text: self._sub_height += achievements_text_space - if show_achievements_button: - self._sub_height += achievements_button_space if show_leaderboards_button: self._sub_height += leaderboards_button_space if show_campaign_progress: @@ -419,14 +445,14 @@ class AccountSettingsWindow(bui.Window): self._sub_height += tickets_space if show_sign_in_benefits: self._sub_height += sign_in_benefits_space - if show_reset_progress_button: - self._sub_height += reset_progress_button_space - if show_manage_v2_account_button: - self._sub_height += manage_v2_account_button_space - if show_player_profiles_button: - self._sub_height += player_profiles_button_space + if show_manage_account_button: + self._sub_height += manage_account_button_space + if show_create_account_button: + self._sub_height += create_account_button_space if show_link_accounts_button: self._sub_height += link_accounts_button_space + if show_v1_obsolete_note: + self._sub_height += v1_obsolete_note_space if show_unlink_accounts_button: self._sub_height += unlink_accounts_button_space if show_v2_link_info: @@ -444,7 +470,6 @@ class AccountSettingsWindow(bui.Window): size=(self._sub_width, self._sub_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) @@ -452,8 +477,6 @@ class AccountSettingsWindow(bui.Window): v = self._sub_height - 10.0 assert bui.app.classic is not None - self._account_name_what_is_text: bui.Widget | None - self._account_name_what_is_y = 0.0 self._account_name_text: bui.Widget | None if show_signed_in_as: v -= signed_in_as_space * 0.2 @@ -485,32 +508,6 @@ class AccountSettingsWindow(bui.Window): v_align='center', ) - if show_what_is_v2: - self._account_name_what_is_y = v - 23.0 - self._account_name_what_is_text = bui.textwidget( - parent=self._subcontainer, - position=(0.0, self._account_name_what_is_y), - size=(220.0, 60), - text=bui.Lstr( - value='${WHAT} -->', - subs=[('${WHAT}', bui.Lstr(resource='whatIsThisText'))], - ), - scale=0.6, - color=(0.3, 0.7, 0.05), - maxwidth=130.0, - h_align='right', - v_align='center', - autoselect=True, - selectable=True, - on_activate_call=show_what_is_v2_page, - click_activate=True, - glow_type='uniform', - ) - if first_selectable is None: - first_selectable = self._account_name_what_is_text - else: - self._account_name_what_is_text = None - self._refresh_account_name_text() v -= signed_in_as_space * 0.4 @@ -565,7 +562,6 @@ class AccountSettingsWindow(bui.Window): else: self._account_name_text = None - self._account_name_what_is_text = None if self._back_button is None: bbtn = bui.get_special_widget('back_button') @@ -641,11 +637,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) bui.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -683,11 +677,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) bui.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -752,11 +744,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) bui.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -821,21 +811,39 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) bui.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None - if show_manage_v2_account_button: - button_width = 300 - v -= manage_v2_account_button_space - self._manage_v2_button = btn = bui.buttonwidget( + if show_v1_obsolete_note: + v -= v1_obsolete_note_space + bui.textwidget( parent=self._subcontainer, - position=((self._sub_width - button_width) * 0.5, v + 30), + h_align='center', + v_align='center', + size=(0, 0), + position=(self._sub_width * 0.5, v + 35.0), + text=( + 'YOU ARE SIGNED IN WITH A V1 ACCOUNT.\n' + 'THESE ARE NO LONGER SUPPORTED AND MANY\n' + 'FEATURES WILL NOT WORK. PLEASE SWITCH TO\n' + 'A V2 ACCOUNT OR UPGRADE THIS ONE.' + ), + maxwidth=self._sub_width * 0.8, + color=(1, 0, 0), + shadow=1.0, + flatness=1.0, + ) + + if show_manage_account_button: + button_width = 300 + v -= manage_account_button_space + self._manage_button = btn = bui.buttonwidget( + parent=self._subcontainer, + position=((self._sub_width - button_width) * 0.5, v), autoselect=True, size=(button_width, 60), label=bui.Lstr(resource=f'{self._r}.manageAccountText'), @@ -846,35 +854,30 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) - if show_player_profiles_button: + if show_create_account_button: button_width = 300 - v -= player_profiles_button_space - self._player_profiles_button = btn = bui.buttonwidget( + v -= create_account_button_space + self._create_button = btn = bui.buttonwidget( parent=self._subcontainer, - position=((self._sub_width - button_width) * 0.5, v + 30), + position=((self._sub_width - button_width) * 0.5, v - 30), autoselect=True, size=(button_width, 60), - label=bui.Lstr(resource='playerProfilesWindow.titleText'), + label=bui.Lstr(resource=f'{self._r}.createAnAccountText'), color=(0.55, 0.5, 0.6), - icon=bui.gettexture('cuteSpaz'), textcolor=(0.75, 0.7, 0.8), - on_activate_call=self._player_profiles_press, + on_activate_call=bui.WeakCall(self._on_create_account_press), ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) - bui.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=0) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) + bui.widget(edit=btn, left_widget=bbtn) # the button to go to OS-Specific leaderboards/high-score-lists/etc. if show_game_service_button: @@ -904,11 +907,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) v -= game_service_button_space * 0.4 else: @@ -931,51 +932,13 @@ class AccountSettingsWindow(bui.Window): else: self._achievements_text = None - self._achievements_button: bui.Widget | None - if show_achievements_button: - button_width = 300 - v -= achievements_button_space * 0.85 - self._achievements_button = btn = bui.buttonwidget( - parent=self._subcontainer, - position=((self._sub_width - button_width) * 0.5, v), - color=(0.55, 0.5, 0.6), - textcolor=(0.75, 0.7, 0.8), - autoselect=True, - icon=bui.gettexture( - 'googlePlayAchievementsIcon' - if gpgs_active - else 'achievementsIcon' - ), - icon_color=( - (0.8, 0.95, 0.7) if gpgs_active else (0.85, 0.8, 0.9) - ), - on_activate_call=( - self._on_custom_achievements_press - if gpgs_active - else self._on_achievements_press - ), - size=(button_width, 50), - label='', - ) - if first_selectable is None: - first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) - bui.widget(edit=btn, left_widget=bbtn) - v -= achievements_button_space * 0.15 - else: - self._achievements_button = None - - if show_achievements_text or show_achievements_button: + if show_achievements_text: self._refresh_achievements() self._leaderboards_button: bui.Widget | None if show_leaderboards_button: button_width = 300 - v -= leaderboards_button_space * 0.85 + v -= leaderboards_button_space self._leaderboards_button = btn = bui.buttonwidget( parent=self._subcontainer, position=((self._sub_width - button_width) * 0.5, v), @@ -990,13 +953,10 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn) - v -= leaderboards_button_space * 0.15 else: self._leaderboards_button = None @@ -1039,41 +999,9 @@ class AccountSettingsWindow(bui.Window): self._tickets_text = None # bit of spacing before the reset/sign-out section - v -= 5 + # v -= 5 - button_width = 250 - if show_reset_progress_button: - confirm_text = ( - bui.Lstr(resource=f'{self._r}.resetProgressConfirmText') - if self._can_reset_achievements - else bui.Lstr( - resource=f'{self._r}.resetProgressConfirmNoAchievementsText' - ) - ) - v -= reset_progress_button_space - self._reset_progress_button = btn = bui.buttonwidget( - parent=self._subcontainer, - position=((self._sub_width - button_width) * 0.5, v), - color=(0.55, 0.5, 0.6), - textcolor=(0.75, 0.7, 0.8), - autoselect=True, - size=(button_width, 60), - label=bui.Lstr(resource=f'{self._r}.resetProgressText'), - on_activate_call=lambda: confirm.ConfirmWindow( - text=confirm_text, - width=500, - height=200, - action=self._reset_progress, - ), - ) - if first_selectable is None: - first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) - bui.widget(edit=btn, left_widget=bbtn) + button_width = 300 self._linked_accounts_text: bui.Widget | None if show_linked_accounts_text: @@ -1133,11 +1061,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=50) self._unlink_accounts_button: bui.Widget | None @@ -1165,11 +1091,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=50) self._update_unlink_accounts_button() else: @@ -1235,11 +1159,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=15) if show_cancel_sign_in_button: @@ -1256,11 +1178,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=15) if show_delete_account_button: @@ -1277,11 +1197,9 @@ class AccountSettingsWindow(bui.Window): ) if first_selectable is None: first_selectable = btn - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, right_widget=bui.get_special_widget('squad_button') + ) bui.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=15) # Whatever the topmost selectable thing is, we want it to scroll all @@ -1313,38 +1231,27 @@ class AccountSettingsWindow(bui.Window): else: logging.warning('show_game_service_ui requires plus feature-set.') - def _on_achievements_press(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib import achievements - - assert self._achievements_button is not None - achievements.AchievementsWindow( - position=self._achievements_button.get_screen_space_center() - ) - - def _on_what_is_v2_press(self) -> None: - show_what_is_v2_page() - def _on_manage_account_press(self) -> None: self._do_manage_account_press(WebLocation.ACCOUNT_EDITOR) + def _on_create_account_press(self) -> None: + bui.open_url('https://ballistica.net/createaccount') + def _on_delete_account_press(self) -> None: self._do_manage_account_press(WebLocation.ACCOUNT_DELETE_SECTION) def _do_manage_account_press(self, weblocation: WebLocation) -> None: + # If we're still waiting for our master-server connection, + # keep the user informed of this instead of rushing in and + # failing immediately. + wait_for_connectivity( + on_connected=lambda: self._do_manage_account(weblocation) + ) + + def _do_manage_account(self, weblocation: WebLocation) -> None: plus = bui.app.plus assert plus is not None - # Preemptively fail if it looks like we won't be able to talk to - # the server anyway. - if not plus.cloud.connected: - bui.screenmessage( - bui.Lstr(resource='internal.unavailableNoConnectionText'), - color=(1, 0, 0), - ) - bui.getsound('error').play() - return - bui.screenmessage(bui.Lstr(resource='oneMomentText')) # We expect to have a v2 account signed in if we get here. @@ -1386,8 +1293,8 @@ class AccountSettingsWindow(bui.Window): plus = bui.app.plus assert plus is not None - # if this is not present, we haven't had contact from the server so - # let's not proceed.. + # If this is not present, we haven't had contact from the server + # so let's not proceed. if plus.get_v1_account_public_login_id() is None: return False accounts = plus.get_v1_account_misc_read_val_2('linkedAccounts', []) @@ -1404,7 +1311,8 @@ class AccountSettingsWindow(bui.Window): def _should_show_legacy_unlink_button(self) -> bool: plus = bui.app.plus - assert plus is not None + if plus is None: + return False # Only show this when fully signed in to a v2 account. if not self._v1_signed_in or plus.accounts.primary is None: @@ -1502,23 +1410,10 @@ class AccountSettingsWindow(bui.Window): name_str = '??' bui.textwidget(edit=self._account_name_text, text=name_str) - if self._account_name_what_is_text is not None: - swidth = bui.get_string_width(name_str, suppress_warning=True) - # Eww; number-fudging. Need to recalibrate this if - # account name scaling changes. - x = self._sub_width * 0.5 - swidth * 0.75 - 190 - - bui.textwidget( - edit=self._account_name_what_is_text, - position=(x, self._account_name_what_is_y), - ) def _refresh_achievements(self) -> None: assert bui.app.classic is not None - if ( - self._achievements_text is None - and self._achievements_button is None - ): + if self._achievements_text is None: return complete = sum( 1 if a.complete else 0 for a in bui.app.classic.ach.achievements @@ -1531,8 +1426,6 @@ class AccountSettingsWindow(bui.Window): if self._achievements_text is not None: bui.textwidget(edit=self._achievements_text, text=txt_final) - if self._achievements_button is not None: - bui.buttonwidget(edit=self._achievements_button, label=txt_final) def _link_accounts_press(self) -> None: # pylint: disable=cyclic-import @@ -1550,23 +1443,6 @@ class AccountSettingsWindow(bui.Window): AccountUnlinkWindow(origin_widget=self._unlink_accounts_button) - def _player_profiles_press(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.profile.browser import ProfileBrowserWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.app.ui_v1.set_main_menu_window( - ProfileBrowserWindow( - origin_widget=self._player_profiles_button - ).get_root_widget(), - from_window=self._root_widget, - ) - def _cancel_sign_in_press(self) -> None: # If we're waiting on an adapter to give us credentials, abort. self._signing_in_adapter = None @@ -1611,8 +1487,6 @@ class AccountSettingsWindow(bui.Window): bui.apptimer(0.1, bui.WeakCall(self._update)) def _sign_in_press(self, login_type: str | LoginType) -> None: - from bauiv1lib.connectivity import wait_for_connectivity - # If we're still waiting for our master-server connection, # keep the user informed of this instead of rushing in and # failing immediately. @@ -1674,14 +1548,14 @@ class AccountSettingsWindow(bui.Window): bui.getsound('error').play() else: # Success! Plug in these credentials which will begin - # verifying them and set our primary account-handle - # when finished. + # verifying them and set our primary account-handle when + # finished. plus = bui.app.plus assert plus is not None plus.accounts.set_primary_credentials(result.credentials) - # Special case - if the user has explicitly logged out and - # logged in again with GPGS via this button, warn them that + # Special case - if the user has explicitly signed out and + # signed in again with GPGS via this button, warn them that # they need to use the app if they want to switch to a # different GPGS account. if ( @@ -1706,12 +1580,9 @@ class AccountSettingsWindow(bui.Window): bui.apptimer(0.1, bui.WeakCall(self._update)) def _v2_proxy_sign_in_press(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.connectivity import wait_for_connectivity - - # If we're still waiting for our master-server connection, - # keep the user informed of this instead of rushing in and - # failing immediately. + # If we're still waiting for our master-server connection, keep + # the user informed of this instead of rushing in and failing + # immediately. wait_for_connectivity(on_connected=self._v2_proxy_sign_in) def _v2_proxy_sign_in(self) -> None: @@ -1721,44 +1592,6 @@ class AccountSettingsWindow(bui.Window): assert self._sign_in_v2_proxy_button is not None V2ProxySignInWindow(origin_widget=self._sign_in_v2_proxy_button) - def _reset_progress(self) -> None: - try: - assert bui.app.classic is not None - # FIXME: This would need to happen server-side these days. - if self._can_reset_achievements: - logging.warning('ach resets not wired up.') - # bui.app.config['Achievements'] = {} - # bui.reset_achievements() - campaign = bui.app.classic.getcampaign('Default') - campaign.reset() # also writes the config.. - campaign = bui.app.classic.getcampaign('Challenges') - campaign.reset() # also writes the config.. - except Exception: - logging.exception('Error resetting co-op campaign progress.') - - bui.getsound('shieldDown').play() - self._refresh() - - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.mainmenu import MainMenuWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - def _save_state(self) -> None: try: sel = self._root_widget.get_selected_child() @@ -1788,15 +1621,6 @@ class AccountSettingsWindow(bui.Window): logging.exception('Error restoring state for %s.', self) -def show_what_is_v2_page() -> None: - """Show the webpage describing V2 accounts.""" - plus = bui.app.plus - assert plus is not None - - bamasteraddr = plus.get_master_server_address(version=2) - bui.open_url(f'{bamasteraddr}/whatisv2') - - def show_what_is_legacy_unlinking_page() -> None: """Show the webpage describing legacy unlinking.""" plus = bui.app.plus diff --git a/dist/ba_data/python/bauiv1lib/account/signin.py b/dist/ba_data/python/bauiv1lib/account/signin.py new file mode 100644 index 0000000..0b22723 --- /dev/null +++ b/dist/ba_data/python/bauiv1lib/account/signin.py @@ -0,0 +1,51 @@ +# Released under the MIT License. See LICENSE for details. +# +"""UI functionality related to accounts.""" + +from __future__ import annotations + +import bauiv1 as bui + + +def show_sign_in_prompt() -> None: + """Bring up a prompt telling the user they must sign in.""" + from bauiv1lib.confirm import ConfirmWindow + + ConfirmWindow( + bui.Lstr(resource='notSignedInErrorText'), + _show_account_settings, + ok_text=bui.Lstr(resource='accountSettingsWindow.signInText'), + width=460, + height=130, + ) + + +def _show_account_settings() -> None: + from bauiv1lib.account.settings import AccountSettingsWindow + + # NOTE TO USERS: The code below is not the proper way to do things; + # whenever possible one should use a MainWindow's + # main_window_replace() or main_window_back() methods. We just need + # to do things a bit more manually in this case. + + prev_main_window = bui.app.ui_v1.get_main_window() + + # Special-case: If it seems we're already in the account window, do + # nothing. + if isinstance(prev_main_window, AccountSettingsWindow): + return + + # Set our new main window. + bui.app.ui_v1.set_main_window( + AccountSettingsWindow( + close_once_signed_in=True, + origin_widget=bui.get_special_widget('account_button'), + ), + from_window=False, + is_auxiliary=True, + suppress_warning=True, + ) + + # Transition out any previous main window. + if prev_main_window is not None: + prev_main_window.main_window_close() diff --git a/dist/ba_data/python/bauiv1lib/account/v2proxy.py b/dist/ba_data/python/bauiv1lib/account/v2proxy.py index d91f1f0..f84b3b3 100644 --- a/dist/ba_data/python/bauiv1lib/account/v2proxy.py +++ b/dist/ba_data/python/bauiv1lib/account/v2proxy.py @@ -34,9 +34,9 @@ class V2ProxySignInWindow(bui.Window): origin_widget.get_screen_space_center() ), scale=( - 1.25 + 1.16 if uiscale is bui.UIScale.SMALL - else 1.05 if uiscale is bui.UIScale.MEDIUM else 0.9 + else 1.0 if uiscale is bui.UIScale.MEDIUM else 0.9 ), ) ) diff --git a/dist/ba_data/python/bauiv1lib/account/viewer.py b/dist/ba_data/python/bauiv1lib/account/viewer.py index 2dbb1de..c97973c 100644 --- a/dist/ba_data/python/bauiv1lib/account/viewer.py +++ b/dist/ba_data/python/bauiv1lib/account/viewer.py @@ -23,6 +23,7 @@ class AccountViewerWindow(PopupWindow): def __init__( self, account_id: str, + *, profile_id: str | None = None, position: tuple[float, float] = (0.0, 0.0), scale: float | None = None, @@ -87,7 +88,7 @@ class AccountViewerWindow(PopupWindow): scale=0.6, text=bui.Lstr(resource='playerInfoText'), maxwidth=200, - color=(0.7, 0.7, 0.7, 0.7), + color=bui.app.ui_v1.title_color, ) self._scrollwidget = bui.scrollwidget( @@ -96,20 +97,26 @@ class AccountViewerWindow(PopupWindow): position=(30, 30), capture_arrows=True, simple_culling_v=10, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, autoselect=True) + # Note to self: Make sure to always update loading text and + # spinner visibility together. self._loading_text = bui.textwidget( parent=self._scrollwidget, scale=0.5, - text=bui.Lstr( - value='${A}...', - subs=[('${A}', bui.Lstr(resource='loadingText'))], - ), + text='', size=(self._width - 60, 100), h_align='center', v_align='center', ) + self._loading_spinner = bui.spinnerwidget( + parent=self.root_widget, + position=(self._width * 0.5, self._height * 0.5), + style='bomb', + size=48, + ) # In cases where the user most likely has a browser/email, lets # offer a 'report this user' button. @@ -226,9 +233,11 @@ class AccountViewerWindow(PopupWindow): edit=self._loading_text, text=bui.Lstr(resource='internal.unavailableNoConnectionText'), ) + bui.spinnerwidget(edit=self._loading_spinner, visible=False) else: try: self._loading_text.delete() + self._loading_spinner.delete() trophystr = '' try: trophystr = data['trophies'] diff --git a/dist/ba_data/python/bauiv1lib/achievements.py b/dist/ba_data/python/bauiv1lib/achievements.py index 228e773..b5e2f3f 100644 --- a/dist/ba_data/python/bauiv1lib/achievements.py +++ b/dist/ba_data/python/bauiv1lib/achievements.py @@ -6,54 +6,92 @@ from __future__ import annotations from typing import override -from bauiv1lib.popup import PopupWindow import bauiv1 as bui -class AchievementsWindow(PopupWindow): +class AchievementsWindow(bui.MainWindow): """Popup window to view achievements.""" def __init__( - self, position: tuple[float, float], scale: float | None = None + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-locals + # pylint: disable=too-many-statements + # pylint: disable=cyclic-import + from baclassic import ( + CHEST_APPEARANCE_DISPLAY_INFOS, + CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT, + ) + assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - if scale is None: - scale = ( - 2.3 - if uiscale is bui.UIScale.SMALL - else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 - ) - self._transitioning_out = False - self._width = 450 + + self._width = 700 if uiscale is bui.UIScale.SMALL else 550 self._height = ( - 300 + 450 if uiscale is bui.UIScale.SMALL else 370 if uiscale is bui.UIScale.MEDIUM else 450 ) - bg_color = (0.5, 0.4, 0.6) - # creates our _root_widget + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.7 + if uiscale is bui.UIScale.SMALL + else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.2 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + scroll_width = target_width + scroll_height = target_height - 25 + scroll_bottom = yoffs - 54 - scroll_height + super().__init__( - position=position, - size=(self._width, self._height), - scale=scale, - bg_color=bg_color, + root_widget=bui.containerwidget( + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' + if uiscale is bui.UIScale.SMALL + else 'menu_full' + ), + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._cancel_button = bui.buttonwidget( - parent=self.root_widget, - position=(50, self._height - 30), - size=(50, 50), - scale=0.5, - label='', - color=bg_color, - on_activate_call=self._on_cancel_press, - autoselect=True, - icon=bui.gettexture('crossOut'), - iconscale=1.2, - ) + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + self._back_button = None + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + autoselect=True, + position=(50, yoffs - 48), + size=(60, 60), + scale=0.6, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) achievements = bui.app.classic.ach.achievements num_complete = len([a for a in achievements if a.complete]) @@ -66,32 +104,41 @@ class AchievementsWindow(PopupWindow): ], ) self._title_text = bui.textwidget( - parent=self.root_widget, - position=(self._width * 0.5, self._height - 20), + parent=self._root_widget, + position=( + self._width * 0.5, + yoffs - (42 if uiscale is bui.UIScale.SMALL else 30), + ), size=(0, 0), h_align='center', v_align='center', scale=0.6, text=txt_final, maxwidth=200, - color=(1, 1, 1, 0.4), + color=bui.app.ui_v1.title_color, ) self._scrollwidget = bui.scrollwidget( - parent=self.root_widget, - size=(self._width - 60, self._height - 70), - position=(30, 30), + parent=self._root_widget, + size=(scroll_width, scroll_height), + position=(self._width * 0.5 - scroll_width * 0.5, scroll_bottom), capture_arrows=True, simple_culling_v=10, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, autoselect=True) + if uiscale is bui.UIScale.SMALL: + bui.widget( + edit=self._scrollwidget, + left_widget=bui.get_special_widget('back_button'), + ) bui.containerwidget( - edit=self.root_widget, cancel_button=self._cancel_button + edit=self._root_widget, cancel_button=self._back_button ) incr = 36 - sub_width = self._width - 90 + sub_width = scroll_width - 25 sub_height = 40 + len(achievements) * incr eq_rsrc = 'coopSelectWindow.powerRankingPointsEqualsText' @@ -174,6 +221,25 @@ class AchievementsWindow(PopupWindow): h_align='left', v_align='center', ) + chest_type = ach.get_award_chest_type() + chestdisplayinfo = CHEST_APPEARANCE_DISPLAY_INFOS.get( + chest_type, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT + ) + chestsize = 24.0 + bui.imagewidget( + parent=self._subcontainer, + opacity=0.0 if complete else 1.0, + position=( + sub_width * 0.92 - 40.0 - chestsize * 0.5, + sub_height - 20 - incr * i - chestsize * 0.5, + ), + size=(chestsize, chestsize), + color=chestdisplayinfo.color, + texture=bui.gettexture(chestdisplayinfo.texclosed), + tint_texture=bui.gettexture(chestdisplayinfo.texclosedtint), + tint_color=chestdisplayinfo.tint, + tint2_color=chestdisplayinfo.tint2, + ) pts = ach.power_ranking_value bui.textwidget( @@ -223,15 +289,12 @@ class AchievementsWindow(PopupWindow): v_align='center', ) - def _on_cancel_press(self) -> None: - self._transition_out() - - def _transition_out(self) -> None: - if not self._transitioning_out: - self._transitioning_out = True - bui.containerwidget(edit=self.root_widget, transition='out_scale') - @override - def on_popup_cancel(self) -> None: - bui.getsound('swish').play() - self._transition_out() + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) diff --git a/dist/ba_data/python/bauiv1lib/appinvite.py b/dist/ba_data/python/bauiv1lib/appinvite.py index 4bcbbcb..48857c3 100644 --- a/dist/ba_data/python/bauiv1lib/appinvite.py +++ b/dist/ba_data/python/bauiv1lib/appinvite.py @@ -29,7 +29,7 @@ class ShowFriendCodeWindow(bui.Window): color=(0.45, 0.63, 0.15), transition='in_scale', scale=( - 1.7 + 1.5 if uiscale is bui.UIScale.SMALL else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 ), diff --git a/dist/ba_data/python/bauiv1lib/characterpicker.py b/dist/ba_data/python/bauiv1lib/characterpicker.py index 5e6ad30..835f3f0 100644 --- a/dist/ba_data/python/bauiv1lib/characterpicker.py +++ b/dist/ba_data/python/bauiv1lib/characterpicker.py @@ -14,6 +14,18 @@ if TYPE_CHECKING: from typing import Any, Sequence +class CharacterPickerDelegate: + """Delegate for character-picker.""" + + def on_character_picker_pick(self, character: str) -> None: + """Called when a character is selected.""" + raise NotImplementedError() + + def on_character_picker_get_more_press(self) -> None: + """Called when the 'get more characters' button is pressed.""" + raise NotImplementedError() + + class CharacterPicker(PopupWindow): """Popup window for selecting characters.""" @@ -21,7 +33,7 @@ class CharacterPicker(PopupWindow): self, parent: bui.Widget, position: tuple[float, float] = (0.0, 0.0), - delegate: Any = None, + delegate: CharacterPickerDelegate | None = None, scale: float | None = None, offset: tuple[float, float] = (0.0, 0.0), tint_color: Sequence[float] = (1.0, 1.0, 1.0), @@ -29,6 +41,7 @@ class CharacterPicker(PopupWindow): selected_character: str | None = None, ): # pylint: disable=too-many-locals + # pylint: disable=too-many-positional-arguments from bascenev1lib.actor import spazappearance assert bui.app.classic is not None @@ -180,8 +193,7 @@ class CharacterPicker(PopupWindow): bui.widget(edit=btn, show_buffer_top=30, show_buffer_bottom=30) def _on_store_press(self) -> None: - from bauiv1lib.account import show_sign_in_prompt - from bauiv1lib.store.browser import StoreBrowserWindow + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None @@ -189,12 +201,11 @@ class CharacterPicker(PopupWindow): if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return + + if self._delegate is not None: + self._delegate.on_character_picker_get_more_press() + self._transition_out() - StoreBrowserWindow( - modal=True, - show_tab=StoreBrowserWindow.TabID.CHARACTERS, - origin_widget=self._get_more_characters_button, - ) def _select_character(self, character: str) -> None: if self._delegate is not None: diff --git a/dist/ba_data/python/bauiv1lib/chest.py b/dist/ba_data/python/bauiv1lib/chest.py new file mode 100644 index 0000000..16762e4 --- /dev/null +++ b/dist/ba_data/python/bauiv1lib/chest.py @@ -0,0 +1,1096 @@ +# Released under the MIT License. See LICENSE for details. +# +# pylint: disable=too-many-lines +"""Provides chest related ui.""" + +from __future__ import annotations + +import math +import random +from typing import override, TYPE_CHECKING + +from efro.util import strict_partial +import bacommon.bs +import bauiv1 as bui + +if TYPE_CHECKING: + import datetime + + import baclassic + +_g_open_voices: list[tuple[float, str, float]] = [] + + +class ChestWindow(bui.MainWindow): + """Allows viewing and performing operations on a chest.""" + + def __init__( + self, + index: int, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): + self._index = index + + assert bui.app.classic is not None + uiscale = bui.app.ui_v1.uiscale + self._width = 1200 if uiscale is bui.UIScale.SMALL else 650 + self._height = 800 if uiscale is bui.UIScale.SMALL else 450 + self._action_in_flight = False + self._open_now_button: bui.Widget | None = None + self._open_now_spinner: bui.Widget | None = None + self._open_now_texts: list[bui.Widget] = [] + self._open_now_images: list[bui.Widget] = [] + self._watch_ad_button: bui.Widget | None = None + self._time_string_timer: bui.AppTimer | None = None + self._time_string_text: bui.Widget | None = None + self._prizesets: list[bacommon.bs.ChestInfoResponse.Chest.PrizeSet] = [] + self._prizeindex = -1 + self._prizesettxts: dict[int, list[bui.Widget]] = {} + self._prizesetimgs: dict[int, list[bui.Widget]] = {} + self._chestdisplayinfo: baclassic.ChestAppearanceDisplayInfo | None = ( + None + ) + + # The set of widgets we keep when doing a clear. + self._core_widgets: list[bui.Widget] = [] + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.8 + if uiscale is bui.UIScale.SMALL + else 1.1 if uiscale is bui.UIScale.MEDIUM else 0.9 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_height = min(self._height - 120, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + self._yoffstop = 0.5 * self._height + 0.5 * target_height + 18 + + # Offset for stuff we want centered. + self._yoffs = 0.5 * self._height + ( + 220 if uiscale is bui.UIScale.SMALL else 190 + ) + + self._chest_yoffs = self._yoffs - 223 + + super().__init__( + root_widget=bui.containerwidget( + size=(self._width, self._height), + toolbar_visibility='menu_full', + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + # Tell the root-ui to stop updating toolbar values immediately; + # this allows it to run animations based on the results of our + # chest opening. + bui.root_ui_pause_updates() + self._root_ui_updates_paused = True + + self._title_text = bui.textwidget( + parent=self._root_widget, + position=( + self._width * 0.5, + self._yoffstop - (36 if uiscale is bui.UIScale.SMALL else 10), + ), + size=(0, 0), + text=bui.Lstr( + resource='chests.slotText', + subs=[('${NUM}', str(index + 1))], + ), + color=bui.app.ui_v1.title_color, + maxwidth=110.0 if uiscale is bui.UIScale.SMALL else 200, + scale=0.9 if uiscale is bui.UIScale.SMALL else 1.1, + h_align='center', + v_align='center', + ) + self._core_widgets.append(self._title_text) + + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + btn = bui.buttonwidget( + parent=self._root_widget, + position=(50, self._yoffs - 44), + size=(60, 55), + scale=0.8, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + extra_touch_border_scale=2.0, + autoselect=True, + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + self._core_widgets.append(btn) + + # Note: Don't need to explicitly clean this up. Just not adding + # it to core_widgets so it will go away on next reset. + self._loadingspinner = bui.spinnerwidget( + parent=self._root_widget, + position=(self._width * 0.5, self._height * 0.5), + size=48, + style='bomb', + ) + + self._infotext = bui.textwidget( + parent=self._root_widget, + position=(self._width * 0.5, self._yoffs - 200), + size=(0, 0), + text='', + maxwidth=700, + scale=0.8, + color=(0.6, 0.5, 0.6), + h_align='center', + v_align='center', + ) + self._core_widgets.append(self._infotext) + + plus = bui.app.plus + if plus is None: + self._error('Plus feature-set is not present.') + return + + if plus.accounts.primary is None: + self._error(bui.Lstr(resource='notSignedInText')) + return + + # Start by showing info/options for our target chest. Note that + # we always ask the server for these values even though we may + # have them through our appmode subscription which updates the + # chest UI. This is because the wait_for_connectivity() + # mechanism will often bring our window up a split second before + # the chest subscription receives its first values which would + # lead us to incorrectly think there is no chest there. If we + # want to optimize this in the future we could perhaps use local + # values only if there is a chest present in them. + assert not self._action_in_flight + self._action_in_flight = True + with plus.accounts.primary: + plus.cloud.send_message_cb( + bacommon.bs.ChestInfoMessage(chest_id=str(self._index)), + on_response=bui.WeakCall(self._on_chest_info_response), + ) + + def __del__(self) -> None: + + # Make sure UI updates are resumed if we haven't done so. + if self._root_ui_updates_paused: + bui.root_ui_resume_updates() + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull anything we need from self out here; if we do it in the + # lambda we keep self alive which is bad. + index = self._index + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + index=index, transition=transition, origin_widget=origin_widget + ) + ) + + def _update_time_display(self, unlock_time: datetime.datetime) -> None: + # Once text disappears, kill our timer. + if not self._time_string_text: + self._time_string_timer = None + return + now = bui.utc_now_cloud() + secs_till_open = max(0.0, (unlock_time - now).total_seconds()) + tstr = ( + bui.timestring(secs_till_open, centi=False) + if secs_till_open > 0 + else '' + ) + bui.textwidget(edit=self._time_string_text, text=tstr) + + def _on_chest_info_response( + self, response: bacommon.bs.ChestInfoResponse | Exception + ) -> None: + assert self._action_in_flight # Should be us. + self._action_in_flight = False + + if isinstance(response, Exception): + self._error( + bui.Lstr(resource='internal.unableToCompleteTryAgainText'), + minor=True, + ) + return + + if response.chest is None: + self._show_about_chest_slots() + return + + assert response.user_tokens is not None + self._show_chest_actions(response.user_tokens, response.chest) + + def _on_chest_action_response( + self, response: bacommon.bs.ChestActionResponse | Exception + ) -> None: + assert self._action_in_flight # Should be us. + self._action_in_flight = False + + # Communication/local error: + if isinstance(response, Exception): + self._error( + bui.Lstr(resource='internal.unableToCompleteTryAgainText'), + minor=True, + ) + return + + # Server-side error: + if response.error is not None: + self._error(bui.Lstr(translate=('serverResponses', response.error))) + return + + # Show any bundled success message. + if response.success_msg is not None: + bui.screenmessage( + bui.Lstr(translate=('serverResponses', response.success_msg)), + color=(0, 1.0, 0), + ) + bui.getsound('cashRegister').play() + + # Show any bundled warning. + if response.warning is not None: + bui.screenmessage( + bui.Lstr(translate=('serverResponses', response.warning)), + color=(1, 0.5, 0), + ) + bui.getsound('error').play() + + # If we just paid for something, make a sound accordingly. + if bool(False): # Hmm maybe this feels odd. + if response.tokens_charged > 0: + bui.getsound('cashRegister').play() + + # If there's contents listed in the response, show them. + if response.contents is not None: + self._show_chest_contents(response) + else: + # Otherwise we're done here; just close out our UI. + self.main_window_back() + + def _show_chest_actions( + self, user_tokens: int, chest: bacommon.bs.ChestInfoResponse.Chest + ) -> None: + """Show state for our chest.""" + # pylint: disable=too-many-locals + # pylint: disable=cyclic-import + from baclassic import ( + ClassicAppMode, + CHEST_APPEARANCE_DISPLAY_INFOS, + CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT, + ) + + plus = bui.app.plus + assert plus is not None + + # We expect to be run under classic app mode. + mode = bui.app.mode + if not isinstance(mode, ClassicAppMode): + self._error('Classic app mode not active.') + return + + self._reset() + + self._chestdisplayinfo = CHEST_APPEARANCE_DISPLAY_INFOS.get( + chest.appearance, CHEST_APPEARANCE_DISPLAY_INFO_DEFAULT + ) + + bui.textwidget( + edit=self._title_text, + text=bui.Lstr( + translate=('displayItemNames', chest.appearance.pretty_name) + ), + ) + + imgsize = 145 + bui.imagewidget( + parent=self._root_widget, + position=( + self._width * 0.5 - imgsize * 0.5, + # self._height - 223 + self._yoffs, + self._chest_yoffs, + ), + color=self._chestdisplayinfo.color, + size=(imgsize, imgsize), + texture=bui.gettexture(self._chestdisplayinfo.texclosed), + tint_texture=bui.gettexture(self._chestdisplayinfo.texclosedtint), + tint_color=self._chestdisplayinfo.tint, + tint2_color=self._chestdisplayinfo.tint2, + ) + + # Store the prize-sets so we can display odds/etc. Sort them + # with largest weights first. + self._prizesets = sorted( + chest.prizesets, key=lambda s: s.weight, reverse=True + ) + + if chest.unlock_tokens > 0: + lsize = 30 + bui.imagewidget( + parent=self._root_widget, + position=( + self._width * 0.5 - imgsize * 0.4 - lsize * 0.5, + # self._height - 223 + 27.0 + self._yoffs, + self._chest_yoffs + 27.0, + ), + size=(lsize, lsize), + texture=bui.gettexture('lock'), + ) + + # Time string. + if chest.unlock_tokens != 0: + self._time_string_text = bui.textwidget( + parent=self._root_widget, + position=( + self._width * 0.5, + # self._height - 85 + self._yoffs + self._yoffs - 85, + ), + size=(0, 0), + text='', + maxwidth=700, + scale=0.6, + color=(0.6, 1.0, 0.6), + h_align='center', + v_align='center', + ) + self._update_time_display(chest.unlock_time) + self._time_string_timer = bui.AppTimer( + 1.0, + repeat=True, + call=bui.WeakCall(self._update_time_display, chest.unlock_time), + ) + + # Allow watching an ad IF the server tells us we can AND we have + # an ad ready to show. + show_ad_button = ( + chest.unlock_tokens > 0 + and chest.ad_allow + and plus.have_incentivized_ad() + ) + + bwidth = 130 + bheight = 90 + bposy = -330 if chest.unlock_tokens == 0 else -340 + hspace = 20 + boffsx = (hspace * -0.5 - bwidth * 0.5) if show_ad_button else 0.0 + + self._open_now_button = bui.buttonwidget( + parent=self._root_widget, + position=( + self._width * 0.5 - bwidth * 0.5 + boffsx, + self._yoffs + bposy, + ), + size=(bwidth, bheight), + label='', + button_type='square', + autoselect=True, + on_activate_call=bui.WeakCall( + self._open_press, user_tokens, chest.unlock_tokens + ), + enable_sound=False, + ) + self._open_now_images = [] + self._open_now_texts = [] + + iconsize = 50 + if chest.unlock_tokens == 0: + self._open_now_texts.append( + bui.textwidget( + parent=self._root_widget, + text=bui.Lstr(resource='openText'), + position=( + self._width * 0.5 + boffsx, + self._yoffs + bposy + bheight * 0.5, + ), + color=(0, 1, 0), + draw_controller=self._open_now_button, + scale=0.7, + maxwidth=bwidth * 0.8, + size=(0, 0), + h_align='center', + v_align='center', + ) + ) + else: + self._open_now_texts.append( + bui.textwidget( + parent=self._root_widget, + text=bui.Lstr(resource='openNowText'), + position=( + self._width * 0.5 + boffsx, + self._yoffs + bposy + bheight * 1.15, + ), + maxwidth=bwidth * 0.8, + scale=0.7, + color=(0.7, 1, 0.7), + size=(0, 0), + h_align='center', + v_align='center', + ) + ) + self._open_now_images.append( + bui.imagewidget( + parent=self._root_widget, + size=(iconsize, iconsize), + position=( + self._width * 0.5 - iconsize * 0.5 + boffsx, + self._yoffs + bposy + bheight * 0.35, + ), + draw_controller=self._open_now_button, + texture=bui.gettexture('coin'), + ) + ) + self._open_now_texts.append( + bui.textwidget( + parent=self._root_widget, + text=bui.Lstr( + resource='tokens.numTokensText', + subs=[('${COUNT}', str(chest.unlock_tokens))], + ), + position=( + self._width * 0.5 + boffsx, + self._yoffs + bposy + bheight * 0.25, + ), + scale=0.65, + color=(0, 1, 0), + draw_controller=self._open_now_button, + maxwidth=bwidth * 0.8, + size=(0, 0), + h_align='center', + v_align='center', + ) + ) + self._open_now_spinner = bui.spinnerwidget( + parent=self._root_widget, + position=( + self._width * 0.5 + boffsx, + self._yoffs + bposy + 0.5 * bheight, + ), + visible=False, + ) + + if show_ad_button: + bui.textwidget( + parent=self._root_widget, + text=bui.Lstr(resource='chests.reduceWaitText'), + position=( + self._width * 0.5 + hspace * 0.5 + bwidth * 0.5, + self._yoffs + bposy + bheight * 1.15, + ), + maxwidth=bwidth * 0.8, + scale=0.7, + color=(0.7, 1, 0.7), + size=(0, 0), + h_align='center', + v_align='center', + ) + self._watch_ad_button = bui.buttonwidget( + parent=self._root_widget, + position=( + self._width * 0.5 + hspace * 0.5, + self._yoffs + bposy, + ), + size=(bwidth, bheight), + label='', + button_type='square', + autoselect=True, + on_activate_call=bui.WeakCall(self._watch_ad_press), + enable_sound=False, + ) + bui.imagewidget( + parent=self._root_widget, + size=(iconsize, iconsize), + position=( + self._width * 0.5 + + hspace * 0.5 + + bwidth * 0.5 + - iconsize * 0.5, + self._yoffs + bposy + bheight * 0.35, + ), + draw_controller=self._watch_ad_button, + color=(1.5, 1.0, 2.0), + texture=bui.gettexture('tv'), + ) + # Note to self: AdMob requires rewarded ad usage + # specifically says 'Ad' in it. + bui.textwidget( + parent=self._root_widget, + text=bui.Lstr(resource='watchAnAdText'), + position=( + self._width * 0.5 + hspace * 0.5 + bwidth * 0.5, + self._yoffs + bposy + bheight * 0.25, + ), + scale=0.65, + color=(0, 1, 0), + draw_controller=self._watch_ad_button, + maxwidth=bwidth * 0.8, + size=(0, 0), + h_align='center', + v_align='center', + ) + + self._show_odds(initial_highlighted_row=-1) + + def _highlight_odds_row(self, row: int, extra: bool = False) -> None: + + for rindex, imgs in self._prizesetimgs.items(): + opacity = ( + (0.9 if extra else 0.75) + if rindex == row + else (0.4 if extra else 0.5) + ) + for img in imgs: + if img: + bui.imagewidget(edit=img, opacity=opacity) + + for rindex, txts in self._prizesettxts.items(): + opacity = ( + (0.9 if extra else 0.75) + if rindex == row + else (0.4 if extra else 0.5) + ) + for txt in txts: + if txt: + bui.textwidget(edit=txt, color=(0.7, 0.65, 1, opacity)) + + def _show_odds( + self, + *, + initial_highlighted_row: int, + initial_highlighted_extra: bool = False, + ) -> None: + # pylint: disable=too-many-locals + xoffs = 110 + + totalweight = max(0.001, sum(t.weight for t in self._prizesets)) + + rowheight = 25 + totalheight = (len(self._prizesets) + 1) * rowheight + x = self._width * 0.5 + xoffs + y = self._yoffs - 150.0 + totalheight * 0.5 + + # Title. + bui.textwidget( + parent=self._root_widget, + text=bui.Lstr(resource='chests.prizeOddsText'), + color=(0.7, 0.65, 1, 0.5), + flatness=1.0, + shadow=1.0, + position=(x, y), + scale=0.55, + size=(0, 0), + h_align='left', + v_align='center', + ) + y -= 5.0 + + prizesettxts: list[bui.Widget] + prizesetimgs: list[bui.Widget] + + def _mkicon(img: str) -> None: + iconsize = 20.0 + nonlocal x + nonlocal prizesetimgs + prizesetimgs.append( + bui.imagewidget( + parent=self._root_widget, + size=(iconsize, iconsize), + position=(x, y - iconsize * 0.5), + texture=bui.gettexture(img), + opacity=0.4, + ) + ) + x += iconsize + + def _mktxt(txt: str, advance: bool = True) -> None: + tscale = 0.45 + nonlocal x + nonlocal prizesettxts + prizesettxts.append( + bui.textwidget( + parent=self._root_widget, + text=txt, + flatness=1.0, + shadow=1.0, + position=(x, y), + scale=tscale, + size=(0, 0), + h_align='left', + v_align='center', + ) + ) + if advance: + x += (bui.get_string_width(txt, suppress_warning=True)) * tscale + + self._prizesettxts = {} + self._prizesetimgs = {} + + for i, p in enumerate(self._prizesets): + prizesettxts = self._prizesettxts.setdefault(i, []) + prizesetimgs = self._prizesetimgs.setdefault(i, []) + x = self._width * 0.5 + xoffs + y -= rowheight + percent = 100.0 * p.weight / totalweight + + # Show decimals only if we get very small percentages (looks + # better than rounding as '0%'). + percenttxt = ( + f'{percent:.2f}%:' + if percent < 0.095 + else ( + f'{percent:.1f}%:' + if percent < 0.95 + else f'{round(percent)}%:' + ) + ) + + # We advance manually here to keep values lined up + # (otherwise single digit percent rows don't line up with + # double digit ones). + _mktxt(percenttxt, advance=False) + x += 35.0 + + for item in p.contents: + x += 5.0 + if isinstance(item.item, bacommon.bs.TicketsDisplayItem): + _mktxt(str(item.item.count)) + _mkicon('tickets') + elif isinstance(item.item, bacommon.bs.TokensDisplayItem): + _mktxt(str(item.item.count)) + _mkicon('coin') + else: + # For other cases just fall back on text desc. + # + # Translate the wrapper description and apply any subs. + descfin = bui.Lstr( + translate=('serverResponses', item.description) + ).evaluate() + subs = ( + [] + if item.description_subs is None + else item.description_subs + ) + assert len(subs) % 2 == 0 # Should always be even. + for j in range(0, len(subs) - 1, 2): + descfin = descfin.replace(subs[j], subs[j + 1]) + _mktxt(descfin) + self._highlight_odds_row( + initial_highlighted_row, extra=initial_highlighted_extra + ) + + def _open_press(self, user_tokens: int, token_payment: int) -> None: + from bauiv1lib.gettokens import show_get_tokens_prompt + + bui.getsound('click01').play() + + # Allow only one in-flight action at once. + if self._action_in_flight: + bui.screenmessage( + bui.Lstr(resource='pleaseWaitText'), color=(1, 0, 0) + ) + bui.getsound('error').play() + return + + plus = bui.app.plus + assert plus is not None + + if plus.accounts.primary is None: + self._error(bui.Lstr(resource='notSignedInText')) + return + + # Offer to purchase tokens if they don't have enough. + if user_tokens < token_payment: + # Hack: We disable normal swish for the open button and it + # seems weird without a swish here, so explicitly do one. + bui.getsound('swish').play() + show_get_tokens_prompt() + return + + self._action_in_flight = True + with plus.accounts.primary: + plus.cloud.send_message_cb( + bacommon.bs.ChestActionMessage( + chest_id=str(self._index), + action=bacommon.bs.ChestActionMessage.Action.UNLOCK, + token_payment=token_payment, + ), + on_response=bui.WeakCall(self._on_chest_action_response), + ) + + # Convey that something is in progress. + if self._open_now_button: + bui.spinnerwidget(edit=self._open_now_spinner, visible=True) + for twidget in self._open_now_texts: + bui.textwidget(edit=twidget, color=(1, 1, 1, 0.2)) + for iwidget in self._open_now_images: + bui.imagewidget(edit=iwidget, opacity=0.2) + + def _watch_ad_press(self) -> None: + + bui.getsound('click01').play() + + # Allow only one in-flight action at once. + if self._action_in_flight: + bui.screenmessage( + bui.Lstr(resource='pleaseWaitText'), color=(1, 0, 0) + ) + bui.getsound('error').play() + return + + assert bui.app.classic is not None + + self._action_in_flight = True + bui.app.classic.ads.show_ad_2( + 'reduce_chest_wait', + on_completion_call=bui.WeakCall(self._watch_ad_complete), + ) + + # Convey that something is in progress. + if self._watch_ad_button: + bui.buttonwidget(edit=self._watch_ad_button, color=(0.4, 0.4, 0.4)) + + def _watch_ad_complete(self, actually_showed: bool) -> None: + + assert self._action_in_flight # Should be ad view. + self._action_in_flight = False + + if not actually_showed: + return + + # Allow only one in-flight action at once. + if self._action_in_flight: + bui.screenmessage( + bui.Lstr(resource='pleaseWaitText'), color=(1, 0, 0) + ) + bui.getsound('error').play() + return + + plus = bui.app.plus + assert plus is not None + + if plus.accounts.primary is None: + self._error(bui.Lstr(resource='notSignedInText')) + return + + self._action_in_flight = True + with plus.accounts.primary: + plus.cloud.send_message_cb( + bacommon.bs.ChestActionMessage( + chest_id=str(self._index), + action=bacommon.bs.ChestActionMessage.Action.AD, + token_payment=0, + ), + on_response=bui.WeakCall(self._on_chest_action_response), + ) + + def _reset(self) -> None: + """Clear all non-permanent widgets and clear infotext.""" + for widget in self._root_widget.get_children(): + if widget not in self._core_widgets: + widget.delete() + bui.textwidget(edit=self._infotext, text='', color=(1, 1, 1)) + + def _error(self, msg: str | bui.Lstr, minor: bool = False) -> None: + """Put ourself in an error state with a visible error message.""" + self._reset() + bui.textwidget( + edit=self._infotext, + text=msg, + color=(1, 0.5, 0.5) if minor else (1, 0, 0), + ) + + def _show_about_chest_slots(self) -> None: + # No-op if our ui is dead. + if not self._root_widget: + return + + self._reset() + bui.textwidget( + edit=self._infotext, + text=bui.Lstr(resource='chests.slotDescriptionText'), + color=(1, 1, 1), + ) + + def _show_chest_contents( + self, response: bacommon.bs.ChestActionResponse + ) -> None: + # pylint: disable=too-many-locals + + from baclassic import show_display_item + + # No-op if our ui is dead. + if not self._root_widget: + return + + assert response.contents is not None + + # Insert test items for testing. + if bool(False): + response.contents += [ + bacommon.bs.DisplayItemWrapper.for_display_item( + bacommon.bs.TestDisplayItem() + ) + ] + + tincr = 0.4 + tendoffs = tincr * 4.0 + toffs = 0.0 + + bui.getsound('revUp').play(volume=2.0) + + # Show nothing but the chest icon and animate it shaking. + self._reset() + imgsize = 145 + assert self._chestdisplayinfo is not None + img = bui.imagewidget( + parent=self._root_widget, + color=self._chestdisplayinfo.color, + texture=bui.gettexture(self._chestdisplayinfo.texclosed), + tint_texture=bui.gettexture(self._chestdisplayinfo.texclosedtint), + tint_color=self._chestdisplayinfo.tint, + tint2_color=self._chestdisplayinfo.tint2, + ) + + def _set_img(x: float, scale: float) -> None: + if not img: + return + bui.imagewidget( + edit=img, + position=( + self._width * 0.5 - imgsize * scale * 0.5 + x, + self._yoffs - 223 + imgsize * 0.5 - imgsize * scale * 0.5, + ), + size=(imgsize * scale, imgsize * scale), + ) + + # Set initial place. + _set_img(0.0, 1.0) + + sign = 1.0 + while toffs < tendoffs: + toffs += 0.03 * random.uniform(0.5, 1.5) + sign = -sign + bui.apptimer( + toffs, + bui.Call( + _set_img, + x=( + 20.0 + * random.uniform(0.3, 1.0) + * math.pow(toffs / tendoffs, 2.0) + * sign + ), + scale=1.0 - 0.2 * math.pow(toffs / tendoffs, 2.0), + ), + ) + + xspacing = 100 + xoffs = -0.5 * (len(response.contents) - 1) * xspacing + bui.apptimer( + toffs - 0.2, lambda: bui.getsound('corkPop2').play(volume=4.0) + ) + # Play a variety of voice sounds. + + # We keep a global list of voice options which we randomly pull + # from and refill when empty. This ensures everything gets + # played somewhat frequently and minimizes annoying repeats. + global _g_open_voices # pylint: disable=global-statement + if not _g_open_voices: + _g_open_voices = [ + (0.3, 'woo3', 2.5), + (0.1, 'gasp', 1.3), + (0.2, 'woo2', 2.0), + (0.2, 'wow', 2.0), + (0.2, 'kronk2', 2.0), + (0.2, 'mel03', 2.0), + (0.2, 'aww', 2.0), + (0.4, 'nice', 2.0), + (0.3, 'yeah', 1.5), + (0.2, 'woo', 1.0), + (0.5, 'ooh', 0.8), + ] + + voicetimeoffs, voicename, volume = _g_open_voices.pop( + random.randrange(len(_g_open_voices)) + ) + bui.apptimer( + toffs + voicetimeoffs, + lambda: bui.getsound(voicename).play(volume=volume), + ) + + toffsopen = toffs + bui.apptimer(toffs, bui.WeakCall(self._show_chest_opening)) + toffs += tincr * 1.0 + width = xspacing * 0.95 + + for item in response.contents: + toffs += tincr + bui.apptimer( + toffs - 0.1, lambda: bui.getsound('cashRegister').play() + ) + bui.apptimer( + toffs, + strict_partial( + show_display_item, + item, + self._root_widget, + pos=( + self._width * 0.5 + xoffs, + self._yoffs - 250.0, + ), + width=width, + ), + ) + xoffs += xspacing + toffs += tincr + bui.apptimer(toffs, bui.WeakCall(self._show_done_button)) + + self._show_odds(initial_highlighted_row=-1) + + # Store this for later + self._prizeindex = response.prizeindex + + # The final result was already randomly selected on the server, + # but we want to give the illusion of randomness here, so cycle + # through highlighting our options and stop on the winner when + # the chest opens. To do this, we start at the end at the prize + # and work backwards setting timers. + if self._prizesets: + toffs2 = toffsopen - 0.01 + amt = 0.02 + i = self._prizeindex + while toffs2 > 0.0: + bui.apptimer( + toffs2, + bui.WeakCall(self._highlight_odds_row, i), + ) + toffs2 -= amt + amt *= 1.05 * random.uniform(0.9, 1.1) + i = (i - 1) % len(self._prizesets) + + def _show_chest_opening(self) -> None: + + # No-op if our ui is dead. + if not self._root_widget: + return + + self._reset() + imgsize = 145 + bui.getsound('hiss').play() + assert self._chestdisplayinfo is not None + img = bui.imagewidget( + parent=self._root_widget, + color=self._chestdisplayinfo.color, + texture=bui.gettexture(self._chestdisplayinfo.texopen), + tint_texture=bui.gettexture(self._chestdisplayinfo.texopentint), + tint_color=self._chestdisplayinfo.tint, + tint2_color=self._chestdisplayinfo.tint2, + ) + tincr = 0.8 + tendoffs = tincr * 2.0 + toffs = 0.0 + + def _set_img(x: float, scale: float) -> None: + if not img: + return + bui.imagewidget( + edit=img, + position=( + self._width * 0.5 - imgsize * scale * 0.5 + x, + self._yoffs - 223 + imgsize * 0.5 - imgsize * scale * 0.5, + ), + size=(imgsize * scale, imgsize * scale), + ) + + # Set initial place. + _set_img(0.0, 1.0) + + sign = 1.0 + while toffs < tendoffs: + toffs += 0.03 * random.uniform(0.5, 1.5) + sign = -sign + # Note: we speed x along here (multing toffs) so position + # comes to rest before scale. + bui.apptimer( + toffs, + bui.Call( + _set_img, + x=( + 1.0 + * random.uniform(0.3, 1.0) + * ( + 1.0 + - math.pow(min(1.0, 3.0 * toffs / tendoffs), 2.0) + ) + * sign + ), + scale=1.0 - 0.1 * math.pow(toffs / tendoffs, 0.5), + ), + ) + + self._show_odds( + initial_highlighted_row=self._prizeindex, + initial_highlighted_extra=True, + ) + + def _show_done_button(self) -> None: + # No-op if our ui is dead. + if not self._root_widget: + return + + bwidth = 200 + bheight = 60 + + btn = bui.buttonwidget( + parent=self._root_widget, + position=( + self._width * 0.5 - bwidth * 0.5, + self._yoffs - 350, + ), + size=(bwidth, bheight), + label=bui.Lstr(resource='doneText'), + autoselect=True, + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, start_button=btn) + + +# Slight hack: we define window different classes for our different +# chest slots so that the default UI behavior is to replace each other +# when different ones are pressed. If they are all the same window class +# then the default behavior for such presses is to toggle the existing +# one back off. + + +class ChestWindow0(ChestWindow): + """Child class of ChestWindow for slighty hackish reasons.""" + + +class ChestWindow1(ChestWindow): + """Child class of ChestWindow for slighty hackish reasons.""" + + +class ChestWindow2(ChestWindow): + """Child class of ChestWindow for slighty hackish reasons.""" + + +class ChestWindow3(ChestWindow): + """Child class of ChestWindow for slighty hackish reasons.""" diff --git a/dist/ba_data/python/bauiv1lib/colorpicker.py b/dist/ba_data/python/bauiv1lib/colorpicker.py index 2896427..622f431 100644 --- a/dist/ba_data/python/bauiv1lib/colorpicker.py +++ b/dist/ba_data/python/bauiv1lib/colorpicker.py @@ -12,6 +12,8 @@ import bauiv1 as bui if TYPE_CHECKING: from typing import Any, Sequence +REQUIRE_PRO = False + class ColorPicker(PopupWindow): """A popup UI to select from a set of colors. @@ -23,6 +25,7 @@ class ColorPicker(PopupWindow): self, parent: bui.Widget, position: tuple[float, float], + *, initial_color: Sequence[float] = (1.0, 1.0, 1.0), delegate: Any = None, scale: float | None = None, @@ -105,9 +108,8 @@ class ColorPicker(PopupWindow): on_activate_call=bui.WeakCall(self._select_other), ) - # Custom colors are limited to pro currently. assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro(): bui.imagewidget( parent=self.root_widget, position=(50, 12), @@ -137,7 +139,7 @@ class ColorPicker(PopupWindow): # Requires pro. assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro(): purchase.PurchaseWindow(items=['pro']) self._transition_out() return @@ -183,6 +185,7 @@ class ColorPickerExact(PopupWindow): self, parent: bui.Widget, position: tuple[float, float], + *, initial_color: Sequence[float] = (1.0, 1.0, 1.0), delegate: Any = None, scale: float | None = None, @@ -245,7 +248,6 @@ class ColorPickerExact(PopupWindow): editable=True, maxwidth=70, allow_clear_button=False, - force_internal_editing=True, glow_type='uniform', ) diff --git a/dist/ba_data/python/bauiv1lib/config.py b/dist/ba_data/python/bauiv1lib/config.py index 337a25f..fd46303 100644 --- a/dist/ba_data/python/bauiv1lib/config.py +++ b/dist/ba_data/python/bauiv1lib/config.py @@ -28,6 +28,7 @@ class ConfigCheckBox: configkey: str, position: tuple[float, float], size: tuple[float, float], + *, displayname: str | bui.Lstr | None = None, scale: float | None = None, maxwidth: float | None = None, @@ -85,6 +86,7 @@ class ConfigNumberEdit: parent: bui.Widget, configkey: str, position: tuple[float, float], + *, minval: float = 0.0, maxval: float = 100.0, increment: float = 1.0, diff --git a/dist/ba_data/python/bauiv1lib/configerror.py b/dist/ba_data/python/bauiv1lib/configerror.py deleted file mode 100644 index c64a31d..0000000 --- a/dist/ba_data/python/bauiv1lib/configerror.py +++ /dev/null @@ -1,80 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""UI for dealing with broken config files.""" - -from __future__ import annotations - -import bauiv1 as bui - - -class ConfigErrorWindow(bui.Window): - """Window for dealing with a broken config.""" - - def __init__(self) -> None: - self._config_file_path = bui.app.env.config_file_path - width = 800 - super().__init__( - bui.containerwidget(size=(width, 400), transition='in_right') - ) - padding = 20 - bui.textwidget( - parent=self._root_widget, - position=(padding, 220 + 60), - size=(width - 2 * padding, 100 - 2 * padding), - h_align='center', - v_align='top', - scale=0.73, - text=( - f'Error reading {bui.appnameupper()} config file' - ':\n\n\nCheck the console' - ' (press ~ twice) for details.\n\nWould you like to quit and' - ' try to fix it by hand\nor overwrite it with defaults?\n\n' - '(high scores, player profiles, etc will be lost if you' - ' overwrite)' - ), - ) - bui.textwidget( - parent=self._root_widget, - position=(padding, 198 + 60), - size=(width - 2 * padding, 100 - 2 * padding), - h_align='center', - v_align='top', - scale=0.5, - text=self._config_file_path, - ) - quit_button = bui.buttonwidget( - parent=self._root_widget, - position=(35, 30), - size=(240, 54), - label='Quit and Edit', - on_activate_call=self._quit, - ) - bui.buttonwidget( - parent=self._root_widget, - position=(width - 370, 30), - size=(330, 54), - label='Overwrite with Defaults', - on_activate_call=self._defaults, - ) - bui.containerwidget( - edit=self._root_widget, - cancel_button=quit_button, - selected_child=quit_button, - ) - - def _quit(self) -> None: - bui.apptimer(0.001, self._edit_and_quit) - bui.lock_all_input() - - def _edit_and_quit(self) -> None: - bui.open_file_externally(self._config_file_path) - bui.apptimer(0.1, bui.quit) - - def _defaults(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.getsound('gunCocking').play() - bui.screenmessage('settings reset.', color=(1, 1, 0)) - - # At this point settings are already set; lets just commit them - # to disk. - bui.commit_app_config(force=True) diff --git a/dist/ba_data/python/bauiv1lib/confirm.py b/dist/ba_data/python/bauiv1lib/confirm.py index 394f2fe..3aff09d 100644 --- a/dist/ba_data/python/bauiv1lib/confirm.py +++ b/dist/ba_data/python/bauiv1lib/confirm.py @@ -22,6 +22,7 @@ class ConfirmWindow: action: Callable[[], Any] | None = None, width: float = 360.0, height: float = 100.0, + *, cancel_button: bool = True, cancel_is_selected: bool = False, color: tuple[float, float, float] = (1, 1, 1), @@ -61,7 +62,7 @@ class ConfirmWindow: toolbar_visibility='menu_minimal_no_back', parent=bui.get_special_widget('overlay_stack'), scale=( - 2.1 + 1.9 if uiscale is bui.UIScale.SMALL else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 ), diff --git a/dist/ba_data/python/bauiv1lib/connectivity.py b/dist/ba_data/python/bauiv1lib/connectivity.py index 41062f8..8d52609 100644 --- a/dist/ba_data/python/bauiv1lib/connectivity.py +++ b/dist/ba_data/python/bauiv1lib/connectivity.py @@ -4,7 +4,6 @@ from __future__ import annotations -import time from typing import TYPE_CHECKING import bauiv1 as bui @@ -49,12 +48,6 @@ class WaitForConnectivityWindow(bui.Window): self._on_cancel = on_cancel self._width = 650 self._height = 300 - self._infos: list[str | bui.Lstr] = [ - 'This can take a few moments, especially on first launch.', - 'Make sure your internet connection is working.', - ] - self._last_info_switch_time = time.monotonic() - self._info_index = 0 super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), @@ -64,26 +57,36 @@ class WaitForConnectivityWindow(bui.Window): ) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height * 0.65), + position=(self._width * 0.5, self._height * 0.7), size=(0, 0), scale=1.2, h_align='center', v_align='center', - text='Locating nearest regional servers...', + text=bui.Lstr(resource='internal.connectingToPartyText'), maxwidth=self._width * 0.9, ) + + self._spinner = bui.spinnerwidget( + parent=self._root_widget, + position=(self._width * 0.5, self._height * 0.54), + style='bomb', + size=48, + ) + self._info_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height * 0.45), + position=(self._width * 0.5, self._height * 0.4), size=(0, 0), - color=(0.7, 0.6, 0.7), + color=(0.6, 0.5, 0.6), flatness=1.0, - scale=0.8, + shadow=0.0, + scale=0.75, h_align='center', v_align='center', - text=self._infos[0], + text='', maxwidth=self._width * 0.9, ) + self._info_text_str = '' cancel_button = bui.buttonwidget( parent=self._root_widget, autoselect=True, @@ -98,7 +101,6 @@ class WaitForConnectivityWindow(bui.Window): ) def _update(self) -> None: - now = time.monotonic() plus = bui.app.plus assert plus is not None @@ -107,16 +109,29 @@ class WaitForConnectivityWindow(bui.Window): self._connected() return - if now - self._last_info_switch_time > 5.0: - self._info_index = (self._info_index + 1) % len(self._infos) - bui.textwidget( - edit=self._info_text, text=self._infos[self._info_index] - ) - self._last_info_switch_time = now + # Show what connectivity is up to if we don't have any published + # zone-pings yet (or if we do but there's no transport state to + # show yet). + if not bui.app.net.zone_pings or not bui.app.net.transport_state: + infotext = bui.app.net.connectivity_state + else: + infotext = bui.app.net.transport_state + if infotext != self._info_text_str: + self._info_text_str = infotext + bui.textwidget(edit=self._info_text, text=infotext) def _connected(self) -> None: if not self._root_widget or self._root_widget.transitioning_out: return + + # Show 'connected.' and kill the spinner for the brief moment + # we're visible on our way out. + bui.textwidget( + edit=self._info_text, text=bui.Lstr(resource='remote_app.connected') + ) + if self._spinner: + self._spinner.delete() + bui.containerwidget( edit=self._root_widget, transition=('out_scale'), diff --git a/dist/ba_data/python/bauiv1lib/continues.py b/dist/ba_data/python/bauiv1lib/continues.py deleted file mode 100644 index 366fcbb..0000000 --- a/dist/ba_data/python/bauiv1lib/continues.py +++ /dev/null @@ -1,256 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""Provides a popup window to continue a game.""" - -from __future__ import annotations - -import weakref -from typing import TYPE_CHECKING - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any, Callable - - import bascenev1 as bs - - -class ContinuesWindow(bui.Window): - """A window to continue a game.""" - - def __init__( - self, - activity: bs.Activity, - cost: int, - continue_call: Callable[[], Any], - cancel_call: Callable[[], Any], - ): - assert bui.app.classic is not None - self._activity = weakref.ref(activity) - self._cost = cost - self._continue_call = continue_call - self._cancel_call = cancel_call - self._start_count = self._count = 20 - self._width = 300 - self._height = 200 - self._transitioning_out = False - super().__init__( - bui.containerwidget( - size=(self._width, self._height), - background=False, - toolbar_visibility='menu_currency', - transition='in_scale', - scale=1.5, - ) - ) - txt = ( - bui.Lstr(resource='continuePurchaseText') - .evaluate() - .split('${PRICE}') - ) - t_left = txt[0] - t_left_width = bui.get_string_width(t_left, suppress_warning=True) - t_price = bui.charstr(bui.SpecialChar.TICKET) + str(self._cost) - t_price_width = bui.get_string_width(t_price, suppress_warning=True) - t_right = txt[-1] - t_right_width = bui.get_string_width(t_right, suppress_warning=True) - width_total_half = (t_left_width + t_price_width + t_right_width) * 0.5 - - bui.textwidget( - parent=self._root_widget, - text=t_left, - flatness=1.0, - shadow=1.0, - size=(0, 0), - h_align='left', - v_align='center', - position=(self._width * 0.5 - width_total_half, self._height - 30), - ) - bui.textwidget( - parent=self._root_widget, - text=t_price, - flatness=1.0, - shadow=1.0, - color=(0.2, 1.0, 0.2), - size=(0, 0), - position=( - self._width * 0.5 - width_total_half + t_left_width, - self._height - 30, - ), - h_align='left', - v_align='center', - ) - bui.textwidget( - parent=self._root_widget, - text=t_right, - flatness=1.0, - shadow=1.0, - size=(0, 0), - h_align='left', - v_align='center', - position=( - self._width * 0.5 - - width_total_half - + t_left_width - + t_price_width - + 5, - self._height - 30, - ), - ) - - self._tickets_text_base: str | None - self._tickets_text: bui.Widget | None - if not bui.app.ui_v1.use_toolbars: - self._tickets_text_base = bui.Lstr( - resource='getTicketsWindow.youHaveShortText', - fallback_resource='getTicketsWindow.youHaveText', - ).evaluate() - self._tickets_text = bui.textwidget( - parent=self._root_widget, - text='', - flatness=1.0, - color=(0.2, 1.0, 0.2), - shadow=1.0, - position=( - self._width * 0.5 + width_total_half, - self._height - 50, - ), - size=(0, 0), - scale=0.35, - h_align='right', - v_align='center', - ) - else: - self._tickets_text_base = None - self._tickets_text = None - - self._counter_text = bui.textwidget( - parent=self._root_widget, - text=str(self._count), - color=(0.7, 0.7, 0.7), - scale=1.2, - size=(0, 0), - big=True, - position=(self._width * 0.5, self._height - 80), - flatness=1.0, - shadow=1.0, - h_align='center', - v_align='center', - ) - self._cancel_button = bui.buttonwidget( - parent=self._root_widget, - position=(30, 30), - size=(120, 50), - label=bui.Lstr(resource='endText', fallback_resource='cancelText'), - autoselect=True, - enable_sound=False, - on_activate_call=self._on_cancel_press, - ) - self._continue_button = bui.buttonwidget( - parent=self._root_widget, - label=bui.Lstr(resource='continueText'), - autoselect=True, - position=(self._width - 130, 30), - size=(120, 50), - on_activate_call=self._on_continue_press, - ) - bui.containerwidget( - edit=self._root_widget, - cancel_button=self._cancel_button, - start_button=self._continue_button, - selected_child=self._cancel_button, - ) - - self._counting_down = True - self._countdown_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._tick), repeat=True - ) - - # If there is foreground activity, suspend it. - bui.app.classic.pause() - self._tick() - - def __del__(self) -> None: - # If there is suspended foreground activity, resume it. - assert bui.app.classic is not None - bui.app.classic.resume() - - def _tick(self) -> None: - plus = bui.app.plus - assert plus is not None - - # if our target activity is gone or has ended, go away - activity = self._activity() - if activity is None or activity.has_ended(): - self._on_cancel() - return - - if plus.get_v1_account_state() == 'signed_in': - sval = bui.charstr(bui.SpecialChar.TICKET) + str( - plus.get_v1_account_ticket_count() - ) - else: - sval = '?' - if self._tickets_text is not None: - assert self._tickets_text_base is not None - bui.textwidget( - edit=self._tickets_text, - text=self._tickets_text_base.replace('${COUNT}', sval), - ) - - if self._counting_down: - self._count -= 1 - bui.getsound('tick').play() - if self._count <= 0: - self._on_cancel() - else: - bui.textwidget(edit=self._counter_text, text=str(self._count)) - - def _on_cancel_press(self) -> None: - # disallow for first second - if self._start_count - self._count < 2: - bui.getsound('error').play() - else: - self._on_cancel() - - def _on_continue_press(self) -> None: - from bauiv1lib import gettickets - - plus = bui.app.plus - assert plus is not None - - # Disallow for first second. - if self._start_count - self._count < 2: - bui.getsound('error').play() - else: - # If somehow we got signed out... - if plus.get_v1_account_state() != 'signed_in': - bui.screenmessage( - bui.Lstr(resource='notSignedInText'), color=(1, 0, 0) - ) - bui.getsound('error').play() - return - - # If it appears we don't have enough tickets, offer to buy more. - tickets = plus.get_v1_account_ticket_count() - if tickets < self._cost: - # FIXME: Should we start the timer back up again after? - self._counting_down = False - bui.textwidget(edit=self._counter_text, text='') - bui.getsound('error').play() - gettickets.show_get_tickets_prompt() - return - if not self._transitioning_out: - bui.getsound('swish').play() - self._transitioning_out = True - bui.containerwidget( - edit=self._root_widget, transition='out_scale' - ) - self._continue_call() - - def _on_cancel(self) -> None: - if not self._transitioning_out: - bui.getsound('swish').play() - self._transitioning_out = True - bui.containerwidget(edit=self._root_widget, transition='out_scale') - self._cancel_call() diff --git a/dist/ba_data/python/bauiv1lib/coop/browser.py b/dist/ba_data/python/bauiv1lib/coop/browser.py index 81a936e..22411f7 100644 --- a/dist/ba_data/python/bauiv1lib/coop/browser.py +++ b/dist/ba_data/python/bauiv1lib/coop/browser.py @@ -7,12 +7,9 @@ from __future__ import annotations import logging -from threading import Thread -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override + -from bauiv1lib.store.button import StoreButton -from bauiv1lib.league.rankbutton import LeagueRankButton -from bauiv1lib.store.browser import StoreBrowserWindow import bauiv1 as bui if TYPE_CHECKING: @@ -20,8 +17,10 @@ if TYPE_CHECKING: from bauiv1lib.coop.tournamentbutton import TournamentButton +HARD_REQUIRES_PRO = False -class CoopBrowserWindow(bui.Window): + +class CoopBrowserWindow(bui.MainWindow): """Window for browsing co-op levels/games/etc.""" def __init__( @@ -30,6 +29,7 @@ class CoopBrowserWindow(bui.Window): origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-statements + # pylint: disable=too-many-locals # pylint: disable=cyclic-import plus = bui.app.plus @@ -37,17 +37,19 @@ class CoopBrowserWindow(bui.Window): # Preload some modules we use in a background thread so we won't # have a visual hitch when the user taps them. - Thread(target=self._preload_modules).start() + bui.app.threadpool.submit_no_wait(self._preload_modules) bui.set_analytics_screen('Coop Window') app = bui.app - assert app.classic is not None + classic = app.classic + assert classic is not None cfg = app.config # Quick note to players that tourneys won't work in ballistica - # core builds. (need to split the word so it won't get subbed out) - if 'ballistica' + 'kit' == bui.appname(): + # core builds. (need to split the word so it won't get subbed + # out) + if 'ballistica' + 'kit' == bui.appname() and bui.do_once(): bui.apptimer( 1.0, lambda: bui.screenmessage( @@ -56,16 +58,6 @@ class CoopBrowserWindow(bui.Window): ), ) - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - # Try to recreate the same number of buttons we had last time so our # re-selection code works. self._tournament_button_count = app.config.get('Tournament Rows', 0) @@ -83,18 +75,15 @@ class CoopBrowserWindow(bui.Window): self._hard_button_lock_image: bui.Widget | None = None self._campaign_percent_text: bui.Widget | None = None - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - self._width = 1520 if uiscale is bui.UIScale.SMALL else 1120 - self._x_inset = x_inset = 200 if uiscale is bui.UIScale.SMALL else 0 + uiscale = app.ui_v1.uiscale + self._width = 1600 if uiscale is bui.UIScale.SMALL else 1120 self._height = ( - 657 + 1200 if uiscale is bui.UIScale.SMALL else 730 if uiscale is bui.UIScale.MEDIUM else 800 ) - app.ui_v1.set_main_menu_location('Coop Select') self._r = 'coopSelectWindow' - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 + top_extra = 0 if uiscale is bui.UIScale.SMALL else 0 self._tourney_data_up_to_date = False @@ -104,7 +93,8 @@ class CoopBrowserWindow(bui.Window): if ( self._campaign_difficulty == 'hard' - and not app.classic.accounts.have_pro_options() + and HARD_REQUIRES_PRO + and not classic.accounts.have_pro_options() ): plus.add_v1_account_transaction( { @@ -115,103 +105,59 @@ class CoopBrowserWindow(bui.Window): ) self._campaign_difficulty = 'easy' + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.5 + if uiscale is bui.UIScale.SMALL + else 0.8 if uiscale is bui.UIScale.MEDIUM else 0.75 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 120, screensize[0] / scale) + target_height = min(self._height - 120, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 40 + self._scroll_bottom = yoffs - 70 - self._scroll_height + super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height + top_extra), toolbar_visibility='menu_full', - scale_origin_stack_offset=scale_origin, - stack_offset=( - (0, -15) - if uiscale is bui.UIScale.SMALL - else (0, 0) if uiscale is bui.UIScale.MEDIUM else (0, 0) - ), - transition=transition, - scale=( - 1.2 - if uiscale is bui.UIScale.SMALL - else 0.8 if uiscale is bui.UIScale.MEDIUM else 0.75 - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: - self._back_button = None + if uiscale is bui.UIScale.SMALL: + self._back_button = bui.get_special_widget('back_button') + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) else: self._back_button = bui.buttonwidget( parent=self._root_widget, - position=( - 75 + x_inset, - self._height - - 87 - - (4 if uiscale is bui.UIScale.SMALL else 0), - ), - size=(120, 60), + position=(75, yoffs - 48.0), + size=(60, 50), scale=1.2, autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) - - self._league_rank_button: LeagueRankButton | None - self._store_button: StoreButton | None - self._store_button_widget: bui.Widget | None - self._league_rank_button_widget: bui.Widget | None - - if not app.ui_v1.use_toolbars: - prb = self._league_rank_button = LeagueRankButton( - parent=self._root_widget, - position=( - self._width - (282 + x_inset), - self._height - - 85 - - (4 if uiscale is bui.UIScale.SMALL else 0), - ), - size=(100, 60), - color=(0.4, 0.4, 0.9), - textcolor=(0.9, 0.9, 2.0), - scale=1.05, - on_activate_call=bui.WeakCall(self._switch_to_league_rankings), + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button ) - self._league_rank_button_widget = prb.get_button() - - sbtn = self._store_button = StoreButton( - parent=self._root_widget, - position=( - self._width - (170 + x_inset), - self._height - - 85 - - (4 if uiscale is bui.UIScale.SMALL else 0), - ), - size=(100, 60), - color=(0.6, 0.4, 0.7), - show_tickets=True, - button_type='square', - sale_scale=0.85, - textcolor=(0.9, 0.7, 1.0), - scale=1.05, - on_activate_call=bui.WeakCall(self._switch_to_score, None), - ) - self._store_button_widget = sbtn.get_button() - bui.widget( - edit=self._back_button, - right_widget=self._league_rank_button_widget, - ) - bui.widget( - edit=self._league_rank_button_widget, - left_widget=self._back_button, - ) - else: - self._league_rank_button = None - self._store_button = None - self._store_button_widget = None - self._league_rank_button_widget = None - - # Move our corner buttons dynamically to keep them out of the way of - # the party icon :-( - self._update_corner_button_positions() - self._update_corner_button_positions_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update_corner_button_positions), repeat=True - ) self._last_tournament_query_time: float | None = None self._last_tournament_query_response_time: float | None = None @@ -224,14 +170,18 @@ class CoopBrowserWindow(bui.Window): 'Selected Coop Custom Level', None ) + if uiscale is bui.UIScale.SMALL: + tmaxw = 130 if bui.get_virtual_screen_size()[0] < 1320 else 175 + else: + tmaxw = 300 + # Don't want initial construction affecting our last-selected. self._do_selection_callbacks = False - v = self._height - 95 - txt = bui.textwidget( + bui.textwidget( parent=self._root_widget, position=( self._width * 0.5, - v + 40 - (0 if uiscale is bui.UIScale.SMALL else 0), + yoffs - (50 if uiscale is bui.UIScale.SMALL else 24), ), size=(0, 0), text=bui.Lstr( @@ -240,55 +190,66 @@ class CoopBrowserWindow(bui.Window): ), h_align='center', color=app.ui_v1.title_color, - scale=1.5, - maxwidth=500, + scale=0.85 if uiscale is bui.UIScale.SMALL else 1.5, + maxwidth=tmaxw, v_align='center', ) - if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: - bui.textwidget(edit=txt, text='') - - if self._back_button is not None: - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 50), - position=( - 75 + x_inset, - self._height - - 87 - - (4 if uiscale is bui.UIScale.SMALL else 0) - + 6, - ), - label=bui.charstr(bui.SpecialChar.BACK), - ) - self._selected_row = cfg.get('Selected Coop Row', None) - self._scroll_width = self._width - (130 + 2 * x_inset) - self._scroll_height = self._height - ( - 190 - if uiscale is bui.UIScale.SMALL and app.ui_v1.use_toolbars - else 160 - ) - self._subcontainerwidth = 800.0 self._subcontainerheight = 1400.0 self._scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, - position=( - (65 + x_inset, 120) - if uiscale is bui.UIScale.SMALL and app.ui_v1.use_toolbars - else (65 + x_inset, 70) - ), size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, + ), simple_culling_v=10.0, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, + border_opacity=0.4, ) + + if uiscale is bui.UIScale.SMALL: + blotchwidth = 500.0 + blotchheight = 200.0 + bimg = bui.imagewidget( + parent=self._root_widget, + texture=bui.gettexture('uiAtlas'), + mesh_transparent=bui.getmesh('windowBGBlotch'), + position=( + self._width * 0.5 + - self._scroll_width * 0.5 + + 60.0 + - blotchwidth * 0.5, + self._scroll_bottom - blotchheight * 0.5, + ), + size=(blotchwidth, blotchheight), + color=(0.4, 0.37, 0.49), + # color=(1, 0, 0), + ) + bui.widget(edit=bimg, depth_range=(0.9, 1.0)) + bimg = bui.imagewidget( + parent=self._root_widget, + texture=bui.gettexture('uiAtlas'), + mesh_transparent=bui.getmesh('windowBGBlotch'), + position=( + self._width * 0.5 + + self._scroll_width * 0.5 + - 60.0 + - blotchwidth * 0.5, + self._scroll_bottom - blotchheight * 0.5, + ), + size=(blotchwidth, blotchheight), + color=(0.4, 0.37, 0.49), + # color=(1, 0, 0), + ) + bui.widget(edit=bimg, depth_range=(0.9, 1.0)) + self._subcontainer: bui.Widget | None = None # Take note of our account state; we'll refresh later if this changes. @@ -309,17 +270,17 @@ class CoopBrowserWindow(bui.Window): # each one of those tournaments, go ahead and display it as a # starting point. if ( - app.classic.accounts.account_tournament_list is not None - and app.classic.accounts.account_tournament_list[0] + classic.accounts.account_tournament_list is not None + and classic.accounts.account_tournament_list[0] == plus.get_v1_account_state_num() and all( - t_id in app.classic.accounts.tournament_info - for t_id in app.classic.accounts.account_tournament_list[1] + t_id in classic.accounts.tournament_info + for t_id in classic.accounts.account_tournament_list[1] ) ): tourney_data = [ - app.classic.accounts.tournament_info[t_id] - for t_id in app.classic.accounts.account_tournament_list[1] + classic.accounts.tournament_info[t_id] + for t_id in classic.accounts.account_tournament_list[1] ] self._update_for_data(tourney_data) @@ -329,37 +290,24 @@ class CoopBrowserWindow(bui.Window): ) self._update() - def _update_corner_button_positions(self) -> None: - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - offs = ( - -55 - if uiscale is bui.UIScale.SMALL and bui.is_party_icon_visible() - else 0 + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) ) - if self._league_rank_button is not None: - self._league_rank_button.set_position( - ( - self._width - 282 + offs - self._x_inset, - self._height - - 85 - - (4 if uiscale is bui.UIScale.SMALL else 0), - ) - ) - if self._store_button is not None: - self._store_button.set_position( - ( - self._width - 170 + offs - self._x_inset, - self._height - - 85 - - (4 if uiscale is bui.UIScale.SMALL else 0), - ) - ) - # noinspection PyUnresolvedReferences + @override + def on_main_window_close(self) -> None: + self._save_state() + @staticmethod def _preload_modules() -> None: """Preload modules we use; avoids hitches (called in bg thread).""" + # pylint: disable=cyclic-import import bauiv1lib.purchase as _unused1 import bauiv1lib.coop.gamebutton as _unused2 import bauiv1lib.confirm as _unused3 @@ -382,9 +330,9 @@ class CoopBrowserWindow(bui.Window): cur_time = bui.apptime() - # If its been a while since we got a tournament update, consider the - # data invalid (prevents us from joining tournaments if our internet - # connection goes down for a while). + # If its been a while since we got a tournament update, consider + # the data invalid (prevents us from joining tournaments if our + # internet connection goes down for a while). if ( self._last_tournament_query_response_time is None or bui.apptime() - self._last_tournament_query_response_time @@ -392,8 +340,10 @@ class CoopBrowserWindow(bui.Window): ): self._tourney_data_up_to_date = False - # If our account state has changed, do a full request. + # If our account login state has changed, do a + # full request. account_state_num = plus.get_v1_account_state_num() + if account_state_num != self._account_state_num: self._account_state_num = account_state_num self._save_state() @@ -459,15 +409,21 @@ class CoopBrowserWindow(bui.Window): bui.imagewidget( edit=self._hard_button_lock_image, opacity=( - 0.0 if bui.app.classic.accounts.have_pro_options() else 1.0 + 0.0 + if ( + (not HARD_REQUIRES_PRO) + or bui.app.classic.accounts.have_pro_options() + ) + else 1.0 ), ) except Exception: logging.exception('Error updating campaign lock.') def _update_for_data(self, data: list[dict[str, Any]] | None) -> None: - # If the number of tournaments or challenges in the data differs from - # our current arrangement, refresh with the new number. + + # If the number of tournaments or challenges in the data differs + # from our current arrangement, refresh with the new number. if (data is None and self._tournament_button_count != 0) or ( data is not None and (len(data) != self._tournament_button_count) ): @@ -519,6 +475,7 @@ class CoopBrowserWindow(bui.Window): if difficulty != self._campaign_difficulty: if ( difficulty == 'hard' + and HARD_REQUIRES_PRO and not bui.app.classic.accounts.have_pro_options() ): PurchaseWindow(items=['pro']) @@ -541,6 +498,7 @@ class CoopBrowserWindow(bui.Window): def _refresh_campaign_row(self) -> None: # pylint: disable=too-many-locals + # pylint: disable=too-many-statements # pylint: disable=cyclic-import from bauiv1lib.coop.gamebutton import GameButton @@ -660,14 +618,19 @@ class CoopBrowserWindow(bui.Window): bui.widget(edit=campaign_buttons[0], left_widget=self._easy_button) - if self._back_button is not None: - bui.widget(edit=self._easy_button, up_widget=self._back_button) - for btn in campaign_buttons: - bui.widget( - edit=btn, - up_widget=self._back_button, - down_widget=next_widget_down, - ) + bui.widget( + edit=self._easy_button, + left_widget=self._back_button, + up_widget=self._back_button, + ) + bui.widget(edit=self._hard_button, left_widget=self._back_button) + for btn in campaign_buttons: + bui.widget( + edit=btn, + up_widget=self._back_button, + ) + for btn in campaign_buttons: + bui.widget(edit=btn, down_widget=next_widget_down) # Update our existing percent-complete text. assert bui.app.classic is not None @@ -721,7 +684,7 @@ class CoopBrowserWindow(bui.Window): tourney_row_height = 200 self._subcontainerheight = ( - 620 + self._tournament_button_count * tourney_row_height + 700 + self._tournament_button_count * tourney_row_height ) self._subcontainer = bui.containerwidget( @@ -729,22 +692,17 @@ class CoopBrowserWindow(bui.Window): size=(self._subcontainerwidth, self._subcontainerheight), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) bui.containerwidget( edit=self._root_widget, selected_child=self._scrollwidget ) - if self._back_button is not None: - bui.containerwidget( - edit=self._root_widget, cancel_button=self._back_button - ) w_parent = self._subcontainer h_base = 6 - v = self._subcontainerheight - 73 + v = self._subcontainerheight - 90 self._campaign_percent_text = bui.textwidget( parent=w_parent, @@ -757,12 +715,12 @@ class CoopBrowserWindow(bui.Window): scale=1.1, ) - row_v_show_buffer = 100 + row_v_show_buffer = 80 v -= 198 h_scroll = bui.hscrollwidget( parent=w_parent, - size=(self._scroll_width - 10, 205), + size=(self._scroll_width, 205), position=(-5, v), simple_culling_h=70, highlight=False, @@ -817,17 +775,17 @@ class CoopBrowserWindow(bui.Window): textcolor=(0.7, 0.6, 0.75), autoselect=True, up_widget=self._campaign_h_scroll, + left_widget=self._back_button, on_activate_call=self._on_tournament_info_press, ) bui.widget( edit=self._tournament_info_button, - left_widget=self._tournament_info_button, right_widget=self._tournament_info_button, ) - # Say 'unavailable' if there are zero tournaments, and if we're not - # signed in add that as well (that's probably why we see - # no tournaments). + # Say 'unavailable' if there are zero tournaments, and if we're + # not signed in add that as well (that's probably why we see no + # tournaments). if self._tournament_button_count == 0: unavailable_text = bui.Lstr(resource='unavailableText') if plus.get_v1_account_state() != 'signed_in': @@ -856,7 +814,7 @@ class CoopBrowserWindow(bui.Window): for i in range(self._tournament_button_count): tournament_h_scroll = h_scroll = bui.hscrollwidget( parent=w_parent, - size=(self._scroll_width - 10, 205), + size=(self._scroll_width, 205), position=(-5, v), highlight=False, border_opacity=0.0, @@ -926,7 +884,7 @@ class CoopBrowserWindow(bui.Window): # Show easter-egg-hunt either if its easter or we own it. if plus.get_v1_account_misc_read_val( 'easter', False - ) or plus.get_purchased('games.easter_egg_hunt'): + ) or plus.get_v1_account_product_purchased('games.easter_egg_hunt'): items = [ 'Challenges:Easter Egg Hunt', 'Challenges:Pro Easter Egg Hunt', @@ -938,7 +896,7 @@ class CoopBrowserWindow(bui.Window): self._custom_h_scroll = custom_h_scroll = h_scroll = bui.hscrollwidget( parent=w_parent, - size=(self._scroll_width - 10, 205), + size=(self._scroll_width, 205), position=(-5, v), highlight=False, border_opacity=0.0, @@ -989,6 +947,7 @@ class CoopBrowserWindow(bui.Window): if i + 1 < len(self._tournament_buttons) else custom_h_scroll ), + left_widget=self._back_button, ) bui.widget( edit=tbutton.more_scores_button, @@ -1007,7 +966,7 @@ class CoopBrowserWindow(bui.Window): ), ) - for btn in self._custom_buttons: + for i, btn in enumerate(self._custom_buttons): try: bui.widget( edit=btn.get_button(), @@ -1017,18 +976,14 @@ class CoopBrowserWindow(bui.Window): else self._tournament_info_button ), ) + if i == 0: + bui.widget( + edit=btn.get_button(), left_widget=self._back_button + ) + except Exception: logging.exception('Error wiring up custom buttons.') - if self._back_button is not None: - bui.buttonwidget( - edit=self._back_button, on_activate_call=self._back - ) - else: - bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back - ) - # There's probably several 'onSelected' callbacks pushed onto the # event queue.. we need to push ours too so we're enabled *after* them. bui.pushcall(self._enable_selectable_callback) @@ -1041,75 +996,42 @@ class CoopBrowserWindow(bui.Window): def _enable_selectable_callback(self) -> None: self._do_selection_callbacks = True - def _switch_to_league_rankings(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.account import show_sign_in_prompt - from bauiv1lib.league.rankwindow import LeagueRankWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - plus = bui.app.plus - assert plus is not None - - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert self._league_rank_button is not None - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - LeagueRankWindow( - origin_widget=self._league_rank_button.get_button() - ).get_root_widget(), - from_window=self._root_widget, - ) - - def _switch_to_score( - self, - show_tab: ( - StoreBrowserWindow.TabID | None - ) = StoreBrowserWindow.TabID.EXTRAS, - ) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.account import show_sign_in_prompt - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - plus = bui.app.plus - assert plus is not None - - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert self._store_button is not None - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - StoreBrowserWindow( - origin_widget=self._store_button.get_button(), - show_tab=show_tab, - back_location='CoopBrowserWindow', - ).get_root_widget(), - from_window=self._root_widget, - ) - def is_tourney_data_up_to_date(self) -> bool: """Return whether our tourney data is up to date.""" return self._tourney_data_up_to_date - def run_game(self, game: str) -> None: + def run_game( + self, game: str, origin_widget: bui.Widget | None = None + ) -> None: + """Run the provided game.""" + from efro.util import strict_partial + from bauiv1lib.confirm import ConfirmWindow + + classic = bui.app.classic + assert classic is not None + + if classic.chest_dock_full: + ConfirmWindow( + bui.Lstr(resource='chests.slotsFullWarningText'), + width=550, + height=140, + ok_text=bui.Lstr(resource='continueText'), + origin_widget=origin_widget, + action=strict_partial( + self._run_game, game=game, origin_widget=origin_widget + ), + ) + else: + self._run_game(game=game, origin_widget=origin_widget) + + def _run_game( + self, game: str, origin_widget: bui.Widget | None = None + ) -> None: """Run the provided game.""" - # pylint: disable=too-many-branches # pylint: disable=cyclic-import from bauiv1lib.confirm import ConfirmWindow from bauiv1lib.purchase import PurchaseWindow - from bauiv1lib.account import show_sign_in_prompt + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None @@ -1130,50 +1052,18 @@ class CoopBrowserWindow(bui.Window): ) return - # Infinite onslaught/runaround require pro; bring up a store link - # if need be. - if ( - game - in ( - 'Challenges:Infinite Runaround', - 'Challenges:Infinite Onslaught', - ) - and not bui.app.classic.accounts.have_pro() - ): - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - else: - PurchaseWindow(items=['pro']) - return + required_purchases = bui.app.classic.required_purchases_for_game(game) - required_purchase: str | None - if game in ['Challenges:Meteor Shower']: - required_purchase = 'games.meteor_shower' - elif game in [ - 'Challenges:Target Practice', - 'Challenges:Target Practice B', - ]: - required_purchase = 'games.target_practice' - elif game in ['Challenges:Ninja Fight']: - required_purchase = 'games.ninja_fight' - elif game in ['Challenges:Pro Ninja Fight']: - required_purchase = 'games.ninja_fight' - elif game in [ - 'Challenges:Easter Egg Hunt', - 'Challenges:Pro Easter Egg Hunt', - ]: - required_purchase = 'games.easter_egg_hunt' - else: - required_purchase = None - - if required_purchase is not None and not plus.get_purchased( - required_purchase - ): - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - else: - PurchaseWindow(items=[required_purchase]) - return + # Show pop-up to allow purchasing any required stuff we don't have. + for purchase in required_purchases: + if not plus.get_v1_account_product_purchased(purchase): + if plus.get_v1_account_state() != 'signed_in': + show_sign_in_prompt() + else: + PurchaseWindow( + items=[purchase], origin_widget=origin_widget + ) + return self._save_state() @@ -1182,12 +1072,18 @@ class CoopBrowserWindow(bui.Window): def run_tournament(self, tournament_button: TournamentButton) -> None: """Run the provided tournament game.""" - from bauiv1lib.account import show_sign_in_prompt + # pylint: disable=too-many-return-statements + + from bauiv1lib.purchase import PurchaseWindow + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.tournamententry import TournamentEntryWindow plus = bui.app.plus assert plus is not None + classic = bui.app.classic + assert classic is not None + if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return @@ -1237,6 +1133,38 @@ class CoopBrowserWindow(bui.Window): bui.getsound('error').play() return + if tournament_button.game is not None and not classic.is_game_unlocked( + tournament_button.game + ): + required_purchases = classic.required_purchases_for_game( + tournament_button.game + ) + # We gotta be missing *something* if its locked. + assert required_purchases + + for purchase in required_purchases: + if not plus.get_v1_account_product_purchased(purchase): + if plus.get_v1_account_state() != 'signed_in': + show_sign_in_prompt() + else: + PurchaseWindow( + items=[purchase], + origin_widget=tournament_button.button, + ) + return + + # assert required_purchases + # if plus.get_v1_account_state() != 'signed_in': + # show_sign_in_prompt() + # else: + # # Hmm; just show the first requirement. They can come + # # back to see more after they purchase the first. + # PurchaseWindow( + # items=[required_purchases[0]], + # origin_widget=tournament_button.button, + # ) + # return + if tournament_button.time_remaining <= 0: bui.screenmessage( bui.Lstr(resource='tournamentEndedText'), color=(1, 0, 0) @@ -1252,35 +1180,12 @@ class CoopBrowserWindow(bui.Window): position=tournament_button.button.get_screen_space_center(), ) - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.play import PlayWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - # If something is selected, store it. - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlayWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - def _save_state(self) -> None: cfg = bui.app.config try: sel = self._root_widget.get_selected_child() if sel == self._back_button: sel_name = 'Back' - elif sel == self._store_button_widget: - sel_name = 'Store' - elif sel == self._league_rank_button_widget: - sel_name = 'PowerRanking' elif sel == self._scrollwidget: sel_name = 'Scroll' else: @@ -1305,10 +1210,6 @@ class CoopBrowserWindow(bui.Window): sel = self._back_button elif sel_name == 'Scroll': sel = self._scrollwidget - elif sel_name == 'PowerRanking': - sel = self._league_rank_button_widget - elif sel_name == 'Store': - sel = self._store_button_widget else: sel = self._scrollwidget bui.containerwidget(edit=self._root_widget, selected_child=sel) diff --git a/dist/ba_data/python/bauiv1lib/coop/gamebutton.py b/dist/ba_data/python/bauiv1lib/coop/gamebutton.py index 5172e3a..55a06d7 100644 --- a/dist/ba_data/python/bauiv1lib/coop/gamebutton.py +++ b/dist/ba_data/python/bauiv1lib/coop/gamebutton.py @@ -5,6 +5,7 @@ from __future__ import annotations import random +import weakref from typing import TYPE_CHECKING import bauiv1 as bui @@ -26,6 +27,7 @@ class GameButton: select: bool, row: str, ): + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-statements # pylint: disable=too-many-locals @@ -58,12 +60,15 @@ class GameButton: else: stars = 1 + self._window = weakref.ref(window) + self._game = game + self._button = btn = bui.buttonwidget( parent=parent, position=(x + 23, y + 4), size=(sclx, scly), label='', - on_activate_call=bui.Call(window.run_game, game), + on_activate_call=self._on_press, button_type='square', autoselect=True, on_select_call=bui.Call(window.sel_change, row, game), @@ -186,12 +191,16 @@ class GameButton: ) self._update() + def _on_press(self) -> None: + window = self._window() + if window is not None: + window.run_game(self._game, origin_widget=self._button) + def get_button(self) -> bui.Widget: """Return the underlying button bui.Widget.""" return self._button def _update(self) -> None: - # pylint: disable=too-many-boolean-expressions plus = bui.app.plus assert plus is not None @@ -231,44 +240,7 @@ class GameButton: # Hard-code games we haven't unlocked. assert bui.app.classic is not None - if ( - ( - game - in ( - 'Challenges:Infinite Runaround', - 'Challenges:Infinite Onslaught', - ) - and not bui.app.classic.accounts.have_pro() - ) - or ( - game in ('Challenges:Meteor Shower',) - and not plus.get_purchased('games.meteor_shower') - ) - or ( - game - in ( - 'Challenges:Target Practice', - 'Challenges:Target Practice B', - ) - and not plus.get_purchased('games.target_practice') - ) - or ( - game in ('Challenges:Ninja Fight',) - and not plus.get_purchased('games.ninja_fight') - ) - or ( - game in ('Challenges:Pro Ninja Fight',) - and not plus.get_purchased('games.ninja_fight') - ) - or ( - game - in ( - 'Challenges:Easter Egg Hunt', - 'Challenges:Pro Easter Egg Hunt', - ) - and not plus.get_purchased('games.easter_egg_hunt') - ) - ): + if not bui.app.classic.is_game_unlocked(game): unlocked = False # Let's tint levels a slightly different color when easy mode diff --git a/dist/ba_data/python/bauiv1lib/coop/tournamentbutton.py b/dist/ba_data/python/bauiv1lib/coop/tournamentbutton.py index 1c5a926..f24d370 100644 --- a/dist/ba_data/python/bauiv1lib/coop/tournamentbutton.py +++ b/dist/ba_data/python/bauiv1lib/coop/tournamentbutton.py @@ -12,6 +12,11 @@ import bauiv1 as bui if TYPE_CHECKING: from typing import Any, Callable +# As of 1.7.37, no longer charging entry fees for tourneys (tourneys now +# reward chests and the game now makes its money from tokens/ads used to +# speed up chest openings). +USE_ENTRY_FEES = False + class TournamentButton: """Button showing a tournament in coop window.""" @@ -24,6 +29,8 @@ class TournamentButton: select: bool, on_pressed: Callable[[TournamentButton], None], ) -> None: + # pylint: disable=too-many-positional-arguments + # pylint: disable=too-many-statements self._r = 'coopSelectWindow' sclx = 300 scly = 195.0 @@ -32,10 +39,12 @@ class TournamentButton: self.lsbo = bui.getmesh('level_select_button_opaque') self.allow_ads = False self.tournament_id: str | None = None + self.game: str | None = None self.time_remaining: int = 0 self.has_time_remaining: bool = False self.leader: Any = None self.required_league: str | None = None + self._base_x_offs = 0 if USE_ENTRY_FEES else -45.0 self.button = btn = bui.buttonwidget( parent=parent, position=(x + 23, y + 4), @@ -73,8 +82,8 @@ class TournamentButton: self.lock_image = bui.imagewidget( parent=parent, draw_controller=btn, - position=(x + 21 + sclx * 0.5 - image_width * 0.25, y + scly - 150), - size=(image_width * 0.5, image_width * 0.5), + position=(x + 21 + sclx * 0.5 - image_width * 0.15, y + scly - 130), + size=(image_width * 0.3, image_width * 0.3), texture=bui.gettexture('lock'), opacity=0.0, ) @@ -95,69 +104,72 @@ class TournamentButton: header_color = (0.43, 0.4, 0.5, 1) value_color = (0.6, 0.6, 0.6, 1) - x_offs = 0 - bui.textwidget( - parent=parent, - draw_controller=btn, - position=(x + 360, y + scly - 20), - size=(0, 0), - h_align='center', - text=bui.Lstr(resource=f'{self._r}.entryFeeText'), - v_align='center', - maxwidth=100, - scale=0.9, - color=header_color, - flatness=1.0, - ) + x_offs = self._base_x_offs - self.entry_fee_text_top = bui.textwidget( - parent=parent, - draw_controller=btn, - position=(x + 360, y + scly - 60), - size=(0, 0), - h_align='center', - text='-', - v_align='center', - maxwidth=60, - scale=1.3, - color=value_color, - flatness=1.0, - ) - self.entry_fee_text_or = bui.textwidget( - parent=parent, - draw_controller=btn, - position=(x + 360, y + scly - 90), - size=(0, 0), - h_align='center', - text='', - v_align='center', - maxwidth=60, - scale=0.5, - color=value_color, - flatness=1.0, - ) - self.entry_fee_text_remaining = bui.textwidget( - parent=parent, - draw_controller=btn, - position=(x + 360, y + scly - 90), - size=(0, 0), - h_align='center', - text='', - v_align='center', - maxwidth=60, - scale=0.5, - color=value_color, - flatness=1.0, - ) + # No longer using entry fees. + if USE_ENTRY_FEES: + bui.textwidget( + parent=parent, + draw_controller=btn, + position=(x + 360, y + scly - 20), + size=(0, 0), + h_align='center', + text=bui.Lstr(resource=f'{self._r}.entryFeeText'), + v_align='center', + maxwidth=100, + scale=0.9, + color=header_color, + flatness=1.0, + ) - self.entry_fee_ad_image = bui.imagewidget( - parent=parent, - size=(40, 40), - draw_controller=btn, - position=(x + 360 - 20, y + scly - 140), - opacity=0.0, - texture=bui.gettexture('tv'), - ) + self.entry_fee_text_top = bui.textwidget( + parent=parent, + draw_controller=btn, + position=(x + 360, y + scly - 60), + size=(0, 0), + h_align='center', + text='-', + v_align='center', + maxwidth=60, + scale=1.3, + color=value_color, + flatness=1.0, + ) + self.entry_fee_text_or = bui.textwidget( + parent=parent, + draw_controller=btn, + position=(x + 360, y + scly - 90), + size=(0, 0), + h_align='center', + text='', + v_align='center', + maxwidth=60, + scale=0.5, + color=value_color, + flatness=1.0, + ) + self.entry_fee_text_remaining = bui.textwidget( + parent=parent, + draw_controller=btn, + position=(x + 360, y + scly - 90), + size=(0, 0), + h_align='center', + text='', + v_align='center', + maxwidth=60, + scale=0.5, + color=value_color, + flatness=1.0, + ) + + self.entry_fee_ad_image = bui.imagewidget( + parent=parent, + size=(40, 40), + draw_controller=btn, + position=(x + 360 - 20, y + scly - 140), + opacity=0.0, + texture=bui.gettexture('tv'), + ) x_offs += 50 @@ -179,8 +191,8 @@ class TournamentButton: self.button_y = y self.button_scale_y = scly - xo2 = 0 - prize_value_scale = 1.5 + # Offset for prize range/values. + xo2 = 0.0 self.prize_range_1_text = bui.textwidget( parent=parent, @@ -190,7 +202,7 @@ class TournamentButton: h_align='right', v_align='center', maxwidth=50, - text='-', + text='', scale=0.8, color=header_color, flatness=1.0, @@ -201,13 +213,21 @@ class TournamentButton: position=(x + 380 + xo2 + x_offs, y + scly - 93), size=(0, 0), h_align='left', - text='-', + text='', v_align='center', maxwidth=100, - scale=prize_value_scale, color=value_color, flatness=1.0, ) + self._chestsz = 50 + self.prize_chest_1_image = bui.imagewidget( + parent=parent, + draw_controller=btn, + texture=bui.gettexture('white'), + position=(x + 380 + xo2 + x_offs, y + scly - 93), + size=(self._chestsz, self._chestsz), + opacity=0.0, + ) self.prize_range_2_text = bui.textwidget( parent=parent, @@ -215,6 +235,7 @@ class TournamentButton: position=(x + 355 + xo2 + x_offs, y + scly - 93), size=(0, 0), h_align='right', + text='', v_align='center', maxwidth=50, scale=0.8, @@ -230,10 +251,17 @@ class TournamentButton: text='', v_align='center', maxwidth=100, - scale=prize_value_scale, color=value_color, flatness=1.0, ) + self.prize_chest_2_image = bui.imagewidget( + parent=parent, + draw_controller=btn, + texture=bui.gettexture('white'), + position=(x + 380 + xo2 + x_offs, y + scly - 93), + size=(self._chestsz, self._chestsz), + opacity=0.0, + ) self.prize_range_3_text = bui.textwidget( parent=parent, @@ -241,6 +269,7 @@ class TournamentButton: position=(x + 355 + xo2 + x_offs, y + scly - 93), size=(0, 0), h_align='right', + text='', v_align='center', maxwidth=50, scale=0.8, @@ -256,15 +285,22 @@ class TournamentButton: text='', v_align='center', maxwidth=100, - scale=prize_value_scale, color=value_color, flatness=1.0, ) + self.prize_chest_3_image = bui.imagewidget( + parent=parent, + draw_controller=btn, + texture=bui.gettexture('white'), + position=(x + 380 + xo2 + x_offs, y + scly - 93), + size=(self._chestsz, self._chestsz), + opacity=0.0, + ) bui.textwidget( parent=parent, draw_controller=btn, - position=(x + 620 + x_offs, y + scly - 20), + position=(x + 625 + x_offs, y + scly - 20), size=(0, 0), h_align='center', text=bui.Lstr(resource=f'{self._r}.currentBestText'), @@ -278,7 +314,7 @@ class TournamentButton: parent=parent, draw_controller=btn, position=( - x + 620 + x_offs - (170 / 1.4) * 0.5, + x + 625 + x_offs - (170 / 1.4) * 0.5, y + scly - 60 - 40 * 0.5, ), selectable=True, @@ -298,7 +334,7 @@ class TournamentButton: self.current_leader_score_text = bui.textwidget( parent=parent, draw_controller=btn, - position=(x + 620 + x_offs, y + scly - 113 + 10), + position=(x + 625 + x_offs, y + scly - 113 + 10), size=(0, 0), h_align='center', text='-', @@ -311,7 +347,7 @@ class TournamentButton: self.more_scores_button = bui.buttonwidget( parent=parent, - position=(x + 620 + x_offs - 60, y + scly - 50 - 125), + position=(x + 625 + x_offs - 60, y + scly - 50 - 125), color=(0.5, 0.5, 0.6), textcolor=(0.7, 0.7, 0.8), label='-', @@ -329,7 +365,7 @@ class TournamentButton: bui.textwidget( parent=parent, draw_controller=btn, - position=(x + 820 + x_offs, y + scly - 20), + position=(x + 840 + x_offs, y + scly - 20), size=(0, 0), h_align='center', text=bui.Lstr(resource=f'{self._r}.timeRemainingText'), @@ -342,7 +378,7 @@ class TournamentButton: self.time_remaining_value_text = bui.textwidget( parent=parent, draw_controller=btn, - position=(x + 820 + x_offs, y + scly - 68), + position=(x + 840 + x_offs, y + scly - 68), size=(0, 0), h_align='center', text='-', @@ -355,7 +391,7 @@ class TournamentButton: self.time_remaining_out_of_text = bui.textwidget( parent=parent, draw_controller=btn, - position=(x + 820 + x_offs, y + scly - 110), + position=(x + 840 + x_offs, y + scly - 110), size=(0, 0), h_align='center', text='-', @@ -365,6 +401,9 @@ class TournamentButton: color=(0.4, 0.4, 0.5), flatness=1.0, ) + self._lock_update_timer = bui.AppTimer( + 1.03, bui.WeakCall(self._update_lock_state), repeat=True + ) def _pressed(self) -> None: self.on_pressed(self) @@ -405,6 +444,33 @@ class TournamentButton: position=self.more_scores_button.get_screen_space_center(), ) + def _update_lock_state(self) -> None: + + if self.game is None: + return + + assert bui.app.classic is not None + + campaignname, levelname = self.game.split(':') + campaign = bui.app.classic.getcampaign(campaignname) + + enabled = ( + self.required_league is None + and bui.app.classic.is_game_unlocked(self.game) + ) + bui.buttonwidget( + edit=self.button, + color=(0.5, 0.7, 0.2) if enabled else (0.5, 0.5, 0.5), + ) + bui.imagewidget(edit=self.lock_image, opacity=0.0 if enabled else 1.0) + bui.imagewidget( + edit=self.image, + texture=bui.gettexture( + campaign.getlevel(levelname).preview_texture_name + ), + opacity=1.0 if enabled else 0.5, + ) + def update_for_data(self, entry: dict[str, Any]) -> None: """Update for new incoming data.""" # pylint: disable=too-many-statements @@ -414,105 +480,132 @@ class TournamentButton: plus = bui.app.plus assert plus is not None - assert bui.app.classic is not None + classic = bui.app.classic + assert classic is not None + prize_y_offs = ( 34 if 'prizeRange3' in entry else 20 if 'prizeRange2' in entry else 12 ) - x_offs = 90 + x_offs = self._base_x_offs + 90 - # pylint: disable=useless-suppression - # pylint: disable=unbalanced-tuple-unpacking - ( - pr1, - pv1, - pr2, - pv2, - pr3, - pv3, - ) = bui.app.classic.get_tournament_prize_strings(entry) - # pylint: enable=unbalanced-tuple-unpacking - # pylint: enable=useless-suppression + # Special offset for prize ranges/vals. + x_offs2 = x_offs - 20.0 - enabled = 'requiredLeague' not in entry - bui.buttonwidget( - edit=self.button, - color=(0.5, 0.7, 0.2) if enabled else (0.5, 0.5, 0.5), + # Special offset for prize chests. + x_offs2c = x_offs2 + 50 + + # Fetch prize range and trophy strings. + (pr1, pv1, pr2, pv2, pr3, pv3) = classic.get_tournament_prize_strings( + entry, include_tickets=False ) - bui.imagewidget(edit=self.lock_image, opacity=0.0 if enabled else 1.0) + + self.time_remaining = entry['timeRemaining'] + self.has_time_remaining = entry is not None + self.tournament_id = entry['tournamentID'] + self.required_league = entry.get('requiredLeague') + + assert bui.app.classic is not None + self.game = bui.app.classic.accounts.tournament_info[ + self.tournament_id + ]['game'] + assert isinstance(self.game, str) + + campaignname, levelname = self.game.split(':') + campaign = bui.app.classic.getcampaign(campaignname) + + self._update_lock_state() + bui.textwidget( edit=self.prize_range_1_text, text='-' if pr1 == '' else pr1, position=( - self.button_x + 365 + x_offs, + self.button_x + 365 + x_offs2, self.button_y + self.button_scale_y - 93 + prize_y_offs, ), ) - # We want to draw values containing tickets a bit smaller - # (scratch that; we now draw medals a bit bigger). - ticket_char = bui.charstr(bui.SpecialChar.TICKET_BACKING) - prize_value_scale_large = 1.0 - prize_value_scale_small = 1.0 - bui.textwidget( edit=self.prize_value_1_text, text='-' if pv1 == '' else pv1, - scale=( - prize_value_scale_large - if ticket_char not in pv1 - else prize_value_scale_small - ), position=( - self.button_x + 380 + x_offs, + self.button_x + 380 + x_offs2, self.button_y + self.button_scale_y - 93 + prize_y_offs, ), ) + bui.imagewidget( + edit=self.prize_chest_1_image, + position=( + self.button_x + 380 + x_offs2c, + self.button_y + + self.button_scale_y + - 93 + + prize_y_offs + - 0.5 * self._chestsz, + ), + ) + classic.set_tournament_prize_image(entry, 0, self.prize_chest_1_image) bui.textwidget( edit=self.prize_range_2_text, text=pr2, position=( - self.button_x + 365 + x_offs, + self.button_x + 365 + x_offs2, self.button_y + self.button_scale_y - 93 - 45 + prize_y_offs, ), ) bui.textwidget( edit=self.prize_value_2_text, text=pv2, - scale=( - prize_value_scale_large - if ticket_char not in pv2 - else prize_value_scale_small - ), position=( - self.button_x + 380 + x_offs, + self.button_x + 380 + x_offs2, self.button_y + self.button_scale_y - 93 - 45 + prize_y_offs, ), ) + bui.imagewidget( + edit=self.prize_chest_2_image, + position=( + self.button_x + 380 + x_offs2c, + self.button_y + + self.button_scale_y + - 93 + - 45 + + prize_y_offs + - 0.5 * self._chestsz, + ), + ) + classic.set_tournament_prize_image(entry, 1, self.prize_chest_2_image) bui.textwidget( edit=self.prize_range_3_text, text=pr3, position=( - self.button_x + 365 + x_offs, + self.button_x + 365 + x_offs2, self.button_y + self.button_scale_y - 93 - 90 + prize_y_offs, ), ) bui.textwidget( edit=self.prize_value_3_text, text=pv3, - scale=( - prize_value_scale_large - if ticket_char not in pv3 - else prize_value_scale_small - ), position=( - self.button_x + 380 + x_offs, + self.button_x + 380 + x_offs2, self.button_y + self.button_scale_y - 93 - 90 + prize_y_offs, ), ) + bui.imagewidget( + edit=self.prize_chest_3_image, + position=( + self.button_x + 380 + x_offs2c, + self.button_y + + self.button_scale_y + - 93 + - 90 + + prize_y_offs + - 0.5 * self._chestsz, + ), + ) + classic.set_tournament_prize_image(entry, 2, self.prize_chest_3_image) leader_name = '-' leader_score: str | bui.Lstr = '-' @@ -552,52 +645,33 @@ class TournamentButton: edit=self.time_remaining_out_of_text, text=out_of_time_text ) - self.time_remaining = entry['timeRemaining'] - self.has_time_remaining = entry is not None - self.tournament_id = entry['tournamentID'] - self.required_league = ( - None if 'requiredLeague' not in entry else entry['requiredLeague'] - ) + # if self.game is None: + # bui.textwidget(edit=self.button_text, text='-') + # bui.imagewidget( + # edit=self.image, texture=bui.gettexture('black'), opacity=0.2 + # ) + # else: + max_players = bui.app.classic.accounts.tournament_info[ + self.tournament_id + ]['maxPlayers'] - assert bui.app.classic is not None - game = bui.app.classic.accounts.tournament_info[self.tournament_id][ - 'game' - ] - - if game is None: - bui.textwidget(edit=self.button_text, text='-') - bui.imagewidget( - edit=self.image, texture=bui.gettexture('black'), opacity=0.2 - ) - else: - campaignname, levelname = game.split(':') - campaign = bui.app.classic.getcampaign(campaignname) - max_players = bui.app.classic.accounts.tournament_info[ - self.tournament_id - ]['maxPlayers'] - txt = bui.Lstr( - value='${A} ${B}', - subs=[ - ('${A}', campaign.getlevel(levelname).displayname), - ( - '${B}', - bui.Lstr( - resource='playerCountAbbreviatedText', - subs=[('${COUNT}', str(max_players))], - ), + txt = bui.Lstr( + value='${A} ${B}', + subs=[ + ('${A}', campaign.getlevel(levelname).displayname), + ( + '${B}', + bui.Lstr( + resource='playerCountAbbreviatedText', + subs=[('${COUNT}', str(max_players))], ), - ], - ) - bui.textwidget(edit=self.button_text, text=txt) - bui.imagewidget( - edit=self.image, - texture=bui.gettexture( - campaign.getlevel(levelname).preview_texture_name ), - opacity=1.0 if enabled else 0.5, - ) + ], + ) + bui.textwidget(edit=self.button_text, text=txt) fee = entry['fee'] + assert isinstance(fee, int | None) if fee is None: fee_var = None @@ -609,18 +683,23 @@ class TournamentButton: fee_var = 'price.tournament_entry_2' elif fee == 1: fee_var = 'price.tournament_entry_1' + elif fee == -1: + fee_var = None else: if fee != 0: print('Unknown fee value:', fee) fee_var = 'price.tournament_entry_0' - self.allow_ads = allow_ads = entry['allowAds'] + self.allow_ads = allow_ads = ( + entry['allowAds'] if USE_ENTRY_FEES else False + ) - final_fee: int | None = ( + final_fee = ( None if fee_var is None else plus.get_v1_account_misc_read_val(fee_var, '?') ) + assert isinstance(final_fee, int | None) final_fee_str: str | bui.Lstr if fee_var is None: @@ -637,72 +716,77 @@ class TournamentButton: ad_tries_remaining = bui.app.classic.accounts.tournament_info[ self.tournament_id ]['adTriesRemaining'] + assert isinstance(ad_tries_remaining, int | None) free_tries_remaining = bui.app.classic.accounts.tournament_info[ self.tournament_id ]['freeTriesRemaining'] + assert isinstance(free_tries_remaining, int | None) - # Now, if this fee allows ads and we support video ads, show - # the 'or ad' version. - if allow_ads and plus.has_video_ads(): - ads_enabled = plus.have_incentivized_ad() - bui.imagewidget( - edit=self.entry_fee_ad_image, - opacity=1.0 if ads_enabled else 0.25, - ) - or_text = ( - bui.Lstr(resource='orText', subs=[('${A}', ''), ('${B}', '')]) - .evaluate() - .strip() - ) - bui.textwidget(edit=self.entry_fee_text_or, text=or_text) - bui.textwidget( - edit=self.entry_fee_text_top, - position=( - self.button_x + 360, - self.button_y + self.button_scale_y - 60, - ), - scale=1.3, - text=final_fee_str, - ) + # Now, if this fee allows ads and we support video ads, show the + # 'or ad' version. + if USE_ENTRY_FEES: + if allow_ads and plus.has_video_ads(): + ads_enabled = plus.have_incentivized_ad() + bui.imagewidget( + edit=self.entry_fee_ad_image, + opacity=1.0 if ads_enabled else 0.25, + ) + or_text = ( + bui.Lstr( + resource='orText', subs=[('${A}', ''), ('${B}', '')] + ) + .evaluate() + .strip() + ) + bui.textwidget(edit=self.entry_fee_text_or, text=or_text) + bui.textwidget( + edit=self.entry_fee_text_top, + position=( + self.button_x + 360, + self.button_y + self.button_scale_y - 60, + ), + scale=1.3, + text=final_fee_str, + ) - # Possibly show number of ad-plays remaining. - bui.textwidget( - edit=self.entry_fee_text_remaining, - position=( - self.button_x + 360, - self.button_y + self.button_scale_y - 146, - ), - text=( - '' - if ad_tries_remaining in [None, 0] - else ('' + str(ad_tries_remaining)) - ), - color=(0.6, 0.6, 0.6, 1 if ads_enabled else 0.2), - ) - else: - bui.imagewidget(edit=self.entry_fee_ad_image, opacity=0.0) - bui.textwidget(edit=self.entry_fee_text_or, text='') - bui.textwidget( - edit=self.entry_fee_text_top, - position=( - self.button_x + 360, - self.button_y + self.button_scale_y - 80, - ), - scale=1.3, - text=final_fee_str, - ) + # Possibly show number of ad-plays remaining. + bui.textwidget( + edit=self.entry_fee_text_remaining, + position=( + self.button_x + 360, + self.button_y + self.button_scale_y - 146, + ), + text=( + '' + if ad_tries_remaining in [None, 0] + else ('' + str(ad_tries_remaining)) + ), + color=(0.6, 0.6, 0.6, 1 if ads_enabled else 0.2), + ) + else: + bui.imagewidget(edit=self.entry_fee_ad_image, opacity=0.0) + bui.textwidget(edit=self.entry_fee_text_or, text='') + bui.textwidget( + edit=self.entry_fee_text_top, + position=( + self.button_x + 360, + self.button_y + self.button_scale_y - 80, + ), + scale=1.3, + text=final_fee_str, + ) - # Possibly show number of free-plays remaining. - bui.textwidget( - edit=self.entry_fee_text_remaining, - position=( - self.button_x + 360, - self.button_y + self.button_scale_y - 100, - ), - text=( - '' - if (free_tries_remaining in [None, 0] or final_fee != 0) - else ('' + str(free_tries_remaining)) - ), - color=(0.6, 0.6, 0.6, 1), - ) + # Possibly show number of free-plays remaining. + bui.textwidget( + edit=self.entry_fee_text_remaining, + position=( + self.button_x + 360, + self.button_y + self.button_scale_y - 100, + ), + text=( + '' + if (free_tries_remaining in [None, 0] or final_fee != 0) + else ('' + str(free_tries_remaining)) + ), + color=(0.6, 0.6, 0.6, 1), + ) diff --git a/dist/ba_data/python/bauiv1lib/creditslist.py b/dist/ba_data/python/bauiv1lib/credits.py similarity index 76% rename from dist/ba_data/python/bauiv1lib/creditslist.py rename to dist/ba_data/python/bauiv1lib/credits.py index 711d3ff..c605c04 100644 --- a/dist/ba_data/python/bauiv1lib/creditslist.py +++ b/dist/ba_data/python/bauiv1lib/credits.py @@ -5,8 +5,9 @@ from __future__ import annotations import os +import json import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -14,113 +15,116 @@ if TYPE_CHECKING: from typing import Sequence -class CreditsListWindow(bui.Window): +class CreditsWindow(bui.MainWindow): """Window for displaying game credits.""" - def __init__(self, origin_widget: bui.Widget | None = None): + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): # pylint: disable=too-many-locals # pylint: disable=too-many-statements - import json bui.set_analytics_screen('Credits Window') - # if they provided an origin-widget, scale up from that - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - transition = 'in_right' - assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - width = 870 if uiscale is bui.UIScale.SMALL else 670 - x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 - height = 398 if uiscale is bui.UIScale.SMALL else 500 + width = 990 if uiscale is bui.UIScale.SMALL else 670 + height = 750 if uiscale is bui.UIScale.SMALL else 500 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.0 + if uiscale is bui.UIScale.SMALL + else 1.2 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(width - 80, screensize[0] / scale) + target_height = min(height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + + scroll_width = target_width + scroll_height = target_height - 29 + scroll_y = yoffs - 58 - scroll_height self._r = 'creditsWindow' super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.0 + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -8) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back + edit=self._root_widget, on_cancel_call=self.main_window_back ) else: btn = bui.buttonwidget( parent=self._root_widget, - position=( - 40 + x_inset, - height - (68 if uiscale is bui.UIScale.SMALL else 62), - ), - size=(140, 60), + position=(40, yoffs - 46), + size=(60, 48), scale=0.8, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._back, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, autoselect=True, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - position=( - 40 + x_inset, - height - (68 if uiscale is bui.UIScale.SMALL else 62) + 5, - ), - size=(60, 48), - label=bui.charstr(bui.SpecialChar.BACK), - ) - bui.textwidget( parent=self._root_widget, - position=(0, height - (59 if uiscale is bui.UIScale.SMALL else 54)), - size=(width, 30), + position=( + width * 0.5, + yoffs - (44 if uiscale is bui.UIScale.SMALL else 28), + ), + size=(0, 0), + scale=0.8 if uiscale is bui.UIScale.SMALL else 1.0, text=bui.Lstr( resource=f'{self._r}.titleText', subs=[('${APP_NAME}', bui.Lstr(resource='titleText'))], ), h_align='center', - color=bui.app.ui_v1.title_color, - maxwidth=330, v_align='center', + color=bui.app.ui_v1.title_color, + maxwidth=scroll_width * 0.7, ) scroll = bui.scrollwidget( parent=self._root_widget, - position=(40 + x_inset, 35), - size=(width - (80 + 2 * x_inset), height - 100), + size=(scroll_width, scroll_height), + position=(width * 0.5 - scroll_width * 0.5, scroll_y), capture_arrows=True, + border_opacity=0.4, + center_small_content_horizontally=True, ) - if bui.app.ui_v1.use_toolbars: + bui.widget( + edit=scroll, + right_widget=bui.get_special_widget('squad_button'), + ) + if uiscale is bui.UIScale.SMALL: bui.widget( edit=scroll, - right_widget=bui.get_special_widget('party_button'), + left_widget=bui.get_special_widget('back_button'), ) - if uiscale is bui.UIScale.SMALL: - bui.widget( - edit=scroll, - left_widget=bui.get_special_widget('back_button'), - ) def _format_names(names2: Sequence[str], inset: float) -> str: sval = '' @@ -327,7 +331,7 @@ class CreditsListWindow(bui.Window): line_height = 20 scale = 0.55 - self._sub_width = width - 80 + self._sub_width = min(700, width - 80) self._sub_height = line_height * len(lines) + 40 container = self._subcontainer = bui.containerwidget( @@ -335,7 +339,6 @@ class CreditsListWindow(bui.Window): size=(self._sub_width, self._sub_height), background=False, claims_left_right=False, - claims_tab=False, ) voffs = 0 @@ -354,18 +357,12 @@ class CreditsListWindow(bui.Window): ) voffs -= line_height - def _back(self) -> None: - from bauiv1lib.mainmenu import MainMenuWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) ) diff --git a/dist/ba_data/python/bauiv1lib/discord.py b/dist/ba_data/python/bauiv1lib/discord.py index de891b2..40aa34f 100644 --- a/dist/ba_data/python/bauiv1lib/discord.py +++ b/dist/ba_data/python/bauiv1lib/discord.py @@ -51,7 +51,7 @@ class DiscordWindow(bui.Window): ) ) - if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( edit=self._root_widget, on_cancel_call=self._do_back ) diff --git a/dist/ba_data/python/bauiv1lib/fileselector.py b/dist/ba_data/python/bauiv1lib/fileselector.py index a2547b2..b99164f 100644 --- a/dist/ba_data/python/bauiv1lib/fileselector.py +++ b/dist/ba_data/python/bauiv1lib/fileselector.py @@ -16,23 +16,26 @@ if TYPE_CHECKING: from typing import Any, Callable, Sequence -class FileSelectorWindow(bui.Window): +class FileSelectorWindow(bui.MainWindow): """Window for selecting files.""" def __init__( self, path: str, callback: Callable[[str | None], Any] | None = None, + *, show_base_path: bool = True, valid_file_extensions: Sequence[str] | None = None, allow_folders: bool = False, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): if valid_file_extensions is None: valid_file_extensions = [] assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 700 if uiscale is bui.UIScale.SMALL else 600 - self._x_inset = x_inset = 50 if uiscale is bui.UIScale.SMALL else 0 + self._width = 850 if uiscale is bui.UIScale.SMALL else 600 + self._x_inset = x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 self._height = 365 if uiscale is bui.UIScale.SMALL else 418 self._callback = callback self._base_path = path @@ -51,16 +54,17 @@ class FileSelectorWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition='in_right', scale=( - 2.23 + 1.93 if uiscale is bui.UIScale.SMALL else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=( (0, -35) if uiscale is bui.UIScale.SMALL else (0, 0) ), - ) + ), + transition=transition, + origin_widget=origin_widget, ) bui.textwidget( parent=self._root_widget, @@ -135,6 +139,31 @@ class FileSelectorWindow(bui.Window): ) self._set_path(path) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull everything out of self here. If we do it below in the lambda, + # we'll keep self alive which is bad. + path = self._base_path + callback = self._callback + show_base_path = self._show_base_path + valid_file_extensions = self._valid_file_extensions + allow_folders = self._allow_folders + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + path=path, + callback=callback, + show_base_path=show_base_path, + valid_file_extensions=valid_file_extensions, + allow_folders=allow_folders, + ) + ) + def _on_up_press(self) -> None: self._on_entry_activated('..') @@ -147,7 +176,6 @@ class FileSelectorWindow(bui.Window): bui.getsound('error').play() def _on_folder_entry_activated(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_right') if self._callback is not None: assert self._path is not None self._callback(self._path) @@ -176,9 +204,6 @@ class FileSelectorWindow(bui.Window): elif os.path.isfile(test_path): if self._is_valid_file_path(test_path): bui.getsound('swish').play() - bui.containerwidget( - edit=self._root_widget, transition='out_right' - ) if self._callback is not None: self._callback(test_path) else: @@ -362,12 +387,10 @@ class FileSelectorWindow(bui.Window): bui.containerwidget( edit=self._scrollwidget, claims_left_right=False, - claims_tab=False, ) bui.containerwidget( edit=self._subcontainer, claims_left_right=False, - claims_tab=False, selection_loops=False, print_list_exit_instructions=False, ) @@ -458,6 +481,6 @@ class FileSelectorWindow(bui.Window): ) def _cancel(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_right') + self.main_window_back() if self._callback is not None: self._callback(None) diff --git a/dist/ba_data/python/bauiv1lib/gather/__init__.py b/dist/ba_data/python/bauiv1lib/gather/__init__.py index 6e35d6a..93c9073 100644 --- a/dist/ba_data/python/bauiv1lib/gather/__init__.py +++ b/dist/ba_data/python/bauiv1lib/gather/__init__.py @@ -7,10 +7,14 @@ from __future__ import annotations import weakref import logging from enum import Enum +from typing import override, TYPE_CHECKING from bauiv1lib.tabs import TabRow import bauiv1 as bui +if TYPE_CHECKING: + from bauiv1lib.play import PlaylistSelectContext + class GatherTab: """Defines a tab for use in the gather UI.""" @@ -40,6 +44,7 @@ class GatherTab: The tab should create and return a container widget covering the specified region. """ + # pylint: disable=too-many-positional-arguments raise RuntimeError('Should not get here.') def on_deactivate(self) -> None: @@ -52,7 +57,7 @@ class GatherTab: """Called when the parent window is restoring state.""" -class GatherWindow(bui.Window): +class GatherWindow(bui.MainWindow): """Window for joining/inviting friends.""" class TabID(Enum): @@ -69,7 +74,6 @@ class GatherWindow(bui.Window): transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): - # pylint: disable=too-many-statements # pylint: disable=too-many-locals # pylint: disable=cyclic-import from bauiv1lib.gather.abouttab import AboutGatherTab @@ -82,96 +86,99 @@ class GatherWindow(bui.Window): assert plus is not None bui.set_analytics_screen('Gather Window') - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_location('Gather') - bui.set_party_icon_always_visible(True) uiscale = bui.app.ui_v1.uiscale - self._width = 1440 if uiscale is bui.UIScale.SMALL else 1040 - x_offs = 200 if uiscale is bui.UIScale.SMALL else 0 - self._height = ( - 582 + self._width = ( + 1640 if uiscale is bui.UIScale.SMALL - else 680 if uiscale is bui.UIScale.MEDIUM else 800 + else 1100 if uiscale is bui.UIScale.MEDIUM else 1200 + ) + self._height = ( + 1000 + if uiscale is bui.UIScale.SMALL + else 730 if uiscale is bui.UIScale.MEDIUM else 900 ) self._current_tab: GatherWindow.TabID | None = None - extra_top = 20 if uiscale is bui.UIScale.SMALL else 0 self._r = 'gatherWindow' + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.4 + if uiscale is bui.UIScale.SMALL + else 0.88 if uiscale is bui.UIScale.MEDIUM else 0.66 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 130, screensize[0] / scale) + target_height = min(self._height - 130, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 65 + self._scroll_bottom = yoffs - 93 - self._scroll_height + self._scroll_left = (self._width - self._scroll_width) * 0.5 + super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + extra_top), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 1.3 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_tokens' if uiscale is bui.UIScale.SMALL - else 0.97 if uiscale is bui.UIScale.MEDIUM else 0.8 + else 'menu_full' ), - stack_offset=( - (0, -11) - if uiscale is bui.UIScale.SMALL - else (0, 0) if uiscale is bui.UIScale.MEDIUM else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back + edit=self._root_widget, on_cancel_call=self.main_window_back ) self._back_button = None else: self._back_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(70 + x_offs, self._height - 74), - size=(140, 60), + position=(70, yoffs - 43), + size=(60, 60), scale=1.1, autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._back, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - position=(70 + x_offs, self._height - 78), - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - condensed = uiscale is not bui.UIScale.LARGE - t_offs_y = ( - 0 if not condensed else 25 if uiscale is bui.UIScale.MEDIUM else 17 - ) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 42 + t_offs_y), + position=( + ( + self._width * 0.5 + + ( + (self._scroll_width * -0.5 + 170.0 - 70.0) + if uiscale is bui.UIScale.SMALL + else 0.0 + ) + ), + yoffs - (64 if uiscale is bui.UIScale.SMALL else 4), + ), size=(0, 0), color=bui.app.ui_v1.title_color, - scale=( - 1.5 - if not condensed - else 1.0 if uiscale is bui.UIScale.MEDIUM else 0.6 - ), - h_align='center', + scale=1.3 if uiscale is bui.UIScale.SMALL else 1.0, + h_align='left' if uiscale is bui.UIScale.SMALL else 'center', v_align='center', - text=bui.Lstr(resource=f'{self._r}.titleText'), - maxwidth=550, + text=(bui.Lstr(resource=f'{self._r}.titleText')), + maxwidth=135 if uiscale is bui.UIScale.SMALL else 320, ) - scroll_buffer_h = 130 + 2 * x_offs - tab_buffer_h = (320 if condensed else 250) + 2 * x_offs - # Build up the set of tabs we want. tabdefs: list[tuple[GatherWindow.TabID, bui.Lstr]] = [ (self.TabID.ABOUT, bui.Lstr(resource=f'{self._r}.aboutText')) @@ -193,14 +200,16 @@ class GatherWindow(bui.Window): (self.TabID.MANUAL, bui.Lstr(resource=f'{self._r}.manualText')) ) - # On small UI, push our tabs up closer to the top of the screen to - # save a bit of space. - tabs_top_extra = 42 if condensed else 0 + tab_inset = 250.0 if uiscale is bui.UIScale.SMALL else 100.0 + self._tab_row = TabRow( self._root_widget, tabdefs, - pos=(tab_buffer_h * 0.5, self._height - 130 + tabs_top_extra), - size=(self._width - tab_buffer_h, 50), + size=(self._scroll_width - 2.0 * tab_inset, 50), + pos=( + self._scroll_left + tab_inset, + self._scroll_bottom + self._scroll_height - 4.0, + ), on_select_call=bui.WeakCall(self._set_tab), ) @@ -218,64 +227,70 @@ class GatherWindow(bui.Window): if tabtype is not None: self._tabs[tab_id] = tabtype(self) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=self._tab_row.tabs[tabdefs[-1][0]].button, - right_widget=bui.get_special_widget('party_button'), - ) - if uiscale is bui.UIScale.SMALL: - bui.widget( - edit=self._tab_row.tabs[tabdefs[0][0]].button, - left_widget=bui.get_special_widget('back_button'), - ) - - self._scroll_width = self._width - scroll_buffer_h - self._scroll_height = self._height - 180.0 + tabs_top_extra - - self._scroll_left = (self._width - self._scroll_width) * 0.5 - self._scroll_bottom = ( - self._height - self._scroll_height - 79 - 48 + tabs_top_extra + # Eww; tokens meter may or may not be here; should be smarter + # about this. + bui.widget( + edit=self._tab_row.tabs[tabdefs[-1][0]].button, + right_widget=bui.get_special_widget('tokens_meter'), ) - buffer_h = 10 - buffer_v = 4 + if uiscale is bui.UIScale.SMALL: + bui.widget( + edit=self._tab_row.tabs[tabdefs[0][0]].button, + left_widget=bui.get_special_widget('back_button'), + up_widget=bui.get_special_widget('back_button'), + ) # Not actually using a scroll widget anymore; just an image. bui.imagewidget( parent=self._root_widget, + size=(self._scroll_width, self._scroll_height), position=( - self._scroll_left - buffer_h, - self._scroll_bottom - buffer_v, - ), - size=( - self._scroll_width + 2 * buffer_h, - self._scroll_height + 2 * buffer_v, + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, ), texture=bui.gettexture('scrollWidget'), mesh_transparent=bui.getmesh('softEdgeOutside'), + opacity=0.4, ) self._tab_container: bui.Widget | None = None self._restore_state() - def __del__(self) -> None: - bui.set_party_icon_always_visible(False) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) - def playlist_select(self, origin_widget: bui.Widget) -> None: + @override + def on_main_window_close(self) -> None: + self._save_state() + + def playlist_select( + self, + origin_widget: bui.Widget, + context: PlaylistSelectContext, + ) -> None: """Called by the private-hosting tab to select a playlist.""" from bauiv1lib.play import PlayWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # Avoid redundant window spawns. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.selecting_private_party_playlist = True - bui.app.ui_v1.set_main_menu_window( - PlayWindow(origin_widget=origin_widget).get_root_widget(), - from_window=self._root_widget, + playwindow = PlayWindow( + origin_widget=origin_widget, playlist_select_context=context ) + self.main_window_replace(playwindow) + + # Grab the newly-set main-window's back-state; that will lead us + # back here once we're done going down our main-window + # rabbit-hole for playlist selection. + context.back_state = playwindow.main_window_back_state def _set_tab(self, tab_id: TabID) -> None: if self._current_tab is tab_id: @@ -340,8 +355,6 @@ class GatherWindow(bui.Window): logging.exception('Error saving state for %s.', self) def _restore_state(self) -> None: - from efro.util import enum_by_value - try: for tab in self._tabs.values(): tab.restore_state() @@ -354,7 +367,7 @@ class GatherWindow(bui.Window): current_tab = self.TabID.ABOUT gather_tab_val = bui.app.config.get('Gather Tab') try: - stored_tab = enum_by_value(self.TabID, gather_tab_val) + stored_tab = self.TabID(gather_tab_val) if stored_tab in self._tab_row.tabs: current_tab = stored_tab except ValueError: @@ -366,9 +379,7 @@ class GatherWindow(bui.Window): sel = self._tab_container elif isinstance(sel_name, str) and sel_name.startswith('Tab:'): try: - sel_tab_id = enum_by_value( - self.TabID, sel_name.split(':')[-1] - ) + sel_tab_id = self.TabID(sel_name.split(':')[-1]) except ValueError: sel_tab_id = self.TabID.ABOUT sel = self._tab_row.tabs[sel_tab_id].button @@ -378,20 +389,3 @@ class GatherWindow(bui.Window): except Exception: logging.exception('Error restoring state for %s.', self) - - def _back(self) -> None: - from bauiv1lib.mainmenu import MainMenuWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/gather/abouttab.py b/dist/ba_data/python/bauiv1lib/gather/abouttab.py index 086471e..b677637 100644 --- a/dist/ba_data/python/bauiv1lib/gather/abouttab.py +++ b/dist/ba_data/python/bauiv1lib/gather/abouttab.py @@ -27,6 +27,7 @@ class AboutGatherTab(GatherTab): region_bottom: float, ) -> bui.Widget: # pylint: disable=too-many-locals + # pylint: disable=too-many-positional-arguments plus = bui.app.plus assert plus is not None @@ -157,6 +158,7 @@ class AboutGatherTab(GatherTab): autoselect=True, on_activate_call=bui.WeakCall(self._invite_to_try_press), up_widget=tab_button, + show_buffer_top=500, ) y -= invite_height else: @@ -198,7 +200,7 @@ class AboutGatherTab(GatherTab): return scroll_widget def _invite_to_try_press(self) -> None: - from bauiv1lib.account import show_sign_in_prompt + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.appinvite import handle_app_invites_press plus = bui.app.plus diff --git a/dist/ba_data/python/bauiv1lib/gather/manualtab.py b/dist/ba_data/python/bauiv1lib/gather/manualtab.py index 8c889ef..05924f8 100644 --- a/dist/ba_data/python/bauiv1lib/gather/manualtab.py +++ b/dist/ba_data/python/bauiv1lib/gather/manualtab.py @@ -89,10 +89,10 @@ class ManualGatherTab(GatherTab): self._container: bui.Widget | None = None self._join_by_address_text: bui.Widget | None = None self._favorites_text: bui.Widget | None = None - self._width: int | None = None - self._height: int | None = None - self._scroll_width: int | None = None - self._scroll_height: int | None = None + self._width: float | None = None + self._height: float | None = None + self._scroll_width: float | None = None + self._scroll_height: float | None = None self._favorites_scroll_width: int | None = None self._favorites_connect_button: bui.Widget | None = None self._scrollwidget: bui.Widget | None = None @@ -114,6 +114,7 @@ class ManualGatherTab(GatherTab): region_left: float, region_bottom: float, ) -> bui.Widget: + # pylint: disable=too-many-positional-arguments c_width = region_width c_height = region_height - 20 @@ -241,7 +242,7 @@ class ManualGatherTab(GatherTab): self._build_join_by_address_tab(region_width, region_height) if value is SubTabType.FAVORITES: - self._build_favorites_tab(region_height) + self._build_favorites_tab(region_width, region_height) # The old manual tab def _build_join_by_address_tab( @@ -276,7 +277,9 @@ class ManualGatherTab(GatherTab): maxwidth=380, size=(420, 60), ) + assert self._join_by_address_text is not None bui.widget(edit=self._join_by_address_text, down_widget=txt) + assert self._favorites_text is not None bui.widget(edit=self._favorites_text, down_widget=txt) bui.textwidget( parent=self._container, @@ -349,13 +352,16 @@ class ManualGatherTab(GatherTab): bui.widget(edit=self._check_button, up_widget=btn) # Tab containing saved favorite addresses - def _build_favorites_tab(self, region_height: float) -> None: + def _build_favorites_tab( + self, region_width: float, region_height: float + ) -> None: c_height = region_height - 20 v = c_height - 35 - 25 - 30 assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 1240 if uiscale is bui.UIScale.SMALL else 1040 + # self._width = 1240 if uiscale is bui.UIScale.SMALL else 1040 + self._width = region_width x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 self._height = ( 578 @@ -400,7 +406,7 @@ class ManualGatherTab(GatherTab): self._favorites_connect_button = btn1 = bui.buttonwidget( parent=self._container, size=(b_width, b_height), - position=(40 if uiscale is bui.UIScale.SMALL else 40, btnv), + position=(140 if uiscale is bui.UIScale.SMALL else 40, btnv), button_type='square', color=(0.6, 0.53, 0.63), textcolor=(0.75, 0.7, 0.8), @@ -409,7 +415,7 @@ class ManualGatherTab(GatherTab): label=bui.Lstr(resource='gatherWindow.manualConnectText'), autoselect=True, ) - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: + if uiscale is bui.UIScale.SMALL: bui.widget( edit=btn1, left_widget=bui.get_special_widget('back_button'), @@ -418,7 +424,7 @@ class ManualGatherTab(GatherTab): bui.buttonwidget( parent=self._container, size=(b_width, b_height), - position=(40 if uiscale is bui.UIScale.SMALL else 40, btnv), + position=(140 if uiscale is bui.UIScale.SMALL else 40, btnv), button_type='square', color=(0.6, 0.53, 0.63), textcolor=(0.75, 0.7, 0.8), @@ -431,7 +437,7 @@ class ManualGatherTab(GatherTab): bui.buttonwidget( parent=self._container, size=(b_width, b_height), - position=(40 if uiscale is bui.UIScale.SMALL else 40, btnv), + position=(140 if uiscale is bui.UIScale.SMALL else 40, btnv), button_type='square', color=(0.6, 0.53, 0.63), textcolor=(0.75, 0.7, 0.8), @@ -444,7 +450,7 @@ class ManualGatherTab(GatherTab): v -= sub_scroll_height + 23 self._scrollwidget = scrlw = bui.scrollwidget( parent=self._container, - position=(190 if uiscale is bui.UIScale.SMALL else 225, v), + position=(290 if uiscale is bui.UIScale.SMALL else 225, v), size=(sub_scroll_width, sub_scroll_height), claims_left_right=True, ) @@ -469,7 +475,7 @@ class ManualGatherTab(GatherTab): scale=1.2, position=( ( - (190 if uiscale is bui.UIScale.SMALL else 225) + (240 if uiscale is bui.UIScale.SMALL else 225) + sub_scroll_width * 0.5 ), v + sub_scroll_height * 0.5, @@ -760,6 +766,7 @@ class ManualGatherTab(GatherTab): claims_left_right=bool(servers), claims_up_down=bool(servers), ) + assert self._scrollwidget is not None bui.widget( edit=self._scrollwidget, up_widget=self._favorites_text, @@ -864,6 +871,11 @@ class ManualGatherTab(GatherTab): config['Last Manual Party Connect Address'] = resolved_address config['Last Manual Party Connect Port'] = port config.commit() + + # Store UI location to return to when done. + if bs.app.classic is not None: + bs.app.classic.save_ui_state() + bs.connect_to_party(resolved_address, port=port) def _run_addr_fetch(self) -> None: diff --git a/dist/ba_data/python/bauiv1lib/gather/nearbytab.py b/dist/ba_data/python/bauiv1lib/gather/nearbytab.py index 3301204..5a6b5a9 100644 --- a/dist/ba_data/python/bauiv1lib/gather/nearbytab.py +++ b/dist/ba_data/python/bauiv1lib/gather/nearbytab.py @@ -53,6 +53,11 @@ class NetScanner: self._last_selected_host = host def _on_activate(self, host: dict[str, Any]) -> None: + + # Store UI location to return to when done. + if bs.app.classic is not None: + bs.app.classic.save_ui_state() + bs.connect_to_party(host['address']) def update(self) -> None: @@ -115,6 +120,7 @@ class NearbyGatherTab(GatherTab): region_left: float, region_bottom: float, ) -> bui.Widget: + # pylint: disable=too-many-positional-arguments c_width = region_width c_height = region_height - 20 sub_scroll_height = c_height - 85 diff --git a/dist/ba_data/python/bauiv1lib/gather/privatetab.py b/dist/ba_data/python/bauiv1lib/gather/privatetab.py index 223d6d2..a274429 100644 --- a/dist/ba_data/python/bauiv1lib/gather/privatetab.py +++ b/dist/ba_data/python/bauiv1lib/gather/privatetab.py @@ -22,8 +22,9 @@ from bacommon.net import ( PrivatePartyConnectResult, ) from bauiv1lib.gather import GatherTab +from bauiv1lib.play import PlaylistSelectContext -from bauiv1lib.gettokens import GetTokensWindow, show_get_tokens_prompt +from bauiv1lib.gettokens import show_get_tokens_prompt import bascenev1 as bs import bauiv1 as bui @@ -49,6 +50,7 @@ class State: """Our core state that persists while the app is running.""" sub_tab: SubTabType = SubTabType.JOIN + playlist_select_context: PlaylistSelectContext | None = None class PrivateGatherTab(GatherTab): @@ -60,7 +62,7 @@ class PrivateGatherTab(GatherTab): self._state: State = State() self._last_datacode_refresh_time: float | None = None self._hostingstate = PrivateHostingState() - self._v2state: bacommon.cloud.BSPrivatePartyResponse | None = None + self._v2state: bacommon.bs.PrivatePartyResponse | None = None self._join_sub_tab_text: bui.Widget | None = None self._host_sub_tab_text: bui.Widget | None = None self._update_timer: bui.AppTimer | None = None @@ -97,6 +99,7 @@ class PrivateGatherTab(GatherTab): region_left: float, region_bottom: float, ) -> bui.Widget: + # pylint: disable=too-many-positional-arguments self._c_width = region_width self._c_height = region_height - 20 self._container = bui.containerwidget( @@ -336,7 +339,7 @@ class PrivateGatherTab(GatherTab): if plus.accounts.primary is not None: with plus.accounts.primary: plus.cloud.send_message_cb( - bacommon.cloud.BSPrivatePartyMessage( + bacommon.bs.PrivatePartyMessage( need_datacode=( self._last_datacode_refresh_time is None or time.monotonic() @@ -352,7 +355,7 @@ class PrivateGatherTab(GatherTab): self._last_v2_state_query_time = now def _on_private_party_query_response( - self, response: bacommon.cloud.BSPrivatePartyResponse | Exception + self, response: bacommon.bs.PrivatePartyResponse | Exception ) -> None: if isinstance(response, Exception): self._debug_server_comm('got pp v2 state response (err)') @@ -548,18 +551,19 @@ class PrivateGatherTab(GatherTab): edit=self._join_party_code_text, on_return_press_call=btn.activate ) - def _on_get_tokens_press(self) -> None: - if self._waiting_for_start_stop_response: - return + # def _on_get_tokens_press(self) -> None: + # if self._waiting_for_start_stop_response: + # return - # Bring up get-tickets window and then kill ourself (we're on - # the overlay layer so we'd show up above it). - GetTokensWindow(origin_widget=self._get_tokens_button) + # # Bring up get-tickets window and then kill ourself (we're on + # # the overlay layer so we'd show up above it). + # GetTokensWindow(origin_widget=self._get_tokens_button) def _build_host_tab(self) -> None: # pylint: disable=too-many-branches # pylint: disable=too-many-statements - assert bui.app.classic is not None + classic = bui.app.classic + assert classic is not None plus = bui.app.plus assert plus is not None @@ -636,41 +640,7 @@ class PrivateGatherTab(GatherTab): and hostingstate.tickets_to_host_now != 0 and not havegoldpass ): - if not bui.app.ui_v1.use_toolbars: - - # Currently have no allow_token_purchases value like - # we had with tickets; just assuming we always allow. - if bool(True): - # if bui.app.classic.allow_ticket_purchases: - self._get_tokens_button = bui.buttonwidget( - parent=self._container, - position=( - self._c_width - 210 + 125, - self._c_height - 44, - ), - autoselect=True, - scale=0.6, - size=(120, 60), - textcolor=(1.0, 0.6, 0.0), - label=bui.charstr(bui.SpecialChar.TOKEN), - color=(0.65, 0.5, 0.8), - on_activate_call=self._on_get_tokens_press, - ) - else: - self._token_count_text = bui.textwidget( - parent=self._container, - scale=0.6, - position=( - self._c_width - 210 + 125, - self._c_height - 44, - ), - color=(1.0, 0.6, 0.0), - h_align='center', - v_align='center', - ) - - # Set initial token count. - self._update_currency_ui() + pass v = self._c_height - 90 if hostingstate.party_code is None: @@ -689,7 +659,7 @@ class PrivateGatherTab(GatherTab): ), ) - v -= 100 + v -= 90 if hostingstate.party_code is None: # We've got no current party running; show options to set # one up. @@ -718,12 +688,13 @@ class PrivateGatherTab(GatherTab): # If it appears we're coming back from playlist selection, # re-select our playlist button. - if bui.app.ui_v1.selecting_private_party_playlist: + if self._state.playlist_select_context is not None: + self._state.playlist_select_context = None bui.containerwidget( edit=self._container, selected_child=self._host_playlist_button, ) - bui.app.ui_v1.selecting_private_party_playlist = False + else: # We've got a current party; show its info. bui.textwidget( @@ -785,7 +756,7 @@ class PrivateGatherTab(GatherTab): autoselect=True, ) - v -= 120 + v -= 110 # Line above the main action button: @@ -952,7 +923,13 @@ class PrivateGatherTab(GatherTab): def _playlist_press(self) -> None: assert self._host_playlist_button is not None - self.window.playlist_select(origin_widget=self._host_playlist_button) + + self._state.playlist_select_context = PlaylistSelectContext() + + self.window.playlist_select( + origin_widget=self._host_playlist_button, + context=self._state.playlist_select_context, + ) def _host_copy_press(self) -> None: assert self._hostingstate.party_code is not None @@ -1104,6 +1081,11 @@ class PrivateGatherTab(GatherTab): return self._debug_server_comm('got valid connect response') assert cresult.address4 is not None and cresult.port is not None + + # Store UI location to return to when done. + if bs.app.classic is not None: + bs.app.classic.save_ui_state() + bs.connect_to_party(cresult.address4, port=cresult.port) except Exception: self._debug_server_comm('got connect response error') diff --git a/dist/ba_data/python/bauiv1lib/gather/publictab.py b/dist/ba_data/python/bauiv1lib/gather/publictab.py index d8b2f14..28b9376 100644 --- a/dist/ba_data/python/bauiv1lib/gather/publictab.py +++ b/dist/ba_data/python/bauiv1lib/gather/publictab.py @@ -96,6 +96,7 @@ class UIRow: ) -> None: """Update for the given data.""" # pylint: disable=too-many-locals + # pylint: disable=too-many-positional-arguments plus = bui.app.plus assert plus is not None @@ -161,7 +162,7 @@ class UIRow: Selection(party.get_key(), SelectionComponent.STATS_BUTTON), ), size=(120, 40), - position=(sub_scroll_width * 0.66 + hpos, 1 + vpos), + position=(sub_scroll_width - 270.0, 1 + vpos), scale=0.9, ) if existing_selection == Selection( @@ -175,7 +176,7 @@ class UIRow: text=str(party.size) + '/' + str(party.size_max), parent=columnwidget, size=(0, 0), - position=(sub_scroll_width * 0.86 + hpos, 20 + vpos), + position=(sub_scroll_width - 90, 20 + vpos), scale=0.7, color=(0.8, 0.8, 0.8), h_align='right', @@ -190,7 +191,7 @@ class UIRow: self._ping_widget = bui.textwidget( parent=columnwidget, size=(0, 0), - position=(sub_scroll_width * 0.94 + hpos, 20 + vpos), + position=(sub_scroll_width - 25.0, 20 + vpos), scale=0.7, h_align='right', v_align='center', @@ -366,10 +367,12 @@ class PublicGatherTab(GatherTab): self._last_server_list_query_time: float | None = None self._join_list_column: bui.Widget | None = None self._join_status_text: bui.Widget | None = None + self._join_status_spinner: bui.Widget | None = None self._no_servers_found_text: bui.Widget | None = None self._host_max_party_size_value: bui.Widget | None = None self._host_max_party_size_minus_button: bui.Widget | None = None self._host_max_party_size_plus_button: bui.Widget | None = None + self._join_sub_scroll_width: float | None = None self._host_status_text: bui.Widget | None = None self._signed_in = False self._ui_rows: list[UIRow] = [] @@ -404,6 +407,7 @@ class PublicGatherTab(GatherTab): region_left: float, region_bottom: float, ) -> bui.Widget: + # pylint: disable=too-many-positional-arguments c_width = region_width c_height = region_height - 20 self._container = bui.containerwidget( @@ -471,7 +475,8 @@ class PublicGatherTab(GatherTab): ) bui.widget(edit=self._join_text, right_widget=self._host_text) - # Attempt to fetch our local address so we have it for error messages. + # Attempt to fetch our local address so we have it for error + # messages. if self._local_address is None: AddrFetchThread(bui.WeakCall(self._fetch_local_addr_cb)).start() @@ -488,9 +493,9 @@ class PublicGatherTab(GatherTab): @override def save_state(self) -> None: # Save off a small number of parties with the lowest ping; we'll - # display these immediately when our UI comes back up which should - # be enough to make things feel nice and crisp while we do a full - # server re-query or whatnot. + # display these immediately when our UI comes back up which + # should be enough to make things feel nice and crisp while we + # do a full server re-query or whatnot. assert bui.app.classic is not None bui.app.ui_v1.window_states[type(self)] = State( sub_tab=self._sub_tab, @@ -520,7 +525,7 @@ class PublicGatherTab(GatherTab): self._next_entry_index = state.next_entry_index - # FIXME: should save/restore these too?.. + # FIXME: should save/restore these too? self._have_server_list_response = state.have_server_list_response self._have_valid_server_list = state.have_valid_server_list self._filter_value = state.filter_value @@ -536,9 +541,8 @@ class PublicGatherTab(GatherTab): if playsound: bui.getsound('click01').play() - # Reset our selection. - # (prevents selecting something way down the list if we switched away - # and came back) + # Reset our selection (prevents selecting something way down the + # list if we switched away and came back). self._selection = None self._have_user_selected_row = False @@ -576,7 +580,9 @@ class PublicGatherTab(GatherTab): c_width = region_width c_height = region_height - 20 sub_scroll_height = c_height - 125 - sub_scroll_width = 830 + self._join_sub_scroll_width = sub_scroll_width = min( + 1200, region_width - 80 + ) v = c_height - 35 v -= 60 filter_txt = bui.Lstr(resource='filterText') @@ -584,7 +590,7 @@ class PublicGatherTab(GatherTab): parent=self._container, text=self._filter_value, size=(350, 45), - position=(290, v - 10), + position=(c_width * 0.5 - 150, v - 10), h_align='left', v_align='center', editable=True, @@ -596,7 +602,7 @@ class PublicGatherTab(GatherTab): text=filter_txt, parent=self._container, size=(0, 0), - position=(270, v + 13), + position=(c_width * 0.5 - 170, v + 13), maxwidth=150, scale=0.8, color=(0.5, 0.46, 0.5), @@ -609,7 +615,7 @@ class PublicGatherTab(GatherTab): text=bui.Lstr(resource='nameText'), parent=self._container, size=(0, 0), - position=(90, v - 8), + position=((c_width - sub_scroll_width) * 0.5 + 50, v - 8), maxwidth=60, scale=0.6, color=(0.5, 0.46, 0.5), @@ -621,7 +627,10 @@ class PublicGatherTab(GatherTab): text=bui.Lstr(resource='gatherWindow.partySizeText'), parent=self._container, size=(0, 0), - position=(755, v - 8), + position=( + c_width * 0.5 + sub_scroll_width * 0.5 - 110, + v - 8, + ), maxwidth=60, scale=0.6, color=(0.5, 0.46, 0.5), @@ -633,7 +642,10 @@ class PublicGatherTab(GatherTab): text=bui.Lstr(resource='gatherWindow.pingText'), parent=self._container, size=(0, 0), - position=(825, v - 8), + position=( + c_width * 0.5 + sub_scroll_width * 0.5 - 30, + v - 8, + ), maxwidth=60, scale=0.6, color=(0.5, 0.46, 0.5), @@ -657,6 +669,9 @@ class PublicGatherTab(GatherTab): size=(400, 400), claims_left_right=True, ) + + # Create join status text and join spinner. Always make sure to + # update both of these together. self._join_status_text = bui.textwidget( parent=self._container, text='', @@ -670,6 +685,13 @@ class PublicGatherTab(GatherTab): color=(0.6, 0.6, 0.6), position=(c_width * 0.5, c_height * 0.5), ) + self._join_status_spinner = bui.spinnerwidget( + parent=self._container, + position=(c_width * 0.5, c_height * 0.5), + style='bomb', + size=64, + ) + self._no_servers_found_text = bui.textwidget( parent=self._container, text='', @@ -707,6 +729,9 @@ class PublicGatherTab(GatherTab): ) v -= 30 + # Nudge party name and size values to be mostly centered. + xoffs = region_width * 0.5 - 500 + party_name_text = bui.Lstr( resource='gatherWindow.partyNameText', fallback_resource='editGameListWindow.nameText', @@ -720,14 +745,14 @@ class PublicGatherTab(GatherTab): maxwidth=200, scale=0.8, color=bui.app.ui_v1.infotextcolor, - position=(210, v - 9), + position=(210 + xoffs, v - 9), text=party_name_text, ) self._host_name_text = bui.textwidget( parent=self._container, editable=True, size=(535, 40), - position=(230, v - 30), + position=(230 + xoffs, v - 30), text=bui.app.config.get('Public Party Name', ''), maxwidth=494, shadow=0.3, @@ -747,7 +772,7 @@ class PublicGatherTab(GatherTab): maxwidth=200, scale=0.8, color=bui.app.ui_v1.infotextcolor, - position=(210, v - 9), + position=(210 + xoffs, v - 9), text=bui.Lstr( resource='maxPartySizeText', fallback_resource='maxConnectionsText', @@ -760,7 +785,7 @@ class PublicGatherTab(GatherTab): v_align='center', scale=1.2, color=(1, 1, 1), - position=(240, v - 9), + position=(240 + xoffs, v - 9), text=str(bs.get_public_party_max_size()), ) btn1 = self._host_max_party_size_minus_button = bui.buttonwidget( @@ -769,7 +794,7 @@ class PublicGatherTab(GatherTab): on_activate_call=bui.WeakCall( self._on_max_public_party_size_minus_press ), - position=(280, v - 26), + position=(280 + xoffs, v - 26), label='-', autoselect=True, ) @@ -779,7 +804,7 @@ class PublicGatherTab(GatherTab): on_activate_call=bui.WeakCall( self._on_max_public_party_size_plus_press ), - position=(350, v - 26), + position=(350 + xoffs, v - 26), label='+', autoselect=True, ) @@ -811,6 +836,7 @@ class PublicGatherTab(GatherTab): bui.widget(edit=self._host_name_text, down_widget=btn2) bui.widget(edit=btn2, up_widget=self._host_name_text) bui.widget(edit=btn1, up_widget=self._host_name_text) + assert self._join_text is not None bui.widget(edit=self._join_text, down_widget=self._host_name_text) v -= 10 self._host_status_text = bui.textwidget( @@ -839,8 +865,8 @@ class PublicGatherTab(GatherTab): position=(c_width * 0.5, v), ) - # If public sharing is already on, - # launch a status-check immediately. + # If public sharing is already on, launch a status-check + # immediately. if bs.get_public_party_enabled(): self._do_status_check() @@ -864,9 +890,9 @@ class PublicGatherTab(GatherTab): self._pending_party_infos += parties_in # To avoid causing a stutter here, we do most processing of - # these entries incrementally in our _update() method. - # The one thing we do here is prune parties not contained in - # this result. + # these entries incrementally in our _update() method. The one + # thing we do here is prune parties not contained in this + # result. for partyval in list(self._parties.values()): partyval.claimed = False for party_in in parties_in: @@ -884,7 +910,6 @@ class PublicGatherTab(GatherTab): self._parties_sorted = [p for p in self._parties_sorted if p[1].claimed] self._party_lists_dirty = True - # self._update_server_list() if DEBUG_PROCESSING: print( f'Handled public party query results in ' @@ -897,11 +922,6 @@ class PublicGatherTab(GatherTab): plus = bui.app.plus assert plus is not None - # Special case: if a party-queue window is up, don't do any of this - # (keeps things smoother). - # if bui.app.ui.have_party_queue_window: - # return - if self._sub_tab is SubTabType.JOIN: # Keep our filter-text up to date from the UI. text = self._filter_text @@ -911,10 +931,10 @@ class PublicGatherTab(GatherTab): self._filter_value = filter_value self._party_lists_dirty = True - # Also wipe out party clean-row states. - # (otherwise if a party disappears from a row due to - # filtering and then reappears on that same row when - # the filter is removed it may not update) + # Also wipe out party clean-row states (otherwise if + # a party disappears from a row due to filtering and + # then reappears on that same row when the filter is + # removed it may not update). for party in self._parties.values(): party.clean_display_index = None @@ -940,37 +960,38 @@ class PublicGatherTab(GatherTab): name = cast(str, bui.textwidget(query=self._host_name_text)) bs.set_public_party_name(name) - # Update status text. - status_text = self._join_status_text - if status_text: + # Update status text and loading spinner. + if self._join_status_text: + assert self._join_status_spinner if not signed_in: bui.textwidget( - edit=status_text, text=bui.Lstr(resource='notSignedInText') + edit=self._join_status_text, + text=bui.Lstr(resource='notSignedInText'), ) + bui.spinnerwidget(edit=self._join_status_spinner, visible=False) else: - # If we have a valid list, show no status; just the list. - # Otherwise show either 'loading...' or 'error' depending - # on whether this is our first go-round. + # If we have a valid list, show no status; just the + # list. Otherwise show either 'loading...' or 'error' + # depending on whether this is our first go-round. if self._have_valid_server_list: - bui.textwidget(edit=status_text, text='') + bui.textwidget(edit=self._join_status_text, text='') + bui.spinnerwidget( + edit=self._join_status_spinner, visible=False + ) else: if self._have_server_list_response: bui.textwidget( - edit=status_text, + edit=self._join_status_text, text=bui.Lstr(resource='errorText'), ) + bui.spinnerwidget( + edit=self._join_status_spinner, visible=False + ) else: - bui.textwidget( - edit=status_text, - text=bui.Lstr( - value='${A}...', - subs=[ - ( - '${A}', - bui.Lstr(resource='store.loadingText'), - ) - ], - ), + # Show our loading spinner. + bui.textwidget(edit=self._join_status_text, text='') + bui.spinnerwidget( + edit=self._join_status_spinner, visible=True ) self._update_party_rows() @@ -1001,19 +1022,15 @@ class PublicGatherTab(GatherTab): self._ui_rows = self._ui_rows[:-clipcount] # If we have no parties to show, we're done. - if not self._parties_displayed: - text = self._join_status_text - if ( - plus.get_v1_account_state() == 'signed_in' - and cast(str, bui.textwidget(query=text)) == '' - ): - bui.textwidget( - edit=self._no_servers_found_text, - text=bui.Lstr(resource='noServersFoundText'), - ) + if self._have_valid_server_list and not self._parties_displayed: + bui.textwidget( + edit=self._no_servers_found_text, + text=bui.Lstr(resource='noServersFoundText'), + ) return - sub_scroll_width = 830 + assert self._join_sub_scroll_width is not None + sub_scroll_width = self._join_sub_scroll_width lineheight = 42 sub_scroll_height = lineheight * len(self._parties_displayed) + 50 bui.containerwidget( @@ -1021,27 +1038,27 @@ class PublicGatherTab(GatherTab): ) # Any time our height changes, reset the refresh back to the top - # so we don't see ugly empty spaces appearing during initial list - # filling. + # so we don't see ugly empty spaces appearing during initial + # list filling. if sub_scroll_height != self._last_sub_scroll_height: self._refresh_ui_row = 0 self._last_sub_scroll_height = sub_scroll_height - # Also note that we need to redisplay everything since its pos - # will have changed.. :( + # Also note that we need to redisplay everything since its + # pos will have changed.. :( for party in self._parties.values(): party.clean_display_index = None - # Ew; this rebuilding generates deferred selection callbacks - # so we need to push deferred notices so we know to ignore them. + # Ew; this rebuilding generates deferred selection callbacks so + # we need to push deferred notices so we know to ignore them. def refresh_on() -> None: self._refreshing_list = True bui.pushcall(refresh_on) - # Ok, now here's the deal: we want to avoid creating/updating this - # entire list at one time because it will lead to hitches. So we - # refresh individual rows quickly in a loop. + # Ok, now here's the deal: we want to avoid creating/updating + # this entire list at one time because it will lead to hitches. + # So we refresh individual rows quickly in a loop. rowcount = min(12, len(self._parties_displayed)) party_vals_displayed = list(self._parties_displayed.values()) @@ -1051,9 +1068,10 @@ class PublicGatherTab(GatherTab): self._ui_rows.append(UIRow()) refresh_row = len(self._ui_rows) - 1 - # For the first few seconds after getting our first server-list, - # refresh only the top section of the list; this allows the lowest - # ping servers to show up more quickly. + # For the first few seconds after getting our first + # server-list, refresh only the top section of the list; + # this allows the lowest ping servers to show up more + # quickly. if self._first_valid_server_list_time is not None: if time.time() - self._first_valid_server_list_time < 4.0: if refresh_row > 40: @@ -1083,7 +1101,8 @@ class PublicGatherTab(GatherTab): def _process_pending_party_infos(self) -> None: starttime = time.time() - # We want to do this in small enough pieces to not cause UI hitches. + # We want to do this in small enough pieces to not cause UI + # hitches. chunksize = 30 parties_in = self._pending_party_infos[:chunksize] self._pending_party_infos = self._pending_party_infos[chunksize:] @@ -1167,16 +1186,16 @@ class PublicGatherTab(GatherTab): else: self._parties_displayed = dict(self._parties_sorted) - # Any time our selection disappears from the displayed list, go back to - # auto-selecting the top entry. + # Any time our selection disappears from the displayed list, go + # back to auto-selecting the top entry. if ( self._selection is not None and self._selection.entry_key not in self._parties_displayed ): self._have_user_selected_row = False - # Whenever the user hasn't selected something, keep the first visible - # row selected. + # Whenever the user hasn't selected something, keep the first + # visible row selected. if not self._have_user_selected_row and self._parties_displayed: firstpartykey = next(iter(self._parties_displayed)) self._selection = Selection(firstpartykey, SelectionComponent.NAME) @@ -1228,8 +1247,8 @@ class PublicGatherTab(GatherTab): party.next_ping_time <= now and bui.app.classic.ping_thread_count < 15 ): - # Crank the interval up for high-latency or non-responding - # parties to save us some useless work. + # Crank the interval up for high-latency or + # non-responding parties to save us some useless work. mult = 1 if party.ping_responses == 0: if party.ping_attempts > 4: @@ -1259,16 +1278,16 @@ class PublicGatherTab(GatherTab): def _ping_callback( self, address: str, port: int | None, result: float | None ) -> None: - # Look for a widget corresponding to this target. - # If we find one, update our list. + # Look for a widget corresponding to this target. If we find + # one, update our list. party_key = f'{address}_{port}' party = self._parties.get(party_key) if party is not None: if result is not None: party.ping_responses += 1 - # We now smooth ping a bit to reduce jumping around in the list - # (only where pings are relatively good). + # We now smooth ping a bit to reduce jumping around in the + # list (only where pings are relatively good). current_ping = party.ping if current_ping is not None and result is not None and result < 150: smoothing = 0.7 @@ -1371,7 +1390,7 @@ class PublicGatherTab(GatherTab): ) def _on_start_advertizing_press(self) -> None: - from bauiv1lib.account import show_sign_in_prompt + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None @@ -1395,8 +1414,8 @@ class PublicGatherTab(GatherTab): bui.getsound('shieldUp').play() bs.set_public_party_enabled(True) - # In GUI builds we want to authenticate clients only when hosting - # public parties. + # In GUI builds we want to authenticate clients only when + # hosting public parties. bs.set_authenticate_clients(True) self._do_status_check() @@ -1412,8 +1431,8 @@ class PublicGatherTab(GatherTab): def _on_stop_advertising_press(self) -> None: bs.set_public_party_enabled(False) - # In GUI builds we want to authenticate clients only when hosting - # public parties. + # In GUI builds we want to authenticate clients only when + # hosting public parties. bs.set_authenticate_clients(False) bui.getsound('shieldDown').play() text = self._host_status_text @@ -1446,6 +1465,10 @@ class PublicGatherTab(GatherTab): address = party.address port = party.port + # Store UI location to return to when done. + if bs.app.classic is not None: + bs.app.classic.save_ui_state() + # Rate limit this a bit. now = time.time() last_connect_time = self._last_connect_attempt_time diff --git a/dist/ba_data/python/bauiv1lib/getcurrency.py b/dist/ba_data/python/bauiv1lib/getcurrency.py deleted file mode 100644 index 7883f61..0000000 --- a/dist/ba_data/python/bauiv1lib/getcurrency.py +++ /dev/null @@ -1,796 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""UI functionality for purchasing/acquiring currency.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from efro.util import utc_now - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any - - -class GetCurrencyWindow(bui.Window): - """Window for purchasing/acquiring currency.""" - - def __init__( - self, - transition: str = 'in_right', - from_modal_store: bool = False, - modal: bool = False, - origin_widget: bui.Widget | None = None, - store_back_location: str | None = None, - ): - # pylint: disable=too-many-statements - # pylint: disable=too-many-locals - - plus = bui.app.plus - assert plus is not None - - bui.set_analytics_screen('Get Tickets Window') - - self._transitioning_out = False - self._store_back_location = store_back_location # ew. - - self._ad_button_greyed = False - self._smooth_update_timer: bui.AppTimer | None = None - self._ad_button = None - self._ad_label = None - self._ad_image = None - self._ad_time_text = None - - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - self._width = 1000.0 if uiscale is bui.UIScale.SMALL else 800.0 - x_inset = 100.0 if uiscale is bui.UIScale.SMALL else 0.0 - self._height = 480.0 - - self._modal = modal - self._from_modal_store = from_modal_store - self._r = 'getTicketsWindow' - - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 - - super().__init__( - root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - scale_origin_stack_offset=scale_origin, - color=(0.4, 0.37, 0.55), - scale=( - 1.63 - if uiscale is bui.UIScale.SMALL - else 1.2 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (0, -3) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) - ) - - btn = bui.buttonwidget( - parent=self._root_widget, - position=(55 + x_inset, self._height - 79), - size=(140, 60), - scale=1.0, - autoselect=True, - label=bui.Lstr(resource='doneText' if modal else 'backText'), - button_type='regular' if modal else 'back', - on_activate_call=self._back, - ) - - bui.containerwidget(edit=self._root_widget, cancel_button=btn) - - bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height - 55), - size=(0, 0), - color=bui.app.ui_v1.title_color, - scale=1.2, - h_align='center', - v_align='center', - text=bui.Lstr(resource=self._r + '.titleText'), - maxwidth=290, - ) - - if not modal: - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - b_size = (220.0, 180.0) - v = self._height - b_size[1] - 80 - spacing = 1 - - self._ad_button = None - - def _add_button( - item: str, - position: tuple[float, float], - size: tuple[float, float], - label: bui.Lstr, - price: str | None = None, - tex_name: str | None = None, - tex_opacity: float = 1.0, - tex_scale: float = 1.0, - enabled: bool = True, - text_scale: float = 1.0, - ) -> bui.Widget: - btn2 = bui.buttonwidget( - parent=self._root_widget, - position=position, - button_type='square', - size=size, - label='', - autoselect=True, - color=None if enabled else (0.5, 0.5, 0.5), - on_activate_call=( - bui.Call(self._purchase, item) - if enabled - else self._disabled_press - ), - ) - txt = bui.textwidget( - parent=self._root_widget, - text=label, - position=( - position[0] + size[0] * 0.5, - position[1] + size[1] * 0.3, - ), - scale=text_scale, - maxwidth=size[0] * 0.75, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=btn2, - color=(0.7, 0.9, 0.7, 1.0 if enabled else 0.2), - ) - if price is not None and enabled: - bui.textwidget( - parent=self._root_widget, - text=price, - position=( - position[0] + size[0] * 0.5, - position[1] + size[1] * 0.17, - ), - scale=0.7, - maxwidth=size[0] * 0.75, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=btn2, - color=(0.4, 0.9, 0.4, 1.0), - ) - i = None - if tex_name is not None: - tex_size = 90.0 * tex_scale - i = bui.imagewidget( - parent=self._root_widget, - texture=bui.gettexture(tex_name), - position=( - position[0] + size[0] * 0.5 - tex_size * 0.5, - position[1] + size[1] * 0.66 - tex_size * 0.5, - ), - size=(tex_size, tex_size), - draw_controller=btn2, - opacity=tex_opacity * (1.0 if enabled else 0.25), - ) - if item == 'ad': - self._ad_button = btn2 - self._ad_label = txt - assert i is not None - self._ad_image = i - self._ad_time_text = bui.textwidget( - parent=self._root_widget, - text='1m 10s', - position=( - position[0] + size[0] * 0.5, - position[1] + size[1] * 0.5, - ), - scale=text_scale * 1.2, - maxwidth=size[0] * 0.85, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=btn2, - color=(0.4, 0.9, 0.4, 1.0), - ) - return btn2 - - rsrc = self._r + '.ticketsText' - - c2txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val('tickets2Amount', 500) - ), - ) - ], - ) - c3txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'tickets3Amount', 1500 - ) - ), - ) - ], - ) - c4txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'tickets4Amount', 5000 - ) - ), - ) - ], - ) - c5txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'tickets5Amount', 15000 - ) - ), - ) - ], - ) - - h = 110.0 - - # Enable buttons if we have prices. - tickets2_price = plus.get_price('tickets2') - tickets3_price = plus.get_price('tickets3') - tickets4_price = plus.get_price('tickets4') - tickets5_price = plus.get_price('tickets5') - - # TEMP - # tickets1_price = '$0.99' - # tickets2_price = '$4.99' - # tickets3_price = '$9.99' - # tickets4_price = '$19.99' - # tickets5_price = '$49.99' - - _add_button( - 'tickets2', - enabled=(tickets2_price is not None), - position=( - self._width * 0.5 - spacing * 1.5 - b_size[0] * 2.0 + h, - v, - ), - size=b_size, - label=c2txt, - price=tickets2_price, - tex_name='ticketsMore', - ) # 0.99-ish - _add_button( - 'tickets3', - enabled=(tickets3_price is not None), - position=( - self._width * 0.5 - spacing * 0.5 - b_size[0] * 1.0 + h, - v, - ), - size=b_size, - label=c3txt, - price=tickets3_price, - tex_name='ticketRoll', - ) # 4.99-ish - v -= b_size[1] - 5 - _add_button( - 'tickets4', - enabled=(tickets4_price is not None), - position=( - self._width * 0.5 - spacing * 1.5 - b_size[0] * 2.0 + h, - v, - ), - size=b_size, - label=c4txt, - price=tickets4_price, - tex_name='ticketRollBig', - tex_scale=1.2, - ) # 9.99-ish - _add_button( - 'tickets5', - enabled=(tickets5_price is not None), - position=( - self._width * 0.5 - spacing * 0.5 - b_size[0] * 1.0 + h, - v, - ), - size=b_size, - label=c5txt, - price=tickets5_price, - tex_name='ticketRolls', - tex_scale=1.2, - ) # 19.99-ish - - self._enable_ad_button = plus.has_video_ads() - h = self._width * 0.5 + 110.0 - v = self._height - b_size[1] - 115.0 - - if self._enable_ad_button: - h_offs = 35 - b_size_3 = (150, 120) - cdb = _add_button( - 'ad', - position=(h + h_offs, v), - size=b_size_3, - label=bui.Lstr( - resource=self._r + '.ticketsFromASponsorText', - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'sponsorTickets', 5 - ) - ), - ) - ], - ), - tex_name='ticketsMore', - enabled=self._enable_ad_button, - tex_opacity=0.6, - tex_scale=0.7, - text_scale=0.7, - ) - bui.buttonwidget(edit=cdb, color=(0.65, 0.5, 0.7)) - - self._ad_free_text = bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource=self._r + '.freeText'), - position=( - h + h_offs + b_size_3[0] * 0.5, - v + b_size_3[1] * 0.5 + 25, - ), - size=(0, 0), - color=(1, 1, 0, 1.0), - draw_controller=cdb, - rotate=15, - shadow=1.0, - maxwidth=150, - h_align='center', - v_align='center', - scale=1.0, - ) - v -= 125 - else: - v -= 20 - - if bool(True): - h_offs = 35 - b_size_3 = (150, 120) - cdb = _add_button( - 'app_invite', - position=(h + h_offs, v), - size=b_size_3, - label=bui.Lstr( - resource='gatherWindow.earnTicketsForRecommendingText', - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'sponsorTickets', 5 - ) - ), - ) - ], - ), - tex_name='ticketsMore', - enabled=True, - tex_opacity=0.6, - tex_scale=0.7, - text_scale=0.7, - ) - bui.buttonwidget(edit=cdb, color=(0.65, 0.5, 0.7)) - - bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource=self._r + '.freeText'), - position=( - h + h_offs + b_size_3[0] * 0.5, - v + b_size_3[1] * 0.5 + 25, - ), - size=(0, 0), - color=(1, 1, 0, 1.0), - draw_controller=cdb, - rotate=15, - shadow=1.0, - maxwidth=150, - h_align='center', - v_align='center', - scale=1.0, - ) - tc_y_offs = 0 - else: - tc_y_offs = 0 - - h = self._width - (185 + x_inset) - v = self._height - 95 + tc_y_offs - - txt1 = ( - bui.Lstr(resource=self._r + '.youHaveText') - .evaluate() - .partition('${COUNT}')[0] - .strip() - ) - txt2 = ( - bui.Lstr(resource=self._r + '.youHaveText') - .evaluate() - .rpartition('${COUNT}')[-1] - .strip() - ) - - bui.textwidget( - parent=self._root_widget, - text=txt1, - position=(h, v), - size=(0, 0), - color=(0.5, 0.5, 0.6), - maxwidth=200, - h_align='center', - v_align='center', - scale=0.8, - ) - v -= 30 - self._ticket_count_text = bui.textwidget( - parent=self._root_widget, - position=(h, v), - size=(0, 0), - color=(0.2, 1.0, 0.2), - maxwidth=200, - h_align='center', - v_align='center', - scale=1.6, - ) - v -= 30 - bui.textwidget( - parent=self._root_widget, - text=txt2, - position=(h, v), - size=(0, 0), - color=(0.5, 0.5, 0.6), - maxwidth=200, - h_align='center', - v_align='center', - scale=0.8, - ) - - self._ticking_sound: bui.Sound | None = None - self._smooth_ticket_count: float | None = None - self._ticket_count = 0 - self._update() - self._update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update), repeat=True - ) - self._smooth_increase_speed = 1.0 - - def __del__(self) -> None: - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - - def _smooth_update(self) -> None: - if not self._ticket_count_text: - self._smooth_update_timer = None - return - - finished = False - - # If we're going down, do it immediately. - assert self._smooth_ticket_count is not None - if int(self._smooth_ticket_count) >= self._ticket_count: - self._smooth_ticket_count = float(self._ticket_count) - finished = True - else: - # We're going up; start a sound if need be. - self._smooth_ticket_count = min( - self._smooth_ticket_count + 1.0 * self._smooth_increase_speed, - self._ticket_count, - ) - if int(self._smooth_ticket_count) >= self._ticket_count: - finished = True - self._smooth_ticket_count = float(self._ticket_count) - elif self._ticking_sound is None: - self._ticking_sound = bui.getsound('scoreIncrease') - self._ticking_sound.play() - - bui.textwidget( - edit=self._ticket_count_text, - text=str(int(self._smooth_ticket_count)), - ) - - # If we've reached the target, kill the timer/sound/etc. - if finished: - self._smooth_update_timer = None - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - bui.getsound('cashRegister2').play() - - def _update(self) -> None: - import datetime - - plus = bui.app.plus - assert plus is not None - - # If we somehow get signed out, just die. - if plus.get_v1_account_state() != 'signed_in': - self._back() - return - - self._ticket_count = plus.get_v1_account_ticket_count() - - # Update our incentivized ad button depending on whether ads are - # available. - if self._ad_button is not None: - next_reward_ad_time = plus.get_v1_account_misc_read_val_2( - 'nextRewardAdTime', None - ) - if next_reward_ad_time is not None: - next_reward_ad_time = datetime.datetime.fromtimestamp( - next_reward_ad_time, datetime.UTC - ) - now = utc_now() - if plus.have_incentivized_ad() and ( - next_reward_ad_time is None or next_reward_ad_time <= now - ): - self._ad_button_greyed = False - bui.buttonwidget(edit=self._ad_button, color=(0.65, 0.5, 0.7)) - bui.textwidget(edit=self._ad_label, color=(0.7, 0.9, 0.7, 1.0)) - bui.textwidget(edit=self._ad_free_text, color=(1, 1, 0, 1)) - bui.imagewidget(edit=self._ad_image, opacity=0.6) - bui.textwidget(edit=self._ad_time_text, text='') - else: - self._ad_button_greyed = True - bui.buttonwidget(edit=self._ad_button, color=(0.5, 0.5, 0.5)) - bui.textwidget(edit=self._ad_label, color=(0.7, 0.9, 0.7, 0.2)) - bui.textwidget(edit=self._ad_free_text, color=(1, 1, 0, 0.2)) - bui.imagewidget(edit=self._ad_image, opacity=0.6 * 0.25) - sval: str | bui.Lstr - if ( - next_reward_ad_time is not None - and next_reward_ad_time > now - ): - sval = bui.timestring( - (next_reward_ad_time - now).total_seconds(), centi=False - ) - else: - sval = '' - bui.textwidget(edit=self._ad_time_text, text=sval) - - # If this is our first update, assign immediately; otherwise kick - # off a smooth transition if the value has changed. - if self._smooth_ticket_count is None: - self._smooth_ticket_count = float(self._ticket_count) - self._smooth_update() # will set the text widget - - elif ( - self._ticket_count != int(self._smooth_ticket_count) - and self._smooth_update_timer is None - ): - self._smooth_update_timer = bui.AppTimer( - 0.05, bui.WeakCall(self._smooth_update), repeat=True - ) - diff = abs(float(self._ticket_count) - self._smooth_ticket_count) - self._smooth_increase_speed = ( - diff / 100.0 - if diff >= 5000 - else ( - diff / 50.0 - if diff >= 1500 - else diff / 30.0 if diff >= 500 else diff / 15.0 - ) - ) - - def _disabled_press(self) -> None: - plus = bui.app.plus - assert plus is not None - - # If we're on a platform without purchases, inform the user they - # can link their accounts and buy stuff elsewhere. - app = bui.app - assert app.classic is not None - if ( - app.env.test - or ( - app.classic.platform == 'android' - and app.classic.subplatform in ['oculus', 'cardboard'] - ) - ) and plus.get_v1_account_misc_read_val('allowAccountLinking2', False): - bui.screenmessage( - bui.Lstr(resource=self._r + '.unavailableLinkAccountText'), - color=(1, 0.5, 0), - ) - else: - bui.screenmessage( - bui.Lstr(resource=self._r + '.unavailableText'), - color=(1, 0.5, 0), - ) - bui.getsound('error').play() - - def _purchase(self, item: str) -> None: - from bauiv1lib import account - from bauiv1lib import appinvite - - plus = bui.app.plus - assert plus is not None - - if bui.app.classic is None: - raise RuntimeError('This requires classic support.') - - if item == 'app_invite': - if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() - return - appinvite.handle_app_invites_press() - return - - # Here we ping the server to ask if it's valid for us to - # purchase this.. (better to fail now than after we've paid - # locally). - app = bui.app - assert app.classic is not None - bui.app.classic.master_server_v1_get( - 'bsAccountPurchaseCheck', - { - 'item': item, - 'platform': app.classic.platform, - 'subplatform': app.classic.subplatform, - 'version': app.env.engine_version, - 'buildNumber': app.env.engine_build_number, - }, - callback=bui.WeakCall(self._purchase_check_result, item), - ) - - def _purchase_check_result( - self, item: str, result: dict[str, Any] | None - ) -> None: - if result is None: - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr(resource='internal.unavailableNoConnectionText'), - color=(1, 0, 0), - ) - else: - if result['allow']: - self._do_purchase(item) - else: - if result['reason'] == 'versionTooOld': - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr(resource='getTicketsWindow.versionTooOldText'), - color=(1, 0, 0), - ) - else: - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr(resource='getTicketsWindow.unavailableText'), - color=(1, 0, 0), - ) - - # Actually start the purchase locally. - def _do_purchase(self, item: str) -> None: - plus = bui.app.plus - assert plus is not None - - if item == 'ad': - import datetime - - # If ads are disabled until some time, error. - next_reward_ad_time = plus.get_v1_account_misc_read_val_2( - 'nextRewardAdTime', None - ) - if next_reward_ad_time is not None: - next_reward_ad_time = datetime.datetime.fromtimestamp( - next_reward_ad_time, datetime.UTC - ) - now = utc_now() - if ( - next_reward_ad_time is not None and next_reward_ad_time > now - ) or self._ad_button_greyed: - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr( - resource='getTicketsWindow.unavailableTemporarilyText' - ), - color=(1, 0, 0), - ) - elif self._enable_ad_button: - assert bui.app.classic is not None - bui.app.classic.ads.show_ad('tickets') - else: - plus.purchase(item) - - def _back(self) -> None: - from bauiv1lib.store import browser - - # No-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - if self._transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - window = browser.StoreBrowserWindow( - transition='in_left', - modal=self._from_modal_store, - back_location=self._store_back_location, - ).get_root_widget() - if not self._from_modal_store: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - window, from_window=self._root_widget - ) - self._transitioning_out = True - - -def show_get_tickets_prompt() -> None: - """Show a 'not enough tickets' prompt with an option to purchase more. - - Note that the purchase option may not always be available - depending on the build of the game. - """ - from bauiv1lib.confirm import ConfirmWindow - - assert bui.app.classic is not None - if bui.app.classic.allow_ticket_purchases: - ConfirmWindow( - bui.Lstr( - translate=( - 'serverResponses', - 'You don\'t have enough tickets for this!', - ) - ), - lambda: GetCurrencyWindow(modal=True), - ok_text=bui.Lstr(resource='getTicketsWindow.titleText'), - width=460, - height=130, - ) - else: - ConfirmWindow( - bui.Lstr( - translate=( - 'serverResponses', - 'You don\'t have enough tickets for this!', - ) - ), - cancel_button=False, - width=460, - height=130, - ) diff --git a/dist/ba_data/python/bauiv1lib/gettickets.py b/dist/ba_data/python/bauiv1lib/gettickets.py deleted file mode 100644 index 3d40a4a..0000000 --- a/dist/ba_data/python/bauiv1lib/gettickets.py +++ /dev/null @@ -1,881 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""UI functionality for purchasing/acquiring currency.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from efro.util import utc_now - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any - - -class GetTicketsWindow(bui.Window): - """Window for purchasing/acquiring classic tickets.""" - - def __init__( - self, - transition: str = 'in_right', - from_modal_store: bool = False, - modal: bool = False, - origin_widget: bui.Widget | None = None, - store_back_location: str | None = None, - ): - # pylint: disable=too-many-statements - # pylint: disable=too-many-locals - - plus = bui.app.plus - assert plus is not None - - bui.set_analytics_screen('Get Tickets Window') - - self._transitioning_out = False - self._store_back_location = store_back_location # ew. - - self._ad_button_greyed = False - self._smooth_update_timer: bui.AppTimer | None = None - self._ad_button = None - self._ad_label = None - self._ad_image = None - self._ad_time_text = None - - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - self._width = 1000.0 if uiscale is bui.UIScale.SMALL else 800.0 - x_inset = 100.0 if uiscale is bui.UIScale.SMALL else 0.0 - self._height = 480.0 - - self._modal = modal - self._from_modal_store = from_modal_store - self._r = 'getTicketsWindow' - - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 - - super().__init__( - root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - scale_origin_stack_offset=scale_origin, - color=(0.4, 0.37, 0.55), - scale=( - 1.63 - if uiscale is bui.UIScale.SMALL - else 1.2 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (0, -3) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) - ) - - btn = bui.buttonwidget( - parent=self._root_widget, - position=(55 + x_inset, self._height - 79), - size=(140, 60), - scale=1.0, - autoselect=True, - label=bui.Lstr(resource='doneText' if modal else 'backText'), - button_type='regular' if modal else 'back', - on_activate_call=self._back, - ) - - bui.containerwidget(edit=self._root_widget, cancel_button=btn) - - bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5 - 15, self._height - 47), - size=(0, 0), - color=bui.app.ui_v1.title_color, - scale=1.2, - h_align='right', - v_align='center', - text=bui.Lstr(resource=f'{self._r}.titleText'), - # text='Testing really long text here blah blah', - maxwidth=260, - ) - - # Get Tokens button - bui.buttonwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height - 72), - color=(0.65, 0.5, 0.7), - textcolor=bui.app.ui_v1.title_color, - size=(190, 50), - autoselect=True, - label=bui.Lstr(resource='tokens.getTokensText'), - on_activate_call=self._get_tokens_press, - ) - - # 'New!' by tokens button - bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource='newExclaimText'), - position=(self._width * 0.5 + 25, self._height - 32), - size=(0, 0), - color=(1, 1, 0, 1.0), - rotate=22, - shadow=1.0, - maxwidth=150, - h_align='center', - v_align='center', - scale=0.7, - ) - - if not modal: - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - b_size = (220.0, 180.0) - v = self._height - b_size[1] - 80 - spacing = 1 - - self._ad_button = None - - def _add_button( - item: str, - position: tuple[float, float], - size: tuple[float, float], - label: bui.Lstr, - price: str | None = None, - tex_name: str | None = None, - tex_opacity: float = 1.0, - tex_scale: float = 1.0, - enabled: bool = True, - text_scale: float = 1.0, - ) -> bui.Widget: - btn2 = bui.buttonwidget( - parent=self._root_widget, - position=position, - button_type='square', - size=size, - label='', - autoselect=True, - color=None if enabled else (0.5, 0.5, 0.5), - on_activate_call=( - bui.Call(self._purchase, item) - if enabled - else self._disabled_press - ), - ) - txt = bui.textwidget( - parent=self._root_widget, - text=label, - position=( - position[0] + size[0] * 0.5, - position[1] + size[1] * 0.3, - ), - scale=text_scale, - maxwidth=size[0] * 0.75, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=btn2, - color=(0.7, 0.9, 0.7, 1.0 if enabled else 0.2), - ) - if price is not None and enabled: - bui.textwidget( - parent=self._root_widget, - text=price, - position=( - position[0] + size[0] * 0.5, - position[1] + size[1] * 0.17, - ), - scale=0.7, - maxwidth=size[0] * 0.75, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=btn2, - color=(0.4, 0.9, 0.4, 1.0), - ) - i = None - if tex_name is not None: - tex_size = 90.0 * tex_scale - i = bui.imagewidget( - parent=self._root_widget, - texture=bui.gettexture(tex_name), - position=( - position[0] + size[0] * 0.5 - tex_size * 0.5, - position[1] + size[1] * 0.66 - tex_size * 0.5, - ), - size=(tex_size, tex_size), - draw_controller=btn2, - opacity=tex_opacity * (1.0 if enabled else 0.25), - ) - if item == 'ad': - self._ad_button = btn2 - self._ad_label = txt - assert i is not None - self._ad_image = i - self._ad_time_text = bui.textwidget( - parent=self._root_widget, - text='1m 10s', - position=( - position[0] + size[0] * 0.5, - position[1] + size[1] * 0.5, - ), - scale=text_scale * 1.2, - maxwidth=size[0] * 0.85, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=btn2, - color=(0.4, 0.9, 0.4, 1.0), - ) - return btn2 - - rsrc = f'{self._r}.ticketsText' - - c2txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val('tickets2Amount', 500) - ), - ) - ], - ) - c3txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'tickets3Amount', 1500 - ) - ), - ) - ], - ) - c4txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'tickets4Amount', 5000 - ) - ), - ) - ], - ) - c5txt = bui.Lstr( - resource=rsrc, - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'tickets5Amount', 15000 - ) - ), - ) - ], - ) - - h = 110.0 - - # Enable buttons if we have prices. - tickets2_price = plus.get_price('tickets2') - tickets3_price = plus.get_price('tickets3') - tickets4_price = plus.get_price('tickets4') - tickets5_price = plus.get_price('tickets5') - - # TEMP - # tickets1_price = '$0.99' - # tickets2_price = '$4.99' - # tickets3_price = '$9.99' - # tickets4_price = '$19.99' - # tickets5_price = '$49.99' - - _add_button( - 'tickets2', - enabled=(tickets2_price is not None), - position=( - self._width * 0.5 - spacing * 1.5 - b_size[0] * 2.0 + h, - v, - ), - size=b_size, - label=c2txt, - price=tickets2_price, - tex_name='ticketsMore', - ) # 0.99-ish - _add_button( - 'tickets3', - enabled=(tickets3_price is not None), - position=( - self._width * 0.5 - spacing * 0.5 - b_size[0] * 1.0 + h, - v, - ), - size=b_size, - label=c3txt, - price=tickets3_price, - tex_name='ticketRoll', - ) # 4.99-ish - v -= b_size[1] - 5 - _add_button( - 'tickets4', - enabled=(tickets4_price is not None), - position=( - self._width * 0.5 - spacing * 1.5 - b_size[0] * 2.0 + h, - v, - ), - size=b_size, - label=c4txt, - price=tickets4_price, - tex_name='ticketRollBig', - tex_scale=1.2, - ) # 9.99-ish - _add_button( - 'tickets5', - enabled=(tickets5_price is not None), - position=( - self._width * 0.5 - spacing * 0.5 - b_size[0] * 1.0 + h, - v, - ), - size=b_size, - label=c5txt, - price=tickets5_price, - tex_name='ticketRolls', - tex_scale=1.2, - ) # 19.99-ish - - self._enable_ad_button = plus.has_video_ads() - h = self._width * 0.5 + 110.0 - v = self._height - b_size[1] - 115.0 - - if self._enable_ad_button: - h_offs = 35 - b_size_3 = (150, 120) - cdb = _add_button( - 'ad', - position=(h + h_offs, v), - size=b_size_3, - label=bui.Lstr( - resource=f'{self._r}.ticketsFromASponsorText', - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'sponsorTickets', 5 - ) - ), - ) - ], - ), - tex_name='ticketsMore', - enabled=self._enable_ad_button, - tex_opacity=0.6, - tex_scale=0.7, - text_scale=0.7, - ) - bui.buttonwidget(edit=cdb, color=(0.65, 0.5, 0.7)) - - self._ad_free_text = bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource=f'{self._r}.freeText'), - position=( - h + h_offs + b_size_3[0] * 0.5, - v + b_size_3[1] * 0.5 + 25, - ), - size=(0, 0), - color=(1, 1, 0, 1.0), - draw_controller=cdb, - rotate=15, - shadow=1.0, - maxwidth=150, - h_align='center', - v_align='center', - scale=1.0, - ) - v -= 125 - else: - v -= 20 - - if bool(True): - h_offs = 35 - b_size_3 = (150, 120) - cdb = _add_button( - 'app_invite', - position=(h + h_offs, v), - size=b_size_3, - label=bui.Lstr( - resource='gatherWindow.earnTicketsForRecommendingText', - subs=[ - ( - '${COUNT}', - str( - plus.get_v1_account_misc_read_val( - 'sponsorTickets', 5 - ) - ), - ) - ], - ), - tex_name='ticketsMore', - enabled=True, - tex_opacity=0.6, - tex_scale=0.7, - text_scale=0.7, - ) - bui.buttonwidget(edit=cdb, color=(0.65, 0.5, 0.7)) - - bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource=f'{self._r}.freeText'), - position=( - h + h_offs + b_size_3[0] * 0.5, - v + b_size_3[1] * 0.5 + 25, - ), - size=(0, 0), - color=(1, 1, 0, 1.0), - draw_controller=cdb, - rotate=15, - shadow=1.0, - maxwidth=150, - h_align='center', - v_align='center', - scale=1.0, - ) - tc_y_offs = 0 - else: - tc_y_offs = 0 - - h = self._width - (185 + x_inset) - v = self._height - 105 + tc_y_offs - - txt1 = ( - bui.Lstr(resource=f'{self._r}.youHaveText') - .evaluate() - .partition('${COUNT}')[0] - .strip() - ) - txt2 = ( - bui.Lstr(resource=f'{self._r}.youHaveText') - .evaluate() - .rpartition('${COUNT}')[-1] - .strip() - ) - - bui.textwidget( - parent=self._root_widget, - text=txt1, - position=(h, v), - size=(0, 0), - color=(0.5, 0.5, 0.6), - maxwidth=200, - h_align='center', - v_align='center', - scale=0.8, - ) - v -= 30 - self._ticket_count_text = bui.textwidget( - parent=self._root_widget, - position=(h, v), - size=(0, 0), - color=(0.2, 1.0, 0.2), - maxwidth=200, - h_align='center', - v_align='center', - scale=1.6, - ) - v -= 30 - bui.textwidget( - parent=self._root_widget, - text=txt2, - position=(h, v), - size=(0, 0), - color=(0.5, 0.5, 0.6), - maxwidth=200, - h_align='center', - v_align='center', - scale=0.8, - ) - - self._ticking_sound: bui.Sound | None = None - self._smooth_ticket_count: float | None = None - self._ticket_count = 0 - self._update() - self._update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update), repeat=True - ) - self._smooth_increase_speed = 1.0 - - def __del__(self) -> None: - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - - def _smooth_update(self) -> None: - if not self._ticket_count_text: - self._smooth_update_timer = None - return - - finished = False - - # If we're going down, do it immediately. - assert self._smooth_ticket_count is not None - if int(self._smooth_ticket_count) >= self._ticket_count: - self._smooth_ticket_count = float(self._ticket_count) - finished = True - else: - # We're going up; start a sound if need be. - self._smooth_ticket_count = min( - self._smooth_ticket_count + 1.0 * self._smooth_increase_speed, - self._ticket_count, - ) - if int(self._smooth_ticket_count) >= self._ticket_count: - finished = True - self._smooth_ticket_count = float(self._ticket_count) - elif self._ticking_sound is None: - self._ticking_sound = bui.getsound('scoreIncrease') - self._ticking_sound.play() - - bui.textwidget( - edit=self._ticket_count_text, - text=str(int(self._smooth_ticket_count)), - ) - - # If we've reached the target, kill the timer/sound/etc. - if finished: - self._smooth_update_timer = None - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - bui.getsound('cashRegister2').play() - - def _update(self) -> None: - import datetime - - plus = bui.app.plus - assert plus is not None - - # If we somehow get signed out, just die. - if plus.get_v1_account_state() != 'signed_in': - self._back() - return - - self._ticket_count = plus.get_v1_account_ticket_count() - - # Update our incentivized ad button depending on whether ads are - # available. - if self._ad_button is not None: - next_reward_ad_time = plus.get_v1_account_misc_read_val_2( - 'nextRewardAdTime', None - ) - if next_reward_ad_time is not None: - next_reward_ad_time = datetime.datetime.fromtimestamp( - next_reward_ad_time, datetime.UTC - ) - now = utc_now() - if plus.have_incentivized_ad() and ( - next_reward_ad_time is None or next_reward_ad_time <= now - ): - self._ad_button_greyed = False - bui.buttonwidget(edit=self._ad_button, color=(0.65, 0.5, 0.7)) - bui.textwidget(edit=self._ad_label, color=(0.7, 0.9, 0.7, 1.0)) - bui.textwidget(edit=self._ad_free_text, color=(1, 1, 0, 1)) - bui.imagewidget(edit=self._ad_image, opacity=0.6) - bui.textwidget(edit=self._ad_time_text, text='') - else: - self._ad_button_greyed = True - bui.buttonwidget(edit=self._ad_button, color=(0.5, 0.5, 0.5)) - bui.textwidget(edit=self._ad_label, color=(0.7, 0.9, 0.7, 0.2)) - bui.textwidget(edit=self._ad_free_text, color=(1, 1, 0, 0.2)) - bui.imagewidget(edit=self._ad_image, opacity=0.6 * 0.25) - sval: str | bui.Lstr - if ( - next_reward_ad_time is not None - and next_reward_ad_time > now - ): - sval = bui.timestring( - (next_reward_ad_time - now).total_seconds(), centi=False - ) - else: - sval = '' - bui.textwidget(edit=self._ad_time_text, text=sval) - - # If this is our first update, assign immediately; otherwise kick - # off a smooth transition if the value has changed. - if self._smooth_ticket_count is None: - self._smooth_ticket_count = float(self._ticket_count) - self._smooth_update() # will set the text widget - - elif ( - self._ticket_count != int(self._smooth_ticket_count) - and self._smooth_update_timer is None - ): - self._smooth_update_timer = bui.AppTimer( - 0.05, bui.WeakCall(self._smooth_update), repeat=True - ) - diff = abs(float(self._ticket_count) - self._smooth_ticket_count) - self._smooth_increase_speed = ( - diff / 100.0 - if diff >= 5000 - else ( - diff / 50.0 - if diff >= 1500 - else diff / 30.0 if diff >= 500 else diff / 15.0 - ) - ) - - def _disabled_press(self) -> None: - plus = bui.app.plus - assert plus is not None - - # If we're on a platform without purchases, inform the user they - # can link their accounts and buy stuff elsewhere. - app = bui.app - assert app.classic is not None - if ( - app.env.test - or ( - app.classic.platform == 'android' - and app.classic.subplatform in ['oculus', 'cardboard'] - ) - ) and plus.get_v1_account_misc_read_val('allowAccountLinking2', False): - bui.screenmessage( - bui.Lstr(resource=f'{self._r}.unavailableLinkAccountText'), - color=(1, 0.5, 0), - ) - else: - bui.screenmessage( - bui.Lstr(resource=f'{self._r}.unavailableText'), - color=(1, 0.5, 0), - ) - bui.getsound('error').play() - - def _purchase(self, item: str) -> None: - from bauiv1lib import account - from bauiv1lib import appinvite - - plus = bui.app.plus - assert plus is not None - - if bui.app.classic is None: - raise RuntimeError('This requires classic support.') - - if item == 'app_invite': - if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() - return - appinvite.handle_app_invites_press() - return - - # Here we ping the server to ask if it's valid for us to - # purchase this.. (better to fail now than after we've paid - # locally). - app = bui.app - assert app.classic is not None - bui.app.classic.master_server_v1_get( - 'bsAccountPurchaseCheck', - { - 'item': item, - 'platform': app.classic.platform, - 'subplatform': app.classic.subplatform, - 'version': app.env.engine_version, - 'buildNumber': app.env.engine_build_number, - }, - callback=bui.WeakCall(self._purchase_check_result, item), - ) - - def _purchase_check_result( - self, item: str, result: dict[str, Any] | None - ) -> None: - if result is None: - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr(resource='internal.unavailableNoConnectionText'), - color=(1, 0, 0), - ) - else: - if result['allow']: - self._do_purchase(item) - else: - if result['reason'] == 'versionTooOld': - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr(resource='getTicketsWindow.versionTooOldText'), - color=(1, 0, 0), - ) - else: - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr(resource='getTicketsWindow.unavailableText'), - color=(1, 0, 0), - ) - - # Actually start the purchase locally. - def _do_purchase(self, item: str) -> None: - plus = bui.app.plus - assert plus is not None - - if item == 'ad': - import datetime - - # If ads are disabled until some time, error. - next_reward_ad_time = plus.get_v1_account_misc_read_val_2( - 'nextRewardAdTime', None - ) - if next_reward_ad_time is not None: - next_reward_ad_time = datetime.datetime.fromtimestamp( - next_reward_ad_time, datetime.UTC - ) - now = utc_now() - if ( - next_reward_ad_time is not None and next_reward_ad_time > now - ) or self._ad_button_greyed: - bui.getsound('error').play() - bui.screenmessage( - bui.Lstr( - resource='getTicketsWindow.unavailableTemporarilyText' - ), - color=(1, 0, 0), - ) - elif self._enable_ad_button: - assert bui.app.classic is not None - bui.app.classic.ads.show_ad('tickets') - else: - plus.purchase(item) - - def _get_tokens_press(self) -> None: - from functools import partial - - from bauiv1lib.gettokens import GetTokensWindow - - # No-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - if self._transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_left') - - # Note: Make sure we don't pass anything here that would - # capture 'self'. (a lambda would implicitly do this by capturing - # the stack frame). - restorecall = partial( - _restore_get_tickets_window, - self._modal, - self._from_modal_store, - self._store_back_location, - ) - - window = GetTokensWindow( - transition='in_right', - restore_previous_call=restorecall, - ).get_root_widget() - if not self._modal and not self._from_modal_store: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - window, from_window=self._root_widget - ) - self._transitioning_out = True - - def _back(self) -> None: - from bauiv1lib.store import browser - - # No-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - if self._transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - window = browser.StoreBrowserWindow( - transition='in_left', - modal=self._from_modal_store, - back_location=self._store_back_location, - ).get_root_widget() - if not self._from_modal_store: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - window, from_window=self._root_widget - ) - self._transitioning_out = True - - -# A call we can bundle up and pass to windows we open; allows them to -# get back to us without having to explicitly know about us. -def _restore_get_tickets_window( - modal: bool, - from_modal_store: bool, - store_back_location: str | None, - from_window: bui.Widget, -) -> None: - restored = GetTicketsWindow( - transition='in_left', - modal=modal, - from_modal_store=from_modal_store, - store_back_location=store_back_location, - ) - if not modal and not from_modal_store: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - restored.get_root_widget(), from_window=from_window - ) - - -def show_get_tickets_prompt() -> None: - """Show a 'not enough tickets' prompt with an option to purchase more. - - Note that the purchase option may not always be available - depending on the build of the game. - """ - from bauiv1lib.confirm import ConfirmWindow - - assert bui.app.classic is not None - - if bui.app.classic.allow_ticket_purchases: - ConfirmWindow( - bui.Lstr( - translate=( - 'serverResponses', - 'You don\'t have enough tickets for this!', - ) - ), - lambda: GetTicketsWindow(modal=True), - ok_text=bui.Lstr(resource='getTicketsWindow.titleText'), - width=460, - height=130, - ) - else: - ConfirmWindow( - bui.Lstr( - translate=( - 'serverResponses', - 'You don\'t have enough tickets for this!', - ) - ), - cancel_button=False, - width=460, - height=130, - ) diff --git a/dist/ba_data/python/bauiv1lib/gettokens.py b/dist/ba_data/python/bauiv1lib/gettokens.py index 22bff44..aa61bea 100644 --- a/dist/ba_data/python/bauiv1lib/gettokens.py +++ b/dist/ba_data/python/bauiv1lib/gettokens.py @@ -8,7 +8,7 @@ import time from enum import Enum from functools import partial from dataclasses import dataclass -from typing import TYPE_CHECKING, assert_never +from typing import TYPE_CHECKING, assert_never, override import bacommon.cloud import bauiv1 as bui @@ -54,7 +54,7 @@ class _TxtDef: rotate: float | None = None -class GetTokensWindow(bui.Window): +class GetTokensWindow(bui.MainWindow): """Window for purchasing/acquiring classic tickets.""" class State(Enum): @@ -67,12 +67,10 @@ class GetTokensWindow(bui.Window): def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, - restore_previous_call: Callable[[bui.Widget], None] | None = None, ): # pylint: disable=too-many-locals - bwidthstd = 170 bwidthwide = 300 ycolor = (0, 0, 0.3) @@ -304,7 +302,6 @@ class GetTokensWindow(bui.Window): ] self._transitioning_out = False - self._restore_previous_call = restore_previous_call self._textcolor = (0.92, 0.92, 2.0) self._query_in_flight = False @@ -313,68 +310,72 @@ class GetTokensWindow(bui.Window): None ) - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - uiscale = bui.app.ui_v1.uiscale - self._width = 1000.0 if uiscale is bui.UIScale.SMALL else 800.0 - self._x_inset = 100.0 if uiscale is bui.UIScale.SMALL else 0.0 - self._height = 480.0 + self._width = 1200.0 if uiscale is bui.UIScale.SMALL else 1070.0 + self._height = 800 if uiscale is bui.UIScale.SMALL else 520.0 self._r = 'getTokensWindow' - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.5 + if uiscale is bui.UIScale.SMALL + else 1.1 if uiscale is bui.UIScale.MEDIUM else 0.95 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + self._yoffs = 0.5 * self._height + 0.5 * target_height + 20.0 + + self._scroll_width = target_width super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - scale_origin_stack_offset=scale_origin, + size=(self._width, self._height), color=(0.3, 0.23, 0.36), - scale=( - 1.63 + scale=scale, + toolbar_visibility=( + 'get_tokens' if uiscale is bui.UIScale.SMALL - else 1.2 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (0, -3) if uiscale is bui.UIScale.SMALL else (0, 0) + else 'menu_full' ), + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + self._back_button = bui.get_special_widget('back_button') + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(60, self._yoffs - 90), + size=((60, 60)), + scale=1.0, + autoselect=True, + label=(bui.charstr(bui.SpecialChar.BACK)), + button_type=('backSmall'), + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button ) - ) - - self._back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(45 + self._x_inset, self._height - 80), - size=( - (140, 60) if self._restore_previous_call is None else (60, 60) - ), - scale=1.0, - autoselect=True, - label=( - bui.Lstr(resource='doneText') - if self._restore_previous_call is None - else bui.charstr(bui.SpecialChar.BACK) - ), - button_type=( - 'regular' - if self._restore_previous_call is None - else 'backSmall' - ), - on_activate_call=self._back, - ) - - bui.containerwidget(edit=self._root_widget, cancel_button=btn) self._title_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 47), + position=(self._width * 0.5, self._yoffs - 42), size=(0, 0), color=self._textcolor, flatness=0.0, @@ -394,7 +395,15 @@ class GetTokensWindow(bui.Window): v_align='center', color=(0.6, 0.6, 0.6), scale=0.75, - text=bui.Lstr(resource='store.loadingText'), + text='', + ) + # Create a spinner - it will get cleared when state changes from + # LOADING. + bui.spinnerwidget( + parent=self._root_widget, + size=60, + position=(self._width * 0.5, self._height * 0.5), + style='bomb', ) self._core_widgets = [ @@ -403,13 +412,6 @@ class GetTokensWindow(bui.Window): self._status_text, ] - self._token_count_widget: bui.Widget | None = None - self._smooth_update_timer: bui.AppTimer | None = None - self._smooth_token_count: float | None = None - self._token_count: int = 0 - self._smooth_increase_speed = 1.0 - self._ticking_sound: bui.Sound | None = None - # Get all textures used by our buttons preloading so hopefully # they'll be in place by the time we show them. for bdef in self._buttondefs: @@ -423,10 +425,15 @@ class GetTokensWindow(bui.Window): ) self._update() - def __del__(self) -> None: - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) def _update(self) -> None: # No-op if our underlying widget is dead or on its way out. @@ -475,7 +482,7 @@ class GetTokensWindow(bui.Window): return # Ok, state is changing. Start by resetting to a blank slate. - self._token_count_widget = None + # self._token_count_widget = None for widget in self._root_widget.get_children(): if widget not in self._core_widgets: widget.delete() @@ -526,43 +533,68 @@ class GetTokensWindow(bui.Window): ) -> None: # pylint: disable=too-many-locals plus = bui.app.plus + classic = bui.app.classic + + uiscale = bui.app.ui_v1.uiscale bui.textwidget(edit=self._status_text, text='') - xinset = 40 - - scrollwidth = self._width - 2 * (self._x_inset + xinset) scrollheight = 280 buttonpadding = -5 yoffs = 5 - # We currently don't handle the zero-button case. - assert self._buttondefs + available_purchases = { + p.purchaseid for p in response.available_purchases + } + buttondefs_shown = [ + b for b in self._buttondefs if b.itemid in available_purchases + ] - total_button_width = sum( - b.width + b.prepad for b in self._buttondefs - ) + buttonpadding * (len(self._buttondefs) - 1) + # Fail if something errored server-side or they didn't send us + # anything we can show. + if ( + response.result is not response.Result.SUCCESS + or not buttondefs_shown + ): + self._on_load_error() + return + + sidepad = 10.0 + xfudge = 6.0 + total_button_width = ( + sum(b.width + b.prepad for b in buttondefs_shown) + + buttonpadding * (len(buttondefs_shown) - 1) + + 2 * sidepad + ) h_scroll = bui.hscrollwidget( parent=self._root_widget, - size=(scrollwidth, scrollheight), - position=(self._x_inset + xinset, 45), + size=(self._scroll_width, scrollheight), + position=( + self._width * 0.5 - 0.5 * self._scroll_width, + self._height * 0.5 - 0.5 * scrollheight - 40, + ), claims_left_right=True, highlight=False, - border_opacity=0.25, + border_opacity=0.15, + center_small_content=True, ) subcontainer = bui.containerwidget( parent=h_scroll, background=False, - size=(max(total_button_width, scrollwidth), scrollheight), + size=(total_button_width, scrollheight), ) tinfobtn = bui.buttonwidget( parent=self._root_widget, autoselect=True, label=bui.Lstr(resource='learnMoreText'), - position=(self._width * 0.5 - 75, self._height * 0.703), - size=(180, 43), + text_scale=0.7, + position=( + self._width * 0.5 - 75, + self._yoffs - 100, + ), + size=(180, 40), scale=0.8, color=(0.4, 0.25, 0.5), textcolor=self._textcolor, @@ -570,15 +602,26 @@ class GetTokensWindow(bui.Window): self._on_learn_more_press, response.token_info_url ), ) + if uiscale is bui.UIScale.SMALL: + bui.widget( + edit=tinfobtn, + left_widget=bui.get_special_widget('back_button'), + up_widget=bui.get_special_widget('back_button'), + ) - x = 0.0 + bui.widget( + edit=tinfobtn, + right_widget=bui.get_special_widget('tokens_meter'), + ) + + x = sidepad + xfudge bwidgets: list[bui.Widget] = [] - for i, buttondef in enumerate(self._buttondefs): + for i, buttondef in enumerate(buttondefs_shown): price = None if plus is None else plus.get_price(buttondef.itemid) x += buttondef.prepad - tdelay = 0.3 - i / len(self._buttondefs) * 0.25 + tdelay = 0.3 - i / len(buttondefs_shown) * 0.25 btn = bui.buttonwidget( autoselect=True, label='', @@ -594,6 +637,10 @@ class GetTokensWindow(bui.Window): ), ) bwidgets.append(btn) + + if i == 0: + bui.widget(edit=btn, left_widget=self._back_button) + for imgdef in buttondef.imgdefs: _img = bui.imagewidget( parent=subcontainer, @@ -643,40 +690,43 @@ class GetTokensWindow(bui.Window): x += buttondef.width + buttonpadding bui.containerwidget(edit=subcontainer, visible_child=bwidgets[0]) - _tinfotxt = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height * 0.812), - color=self._textcolor, - shadow=1.0, - scale=0.7, - size=(0, 0), - h_align='center', - v_align='center', - text=bui.Lstr(resource='tokens.shinyNewCurrencyText'), - ) - self._token_count_widget = bui.textwidget( - parent=self._root_widget, - position=(self._width - self._x_inset - 120.0, self._height - 48), - color=(2.0, 0.7, 0.0), - shadow=1.0, - flatness=0.0, - size=(0, 0), - h_align='left', - v_align='center', - text='', - ) - self._token_count = response.tokens - self._smooth_token_count = float(self._token_count) - self._smooth_update() # will set the text widget. + if bool(False): + _tinfotxt = bui.textwidget( + parent=self._root_widget, + position=( + self._width * 0.5, + self._yoffs - 70, + ), + color=self._textcolor, + shadow=1.0, + scale=0.7, + size=(0, 0), + h_align='center', + v_align='center', + text=bui.Lstr(resource='tokens.shinyNewCurrencyText'), + ) - _tlabeltxt = bui.textwidget( - parent=self._root_widget, - position=(self._width - self._x_inset - 123.0, self._height - 48), - size=(0, 0), - h_align='right', - v_align='center', - text=bui.charstr(bui.SpecialChar.TOKEN), + has_removed_ads = classic is not None and ( + classic.gold_pass + or classic.remove_ads + or classic.accounts.have_pro() ) + if plus is not None and plus.has_video_ads() and not has_removed_ads: + _tinfotxt = bui.textwidget( + parent=self._root_widget, + position=( + self._width * 0.5, + self._yoffs - 120, + ), + color=(0.4, 1.0, 0.4), + shadow=1.0, + scale=0.5, + size=(0, 0), + h_align='center', + v_align='center', + maxwidth=self._scroll_width * 0.9, + text=bui.Lstr(resource='removeInGameAdsTokenPurchaseText'), + ) def _purchase_press(self, itemid: str) -> None: plus = bui.app.plus @@ -700,83 +750,8 @@ class GetTokensWindow(bui.Window): def _update_store_state(self) -> None: """Called to make minor updates to an already shown store.""" - assert self._token_count_widget is not None assert self._last_query_response is not None - self._token_count = self._last_query_response.tokens - - # Kick off new smooth update if need be. - assert self._smooth_token_count is not None - if ( - self._token_count != int(self._smooth_token_count) - and self._smooth_update_timer is None - ): - self._smooth_update_timer = bui.AppTimer( - 0.05, bui.WeakCall(self._smooth_update), repeat=True - ) - diff = abs(float(self._token_count) - self._smooth_token_count) - self._smooth_increase_speed = ( - diff / 100.0 - if diff >= 5000 - else ( - diff / 50.0 - if diff >= 1500 - else diff / 30.0 if diff >= 500 else diff / 15.0 - ) - ) - - def _smooth_update(self) -> None: - - # Stop if the count widget disappears. - if not self._token_count_widget: - self._smooth_update_timer = None - return - - finished = False - - # If we're going down, do it immediately. - assert self._smooth_token_count is not None - if int(self._smooth_token_count) >= self._token_count: - self._smooth_token_count = float(self._token_count) - finished = True - else: - # We're going up; start a sound if need be. - self._smooth_token_count = min( - self._smooth_token_count + 1.0 * self._smooth_increase_speed, - self._token_count, - ) - if int(self._smooth_token_count) >= self._token_count: - finished = True - self._smooth_token_count = float(self._token_count) - elif self._ticking_sound is None: - self._ticking_sound = bui.getsound('scoreIncrease') - self._ticking_sound.play() - - bui.textwidget( - edit=self._token_count_widget, - text=str(int(self._smooth_token_count)), - ) - - # If we've reached the target, kill the timer/sound/etc. - if finished: - self._smooth_update_timer = None - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - bui.getsound('cashRegister2').play() - - def _back(self) -> None: - - # No-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if self._restore_previous_call is not None: - self._restore_previous_call(self._root_widget) - def _on_learn_more_press(self, url: str) -> None: bui.open_url(url) @@ -795,7 +770,7 @@ def show_get_tokens_prompt() -> None: if bool(True): ConfirmWindow( bui.Lstr(resource='tokens.notEnoughTokensText'), - GetTokensWindow, + show_get_tokens_window, ok_text=bui.Lstr(resource='tokens.getTokensText'), width=460, height=130, @@ -807,3 +782,30 @@ def show_get_tokens_prompt() -> None: width=460, height=130, ) + + +def show_get_tokens_window(origin_widget: bui.Widget | None = None) -> None: + """Transition to the get-tokens main-window from anywhere.""" + + # NOTE TO USERS: The code below is not the proper way to do things; + # whenever possible one should use a MainWindow's + # main_window_replace() or main_window_back() methods. We just need + # to do things a bit more manually in this particular case. + + prev_main_window = bui.app.ui_v1.get_main_window() + + # Special-case: If it seems we're already in the window, do nothing. + if isinstance(prev_main_window, GetTokensWindow): + return + + # Set our new main window. + bui.app.ui_v1.set_main_window( + GetTokensWindow(origin_widget=origin_widget), + from_window=False, + is_auxiliary=True, + suppress_warning=True, + ) + + # Transition out any previous main window. + if prev_main_window is not None: + prev_main_window.main_window_close() diff --git a/dist/ba_data/python/bauiv1lib/helpui.py b/dist/ba_data/python/bauiv1lib/help.py similarity index 81% rename from dist/ba_data/python/bauiv1lib/helpui.py rename to dist/ba_data/python/bauiv1lib/help.py index 887f005..abb6370 100644 --- a/dist/ba_data/python/bauiv1lib/helpui.py +++ b/dist/ba_data/python/bauiv1lib/help.py @@ -4,137 +4,139 @@ from __future__ import annotations +from typing import override + +import random + import bauiv1 as bui -class HelpWindow(bui.Window): +class HelpWindow(bui.MainWindow): """A window providing help on how to play.""" def __init__( - self, main_menu: bool = False, origin_widget: bui.Widget | None = None + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-statements # pylint: disable=too-many-locals bui.set_analytics_screen('Help Window') - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - transition = 'in_right' - self._r = 'helpWindow' getres = bui.app.lang.get_resource - self._main_menu = main_menu assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale width = 1050 if uiscale is bui.UIScale.SMALL else 750 - x_offs = 150 if uiscale is bui.UIScale.SMALL else 0 + height = ( - 460 + 700 if uiscale is bui.UIScale.SMALL else 530 if uiscale is bui.UIScale.MEDIUM else 600 ) + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.8 + if uiscale is bui.UIScale.SMALL + else 1.15 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(width - 90, screensize[0] / scale) + target_height = min(height - 90, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + + scroll_width = target_width + scroll_height = target_height - 36 + scroll_bottom = yoffs - 64 - scroll_height + super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 1.77 + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.25 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -30) - if uiscale is bui.UIScale.SMALL - else (0, 15) if uiscale is bui.UIScale.MEDIUM else (0, 0) - ), - ) - ) - - bui.textwidget( - parent=self._root_widget, - position=(0, height - (50 if uiscale is bui.UIScale.SMALL else 45)), - size=(width, 25), - text=bui.Lstr( - resource=f'{self._r}.titleText', - subs=[('${APP_NAME}', bui.Lstr(resource='titleText'))], + scale=scale, ), - color=bui.app.ui_v1.title_color, - h_align='center', - v_align='top', + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._scrollwidget = bui.scrollwidget( - parent=self._root_widget, - position=(44 + x_offs, 55 if uiscale is bui.UIScale.SMALL else 55), - simple_culling_v=100.0, - size=( - width - (88 + 2 * x_offs), - height - 120 + (5 if uiscale is bui.UIScale.SMALL else 0), - ), - capture_arrows=True, - ) - - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=self._scrollwidget, - right_widget=bui.get_special_widget('party_button'), - ) - bui.containerwidget( - edit=self._root_widget, selected_child=self._scrollwidget - ) - - # ugly: create this last so it gets first dibs at touch events (since - # we have it close to the scroll widget) - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._close - ) - bui.widget( - edit=self._scrollwidget, - left_widget=bui.get_special_widget('back_button'), + edit=self._root_widget, on_cancel_call=self.main_window_back ) else: btn = bui.buttonwidget( parent=self._root_widget, - position=( - x_offs + (40 + 0 if uiscale is bui.UIScale.SMALL else 70), - height - (59 if uiscale is bui.UIScale.SMALL else 50), - ), - size=(140, 60), - scale=0.7 if uiscale is bui.UIScale.SMALL else 0.8, - label=( - bui.Lstr(resource='backText') - if self._main_menu - else 'Close' - ), - button_type='back' if self._main_menu else None, + position=(50, yoffs - 45), + size=(60, 55), + scale=0.8, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', extra_touch_border_scale=2.0, autoselect=True, - on_activate_call=self._close, + on_activate_call=self.main_window_back, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) - if self._main_menu: - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 55), - label=bui.charstr(bui.SpecialChar.BACK), - ) + bui.textwidget( + parent=self._root_widget, + position=( + width * 0.5, + yoffs - (47 if uiscale is bui.UIScale.SMALL else 25), + ), + size=(0, 0), + text=bui.Lstr( + resource=f'{self._r}.titleText', + subs=[('${APP_NAME}', bui.Lstr(resource='titleText'))], + ), + scale=0.9, + maxwidth=scroll_width * 0.7, + color=bui.app.ui_v1.title_color, + h_align='center', + v_align='center', + ) + self._scrollwidget = bui.scrollwidget( + parent=self._root_widget, + size=(scroll_width, scroll_height), + position=(width * 0.5 - scroll_width * 0.5, scroll_bottom), + simple_culling_v=100.0, + capture_arrows=True, + border_opacity=0.4, + center_small_content_horizontally=True, + ) + + if uiscale is bui.UIScale.SMALL: + bui.widget( + edit=self._scrollwidget, + left_widget=bui.get_special_widget('back_button'), + ) + + bui.widget( + edit=self._scrollwidget, + right_widget=bui.get_special_widget('squad_button'), + ) + bui.containerwidget( + edit=self._root_widget, selected_child=self._scrollwidget + ) + + # self._sub_width = 810 if uiscale is bui.UIScale.SMALL else 660 self._sub_width = 660 self._sub_height = ( 1590 @@ -149,7 +151,6 @@ class HelpWindow(bui.Window): size=(self._sub_width, self._sub_height), background=False, claims_left_right=False, - claims_tab=False, ) spacing = 1.0 @@ -405,12 +406,16 @@ class HelpWindow(bui.Window): # icon_size_2 = 30 hval2 = h - sep vval2 = v - bui.imagewidget( + bui.buttonwidget( parent=self._subcontainer, + label='', size=(icon_size, icon_size), position=(hval2 - 0.5 * icon_size, vval2 - 0.5 * icon_size), texture=bui.gettexture('buttonPunch'), color=(1, 0.7, 0.3), + selectable=False, + enable_sound=False, + on_activate_call=bui.WeakCall(self._play_sound, 'spazAttack0', 4), ) txt_scale = getres(f'{self._r}.punchInfoTextScale') @@ -429,12 +434,16 @@ class HelpWindow(bui.Window): hval2 = h + sep vval2 = v - bui.imagewidget( + bui.buttonwidget( parent=self._subcontainer, + label='', size=(icon_size, icon_size), position=(hval2 - 0.5 * icon_size, vval2 - 0.5 * icon_size), texture=bui.gettexture('buttonBomb'), color=(1, 0.3, 0.3), + selectable=False, + enable_sound=False, + on_activate_call=bui.WeakCall(self._play_sound, 'explosion0', 5), ) txt = bui.Lstr(resource=f'{self._r}.bombInfoText').evaluate() @@ -454,12 +463,16 @@ class HelpWindow(bui.Window): hval2 = h vval2 = v + sep - bui.imagewidget( + bui.buttonwidget( parent=self._subcontainer, + label='', size=(icon_size, icon_size), position=(hval2 - 0.5 * icon_size, vval2 - 0.5 * icon_size), texture=bui.gettexture('buttonPickUp'), color=(0.5, 0.5, 1), + selectable=False, + enable_sound=False, + on_activate_call=bui.WeakCall(self._play_sound, 'spazPickup0', 1), ) txtl = bui.Lstr(resource=f'{self._r}.pickUpInfoText') @@ -478,12 +491,16 @@ class HelpWindow(bui.Window): hval2 = h vval2 = v - sep - bui.imagewidget( + bui.buttonwidget( parent=self._subcontainer, + label='', size=(icon_size, icon_size), position=(hval2 - 0.5 * icon_size, vval2 - 0.5 * icon_size), texture=bui.gettexture('buttonJump'), color=(0.4, 1, 0.4), + selectable=False, + enable_sound=False, + on_activate_call=bui.WeakCall(self._play_sound, 'spazJump0', 4), ) txt = bui.Lstr(resource=f'{self._r}.jumpInfoText').evaluate() @@ -639,20 +656,15 @@ class HelpWindow(bui.Window): res_scale=0.5, ) - def _close(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.mainmenu import MainMenuWindow + def _play_sound(self, text: str, num: int) -> None: + bui.getsound(text + str(random.randint(1, num))).play() - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if self._main_menu: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget ) + ) diff --git a/dist/ba_data/python/bauiv1lib/iconpicker.py b/dist/ba_data/python/bauiv1lib/iconpicker.py index 968b9c1..0a9bd4b 100644 --- a/dist/ba_data/python/bauiv1lib/iconpicker.py +++ b/dist/ba_data/python/bauiv1lib/iconpicker.py @@ -14,6 +14,18 @@ if TYPE_CHECKING: from typing import Any, Sequence +class IconPickerDelegate: + """Delegate for character-picker.""" + + def on_icon_picker_pick(self, icon: str) -> None: + """Called when a character is selected.""" + raise NotImplementedError() + + def on_icon_picker_get_more_press(self) -> None: + """Called when the 'get more characters' button is pressed.""" + raise NotImplementedError() + + class IconPicker(PopupWindow): """Picker for icons.""" @@ -21,8 +33,9 @@ class IconPicker(PopupWindow): self, parent: bui.Widget, position: tuple[float, float] = (0.0, 0.0), - delegate: Any = None, + delegate: IconPickerDelegate | None = None, scale: float | None = None, + *, offset: tuple[float, float] = (0.0, 0.0), tint_color: Sequence[float] = (1.0, 1.0, 1.0), tint2_color: Sequence[float] = (1.0, 1.0, 1.0), @@ -158,8 +171,7 @@ class IconPicker(PopupWindow): bui.widget(edit=btn, show_buffer_top=30, show_buffer_bottom=30) def _on_store_press(self) -> None: - from bauiv1lib.account import show_sign_in_prompt - from bauiv1lib.store.browser import StoreBrowserWindow + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None @@ -167,12 +179,11 @@ class IconPicker(PopupWindow): if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return + + if self._delegate is not None: + self._delegate.on_icon_picker_get_more_press() + self._transition_out() - StoreBrowserWindow( - modal=True, - show_tab=StoreBrowserWindow.TabID.ICONS, - origin_widget=self._get_more_icons_button, - ) def _select_icon(self, icon: str) -> None: if self._delegate is not None: diff --git a/dist/ba_data/python/bauiv1lib/inbox.py b/dist/ba_data/python/bauiv1lib/inbox.py new file mode 100644 index 0000000..08dc923 --- /dev/null +++ b/dist/ba_data/python/bauiv1lib/inbox.py @@ -0,0 +1,1129 @@ +# Released under the MIT License. See LICENSE for details. +# +# pylint: disable=too-many-lines +"""Provides a popup window to view achievements.""" + +from __future__ import annotations + +import weakref +from functools import partial +from dataclasses import dataclass +from typing import override, assert_never, TYPE_CHECKING + +from efro.util import strict_partial, pairs_from_flat +from efro.error import CommunicationError +import bacommon.bs +import bauiv1 as bui + +if TYPE_CHECKING: + import datetime + from typing import Callable + + +class _Section: + def get_height(self) -> float: + """Return section height.""" + raise NotImplementedError() + + def get_button_row(self) -> list[bui.Widget]: + """Return rows of selectable controls.""" + return [] + + def emit(self, subcontainer: bui.Widget, y: float) -> None: + """Emit the section.""" + + +class _TextSection(_Section): + + def __init__( + self, + *, + sub_width: float, + text: bui.Lstr | str, + spacing_top: float = 0.0, + spacing_bottom: float = 0.0, + scale: float = 0.6, + color: tuple[float, float, float, float] = (1.0, 1.0, 1.0, 1.0), + ) -> None: + self.sub_width = sub_width + self.spacing_top = spacing_top + self.spacing_bottom = spacing_bottom + self.color = color + + # We need to bake this down since we plug its final size into + # our math. + self.textbaked = text.evaluate() if isinstance(text, bui.Lstr) else text + + # Calc scale to fit width and then see what height we need at + # that scale. + t_width = max( + 10.0, + bui.get_string_width(self.textbaked, suppress_warning=True) * scale, + ) + self.text_scale = scale * min(1.0, (sub_width * 0.9) / t_width) + + self.text_height = ( + 0.0 + if not self.textbaked + else bui.get_string_height(self.textbaked, suppress_warning=True) + ) * self.text_scale + + self.full_height = self.text_height + spacing_top + spacing_bottom + + @override + def get_height(self) -> float: + return self.full_height + + @override + def emit(self, subcontainer: bui.Widget, y: float) -> None: + bui.textwidget( + parent=subcontainer, + position=( + self.sub_width * 0.5, + y - self.spacing_top - self.text_height * 0.5, + ), + color=self.color, + scale=self.text_scale, + flatness=1.0, + shadow=1.0, + text=self.textbaked, + size=(0, 0), + h_align='center', + v_align='center', + ) + + +class _ButtonSection(_Section): + + def __init__( + self, + *, + sub_width: float, + label: bui.Lstr | str, + color: tuple[float, float, float], + label_color: tuple[float, float, float], + call: Callable[[_ButtonSection], None], + spacing_top: float = 0.0, + spacing_bottom: float = 0.0, + ) -> None: + self.sub_width = sub_width + self.spacing_top = spacing_top + self.spacing_bottom = spacing_bottom + self.color = color + self.label_color = label_color + self.button: bui.Widget | None = None + self.call = call + self.labelfin = label + self.button_width = 130 + self.button_height = 30 + self.full_height = self.button_height + spacing_top + spacing_bottom + + @override + def get_height(self) -> float: + return self.full_height + + @staticmethod + def weak_call(section: weakref.ref[_ButtonSection]) -> None: + """Call button section call if section still exists.""" + section_strong = section() + if section_strong is None: + return + + section_strong.call(section_strong) + + @override + def emit(self, subcontainer: bui.Widget, y: float) -> None: + self.button = bui.buttonwidget( + parent=subcontainer, + position=( + self.sub_width * 0.5 - self.button_width * 0.5, + y - self.spacing_top - self.button_height, + ), + autoselect=True, + label=self.labelfin, + textcolor=self.label_color, + text_scale=0.55, + size=(self.button_width, self.button_height), + color=self.color, + on_activate_call=strict_partial(self.weak_call, weakref.ref(self)), + ) + bui.widget(edit=self.button, depth_range=(0.1, 1.0)) + + @override + def get_button_row(self) -> list[bui.Widget]: + """Return rows of selectable controls.""" + assert self.button is not None + return [self.button] + + +class _DisplayItemsSection(_Section): + + def __init__( + self, + *, + sub_width: float, + items: list[bacommon.bs.DisplayItemWrapper], + width: float = 100.0, + spacing_top: float = 0.0, + spacing_bottom: float = 0.0, + ) -> None: + self.display_item_width = width + + # FIXME - ask for this somewhere in case it changes. + self.display_item_height = self.display_item_width * 0.666 + self.items = items + self.sub_width = sub_width + self.spacing_top = spacing_top + self.spacing_bottom = spacing_bottom + self.full_height = ( + self.display_item_height + spacing_top + spacing_bottom + ) + + @override + def get_height(self) -> float: + return self.full_height + + @override + def emit(self, subcontainer: bui.Widget, y: float) -> None: + # pylint: disable=cyclic-import + from baclassic import show_display_item + + xspacing = 1.1 * self.display_item_width + total_width = ( + 0 if not self.items else ((len(self.items) - 1) * xspacing) + ) + x = -0.5 * total_width + for item in self.items: + show_display_item( + item, + subcontainer, + pos=( + self.sub_width * 0.5 + x, + y - self.spacing_top - self.display_item_height * 0.5, + ), + width=self.display_item_width, + ) + x += xspacing + + +class _ExpireTimeSection(_Section): + + def __init__( + self, + *, + sub_width: float, + time: datetime.datetime, + spacing_top: float = 0.0, + spacing_bottom: float = 0.0, + ) -> None: + self.time = time + self.sub_width = sub_width + self.spacing_top = spacing_top + self.spacing_bottom = spacing_bottom + self.color = (1.0, 0.0, 1.0) + self._timer: bui.AppTimer | None = None + self._widget: bui.Widget | None = None + self.text_scale = 0.4 + self.text_height = 30.0 * self.text_scale + self.full_height = self.text_height + spacing_top + spacing_bottom + + @override + def get_height(self) -> float: + return self.full_height + + def _update(self) -> None: + if not self._widget: + return + + now = bui.utc_now_cloud() + + val: bui.Lstr + if now < self.time: + color = (1.0, 1.0, 1.0, 0.3) + val = bui.Lstr( + resource='expiresInText', + subs=[ + ( + '${T}', + bui.timestring( + (self.time - now).total_seconds(), centi=False + ), + ), + ], + ) + else: + color = (1.0, 0.3, 0.3, 0.5) + val = bui.Lstr( + resource='expiredAgoText', + subs=[ + ( + '${T}', + bui.timestring( + (now - self.time).total_seconds(), centi=False + ), + ), + ], + ) + bui.textwidget(edit=self._widget, text=val, color=color) + + @override + def emit(self, subcontainer: bui.Widget, y: float) -> None: + self._widget = bui.textwidget( + parent=subcontainer, + position=( + self.sub_width * 0.5, + y - self.spacing_top - self.text_height * 0.5, + ), + color=self.color, + scale=self.text_scale, + flatness=1.0, + shadow=1.0, + text='', + maxwidth=self.sub_width * 0.7, + size=(0, 0), + h_align='center', + v_align='center', + ) + self._timer = bui.AppTimer(1.0, bui.WeakCall(self._update), repeat=True) + self._update() + + +@dataclass +class _EntryDisplay: + interaction_style: bacommon.bs.BasicClientUI.InteractionStyle + button_label_positive: bacommon.bs.BasicClientUI.ButtonLabel + button_label_negative: bacommon.bs.BasicClientUI.ButtonLabel + sections: list[_Section] + id: str + total_height: float + color: tuple[float, float, float] + backing: bui.Widget | None = None + button_positive: bui.Widget | None = None + button_spinner_positive: bui.Widget | None = None + button_negative: bui.Widget | None = None + button_spinner_negative: bui.Widget | None = None + processing_complete: bool = False + + +class InboxWindow(bui.MainWindow): + """Popup window to show account messages.""" + + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): + + assert bui.app.classic is not None + uiscale = bui.app.ui_v1.uiscale + + self._entry_displays: list[_EntryDisplay] = [] + + self._width = 900 if uiscale is bui.UIScale.SMALL else 500 + self._height = ( + 600 + if uiscale is bui.UIScale.SMALL + else 460 if uiscale is bui.UIScale.MEDIUM else 600 + ) + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.9 + if uiscale is bui.UIScale.SMALL + else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and offset + # by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + scroll_width = target_width + scroll_height = target_height - 31 + scroll_bottom = yoffs - 59 - scroll_height + + super().__init__( + root_widget=bui.containerwidget( + size=(self._width, self._height), + toolbar_visibility=( + 'menu_full' if uiscale is bui.UIScale.SMALL else 'menu_full' + ), + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + self._back_button = None + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + autoselect=True, + position=(50, yoffs - 48), + size=(60, 60), + scale=0.6, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) + + self._title_text = bui.textwidget( + parent=self._root_widget, + position=( + self._width * 0.5, + yoffs - (45 if uiscale is bui.UIScale.SMALL else 30), + ), + size=(0, 0), + h_align='center', + v_align='center', + scale=0.6 if uiscale is bui.UIScale.SMALL else 0.8, + text=bui.Lstr(resource='inboxText'), + maxwidth=200, + color=bui.app.ui_v1.title_color, + ) + + # Shows 'loading', 'no messages', etc. + self._infotext = bui.textwidget( + parent=self._root_widget, + position=(self._width * 0.5, self._height * 0.5), + maxwidth=self._width * 0.7, + scale=0.5, + flatness=1.0, + color=(0.4, 0.4, 0.5), + shadow=0.0, + text='', + size=(0, 0), + h_align='center', + v_align='center', + ) + self._loading_spinner = bui.spinnerwidget( + parent=self._root_widget, + position=(self._width * 0.5, self._height * 0.5), + style='bomb', + size=48, + ) + self._scrollwidget = bui.scrollwidget( + parent=self._root_widget, + size=(scroll_width, scroll_height), + position=(self._width * 0.5 - scroll_width * 0.5, scroll_bottom), + capture_arrows=True, + simple_culling_v=200, + claims_left_right=True, + claims_up_down=True, + center_small_content_horizontally=True, + border_opacity=0.4, + ) + bui.widget(edit=self._scrollwidget, autoselect=True) + if uiscale is bui.UIScale.SMALL: + bui.widget( + edit=self._scrollwidget, + left_widget=bui.get_special_widget('back_button'), + ) + + bui.containerwidget( + edit=self._root_widget, + cancel_button=self._back_button, + single_depth=True, + ) + + # Kick off request. + plus = bui.app.plus + if plus is None or plus.accounts.primary is None: + self._error(bui.Lstr(resource='notSignedInText')) + return + + with plus.accounts.primary: + plus.cloud.send_message_cb( + bacommon.bs.InboxRequestMessage(), + on_response=bui.WeakCall(self._on_inbox_request_response), + ) + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + def _error(self, errmsg: bui.Lstr | str) -> None: + """Put ourself in a permanent error state.""" + bui.spinnerwidget(edit=self._loading_spinner, visible=False) + bui.textwidget( + edit=self._infotext, + color=(1, 0, 0), + text=errmsg, + ) + + def _on_entry_display_press( + self, + display_weak: weakref.ReferenceType[_EntryDisplay], + action: bacommon.bs.ClientUIAction, + ) -> None: + display = display_weak() + if display is None: + return + + bui.getsound('click01').play() + + self._neuter_entry_display(display) + + # We currently only recognize basic entries and their possible + # interaction types. + if ( + display.interaction_style + is bacommon.bs.BasicClientUI.InteractionStyle.UNKNOWN + ): + display.processing_complete = True + self._close_soon_if_all_processed() + return + + # Error if we're somehow signed out now. + plus = bui.app.plus + if plus is None or plus.accounts.primary is None: + bui.screenmessage( + bui.Lstr(resource='notSignedInText'), color=(1, 0, 0) + ) + bui.getsound('error').play() + return + + # Ask the master-server to run our action. + with plus.accounts.primary: + plus.cloud.send_message_cb( + bacommon.bs.ClientUIActionMessage(display.id, action), + on_response=bui.WeakCall( + self._on_client_ui_action_response, + display_weak, + action, + ), + ) + + # Tweak the UI to show that things are in motion. + button = ( + display.button_positive + if action is bacommon.bs.ClientUIAction.BUTTON_PRESS_POSITIVE + else display.button_negative + ) + button_spinner = ( + display.button_spinner_positive + if action is bacommon.bs.ClientUIAction.BUTTON_PRESS_POSITIVE + else display.button_spinner_negative + ) + if button is not None: + bui.buttonwidget(edit=button, label='') + if button_spinner is not None: + bui.spinnerwidget(edit=button_spinner, visible=True) + + def _close_soon_if_all_processed(self) -> None: + bui.apptimer(0.25, bui.WeakCall(self._close_if_all_processed)) + + def _close_if_all_processed(self) -> None: + if not all(m.processing_complete for m in self._entry_displays): + return + + self.main_window_back() + + def _neuter_entry_display(self, entry: _EntryDisplay) -> None: + errsound = bui.getsound('error') + if entry.button_positive is not None: + bui.buttonwidget( + edit=entry.button_positive, + color=(0.5, 0.5, 0.5), + textcolor=(0.4, 0.4, 0.4), + on_activate_call=errsound.play, + ) + if entry.button_negative is not None: + bui.buttonwidget( + edit=entry.button_negative, + color=(0.5, 0.5, 0.5), + textcolor=(0.4, 0.4, 0.4), + on_activate_call=errsound.play, + ) + if entry.backing is not None: + bui.imagewidget(edit=entry.backing, color=(0.4, 0.4, 0.4)) + + def _on_client_ui_action_response( + self, + display_weak: weakref.ReferenceType[_EntryDisplay], + action: bacommon.bs.ClientUIAction, + response: bacommon.bs.ClientUIActionResponse | Exception, + ) -> None: + # pylint: disable=too-many-branches + display = display_weak() + if display is None: + return + + assert not display.processing_complete + display.processing_complete = True + self._close_soon_if_all_processed() + + # No-op if our UI is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + # Tweak the button to show results. + button = ( + display.button_positive + if action is bacommon.bs.ClientUIAction.BUTTON_PRESS_POSITIVE + else display.button_negative + ) + button_spinner = ( + display.button_spinner_positive + if action is bacommon.bs.ClientUIAction.BUTTON_PRESS_POSITIVE + else display.button_spinner_negative + ) + # Always hide spinner at this point. + if button_spinner is not None: + bui.spinnerwidget(edit=button_spinner, visible=False) + + # See if we should show an error message. + if isinstance(response, Exception): + if isinstance(response, CommunicationError): + error_message = bui.Lstr( + resource='internal.unavailableNoConnectionText' + ) + else: + error_message = bui.Lstr(resource='errorText') + elif response.error_type is not None: + # If error_type is set, error should be also. + assert response.error_message is not None + error_message = bui.Lstr( + translate=('serverResponses', response.error_message) + ) + else: + error_message = None + + # Show error message if so. + if error_message is not None: + bui.screenmessage(error_message, color=(1, 0, 0)) + bui.getsound('error').play() + if button is not None: + bui.buttonwidget( + edit=button, label=bui.Lstr(resource='errorText') + ) + return + + # Success! + assert not isinstance(response, Exception) + + # Run any bundled effects. + assert bui.app.classic is not None + bui.app.classic.run_bs_client_effects(response.effects) + + # Whee; no error. Mark as done. + if button is not None: + # If we have full unicode, just show a checkmark in all cases. + label: str | bui.Lstr + if bui.supports_unicode_display(): + label = '✓' + else: + label = bui.Lstr(resource='doneText') + bui.buttonwidget(edit=button, label=label) + + def _on_inbox_request_response( + self, response: bacommon.bs.InboxRequestResponse | Exception + ) -> None: + # pylint: disable=too-many-locals + # pylint: disable=too-many-statements + # pylint: disable=too-many-branches + + # No-op if our UI is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + errmsg: str | bui.Lstr + if isinstance(response, Exception): + errmsg = bui.Lstr(resource='internal.unavailableNoConnectionText') + is_error = True + else: + is_error = response.error is not None + errmsg = ( + '' + if response.error is None + else bui.Lstr(translate=('serverResponses', response.error)) + ) + + if is_error: + self._error(errmsg) + return + + assert isinstance(response, bacommon.bs.InboxRequestResponse) + + # If we got no messages, don't touch anything. This keeps + # keyboard control working in the empty case. + if not response.wrappers: + bui.spinnerwidget(edit=self._loading_spinner, visible=False) + bui.textwidget( + edit=self._infotext, + color=(0.4, 0.4, 0.5), + text=bui.Lstr(resource='noMessagesText'), + ) + return + + bui.scrollwidget(edit=self._scrollwidget, highlight=False) + + bui.spinnerwidget(edit=self._loading_spinner, visible=False) + bui.textwidget(edit=self._infotext, text='') + + uiscale = bui.app.ui_v1.uiscale + + margin_top = 0.0 if uiscale is bui.UIScale.SMALL else 10.0 + margin_v = 0.0 if uiscale is bui.UIScale.SMALL else 5.0 + + # Need this to avoid the dock blocking access to buttons on our + # bottom message. + margin_bottom = 60.0 if uiscale is bui.UIScale.SMALL else 10.0 + + # Even though our window size varies with uiscale, we want + # notifications to target a fixed width. + sub_width = 400.0 + sub_height = margin_top + + # Construct entries for everything we'll display. + for i, wrapper in enumerate(response.wrappers): + + # We need to flatten text here so we can measure it. + # textfin: str + color: tuple[float, float, float] + + interaction_style: bacommon.bs.BasicClientUI.InteractionStyle + button_label_positive: bacommon.bs.BasicClientUI.ButtonLabel + button_label_negative: bacommon.bs.BasicClientUI.ButtonLabel + + sections: list[_Section] = [] + total_height = 80.0 + + # Display only entries where we recognize all style/label + # values and ui component types. + if ( + isinstance(wrapper.ui, bacommon.bs.BasicClientUI) + and not wrapper.ui.contains_unknown_elements() + ): + color = (0.55, 0.5, 0.7) + interaction_style = wrapper.ui.interaction_style + button_label_positive = wrapper.ui.button_label_positive + button_label_negative = wrapper.ui.button_label_negative + + idcls = bacommon.bs.BasicClientUIComponentTypeID + for component in wrapper.ui.components: + ctypeid = component.get_type_id() + section: _Section + + if ctypeid is idcls.TEXT: + assert isinstance( + component, bacommon.bs.BasicClientUIComponentText + ) + section = _TextSection( + sub_width=sub_width, + text=bui.Lstr( + translate=('serverResponses', component.text), + subs=pairs_from_flat(component.subs), + ), + color=component.color, + scale=component.scale, + spacing_top=component.spacing_top, + spacing_bottom=component.spacing_bottom, + ) + total_height += section.get_height() + sections.append(section) + + elif ctypeid is idcls.LINK: + assert isinstance( + component, bacommon.bs.BasicClientUIComponentLink + ) + + def _do_open_url(url: str, sec: _ButtonSection) -> None: + del sec # Unused. + bui.open_url(url) + + section = _ButtonSection( + sub_width=sub_width, + label=bui.Lstr( + translate=('serverResponses', component.label), + subs=pairs_from_flat(component.subs), + ), + color=color, + call=partial(_do_open_url, component.url), + label_color=(0.5, 0.7, 0.6), + spacing_top=component.spacing_top, + spacing_bottom=component.spacing_bottom, + ) + total_height += section.get_height() + sections.append(section) + + elif ctypeid is idcls.DISPLAY_ITEMS: + assert isinstance( + component, + bacommon.bs.BasicClientUIDisplayItems, + ) + section = _DisplayItemsSection( + sub_width=sub_width, + items=component.items, + width=component.width, + spacing_top=component.spacing_top, + spacing_bottom=component.spacing_bottom, + ) + total_height += section.get_height() + sections.append(section) + + elif ctypeid is idcls.BS_CLASSIC_TOURNEY_RESULT: + from bascenev1 import get_trophy_string + + assert isinstance( + component, + bacommon.bs.BasicClientUIBsClassicTourneyResult, + ) + campaignname, levelname = component.game.split(':') + assert bui.app.classic is not None + campaign = bui.app.classic.getcampaign(campaignname) + + tourney_name = bui.Lstr( + value='${A} ${B}', + subs=[ + ( + '${A}', + campaign.getlevel(levelname).displayname, + ), + ( + '${B}', + bui.Lstr( + resource='playerCountAbbreviatedText', + subs=[ + ('${COUNT}', str(component.players)) + ], + ), + ), + ], + ) + + if component.trophy is not None: + trophy_prefix = ( + get_trophy_string(component.trophy) + ' ' + ) + else: + trophy_prefix = '' + + section = _TextSection( + sub_width=sub_width, + text=bui.Lstr( + value='${P}${V}', + subs=[ + ('${P}', trophy_prefix), + ( + '${V}', + bui.Lstr( + translate=( + 'serverResponses', + 'You placed #${RANK}' + ' in a tournament!', + ), + subs=[ + ('${RANK}', str(component.rank)) + ], + ), + ), + ], + ), + color=(1.0, 1.0, 1.0, 1.0), + scale=0.6, + ) + total_height += section.get_height() + sections.append(section) + + section = _TextSection( + sub_width=sub_width, + text=tourney_name, + spacing_top=5, + color=(0.7, 0.7, 1.0, 1.0), + scale=0.7, + ) + total_height += section.get_height() + sections.append(section) + + def _do_tourney_scores( + tournament_id: str, sec: _ButtonSection + ) -> None: + from bauiv1lib.tournamentscores import ( + TournamentScoresWindow, + ) + + assert sec.button is not None + _ = ( + TournamentScoresWindow( + tournament_id=tournament_id, + position=( + sec.button + ).get_screen_space_center(), + ), + ) + + section = _ButtonSection( + sub_width=sub_width, + label=bui.Lstr( + resource='tournamentFinalStandingsText' + ), + color=color, + call=partial( + _do_tourney_scores, component.tournament_id + ), + label_color=(0.5, 0.7, 0.6), + spacing_top=7.0, + spacing_bottom=0.0 if component.prizes else 7.0, + ) + total_height += section.get_height() + sections.append(section) + + if component.prizes: + section = _TextSection( + sub_width=sub_width, + text=bui.Lstr(resource='yourPrizeText'), + spacing_top=6, + color=(1.0, 1.0, 1.0, 0.4), + scale=0.35, + ) + total_height += section.get_height() + sections.append(section) + + section = _DisplayItemsSection( + sub_width=sub_width, + items=component.prizes, + width=70.0, + spacing_top=0.0, + spacing_bottom=0.0, + ) + total_height += section.get_height() + sections.append(section) + + elif ctypeid is idcls.EXPIRE_TIME: + assert isinstance( + component, bacommon.bs.BasicClientUIExpireTime + ) + section = _ExpireTimeSection( + sub_width=sub_width, + time=component.time, + spacing_top=component.spacing_top, + spacing_bottom=component.spacing_bottom, + ) + total_height += section.get_height() + sections.append(section) + + elif ctypeid is idcls.UNKNOWN: + raise RuntimeError('Should not get here.') + + else: + # Make sure we handle all types. + assert_never(ctypeid) + else: + + # Display anything with unknown components as an + # 'upgrade your app to see this' message. + color = (0.6, 0.6, 0.6) + interaction_style = ( + bacommon.bs.BasicClientUI.InteractionStyle.UNKNOWN + ) + button_label_positive = bacommon.bs.BasicClientUI.ButtonLabel.OK + button_label_negative = ( + bacommon.bs.BasicClientUI.ButtonLabel.CANCEL + ) + + section = _TextSection( + sub_width=sub_width, + text=bui.Lstr( + value='You must update the app to view this.' + ), + ) + total_height += section.get_height() + sections.append(section) + + self._entry_displays.append( + _EntryDisplay( + interaction_style=interaction_style, + button_label_positive=button_label_positive, + button_label_negative=button_label_negative, + id=wrapper.id, + sections=sections, + total_height=total_height, + color=color, + ) + ) + sub_height += margin_v + total_height + + sub_height += margin_bottom + + subcontainer = bui.containerwidget( + id='inboxsub', + parent=self._scrollwidget, + size=(sub_width, sub_height), + background=False, + single_depth=True, + claims_left_right=True, + claims_up_down=True, + ) + + backing_tex = bui.gettexture('buttonSquareWide') + + assert bui.app.classic is not None + + buttonrows: list[list[bui.Widget]] = [] + y = sub_height - margin_top + for i, _wrapper in enumerate(response.wrappers): + entry_display = self._entry_displays[i] + entry_display_weak = weakref.ref(entry_display) + bwidth = 140 + bheight = 40 + + ysection = y - 23.0 + + # Backing. + entry_display.backing = img = bui.imagewidget( + parent=subcontainer, + position=( + -0.022 * sub_width, + y - entry_display.total_height * 1.09, + ), + texture=backing_tex, + size=(sub_width * 1.07, entry_display.total_height * 1.15), + color=entry_display.color, + opacity=0.9, + ) + bui.widget(edit=img, depth_range=(0, 0.1)) + + # Section contents. + for sec in entry_display.sections: + sec.emit(subcontainer, ysection) + # Wire up any widgets created by this section. + sec_button_row = sec.get_button_row() + if sec_button_row: + buttonrows.append(sec_button_row) + ysection -= sec.get_height() + + buttonrow: list[bui.Widget] = [] + have_negative_button = ( + entry_display.interaction_style + is ( + bacommon.bs.BasicClientUI + ).InteractionStyle.BUTTON_POSITIVE_NEGATIVE + ) + + bpos = ( + ( + (sub_width - bwidth - 25) + if have_negative_button + else ((sub_width - bwidth) * 0.5) + ), + y - entry_display.total_height + 15.0, + ) + entry_display.button_positive = btn = bui.buttonwidget( + parent=subcontainer, + position=bpos, + autoselect=True, + size=(bwidth, bheight), + label=bui.app.classic.basic_client_ui_button_label_str( + entry_display.button_label_positive + ), + color=entry_display.color, + textcolor=(0, 1, 0), + on_activate_call=bui.WeakCall( + self._on_entry_display_press, + entry_display_weak, + bacommon.bs.ClientUIAction.BUTTON_PRESS_POSITIVE, + ), + enable_sound=False, + ) + bui.widget(edit=btn, depth_range=(0.1, 1.0)) + buttonrow.append(btn) + spinner = entry_display.button_spinner_positive = bui.spinnerwidget( + parent=subcontainer, + position=( + bpos[0] + 0.5 * bwidth, + bpos[1] + 0.5 * bheight, + ), + visible=False, + ) + bui.widget(edit=spinner, depth_range=(0.1, 1.0)) + + if have_negative_button: + bpos = (25, y - entry_display.total_height + 15.0) + entry_display.button_negative = btn2 = bui.buttonwidget( + parent=subcontainer, + position=bpos, + autoselect=True, + size=(bwidth, bheight), + label=bui.app.classic.basic_client_ui_button_label_str( + entry_display.button_label_negative + ), + color=(0.85, 0.5, 0.7), + textcolor=(1, 0.4, 0.4), + on_activate_call=bui.WeakCall( + self._on_entry_display_press, + entry_display_weak, + (bacommon.bs.ClientUIAction).BUTTON_PRESS_NEGATIVE, + ), + enable_sound=False, + ) + bui.widget(edit=btn2, depth_range=(0.1, 1.0)) + buttonrow.append(btn2) + spinner = entry_display.button_spinner_negative = ( + bui.spinnerwidget( + parent=subcontainer, + position=( + bpos[0] + 0.5 * bwidth, + bpos[1] + 0.5 * bheight, + ), + visible=False, + ) + ) + bui.widget(edit=spinner, depth_range=(0.1, 1.0)) + + buttonrows.append(buttonrow) + + y -= margin_v + entry_display.total_height + + uiscale = bui.app.ui_v1.uiscale + above_widget = ( + bui.get_special_widget('back_button') + if uiscale is bui.UIScale.SMALL + else self._back_button + ) + assert above_widget is not None + for i, buttons in enumerate(buttonrows): + if i < len(buttonrows) - 1: + below_widget = buttonrows[i + 1][0] + else: + below_widget = None + + assert buttons # We should never have an empty row. + for j, button in enumerate(buttons): + bui.widget( + edit=button, + up_widget=above_widget, + down_widget=below_widget, + # down_widget=( + # button if below_widget is None else below_widget + # ), + right_widget=buttons[max(j - 1, 0)], + left_widget=buttons[min(j + 1, len(buttons) - 1)], + ) + + above_widget = buttons[0] + + +def _get_bs_classic_tourney_results_sections() -> list[_Section]: + return [] diff --git a/dist/ba_data/python/bauiv1lib/ingamemenu.py b/dist/ba_data/python/bauiv1lib/ingamemenu.py new file mode 100644 index 0000000..2dd7354 --- /dev/null +++ b/dist/ba_data/python/bauiv1lib/ingamemenu.py @@ -0,0 +1,592 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Implements the in-gmae menu window.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, override +import logging + +import bauiv1 as bui +import bascenev1 as bs + +if TYPE_CHECKING: + from typing import Any, Callable + + +class InGameMenuWindow(bui.MainWindow): + """The menu that can be invoked while in a game.""" + + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): + + # Make a vanilla container; we'll modify it to our needs in + # refresh. + super().__init__( + root_widget=bui.containerwidget( + toolbar_visibility=('menu_in_game') + ), + transition=transition, + origin_widget=origin_widget, + ) + + # Grab this stuff in case it changes. + self._is_demo = bui.app.env.demo + self._is_arcade = bui.app.env.arcade + + self._p_index = 0 + self._use_autoselect = True + self._button_width = 200.0 + self._button_height = 45.0 + self._width = 100.0 + self._height = 100.0 + + self._refresh() + + @override + def get_main_window_state(self) -> bui.MainWindowState: + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + def _refresh(self) -> None: + + # Clear everything that was there. + children = self._root_widget.get_children() + for child in children: + child.delete() + + self._r = 'mainMenu' + + self._input_device = input_device = bs.get_ui_input_device() + + # Are we connected to a local player? + self._input_player = input_device.player if input_device else None + + # Are we connected to a remote player?. + self._connected_to_remote_player = ( + input_device.is_attached_to_player() + if (input_device and self._input_player is None) + else False + ) + + positions: list[tuple[float, float, float]] = [] + self._p_index = 0 + + self._refresh_in_game(positions) + + h, v, scale = positions[self._p_index] + self._p_index += 1 + + # If we're in a replay, we have a 'Leave Replay' button. + if bs.is_in_replay(): + bui.buttonwidget( + parent=self._root_widget, + position=(h - self._button_width * 0.5 * scale, v), + scale=scale, + size=(self._button_width, self._button_height), + autoselect=self._use_autoselect, + label=bui.Lstr(resource='replayEndText'), + on_activate_call=self._confirm_end_replay, + ) + elif bs.get_foreground_host_session() is not None: + bui.buttonwidget( + parent=self._root_widget, + position=(h - self._button_width * 0.5 * scale, v), + scale=scale, + size=(self._button_width, self._button_height), + autoselect=self._use_autoselect, + label=bui.Lstr( + resource=self._r + + ( + '.endTestText' + if self._is_benchmark() + else '.endGameText' + ) + ), + on_activate_call=( + self._confirm_end_test + if self._is_benchmark() + else self._confirm_end_game + ), + ) + else: + # Assume we're in a client-session. + bui.buttonwidget( + parent=self._root_widget, + position=(h - self._button_width * 0.5 * scale, v), + scale=scale, + size=(self._button_width, self._button_height), + autoselect=self._use_autoselect, + label=bui.Lstr(resource=f'{self._r}.leavePartyText'), + on_activate_call=self._confirm_leave_party, + ) + + # Add speed-up/slow-down buttons for replays. Ideally this + # should be part of a fading-out playback bar like most media + # players but this works for now. + if bs.is_in_replay(): + b_size = 50.0 + b_buffer_1 = 50.0 + b_buffer_2 = 10.0 + t_scale = 0.75 + assert bui.app.classic is not None + uiscale = bui.app.ui_v1.uiscale + if uiscale is bui.UIScale.SMALL: + b_size *= 0.6 + b_buffer_1 *= 0.8 + b_buffer_2 *= 1.0 + v_offs = -40 + t_scale = 0.5 + elif uiscale is bui.UIScale.MEDIUM: + v_offs = -70 + else: + v_offs = -100 + self._replay_speed_text = bui.textwidget( + parent=self._root_widget, + text=bui.Lstr( + resource='watchWindow.playbackSpeedText', + subs=[('${SPEED}', str(1.23))], + ), + position=(h, v + v_offs + 15 * t_scale), + h_align='center', + v_align='center', + size=(0, 0), + scale=t_scale, + ) + + # Update to current value. + self._change_replay_speed(0) + + # Keep updating in a timer in case it gets changed elsewhere. + self._change_replay_speed_timer = bui.AppTimer( + 0.25, bui.WeakCall(self._change_replay_speed, 0), repeat=True + ) + btn = bui.buttonwidget( + parent=self._root_widget, + position=( + h - b_size - b_buffer_1, + v - b_size - b_buffer_2 + v_offs, + ), + button_type='square', + size=(b_size, b_size), + label='', + autoselect=True, + on_activate_call=bui.Call(self._change_replay_speed, -1), + ) + bui.textwidget( + parent=self._root_widget, + draw_controller=btn, + text='-', + position=( + h - b_size * 0.5 - b_buffer_1, + v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, + ), + h_align='center', + v_align='center', + size=(0, 0), + scale=3.0 * t_scale, + ) + btn = bui.buttonwidget( + parent=self._root_widget, + position=(h + b_buffer_1, v - b_size - b_buffer_2 + v_offs), + button_type='square', + size=(b_size, b_size), + label='', + autoselect=True, + on_activate_call=bui.Call(self._change_replay_speed, 1), + ) + bui.textwidget( + parent=self._root_widget, + draw_controller=btn, + text='+', + position=( + h + b_size * 0.5 + b_buffer_1, + v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, + ), + h_align='center', + v_align='center', + size=(0, 0), + scale=3.0 * t_scale, + ) + self._pause_resume_button = btn = bui.buttonwidget( + parent=self._root_widget, + position=(h - b_size * 0.5, v - b_size - b_buffer_2 + v_offs), + button_type='square', + size=(b_size, b_size), + label=bui.charstr( + bui.SpecialChar.PLAY_BUTTON + if bs.is_replay_paused() + else bui.SpecialChar.PAUSE_BUTTON + ), + autoselect=True, + on_activate_call=bui.Call(self._pause_or_resume_replay), + ) + btn = bui.buttonwidget( + parent=self._root_widget, + position=( + h - b_size * 1.5 - b_buffer_1 * 2, + v - b_size - b_buffer_2 + v_offs, + ), + button_type='square', + size=(b_size, b_size), + label='', + autoselect=True, + on_activate_call=bui.WeakCall(self._rewind_replay), + ) + bui.textwidget( + parent=self._root_widget, + draw_controller=btn, + # text='<<', + text=bui.charstr(bui.SpecialChar.REWIND_BUTTON), + position=( + h - b_size - b_buffer_1 * 2, + v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, + ), + h_align='center', + v_align='center', + size=(0, 0), + scale=2.0 * t_scale, + ) + btn = bui.buttonwidget( + parent=self._root_widget, + position=( + h + b_size * 0.5 + b_buffer_1 * 2, + v - b_size - b_buffer_2 + v_offs, + ), + button_type='square', + size=(b_size, b_size), + label='', + autoselect=True, + on_activate_call=bui.WeakCall(self._forward_replay), + ) + bui.textwidget( + parent=self._root_widget, + draw_controller=btn, + # text='>>', + text=bui.charstr(bui.SpecialChar.FAST_FORWARD_BUTTON), + position=( + h + b_size + b_buffer_1 * 2, + v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, + ), + h_align='center', + v_align='center', + size=(0, 0), + scale=2.0 * t_scale, + ) + + def _rewind_replay(self) -> None: + bs.seek_replay(-2 * pow(2, bs.get_replay_speed_exponent())) + + def _forward_replay(self) -> None: + bs.seek_replay(2 * pow(2, bs.get_replay_speed_exponent())) + + def _refresh_in_game( + self, positions: list[tuple[float, float, float]] + ) -> tuple[float, float, float]: + # pylint: disable=too-many-branches + # pylint: disable=too-many-locals + # pylint: disable=too-many-statements + assert bui.app.classic is not None + custom_menu_entries: list[dict[str, Any]] = [] + session = bs.get_foreground_host_session() + if session is not None: + try: + custom_menu_entries = session.get_custom_menu_entries() + for cme in custom_menu_entries: + cme_any: Any = cme # Type check may not hold true. + if ( + not isinstance(cme_any, dict) + or 'label' not in cme + or not isinstance(cme['label'], (str, bui.Lstr)) + or 'call' not in cme + or not callable(cme['call']) + ): + raise ValueError( + 'invalid custom menu entry: ' + str(cme) + ) + except Exception: + custom_menu_entries = [] + logging.exception( + 'Error getting custom menu entries for %s.', session + ) + self._width = 250.0 + self._height = 250.0 if self._input_player else 180.0 + if (self._is_demo or self._is_arcade) and self._input_player: + self._height -= 40 + # if not self._have_settings_button: + self._height -= 50 + if self._connected_to_remote_player: + # In this case we have a leave *and* a disconnect button. + self._height += 50 + self._height += 50 * (len(custom_menu_entries)) + uiscale = bui.app.ui_v1.uiscale + bui.containerwidget( + edit=self._root_widget, + size=(self._width, self._height), + scale=( + 2.15 + if uiscale is bui.UIScale.SMALL + else 1.6 if uiscale is bui.UIScale.MEDIUM else 1.0 + ), + ) + h = 125.0 + v = self._height - 80.0 if self._input_player else self._height - 60 + h_offset = 0 + d_h_offset = 0 + v_offset = -50 + for _i in range(6 + len(custom_menu_entries)): + positions.append((h, v, 1.0)) + v += v_offset + h += h_offset + h_offset += d_h_offset + # self._play_button = None + bui.app.classic.pause() + + # Player name if applicable. + if self._input_player: + player_name = self._input_player.getname() + h, v, scale = positions[self._p_index] + v += 35 + bui.textwidget( + parent=self._root_widget, + position=(h - self._button_width / 2, v), + size=(self._button_width, self._button_height), + color=(1, 1, 1, 0.5), + scale=0.7, + h_align='center', + text=bui.Lstr(value=player_name), + ) + else: + player_name = '' + h, v, scale = positions[self._p_index] + self._p_index += 1 + btn = bui.buttonwidget( + parent=self._root_widget, + position=(h - self._button_width / 2, v), + size=(self._button_width, self._button_height), + scale=scale, + label=bui.Lstr(resource=f'{self._r}.resumeText'), + autoselect=self._use_autoselect, + on_activate_call=self._resume, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + + # Add any custom options defined by the current game. + for entry in custom_menu_entries: + h, v, scale = positions[self._p_index] + self._p_index += 1 + + # Ask the entry whether we should resume when we call + # it (defaults to true). + resume = bool(entry.get('resume_on_call', True)) + + if resume: + call = bui.Call(self._resume_and_call, entry['call']) + else: + call = bui.Call(entry['call'], bui.WeakCall(self._resume)) + + bui.buttonwidget( + parent=self._root_widget, + position=(h - self._button_width / 2, v), + size=(self._button_width, self._button_height), + scale=scale, + on_activate_call=call, + label=entry['label'], + autoselect=self._use_autoselect, + ) + + # Add a 'leave' button if the menu-owner has a player. + if (self._input_player or self._connected_to_remote_player) and not ( + self._is_demo or self._is_arcade + ): + h, v, scale = positions[self._p_index] + self._p_index += 1 + btn = bui.buttonwidget( + parent=self._root_widget, + position=(h - self._button_width / 2, v), + size=(self._button_width, self._button_height), + scale=scale, + on_activate_call=self._leave, + label='', + autoselect=self._use_autoselect, + ) + + if ( + player_name != '' + and player_name[0] != '<' + and player_name[-1] != '>' + ): + txt = bui.Lstr( + resource=f'{self._r}.justPlayerText', + subs=[('${NAME}', player_name)], + ) + else: + txt = bui.Lstr(value=player_name) + bui.textwidget( + parent=self._root_widget, + position=( + h, + v + + self._button_height + * (0.64 if player_name != '' else 0.5), + ), + size=(0, 0), + text=bui.Lstr(resource=f'{self._r}.leaveGameText'), + scale=(0.83 if player_name != '' else 1.0), + color=(0.75, 1.0, 0.7), + h_align='center', + v_align='center', + draw_controller=btn, + maxwidth=self._button_width * 0.9, + ) + bui.textwidget( + parent=self._root_widget, + position=(h, v + self._button_height * 0.27), + size=(0, 0), + text=txt, + color=(0.75, 1.0, 0.7), + h_align='center', + v_align='center', + draw_controller=btn, + scale=0.45, + maxwidth=self._button_width * 0.9, + ) + return h, v, scale + + def _change_replay_speed(self, offs: int) -> None: + if not self._replay_speed_text: + if bui.do_once(): + print('_change_replay_speed called without widget') + return + bs.set_replay_speed_exponent(bs.get_replay_speed_exponent() + offs) + actual_speed = pow(2.0, bs.get_replay_speed_exponent()) + bui.textwidget( + edit=self._replay_speed_text, + text=bui.Lstr( + resource='watchWindow.playbackSpeedText', + subs=[('${SPEED}', str(actual_speed))], + ), + ) + + def _pause_or_resume_replay(self) -> None: + if bs.is_replay_paused(): + bs.resume_replay() + bui.buttonwidget( + edit=self._pause_resume_button, + label=bui.charstr(bui.SpecialChar.PAUSE_BUTTON), + ) + else: + bs.pause_replay() + bui.buttonwidget( + edit=self._pause_resume_button, + label=bui.charstr(bui.SpecialChar.PLAY_BUTTON), + ) + + def _is_benchmark(self) -> bool: + session = bs.get_foreground_host_session() + return getattr(session, 'benchmark_type', None) == 'cpu' or ( + bui.app.classic is not None + and bui.app.classic.stress_test_update_timer is not None + ) + + def _confirm_end_game(self) -> None: + # pylint: disable=cyclic-import + from bauiv1lib.confirm import ConfirmWindow + + # FIXME: Currently we crash calling this on client-sessions. + + # Select cancel by default; this occasionally gets called by accident + # in a fit of button mashing and this will help reduce damage. + ConfirmWindow( + bui.Lstr(resource=f'{self._r}.exitToMenuText'), + self._end_game, + cancel_is_selected=True, + ) + + def _confirm_end_test(self) -> None: + # pylint: disable=cyclic-import + from bauiv1lib.confirm import ConfirmWindow + + # Select cancel by default; this occasionally gets called by accident + # in a fit of button mashing and this will help reduce damage. + ConfirmWindow( + bui.Lstr(resource=f'{self._r}.exitToMenuText'), + self._end_game, + cancel_is_selected=True, + ) + + def _confirm_end_replay(self) -> None: + # pylint: disable=cyclic-import + from bauiv1lib.confirm import ConfirmWindow + + # Select cancel by default; this occasionally gets called by accident + # in a fit of button mashing and this will help reduce damage. + ConfirmWindow( + bui.Lstr(resource=f'{self._r}.exitToMenuText'), + self._end_game, + cancel_is_selected=True, + ) + + def _confirm_leave_party(self) -> None: + # pylint: disable=cyclic-import + from bauiv1lib.confirm import ConfirmWindow + + # Select cancel by default; this occasionally gets called by accident + # in a fit of button mashing and this will help reduce damage. + ConfirmWindow( + bui.Lstr(resource=f'{self._r}.leavePartyConfirmText'), + self._leave_party, + cancel_is_selected=True, + ) + + def _leave_party(self) -> None: + bs.disconnect_from_host() + + def _end_game(self) -> None: + assert bui.app.classic is not None + + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + bui.containerwidget(edit=self._root_widget, transition='out_left') + bui.app.classic.return_to_main_menu_session_gracefully(reset_ui=False) + + def _leave(self) -> None: + if self._input_player: + self._input_player.remove_from_game() + elif self._connected_to_remote_player: + if self._input_device: + self._input_device.detach_from_player() + self._resume() + + def _resume_and_call(self, call: Callable[[], Any]) -> None: + self._resume() + call() + + def _resume(self) -> None: + classic = bui.app.classic + + assert classic is not None + classic.resume() + + bui.app.ui_v1.clear_main_window() + + # If there's callbacks waiting for us to resume, call them. + for call in classic.main_menu_resume_callbacks: + try: + call() + except Exception: + logging.exception('Error in classic resume callback.') + + classic.main_menu_resume_callbacks.clear() + + # def __del__(self) -> None: + # self._resume() diff --git a/dist/ba_data/python/bauiv1lib/inventory.py b/dist/ba_data/python/bauiv1lib/inventory.py new file mode 100644 index 0000000..f2904cf --- /dev/null +++ b/dist/ba_data/python/bauiv1lib/inventory.py @@ -0,0 +1,143 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Provides help related ui.""" + +from __future__ import annotations + +from typing import override + +import bauiv1 as bui + + +class InventoryWindow(bui.MainWindow): + """Shows what you got.""" + + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): + + bui.set_analytics_screen('Help Window') + + assert bui.app.classic is not None + uiscale = bui.app.ui_v1.uiscale + self._width = 1400 if uiscale is bui.UIScale.SMALL else 750 + self._height = ( + 1200 + if uiscale is bui.UIScale.SMALL + else 530 if uiscale is bui.UIScale.MEDIUM else 600 + ) + # xoffs = 70 if uiscale is bui.UIScale.SMALL else 0 + # yoffs = -45 if uiscale is bui.UIScale.SMALL else 0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.55 + if uiscale is bui.UIScale.SMALL + else 1.15 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 100, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + super().__init__( + root_widget=bui.containerwidget( + size=(self._width, self._height), + toolbar_visibility=( + 'menu_full' if uiscale is bui.UIScale.SMALL else 'menu_full' + ), + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + bui.textwidget( + parent=self._root_widget, + position=( + self._width * 0.5, + yoffs - (50 if uiscale is bui.UIScale.SMALL else 30), + ), + size=(0, 0), + text=bui.Lstr(resource='inventoryText'), + color=bui.app.ui_v1.title_color, + scale=0.9 if uiscale is bui.UIScale.SMALL else 1.0, + maxwidth=(130 if uiscale is bui.UIScale.SMALL else 200), + h_align='center', + v_align='center', + ) + + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + btn = bui.buttonwidget( + parent=self._root_widget, + position=(50, yoffs - 50), + size=(60, 55), + scale=0.8, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + extra_touch_border_scale=2.0, + autoselect=True, + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + + button_width = 300 + self._player_profiles_button = btn = bui.buttonwidget( + parent=self._root_widget, + position=(self._width * 0.5 - button_width * 0.5, yoffs - 200), + autoselect=True, + size=(button_width, 60), + label=bui.Lstr(resource='playerProfilesWindow.titleText'), + color=(0.55, 0.5, 0.6), + icon=bui.gettexture('cuteSpaz'), + textcolor=(0.75, 0.7, 0.8), + on_activate_call=self._player_profiles_press, + ) + bui.textwidget( + parent=self._root_widget, + position=(self._width * 0.5, yoffs - 250), + size=(0, 0), + text=bui.Lstr(resource='moreSoonText'), + scale=0.7, + maxwidth=self._width * 0.9, + h_align='center', + v_align='center', + ) + + def _player_profiles_press(self) -> None: + # pylint: disable=cyclic-import + from bauiv1lib.profile.browser import ProfileBrowserWindow + + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + self.main_window_replace( + ProfileBrowserWindow(origin_widget=self._player_profiles_button) + ) + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) diff --git a/dist/ba_data/python/bauiv1lib/keyboard/englishkeyboard.py b/dist/ba_data/python/bauiv1lib/keyboard/englishkeyboard.py index 3de74f8..e8b6507 100644 --- a/dist/ba_data/python/bauiv1lib/keyboard/englishkeyboard.py +++ b/dist/ba_data/python/bauiv1lib/keyboard/englishkeyboard.py @@ -2,7 +2,7 @@ # """Defines a default keyboards.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_data/python/bauiv1lib/kiosk.py b/dist/ba_data/python/bauiv1lib/kiosk.py index 4647563..c3814cd 100644 --- a/dist/ba_data/python/bauiv1lib/kiosk.py +++ b/dist/ba_data/python/bauiv1lib/kiosk.py @@ -4,14 +4,20 @@ from __future__ import annotations +from typing import override + import bascenev1 as bs import bauiv1 as bui -class KioskWindow(bui.Window): +class KioskWindow(bui.MainWindow): """Kiosk mode window.""" - def __init__(self, transition: str = 'in_right'): + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): # pylint: disable=too-many-locals, too-many-statements from bauiv1lib.confirm import QuitWindow @@ -26,11 +32,13 @@ class KioskWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition=transition, + # transition=transition, on_cancel_call=_do_cancel, background=False, stack_offset=(0, -130), - ) + ), + transition=transition, + origin_widget=origin_widget, ) self._r = 'kioskWindow' @@ -353,6 +361,20 @@ class KioskWindow(bui.Window): 1.0, bui.WeakCall(self._update), repeat=True ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _restore_state(self) -> None: assert bui.app.classic is not None sel_name = bui.app.ui_v1.window_states.get(type(self)) @@ -501,17 +523,16 @@ class KioskWindow(bui.Window): bui.containerwidget(edit=self._root_widget, transition='out_left') def _do_full_menu(self) -> None: + # pylint: disable=cyclic-import from bauiv1lib.mainmenu import MainMenuWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return assert bui.app.classic is not None self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') bui.app.classic.did_menu_intro = True # prevent delayed transition-in - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow().get_root_widget(), from_window=self._root_widget - ) + + self.main_window_replace(MainMenuWindow()) diff --git a/dist/ba_data/python/bauiv1lib/league/rankbutton.py b/dist/ba_data/python/bauiv1lib/league/rankbutton.py deleted file mode 100644 index d952827..0000000 --- a/dist/ba_data/python/bauiv1lib/league/rankbutton.py +++ /dev/null @@ -1,422 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""Provides a button showing league rank.""" - -from __future__ import annotations - -import logging -from typing import TYPE_CHECKING - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any, Callable - - -class LeagueRankButton: - """Button showing league rank.""" - - def __init__( - self, - parent: bui.Widget, - position: tuple[float, float], - size: tuple[float, float], - scale: float, - on_activate_call: Callable[[], Any] | None = None, - transition_delay: float | None = None, - color: tuple[float, float, float] | None = None, - textcolor: tuple[float, float, float] | None = None, - smooth_update_delay: float | None = None, - ): - if on_activate_call is None: - on_activate_call = bui.WeakCall(self._default_on_activate_call) - self._on_activate_call = on_activate_call - if smooth_update_delay is None: - smooth_update_delay = 1.0 - self._smooth_update_delay = smooth_update_delay - self._size = size - self._scale = scale - if color is None: - color = (0.5, 0.6, 0.5) - if textcolor is None: - textcolor = (1, 1, 1) - self._color = color - self._textcolor = textcolor - self._header_color = (0.8, 0.8, 2.0) - self._parent = parent - self._position: tuple[float, float] = (0.0, 0.0) - - self._button = bui.buttonwidget( - parent=parent, - size=size, - label='', - button_type='square', - scale=scale, - autoselect=True, - on_activate_call=self._on_activate, - transition_delay=transition_delay, - color=color, - ) - - self._title_text = bui.textwidget( - parent=parent, - size=(0, 0), - draw_controller=self._button, - h_align='center', - v_align='center', - maxwidth=size[0] * scale * 0.85, - text=bui.Lstr( - resource='league.leagueRankText', - fallback_resource='coopSelectWindow.powerRankingText', - ), - color=self._header_color, - flatness=1.0, - shadow=1.0, - scale=scale * 0.5, - transition_delay=transition_delay, - ) - - self._value_text = bui.textwidget( - parent=parent, - size=(0, 0), - h_align='center', - v_align='center', - maxwidth=size[0] * scale * 0.85, - text='-', - draw_controller=self._button, - big=True, - scale=scale, - transition_delay=transition_delay, - color=textcolor, - ) - - plus = bui.app.plus - assert plus is not None - - self._smooth_percent: float | None = None - self._percent: int | None = None - self._smooth_rank: float | None = None - self._rank: int | None = None - self._ticking_sound: bui.Sound | None = None - self._smooth_increase_speed = 1.0 - self._league: str | None = None - self._improvement_text: str | None = None - - self._smooth_update_timer: bui.AppTimer | None = None - - # Take note of our account state; we'll refresh later if this changes. - self._account_state_num = plus.get_v1_account_state_num() - self._last_power_ranking_query_time: float | None = None - self._doing_power_ranking_query = False - self.set_position(position) - self._bg_flash = False - self._update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update), repeat=True - ) - self._update() - - # If we've got cached power-ranking data already, apply it. - assert bui.app.classic is not None - data = bui.app.classic.accounts.get_cached_league_rank_data() - if data is not None: - self._update_for_league_rank_data(data) - - def _on_activate(self) -> None: - bui.increment_analytics_count('League rank button press') - self._on_activate_call() - - def __del__(self) -> None: - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - - def _start_smooth_update(self) -> None: - self._smooth_update_timer = bui.AppTimer( - 0.05, bui.WeakCall(self._smooth_update), repeat=True - ) - - def _smooth_update(self) -> None: - # pylint: disable=too-many-branches - # pylint: disable=too-many-statements - try: - if not self._button: - return - if self._ticking_sound is None: - self._ticking_sound = bui.getsound('scoreIncrease') - self._ticking_sound.play() - self._bg_flash = not self._bg_flash - color_used = ( - (self._color[0] * 2, self._color[1] * 2, self._color[2] * 2) - if self._bg_flash - else self._color - ) - textcolor_used = (1, 1, 1) if self._bg_flash else self._textcolor - header_color_used = ( - (1, 1, 1) if self._bg_flash else self._header_color - ) - - if self._rank is not None: - assert self._smooth_rank is not None - self._smooth_rank -= 1.0 * self._smooth_increase_speed - finished = int(self._smooth_rank) <= self._rank - elif self._smooth_percent is not None: - self._smooth_percent += 1.0 * self._smooth_increase_speed - assert self._percent is not None - finished = int(self._smooth_percent) >= self._percent - else: - finished = True - if finished: - if self._rank is not None: - self._smooth_rank = float(self._rank) - elif self._percent is not None: - self._smooth_percent = float(self._percent) - color_used = self._color - textcolor_used = self._textcolor - self._smooth_update_timer = None - if self._ticking_sound is not None: - self._ticking_sound.stop() - self._ticking_sound = None - bui.getsound('cashRegister2').play() - assert self._improvement_text is not None - diff_text = bui.textwidget( - parent=self._parent, - size=(0, 0), - h_align='center', - v_align='center', - text='+' + self._improvement_text + '!', - position=( - self._position[0] + self._size[0] * 0.5 * self._scale, - self._position[1] + self._size[1] * -0.2 * self._scale, - ), - color=(0, 1, 0), - flatness=1.0, - shadow=0.0, - scale=self._scale * 0.7, - ) - - def safe_delete(widget: bui.Widget) -> None: - if widget: - widget.delete() - - bui.apptimer(2.0, bui.Call(safe_delete, diff_text)) - status_text: str | bui.Lstr - if self._rank is not None: - assert self._smooth_rank is not None - status_text = bui.Lstr( - resource='numberText', - subs=[('${NUMBER}', str(int(self._smooth_rank)))], - ) - elif self._smooth_percent is not None: - status_text = str(int(self._smooth_percent)) + '%' - else: - status_text = '-' - bui.textwidget( - edit=self._value_text, text=status_text, color=textcolor_used - ) - bui.textwidget(edit=self._title_text, color=header_color_used) - bui.buttonwidget(edit=self._button, color=color_used) - - except Exception: - logging.exception('Error doing smooth update.') - self._smooth_update_timer = None - - def _update_for_league_rank_data(self, data: dict[str, Any] | None) -> None: - # pylint: disable=too-many-branches - # pylint: disable=too-many-statements - - plus = bui.app.plus - assert plus is not None - - # If our button has died, ignore. - if not self._button: - return - - status_text: str | bui.Lstr - - in_top = data is not None and data['rank'] is not None - do_percent = False - if data is None or plus.get_v1_account_state() != 'signed_in': - self._percent = self._rank = None - status_text = '-' - elif in_top: - self._percent = None - self._rank = data['rank'] - prev_league = self._league - self._league = data['l'] - - # If this is the first set, league has changed, or rank has gotten - # worse, snap the smooth value immediately. - assert self._rank is not None - if ( - self._smooth_rank is None - or prev_league != self._league - or self._rank > int(self._smooth_rank) - ): - self._smooth_rank = float(self._rank) - status_text = bui.Lstr( - resource='numberText', - subs=[('${NUMBER}', str(int(self._smooth_rank)))], - ) - else: - try: - if not data['scores'] or data['scores'][-1][1] <= 0: - self._percent = self._rank = None - status_text = '-' - else: - assert bui.app.classic is not None - our_points = ( - bui.app.classic.accounts.get_league_rank_points(data) - ) - progress = float(our_points) / data['scores'][-1][1] - self._percent = int(progress * 100.0) - self._rank = None - do_percent = True - prev_league = self._league - self._league = data['l'] - - # If this is the first set, league has changed, or percent - # has decreased, snap the smooth value immediately. - if ( - self._smooth_percent is None - or prev_league != self._league - or self._percent < int(self._smooth_percent) - ): - self._smooth_percent = float(self._percent) - status_text = str(int(self._smooth_percent)) + '%' - - except Exception: - logging.exception('Error updating power ranking.') - self._percent = self._rank = None - status_text = '-' - - # If we're doing a smooth update, set a timer. - if ( - self._rank is not None - and self._smooth_rank is not None - and int(self._smooth_rank) != self._rank - ): - self._improvement_text = str( - -(int(self._rank) - int(self._smooth_rank)) - ) - diff = abs(self._rank - self._smooth_rank) - if diff > 100: - self._smooth_increase_speed = diff / 80.0 - elif diff > 50: - self._smooth_increase_speed = diff / 70.0 - elif diff > 25: - self._smooth_increase_speed = diff / 55.0 - else: - self._smooth_increase_speed = diff / 40.0 - self._smooth_increase_speed = max(0.4, self._smooth_increase_speed) - bui.apptimer( - self._smooth_update_delay, - bui.WeakCall(self._start_smooth_update), - ) - - if ( - self._percent is not None - and self._smooth_percent is not None - and int(self._smooth_percent) != self._percent - ): - self._improvement_text = str( - (int(self._percent) - int(self._smooth_percent)) - ) - self._smooth_increase_speed = 0.3 - bui.apptimer( - self._smooth_update_delay, - bui.WeakCall(self._start_smooth_update), - ) - - if do_percent: - bui.textwidget( - edit=self._title_text, - text=bui.Lstr(resource='coopSelectWindow.toRankedText'), - ) - else: - try: - assert data is not None - txt = bui.Lstr( - resource='league.leagueFullText', - subs=[ - ( - '${NAME}', - bui.Lstr(translate=('leagueNames', data['l']['n'])), - ), - ], - ) - t_color = data['l']['c'] - except Exception: - txt = bui.Lstr( - resource='league.leagueRankText', - fallback_resource='coopSelectWindow.powerRankingText', - ) - assert bui.app.classic is not None - t_color = bui.app.ui_v1.title_color - bui.textwidget(edit=self._title_text, text=txt, color=t_color) - bui.textwidget(edit=self._value_text, text=status_text) - - def _on_power_ranking_query_response( - self, data: dict[str, Any] | None - ) -> None: - self._doing_power_ranking_query = False - assert bui.app.classic is not None - bui.app.classic.accounts.cache_league_rank_data(data) - self._update_for_league_rank_data(data) - - def _update(self) -> None: - cur_time = bui.apptime() - - plus = bui.app.plus - assert plus is not None - - # If our account state has changed, refresh our UI. - account_state_num = plus.get_v1_account_state_num() - if account_state_num != self._account_state_num: - self._account_state_num = account_state_num - - # And power ranking too... - if not self._doing_power_ranking_query: - self._last_power_ranking_query_time = None - - # Send off a new power-ranking query if its been - # long enough or whatnot. - if not self._doing_power_ranking_query and ( - self._last_power_ranking_query_time is None - or cur_time - self._last_power_ranking_query_time > 30.0 - ): - self._last_power_ranking_query_time = cur_time - self._doing_power_ranking_query = True - plus.power_ranking_query( - callback=bui.WeakCall(self._on_power_ranking_query_response) - ) - - def _default_on_activate_call(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.league.rankwindow import LeagueRankWindow - - LeagueRankWindow(modal=True, origin_widget=self._button) - - def set_position(self, position: tuple[float, float]) -> None: - """Set the button's position.""" - self._position = position - if not self._button: - return - bui.buttonwidget(edit=self._button, position=self._position) - bui.textwidget( - edit=self._title_text, - position=( - self._position[0] + self._size[0] * 0.5 * self._scale, - self._position[1] + self._size[1] * 0.82 * self._scale, - ), - ) - bui.textwidget( - edit=self._value_text, - position=( - self._position[0] + self._size[0] * 0.5 * self._scale, - self._position[1] + self._size[1] * 0.36 * self._scale, - ), - ) - - def get_button(self) -> bui.Widget: - """Return the underlying button bui.Widget>""" - return self._button diff --git a/dist/ba_data/python/bauiv1lib/league/rankwindow.py b/dist/ba_data/python/bauiv1lib/league/rankwindow.py index 7e6d8d1..331e08e 100644 --- a/dist/ba_data/python/bauiv1lib/league/rankwindow.py +++ b/dist/ba_data/python/bauiv1lib/league/rankwindow.py @@ -7,7 +7,7 @@ from __future__ import annotations import copy import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from bauiv1lib.popup import PopupMenu import bauiv1 as bui @@ -16,13 +16,12 @@ if TYPE_CHECKING: from typing import Any -class LeagueRankWindow(bui.Window): +class LeagueRankWindow(bui.MainWindow): """Window for showing league rank.""" def __init__( self, - transition: str = 'in_right', - modal: bool = False, + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-statements @@ -32,83 +31,112 @@ class LeagueRankWindow(bui.Window): bui.set_analytics_screen('League Rank Window') self._league_rank_data: dict[str, Any] | None = None - self._modal = modal self._power_ranking_achievements_button: bui.Widget | None = None - self._pro_mult_button: bui.Widget | None = None + self._up_to_date_bonus_button: bui.Widget | None = None self._power_ranking_trophies_button: bui.Widget | None = None self._league_title_text: bui.Widget | None = None self._league_text: bui.Widget | None = None self._league_number_text: bui.Widget | None = None self._your_power_ranking_text: bui.Widget | None = None + self._loading_spinner: bui.Widget | None = None self._season_ends_text: bui.Widget | None = None self._power_ranking_rank_text: bui.Widget | None = None self._to_ranked_text: bui.Widget | None = None self._trophy_counts_reset_text: bui.Widget | None = None - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 1320 if uiscale is bui.UIScale.SMALL else 1120 + self._width = 1500 if uiscale is bui.UIScale.SMALL else 1120 x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 self._height = ( - 657 + 1000 if uiscale is bui.UIScale.SMALL else 710 if uiscale is bui.UIScale.MEDIUM else 800 ) self._r = 'coopSelectWindow' self._rdict = bui.app.lang.get_resource(self._r) - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 + # top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 + + # self._xoffs = 80.0 if uiscale is bui.UIScale.SMALL else 0 + self._xoffs = 40 self._league_url_arg = '' self._is_current_season = False self._can_do_more_button = True + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.3 + if uiscale is bui.UIScale.SMALL + else 0.93 if uiscale is bui.UIScale.MEDIUM else 0.8 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 130, screensize[0] / scale) + target_height = min(self._height - 130, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 35 + scroll_bottom = yoffs - 80 - self._scroll_height + super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), + size=(self._width, self._height), stack_offset=( - (0, -15) + (0, 0) if uiscale is bui.UIScale.SMALL else (0, 10) if uiscale is bui.UIScale.MEDIUM else (0, 0) ), - transition=transition, - scale_origin_stack_offset=scale_origin, - scale=( - 1.2 + scale=scale, + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 0.93 if uiscale is bui.UIScale.MEDIUM else 0.8 + else 'menu_full' ), - ) + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=( - 75 + x_inset, - self._height - 87 - (4 if uiscale is bui.UIScale.SMALL else 0), - ), - size=(120, 60), - scale=1.2, - autoselect=True, - label=bui.Lstr(resource='doneText' if self._modal else 'backText'), - button_type=None if self._modal else 'back', - on_activate_call=self._back, - ) + if uiscale is bui.UIScale.SMALL: + self._back_button = bui.get_special_widget('back_button') + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(75 + x_inset, yoffs - 60), + size=(60, 55), + scale=1.2, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, + cancel_button=self._back_button, + selected_child=self._back_button, + ) self._title_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 56), + position=( + self._width * 0.5, + yoffs - (55 if uiscale is bui.UIScale.SMALL else 30), + ), size=(0, 0), text=bui.Lstr( resource='league.leagueRankText', @@ -116,44 +144,31 @@ class LeagueRankWindow(bui.Window): ), h_align='center', color=bui.app.ui_v1.title_color, - scale=1.4, + scale=1.2 if uiscale is bui.UIScale.SMALL else 1.3, maxwidth=600, v_align='center', ) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - position=( - 75 + x_inset, - self._height - 87 - (2 if uiscale is bui.UIScale.SMALL else 0), - ), - size=(60, 55), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - self._scroll_width = self._width - (130 + 2 * x_inset) - self._scroll_height = self._height - 160 self._scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, - position=(65 + x_inset, 70), size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + scroll_bottom, + ), center_small_content=True, + center_small_content_horizontally=True, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, autoselect=True) bui.containerwidget(edit=self._scrollwidget, claims_left_right=True) - bui.containerwidget( - edit=self._root_widget, - cancel_button=self._back_button, - selected_child=self._back_button, - ) self._last_power_ranking_query_time: float | None = None self._doing_power_ranking_query = False self._subcontainer: bui.Widget | None = None - self._subcontainerwidth = 800 + self._subcontainerwidth = 1024 self._subcontainerheight = 483 self._power_ranking_score_widgets: list[bui.Widget] = [] @@ -161,13 +176,14 @@ class LeagueRankWindow(bui.Window): self._requested_season: str | None = None self._season: str | None = None - # take note of our account state; we'll refresh later if this changes + # Take note of our account state; we'll refresh later if this + # changes. self._account_state = plus.get_v1_account_state() self._refresh() self._restore_state() - # if we've got cached power-ranking data already, display it + # If we've got cached power-ranking data already, display it. assert bui.app.classic is not None info = bui.app.classic.accounts.get_cached_league_rank_data() if info is not None: @@ -178,17 +194,30 @@ class LeagueRankWindow(bui.Window): ) self._update(show=info is None) - def _on_achievements_press(self) -> None: - from bauiv1lib import achievements + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) - # only allow this for all-time or the current season - # (we currently don't keep specific achievement data for old seasons) + @override + def on_main_window_close(self) -> None: + self._save_state() + + def _on_achievements_press(self) -> None: + from bauiv1lib.achievements import AchievementsWindow + + # Only allow this for all-time or the current season (we + # currently don't keep specific achievement data for old + # seasons). if self._season == 'a' or self._is_current_season: prab = self._power_ranking_achievements_button assert prab is not None - achievements.AchievementsWindow( - position=prab.get_screen_space_center() - ) + self.main_window_replace(AchievementsWindow(origin_widget=prab)) else: bui.screenmessage( bui.Lstr( @@ -228,14 +257,14 @@ class LeagueRankWindow(bui.Window): origin_widget=self._activity_mult_button, ) - def _on_pro_mult_press(self) -> None: + def _on_up_to_date_bonus_press(self) -> None: from bauiv1lib import confirm plus = bui.app.plus assert plus is not None txt = bui.Lstr( - resource='coopSelectWindow.proMultInfoText', + resource='league.upToDateBonusDescriptionText', subs=[ ( '${PERCENT}', @@ -245,13 +274,6 @@ class LeagueRankWindow(bui.Window): ) ), ), - ( - '${PRO}', - bui.Lstr( - resource='store.bombSquadProNameText', - subs=[('${APP_NAME}', bui.Lstr(resource='titleText'))], - ), - ), ], ) confirm.ConfirmWindow( @@ -259,7 +281,7 @@ class LeagueRankWindow(bui.Window): cancel_button=False, width=460, height=130, - origin_widget=self._pro_mult_button, + origin_widget=self._up_to_date_bonus_button, ) def _on_trophies_press(self) -> None: @@ -281,7 +303,8 @@ class LeagueRankWindow(bui.Window): ) -> None: self._doing_power_ranking_query = False - # Important: *only* cache this if we requested the current season. + # Important: *only* cache this if we requested the current + # season. if data is not None and data.get('s', None) is None: assert bui.app.classic is not None bui.app.classic.accounts.cache_league_rank_data(data) @@ -310,8 +333,8 @@ class LeagueRankWindow(bui.Window): if not self._doing_power_ranking_query: self._last_power_ranking_query_time = None - # Send off a new power-ranking query if its been long enough or our - # requested season has changed or whatnot. + # Send off a new power-ranking query if its been long enough or + # our requested season has changed or whatnot. if not self._doing_power_ranking_query and ( self._last_power_ranking_query_time is None or cur_time - self._last_power_ranking_query_time > 30.0 @@ -321,13 +344,8 @@ class LeagueRankWindow(bui.Window): bui.textwidget(edit=self._league_title_text, text='') bui.textwidget(edit=self._league_text, text='') bui.textwidget(edit=self._league_number_text, text='') - bui.textwidget( - edit=self._your_power_ranking_text, - text=bui.Lstr( - value='${A}...', - subs=[('${A}', bui.Lstr(resource='loadingText'))], - ), - ) + bui.textwidget(edit=self._your_power_ranking_text, text='') + bui.spinnerwidget(edit=self._loading_spinner, visible=True) bui.textwidget(edit=self._to_ranked_text, text='') bui.textwidget(edit=self._power_ranking_rank_text, text='') bui.textwidget(edit=self._season_ends_text, text='') @@ -348,7 +366,7 @@ class LeagueRankWindow(bui.Window): plus = bui.app.plus assert plus is not None - # (re)create the sub-container if need be.. + # (Re)create the sub-container if need be. if self._subcontainer is not None: self._subcontainer.delete() self._subcontainer = bui.containerwidget( @@ -374,7 +392,7 @@ class LeagueRankWindow(bui.Window): bui.textwidget( parent=w_parent, - position=(h2 - 60, v2 + 106), + position=(self._xoffs + h2 - 60, v2 + 106), size=(0, 0), flatness=1.0, shadow=0.0, @@ -388,7 +406,7 @@ class LeagueRankWindow(bui.Window): self._power_ranking_achievements_button = bui.buttonwidget( parent=w_parent, - position=(h2 - 60, v2 + 10), + position=(self._xoffs + h2 - 60, v2 + 10), size=(200, 80), icon=bui.gettexture('achievementsIcon'), autoselect=True, @@ -402,7 +420,7 @@ class LeagueRankWindow(bui.Window): self._power_ranking_achievement_total_text = bui.textwidget( parent=w_parent, - position=(h2 + h_offs_tally, v2 + 45), + position=(self._xoffs + h2 + h_offs_tally, v2 + 45), size=(0, 0), flatness=1.0, shadow=0.0, @@ -418,7 +436,7 @@ class LeagueRankWindow(bui.Window): self._power_ranking_trophies_button = bui.buttonwidget( parent=w_parent, - position=(h2 - 60, v2 + 10), + position=(self._xoffs + h2 - 60, v2 + 10), size=(200, 80), icon=bui.gettexture('medalSilver'), autoselect=True, @@ -430,7 +448,7 @@ class LeagueRankWindow(bui.Window): ) self._power_ranking_trophies_total_text = bui.textwidget( parent=w_parent, - position=(h2 + h_offs_tally, v2 + 45), + position=(self._xoffs + h2 + h_offs_tally, v2 + 45), size=(0, 0), flatness=1.0, shadow=0.0, @@ -446,7 +464,7 @@ class LeagueRankWindow(bui.Window): bui.textwidget( parent=w_parent, - position=(h2 - 60, v2 + 86), + position=(self._xoffs + h2 - 60, v2 + 86), size=(0, 0), flatness=1.0, shadow=0.0, @@ -462,7 +480,7 @@ class LeagueRankWindow(bui.Window): if plus.get_v1_account_misc_read_val('act', False): self._activity_mult_button = bui.buttonwidget( parent=w_parent, - position=(h2 - 60, v2 + 10), + position=(self._xoffs + h2 - 60, v2 + 10), size=(200, 60), icon=bui.gettexture('heart'), icon_color=(0.5, 0, 0.5), @@ -476,7 +494,7 @@ class LeagueRankWindow(bui.Window): self._activity_mult_text = bui.textwidget( parent=w_parent, - position=(h2 + h_offs_tally, v2 + 40), + position=(self._xoffs + h2 + h_offs_tally, v2 + 40), size=(0, 0), flatness=1.0, shadow=0.0, @@ -491,26 +509,23 @@ class LeagueRankWindow(bui.Window): else: self._activity_mult_button = None - self._pro_mult_button = bui.buttonwidget( + self._up_to_date_bonus_button = bui.buttonwidget( parent=w_parent, - position=(h2 - 60, v2 + 10), + position=(self._xoffs + h2 - 60, v2 + 10), size=(200, 60), icon=bui.gettexture('logo'), icon_color=(0.3, 0, 0.3), - label=bui.Lstr( - resource='store.bombSquadProNameText', - subs=[('${APP_NAME}', bui.Lstr(resource='titleText'))], - ), + label=bui.Lstr(resource='league.upToDateBonusText'), autoselect=True, - on_activate_call=bui.WeakCall(self._on_pro_mult_press), + on_activate_call=bui.WeakCall(self._on_up_to_date_bonus_press), left_widget=self._back_button, color=(0.5, 0.5, 0.6), textcolor=(0.7, 0.7, 0.8), ) - self._pro_mult_text = bui.textwidget( + self._up_to_date_bonus_text = bui.textwidget( parent=w_parent, - position=(h2 + h_offs_tally, v2 + 40), + position=(self._xoffs + h2 + h_offs_tally, v2 + 40), size=(0, 0), flatness=1.0, shadow=0.0, @@ -526,7 +541,7 @@ class LeagueRankWindow(bui.Window): v2 -= spc bui.textwidget( parent=w_parent, - position=(h2 + h_offs_tally - 10 - 40, v2 + 35), + position=(self._xoffs + h2 + h_offs_tally - 10 - 40, v2 + 35), size=(0, 0), flatness=1.0, shadow=0.0, @@ -539,7 +554,7 @@ class LeagueRankWindow(bui.Window): ) self._power_ranking_total_text = bui.textwidget( parent=w_parent, - position=(h2 + h_offs_tally - 40, v2 + 35), + position=(self._xoffs + h2 + h_offs_tally - 40, v2 + 35), size=(0, 0), flatness=1.0, shadow=0.0, @@ -553,7 +568,7 @@ class LeagueRankWindow(bui.Window): self._season_show_text = bui.textwidget( parent=w_parent, - position=(390 - 15, v - 20), + position=(self._xoffs + 390 - 15, v - 20), size=(0, 0), color=(0.6, 0.6, 0.7), maxwidth=200, @@ -567,7 +582,7 @@ class LeagueRankWindow(bui.Window): self._league_title_text = bui.textwidget( parent=w_parent, - position=(470, v - 97), + position=(self._xoffs + 470, v - 97), size=(0, 0), color=(0.6, 0.6, 0.7), maxwidth=230, @@ -583,7 +598,7 @@ class LeagueRankWindow(bui.Window): self._league_text_maxwidth = 210 self._league_text = bui.textwidget( parent=w_parent, - position=(470, v - 140), + position=(self._xoffs + 470, v - 140), size=(0, 0), color=(1, 1, 1), maxwidth=self._league_text_maxwidth, @@ -597,7 +612,7 @@ class LeagueRankWindow(bui.Window): self._league_number_base_pos = (470, v - 140) self._league_number_text = bui.textwidget( parent=w_parent, - position=(470, v - 140), + position=(self._xoffs + 470, v - 140), size=(0, 0), color=(1, 1, 1), maxwidth=100, @@ -609,9 +624,18 @@ class LeagueRankWindow(bui.Window): flatness=1.0, ) + self._loading_spinner = bui.spinnerwidget( + parent=w_parent, + position=( + self._subcontainerwidth * 0.5, + self._subcontainerheight * 0.5, + ), + style='bomb', + size=64, + ) self._your_power_ranking_text = bui.textwidget( parent=w_parent, - position=(470, v - 142 - 70), + position=(self._xoffs + 470, v - 142 - 70), size=(0, 0), color=(0.6, 0.6, 0.7), maxwidth=230, @@ -625,7 +649,7 @@ class LeagueRankWindow(bui.Window): self._to_ranked_text = bui.textwidget( parent=w_parent, - position=(470, v - 250 - 70), + position=(self._xoffs + 470, v - 250 - 70), size=(0, 0), color=(0.6, 0.6, 0.7), maxwidth=230, @@ -639,7 +663,7 @@ class LeagueRankWindow(bui.Window): self._power_ranking_rank_text = bui.textwidget( parent=w_parent, - position=(473, v - 210 - 70), + position=(self._xoffs + 473, v - 210 - 70), size=(0, 0), big=False, text='-', @@ -650,7 +674,7 @@ class LeagueRankWindow(bui.Window): self._season_ends_text = bui.textwidget( parent=w_parent, - position=(470, v - 380), + position=(self._xoffs + 470, v - 380), size=(0, 0), color=(0.6, 0.6, 0.6), maxwidth=230, @@ -663,7 +687,7 @@ class LeagueRankWindow(bui.Window): ) self._trophy_counts_reset_text = bui.textwidget( parent=w_parent, - position=(470, v - 410), + position=(self._xoffs + 470, v - 410), size=(0, 0), color=(0.5, 0.5, 0.5), maxwidth=230, @@ -685,7 +709,7 @@ class LeagueRankWindow(bui.Window): self._see_more_button = bui.buttonwidget( parent=w_parent, label=self._rdict.seeMoreText, - position=(h, v), + position=(self._xoffs + h, v), color=(0.5, 0.5, 0.6), textcolor=(0.7, 0.7, 0.8), size=(230, 60), @@ -698,8 +722,6 @@ class LeagueRankWindow(bui.Window): assert plus is not None our_login_id = plus.get_v1_account_public_login_id() - # our_login_id = _bs.get_account_misc_read_val_2( - # 'resolvedAccountID', None) if not self._can_do_more_button or our_login_id is None: bui.getsound('error').play() bui.screenmessage( @@ -732,6 +754,7 @@ class LeagueRankWindow(bui.Window): if not self._root_widget: return plus = bui.app.plus + uiscale = bui.app.ui_v1.uiscale assert plus is not None assert bui.app.classic is not None accounts = bui.app.classic.accounts @@ -752,8 +775,8 @@ class LeagueRankWindow(bui.Window): status_text = num_text.replace('${NUMBER}', str(data['rank'])) elif data is not None: try: - # handle old seasons where we didn't wind up ranked - # at the end.. + # Handle old seasons where we didn't wind up ranked at + # the end. if not data['scores']: status_text = ( self._rdict.powerRankingFinishedSeasonUnrankedText @@ -796,7 +819,7 @@ class LeagueRankWindow(bui.Window): did_first = False self._is_current_season = False if data is not None: - # build our list of seasons we have available + # Build our list of seasons we have available. for ssn in data['sl']: season_choices.append(ssn) if ssn != 'a' and not did_first: @@ -807,8 +830,9 @@ class LeagueRankWindow(bui.Window): ) ) did_first = True - # if we either did not specify a season or specified the - # first, we're looking at the current.. + + # If we either did not specify a season or specified + # the first, we're looking at the current. if self._season in [ssn, None]: self._is_current_season = True elif ssn == 'a': @@ -825,7 +849,7 @@ class LeagueRankWindow(bui.Window): assert self._subcontainer self._season_popup_menu = PopupMenu( parent=self._subcontainer, - position=(390, v - 45), + position=(self._xoffs + 390, v - 45), width=150, button_size=(200, 50), choices=season_choices, @@ -843,11 +867,12 @@ class LeagueRankWindow(bui.Window): edit=self._season_popup_menu.get_button(), up_widget=self._back_button, ) - bui.widget( - edit=self._back_button, - down_widget=self._power_ranking_achievements_button, - right_widget=self._season_popup_menu.get_button(), - ) + if uiscale is not bui.UIScale.SMALL: + bui.widget( + edit=self._back_button, + down_widget=self._power_ranking_achievements_button, + right_widget=self._season_popup_menu.get_button(), + ) bui.textwidget( edit=self._league_title_text, @@ -928,7 +953,10 @@ class LeagueRankWindow(bui.Window): text=lnum, color=lcolor, position=( - self._league_number_base_pos[0] + l_text_width * 0.5 + 8, + self._xoffs + + self._league_number_base_pos[0] + + l_text_width * 0.5 + + 8, self._league_number_base_pos[1] + 10, ), ) @@ -954,10 +982,11 @@ class LeagueRankWindow(bui.Window): else '' ), ) + bui.spinnerwidget(edit=self._loading_spinner, visible=False) bui.textwidget( edit=self._power_ranking_rank_text, - position=(473, v - 70 - (170 if do_percent else 220)), + position=(self._xoffs + 473, v - 70 - (170 if do_percent else 220)), text=status_text, big=(in_top or do_percent), scale=( @@ -981,13 +1010,16 @@ class LeagueRankWindow(bui.Window): textcolor=(0.7, 0.7, 0.8, 1.0), icon_color=(0.5, 0, 0.5, 1.0), ) - # pylint: disable=consider-using-f-string bui.textwidget( edit=self._activity_mult_text, - text='x ' + ('%.2f' % data['act']), + text=f'x {data['act']:.2f}', ) - have_pro = False if data is None else data['p'] + # This used to be a bonus for 'BombSquad Pro' holders, but since + # we're transitioning away from that it is now a bonus for + # everyone running a recent-ish version of the game. + + have_up_to_date_bonus = data is not None pro_mult = ( 1.0 + float( @@ -995,19 +1027,20 @@ class LeagueRankWindow(bui.Window): ) * 0.01 ) - # pylint: disable=consider-using-f-string bui.textwidget( - edit=self._pro_mult_text, + edit=self._up_to_date_bonus_text, text=( ' -' - if (data is None or not have_pro) - else 'x ' + ('%.2f' % pro_mult) + if (data is None or not have_up_to_date_bonus) + else f'x {pro_mult:.2f}' ), ) bui.buttonwidget( - edit=self._pro_mult_button, - textcolor=(0.7, 0.7, 0.8, (1.0 if have_pro else 0.5)), - icon_color=(0.5, 0, 0.5) if have_pro else (0.5, 0, 0.5, 0.2), + edit=self._up_to_date_bonus_button, + textcolor=(0.7, 0.7, 0.8, (1.0 if have_up_to_date_bonus else 0.5)), + icon_color=( + (0.5, 0, 0.5) if have_up_to_date_bonus else (0.5, 0, 0.5, 0.2) + ), ) bui.buttonwidget( edit=self._power_ranking_achievements_button, @@ -1015,8 +1048,8 @@ class LeagueRankWindow(bui.Window): + bui.Lstr(resource='achievementsText').evaluate(), ) - # for the achievement value, use the number they gave us for - # non-current seasons; otherwise calc our own + # For the achievement value, use the number they gave us for + # non-current seasons; otherwise calc our own. total_ach_value = 0 for ach in bui.app.classic.ach.achievements: if ach.complete: @@ -1080,7 +1113,7 @@ class LeagueRankWindow(bui.Window): self._power_ranking_score_widgets.append( bui.textwidget( parent=w_parent, - position=(h2 - 20, v2), + position=(self._xoffs + h2 - 20, v2), size=(0, 0), color=(1, 1, 1) if is_us else (0.6, 0.6, 0.7), maxwidth=40, @@ -1095,7 +1128,7 @@ class LeagueRankWindow(bui.Window): self._power_ranking_score_widgets.append( bui.textwidget( parent=w_parent, - position=(h2 + 20, v2), + position=(self._xoffs + h2 + 20, v2), size=(0, 0), color=(1, 1, 1) if is_us else tally_color, maxwidth=60, @@ -1109,7 +1142,7 @@ class LeagueRankWindow(bui.Window): ) txt = bui.textwidget( parent=w_parent, - position=(h2 + 60, v2 - (28 * 0.5) / 0.9), + position=(self._xoffs + h2 + 60, v2 - (28 * 0.5) / 0.9), size=(210 / 0.9, 28), color=(1, 1, 1) if is_us else (0.6, 0.6, 0.6), maxwidth=210, @@ -1139,35 +1172,17 @@ class LeagueRankWindow(bui.Window): def _show_account_info( self, account_id: str, textwidget: bui.Widget ) -> None: - from bauiv1lib.account import viewer + from bauiv1lib.account.viewer import AccountViewerWindow bui.getsound('swish').play() - viewer.AccountViewerWindow( + AccountViewerWindow( account_id=account_id, position=textwidget.get_screen_space_center() ) def _on_season_change(self, value: str) -> None: self._requested_season = value - self._last_power_ranking_query_time = None # make sure we update asap + self._last_power_ranking_query_time = None # Update asap. self._update(show=True) def _save_state(self) -> None: pass - - def _back(self) -> None: - from bauiv1lib.coop.browser import CoopBrowserWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - CoopBrowserWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/mainmenu.py b/dist/ba_data/python/bauiv1lib/mainmenu.py index cc79347..f0d6275 100644 --- a/dist/ba_data/python/bauiv1lib/mainmenu.py +++ b/dist/ba_data/python/bauiv1lib/mainmenu.py @@ -1,11 +1,10 @@ # Released under the MIT License. See LICENSE for details. # """Implements the main menu window.""" -# pylint: disable=too-many-lines from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import logging import bauiv1 as bui @@ -15,41 +14,34 @@ if TYPE_CHECKING: from typing import Any, Callable -class MainMenuWindow(bui.Window): - """The main menu window, both in-game and in the main menu session.""" +class MainMenuWindow(bui.MainWindow): + """The main menu window.""" - def __init__(self, transition: str | None = 'in_right'): - # pylint: disable=cyclic-import - import threading - from bascenev1lib.mainmenu import MainMenuSession - - plus = bui.app.plus - assert plus is not None - - self._in_game = not isinstance( - bs.get_foreground_host_session(), - MainMenuSession, - ) + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): # Preload some modules we use in a background thread so we won't # have a visual hitch when the user taps them. - threading.Thread(target=self._preload_modules).start() + bui.app.threadpool.submit_no_wait(self._preload_modules) - if not self._in_game: - bui.set_analytics_screen('Main Menu') - self._show_remote_app_info_on_first_launch() + bui.set_analytics_screen('Main Menu') + self._show_remote_app_info_on_first_launch() + + uiscale = bui.app.ui_v1.uiscale # Make a vanilla container; we'll modify it to our needs in # refresh. super().__init__( root_widget=bui.containerwidget( - transition=transition, - toolbar_visibility=( - 'menu_minimal_no_back' - if self._in_game - else 'menu_minimal_no_back' - ), - ) + toolbar_visibility=('menu_full_no_back') + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) # Grab this stuff in case it changes. @@ -59,7 +51,6 @@ class MainMenuWindow(bui.Window): self._tdelay = 0.0 self._t_delay_inc = 0.02 self._t_delay_play = 1.7 - self._p_index = 0 self._use_autoselect = True self._button_width = 200.0 self._button_height = 45.0 @@ -67,42 +58,39 @@ class MainMenuWindow(bui.Window): self._height = 100.0 self._demo_menu_button: bui.Widget | None = None self._gather_button: bui.Widget | None = None - self._start_button: bui.Widget | None = None + self._play_button: bui.Widget | None = None self._watch_button: bui.Widget | None = None - self._account_button: bui.Widget | None = None self._how_to_play_button: bui.Widget | None = None self._credits_button: bui.Widget | None = None - self._settings_button: bui.Widget | None = None - self._next_refresh_allow_time = 0.0 - - self._store_char_tex = self._get_store_char_tex() self._refresh() + self._restore_state() - # Keep an eye on a few things and refresh if they change. - self._account_state = plus.get_v1_account_state() - self._account_state_num = plus.get_v1_account_state_num() - self._account_type = ( - plus.get_v1_account_type() - if self._account_state == 'signed_in' - else None - ) - self._refresh_timer = bui.AppTimer( - 0.27, bui.WeakCall(self._check_refresh), repeat=True + @override + def on_main_window_close(self) -> None: + self._save_state() + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) ) @staticmethod def _preload_modules() -> None: """Preload modules we use; avoids hitches (called in bg thread).""" + # pylint: disable=cyclic-import import bauiv1lib.getremote as _unused import bauiv1lib.confirm as _unused2 - import bauiv1lib.store.button as _unused3 - import bauiv1lib.kiosk as _unused4 import bauiv1lib.account.settings as _unused5 import bauiv1lib.store.browser as _unused6 - import bauiv1lib.creditslist as _unused7 - import bauiv1lib.helpui as _unused8 + import bauiv1lib.credits as _unused7 + import bauiv1lib.help as _unused8 import bauiv1lib.settings.allsettings as _unused9 import bauiv1lib.gather as _unused10 import bauiv1lib.watch as _unused11 @@ -111,8 +99,9 @@ class MainMenuWindow(bui.Window): def _show_remote_app_info_on_first_launch(self) -> None: app = bui.app assert app.classic is not None - # The first time the non-in-game menu pops up, we might wanna show - # a 'get-remote-app' dialog in front of it. + + # The first time the non-in-game menu pops up, we might wanna + # show a 'get-remote-app' dialog in front of it. if app.classic.first_main_menu: app.classic.first_main_menu = False try: @@ -138,67 +127,16 @@ class MainMenuWindow(bui.Window): except Exception: logging.exception('Error showing get-remote-app info.') - def _get_store_char_tex(self) -> str: - plus = bui.app.plus - assert plus is not None - return ( - 'storeCharacterXmas' - if plus.get_v1_account_misc_read_val('xmas', False) - else ( - 'storeCharacterEaster' - if plus.get_v1_account_misc_read_val('easter', False) - else 'storeCharacter' - ) - ) - - def _check_refresh(self) -> None: - plus = bui.app.plus - assert plus is not None - - if not self._root_widget: - return - - now = bui.apptime() - if now < self._next_refresh_allow_time: - return - - # Don't refresh for the first few seconds the game is up so we - # don't interrupt the transition in. - - # bui.app.main_menu_window_refresh_check_count += 1 - # if bui.app.main_menu_window_refresh_check_count < 4: - # return - - store_char_tex = self._get_store_char_tex() - account_state_num = plus.get_v1_account_state_num() - if ( - account_state_num != self._account_state_num - or store_char_tex != self._store_char_tex - ): - self._store_char_tex = store_char_tex - self._account_state_num = account_state_num - account_state = self._account_state = plus.get_v1_account_state() - self._account_type = ( - plus.get_v1_account_type() - if account_state == 'signed_in' - else None - ) - self._save_state() - self._refresh() - self._restore_state() - def get_play_button(self) -> bui.Widget | None: """Return the play button.""" - return self._start_button + return self._play_button def _refresh(self) -> None: - # pylint: disable=too-many-branches - # pylint: disable=too-many-locals # pylint: disable=too-many-statements - from bauiv1lib.store.button import StoreButton + # pylint: disable=too-many-locals - plus = bui.app.plus - assert plus is not None + classic = bui.app.classic + assert classic is not None # Clear everything that was there. children = self._root_widget.get_children() @@ -215,492 +153,130 @@ class MainMenuWindow(bui.Window): app = bui.app assert app.classic is not None - self._have_quit_button = app.ui_v1.uiscale is bui.UIScale.LARGE or ( - app.classic.platform == 'windows' - and app.classic.subplatform == 'oculus' - ) + uiscale = app.ui_v1.uiscale - self._have_store_button = not self._in_game - - self._have_settings_button = ( - not self._in_game or not app.ui_v1.use_toolbars - ) and not (self._is_demo or self._is_arcade) - - self._input_device = input_device = bs.get_ui_input_device() - - # Are we connected to a local player? - self._input_player = input_device.player if input_device else None - - # Are we connected to a remote player?. - self._connected_to_remote_player = ( - input_device.is_attached_to_player() - if (input_device and self._input_player is None) - else False - ) - - positions: list[tuple[float, float, float]] = [] - self._p_index = 0 - - if self._in_game: - h, v, scale = self._refresh_in_game(positions) - else: - h, v, scale = self._refresh_not_in_game(positions) - - if self._have_settings_button: - h, v, scale = positions[self._p_index] - self._p_index += 1 - self._settings_button = bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width * 0.5 * scale, v), - size=(self._button_width, self._button_height), - scale=scale, - autoselect=self._use_autoselect, - label=bui.Lstr(resource=f'{self._r}.settingsText'), - transition_delay=self._tdelay, - on_activate_call=self._settings, - ) - - # Scattered eggs on easter. - if ( - plus.get_v1_account_misc_read_val('easter', False) - and not self._in_game - ): - icon_size = 34 - bui.imagewidget( + # Temp note about UI changes. + if bool(False): + bui.textwidget( parent=self._root_widget, position=( - h - icon_size * 0.5 - 15, - v + self._button_height * scale - icon_size * 0.24 + 1.5, - ), - transition_delay=self._tdelay, - size=(icon_size, icon_size), - texture=bui.gettexture('egg3'), - tilt_scale=0.0, - ) - - self._tdelay += self._t_delay_inc - - if self._in_game: - h, v, scale = positions[self._p_index] - self._p_index += 1 - - # If we're in a replay, we have a 'Leave Replay' button. - if bs.is_in_replay(): - bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width * 0.5 * scale, v), - scale=scale, - size=(self._button_width, self._button_height), - autoselect=self._use_autoselect, - label=bui.Lstr(resource='replayEndText'), - on_activate_call=self._confirm_end_replay, - ) - elif bs.get_foreground_host_session() is not None: - bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width * 0.5 * scale, v), - scale=scale, - size=(self._button_width, self._button_height), - autoselect=self._use_autoselect, - label=bui.Lstr( - resource=self._r - + ( - '.endTestText' - if self._is_benchmark() - else '.endGameText' - ) - ), - on_activate_call=( - self._confirm_end_test - if self._is_benchmark() - else self._confirm_end_game - ), - ) - else: - # Assume we're in a client-session. - bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width * 0.5 * scale, v), - scale=scale, - size=(self._button_width, self._button_height), - autoselect=self._use_autoselect, - label=bui.Lstr(resource=f'{self._r}.leavePartyText'), - on_activate_call=self._confirm_leave_party, - ) - - self._store_button: bui.Widget | None - if self._have_store_button: - this_b_width = self._button_width - h, v, scale = positions[self._p_index] - self._p_index += 1 - - sbtn = self._store_button_instance = StoreButton( - parent=self._root_widget, - position=(h - this_b_width * 0.5 * scale, v), - size=(this_b_width, self._button_height), - scale=scale, - on_activate_call=bui.WeakCall(self._on_store_pressed), - sale_scale=1.3, - transition_delay=self._tdelay, - ) - self._store_button = store_button = sbtn.get_button() - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - icon_size = ( - 55 - if uiscale is bui.UIScale.SMALL - else 55 if uiscale is bui.UIScale.MEDIUM else 70 - ) - bui.imagewidget( - parent=self._root_widget, - position=( - h - icon_size * 0.5, - v + self._button_height * scale - icon_size * 0.23, - ), - transition_delay=self._tdelay, - size=(icon_size, icon_size), - texture=bui.gettexture(self._store_char_tex), - tilt_scale=0.0, - draw_controller=store_button, - ) - self._tdelay += self._t_delay_inc - else: - self._store_button = None - - self._quit_button: bui.Widget | None - if not self._in_game and self._have_quit_button: - h, v, scale = positions[self._p_index] - self._p_index += 1 - self._quit_button = quit_button = bui.buttonwidget( - parent=self._root_widget, - autoselect=self._use_autoselect, - position=(h - self._button_width * 0.5 * scale, v), - size=(self._button_width, self._button_height), - scale=scale, - label=bui.Lstr( - resource=self._r - + ( - '.quitText' - if 'Mac' in app.classic.legacy_user_agent_string - else '.exitGameText' + (-400, 400) + if uiscale is bui.UIScale.LARGE + else ( + (-270, 320) + if uiscale is bui.UIScale.MEDIUM + else (-280, 280) ) ), - on_activate_call=self._quit, - transition_delay=self._tdelay, - ) - - # Scattered eggs on easter. - if plus.get_v1_account_misc_read_val('easter', False): - icon_size = 30 - bui.imagewidget( - parent=self._root_widget, - position=( - h - icon_size * 0.5 + 25, - v - + self._button_height * scale - - icon_size * 0.24 - + 1.5, - ), - transition_delay=self._tdelay, - size=(icon_size, icon_size), - texture=bui.gettexture('egg1'), - tilt_scale=0.0, - ) - - bui.containerwidget( - edit=self._root_widget, cancel_button=quit_button - ) - self._tdelay += self._t_delay_inc - else: - self._quit_button = None - - # If we're not in-game, have no quit button, and this is - # android, we want back presses to quit our activity. - if ( - not self._in_game - and not self._have_quit_button - and app.classic.platform == 'android' - ): - - def _do_quit() -> None: - bui.quit(confirm=True, quit_type=bui.QuitType.BACK) - - bui.containerwidget( - edit=self._root_widget, on_cancel_call=_do_quit - ) - - # Add speed-up/slow-down buttons for replays. Ideally this - # should be part of a fading-out playback bar like most media - # players but this works for now. - if bs.is_in_replay(): - b_size = 50.0 - b_buffer_1 = 50.0 - b_buffer_2 = 10.0 - t_scale = 0.75 - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - if uiscale is bui.UIScale.SMALL: - b_size *= 0.6 - b_buffer_1 *= 0.8 - b_buffer_2 *= 1.0 - v_offs = -40 - t_scale = 0.5 - elif uiscale is bui.UIScale.MEDIUM: - v_offs = -70 - else: - v_offs = -100 - self._replay_speed_text = bui.textwidget( - parent=self._root_widget, - text=bui.Lstr( - resource='watchWindow.playbackSpeedText', - subs=[('${SPEED}', str(1.23))], - ), - position=(h, v + v_offs + 15 * t_scale), - h_align='center', - v_align='center', size=(0, 0), - scale=t_scale, - ) - - # Update to current value. - self._change_replay_speed(0) - - # Keep updating in a timer in case it gets changed elsewhere. - self._change_replay_speed_timer = bui.AppTimer( - 0.25, bui.WeakCall(self._change_replay_speed, 0), repeat=True - ) - btn = bui.buttonwidget( - parent=self._root_widget, - position=( - h - b_size - b_buffer_1, - v - b_size - b_buffer_2 + v_offs, + scale=0.4, + flatness=1.0, + text=( + 'WARNING: This build contains a revamped UI\n' + 'which is still a work-in-progress. A number\n' + 'of features are not currently functional or\n' + 'contain bugs. To go back to the stable legacy UI,\n' + 'grab version 1.7.36 from ballistica.net' ), - button_type='square', - size=(b_size, b_size), - label='', - autoselect=True, - on_activate_call=bui.Call(self._change_replay_speed, -1), - ) - bui.textwidget( - parent=self._root_widget, - draw_controller=btn, - text='-', - position=( - h - b_size * 0.5 - b_buffer_1, - v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, - ), - h_align='center', - v_align='center', - size=(0, 0), - scale=3.0 * t_scale, - ) - btn = bui.buttonwidget( - parent=self._root_widget, - position=(h + b_buffer_1, v - b_size - b_buffer_2 + v_offs), - button_type='square', - size=(b_size, b_size), - label='', - autoselect=True, - on_activate_call=bui.Call(self._change_replay_speed, 1), - ) - bui.textwidget( - parent=self._root_widget, - draw_controller=btn, - text='+', - position=( - h + b_size * 0.5 + b_buffer_1, - v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, - ), - h_align='center', - v_align='center', - size=(0, 0), - scale=3.0 * t_scale, - ) - self._pause_resume_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(h - b_size * 0.5, v - b_size - b_buffer_2 + v_offs), - button_type='square', - size=(b_size, b_size), - label=bui.charstr( - bui.SpecialChar.PLAY_BUTTON - if bs.is_replay_paused() - else bui.SpecialChar.PAUSE_BUTTON - ), - autoselect=True, - on_activate_call=bui.Call(self._pause_or_resume_replay), - ) - btn = bui.buttonwidget( - parent=self._root_widget, - position=( - h - b_size * 1.5 - b_buffer_1 * 2, - v - b_size - b_buffer_2 + v_offs, - ), - button_type='square', - size=(b_size, b_size), - label='', - autoselect=True, - on_activate_call=bui.WeakCall(self._rewind_replay), - ) - bui.textwidget( - parent=self._root_widget, - draw_controller=btn, - # text='<<', - text=bui.charstr(bui.SpecialChar.REWIND_BUTTON), - position=( - h - b_size - b_buffer_1 * 2, - v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, - ), - h_align='center', - v_align='center', - size=(0, 0), - scale=2.0 * t_scale, - ) - btn = bui.buttonwidget( - parent=self._root_widget, - position=( - h + b_size * 0.5 + b_buffer_1 * 2, - v - b_size - b_buffer_2 + v_offs, - ), - button_type='square', - size=(b_size, b_size), - label='', - autoselect=True, - on_activate_call=bui.WeakCall(self._forward_replay), - ) - bui.textwidget( - parent=self._root_widget, - draw_controller=btn, - # text='>>', - text=bui.charstr(bui.SpecialChar.FAST_FORWARD_BUTTON), - position=( - h + b_size + b_buffer_1 * 2, - v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, - ), - h_align='center', - v_align='center', - size=(0, 0), - scale=2.0 * t_scale, + h_align='left', + v_align='top', ) - def _rewind_replay(self) -> None: - bs.seek_replay(-2 * pow(2, bs.get_replay_speed_exponent())) + self._have_quit_button = app.classic.platform in ( + 'windows', + 'mac', + 'linux', + ) - def _forward_replay(self) -> None: - bs.seek_replay(2 * pow(2, bs.get_replay_speed_exponent())) + if not classic.did_menu_intro: + self._tdelay = 1.6 + self._t_delay_inc = 0.03 + classic.did_menu_intro = True - def _refresh_not_in_game( - self, positions: list[tuple[float, float, float]] - ) -> tuple[float, float, float]: - # pylint: disable=too-many-branches - # pylint: disable=too-many-locals - # pylint: disable=too-many-statements - plus = bui.app.plus - assert plus is not None + td1 = 2 + td2 = 1 + td3 = 0 + td4 = -1 + td5 = -2 - assert bui.app.classic is not None - if not bui.app.classic.did_menu_intro: - self._tdelay = 2.0 - self._t_delay_inc = 0.02 - self._t_delay_play = 1.7 - - def _set_allow_time() -> None: - self._next_refresh_allow_time = bui.apptime() + 2.5 - - # Slight hack: widget transitions currently only progress - # when frames are being drawn, but this tends to get called - # before frame drawing even starts, meaning we don't know - # exactly how long we should wait before refreshing to avoid - # interrupting the transition. To make things a bit better, - # let's do a redundant set of the time in a deferred call - # which hopefully happens closer to actual frame draw times. - _set_allow_time() - bui.pushcall(_set_allow_time) - - bui.app.classic.did_menu_intro = True self._width = 400.0 self._height = 200.0 - enable_account_button = True - account_type_name: str | bui.Lstr - if plus.get_v1_account_state() == 'signed_in': - account_type_name = plus.get_v1_account_display_string() - account_type_icon = None - account_textcolor = (1.0, 1.0, 1.0) - else: - account_type_name = bui.Lstr( - resource='notSignedInText', - fallback_resource='accountSettingsWindow.titleText', - ) - account_type_icon = None - account_textcolor = (1.0, 0.2, 0.2) - account_type_icon_color = (1.0, 1.0, 1.0) - account_type_call = self._show_account_window - account_type_enable_button_sound = True - b_count = 3 # play, help, credits - if self._have_settings_button: - b_count += 1 - if enable_account_button: - b_count += 1 - if self._have_quit_button: - b_count += 1 - if self._have_store_button: - b_count += 1 - uiscale = bui.app.ui_v1.uiscale + + play_button_width = self._button_width * 0.65 + play_button_height = self._button_height * 1.1 + play_button_scale = 1.7 + hspace = 20.0 + side_button_width = self._button_width * 0.4 + side_button_height = side_button_width + side_button_scale = 0.95 + side_button_y_offs = 5.0 + hspace2 = 15.0 + side_button_2_width = self._button_width * 1.0 + side_button_2_height = side_button_2_width * 0.3 + side_button_2_y_offs = 10.0 + side_button_2_scale = 0.5 + if uiscale is bui.UIScale.SMALL: - root_widget_scale = 1.6 - play_button_width = self._button_width * 0.65 - play_button_height = self._button_height * 1.1 - small_button_scale = 0.51 if b_count > 6 else 0.63 + # We're a generally widescreen shaped window, so bump our + # overall scale up a bit when screen width is wider than safe + # bounds to take advantage of the extra space. + screensize = bui.get_virtual_screen_size() + safesize = bui.get_virtual_safe_area_size() + root_widget_scale = min(1.55, 1.3 * screensize[0] / safesize[0]) button_y_offs = -20.0 - button_y_offs2 = -60.0 self._button_height *= 1.3 - button_spacing = 1.04 elif uiscale is bui.UIScale.MEDIUM: root_widget_scale = 1.3 - play_button_width = self._button_width * 0.65 - play_button_height = self._button_height * 1.1 - small_button_scale = 0.6 button_y_offs = -55.0 - button_y_offs2 = -75.0 self._button_height *= 1.25 - button_spacing = 1.1 else: root_widget_scale = 1.0 - play_button_width = self._button_width * 0.65 - play_button_height = self._button_height * 1.1 - small_button_scale = 0.75 - button_y_offs = -80.0 - button_y_offs2 = -100.0 + button_y_offs = -90.0 self._button_height *= 1.2 - button_spacing = 1.1 - spc = self._button_width * small_button_scale * button_spacing + bui.containerwidget( edit=self._root_widget, size=(self._width, self._height), background=False, scale=root_widget_scale, ) - assert not positions - positions.append((self._width * 0.5, button_y_offs, 1.7)) - x_offs = self._width * 0.5 - (spc * (b_count - 1) * 0.5) + (spc * 0.5) - for i in range(b_count - 1): - positions.append( - ( - x_offs + spc * i - 1.0, - button_y_offs + button_y_offs2, - small_button_scale, - ) - ) + + # Version/copyright info. + thistdelay = self._tdelay + td3 * self._t_delay_inc + bui.textwidget( + parent=self._root_widget, + position=(self._width * 0.5, button_y_offs - 10), + size=(0, 0), + scale=0.4, + flatness=1.0, + color=(1, 1, 1, 0.3), + text=( + f'{app.env.engine_version}' + f' build {app.env.engine_build_number}.' + f' Copyright 2025 Eric Froemling.' + ), + h_align='center', + v_align='center', + # transition_delay=self._t_delay_play, + transition_delay=thistdelay, + ) + # In kiosk mode, provide a button to get back to the kiosk menu. if bui.app.env.demo or bui.app.env.arcade: - h, v, scale = positions[self._p_index] + # h, v, scale = positions[self._p_index] + h = self._width * 0.5 + v = button_y_offs + scale = 1.0 this_b_width = self._button_width * 0.4 * scale - demo_menu_delay = ( - 0.0 - if self._t_delay_play == 0.0 - else max(0, self._t_delay_play + 0.1) - ) + # demo_menu_delay = ( + # 0.0 + # if self._t_delay_play == 0.0 + # else max(0, self._t_delay_play + 0.1) + # ) + demo_menu_delay = 0.0 self._demo_menu_button = bui.buttonwidget( parent=self._root_widget, + id='demo', position=(self._width * 0.5 - this_b_width * 0.5, v + 90), size=(this_b_width, 45), autoselect=True, @@ -714,73 +290,98 @@ class MainMenuWindow(bui.Window): ) ), transition_delay=demo_menu_delay, - on_activate_call=self._demo_menu_press, + on_activate_call=self.main_window_back, ) else: self._demo_menu_button = None - uiscale = bui.app.ui_v1.uiscale - foof = ( - -1 - if uiscale is bui.UIScale.SMALL - else 1 if uiscale is bui.UIScale.MEDIUM else 3 + + # Gather button + h = self._width * 0.5 + h = ( + self._width * 0.5 + - play_button_width * play_button_scale * 0.5 + - hspace + - side_button_width * side_button_scale * 0.5 ) - h, v, scale = positions[self._p_index] - v = v + foof - gather_delay = ( - 0.0 - if self._t_delay_play == 0.0 - else max(0.0, self._t_delay_play + 0.1) - ) - assert play_button_width is not None - assert play_button_height is not None - this_h = h - play_button_width * 0.5 * scale - 40 * scale - this_b_width = self._button_width * 0.25 * scale - this_b_height = self._button_height * 0.82 * scale + v = button_y_offs + side_button_y_offs + + thistdelay = self._tdelay + td2 * self._t_delay_inc self._gather_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(this_h - this_b_width * 0.5, v), - size=(this_b_width, this_b_height), + position=(h - side_button_width * side_button_scale * 0.5, v), + size=(side_button_width, side_button_height), + scale=side_button_scale, autoselect=self._use_autoselect, button_type='square', label='', - transition_delay=gather_delay, + transition_delay=thistdelay, on_activate_call=self._gather_press, ) bui.textwidget( parent=self._root_widget, - position=(this_h, v + self._button_height * 0.33), + position=(h, v + side_button_height * side_button_scale * 0.25), size=(0, 0), scale=0.75, - transition_delay=gather_delay, + transition_delay=thistdelay, draw_controller=btn, color=(0.75, 1.0, 0.7), - maxwidth=self._button_width * 0.33, + maxwidth=side_button_width * side_button_scale * 0.8, text=bui.Lstr(resource='gatherWindow.titleText'), h_align='center', v_align='center', ) - icon_size = this_b_width * 0.6 + icon_size = side_button_width * side_button_scale * 0.63 bui.imagewidget( parent=self._root_widget, size=(icon_size, icon_size), draw_controller=btn, - transition_delay=gather_delay, - position=(this_h - 0.5 * icon_size, v + 0.31 * this_b_height), + transition_delay=thistdelay, + position=( + h - 0.5 * icon_size, + v + + 0.65 * side_button_height * side_button_scale + - 0.5 * icon_size, + ), texture=bui.gettexture('usersButton'), ) + thistdelay = self._tdelay + td1 * self._t_delay_inc + + h -= ( + side_button_width * side_button_scale * 0.5 + + hspace2 + + side_button_2_width * side_button_2_scale + ) + v = button_y_offs + side_button_2_y_offs + + btn = bui.buttonwidget( + parent=self._root_widget, + id='howtoplay', + position=(h, v), + autoselect=self._use_autoselect, + size=(side_button_2_width, side_button_2_height * 2.0), + button_type='square', + scale=side_button_2_scale, + label=bui.Lstr(resource=f'{self._r}.howToPlayText'), + transition_delay=thistdelay, + on_activate_call=self._howtoplay, + ) + self._how_to_play_button = btn # Play button. - h, v, scale = positions[self._p_index] - self._p_index += 1 - self._start_button = start_button = bui.buttonwidget( + h = self._width * 0.5 + v = button_y_offs + assert play_button_width is not None + assert play_button_height is not None + thistdelay = self._tdelay + td3 * self._t_delay_inc + self._play_button = start_button = bui.buttonwidget( parent=self._root_widget, - position=(h - play_button_width * 0.5 * scale, v), + position=(h - play_button_width * 0.5 * play_button_scale, v), size=(play_button_width, play_button_height), autoselect=self._use_autoselect, - scale=scale, + scale=play_button_scale, text_res_scale=2.0, label=bui.Lstr(resource='playText'), - transition_delay=self._t_delay_play, + transition_delay=thistdelay, on_activate_call=self._play_press, ) bui.containerwidget( @@ -788,346 +389,127 @@ class MainMenuWindow(bui.Window): start_button=start_button, selected_child=start_button, ) - v = v + foof - watch_delay = ( - 0.0 - if self._t_delay_play == 0.0 - else max(0.0, self._t_delay_play - 0.1) + + # self._tdelay += self._t_delay_inc + + h = ( + self._width * 0.5 + + play_button_width * play_button_scale * 0.5 + + hspace + + side_button_width * side_button_scale * 0.5 ) - this_h = h + play_button_width * 0.5 * scale + 40 * scale - this_b_width = self._button_width * 0.25 * scale - this_b_height = self._button_height * 0.82 * scale + v = button_y_offs + side_button_y_offs + thistdelay = self._tdelay + td4 * self._t_delay_inc self._watch_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(this_h - this_b_width * 0.5, v), - size=(this_b_width, this_b_height), + position=(h - side_button_width * side_button_scale * 0.5, v), + size=(side_button_width, side_button_height), + scale=side_button_scale, autoselect=self._use_autoselect, button_type='square', label='', - transition_delay=watch_delay, + transition_delay=thistdelay, on_activate_call=self._watch_press, ) bui.textwidget( parent=self._root_widget, - position=(this_h, v + self._button_height * 0.33), + position=(h, v + side_button_height * side_button_scale * 0.25), size=(0, 0), scale=0.75, - transition_delay=watch_delay, + transition_delay=thistdelay, color=(0.75, 1.0, 0.7), draw_controller=btn, - maxwidth=self._button_width * 0.33, + maxwidth=side_button_width * side_button_scale * 0.8, text=bui.Lstr(resource='watchWindow.titleText'), h_align='center', v_align='center', ) - icon_size = this_b_width * 0.55 + icon_size = side_button_width * side_button_scale * 0.63 bui.imagewidget( parent=self._root_widget, size=(icon_size, icon_size), draw_controller=btn, - transition_delay=watch_delay, - position=(this_h - 0.5 * icon_size, v + 0.33 * this_b_height), + transition_delay=thistdelay, + position=( + h - 0.5 * icon_size, + v + + 0.65 * side_button_height * side_button_scale + - 0.5 * icon_size, + ), texture=bui.gettexture('tv'), ) - if not self._in_game and enable_account_button: - this_b_width = self._button_width - h, v, scale = positions[self._p_index] - self._p_index += 1 - self._account_button = bui.buttonwidget( - parent=self._root_widget, - position=(h - this_b_width * 0.5 * scale, v), - size=(this_b_width, self._button_height), - scale=scale, - label=account_type_name, - autoselect=self._use_autoselect, - on_activate_call=account_type_call, - textcolor=account_textcolor, - icon=account_type_icon, - icon_color=account_type_icon_color, - transition_delay=self._tdelay, - enable_sound=account_type_enable_button_sound, - ) - # Scattered eggs on easter. - if ( - plus.get_v1_account_misc_read_val('easter', False) - and not self._in_game - ): - icon_size = 32 - bui.imagewidget( - parent=self._root_widget, - position=( - h - icon_size * 0.5 + 35, - v - + self._button_height * scale - - icon_size * 0.24 - + 1.5, - ), - transition_delay=self._tdelay, - size=(icon_size, icon_size), - texture=bui.gettexture('egg2'), - tilt_scale=0.0, - ) - self._tdelay += self._t_delay_inc - else: - self._account_button = None - - # How-to-play button. - h, v, scale = positions[self._p_index] - self._p_index += 1 - btn = bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width * 0.5 * scale, v), - scale=scale, - autoselect=self._use_autoselect, - size=(self._button_width, self._button_height), - label=bui.Lstr(resource=f'{self._r}.howToPlayText'), - transition_delay=self._tdelay, - on_activate_call=self._howtoplay, - ) - self._how_to_play_button = btn - - # Scattered eggs on easter. - if ( - plus.get_v1_account_misc_read_val('easter', False) - and not self._in_game - ): - icon_size = 28 - bui.imagewidget( - parent=self._root_widget, - position=( - h - icon_size * 0.5 + 30, - v + self._button_height * scale - icon_size * 0.24 + 1.5, - ), - transition_delay=self._tdelay, - size=(icon_size, icon_size), - texture=bui.gettexture('egg4'), - tilt_scale=0.0, - ) # Credits button. - self._tdelay += self._t_delay_inc - h, v, scale = positions[self._p_index] - self._p_index += 1 + thistdelay = self._tdelay + td5 * self._t_delay_inc + + h += side_button_width * side_button_scale * 0.5 + hspace2 + v = button_y_offs + side_button_2_y_offs + + if self._have_quit_button: + v += 1.17 * side_button_2_height * side_button_2_scale + self._credits_button = bui.buttonwidget( parent=self._root_widget, - position=(h - self._button_width * 0.5 * scale, v), - size=(self._button_width, self._button_height), + position=(h, v), + button_type=None if self._have_quit_button else 'square', + size=( + side_button_2_width, + side_button_2_height * (1.0 if self._have_quit_button else 2.0), + ), + scale=side_button_2_scale, autoselect=self._use_autoselect, label=bui.Lstr(resource=f'{self._r}.creditsText'), - scale=scale, - transition_delay=self._tdelay, + transition_delay=thistdelay, on_activate_call=self._credits, ) - self._tdelay += self._t_delay_inc - return h, v, scale - def _refresh_in_game( - self, positions: list[tuple[float, float, float]] - ) -> tuple[float, float, float]: - # pylint: disable=too-many-branches - # pylint: disable=too-many-locals - # pylint: disable=too-many-statements - assert bui.app.classic is not None - custom_menu_entries: list[dict[str, Any]] = [] - session = bs.get_foreground_host_session() - if session is not None: - try: - custom_menu_entries = session.get_custom_menu_entries() - for cme in custom_menu_entries: - cme_any: Any = cme # Type check may not hold true. - if ( - not isinstance(cme_any, dict) - or 'label' not in cme - or not isinstance(cme['label'], (str, bui.Lstr)) - or 'call' not in cme - or not callable(cme['call']) - ): - raise ValueError( - 'invalid custom menu entry: ' + str(cme) - ) - except Exception: - custom_menu_entries = [] - logging.exception( - 'Error getting custom menu entries for %s.', session - ) - self._width = 250.0 - self._height = 250.0 if self._input_player else 180.0 - if (self._is_demo or self._is_arcade) and self._input_player: - self._height -= 40 - if not self._have_settings_button: - self._height -= 50 - if self._connected_to_remote_player: - # In this case we have a leave *and* a disconnect button. - self._height += 50 - self._height += 50 * (len(custom_menu_entries)) - uiscale = bui.app.ui_v1.uiscale - bui.containerwidget( - edit=self._root_widget, - size=(self._width, self._height), - scale=( - 2.15 - if uiscale is bui.UIScale.SMALL - else 1.6 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - ) - h = 125.0 - v = self._height - 80.0 if self._input_player else self._height - 60 - h_offset = 0 - d_h_offset = 0 - v_offset = -50 - for _i in range(6 + len(custom_menu_entries)): - positions.append((h, v, 1.0)) - v += v_offset - h += h_offset - h_offset += d_h_offset - self._start_button = None - bui.app.classic.pause() - - # Player name if applicable. - if self._input_player: - player_name = self._input_player.getname() - h, v, scale = positions[self._p_index] - v += 35 - bui.textwidget( + self._quit_button: bui.Widget | None + if self._have_quit_button: + v -= 1.1 * side_button_2_height * side_button_2_scale + # Nudge this a tiny bit right so we can press right from the + # credits button to get to it. + self._quit_button = quit_button = bui.buttonwidget( parent=self._root_widget, - position=(h - self._button_width / 2, v), - size=(self._button_width, self._button_height), - color=(1, 1, 1, 0.5), - scale=0.7, - h_align='center', - text=bui.Lstr(value=player_name), - ) - else: - player_name = '' - h, v, scale = positions[self._p_index] - self._p_index += 1 - btn = bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width / 2, v), - size=(self._button_width, self._button_height), - scale=scale, - label=bui.Lstr(resource=f'{self._r}.resumeText'), - autoselect=self._use_autoselect, - on_activate_call=self._resume, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) - - # Add any custom options defined by the current game. - for entry in custom_menu_entries: - h, v, scale = positions[self._p_index] - self._p_index += 1 - - # Ask the entry whether we should resume when we call - # it (defaults to true). - resume = bool(entry.get('resume_on_call', True)) - - if resume: - call = bui.Call(self._resume_and_call, entry['call']) - else: - call = bui.Call(entry['call'], bui.WeakCall(self._resume)) - - bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width / 2, v), - size=(self._button_width, self._button_height), - scale=scale, - on_activate_call=call, - label=entry['label'], autoselect=self._use_autoselect, - ) - # Add a 'leave' button if the menu-owner has a player. - if (self._input_player or self._connected_to_remote_player) and not ( - self._is_demo or self._is_arcade - ): - h, v, scale = positions[self._p_index] - self._p_index += 1 - btn = bui.buttonwidget( - parent=self._root_widget, - position=(h - self._button_width / 2, v), - size=(self._button_width, self._button_height), - scale=scale, - on_activate_call=self._leave, - label='', - autoselect=self._use_autoselect, - ) - - if ( - player_name != '' - and player_name[0] != '<' - and player_name[-1] != '>' - ): - txt = bui.Lstr( - resource=f'{self._r}.justPlayerText', - subs=[('${NAME}', player_name)], - ) - else: - txt = bui.Lstr(value=player_name) - bui.textwidget( - parent=self._root_widget, - position=( - h, - v - + self._button_height - * (0.64 if player_name != '' else 0.5), + position=(h + 4.0, v), + size=(side_button_2_width, side_button_2_height), + scale=side_button_2_scale, + label=bui.Lstr( + resource=self._r + + ( + '.quitText' + if 'Mac' in app.classic.legacy_user_agent_string + else '.exitGameText' + ) ), - size=(0, 0), - text=bui.Lstr(resource=f'{self._r}.leaveGameText'), - scale=(0.83 if player_name != '' else 1.0), - color=(0.75, 1.0, 0.7), - h_align='center', - v_align='center', - draw_controller=btn, - maxwidth=self._button_width * 0.9, + on_activate_call=self._quit, + transition_delay=thistdelay, ) - bui.textwidget( - parent=self._root_widget, - position=(h, v + self._button_height * 0.27), - size=(0, 0), - text=txt, - color=(0.75, 1.0, 0.7), - h_align='center', - v_align='center', - draw_controller=btn, - scale=0.45, - maxwidth=self._button_width * 0.9, - ) - return h, v, scale - def _change_replay_speed(self, offs: int) -> None: - if not self._replay_speed_text: - if bui.do_once(): - print('_change_replay_speed called without widget') - return - bs.set_replay_speed_exponent(bs.get_replay_speed_exponent() + offs) - actual_speed = pow(2.0, bs.get_replay_speed_exponent()) - bui.textwidget( - edit=self._replay_speed_text, - text=bui.Lstr( - resource='watchWindow.playbackSpeedText', - subs=[('${SPEED}', str(actual_speed))], - ), - ) - - def _pause_or_resume_replay(self) -> None: - if bs.is_replay_paused(): - bs.resume_replay() - bui.buttonwidget( - edit=self._pause_resume_button, - label=bui.charstr(bui.SpecialChar.PAUSE_BUTTON), + bui.containerwidget( + edit=self._root_widget, cancel_button=quit_button ) + # self._tdelay += self._t_delay_inc else: - bs.pause_replay() - bui.buttonwidget( - edit=self._pause_resume_button, - label=bui.charstr(bui.SpecialChar.PLAY_BUTTON), - ) + self._quit_button = None + + # If we're not in-game, have no quit button, and this is + # android, we want back presses to quit our activity. + if app.classic.platform == 'android': + + def _do_quit() -> None: + bui.quit(confirm=True, quit_type=bui.QuitType.BACK) + + bui.containerwidget( + edit=self._root_widget, on_cancel_call=_do_quit + ) def _quit(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.confirm import QuitWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return # Note: Normally we should go through bui.quit(confirm=True) but @@ -1135,334 +517,115 @@ class MainMenuWindow(bui.Window): # button. QuitWindow(origin_widget=self._quit_button) - def _demo_menu_press(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.kiosk import KioskWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - KioskWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - - def _show_account_window(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.account.settings import AccountSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AccountSettingsWindow( - origin_widget=self._account_button - ).get_root_widget(), - from_window=self._root_widget, - ) - - def _on_store_pressed(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.store.browser import StoreBrowserWindow - from bauiv1lib.account import show_sign_in_prompt - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - plus = bui.app.plus - assert plus is not None - - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - StoreBrowserWindow( - origin_widget=self._store_button - ).get_root_widget(), - from_window=self._root_widget, - ) - - def _is_benchmark(self) -> bool: - session = bs.get_foreground_host_session() - return getattr(session, 'benchmark_type', None) == 'cpu' or ( - bui.app.classic is not None - and bui.app.classic.stress_test_update_timer is not None - ) - - def _confirm_end_game(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.confirm import ConfirmWindow - - # FIXME: Currently we crash calling this on client-sessions. - - # Select cancel by default; this occasionally gets called by accident - # in a fit of button mashing and this will help reduce damage. - ConfirmWindow( - bui.Lstr(resource=f'{self._r}.exitToMenuText'), - self._end_game, - cancel_is_selected=True, - ) - - def _confirm_end_test(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.confirm import ConfirmWindow - - # Select cancel by default; this occasionally gets called by accident - # in a fit of button mashing and this will help reduce damage. - ConfirmWindow( - bui.Lstr(resource=f'{self._r}.exitToMenuText'), - self._end_game, - cancel_is_selected=True, - ) - - def _confirm_end_replay(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.confirm import ConfirmWindow - - # Select cancel by default; this occasionally gets called by accident - # in a fit of button mashing and this will help reduce damage. - ConfirmWindow( - bui.Lstr(resource=f'{self._r}.exitToMenuText'), - self._end_game, - cancel_is_selected=True, - ) - - def _confirm_leave_party(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.confirm import ConfirmWindow - - # Select cancel by default; this occasionally gets called by accident - # in a fit of button mashing and this will help reduce damage. - ConfirmWindow( - bui.Lstr(resource=f'{self._r}.leavePartyConfirmText'), - self._leave_party, - cancel_is_selected=True, - ) - - def _leave_party(self) -> None: - bs.disconnect_from_host() - - def _end_game(self) -> None: - assert bui.app.classic is not None - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.app.classic.return_to_main_menu_session_gracefully(reset_ui=False) - - def _leave(self) -> None: - if self._input_player: - self._input_player.remove_from_game() - elif self._connected_to_remote_player: - if self._input_device: - self._input_device.detach_from_player() - self._resume() - def _credits(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.creditslist import CreditsListWindow + from bauiv1lib.credits import CreditsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - CreditsListWindow( - origin_widget=self._credits_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + CreditsWindow(origin_widget=self._credits_button), ) def _howtoplay(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.helpui import HelpWindow + from bauiv1lib.help import HelpWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - HelpWindow( - main_menu=True, origin_widget=self._how_to_play_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + HelpWindow(origin_widget=self._how_to_play_button), ) - def _settings(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.allsettings import AllSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AllSettingsWindow( - origin_widget=self._settings_button - ).get_root_widget(), - from_window=self._root_widget, - ) - - def _resume_and_call(self, call: Callable[[], Any]) -> None: - self._resume() - call() - - def _do_game_service_press(self) -> None: - self._save_state() - if bui.app.plus is not None: - bui.app.plus.show_game_service_ui() - else: - logging.warning( - 'plus feature-set is required to show game service ui' - ) - def _save_state(self) -> None: - # Don't do this for the in-game menu. - if self._in_game: - return - assert bui.app.classic is not None - ui = bui.app.ui_v1 - sel = self._root_widget.get_selected_child() - if sel == self._start_button: - ui.main_menu_selection = 'Start' - elif sel == self._gather_button: - ui.main_menu_selection = 'Gather' - elif sel == self._watch_button: - ui.main_menu_selection = 'Watch' - elif sel == self._how_to_play_button: - ui.main_menu_selection = 'HowToPlay' - elif sel == self._credits_button: - ui.main_menu_selection = 'Credits' - elif sel == self._settings_button: - ui.main_menu_selection = 'Settings' - elif sel == self._account_button: - ui.main_menu_selection = 'Account' - elif sel == self._store_button: - ui.main_menu_selection = 'Store' - elif sel == self._quit_button: - ui.main_menu_selection = 'Quit' - elif sel == self._demo_menu_button: - ui.main_menu_selection = 'DemoMenu' - else: - print('unknown widget in main menu store selection:', sel) - ui.main_menu_selection = 'Start' + try: + sel = self._root_widget.get_selected_child() + if sel == self._play_button: + sel_name = 'Start' + elif sel == self._gather_button: + sel_name = 'Gather' + elif sel == self._watch_button: + sel_name = 'Watch' + elif sel == self._how_to_play_button: + sel_name = 'HowToPlay' + elif sel == self._credits_button: + sel_name = 'Credits' + elif sel == self._quit_button: + sel_name = 'Quit' + elif sel == self._demo_menu_button: + sel_name = 'DemoMenu' + else: + print(f'Unknown widget in main menu selection: {sel}.') + sel_name = 'Start' + bui.app.ui_v1.window_states[type(self)] = {'sel_name': sel_name} + except Exception: + logging.exception('Error saving state for %s.', self) def _restore_state(self) -> None: - # pylint: disable=too-many-branches + try: - # Don't do this for the in-game menu. - if self._in_game: - return - assert bui.app.classic is not None - sel_name = bui.app.ui_v1.main_menu_selection - sel: bui.Widget | None - if sel_name is None: - sel_name = 'Start' - if sel_name == 'HowToPlay': - sel = self._how_to_play_button - elif sel_name == 'Gather': - sel = self._gather_button - elif sel_name == 'Watch': - sel = self._watch_button - elif sel_name == 'Credits': - sel = self._credits_button - elif sel_name == 'Settings': - sel = self._settings_button - elif sel_name == 'Account': - sel = self._account_button - elif sel_name == 'Store': - sel = self._store_button - elif sel_name == 'Quit': - sel = self._quit_button - elif sel_name == 'DemoMenu': - sel = self._demo_menu_button - else: - sel = self._start_button - if sel is not None: - bui.containerwidget(edit=self._root_widget, selected_child=sel) + sel: bui.Widget | None + + sel_name = bui.app.ui_v1.window_states.get(type(self), {}).get( + 'sel_name' + ) + assert isinstance(sel_name, (str, type(None))) + if sel_name is None: + sel_name = 'Start' + if sel_name == 'HowToPlay': + sel = self._how_to_play_button + elif sel_name == 'Gather': + sel = self._gather_button + elif sel_name == 'Watch': + sel = self._watch_button + elif sel_name == 'Credits': + sel = self._credits_button + elif sel_name == 'Quit': + sel = self._quit_button + elif sel_name == 'DemoMenu': + sel = self._demo_menu_button + else: + sel = self._play_button + if sel is not None: + bui.containerwidget(edit=self._root_widget, selected_child=sel) + + except Exception: + logging.exception('Error restoring state for %s.', self) def _gather_press(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.gather import GatherWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - GatherWindow(origin_widget=self._gather_button).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + GatherWindow(origin_widget=self._gather_button) ) def _watch_press(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.watch import WatchWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - WatchWindow(origin_widget=self._watch_button).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + WatchWindow(origin_widget=self._watch_button), ) def _play_press(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.play import PlayWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - - assert bui.app.classic is not None - bui.app.ui_v1.selecting_private_party_playlist = False - bui.app.ui_v1.set_main_menu_window( - PlayWindow(origin_widget=self._start_button).get_root_widget(), - from_window=self._root_widget, - ) - - def _resume(self) -> None: - assert bui.app.classic is not None - bui.app.classic.resume() - # if self._root_widget: - # bui.containerwidget(edit=self._root_widget, - # transition='out_right') - bui.app.ui_v1.clear_main_menu_window(transition='out_right') - - # If there's callbacks waiting for this window to go away, call them. - for call in bui.app.ui_v1.main_menu_resume_callbacks: - call() - del bui.app.ui_v1.main_menu_resume_callbacks[:] + self.main_window_replace(PlayWindow(origin_widget=self._play_button)) diff --git a/dist/ba_data/python/bauiv1lib/party.py b/dist/ba_data/python/bauiv1lib/party.py index 199db42..effa450 100644 --- a/dist/ba_data/python/bauiv1lib/party.py +++ b/dist/ba_data/python/bauiv1lib/party.py @@ -48,15 +48,15 @@ class PartyWindow(bui.Window): on_outside_click_call=self.close_with_sound, scale_origin_stack_offset=origin, scale=( - 2.0 + 1.8 if uiscale is bui.UIScale.SMALL - else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 1.3 if uiscale is bui.UIScale.MEDIUM else 0.9 ), stack_offset=( - (0, -10) + (200, -10) if uiscale is bui.UIScale.SMALL else ( - (240, 0) if uiscale is bui.UIScale.MEDIUM else (330, 20) + (260, 0) if uiscale is bui.UIScale.MEDIUM else (370, 60) ) ), ) @@ -112,9 +112,22 @@ class PartyWindow(bui.Window): self._empty_str = bui.textwidget( parent=self._root_widget, - scale=0.75, + scale=0.6, size=(0, 0), - position=(self._width * 0.5, self._height - 65), + # color=(0.5, 1.0, 0.5), + shadow=0.3, + position=(self._width * 0.5, self._height - 57), + maxwidth=self._width * 0.85, + h_align='center', + v_align='center', + ) + self._empty_str_2 = bui.textwidget( + parent=self._root_widget, + scale=0.5, + size=(0, 0), + color=(0.5, 1.0, 0.5), + shadow=0.1, + position=(self._width * 0.5, self._height - 75), maxwidth=self._width * 0.85, h_align='center', v_align='center', @@ -126,6 +139,7 @@ class PartyWindow(bui.Window): size=(self._scroll_width, self._height - 200), position=(30, 80), color=(0.4, 0.6, 0.3), + border_opacity=0.6, ) self._columnwidget = bui.columnwidget( parent=self._scrollwidget, border=2, left_border=-200, margin=0 @@ -296,6 +310,10 @@ class PartyWindow(bui.Window): edit=self._empty_str, text=bui.Lstr(resource=f'{self._r}.emptyText'), ) + bui.textwidget( + edit=self._empty_str_2, + text=bui.Lstr(resource='gatherWindow.descriptionShortText'), + ) bui.scrollwidget( edit=self._scrollwidget, size=( @@ -436,6 +454,7 @@ class PartyWindow(bui.Window): ) ) bui.textwidget(edit=self._empty_str, text='') + bui.textwidget(edit=self._empty_str_2, text='') bui.scrollwidget( edit=self._scrollwidget, size=( diff --git a/dist/ba_data/python/bauiv1lib/partyqueue.py b/dist/ba_data/python/bauiv1lib/partyqueue.py index ef51429..dbcfd7a 100644 --- a/dist/ba_data/python/bauiv1lib/partyqueue.py +++ b/dist/ba_data/python/bauiv1lib/partyqueue.py @@ -33,6 +33,7 @@ class PartyQueueWindow(bui.Window): account_id: str, name: str, ): + # pylint: disable=too-many-positional-arguments self.claimed = False self._line_left = parent.get_line_left() self._line_width = parent.get_line_width() @@ -223,7 +224,6 @@ class PartyQueueWindow(bui.Window): def __init__(self, queue_id: str, address: str, port: int): assert bui.app.classic is not None - bui.app.ui_v1.have_party_queue_window = True self._address = address self._port = port self._queue_id = queue_id @@ -329,8 +329,6 @@ class PartyQueueWindow(bui.Window): plus = bui.app.plus assert plus is not None - assert bui.app.classic is not None - bui.app.ui_v1.have_party_queue_window = False plus.add_v1_account_transaction( {'type': 'PARTY_QUEUE_REMOVE', 'q': self._queue_id} ) @@ -354,12 +352,12 @@ class PartyQueueWindow(bui.Window): self, account_id: str | None, origin_widget: bui.Widget ) -> None: """A dude was clicked so we should show his account info.""" - from bauiv1lib.account import viewer + from bauiv1lib.account.viewer import AccountViewerWindow if account_id is None: bui.getsound('error').play() return - viewer.AccountViewerWindow( + AccountViewerWindow( account_id=account_id, position=origin_widget.get_screen_space_center(), ) @@ -554,6 +552,11 @@ class PartyQueueWindow(bui.Window): self._last_connect_attempt_time is None or now - self._last_connect_attempt_time > 10.0 ): + + # Store UI location to return to when done. + if bs.app.classic is not None: + bs.app.classic.save_ui_state() + bs.connect_to_party( address=self._address, port=self._port, @@ -563,19 +566,24 @@ class PartyQueueWindow(bui.Window): def on_boost_press(self) -> None: """Boost was pressed.""" - from bauiv1lib import account - from bauiv1lib import gettickets + from bauiv1lib.account.signin import show_sign_in_prompt + + # from bauiv1lib import gettickets plus = bui.app.plus assert plus is not None if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() + show_sign_in_prompt() return if plus.get_v1_account_ticket_count() < self._boost_tickets: bui.getsound('error').play() - gettickets.show_get_tickets_prompt() + bui.screenmessage( + bui.Lstr(resource='notEnoughTicketsText'), + color=(1, 0, 0), + ) + # gettickets.show_get_tickets_prompt() return bui.getsound('laserReverse').play() diff --git a/dist/ba_data/python/bauiv1lib/play.py b/dist/ba_data/python/bauiv1lib/play.py index f33ffe6..647a9d8 100644 --- a/dist/ba_data/python/bauiv1lib/play.py +++ b/dist/ba_data/python/bauiv1lib/play.py @@ -5,116 +5,156 @@ from __future__ import annotations import logging +from typing import override, TYPE_CHECKING import bascenev1 as bs import bauiv1 as bui +if TYPE_CHECKING: + from bauiv1 import MainWindowState -class PlayWindow(bui.Window): + +class PlaylistSelectContext: + """For using PlayWindow to select a playlist instead of running game.""" + + back_state: MainWindowState | None = None + + +class PlayWindow(bui.MainWindow): """Window for selecting overall play type.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, + playlist_select_context: PlaylistSelectContext | None = None, ): # pylint: disable=too-many-statements # pylint: disable=too-many-locals - import threading # Preload some modules we use in a background thread so we won't # have a visual hitch when the user taps them. - threading.Thread(target=self._preload_modules).start() + bui.app.threadpool.submit_no_wait(self._preload_modules) - # We can currently be used either for main menu duty or for selecting - # playlists (should make this more elegant/general). - assert bui.app.classic is not None - self._is_main_menu = not bui.app.ui_v1.selecting_private_party_playlist + classic = bui.app.classic + assert classic is not None + + self._playlist_select_context = playlist_select_context uiscale = bui.app.ui_v1.uiscale - width = 1100 if uiscale is bui.UIScale.SMALL else 800 - x_offs = 150 if uiscale is bui.UIScale.SMALL else 0 - height = 550 - button_width = 400 + width = 1300 if uiscale is bui.UIScale.SMALL else 1000 + height = 1000 if uiscale is bui.UIScale.SMALL else 550 + + button_width = 400.0 + button_height = 360.0 + button_spacing = 3.0 - scale_origin: tuple[float, float] | None if origin_widget is not None: + + # Need to store this ourself since we can function as a + # non-main window. self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' else: self._transition_out = 'out_right' - scale_origin = None self._r = 'playWindow' + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + safesize = bui.get_virtual_safe_area_size() + + # We're a generally widescreen shaped window, so bump our + # overall scale up a bit when screen width is wider than safe + # bounds to take advantage of the extra space. + smallscale = min(1.6, 1.35 * screensize[0] / safesize[0]) + + scale = ( + smallscale + if uiscale is bui.UIScale.SMALL + else 0.9 if uiscale is bui.UIScale.MEDIUM else 0.8 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_height = min(height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - toolbar_visibility='menu_full', - scale_origin_stack_offset=scale_origin, - scale=( - 1.6 - if uiscale is bui.UIScale.SMALL - else 0.9 if uiscale is bui.UIScale.MEDIUM else 0.8 + toolbar_visibility=( + 'menu_full' + if playlist_select_context is None + else 'menu_minimal' ), - stack_offset=(0, 0) if uiscale is bui.UIScale.SMALL else (0, 0), - ) - ) - self._back_button = back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(55 + x_offs, height - 132), - size=(120, 60), - scale=1.1, - text_res_scale=1.5, - text_scale=1.2, - autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - txt = bui.textwidget( + self._back_button: bui.Widget | None + if uiscale is bui.UIScale.SMALL: + self._back_button = None + bui.containerwidget( + edit=self._root_widget, + on_cancel_call=self.main_window_back, + ) + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(50, yoffs - 100), + size=(60, 60), + scale=1.1, + text_res_scale=1.5, + text_scale=1.2, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) + + bui.textwidget( parent=self._root_widget, - position=(width * 0.5, height - 101), - # position=(width * 0.5, height - - # (101 if main_menu else 61)), + position=( + width * 0.5, + yoffs - (50 if uiscale is bui.UIScale.SMALL else 70), + ), size=(0, 0), text=bui.Lstr( resource=( (f'{self._r}.titleText') - if self._is_main_menu + if self._playlist_select_context is None else 'playlistsText' ) ), - scale=1.7, + scale=1.2 if uiscale is bui.UIScale.SMALL else 1.7, res_scale=2.0, - maxwidth=400, + maxwidth=250, color=bui.app.ui_v1.heading_color, h_align='center', v_align='center', ) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: - bui.textwidget(edit=txt, text='') - - v = height - (110 if self._is_main_menu else 90) - v -= 100 + scl = 0.75 if self._playlist_select_context is None else 0.68 + v = height * 0.5 - button_height * scl * 0.5 - 20.0 clr = (0.6, 0.7, 0.6, 1.0) - v -= 280 if self._is_main_menu else 180 - v += ( - 30 - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL - else 0 + + bcount = 3 if self._playlist_select_context is None else 2 + + total_b_width = ( + bcount * button_width * scl + (bcount - 1) * button_spacing ) - hoffs = x_offs + 80 if self._is_main_menu else x_offs - 100 - scl = 1.13 if self._is_main_menu else 0.68 + hoffs = (width - total_b_width) * 0.5 self._lineup_tex = bui.gettexture('playerLineup') angry_computer_transparent_mesh = bui.getmesh( @@ -136,24 +176,23 @@ class PlayWindow(bui.Window): self._coop_button: bui.Widget | None = None - # Only show coop button in main-menu variant. - if self._is_main_menu: + # Only show coop button in regular variant. + if self._playlist_select_context is None: self._coop_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(hoffs, v + (scl * 15)), + position=(hoffs, v), size=( scl * button_width, - scl * 300, + scl * button_height, ), extra_touch_border_scale=0.1, autoselect=True, label='', button_type='square', - text_scale=1.13, on_activate_call=self._coop, ) - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: bui.widget( edit=btn, left_widget=bui.get_special_widget('back_button'), @@ -220,7 +259,7 @@ class PlayWindow(bui.Window): h_align='center', v_align='center', color=(0.7, 0.9, 0.7, 1.0), - scale=scl * 2.3, + scale=scl * 1.5, ) bui.textwidget( @@ -237,32 +276,22 @@ class PlayWindow(bui.Window): color=clr, ) - scl = 0.5 if self._is_main_menu else 0.68 - hoffs += 440 if self._is_main_menu else 216 - v += 180 if self._is_main_menu else -68 + hoffs += scl * button_width + button_spacing self._teams_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(hoffs, v + (scl * 15 if self._is_main_menu else 0)), + position=(hoffs, v), size=( scl * button_width, - scl * (300 if self._is_main_menu else 360), + scl * button_height, ), extra_touch_border_scale=0.1, autoselect=True, label='', button_type='square', - text_scale=1.13, on_activate_call=self._team_tourney, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - up_widget=bui.get_special_widget('tickets_plus_button'), - right_widget=bui.get_special_widget('party_button'), - ) - xxx = -14 self._draw_dude( 2, @@ -352,7 +381,7 @@ class PlayWindow(bui.Window): h_align='center', v_align='center', color=(0.7, 0.9, 0.7, 1.0), - scale=scl * 2.3, + scale=scl * 1.5, ) bui.textwidget( parent=self._root_widget, @@ -363,26 +392,21 @@ class PlayWindow(bui.Window): h_align='center', v_align='center', res_scale=1.5, - scale=0.9 * scl, + scale=0.83 * scl, flatness=1.0, maxwidth=scl * button_width * 0.7, color=clr, ) - hoffs += 0 if self._is_main_menu else 300 - v -= 155 if self._is_main_menu else 0 + hoffs += scl * button_width + button_spacing self._free_for_all_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(hoffs, v + (scl * 15 if self._is_main_menu else 0)), - size=( - scl * button_width, - scl * (300 if self._is_main_menu else 360), - ), + position=(hoffs, v), + size=(scl * button_width, scl * button_height), extra_touch_border_scale=0.1, autoselect=True, label='', button_type='square', - text_scale=1.13, on_activate_call=self._free_for_all, ) @@ -473,7 +497,7 @@ class PlayWindow(bui.Window): h_align='center', v_align='center', color=(0.7, 0.9, 0.7, 1.0), - scale=scl * 1.9, + scale=scl * 1.5, ) bui.textwidget( parent=self._root_widget, @@ -483,38 +507,53 @@ class PlayWindow(bui.Window): text=bui.Lstr(resource=f'{self._r}.twoToEightPlayersText'), h_align='center', v_align='center', - scale=0.9 * scl, + scale=0.83 * scl, flatness=1.0, maxwidth=scl * button_width * 0.7, color=clr, ) - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: - back_button.delete() + if uiscale is bui.UIScale.SMALL: bui.containerwidget( edit=self._root_widget, - on_cancel_call=self._back, selected_child=( self._coop_button - if self._is_main_menu + if self._playlist_select_context is None else self._teams_button ), ) else: - bui.buttonwidget(edit=back_button, on_activate_call=self._back) bui.containerwidget( edit=self._root_widget, - cancel_button=back_button, selected_child=( self._coop_button - if self._is_main_menu + if self._playlist_select_context is None else self._teams_button ), ) self._restore_state() - # noinspection PyUnresolvedReferences + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull any values out of self here; if we do it in the lambda + # we'll keep our window alive inadvertantly. + playlist_select_context = self._playlist_select_context + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + playlist_select_context=playlist_select_context, + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + @staticmethod def _preload_modules() -> None: """Preload modules we use; avoids hitches (called in bg thread).""" @@ -523,45 +562,13 @@ class PlayWindow(bui.Window): import bauiv1lib.coop.browser as _unused3 import bauiv1lib.playlist.browser as _unused4 - def _back(self) -> None: - # pylint: disable=cyclic-import - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - if self._is_main_menu: - from bauiv1lib.mainmenu import MainMenuWindow - - self._save_state() - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - else: - from bauiv1lib.gather import GatherWindow - - self._save_state() - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - GatherWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - def _coop(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.account import show_sign_in_prompt + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.coop.browser import CoopBrowserWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return plus = bui.app.plus @@ -570,51 +577,41 @@ class PlayWindow(bui.Window): if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - CoopBrowserWindow( - origin_widget=self._coop_button - ).get_root_widget(), - from_window=self._root_widget, + + self.main_window_replace( + CoopBrowserWindow(origin_widget=self._coop_button) ) def _team_tourney(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.playlist.browser import PlaylistBrowserWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( + self.main_window_replace( PlaylistBrowserWindow( - origin_widget=self._teams_button, sessiontype=bs.DualTeamSession - ).get_root_widget(), - from_window=self._root_widget, + origin_widget=self._teams_button, + sessiontype=bs.DualTeamSession, + playlist_select_context=self._playlist_select_context, + ) ) def _free_for_all(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.playlist.browser import PlaylistBrowserWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not currently in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( + self.main_window_replace( PlaylistBrowserWindow( origin_widget=self._free_for_all_button, sessiontype=bs.FreeForAllSession, - ).get_root_widget(), - from_window=self._root_widget, + playlist_select_context=self._playlist_select_context, + ) ) def _draw_dude( @@ -627,6 +624,7 @@ class PlayWindow(bui.Window): position: tuple[float, float], color: tuple[float, float, float], ) -> None: + # pylint: disable=too-many-positional-arguments h_extra = -100 v_extra = 130 eye_color = ( @@ -763,7 +761,7 @@ class PlayWindow(bui.Window): sel = self._coop_button elif sel_name == 'Free-for-All Games': sel = self._free_for_all_button - elif sel_name == 'Back': + elif sel_name == 'Back' and self._back_button is not None: sel = self._back_button else: sel = ( diff --git a/dist/ba_data/python/bauiv1lib/playlist/addgame.py b/dist/ba_data/python/bauiv1lib/playlist/addgame.py index 317c9e9..0173b82 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/addgame.py +++ b/dist/ba_data/python/bauiv1lib/playlist/addgame.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bascenev1 as bs import bauiv1 as bui @@ -13,55 +13,78 @@ if TYPE_CHECKING: from bauiv1lib.playlist.editcontroller import PlaylistEditController -class PlaylistAddGameWindow(bui.Window): +class PlaylistAddGameWindow(bui.MainWindow): """Window for selecting a game type to add to a playlist.""" def __init__( self, editcontroller: PlaylistEditController, - transition: str = 'in_right', + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): self._editcontroller = editcontroller self._r = 'addGameWindow' assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 750 if uiscale is bui.UIScale.SMALL else 650 - x_inset = 50 if uiscale is bui.UIScale.SMALL else 0 + self._width = 900 if uiscale is bui.UIScale.SMALL else 650 + self._height = ( - 346 + 1200.0 if uiscale is bui.UIScale.SMALL - else 380 if uiscale is bui.UIScale.MEDIUM else 440 + else 450.0 if uiscale is bui.UIScale.MEDIUM else 500.0 ) - top_extra = 30 if uiscale is bui.UIScale.SMALL else 20 self._scroll_width = 210 + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.4 + if uiscale is bui.UIScale.SMALL + else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 50, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 5.0 + x_inset = 0.5 * self._width - 0.5 * target_width + super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - scale=( - 2.17 - if uiscale is bui.UIScale.SMALL - else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=(0, 1) if uiscale is bui.UIScale.SMALL else (0, 0), - ) + size=(self._width, self._height), + scale=scale, + toolbar_visibility='menu_minimal', + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._back_button = bui.buttonwidget( - parent=self._root_widget, - position=(58 + x_inset, self._height - 53), - size=(165, 70), - scale=0.75, - text_scale=1.2, - label=bui.Lstr(resource='backText'), - autoselect=True, - button_type='back', - on_activate_call=self._back, - ) + if uiscale is bui.UIScale.SMALL: + self._back_button = bui.get_special_widget('back_button') + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(58 + x_inset, yoffs - 53), + size=(60, 48), + label=bui.charstr(bui.SpecialChar.BACK), + autoselect=True, + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + self._select_button = select_button = bui.buttonwidget( parent=self._root_widget, - position=(self._width - (172 + x_inset), self._height - 50), + position=( + x_inset + target_width - 172, + yoffs - 50, + ), autoselect=True, size=(160, 60), scale=0.75, @@ -70,15 +93,14 @@ class PlaylistAddGameWindow(bui.Window): on_activate_call=self._add, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=select_button, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=select_button, + right_widget=bui.get_special_widget('squad_button'), + ) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 28), + position=(self._width * 0.5, yoffs - 28), size=(0, 0), scale=1.0, text=bui.Lstr(resource=f'{self._r}.titleText'), @@ -87,7 +109,7 @@ class PlaylistAddGameWindow(bui.Window): maxwidth=250, v_align='center', ) - v = self._height - 64 + v = yoffs - 64 self._selected_title_text = bui.textwidget( parent=self._root_widget, @@ -111,15 +133,16 @@ class PlaylistAddGameWindow(bui.Window): h_align='left', ) - scroll_height = self._height - 100 + scroll_height = target_height - 60 - v = self._height - 60 + v = yoffs - 60 self._scrollwidget = bui.scrollwidget( parent=self._root_widget, position=(x_inset + 61, v - scroll_height), size=(self._scroll_width, scroll_height), highlight=False, + border_opacity=0.4, ) bui.widget( edit=self._scrollwidget, @@ -130,11 +153,18 @@ class PlaylistAddGameWindow(bui.Window): self._column: bui.Widget | None = None v -= 35 - bui.containerwidget( - edit=self._root_widget, - cancel_button=self._back_button, - start_button=select_button, - ) + + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + bui.containerwidget( + edit=self._root_widget, + cancel_button=self._back_button, + ) + bui.containerwidget(edit=self._root_widget, start_button=select_button) + self._selected_game_type: type[bs.GameActivity] | None = None bui.containerwidget( @@ -154,6 +184,23 @@ class PlaylistAddGameWindow(bui.Window): # game loading is complete. self._refresh() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Avoid dereferencing self from the lambda or we'll keep + # ourself alive indefinitely. + editcontroller = self._editcontroller + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + editcontroller=editcontroller, + ) + ) + def _on_game_types_loaded( self, gametypes: list[type[bs.GameActivity]] ) -> None: @@ -225,30 +272,35 @@ class PlaylistAddGameWindow(bui.Window): ) def _on_get_more_games_press(self) -> None: - from bauiv1lib.account import show_sign_in_prompt + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.store.browser import StoreBrowserWindow + # No-op if we're not in control. + if not self.main_window_has_control(): + return + plus = bui.app.plus assert plus is not None if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return - StoreBrowserWindow( - modal=True, - show_tab=StoreBrowserWindow.TabID.MINIGAMES, - on_close_call=self._on_store_close, - origin_widget=self._get_more_games_button, - ) - def _on_store_close(self) -> None: - self._refresh(select_get_more_games_button=True) + self.main_window_replace( + StoreBrowserWindow( + show_tab=StoreBrowserWindow.TabID.MINIGAMES, + origin_widget=self._get_more_games_button, + minimal_toolbars=True, + ) + ) def _add(self) -> None: bui.lock_all_input() # Make sure no more commands happen. bui.apptimer(0.1, bui.unlock_all_input) assert self._selected_game_type is not None - self._editcontroller.add_game_type_selected(self._selected_game_type) + self._editcontroller.add_game_type_selected( + self._selected_game_type, from_window=self + ) def _set_selected_game_type(self, gametype: type[bs.GameActivity]) -> None: self._selected_game_type = gametype @@ -261,6 +313,3 @@ class PlaylistAddGameWindow(bui.Window): self._editcontroller.get_session_type() ), ) - - def _back(self) -> None: - self._editcontroller.add_game_cancelled() diff --git a/dist/ba_data/python/bauiv1lib/playlist/browser.py b/dist/ba_data/python/bauiv1lib/playlist/browser.py index f8b1a73..917289b 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/browser.py +++ b/dist/ba_data/python/bauiv1lib/playlist/browser.py @@ -4,15 +4,19 @@ from __future__ import annotations -import logging import copy import math +import logging +from typing import override, TYPE_CHECKING import bascenev1 as bs import bauiv1 as bui +if TYPE_CHECKING: + from bauiv1lib.play import PlaylistSelectContext -class PlaylistBrowserWindow(bui.Window): + +class PlaylistBrowserWindow(bui.MainWindow): """Window for starting teams games.""" def __init__( @@ -20,29 +24,15 @@ class PlaylistBrowserWindow(bui.Window): sessiontype: type[bs.Session], transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, + playlist_select_context: PlaylistSelectContext | None = None, ): - # pylint: disable=too-many-statements # pylint: disable=cyclic-import from bauiv1lib.playlist import PlaylistTypeVars - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - - assert bui.app.classic is not None - # Store state for when we exit the next game. if issubclass(sessiontype, bs.DualTeamSession): - bui.app.ui_v1.set_main_menu_location('Team Game Select') bui.set_analytics_screen('Teams Window') elif issubclass(sessiontype, bs.FreeForAllSession): - bui.app.ui_v1.set_main_menu_location('Free-for-All Game Select') bui.set_analytics_screen('FreeForAll Window') else: raise TypeError(f'Invalid sessiontype: {sessiontype}.') @@ -53,6 +43,7 @@ class PlaylistBrowserWindow(bui.Window): self._customize_button: bui.Widget | None = None self._sub_width: float | None = None self._sub_height: float | None = None + self._playlist_select_context = playlist_select_context self._ensure_standard_playlists_exist() @@ -62,104 +53,143 @@ class PlaylistBrowserWindow(bui.Window): ) uiscale = bui.app.ui_v1.uiscale - self._width = 1100.0 if uiscale is bui.UIScale.SMALL else 800.0 - x_inset = 150 if uiscale is bui.UIScale.SMALL else 0 - self._height = ( - 480 + self._width = ( + 1100.0 if uiscale is bui.UIScale.SMALL - else 510 if uiscale is bui.UIScale.MEDIUM else 580 + else 800.0 if uiscale is bui.UIScale.MEDIUM else 1040 + ) + self._height = ( + 600 + if uiscale is bui.UIScale.SMALL + else 550 if uiscale is bui.UIScale.MEDIUM else 700 ) - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.85 + if uiscale is bui.UIScale.SMALL + else 1.0 if uiscale is bui.UIScale.MEDIUM else 0.8 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 100, screensize[0] / scale) + target_height = min(self._height - 100, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 31 + scroll_bottom = yoffs - 60 - self._scroll_height super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - toolbar_visibility='menu_full', - scale_origin_stack_offset=scale_origin, - scale=( - 1.69 - if uiscale is bui.UIScale.SMALL - else 1.05 if uiscale is bui.UIScale.MEDIUM else 0.9 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' + if ( + uiscale is bui.UIScale.SMALL + or playlist_select_context is not None + ) + else 'menu_full' ), - stack_offset=( - (0, -26) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._back_button: bui.Widget | None = bui.buttonwidget( + self._back_button: bui.Widget | None + if uiscale is bui.UIScale.SMALL: + self._back_button = None + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self._on_back_press + ) + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(59, yoffs - 45), + size=(60, 54), + scale=1.0, + on_activate_call=self._on_back_press, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) + + self._title_text = bui.textwidget( parent=self._root_widget, - position=(59 + x_inset, self._height - 70), - size=(120, 60), - scale=1.0, - on_activate_call=self._on_back_press, - autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', - ) - bui.containerwidget( - edit=self._root_widget, cancel_button=self._back_button - ) - txt = self._title_text = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height - 41), + position=( + self._width * 0.5, + yoffs - (45 if uiscale is bui.UIScale.SMALL else 20), + ), size=(0, 0), text=self._pvars.window_title_name, - scale=1.3, + scale=(0.8 if uiscale is bui.UIScale.SMALL else 1.3), res_scale=1.5, color=bui.app.ui_v1.heading_color, h_align='center', v_align='center', ) - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: - bui.textwidget(edit=txt, text='') - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 54), - position=(59 + x_inset, self._height - 67), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: - self._back_button.delete() - self._back_button = None - bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._on_back_press - ) - scroll_offs = 33 - else: - scroll_offs = 0 - self._scroll_width = self._width - (100 + 2 * x_inset) - self._scroll_height = self._height - ( - 146 - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars - else 136 - ) self._scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, size=(self._scroll_width, self._scroll_height), position=( - (self._width - self._scroll_width) * 0.5, - 65 + scroll_offs, + self._width * 0.5 - self._scroll_width * 0.5, + scroll_bottom, ), + border_opacity=0.4, + center_small_content_horizontally=True, ) bui.containerwidget(edit=self._scrollwidget, claims_left_right=True) self._subcontainer: bui.Widget | None = None self._config_name_full = self._pvars.config_name + ' Playlists' self._last_config = None - # Update now and once per second. - # (this should do our initial refresh) + # Update now and once per second (this should do our initial + # refresh). self._update() self._update_timer = bui.AppTimer( 1.0, bui.WeakCall(self._update), repeat=True ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull things out of self here; if we do it below in the lambda + # then we keep self alive. + sessiontype = self._sessiontype + + # Pull anything out of self here; if we do it in the lambda + # we'll inadvertanly keep self alive. + playlist_select_context = self._playlist_select_context + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + sessiontype=sessiontype, + playlist_select_context=playlist_select_context, + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _ensure_standard_playlists_exist(self) -> None: plus = bui.app.plus assert plus is not None @@ -348,15 +378,22 @@ class PlaylistBrowserWindow(bui.Window): items.sort(key=lambda x2: asserttype(x2[0], str).lower()) items = [['__default__', None]] + items # default is always first - count = len(items) - columns = 3 - rows = int(math.ceil(float(count) / columns)) button_width = 230 button_height = 230 button_buffer_h = -3 button_buffer_v = 0 - self._sub_width = self._scroll_width + count = len(items) + columns = max( + 1, + math.floor( + self._scroll_width / (button_width + 2 * button_buffer_h) + ), + ) + rows = int(math.ceil(float(count) / columns)) + + self._sub_width = columns * button_width + 2 * button_buffer_h + self._sub_height = ( 40.0 + rows * (button_height + 2 * button_buffer_v) + 90 ) @@ -372,11 +409,20 @@ class PlaylistBrowserWindow(bui.Window): for child in children: child.delete() + # On small ui-scale, nudge 'Playlists' text to the right when + # we're small enough so that the back button doesn't partly + # obscure it. + uiscale = bui.app.ui_v1.uiscale + screensize = bui.get_virtual_screen_size() + xoffs = ( + 40 if uiscale is bui.UIScale.SMALL and screensize[0] < 1400 else 0 + ) + assert bui.app.classic is not None bui.textwidget( parent=self._subcontainer, text=bui.Lstr(resource='playlistsText'), - position=(40, self._sub_height - 26), + position=(40 + xoffs, self._sub_height - 26), size=(0, 0), scale=1.0, maxwidth=400, @@ -392,7 +438,8 @@ class PlaylistBrowserWindow(bui.Window): mesh_transparent = bui.getmesh('level_select_button_transparent') mask_tex = bui.gettexture('mapPreviewMask') - h_offs = 225 if count == 1 else 115 if count == 2 else 0 + # h_offs = 225 if count == 1 else 115 if count == 2 else 0 + h_offs = 2 h_offs_bottom = 0 uiscale = bui.app.ui_v1.uiscale @@ -418,23 +465,15 @@ class PlaylistBrowserWindow(bui.Window): position=pos, ) - if ( - x == 0 - and bui.app.ui_v1.use_toolbars - and uiscale is bui.UIScale.SMALL - ): + if x == 0 and uiscale is bui.UIScale.SMALL: bui.widget( edit=btn, left_widget=bui.get_special_widget('back_button'), ) - if ( - x == columns - 1 - and bui.app.ui_v1.use_toolbars - and uiscale is bui.UIScale.SMALL - ): + if x == columns - 1 and uiscale is bui.UIScale.SMALL: bui.widget( edit=btn, - right_widget=bui.get_special_widget('party_button'), + right_widget=bui.get_special_widget('squad_button'), ) bui.buttonwidget( edit=btn, @@ -443,7 +482,16 @@ class PlaylistBrowserWindow(bui.Window): ), on_select_call=bui.Call(self._on_playlist_select, name), ) - bui.widget(edit=btn, show_buffer_top=50, show_buffer_bottom=50) + + # Top row biases things up more to show header above it. + if y == 0: + bui.widget( + edit=btn, show_buffer_top=60, show_buffer_bottom=5 + ) + else: + bui.widget( + edit=btn, show_buffer_top=30, show_buffer_bottom=30 + ) if self._selected_playlist == name: bui.containerwidget( @@ -635,15 +683,35 @@ class PlaylistBrowserWindow(bui.Window): def on_play_options_window_run_game(self) -> None: """(internal)""" - if not self._root_widget: + + # No-op if we're not in control. + if not self.main_window_has_control(): + # if not self._root_widget: return - bui.containerwidget(edit=self._root_widget, transition='out_left') + + if self._playlist_select_context is not None: + # Done doing a playlist selection; now back all the way out + # of our selection windows to our stored starting point. + if self._playlist_select_context.back_state is None: + logging.error( + 'No back state found' + ' after playlist select context completion.' + ) + else: + self.main_window_back_state = ( + self._playlist_select_context.back_state + ) + self.main_window_back() + else: + # Launching a regular game session; simply get our window + # transitioning out. + self.main_window_close(transition='out_left') def _on_playlist_select(self, playlist_name: str) -> None: self._selected_playlist = playlist_name def _update(self) -> None: - # make sure config exists + # Make sure config exists. if self._config_name_full not in bui.app.config: bui.app.config[self._config_name_full] = {} @@ -672,6 +740,7 @@ class PlaylistBrowserWindow(bui.Window): scale_origin=button.get_screen_space_center(), playlist=playlist_name, delegate=self, + playlist_select_context=self._playlist_select_context, ) def _on_customize_press(self) -> None: @@ -680,27 +749,23 @@ class PlaylistBrowserWindow(bui.Window): PlaylistCustomizeBrowserWindow, ) - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( + self.main_window_replace( PlaylistCustomizeBrowserWindow( origin_widget=self._customize_button, sessiontype=self._sessiontype, - ).get_root_widget(), - from_window=self._root_widget, + ) ) def _on_back_press(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.play import PlayWindow + # from bauiv1lib.play import PlayWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return # Store our selected playlist if that's changed. @@ -715,15 +780,7 @@ class PlaylistBrowserWindow(bui.Window): ) cfg.commit() - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlayWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_back() def _save_state(self) -> None: try: diff --git a/dist/ba_data/python/bauiv1lib/playlist/customizebrowser.py b/dist/ba_data/python/bauiv1lib/playlist/customizebrowser.py index 789e53f..5a76d5f 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/customizebrowser.py +++ b/dist/ba_data/python/bauiv1lib/playlist/customizebrowser.py @@ -6,86 +6,115 @@ from __future__ import annotations import copy import time -import logging -from typing import TYPE_CHECKING -import bascenev1 as bs +from typing import TYPE_CHECKING, override + import bauiv1 as bui if TYPE_CHECKING: - from typing import Any + from typing import Any, Callable + + import bascenev1 as bs + +REQUIRE_PRO = False -class PlaylistCustomizeBrowserWindow(bui.Window): +class PlaylistCustomizeBrowserWindow(bui.MainWindow): """Window for viewing a playlist.""" def __init__( self, sessiontype: type[bs.Session], - transition: str = 'in_right', - select_playlist: str | None = None, + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, + select_playlist: str | None = None, ): - # Yes this needs tidying. # pylint: disable=too-many-locals # pylint: disable=too-many-statements # pylint: disable=cyclic-import from bauiv1lib import playlist - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - self._sessiontype = sessiontype self._pvars = playlist.PlaylistTypeVars(sessiontype) self._max_playlists = 30 self._r = 'gameListWindow' assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 850.0 if uiscale is bui.UIScale.SMALL else 650.0 - x_inset = 100.0 if uiscale is bui.UIScale.SMALL else 0.0 + self._width = 1200.0 if uiscale is bui.UIScale.SMALL else 650.0 self._height = ( - 380.0 + 800.0 if uiscale is bui.UIScale.SMALL else 420.0 if uiscale is bui.UIScale.MEDIUM else 500.0 ) - top_extra = 20.0 if uiscale is bui.UIScale.SMALL else 0.0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.8 + if uiscale is bui.UIScale.SMALL + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 70, screensize[0] / scale) + target_height = min(self._height - 40, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = ( + 0.5 * self._height + + 0.5 * target_height + + (30.0 if uiscale is bui.UIScale.SMALL else 50) + ) + + self._button_width = 90 + self._x_inset = 10 + self._scroll_width = ( + target_width - self._button_width - 2.0 * self._x_inset + ) + self._scroll_height = target_height - 75 + self._scroll_bottom = yoffs - 98 - self._scroll_height + self._button_height = self._scroll_height / 6.0 super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - scale_origin_stack_offset=scale_origin, - scale=( - 2.05 + size=(self._width, self._height), + scale=scale, + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -10) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._back_button = back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(43 + x_inset, self._height - 60), - size=(160, 68), - scale=0.77, - autoselect=True, - text_scale=1.3, - label=bui.Lstr(resource='backText'), - button_type='back', - ) + self._back_button: bui.Widget | None + if uiscale is bui.UIScale.SMALL: + self._back_button = None + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(43, yoffs - 87), + size=(60, 60), + scale=0.77, + autoselect=True, + text_scale=1.3, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + ) bui.textwidget( parent=self._root_widget, - position=(0, self._height - 47), + position=(0, yoffs - (77 if uiscale is bui.UIScale.SMALL else 77)), size=(self._width, 25), text=bui.Lstr( resource=f'{self._r}.titleText', @@ -97,171 +126,92 @@ class PlaylistCustomizeBrowserWindow(bui.Window): v_align='center', ) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - v = self._height - 59.0 - h = 41 + x_inset + h = self._width * 0.5 - (self._scroll_width + self._button_width) * 0.5 b_color = (0.6, 0.53, 0.63) b_textcolor = (0.75, 0.7, 0.8) self._lock_images: list[bui.Widget] = [] - lock_tex = bui.gettexture('lock') + xmargin = 0.06 + ymargin = 0.05 - scl = ( - 1.1 - if uiscale is bui.UIScale.SMALL - else 1.27 if uiscale is bui.UIScale.MEDIUM else 1.57 - ) - scl *= 0.63 - v -= 65.0 * scl - new_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(h, v), - size=(90, 58.0 * scl), - on_activate_call=self._new_playlist, - color=b_color, - autoselect=True, - button_type='square', - textcolor=b_textcolor, - text_scale=0.7, - label=bui.Lstr( + def _make_button( + i: int, label: bui.Lstr, call: Callable[[], None] + ) -> bui.Widget: + v = self._scroll_bottom + self._button_height * i + return bui.buttonwidget( + parent=self._root_widget, + position=( + h + xmargin * self._button_width, + v + ymargin * self._button_height, + ), + size=( + self._button_width * (1.0 - 2.0 * xmargin), + self._button_height * (1.0 - 2.0 * ymargin), + ), + on_activate_call=call, + color=b_color, + autoselect=True, + button_type='square', + textcolor=b_textcolor, + text_scale=0.7, + label=label, + ) + + new_button = _make_button( + 5, + bui.Lstr( resource='newText', fallback_resource=f'{self._r}.newText' ), + self._new_playlist, ) - self._lock_images.append( - bui.imagewidget( - parent=self._root_widget, - size=(30, 30), - draw_controller=btn, - position=(h - 10, v + 58.0 * scl - 28), - texture=lock_tex, - ) - ) - - v -= 65.0 * scl - self._edit_button = edit_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(h, v), - size=(90, 58.0 * scl), - on_activate_call=self._edit_playlist, - color=b_color, - autoselect=True, - textcolor=b_textcolor, - button_type='square', - text_scale=0.7, - label=bui.Lstr( - resource='editText', fallback_resource=f'{self._r}.editText' + self._edit_button = _make_button( + 4, + bui.Lstr( + resource='editText', + fallback_resource=f'{self._r}.editText', ), - ) - self._lock_images.append( - bui.imagewidget( - parent=self._root_widget, - size=(30, 30), - draw_controller=btn, - position=(h - 10, v + 58.0 * scl - 28), - texture=lock_tex, - ) + self._edit_playlist, ) - v -= 65.0 * scl - duplicate_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(h, v), - size=(90, 58.0 * scl), - on_activate_call=self._duplicate_playlist, - color=b_color, - autoselect=True, - textcolor=b_textcolor, - button_type='square', - text_scale=0.7, - label=bui.Lstr( + duplicate_button = _make_button( + 3, + bui.Lstr( resource='duplicateText', fallback_resource=f'{self._r}.duplicateText', ), - ) - self._lock_images.append( - bui.imagewidget( - parent=self._root_widget, - size=(30, 30), - draw_controller=btn, - position=(h - 10, v + 58.0 * scl - 28), - texture=lock_tex, - ) + self._duplicate_playlist, ) - v -= 65.0 * scl - delete_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(h, v), - size=(90, 58.0 * scl), - on_activate_call=self._delete_playlist, - color=b_color, - autoselect=True, - textcolor=b_textcolor, - button_type='square', - text_scale=0.7, - label=bui.Lstr( + delete_button = _make_button( + 2, + bui.Lstr( resource='deleteText', fallback_resource=f'{self._r}.deleteText' ), - ) - self._lock_images.append( - bui.imagewidget( - parent=self._root_widget, - size=(30, 30), - draw_controller=btn, - position=(h - 10, v + 58.0 * scl - 28), - texture=lock_tex, - ) - ) - v -= 65.0 * scl - self._import_button = bui.buttonwidget( - parent=self._root_widget, - position=(h, v), - size=(90, 58.0 * scl), - on_activate_call=self._import_playlist, - color=b_color, - autoselect=True, - textcolor=b_textcolor, - button_type='square', - text_scale=0.7, - label=bui.Lstr(resource='importText'), - ) - v -= 65.0 * scl - btn = bui.buttonwidget( - parent=self._root_widget, - position=(h, v), - size=(90, 58.0 * scl), - on_activate_call=self._share_playlist, - color=b_color, - autoselect=True, - textcolor=b_textcolor, - button_type='square', - text_scale=0.7, - label=bui.Lstr(resource='shareText'), - ) - self._lock_images.append( - bui.imagewidget( - parent=self._root_widget, - size=(30, 30), - draw_controller=btn, - position=(h - 10, v + 58.0 * scl - 28), - texture=lock_tex, - ) + self._delete_playlist, + ) + + self._import_button = _make_button( + 1, bui.Lstr(resource='importText'), self._import_playlist + ) + + share_button = _make_button( + 0, bui.Lstr(resource='shareText'), self._share_playlist ) - v = self._height - 75 - self._scroll_height = self._height - 119 scrollwidget = bui.scrollwidget( parent=self._root_widget, - position=(140 + x_inset, v - self._scroll_height), - size=(self._width - (180 + 2 * x_inset), self._scroll_height + 10), + size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 + - (self._scroll_width + self._button_width) * 0.5 + + self._button_width, + self._scroll_bottom, + ), highlight=False, + border_opacity=0.4, ) - bui.widget(edit=back_button, right_widget=scrollwidget) + if self._back_button is not None: + bui.widget(edit=self._back_button, right_widget=scrollwidget) + self._columnwidget = bui.columnwidget( parent=scrollwidget, border=2, margin=0 ) @@ -274,20 +224,23 @@ class PlaylistCustomizeBrowserWindow(bui.Window): h += 210 - for btn in [new_button, delete_button, edit_button, duplicate_button]: + for btn in [ + new_button, + delete_button, + self._edit_button, + duplicate_button, + self._import_button, + share_button, + ]: bui.widget(edit=btn, right_widget=scrollwidget) bui.widget( edit=scrollwidget, left_widget=new_button, - right_widget=( - bui.get_special_widget('party_button') - if bui.app.ui_v1.use_toolbars - else None - ), + right_widget=bui.get_special_widget('squad_button'), ) - # make sure config exists - self._config_name_full = self._pvars.config_name + ' Playlists' + # Make sure config exists. + self._config_name_full = f'{self._pvars.config_name} Playlists' if self._config_name_full not in bui.app.config: bui.app.config[self._config_name_full] = {} @@ -298,8 +251,13 @@ class PlaylistCustomizeBrowserWindow(bui.Window): self._refresh(select_playlist=select_playlist) - bui.buttonwidget(edit=back_button, on_activate_call=self._back) - bui.containerwidget(edit=self._root_widget, cancel_button=back_button) + if self._back_button is not None: + bui.buttonwidget( + edit=self._back_button, on_activate_call=self.main_window_back + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) bui.containerwidget(edit=self._root_widget, selected_child=scrollwidget) @@ -309,63 +267,44 @@ class PlaylistCustomizeBrowserWindow(bui.Window): ) self._update() - def _update(self) -> None: - assert bui.app.classic is not None - have = bui.app.classic.accounts.have_pro_options() - for lock in self._lock_images: - bui.imagewidget(edit=lock, opacity=0.0 if have else 1.0) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.playlist import browser + # Avoid dereferencing self within the lambda or we'll keep + # ourself alive indefinitely. + stype = self._sessiontype - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + sessiontype=stype, + ) + ) + @override + def on_main_window_close(self) -> None: if self._selected_playlist_name is not None: cfg = bui.app.config - cfg[self._pvars.config_name + ' Playlist Selection'] = ( + cfg[f'{self._pvars.config_name} Playlist Selection'] = ( self._selected_playlist_name ) cfg.commit() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) + def _update(self) -> None: assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - browser.PlaylistBrowserWindow( - transition='in_left', sessiontype=self._sessiontype - ).get_root_widget(), - from_window=self._root_widget, - ) + have = bui.app.classic.accounts.have_pro_options() + for lock in self._lock_images: + bui.imagewidget( + edit=lock, opacity=0.0 if (have or not REQUIRE_PRO) else 1.0 + ) def _select(self, name: str, index: int) -> None: self._selected_playlist_name = name self._selected_playlist_index = index - def _run_selected_playlist(self) -> None: - # pylint: disable=cyclic-import - bui.unlock_all_input() - try: - bs.new_host_session(self._sessiontype) - except Exception: - from bascenev1lib import mainmenu - - logging.exception('Error running session %s.', self._sessiontype) - - # Drop back into a main menu session. - bs.new_host_session(mainmenu.MainMenuSession) - - def _choose_playlist(self) -> None: - if self._selected_playlist_name is None: - return - self._save_playlist_selection() - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.fade_screen(False, endcall=self._run_selected_playlist) - bui.lock_all_input() - def _refresh(self, select_playlist: str | None = None) -> None: from efro.util import asserttype @@ -416,9 +355,16 @@ class PlaylistCustomizeBrowserWindow(bui.Window): ) bui.widget(edit=txtw, show_buffer_top=50, show_buffer_bottom=50) - # Hitting up from top widget should jump to 'back' + # Hitting up from top widget should jump to 'back'. if index == 0: - bui.widget(edit=txtw, up_widget=self._back_button) + bui.widget( + edit=txtw, + up_widget=( + self._back_button + if self._back_button is not None + else bui.get_special_widget('back_button') + ), + ) self._playlist_widgets.append(txtw) @@ -431,8 +377,8 @@ class PlaylistCustomizeBrowserWindow(bui.Window): visible_child=txtw, ) else: - # Select this one if it was previously selected. - # Go by index if there's one. + # Select this one if it was previously selected. Go by + # index if there's one. if old_selection_index is not None: if index == old_selection_index: bui.columnwidget( @@ -451,10 +397,10 @@ class PlaylistCustomizeBrowserWindow(bui.Window): index += 1 def _save_playlist_selection(self) -> None: - # Store the selected playlist in prefs. - # This serves dual purposes of letting us re-select it next time - # if we want and also lets us pass it to the game (since we reset - # the whole python environment that's not actually easy). + # Store the selected playlist in prefs. This serves dual + # purposes of letting us re-select it next time if we want and + # also lets us pass it to the game (since we reset the whole + # python environment that's not actually easy). cfg = bui.app.config cfg[self._pvars.config_name + ' Playlist Selection'] = ( self._selected_playlist_name @@ -469,8 +415,12 @@ class PlaylistCustomizeBrowserWindow(bui.Window): from bauiv1lib.playlist.editcontroller import PlaylistEditController from bauiv1lib.purchase import PurchaseWindow + # No-op if we're not in control. + if not self.main_window_has_control(): + return + assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro_options(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro_options(): PurchaseWindow(items=['pro']) return @@ -492,8 +442,7 @@ class PlaylistCustomizeBrowserWindow(bui.Window): self._save_playlist_selection() # Kick off the edit UI. - PlaylistEditController(sessiontype=self._sessiontype) - bui.containerwidget(edit=self._root_widget, transition='out_left') + PlaylistEditController(sessiontype=self._sessiontype, from_window=self) def _edit_playlist(self) -> None: # pylint: disable=cyclic-import @@ -501,7 +450,7 @@ class PlaylistCustomizeBrowserWindow(bui.Window): from bauiv1lib.purchase import PurchaseWindow assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro_options(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro_options(): PurchaseWindow(items=['pro']) return if self._selected_playlist_name is None: @@ -516,8 +465,8 @@ class PlaylistCustomizeBrowserWindow(bui.Window): PlaylistEditController( existing_playlist_name=self._selected_playlist_name, sessiontype=self._sessiontype, + from_window=self, ) - bui.containerwidget(edit=self._root_widget, transition='out_left') def _do_delete_playlist(self) -> None: plus = bui.app.plus @@ -584,7 +533,7 @@ class PlaylistCustomizeBrowserWindow(bui.Window): assert plus is not None assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro_options(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro_options(): PurchaseWindow(items=['pro']) return @@ -626,7 +575,7 @@ class PlaylistCustomizeBrowserWindow(bui.Window): from bauiv1lib.confirm import ConfirmWindow assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro_options(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro_options(): PurchaseWindow(items=['pro']) return @@ -666,7 +615,7 @@ class PlaylistCustomizeBrowserWindow(bui.Window): assert plus is not None assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro_options(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro_options(): PurchaseWindow(items=['pro']) return if self._selected_playlist_name is None: @@ -682,7 +631,7 @@ class PlaylistCustomizeBrowserWindow(bui.Window): bui.getsound('error').play() return - # clamp at our max playlist number + # Clamp at our max playlist number. if len(bui.app.config[self._config_name_full]) > self._max_playlists: bui.screenmessage( bui.Lstr( @@ -697,10 +646,11 @@ class PlaylistCustomizeBrowserWindow(bui.Window): return copy_text = bui.Lstr(resource='copyOfText').evaluate() - # get just 'Copy' or whatnot - copy_word = copy_text.replace('${NAME}', '').strip() - # find a valid dup name that doesn't exist + # Get just 'Copy' or whatnot. + copy_word = copy_text.replace('${NAME}', '').strip() + + # Find a valid dup name that doesn't exist. test_index = 1 base_name = self._get_playlist_display_name( self._selected_playlist_name diff --git a/dist/ba_data/python/bauiv1lib/playlist/edit.py b/dist/ba_data/python/bauiv1lib/playlist/edit.py index 3a3fcca..afb26ac 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/edit.py +++ b/dist/ba_data/python/bauiv1lib/playlist/edit.py @@ -5,7 +5,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, cast, override import bascenev1 as bs import bauiv1 as bui @@ -14,13 +14,14 @@ if TYPE_CHECKING: from bauiv1lib.playlist.editcontroller import PlaylistEditController -class PlaylistEditWindow(bui.Window): +class PlaylistEditWindow(bui.MainWindow): """Window for editing an individual game playlist.""" def __init__( self, editcontroller: PlaylistEditController, - transition: str = 'in_right', + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-statements # pylint: disable=too-many-locals @@ -34,29 +35,30 @@ class PlaylistEditWindow(bui.Window): self._width = 870 if uiscale is bui.UIScale.SMALL else 670 x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 self._height = ( - 400 + 500 if uiscale is bui.UIScale.SMALL else 470 if uiscale is bui.UIScale.MEDIUM else 540 ) + yoffs = -68 if uiscale is bui.UIScale.SMALL else 0 - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, + size=(self._width, self._height), scale=( 2.0 if uiscale is bui.UIScale.SMALL else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=( - (0, -16) if uiscale is bui.UIScale.SMALL else (0, 0) + (0, 0) if uiscale is bui.UIScale.SMALL else (0, 0) ), - ) + ), + transition=transition, + origin_widget=origin_widget, ) cancel_button = bui.buttonwidget( parent=self._root_widget, - position=(35 + x_inset, self._height - 60), + position=(35 + x_inset, self._height - 60 + yoffs), scale=0.8, size=(175, 60), autoselect=True, @@ -65,7 +67,7 @@ class PlaylistEditWindow(bui.Window): ) save_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(self._width - (195 + x_inset), self._height - 60), + position=(self._width - (195 + x_inset), self._height - 60 + yoffs), scale=0.8, size=(190, 60), autoselect=True, @@ -74,11 +76,10 @@ class PlaylistEditWindow(bui.Window): text_scale=1.2, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, + right_widget=bui.get_special_widget('squad_button'), + ) bui.widget( edit=cancel_button, @@ -88,7 +89,7 @@ class PlaylistEditWindow(bui.Window): bui.textwidget( parent=self._root_widget, - position=(-10, self._height - 50), + position=(-10, self._height - 50 + yoffs), size=(self._width, 25), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, @@ -98,7 +99,7 @@ class PlaylistEditWindow(bui.Window): maxwidth=270, ) - v = self._height - 115.0 + v = self._height - 115.0 + yoffs self._scroll_width = self._width - (205 + 2 * x_inset) @@ -135,7 +136,7 @@ class PlaylistEditWindow(bui.Window): self._list_widgets: list[bui.Widget] = [] h = 40 + x_inset - v = self._height - 172.0 + v = self._height - 172.0 + yoffs b_color = (0.6, 0.53, 0.63) b_textcolor = (0.75, 0.7, 0.8) @@ -221,14 +222,17 @@ class PlaylistEditWindow(bui.Window): repeat=True, ) - v = self._height - 100 - scroll_height = self._height - 155 + v = self._height - 100 + yoffs + scroll_height = self._height - ( + 250 if uiscale is bui.UIScale.SMALL else 155 + ) scrollwidget = bui.scrollwidget( parent=self._root_widget, position=(160 + x_inset, v - scroll_height), highlight=False, on_select_call=bui.Call(self._set_ui_selection, 'gameList'), size=(self._scroll_width, (scroll_height - 15)), + border_opacity=0.4, ) bui.widget( edit=scrollwidget, @@ -270,50 +274,52 @@ class PlaylistEditWindow(bui.Window): edit=self._root_widget, selected_child=scrollwidget ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + editcontroller = self._editcontroller + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + editcontroller=editcontroller, + ) + ) + def _set_ui_selection(self, selection: str) -> None: self._editcontroller.set_edit_ui_selection(selection) def _cancel(self) -> None: - from bauiv1lib.playlist.customizebrowser import ( - PlaylistCustomizeBrowserWindow, - ) # no-op if our underlying widget is dead or on its way out. if not self._root_widget or self._root_widget.transitioning_out: return bui.getsound('powerdown01').play() - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlaylistCustomizeBrowserWindow( - transition='in_left', - sessiontype=self._editcontroller.get_session_type(), - select_playlist=( - self._editcontroller.get_existing_playlist_name() - ), - ).get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_back() def _add(self) -> None: # Store list name then tell the session to perform an add. self._editcontroller.setname( cast(str, bui.textwidget(query=self._text_field)) ) - self._editcontroller.add_game_pressed() + self._editcontroller.add_game_pressed(from_window=self) def _edit(self) -> None: # Store list name then tell the session to perform an add. self._editcontroller.setname( cast(str, bui.textwidget(query=self._text_field)) ) - self._editcontroller.edit_game_pressed() + self._editcontroller.edit_game_pressed(from_window=self) def _save_press(self) -> None: - from bauiv1lib.playlist.customizebrowser import ( - PlaylistCustomizeBrowserWindow, - ) + + # No-op if we're not in control. + if not self.main_window_has_control(): + return # no-op if our underlying widget is dead or on its way out. if not self._root_widget or self._root_widget.transitioning_out: @@ -376,17 +382,9 @@ class PlaylistEditWindow(bui.Window): ) plus.run_v1_account_transactions() - bui.containerwidget(edit=self._root_widget, transition='out_right') bui.getsound('gunCocking').play() - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlaylistCustomizeBrowserWindow( - transition='in_left', - sessiontype=self._editcontroller.get_session_type(), - select_playlist=new_name, - ).get_root_widget(), - from_window=self._root_widget, - ) + + self.main_window_back() def _save_press_with_sound(self) -> None: bui.getsound('swish').play() diff --git a/dist/ba_data/python/bauiv1lib/playlist/editcontroller.py b/dist/ba_data/python/bauiv1lib/playlist/editcontroller.py index 7ed9a92..7126022 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/editcontroller.py +++ b/dist/ba_data/python/bauiv1lib/playlist/editcontroller.py @@ -11,7 +11,7 @@ import bascenev1 as bs import bauiv1 as bui if TYPE_CHECKING: - from typing import Any + from typing import Any, Callable class PlaylistEditController: @@ -20,8 +20,9 @@ class PlaylistEditController: def __init__( self, sessiontype: type[bs.Session], + from_window: bui.MainWindow, + *, existing_playlist_name: str | None = None, - transition: str = 'in_right', playlist: list[dict[str, Any]] | None = None, playlist_name: str | None = None, ): @@ -44,6 +45,9 @@ class PlaylistEditController: self._existing_playlist_name = existing_playlist_name self._config_name_full = self._pvars.config_name + ' Playlists' + self._pre_game_add_state: bui.MainWindowState | None = None + self._pre_game_edit_state: bui.MainWindowState | None = None + # Make sure config exists. if self._config_name_full not in appconfig: appconfig[self._config_name_full] = {} @@ -88,13 +92,12 @@ class PlaylistEditController: # and that's all they can do. self._edit_ui_selection = 'add_button' - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlaylistEditWindow( - editcontroller=self, transition=transition - ).get_root_widget(), - from_window=False, # Disable this check. - ) + editwindow = PlaylistEditWindow(editcontroller=self) + from_window.main_window_replace(editwindow) + + # Once we've set our start window, store the back state. We'll + # skip back to there once we're fully done. + self._back_state = editwindow.main_window_back_state def get_config_name(self) -> str: """(internal)""" @@ -144,83 +147,88 @@ class PlaylistEditController: """Sets the selected playlist index.""" self._selected_index = index - def add_game_pressed(self) -> None: + def add_game_pressed(self, from_window: bui.MainWindow) -> None: """(internal)""" from bauiv1lib.playlist.addgame import PlaylistAddGameWindow - assert bui.app.classic is not None - bui.app.ui_v1.clear_main_menu_window(transition='out_left') - bui.app.ui_v1.set_main_menu_window( - PlaylistAddGameWindow(editcontroller=self).get_root_widget(), - from_window=None, - ) + # assert bui.app.classic is not None - def edit_game_pressed(self) -> None: + # No op if we're not in control. + if not from_window.main_window_has_control(): + return + + addwindow = PlaylistAddGameWindow(editcontroller=self) + from_window.main_window_replace(addwindow) + + # Once we're there, store the back state. We'll use that to jump + # back to our current location once the edit is done. + assert self._pre_game_add_state is None + self._pre_game_add_state = addwindow.main_window_back_state + + def edit_game_pressed(self, from_window: bui.MainWindow) -> None: """Should be called by supplemental UIs when a game is to be edited.""" if not self._playlist: return + self._show_edit_ui( gametype=bui.getclass( self._playlist[self._selected_index]['type'], subclassof=bs.GameActivity, ), settings=self._playlist[self._selected_index], - ) - - def add_game_cancelled(self) -> None: - """(internal)""" - from bauiv1lib.playlist.edit import PlaylistEditWindow - - assert bui.app.classic is not None - bui.app.ui_v1.clear_main_menu_window(transition='out_right') - bui.app.ui_v1.set_main_menu_window( - PlaylistEditWindow( - editcontroller=self, transition='in_left' - ).get_root_widget(), - from_window=None, + from_window=from_window, ) def _show_edit_ui( - self, gametype: type[bs.GameActivity], settings: dict[str, Any] | None + self, + gametype: type[bs.GameActivity], + settings: dict[str, Any] | None, + from_window: bui.MainWindow, ) -> None: + # pylint: disable=cyclic-import + from bauiv1lib.playlist.editgame import PlaylistEditGameWindow + + if not from_window.main_window_has_control(): + return + self._editing_game = settings is not None self._editing_game_type = gametype assert self._sessiontype is not None - gametype.create_settings_ui( - self._sessiontype, copy.deepcopy(settings), self._edit_game_done + + # Jump into an edit window. + editwindow = PlaylistEditGameWindow( + gametype, + self._sessiontype, + copy.deepcopy(settings), + completion_call=self._edit_game_done, + ) + from_window.main_window_replace(editwindow) + + # Once we're there, store the back state. We'll use that to jump + # back to our current location once the edit is done. + assert self._pre_game_edit_state is None + self._pre_game_edit_state = editwindow.main_window_back_state + + def add_game_type_selected( + self, gametype: type[bs.GameActivity], from_window: bui.MainWindow + ) -> None: + """(internal)""" + self._show_edit_ui( + gametype=gametype, settings=None, from_window=from_window ) - def add_game_type_selected(self, gametype: type[bs.GameActivity]) -> None: - """(internal)""" - self._show_edit_ui(gametype=gametype, settings=None) + def _edit_game_done( + self, config: dict[str, Any] | None, from_window: bui.MainWindow + ) -> None: - def _edit_game_done(self, config: dict[str, Any] | None) -> None: - from bauiv1lib.playlist.edit import PlaylistEditWindow - from bauiv1lib.playlist.addgame import PlaylistAddGameWindow + # No-op if provided window isn't in charge. + if not from_window.main_window_has_control(): + return assert bui.app.classic is not None if config is None: - # If we were editing, go back to our list. - if self._editing_game: - bui.getsound('powerdown01').play() - bui.app.ui_v1.clear_main_menu_window(transition='out_right') - bui.app.ui_v1.set_main_menu_window( - PlaylistEditWindow( - editcontroller=self, transition='in_left' - ).get_root_widget(), - from_window=None, - ) - - # Otherwise we were adding; go back to the add type choice list. - else: - bui.app.ui_v1.clear_main_menu_window(transition='out_right') - bui.app.ui_v1.set_main_menu_window( - PlaylistAddGameWindow( - editcontroller=self, transition='in_left' - ).get_root_widget(), - from_window=None, - ) + bui.getsound('powerdown01').play() else: # Make sure type is in there. assert self._editing_game_type is not None @@ -237,10 +245,17 @@ class PlaylistEditController: self._selected_index = insert_index bui.getsound('gunCocking').play() - bui.app.ui_v1.clear_main_menu_window(transition='out_right') - bui.app.ui_v1.set_main_menu_window( - PlaylistEditWindow( - editcontroller=self, transition='in_left' - ).get_root_widget(), - from_window=None, - ) + + # If we're adding, jump to before the add started. + # Otherwise jump to before the edit started. + assert ( + self._pre_game_edit_state is not None + or self._pre_game_add_state is not None + ) + if self._pre_game_add_state is not None: + from_window.main_window_back_state = self._pre_game_add_state + elif self._pre_game_edit_state is not None: + from_window.main_window_back_state = self._pre_game_edit_state + from_window.main_window_back() + self._pre_game_edit_state = None + self._pre_game_add_state = None diff --git a/dist/ba_data/python/bauiv1lib/playlist/editgame.py b/dist/ba_data/python/bauiv1lib/playlist/editgame.py index 993aac3..9fac932 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/editgame.py +++ b/dist/ba_data/python/bauiv1lib/playlist/editgame.py @@ -7,7 +7,7 @@ from __future__ import annotations import copy import random import logging -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, cast, override import bascenev1 as bs import bauiv1 as bui @@ -16,7 +16,7 @@ if TYPE_CHECKING: from typing import Any, Callable -class PlaylistEditGameWindow(bui.Window): +class PlaylistEditGameWindow(bui.MainWindow): """Window for editing a game config.""" def __init__( @@ -24,12 +24,14 @@ class PlaylistEditGameWindow(bui.Window): gametype: type[bs.GameActivity], sessiontype: type[bs.Session], config: dict[str, Any] | None, - completion_call: Callable[[dict[str, Any] | None], Any], + completion_call: Callable[[dict[str, Any] | None, bui.MainWindow], Any], default_selection: str | None = None, - transition: str = 'in_right', + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, edit_info: dict[str, Any] | None = None, ): # pylint: disable=too-many-branches + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-statements # pylint: disable=too-many-locals from bascenev1 import ( @@ -64,6 +66,7 @@ class PlaylistEditGameWindow(bui.Window): bui.screenmessage(bui.Lstr(resource='noValidMapsErrorText')) raise RuntimeError('No valid maps found.') + self._config = config self._settings_defs = gametype.get_available_settings(sessiontype) self._completion_call = completion_call @@ -106,13 +109,14 @@ class PlaylistEditGameWindow(bui.Window): width = 820 if uiscale is bui.UIScale.SMALL else 620 x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 height = ( - 365 + 400 if uiscale is bui.UIScale.SMALL else 460 if uiscale is bui.UIScale.MEDIUM else 550 ) spacing = 52 y_extra = 15 y_extra2 = 21 + yoffs = -30 if uiscale is bui.UIScale.SMALL else 0 map_tex_name = get_map_class(self._map).get_preview_texture_name() if map_tex_name is None: @@ -123,30 +127,31 @@ class PlaylistEditGameWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(width, height + top_extra), - transition=transition, scale=( - 2.19 + 2.3 if uiscale is bui.UIScale.SMALL else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=( - (0, -17) if uiscale is bui.UIScale.SMALL else (0, 0) + (0, 0) if uiscale is bui.UIScale.SMALL else (0, 0) ), - ) + ), + transition=transition, + origin_widget=origin_widget, ) btn = bui.buttonwidget( parent=self._root_widget, - position=(45 + x_inset, height - 82 + y_extra2), - size=(180, 70) if is_add else (180, 65), + position=(45 + x_inset, height - 82 + y_extra2 + yoffs), + size=(60, 48) if is_add else (180, 65), label=( - bui.Lstr(resource='backText') + bui.charstr(bui.SpecialChar.BACK) if is_add else bui.Lstr(resource='cancelText') ), - button_type='back' if is_add else None, + button_type='backSmall' if is_add else None, autoselect=True, - scale=0.75, + scale=1.0 if is_add else 0.75, text_scale=1.3, on_activate_call=bui.Call(self._cancel), ) @@ -154,24 +159,23 @@ class PlaylistEditGameWindow(bui.Window): add_button = bui.buttonwidget( parent=self._root_widget, - position=(width - (193 + x_inset), height - 82 + y_extra2), + position=(width - (193 + x_inset), height - 82 + y_extra2 + yoffs), size=(200, 65), scale=0.75, text_scale=1.3, label=( bui.Lstr(resource=f'{self._r}.addGameText') if is_add - else bui.Lstr(resource='doneText') + else bui.Lstr(resource='applyText') ), ) - if bui.app.ui_v1.use_toolbars: - pbtn = bui.get_special_widget('party_button') - bui.widget(edit=add_button, right_widget=pbtn, up_widget=pbtn) + pbtn = bui.get_special_widget('squad_button') + bui.widget(edit=add_button, right_widget=pbtn, up_widget=pbtn) bui.textwidget( parent=self._root_widget, - position=(-8, height - 70 + y_extra2), + position=(-8, height - 70 + y_extra2 + yoffs), size=(width, 25), text=gametype.get_display_string(), color=bui.app.ui_v1.title_color, @@ -191,19 +195,24 @@ class PlaylistEditGameWindow(bui.Window): scroll_width = width - (86 + 2 * x_inset) self._scrollwidget = bui.scrollwidget( parent=self._root_widget, - position=(44 + x_inset, 35 + y_extra), - size=(scroll_width, height - 116), + position=( + 44 + x_inset, + (80 if uiscale is bui.UIScale.SMALL else 35) + y_extra + yoffs, + ), + size=( + scroll_width, + height - (166 if uiscale is bui.UIScale.SMALL else 116), + ), highlight=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, + border_opacity=0.4, ) self._subcontainer = bui.containerwidget( parent=self._scrollwidget, size=(scroll_width, scroll_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) @@ -483,11 +492,11 @@ class PlaylistEditGameWindow(bui.Window): if prev_widgets is not None: # Wire our rightmost to their rightmost. bui.widget(edit=prev_widgets[-1], down_widget=cwdg[-1]) - bui.widget(cwdg[-1], up_widget=prev_widgets[-1]) + bui.widget(edit=cwdg[-1], up_widget=prev_widgets[-1]) # Wire our leftmost to their leftmost. bui.widget(edit=prev_widgets[0], down_widget=cwdg[0]) - bui.widget(cwdg[0], up_widget=prev_widgets[0]) + bui.widget(edit=cwdg[0], up_widget=prev_widgets[0]) prev_widgets = cwdg except Exception: logging.exception( @@ -509,6 +518,29 @@ class PlaylistEditGameWindow(bui.Window): edit=self._subcontainer, selected_child=map_button ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull things out of self here so we don't refer to self in the + # lambda below which would keep us alive. + gametype = self._gametype + sessiontype = self._sessiontype + config = self._config + completion_call = self._completion_call + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + gametype=gametype, + sessiontype=sessiontype, + config=config, + completion_call=completion_call, + ) + ) + def _get_localized_setting_name(self, name: str) -> bui.Lstr: return bui.Lstr(translate=('settingNames', name)) @@ -516,22 +548,21 @@ class PlaylistEditGameWindow(bui.Window): # pylint: disable=cyclic-import from bauiv1lib.playlist.mapselect import PlaylistMapSelectWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # No-op if we're not in control. + if not self.main_window_has_control(): return + self._config = self._getconfig() + # Replace ourself with the map-select UI. - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( + self.main_window_replace( PlaylistMapSelectWindow( self._gametype, self._sessiontype, - copy.deepcopy(self._getconfig()), + self._config, self._edit_info, self._completion_call, - ).get_root_widget(), - from_window=self._root_widget, + ) ) def _choice_inc( @@ -561,7 +592,7 @@ class PlaylistEditGameWindow(bui.Window): ][1] def _cancel(self) -> None: - self._completion_call(None) + self._completion_call(None, self) def _check_value_change( self, setting_name: str, widget: bui.Widget, value: int @@ -582,7 +613,7 @@ class PlaylistEditGameWindow(bui.Window): return {'settings': settings} def _add(self) -> None: - self._completion_call(copy.deepcopy(self._getconfig())) + self._completion_call(self._getconfig(), self) def _inc( self, @@ -593,6 +624,7 @@ class PlaylistEditGameWindow(bui.Window): setting_type: type, setting_name: str, ) -> None: + # pylint: disable=too-many-positional-arguments if setting_type == float: val = float(cast(str, bui.textwidget(query=ctrl))) else: diff --git a/dist/ba_data/python/bauiv1lib/playlist/mapselect.py b/dist/ba_data/python/bauiv1lib/playlist/mapselect.py index 8e2cc8e..935accd 100644 --- a/dist/ba_data/python/bauiv1lib/playlist/mapselect.py +++ b/dist/ba_data/python/bauiv1lib/playlist/mapselect.py @@ -5,7 +5,7 @@ from __future__ import annotations import math -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -15,7 +15,7 @@ if TYPE_CHECKING: import bascenev1 as bs -class PlaylistMapSelectWindow(bui.Window): +class PlaylistMapSelectWindow(bui.MainWindow): """Window to select a map.""" def __init__( @@ -24,9 +24,14 @@ class PlaylistMapSelectWindow(bui.Window): sessiontype: type[bs.Session], config: dict[str, Any], edit_info: dict[str, Any], - completion_call: Callable[[dict[str, Any] | None], Any], - transition: str = 'in_right', + completion_call: Callable[[dict[str, Any] | None, bui.MainWindow], Any], + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + select_get_more_maps_button: bool = False, ): + # pylint: disable=too-many-locals + # pylint: disable=too-many-positional-arguments + from bascenev1 import get_filtered_map_name self._gametype = gametype @@ -35,6 +40,7 @@ class PlaylistMapSelectWindow(bui.Window): self._completion_call = completion_call self._edit_info = edit_info self._maps: list[tuple[str, bui.Texture]] = [] + self._selected_get_more_maps = False try: self._previous_map = get_filtered_map_name( config['settings']['map'] @@ -47,42 +53,43 @@ class PlaylistMapSelectWindow(bui.Window): width = 815 if uiscale is bui.UIScale.SMALL else 615 x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 height = ( - 400 + 420 if uiscale is bui.UIScale.SMALL else 480 if uiscale is bui.UIScale.MEDIUM else 600 ) + yoffs = -37 if uiscale is bui.UIScale.SMALL else 0 - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 super().__init__( root_widget=bui.containerwidget( - size=(width, height + top_extra), - transition=transition, + size=(width, height), scale=( - 2.17 + 2.3 if uiscale is bui.UIScale.SMALL else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=( - (0, -27) if uiscale is bui.UIScale.SMALL else (0, 0) + (0, 0) if uiscale is bui.UIScale.SMALL else (0, 0) ), - ) + ), + transition=transition, + origin_widget=origin_widget, ) self._cancel_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(38 + x_inset, height - 67), + position=(38 + x_inset, height - 67 + yoffs), size=(140, 50), scale=0.9, text_scale=1.0, autoselect=True, label=bui.Lstr(resource='cancelText'), - on_activate_call=self._cancel, + on_activate_call=self.main_window_back, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) bui.textwidget( parent=self._root_widget, - position=(width * 0.5, height - 46), + position=(width * 0.5, height - 46 + yoffs), size=(0, 0), maxwidth=260, scale=1.1, @@ -94,14 +101,17 @@ class PlaylistMapSelectWindow(bui.Window): h_align='center', v_align='center', ) - v = height - 70 + v = height - 70 + yoffs self._scroll_width = width - (80 + 2 * x_inset) - self._scroll_height = height - 140 + self._scroll_height = height - ( + 170 if uiscale is bui.UIScale.SMALL else 140 + ) self._scrollwidget = bui.scrollwidget( parent=self._root_widget, position=(40 + x_inset, v - self._scroll_height), size=(self._scroll_width, self._scroll_height), + border_opacity=0.4, ) bui.containerwidget( edit=self._root_widget, selected_child=self._scrollwidget @@ -109,7 +119,34 @@ class PlaylistMapSelectWindow(bui.Window): bui.containerwidget(edit=self._scrollwidget, claims_left_right=True) self._subcontainer: bui.Widget | None = None - self._refresh() + self._refresh(select_get_more_maps_button=select_get_more_maps_button) + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull things out of self here; if we do it in the lambda we'll + # keep ourself alive. + gametype = self._gametype + sessiontype = self._sessiontype + config = self._config + edit_info = self._edit_info + completion_call = self._completion_call + select_get_more_maps = self._selected_get_more_maps + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + gametype=gametype, + sessiontype=sessiontype, + config=config, + edit_info=edit_info, + completion_call=completion_call, + select_get_more_maps_button=select_get_more_maps, + ) + ) def _refresh(self, select_get_more_maps_button: bool = False) -> None: # pylint: disable=too-many-statements @@ -198,10 +235,10 @@ class PlaylistMapSelectWindow(bui.Window): bui.widget(edit=btn, left_widget=self._cancel_button) if y == 0: bui.widget(edit=btn, up_widget=self._cancel_button) - if x == columns - 1 and bui.app.ui_v1.use_toolbars: + if x == columns - 1: bui.widget( edit=btn, - right_widget=bui.get_special_widget('party_button'), + right_widget=bui.get_special_widget('squad_button'), ) bui.widget(edit=btn, show_buffer_top=60, show_buffer_bottom=60) @@ -247,71 +284,40 @@ class PlaylistMapSelectWindow(bui.Window): ) def _on_store_press(self) -> None: - from bauiv1lib import account + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.store.browser import StoreBrowserWindow + # No-op if we're not in control. + if not self.main_window_has_control(): + return + plus = bui.app.plus assert plus is not None if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() + show_sign_in_prompt() return - StoreBrowserWindow( - modal=True, - show_tab=StoreBrowserWindow.TabID.MAPS, - on_close_call=self._on_store_close, - origin_widget=self._get_more_maps_button, + + self._selected_get_more_maps = True + + self.main_window_replace( + StoreBrowserWindow( + show_tab=StoreBrowserWindow.TabID.MAPS, + origin_widget=self._get_more_maps_button, + minimal_toolbars=True, + ) ) - def _on_store_close(self) -> None: - self._refresh(select_get_more_maps_button=True) - def _select(self, map_name: str) -> None: - from bauiv1lib.playlist.editgame import PlaylistEditGameWindow # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + if not self.main_window_has_control(): return self._config['settings']['map'] = map_name - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlaylistEditGameWindow( - self._gametype, - self._sessiontype, - self._config, - self._completion_call, - default_selection='map', - transition='in_left', - edit_info=self._edit_info, - ).get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_back() def _select_with_delay(self, map_name: str) -> None: bui.lock_all_input() bui.apptimer(0.1, bui.unlock_all_input) bui.apptimer(0.1, bui.WeakCall(self._select, map_name)) - - def _cancel(self) -> None: - from bauiv1lib.playlist.editgame import PlaylistEditGameWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PlaylistEditGameWindow( - self._gametype, - self._sessiontype, - self._config, - self._completion_call, - default_selection='map', - transition='in_left', - edit_info=self._edit_info, - ).get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/playoptions.py b/dist/ba_data/python/bauiv1lib/playoptions.py index cc69b3d..0bf2028 100644 --- a/dist/ba_data/python/bauiv1lib/playoptions.py +++ b/dist/ba_data/python/bauiv1lib/playoptions.py @@ -15,16 +15,22 @@ from bauiv1lib.popup import PopupWindow if TYPE_CHECKING: from typing import Any + from bauiv1lib.play import PlaylistSelectContext + +REQUIRE_PRO = False + class PlayOptionsWindow(PopupWindow): """A popup window for configuring play options.""" def __init__( self, + *, sessiontype: type[bs.Session], playlist: str, scale_origin: tuple[float, float], delegate: Any = None, + playlist_select_context: PlaylistSelectContext | None = None, ): # FIXME: Tidy this up. # pylint: disable=too-many-branches @@ -39,10 +45,7 @@ class PlayOptionsWindow(PopupWindow): self._pvars = PlaylistTypeVars(sessiontype) self._transitioning_out = False - # We behave differently if we're being used for playlist selection - # vs starting a game directly (should make this more elegant). - assert bui.app.classic is not None - self._selecting_mode = bui.app.ui_v1.selecting_private_party_playlist + self._playlist_select_context = playlist_select_context self._do_randomize_val = bui.app.config.get( self._pvars.config_name + ' Playlist Randomize', 0 @@ -65,7 +68,8 @@ class PlayOptionsWindow(PopupWindow): mesh_transparent = bui.getmesh('level_select_button_transparent') mask_tex = bui.gettexture('mapPreviewMask') - # Poke into this playlist and see if we can display some of its maps. + # Poke into this playlist and see if we can display some of its + # maps. map_textures = [] map_texture_entries = [] rows = 0 @@ -314,7 +318,7 @@ class PlayOptionsWindow(PopupWindow): label=bui.Lstr(resource='teamNamesColorText'), ) assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro(): bui.imagewidget( parent=self.root_widget, size=(30, 30), @@ -404,7 +408,11 @@ class PlayOptionsWindow(PopupWindow): on_activate_call=self._on_ok_press, autoselect=True, label=bui.Lstr( - resource='okText' if self._selecting_mode else 'playText' + resource=( + 'okText' + if self._playlist_select_context is not None + else 'playText' + ) ), ) @@ -426,7 +434,7 @@ class PlayOptionsWindow(PopupWindow): self._update() def _custom_colors_names_press(self) -> None: - from bauiv1lib.account import show_sign_in_prompt + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.teamnamescolors import TeamNamesColorsWindow from bauiv1lib.purchase import PurchaseWindow @@ -434,7 +442,7 @@ class PlayOptionsWindow(PopupWindow): assert plus is not None assert bui.app.classic is not None - if not bui.app.classic.accounts.have_pro(): + if REQUIRE_PRO and not bui.app.classic.accounts.have_pro(): if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() else: @@ -495,10 +503,10 @@ class PlayOptionsWindow(PopupWindow): cfg = bui.app.config cfg[self._pvars.config_name + ' Playlist Selection'] = self._playlist - # Head back to the gather window in playlist-select mode - # or start the game in regular mode. - if self._selecting_mode: - from bauiv1lib.gather import GatherWindow + # Head back to the gather window in playlist-select mode or + # start the game in regular mode. + if self._playlist_select_context is not None: + # from bauiv1lib.gather import GatherWindow if self._sessiontype is bs.FreeForAllSession: typename = 'ffa' @@ -508,14 +516,7 @@ class PlayOptionsWindow(PopupWindow): raise RuntimeError('Only teams and ffa currently supported') cfg['Private Party Host Session Type'] = typename bui.getsound('gunCocking').play() - assert bui.app.classic is not None - # Note: this is a wonky situation where we aren't actually - # the main window but we set it on behalf of the main window - # that popped us up. - bui.app.ui_v1.set_main_menu_window( - GatherWindow(transition='in_right').get_root_widget(), - from_window=False, # Disable this test. - ) + self._transition_out(transition='out_left') if self._delegate is not None: self._delegate.on_play_options_window_run_game() @@ -530,6 +531,11 @@ class PlayOptionsWindow(PopupWindow): def _run_selected_playlist(self) -> None: bui.unlock_all_input() + + # Save our place in the UI that we'll return to when done. + if bs.app.classic is not None: + bs.app.classic.save_ui_state() + try: bs.new_host_session(self._sessiontype) except Exception: diff --git a/dist/ba_data/python/bauiv1lib/popup.py b/dist/ba_data/python/bauiv1lib/popup.py index ef830f8..57e371d 100644 --- a/dist/ba_data/python/bauiv1lib/popup.py +++ b/dist/ba_data/python/bauiv1lib/popup.py @@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, override import bauiv1 as bui if TYPE_CHECKING: - from typing import Any, Sequence, Callable + from typing import Any, Sequence, Callable, Literal class PopupWindow: @@ -23,11 +23,17 @@ class PopupWindow: position: tuple[float, float], size: tuple[float, float], scale: float = 1.0, + *, offset: tuple[float, float] = (0, 0), bg_color: tuple[float, float, float] = (0.35, 0.55, 0.15), focus_position: tuple[float, float] = (0, 0), focus_size: tuple[float, float] | None = None, - toolbar_visibility: str = 'menu_minimal_no_back', + toolbar_visibility: Literal[ + 'inherit', + 'menu_minimal_no_back', + 'menu_store_no_back', + ] = 'menu_minimal_no_back', + edge_buffer_scale: float = 1.0, ): # pylint: disable=too-many-locals if focus_size is None: @@ -45,7 +51,7 @@ class PopupWindow: # we now need to ensure that we're all onscreen by scaling down if # need be and clamping it to the UI bounds. bounds = bui.uibounds() - edge_buffer = 15 + edge_buffer = 15 * edge_buffer_scale bounds_width = bounds[1] - bounds[0] - edge_buffer * 2 bounds_height = bounds[3] - bounds[2] - edge_buffer * 2 @@ -111,6 +117,7 @@ class PopupMenuWindow(PopupWindow): position: tuple[float, float], choices: Sequence[str], current_choice: str, + *, delegate: Any = None, width: float = 230.0, maxwidth: float | None = None, @@ -196,6 +203,7 @@ class PopupMenuWindow(PopupWindow): highlight=False, color=(0.35, 0.55, 0.15), size=(self._width - 40, self._height - 40), + border_opacity=0.5, ) self._columnwidget = bui.columnwidget( parent=self._scrollwidget, border=2, margin=0 @@ -296,6 +304,7 @@ class PopupMenu: parent: bui.Widget, position: tuple[float, float], choices: Sequence[str], + *, current_choice: str | None = None, on_value_change_call: Callable[[str], Any] | None = None, opening_call: Callable[[], Any] | None = None, diff --git a/dist/ba_data/python/bauiv1lib/profile/browser.py b/dist/ba_data/python/bauiv1lib/profile/browser.py index 4529cdb..649dc2c 100644 --- a/dist/ba_data/python/bauiv1lib/profile/browser.py +++ b/dist/ba_data/python/bauiv1lib/profile/browser.py @@ -5,7 +5,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui import bascenev1 as bs @@ -14,23 +14,19 @@ if TYPE_CHECKING: from typing import Any -class ProfileBrowserWindow(bui.Window): +class ProfileBrowserWindow(bui.MainWindow): """Window for browsing player profiles.""" def __init__( self, - transition: str = 'in_right', - in_main_menu: bool = True, + transition: str | None = 'in_right', + # in_main_menu: bool = True, selected_profile: str | None = None, origin_widget: bui.Widget | None = None, + minimal_toolbar: bool = False, ): - # pylint: disable=too-many-statements - # pylint: disable=too-many-locals - self._in_main_menu = in_main_menu - if self._in_main_menu: - back_label = bui.Lstr(resource='backText') - else: - back_label = bui.Lstr(resource='doneText') + self._minimal_toolbar = minimal_toolbar + back_label = bui.Lstr(resource='backText') assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale self._width = 800.0 if uiscale is bui.UIScale.SMALL else 600.0 @@ -41,20 +37,11 @@ class ProfileBrowserWindow(bui.Window): else 385.0 if uiscale is bui.UIScale.MEDIUM else 410.0 ) - # If we're being called up standalone, handle pause/resume ourself. - if not self._in_main_menu: - assert bui.app.classic is not None - bui.app.classic.pause() - - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None + # Need to handle out-transitions ourself for modal mode. if origin_widget is not None: self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' else: self._transition_out = 'out_right' - scale_origin = None self._r = 'playerProfilesWindow' @@ -67,30 +54,47 @@ class ProfileBrowserWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height + top_extra), - transition=transition, - scale_origin_stack_offset=scale_origin, + toolbar_visibility=( + 'menu_minimal' + if (uiscale is bui.UIScale.SMALL or minimal_toolbar) + else 'menu_full' + ), scale=( - 2.2 + 2.5 if uiscale is bui.UIScale.SMALL - else 1.6 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=( (0, -14) if uiscale is bui.UIScale.SMALL else (0, 0) ), - ) + ), + transition=transition, + origin_widget=origin_widget, ) - self._back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(40 + x_inset, self._height - 59), - size=(120, 60), - scale=0.8, - label=back_label, - button_type='back' if self._in_main_menu else None, - autoselect=True, - on_activate_call=self._back, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) + if bui.app.ui_v1.uiscale is bui.UIScale.SMALL: + self._back_button = bui.get_special_widget('back_button') + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + self._back_button = btn = bui.buttonwidget( + parent=self._root_widget, + position=(40 + x_inset, self._height - 59), + size=(120, 60), + scale=0.8, + label=back_label, + button_type='back', + autoselect=True, + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + bui.buttonwidget( + edit=btn, + button_type='backSmall', + size=(60, 60), + label=bui.charstr(bui.SpecialChar.BACK), + ) bui.textwidget( parent=self._root_widget, @@ -104,14 +108,6 @@ class ProfileBrowserWindow(bui.Window): v_align='center', ) - if self._in_main_menu: - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - scroll_height = self._height - 140.0 self._scroll_width = self._width - (188 + x_inset * 2) v = self._height - 84.0 @@ -203,13 +199,32 @@ class ProfileBrowserWindow(bui.Window): self._refresh() self._restore_state() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + minimal_toolbar = self._minimal_toolbar + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + minimal_toolbar=minimal_toolbar, + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _new_profile(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.profile.edit import EditProfileWindow from bauiv1lib.purchase import PurchaseWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # No-op if we're not the in-control main window. + if not self.main_window_has_control(): return plus = bui.app.plus @@ -220,7 +235,8 @@ class ProfileBrowserWindow(bui.Window): assert self._profiles is not None assert bui.app.classic is not None if ( - not bui.app.classic.accounts.have_pro_options() + bool(False) # Phasing out pro. + and not bui.app.classic.accounts.have_pro_options() and len(self._profiles) >= max_non_pro_profiles ): PurchaseWindow( @@ -247,14 +263,7 @@ class ProfileBrowserWindow(bui.Window): bui.getsound('error').play() return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.app.ui_v1.set_main_menu_window( - EditProfileWindow( - existing_profile=None, in_main_menu=self._in_main_menu - ).get_root_widget(), - from_window=self._root_widget if self._in_main_menu else False, - ) + self.main_window_replace(EditProfileWindow(existing_profile=None)) def _delete_profile(self) -> None: # pylint: disable=cyclic-import @@ -302,8 +311,8 @@ class ProfileBrowserWindow(bui.Window): # pylint: disable=cyclic-import from bauiv1lib.profile.edit import EditProfileWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # No-op if we're not in control. + if not self.main_window_has_control(): return if self._selected_profile is None: @@ -312,45 +321,13 @@ class ProfileBrowserWindow(bui.Window): bui.Lstr(resource='nothingIsSelectedErrorText'), color=(1, 0, 0) ) return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - EditProfileWindow( - self._selected_profile, in_main_menu=self._in_main_menu - ).get_root_widget(), - from_window=self._root_widget if self._in_main_menu else False, - ) + + self.main_window_replace(EditProfileWindow(self._selected_profile)) def _select(self, name: str, index: int) -> None: del index # Unused. self._selected_profile = name - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.account.settings import AccountSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - assert bui.app.classic is not None - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if self._in_main_menu: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AccountSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - - # If we're being called up standalone, handle pause/resume ourself. - else: - bui.app.classic.resume() - def _refresh(self) -> None: # pylint: disable=too-many-locals # pylint: disable=too-many-statements diff --git a/dist/ba_data/python/bauiv1lib/profile/edit.py b/dist/ba_data/python/bauiv1lib/profile/edit.py index b474776..2cfe76c 100644 --- a/dist/ba_data/python/bauiv1lib/profile/edit.py +++ b/dist/ba_data/python/bauiv1lib/profile/edit.py @@ -5,49 +5,54 @@ from __future__ import annotations import random -from typing import cast +from typing import cast, override from bauiv1lib.colorpicker import ColorPicker +from bauiv1lib.characterpicker import CharacterPickerDelegate +from bauiv1lib.iconpicker import IconPickerDelegate import bauiv1 as bui import bascenev1 as bs -class EditProfileWindow(bui.Window): +class EditProfileWindow( + bui.MainWindow, CharacterPickerDelegate, IconPickerDelegate +): """Window for editing a player profile.""" - # FIXME: WILL NEED TO CHANGE THIS FOR UILOCATION. def reload_window(self) -> None: """Transitions out and recreates ourself.""" - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - EditProfileWindow( - self.getname(), self._in_main_menu - ).get_root_widget(), - from_window=self._root_widget, + # Replace ourself with ourself, but keep the same back location. + assert self.main_window_back_state is not None + self.main_window_replace( + EditProfileWindow(self.getname()), + back_state=self.main_window_back_state, ) + # def __del__(self) -> None: + # print(f'~EditProfileWindow({id(self)})') + def __init__( self, existing_profile: str | None, - in_main_menu: bool, - transition: str = 'in_right', + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): # FIXME: Tidy this up a bit. # pylint: disable=too-many-branches # pylint: disable=too-many-statements # pylint: disable=too-many-locals + assert bui.app.classic is not None + # print(f'EditProfileWindow({id(self)})') plus = bui.app.plus assert plus is not None - self._in_main_menu = in_main_menu self._existing_profile = existing_profile self._r = 'editProfileWindow' self._spazzes: list[str] = [] @@ -63,30 +68,35 @@ class EditProfileWindow(bui.Window): self._width = width = 880.0 if uiscale is bui.UIScale.SMALL else 680.0 self._x_inset = x_inset = 100.0 if uiscale is bui.UIScale.SMALL else 0.0 self._height = height = ( - 350.0 + 500.0 if uiscale is bui.UIScale.SMALL else 400.0 if uiscale is bui.UIScale.MEDIUM else 450.0 ) + yoffs = -42 if uiscale is bui.UIScale.SMALL else 0 spacing = 40 self._base_scale = ( - 2.05 + 2.0 if uiscale is bui.UIScale.SMALL - else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 ) - top_extra = 15 if uiscale is bui.UIScale.SMALL else 15 + top_extra = 70 if uiscale is bui.UIScale.SMALL else 15 super().__init__( root_widget=bui.containerwidget( size=(width, height + top_extra), - transition=transition, scale=self._base_scale, stack_offset=( - (0, 15) if uiscale is bui.UIScale.SMALL else (0, 0) + (0, 0) if uiscale is bui.UIScale.SMALL else (0, 0) ), - ) + toolbar_visibility=( + None if uiscale is bui.UIScale.SMALL else 'menu_full' + ), + ), + transition=transition, + origin_widget=origin_widget, ) cancel_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(52 + x_inset, height - 60), + position=(52 + x_inset, height - 60 + yoffs), size=(155, 60), scale=0.8, autoselect=True, @@ -96,7 +106,7 @@ class EditProfileWindow(bui.Window): bui.containerwidget(edit=self._root_widget, cancel_button=btn) save_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(width - (177 + x_inset), height - 60), + position=(width - (177 + x_inset), height - 60 + yoffs), size=(155, 60), autoselect=True, scale=0.8, @@ -107,7 +117,7 @@ class EditProfileWindow(bui.Window): bui.containerwidget(edit=self._root_widget, start_button=btn) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, height - 38), + position=(self._width * 0.5, height - 38 + yoffs), size=(0, 0), text=( bui.Lstr(resource=f'{self._r}.titleNewText') @@ -157,7 +167,7 @@ class EditProfileWindow(bui.Window): self._icon_index = icon_index bui.buttonwidget(edit=save_button, on_activate_call=self.save) - v = height - 115.0 + v = height - 115.0 + yoffs self._name = ( '' if self._existing_profile is None else self._existing_profile ) @@ -512,6 +522,23 @@ class EditProfileWindow(bui.Window): ) self._update_character() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull things out of self here; if we do it within the lambda + # we'll keep ourself alive which is bad. + + existing_profile = self._existing_profile + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + existing_profile=existing_profile, + ) + ) + def assign_random_name(self) -> None: """Assigning a random name to the player.""" names = bs.get_random_names() @@ -523,14 +550,23 @@ class EditProfileWindow(bui.Window): def upgrade_profile(self) -> None: """Attempt to upgrade the profile to global.""" - from bauiv1lib import account + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.profile import upgrade as pupgrade + new_name = self.getname().strip() + + if self._existing_profile and self._existing_profile != new_name: + bui.screenmessage( + 'Unsaved changes found; you must save first.', color=(1, 0, 0) + ) + bui.getsound('error').play() + return + plus = bui.app.plus assert plus is not None if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() + show_sign_in_prompt() return pupgrade.ProfileUpgradeWindow(self) @@ -609,23 +645,55 @@ class EditProfileWindow(bui.Window): for s in self._spazzes ] + @override def on_icon_picker_pick(self, icon: str) -> None: """An icon has been selected by the picker.""" self._icon = icon self._update_icon() + @override + def on_icon_picker_get_more_press(self) -> None: + """User wants to get more icons.""" + from bauiv1lib.store.browser import StoreBrowserWindow + + if not self.main_window_has_control(): + return + + self.main_window_replace( + StoreBrowserWindow( + minimal_toolbars=True, + show_tab=StoreBrowserWindow.TabID.ICONS, + ) + ) + + @override def on_character_picker_pick(self, character: str) -> None: """A character has been selected by the picker.""" if not self._root_widget: return - # The player could have bought a new one while the picker was up. + # The player could have bought a new one while the picker was + # up. self.refresh_characters() self._icon_index = ( self._spazzes.index(character) if character in self._spazzes else 0 ) self._update_character() + @override + def on_character_picker_get_more_press(self) -> None: + from bauiv1lib.store.browser import StoreBrowserWindow + + if not self.main_window_has_control(): + return + + self.main_window_replace( + StoreBrowserWindow( + minimal_toolbars=True, + show_tab=StoreBrowserWindow.TabID.CHARACTERS, + ) + ) + def _on_character_press(self) -> None: from bauiv1lib import characterpicker @@ -672,22 +740,7 @@ class EditProfileWindow(bui.Window): ) def _cancel(self) -> None: - from bauiv1lib.profile.browser import ProfileBrowserWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ProfileBrowserWindow( - 'in_left', - selected_profile=self._existing_profile, - in_main_menu=self._in_main_menu, - ).get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_back() def _set_color(self, color: tuple[float, float, float]) -> None: self._color = color @@ -783,7 +836,6 @@ class EditProfileWindow(bui.Window): def save(self, transition_out: bool = True) -> bool: """Save has been selected.""" - from bauiv1lib.profile.browser import ProfileBrowserWindow # no-op if our underlying widget is dead or on its way out. if not self._root_widget or self._root_widget.transitioning_out: @@ -820,8 +872,8 @@ class EditProfileWindow(bui.Window): } ) - # Also lets be aware we're no longer global if we're taking a - # new name (will need to re-request it). + # Also lets be aware we're no longer global if we're taking + # a new name (will need to re-request it). self._global = False plus.add_v1_account_transaction( @@ -840,14 +892,6 @@ class EditProfileWindow(bui.Window): if transition_out: plus.run_v1_account_transactions() - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ProfileBrowserWindow( - 'in_left', - selected_profile=new_name, - in_main_menu=self._in_main_menu, - ).get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_back() + return True diff --git a/dist/ba_data/python/bauiv1lib/profile/upgrade.py b/dist/ba_data/python/bauiv1lib/profile/upgrade.py index 89340bb..cb2bc96 100644 --- a/dist/ba_data/python/bauiv1lib/profile/upgrade.py +++ b/dist/ba_data/python/bauiv1lib/profile/upgrade.py @@ -32,15 +32,16 @@ class ProfileUpgradeWindow(bui.Window): self._r = 'editProfileWindow' - self._width = 680 - self._height = 350 - assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale + self._width = 750 if uiscale is bui.UIScale.SMALL else 680 + self._height = 450 if uiscale is bui.UIScale.SMALL else 350 + assert bui.app.classic is not None self._base_scale = ( - 2.05 + 1.92 if uiscale is bui.UIScale.SMALL else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.2 ) + yoffs = -60.0 if uiscale is bui.UIScale.SMALL else 0 self._upgrade_start_time: float | None = None self._name = edit_profile_window.getname() self._edit_profile_window = weakref.ref(edit_profile_window) @@ -49,17 +50,17 @@ class ProfileUpgradeWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height + top_extra), - toolbar_visibility='menu_currency', + toolbar_visibility='menu_store_no_back', transition=transition, scale=self._base_scale, stack_offset=( - (0, 15) if uiscale is bui.UIScale.SMALL else (0, 0) + (0, 0) if uiscale is bui.UIScale.SMALL else (0, 0) ), ) ) cancel_button = bui.buttonwidget( parent=self._root_widget, - position=(52, 30), + position=(52, self._height - 290 + yoffs), size=(155, 60), scale=0.8, autoselect=True, @@ -68,7 +69,7 @@ class ProfileUpgradeWindow(bui.Window): ) self._upgrade_button = bui.buttonwidget( parent=self._root_widget, - position=(self._width - 190, 30), + position=(self._width - 190, self._height - 290 + yoffs), size=(155, 60), scale=0.8, autoselect=True, @@ -85,7 +86,7 @@ class ProfileUpgradeWindow(bui.Window): assert bui.app.classic is not None bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 38), + position=(self._width * 0.5, self._height - 38 + yoffs), size=(0, 0), text=bui.Lstr(resource=f'{self._r}.upgradeToGlobalProfileText'), color=bui.app.ui_v1.title_color, @@ -98,7 +99,7 @@ class ProfileUpgradeWindow(bui.Window): assert bui.app.classic is not None bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 100), + position=(self._width * 0.5, self._height - 100 + yoffs), size=(0, 0), text=bui.Lstr(resource=f'{self._r}.upgradeProfileInfoText'), color=bui.app.ui_v1.infotextcolor, @@ -110,7 +111,7 @@ class ProfileUpgradeWindow(bui.Window): self._status_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 160), + position=(self._width * 0.5, self._height - 160 + yoffs), size=(0, 0), text=bui.Lstr( resource=f'{self._r}.checkingAvailabilityText', @@ -125,7 +126,7 @@ class ProfileUpgradeWindow(bui.Window): self._price_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 230), + position=(self._width * 0.5, self._height - 230 + yoffs), size=(0, 0), text='', color=(0.2, 1, 0.2), @@ -135,22 +136,6 @@ class ProfileUpgradeWindow(bui.Window): v_align='center', ) - self._tickets_text: bui.Widget | None - if not bui.app.ui_v1.use_toolbars: - self._tickets_text = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.9 - 5, self._height - 30), - size=(0, 0), - text=bui.charstr(bui.SpecialChar.TICKET) + '123', - color=(0.2, 1, 0.2), - maxwidth=100, - scale=0.5, - h_align='right', - v_align='center', - ) - else: - self._tickets_text = None - bui.app.classic.master_server_v1_get( 'bsGlobalProfileCheck', {'name': self._name, 'b': bui.app.env.engine_build_number}, @@ -161,7 +146,7 @@ class ProfileUpgradeWindow(bui.Window): ) self._status: str | None = 'waiting' self._update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update), repeat=True + 1.023, bui.WeakCall(self._update), repeat=True ) self._update() @@ -210,7 +195,7 @@ class ProfileUpgradeWindow(bui.Window): ) def _on_upgrade_press(self) -> None: - from bauiv1lib import gettickets + # from bauiv1lib import gettickets if self._status is None: plus = bui.app.plus @@ -220,7 +205,11 @@ class ProfileUpgradeWindow(bui.Window): tickets = plus.get_v1_account_ticket_count() if tickets < self._cost: bui.getsound('error').play() - gettickets.show_get_tickets_prompt() + bui.screenmessage( + bui.Lstr(resource='notEnoughTicketsText'), + color=(1, 0, 0), + ) + # gettickets.show_get_tickets_prompt() return bui.screenmessage( bui.Lstr(resource='purchasingText'), color=(0, 1, 0) @@ -255,23 +244,11 @@ class ProfileUpgradeWindow(bui.Window): plus = bui.app.plus assert plus is not None - try: - t_str = str(plus.get_v1_account_ticket_count()) - except Exception: - t_str = '?' - if self._tickets_text is not None: - bui.textwidget( - edit=self._tickets_text, - text=bui.Lstr( - resource='getTicketsWindow.youHaveShortText', - subs=[ - ( - '${COUNT}', - bui.charstr(bui.SpecialChar.TICKET) + t_str, - ) - ], - ), - ) + # If our originating window dies at any point, cancel. + edit_profile_window = self._edit_profile_window() + if edit_profile_window is None: + self._cancel() + return # Once we've kicked off an upgrade attempt and all transactions go # through, we're done. diff --git a/dist/ba_data/python/bauiv1lib/promocode.py b/dist/ba_data/python/bauiv1lib/promocode.py deleted file mode 100644 index 09bcf86..0000000 --- a/dist/ba_data/python/bauiv1lib/promocode.py +++ /dev/null @@ -1,223 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""UI functionality for entering promo codes.""" - -from __future__ import annotations - -import time -import logging -from typing import TYPE_CHECKING - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any - - -class PromoCodeWindow(bui.Window): - """Window for entering promo codes.""" - - def __init__( - self, modal: bool = False, origin_widget: bui.Widget | None = None - ): - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - transition = 'in_right' - - width = 450 - height = 330 - - self._modal = modal - self._r = 'promoCodeWindow' - - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - super().__init__( - root_widget=bui.containerwidget( - size=(width, height), - transition=transition, - toolbar_visibility='menu_minimal_no_back', - scale_origin_stack_offset=scale_origin, - scale=( - 2.0 - if uiscale is bui.UIScale.SMALL - else 1.5 - if uiscale is bui.UIScale.MEDIUM - else 1.0 - ), - ) - ) - - btn = bui.buttonwidget( - parent=self._root_widget, - scale=0.5, - position=(40, height - 40), - size=(60, 60), - label='', - on_activate_call=self._do_back, - autoselect=True, - color=(0.55, 0.5, 0.6), - icon=bui.gettexture('crossOut'), - iconscale=1.2, - ) - - v = height - 74 - bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource='codesExplainText'), - maxwidth=width * 0.9, - position=(width * 0.5, v), - color=(0.7, 0.7, 0.7, 1.0), - size=(0, 0), - scale=0.8, - h_align='center', - v_align='center', - ) - v -= 60 - - bui.textwidget( - parent=self._root_widget, - text=bui.Lstr( - resource='supportEmailText', - subs=[('${EMAIL}', 'support@froemling.net')], - ), - maxwidth=width * 0.9, - position=(width * 0.5, v), - color=(0.7, 0.7, 0.7, 1.0), - size=(0, 0), - scale=0.65, - h_align='center', - v_align='center', - ) - - v -= 80 - - bui.textwidget( - parent=self._root_widget, - text=bui.Lstr(resource=self._r + '.codeText'), - position=(22, v), - color=(0.8, 0.8, 0.8, 1.0), - size=(90, 30), - h_align='right', - ) - v -= 8 - - self._text_field = bui.textwidget( - parent=self._root_widget, - position=(125, v), - size=(280, 46), - text='', - h_align='left', - v_align='center', - max_chars=64, - color=(0.9, 0.9, 0.9, 1.0), - description=bui.Lstr(resource=self._r + '.codeText'), - editable=True, - padding=4, - on_return_press_call=self._activate_enter_button, - ) - bui.widget(edit=btn, down_widget=self._text_field) - - v -= 79 - b_width = 200 - self._enter_button = btn2 = bui.buttonwidget( - parent=self._root_widget, - position=(width * 0.5 - b_width * 0.5, v), - size=(b_width, 60), - scale=1.0, - label=bui.Lstr( - resource='submitText', fallback_resource=self._r + '.enterText' - ), - on_activate_call=self._do_enter, - ) - bui.containerwidget( - edit=self._root_widget, - cancel_button=btn, - start_button=btn2, - selected_child=self._text_field, - ) - - def _do_back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - - def _activate_enter_button(self) -> None: - self._enter_button.activate() - - def _do_enter(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - - code: Any = bui.textwidget(query=self._text_field) - assert isinstance(code, str) - - bui.app.create_async_task(_run_code(code)) - - -async def _run_code(code: str) -> None: - from bacommon.cloud import PromoCodeMessage - - plus = bui.app.plus - assert plus is not None - - try: - # If we're signed in with a V2 account, ship this to V2 server. - if plus.accounts.primary is not None: - with plus.accounts.primary: - response = await plus.cloud.send_message_async( - PromoCodeMessage(code) - ) - # If V2 handled it, we're done. - if response.valid: - # Support simple message printing from v2 server. - if response.message is not None: - bui.screenmessage(response.message, color=(0, 1, 0)) - return - - # If V2 didn't accept it (or isn't signed in) kick it over to V1. - plus.add_v1_account_transaction( - { - 'type': 'PROMO_CODE', - 'expire_time': time.time() + 5, - 'code': code, - } - ) - plus.run_v1_account_transactions() - except Exception: - logging.exception('Error sending promo code.') - bui.screenmessage('Error sending code (see log).', color=(1, 0, 0)) - bui.getsound('error').play() diff --git a/dist/ba_data/python/bauiv1lib/purchase.py b/dist/ba_data/python/bauiv1lib/purchase.py index 60f97b0..68c231b 100644 --- a/dist/ba_data/python/bauiv1lib/purchase.py +++ b/dist/ba_data/python/bauiv1lib/purchase.py @@ -18,7 +18,7 @@ class PurchaseWindow(bui.Window): def __init__( self, items: list[str], - transition: str = 'in_right', + origin_widget: bui.Widget | None = None, header_text: bui.Lstr | None = None, ): from bauiv1lib.store.item import instantiate_store_item_display @@ -40,16 +40,24 @@ class PurchaseWindow(bui.Window): self._width = 580 self._height = 520 uiscale = bui.app.ui_v1.uiscale + + if origin_widget is not None: + scale_origin = origin_widget.get_screen_space_center() + else: + scale_origin = None + super().__init__( root_widget=bui.containerwidget( + parent=bui.get_special_widget('overlay_stack'), size=(self._width, self._height), - transition=transition, - toolbar_visibility='menu_currency', + transition='in_scale', + toolbar_visibility='menu_store', scale=( 1.2 if uiscale is bui.UIScale.SMALL else 1.1 if uiscale is bui.UIScale.MEDIUM else 1.0 ), + scale_origin_stack_offset=scale_origin, stack_offset=( (0, -15) if uiscale is bui.UIScale.SMALL else (0, 0) ), @@ -155,14 +163,13 @@ class PurchaseWindow(bui.Window): if bui.app.classic.accounts.have_pro(): can_die = True else: - if plus.get_purchased(self._items[0]): + if plus.get_v1_account_product_purchased(self._items[0]): can_die = True if can_die: - bui.containerwidget(edit=self._root_widget, transition='out_left') + bui.containerwidget(edit=self._root_widget, transition='out_scale') def _purchase(self) -> None: - from bauiv1lib import gettickets plus = bui.app.plus assert plus is not None @@ -176,8 +183,12 @@ class PurchaseWindow(bui.Window): except Exception: ticket_count = None if ticket_count is not None and ticket_count < self._price: - gettickets.show_get_tickets_prompt() bui.getsound('error').play() + bui.screenmessage( + bui.Lstr(resource='notEnoughTicketsText'), + color=(1, 0, 0), + ) + # gettickets.show_get_tickets_prompt() return def do_it() -> None: @@ -189,4 +200,4 @@ class PurchaseWindow(bui.Window): do_it() def _cancel(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_right') + bui.containerwidget(edit=self._root_widget, transition='out_scale') diff --git a/dist/ba_data/python/bauiv1lib/resourcetypeinfo.py b/dist/ba_data/python/bauiv1lib/resourcetypeinfo.py index a3e39eb..eb92e28 100644 --- a/dist/ba_data/python/bauiv1lib/resourcetypeinfo.py +++ b/dist/ba_data/python/bauiv1lib/resourcetypeinfo.py @@ -4,26 +4,34 @@ from __future__ import annotations -from typing import override +from typing import override, TYPE_CHECKING, assert_never from bauiv1lib.popup import PopupWindow import bauiv1 as bui +if TYPE_CHECKING: + from typing import Literal + class ResourceTypeInfoWindow(PopupWindow): """Popup window providing info about resource types.""" - def __init__(self, origin_widget: bui.Widget): + def __init__( + self, + resource_type: Literal['tickets', 'tokens', 'trophies', 'xp'], + origin_widget: bui.Widget, + ): assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale scale = ( - 2.3 + 2.0 if uiscale is bui.UIScale.SMALL - else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 + else 1.4 if uiscale is bui.UIScale.MEDIUM else 0.8 ) self._transitioning_out = False self._width = 570 - self._height = 350 + self._height = 400 + self._get_tokens_button: bui.Widget | None = None bg_color = (0.5, 0.4, 0.6) super().__init__( size=(self._width, self._height), @@ -31,12 +39,13 @@ class ResourceTypeInfoWindow(PopupWindow): scale=scale, bg_color=bg_color, position=origin_widget.get_screen_space_center(), + edge_buffer_scale=4.0, ) self._cancel_button = bui.buttonwidget( parent=self.root_widget, - position=(50, self._height - 30), + position=(40, self._height - 40), size=(50, 50), - scale=0.5, + scale=0.7, label='', color=bg_color, on_activate_call=self._on_cancel_press, @@ -45,6 +54,77 @@ class ResourceTypeInfoWindow(PopupWindow): iconscale=1.2, ) + yoffs = self._height - 145 + + max_rdesc_height = 160 + + rdesc: bui.Lstr | str + + if resource_type == 'tickets': + yoffs -= 20 + rdesc = bui.Lstr(resource='ticketsDescriptionText') + texname = 'tickets' + elif resource_type == 'tokens': + rdesc = bui.Lstr(resource='tokens.tokensDescriptionText') + texname = 'coin' + bwidth = 200 + bheight = 50 + + # Show 'Get Tokens' button if we don't have a gold pass + # (in case a user doesn't notice the '+' button or we have + # it disabled for some reason). + if not bui.app.classic.gold_pass: + self._get_tokens_button = bui.buttonwidget( + parent=self.root_widget, + position=( + self._width * 0.5 - bwidth * 0.5, + yoffs - 15.0 - bheight - max_rdesc_height, + ), + color=bg_color, + textcolor=(0.8, 0.8, 0.8), + label=bui.Lstr(resource='tokens.getTokensText'), + size=(bwidth, bheight), + autoselect=True, + on_activate_call=bui.WeakCall(self._on_get_tokens_press), + ) + + elif resource_type == 'trophies': + rdesc = 'TODO: Will show trophies & league rankings.' + texname = 'crossOut' + elif resource_type == 'xp': + rdesc = 'TODO: Will describe xp/levels.' + texname = 'crossOut' + else: + assert_never(resource_type) + + imgsize = 100.0 + bui.imagewidget( + parent=self.root_widget, + position=(self._width * 0.5 - imgsize * 0.5, yoffs + 5.0), + size=(imgsize, imgsize), + texture=bui.gettexture(texname), + ) + + bui.textwidget( + parent=self.root_widget, + h_align='center', + v_align='top', + size=(0, 0), + maxwidth=self._width * 0.8, + max_height=max_rdesc_height, + position=(self._width * 0.5, yoffs - 5.0), + text=rdesc, + scale=0.8, + ) + + def _on_get_tokens_press(self) -> None: + from bauiv1lib.gettokens import show_get_tokens_window + + self._transition_out() + show_get_tokens_window( + origin_widget=bui.existing(self._get_tokens_button) + ) + def _on_cancel_press(self) -> None: self._transition_out() diff --git a/dist/ba_data/python/bauiv1lib/sendinfo.py b/dist/ba_data/python/bauiv1lib/sendinfo.py index 0a1cf59..b1b8808 100644 --- a/dist/ba_data/python/bauiv1lib/sendinfo.py +++ b/dist/ba_data/python/bauiv1lib/sendinfo.py @@ -6,7 +6,7 @@ from __future__ import annotations import time import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -14,26 +14,23 @@ if TYPE_CHECKING: from typing import Any -class SendInfoWindow(bui.Window): +class SendInfoWindow(bui.MainWindow): """Window for sending info to the developer.""" def __init__( self, modal: bool = False, legacy_code_mode: bool = False, + transition: str | None = 'in_scale', origin_widget: bui.Widget | None = None, ): self._legacy_code_mode = legacy_code_mode - scale_origin: tuple[float, float] | None + # Need to wrangle our own transition-out in modal mode. if origin_widget is not None: self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' else: self._transition_out = 'out_right' - scale_origin = None - transition = 'in_right' width = 450 if legacy_code_mode else 600 height = 200 if legacy_code_mode else 300 @@ -46,15 +43,19 @@ class SendInfoWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - toolbar_visibility='menu_minimal_no_back', - scale_origin_stack_offset=scale_origin, + toolbar_visibility=( + 'menu_minimal_no_back' + if uiscale is bui.UIScale.SMALL or modal + else 'menu_full' + ), scale=( 2.0 if uiscale is bui.UIScale.SMALL else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 ), - ) + ), + transition=transition, + origin_widget=origin_widget, ) btn = bui.buttonwidget( @@ -163,9 +164,33 @@ class SendInfoWindow(bui.Window): selected_child=self._text_field, ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + assert not self._modal + + # Pull stuff out of self here; if we do it in the lambda we'll + # keep self alive which we don't want. + legacy_code_mode = self._legacy_code_mode + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + legacy_code_mode=legacy_code_mode, + transition=transition, + origin_widget=origin_widget, + ) + ) + def _do_back(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow + + if not self._modal: + self.main_window_back() + return + + # Handle modal case: # no-op if our underlying widget is dead or on its way out. if not self._root_widget or self._root_widget.transitioning_out: @@ -174,40 +199,33 @@ class SendInfoWindow(bui.Window): bui.containerwidget( edit=self._root_widget, transition=self._transition_out ) - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) def _activate_enter_button(self) -> None: self._enter_button.activate() def _do_enter(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow + # from bauiv1lib.settings.advanced import AdvancedSettingsWindow plus = bui.app.plus assert plus is not None - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - description: Any = bui.textwidget(query=self._text_field) assert isinstance(description, str) + if self._modal: + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + bui.containerwidget( + edit=self._root_widget, transition=self._transition_out + ) + else: + # no-op if we're not in control. + if not self.main_window_has_control(): + return + self.main_window_back() + # Used for things like unlocking shared playlists or linking # accounts: talk directly to V1 server via transactions. if self._legacy_code_mode: diff --git a/dist/ba_data/python/bauiv1lib/settings/advanced.py b/dist/ba_data/python/bauiv1lib/settings/advanced.py index 521762a..a497a83 100644 --- a/dist/ba_data/python/bauiv1lib/settings/advanced.py +++ b/dist/ba_data/python/bauiv1lib/settings/advanced.py @@ -1,12 +1,14 @@ # Released under the MIT License. See LICENSE for details. # +# pylint: disable=too-many-lines + """UI functionality for advanced settings.""" from __future__ import annotations import os import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from bauiv1lib.popup import PopupMenu import bauiv1 as bui @@ -15,66 +17,75 @@ if TYPE_CHECKING: from typing import Any -class AdvancedSettingsWindow(bui.Window): +class AdvancedSettingsWindow(bui.MainWindow): """Window for editing advanced app settings.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-statements - import threading if bui.app.classic is None: raise RuntimeError('This requires classic support.') # Preload some modules we use in a background thread so we won't # have a visual hitch when the user taps them. - threading.Thread(target=self._preload_modules).start() + bui.app.threadpool.submit_no_wait(self._preload_modules) app = bui.app assert app.classic is not None - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - uiscale = bui.app.ui_v1.uiscale - self._width = 970.0 if uiscale is bui.UIScale.SMALL else 670.0 - x_inset = 150 if uiscale is bui.UIScale.SMALL else 0 + self._width = 1030.0 if uiscale is bui.UIScale.SMALL else 670.0 self._height = ( - 390.0 + 490.0 if uiscale is bui.UIScale.SMALL - else 450.0 if uiscale is bui.UIScale.MEDIUM else 520.0 + else 450.0 if uiscale is bui.UIScale.MEDIUM else 600.0 ) self._lang_status_text: bui.Widget | None = None self._spacing = 32 self._menu_open = False - top_extra = 10 if uiscale is bui.UIScale.SMALL else 0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.2 + if uiscale is bui.UIScale.SMALL + else 1.3 if uiscale is bui.UIScale.MEDIUM else 0.9 + ) + + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 80, screensize[0] / scale) + target_height = min(self._height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 25 + scroll_bottom = yoffs - 56 - self._scroll_height super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.06 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -25) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) self._prev_lang = '' @@ -87,9 +98,7 @@ class AdvancedSettingsWindow(bui.Window): # so no need to show this. self._show_always_use_internal_keyboard = not app.env.vr - self._scroll_width = self._width - (100 + 2 * x_inset) - self._scroll_height = self._height - 115.0 - self._sub_width = self._scroll_width * 0.95 + self._sub_width = min(550, self._scroll_width * 0.95) self._sub_height = 870.0 if self._show_always_use_internal_keyboard: @@ -99,6 +108,10 @@ class AdvancedSettingsWindow(bui.Window): if self._show_disable_gyro: self._sub_height += 42 + self._show_use_insecure_connections = True + if self._show_use_insecure_connections: + self._sub_height += 82 + self._do_vr_test_button = app.env.vr self._do_net_test_button = True self._extra_button_spacing = self._spacing * 2.5 @@ -112,21 +125,21 @@ class AdvancedSettingsWindow(bui.Window): self._r = 'settingsWindowAdvanced' - if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._do_back + edit=self._root_widget, on_cancel_call=self.main_window_back ) self._back_button = None else: self._back_button = bui.buttonwidget( parent=self._root_widget, - position=(53 + x_inset, self._height - 60), - size=(140, 60), + position=(50, yoffs - 48), + size=(60, 60), scale=0.8, autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._do_back, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) bui.containerwidget( edit=self._root_widget, cancel_button=self._back_button @@ -134,29 +147,30 @@ class AdvancedSettingsWindow(bui.Window): self._title_text = bui.textwidget( parent=self._root_widget, - position=(0, self._height - 52), - size=(self._width, 25), + position=( + self._width * 0.5, + yoffs - (43 if uiscale is bui.UIScale.SMALL else 25), + ), + size=(0, 0), + scale=0.75 if uiscale is bui.UIScale.SMALL else 1.0, text=bui.Lstr(resource=f'{self._r}.titleText'), color=app.ui_v1.title_color, h_align='center', - v_align='top', + v_align='center', ) - if self._back_button is not None: - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - self._scrollwidget = bui.scrollwidget( parent=self._root_widget, - position=(50 + x_inset, 50), + size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + scroll_bottom, + ), simple_culling_v=20.0, highlight=False, - size=(self._scroll_width, self._scroll_height), + center_small_content_horizontally=True, selection_loops_to_parent=True, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, right_widget=self._scrollwidget) self._subcontainer = bui.containerwidget( @@ -180,10 +194,23 @@ class AdvancedSettingsWindow(bui.Window): callback=bui.WeakCall(self._completed_langs_cb), ) - # noinspection PyUnresolvedReferences + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + @staticmethod def _preload_modules() -> None: - """Preload modules we use; avoids hitches (called in bg thread).""" + """Preload stuff in bg thread to avoid hitches in logic thread""" from babase import modutils as _unused2 from bauiv1lib import config as _unused1 from bauiv1lib.settings import vrtesting as _unused3 @@ -191,7 +218,7 @@ class AdvancedSettingsWindow(bui.Window): from bauiv1lib import appinvite as _unused5 from bauiv1lib import account as _unused6 from bauiv1lib import sendinfo as _unused7 - from bauiv1lib import debug as _unused8 + from bauiv1lib.settings import benchmarks as _unused8 from bauiv1lib.settings import plugins as _unused9 from bauiv1lib.settings import devtools as _unused10 @@ -515,6 +542,47 @@ class AdvancedSettingsWindow(bui.Window): maxwidth=430, ) + self._use_insecure_connections_check_box: ConfigCheckBox | None + if self._show_use_insecure_connections: + v -= 42 + self._use_insecure_connections_check_box = ConfigCheckBox( + parent=self._subcontainer, + position=(50, v), + size=(self._sub_width - 100, 30), + configkey='Use Insecure Connections', + autoselect=True, + # displayname='USE INSECURE CONNECTIONS', + displayname=bui.Lstr( + resource=(f'{self._r}.insecureConnectionsText') + ), + # displayname=bui.Lstr( + # resource=f'{self._r}.alwaysUseInternalKeyboardText' + # ), + scale=1.0, + maxwidth=430, + ) + bui.textwidget( + parent=self._subcontainer, + position=(90, v - 20), + size=(0, 0), + # text=( + # 'not recommended, but may allow online play\n' + # 'from restricted countries or networks' + # ), + text=bui.Lstr( + resource=(f'{self._r}.insecureConnectionsDescriptionText') + ), + maxwidth=400, + flatness=1.0, + scale=0.65, + color=(0.4, 0.9, 0.4, 0.8), + h_align='left', + v_align='center', + ) + v -= 40 + else: + self._use_insecure_connections_check_box = None + self._always_use_internal_keyboard_check_box: ConfigCheckBox | None if self._show_always_use_internal_keyboard: v -= 42 @@ -684,14 +752,13 @@ class AdvancedSettingsWindow(bui.Window): for child in self._subcontainer.get_children(): bui.widget(edit=child, show_buffer_bottom=30, show_buffer_top=20) - if bui.app.ui_v1.use_toolbars: - pbtn = bui.get_special_widget('party_button') - bui.widget(edit=self._scrollwidget, right_widget=pbtn) - if self._back_button is None: - bui.widget( - edit=self._scrollwidget, - left_widget=bui.get_special_widget('back_button'), - ) + pbtn = bui.get_special_widget('squad_button') + bui.widget(edit=self._scrollwidget, right_widget=pbtn) + if self._back_button is None: + bui.widget( + edit=self._scrollwidget, + left_widget=bui.get_special_widget('back_button'), + ) self._restore_state() @@ -712,113 +779,76 @@ class AdvancedSettingsWindow(bui.Window): def _on_vr_test_press(self) -> None: from bauiv1lib.settings.vrtesting import VRTestingWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - VRTestingWindow(transition='in_right').get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_replace(VRTestingWindow(transition='in_right')) def _on_net_test_press(self) -> None: - plus = bui.app.plus - assert plus is not None from bauiv1lib.settings.nettesting import NetTestingWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - NetTestingWindow(transition='in_right').get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_replace(NetTestingWindow(transition='in_right')) def _on_friend_promo_code_press(self) -> None: from bauiv1lib import appinvite - from bauiv1lib import account + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() + show_sign_in_prompt() return appinvite.handle_app_invites_press() def _on_plugins_button_press(self) -> None: from bauiv1lib.settings.plugins import PluginWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PluginWindow(origin_widget=self._plugins_button).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + PluginWindow(origin_widget=self._plugins_button) ) def _on_dev_tools_button_press(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.devtools import DevToolsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - DevToolsWindow( - origin_widget=self._dev_tools_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + DevToolsWindow(origin_widget=self._dev_tools_button) ) def _on_send_info_press(self) -> None: from bauiv1lib.sendinfo import SendInfoWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - plus = bui.app.plus - assert plus is not None - - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - SendInfoWindow( - origin_widget=self._send_info_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + SendInfoWindow(origin_widget=self._send_info_button) ) def _on_benchmark_press(self) -> None: - from bauiv1lib.debug import DebugWindow + from bauiv1lib.settings.benchmarks import BenchmarksAndStressTestsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - DebugWindow(transition='in_right').get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + BenchmarksAndStressTestsWindow(transition='in_right') ) def _save_state(self) -> None: @@ -852,6 +882,11 @@ class AdvancedSettingsWindow(bui.Window): == self._always_use_internal_keyboard_check_box.widget ): sel_name = 'AlwaysUseInternalKeyboard' + elif ( + self._use_insecure_connections_check_box is not None + and sel == self._use_insecure_connections_check_box.widget + ): + sel_name = 'UseInsecureConnections' elif ( self._disable_gyro_check_box is not None and sel == self._disable_gyro_check_box.widget @@ -888,6 +923,7 @@ class AdvancedSettingsWindow(bui.Window): def _restore_state(self) -> None: # pylint: disable=too-many-branches + # pylint: disable=too-many-statements try: assert bui.app.classic is not None sel_name = bui.app.ui_v1.window_states.get(type(self), {}).get( @@ -922,6 +958,11 @@ class AdvancedSettingsWindow(bui.Window): and self._always_use_internal_keyboard_check_box is not None ): sel = self._always_use_internal_keyboard_check_box.widget + elif ( + sel_name == 'UseInsecureConnections' + and self._use_insecure_connections_check_box is not None + ): + sel = self._use_insecure_connections_check_box.widget elif ( sel_name == 'DisableGyro' and self._disable_gyro_check_box is not None @@ -973,20 +1014,3 @@ class AdvancedSettingsWindow(bui.Window): self._complete_langs_list = None self._complete_langs_error = True bui.apptimer(0.001, bui.WeakCall(self._update_lang_status)) - - def _do_back(self) -> None: - from bauiv1lib.settings.allsettings import AllSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AllSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/settings/allsettings.py b/dist/ba_data/python/bauiv1lib/settings/allsettings.py index 746000a..fb18c2f 100644 --- a/dist/ba_data/python/bauiv1lib/settings/allsettings.py +++ b/dist/ba_data/python/bauiv1lib/settings/allsettings.py @@ -4,222 +4,235 @@ from __future__ import annotations -from typing import TYPE_CHECKING -from threading import Thread +from typing import TYPE_CHECKING, override import logging import bauiv1 as bui if TYPE_CHECKING: - pass + from typing import Callable -class AllSettingsWindow(bui.Window): +class AllSettingsWindow(bui.MainWindow): """Window for selecting a settings category.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): - # pylint: disable=too-many-statements # pylint: disable=too-many-locals # Preload some modules we use in a background thread so we won't # have a visual hitch when the user taps them. - Thread(target=self._preload_modules).start() + bui.app.threadpool.submit_no_wait(self._preload_modules) bui.set_analytics_screen('Settings Window') - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - width = 1000 if uiscale is bui.UIScale.SMALL else 580 - x_inset = 125 if uiscale is bui.UIScale.SMALL else 0 - height = 435 + width = 1000 if uiscale is bui.UIScale.SMALL else 900 + height = 800 if uiscale is bui.UIScale.SMALL else 450 self._r = 'settingsWindow' - top_extra = 20 if uiscale is bui.UIScale.SMALL else 0 uiscale = bui.app.ui_v1.uiscale + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + safesize = bui.get_virtual_safe_area_size() + + # We're a generally widescreen shaped window, so bump our + # overall scale up a bit when screen width is wider than safe + # bounds to take advantage of the extra space. + smallscale = min(2.0, 1.5 * screensize[0] / safesize[0]) + + scale = ( + smallscale + if uiscale is bui.UIScale.SMALL + else 1.1 if uiscale is bui.UIScale.MEDIUM else 0.8 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_height = min(height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + + # scroll_width = target_width + # scroll_height = target_height - 25 + # scroll_bottom = yoffs - 54 - scroll_height + super().__init__( root_widget=bui.containerwidget( - size=(width, height + top_extra), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 1.75 + size=(width, height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -8) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: self._back_button = None bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._do_back + edit=self._root_widget, on_cancel_call=self.main_window_back ) else: self._back_button = btn = bui.buttonwidget( parent=self._root_widget, autoselect=True, - position=(40 + x_inset, height - 55), - size=(130, 60), + position=(50, yoffs - 80.0), + size=(70, 70), scale=0.8, text_scale=1.2, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._do_back, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) bui.textwidget( parent=self._root_widget, - position=(0, height - 44), + position=(0, yoffs - (70 if uiscale is bui.UIScale.SMALL else 60)), size=(width, 25), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, h_align='center', v_align='center', + scale=1.1, maxwidth=130, ) - if self._back_button is not None: - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), + bwidth = 200 + bheight = 230 + margin = 1 + all_buttons_width = 4.0 * bwidth + 3.0 * margin + + x = width * 0.5 - all_buttons_width * 0.5 + y = height * 0.5 - bheight * 0.5 - 20.0 + + def _button( + position: tuple[float, float], + label: bui.Lstr, + call: Callable[[], None], + texture: bui.Texture, + imgsize: float, + *, + color: tuple[float, float, float] = (1.0, 1.0, 1.0), + imgoffs: tuple[float, float] = (0.0, 0.0), + ) -> bui.Widget: + x, y = position + btn = bui.buttonwidget( + parent=self._root_widget, + autoselect=True, + position=(x, y), + size=(bwidth, bheight), + button_type='square', + label='', + on_activate_call=call, ) - - v = height - 80 - v -= 145 - - basew = 280 if uiscale is bui.UIScale.SMALL else 230 - baseh = 170 - x_offs = ( - x_inset + (105 if uiscale is bui.UIScale.SMALL else 72) - basew - ) # now unused - x_offs2 = x_offs + basew - 7 - x_offs3 = x_offs + 2 * (basew - 7) - x_offs4 = x_offs2 - x_offs5 = x_offs3 - - def _b_title( - x: float, y: float, button: bui.Widget, text: str | bui.Lstr - ) -> None: bui.textwidget( parent=self._root_widget, - text=text, - position=(x + basew * 0.47, y + baseh * 0.22), - maxwidth=basew * 0.7, + text=label, + position=(x + bwidth * 0.5, y + bheight * 0.25), + maxwidth=bwidth * 0.7, size=(0, 0), h_align='center', v_align='center', - draw_controller=button, + draw_controller=btn, color=(0.7, 0.9, 0.7, 1.0), ) + bui.imagewidget( + parent=self._root_widget, + position=( + x + bwidth * 0.5 - imgsize * 0.5 + imgoffs[0], + y + bheight * 0.56 - imgsize * 0.5 + imgoffs[1], + ), + size=(imgsize, imgsize), + texture=texture, + draw_controller=btn, + color=color, + ) + return btn - ctb = self._controllers_button = bui.buttonwidget( - parent=self._root_widget, - autoselect=True, - position=(x_offs2, v), - size=(basew, baseh), - button_type='square', - label='', - on_activate_call=self._do_controllers, - ) - if bui.app.ui_v1.use_toolbars and self._back_button is None: - bbtn = bui.get_special_widget('back_button') - bui.widget(edit=ctb, left_widget=bbtn) - _b_title( - x_offs2, v, ctb, bui.Lstr(resource=f'{self._r}.controllersText') - ) - imgw = imgh = 130 - bui.imagewidget( - parent=self._root_widget, - position=(x_offs2 + basew * 0.49 - imgw * 0.5, v + 35), - size=(imgw, imgh), + self._controllers_button = _button( + position=(x, y), + label=bui.Lstr(resource=f'{self._r}.controllersText'), + call=self._do_controllers, texture=bui.gettexture('controllerIcon'), - draw_controller=ctb, + imgsize=150, + imgoffs=(-2.0, 2.0), ) + x += bwidth + margin - gfxb = self._graphics_button = bui.buttonwidget( - parent=self._root_widget, - autoselect=True, - position=(x_offs3, v), - size=(basew, baseh), - button_type='square', - label='', - on_activate_call=self._do_graphics, - ) - if bui.app.ui_v1.use_toolbars: - pbtn = bui.get_special_widget('party_button') - bui.widget(edit=gfxb, up_widget=pbtn, right_widget=pbtn) - _b_title(x_offs3, v, gfxb, bui.Lstr(resource=f'{self._r}.graphicsText')) - imgw = imgh = 110 - bui.imagewidget( - parent=self._root_widget, - position=(x_offs3 + basew * 0.49 - imgw * 0.5, v + 42), - size=(imgw, imgh), + self._graphics_button = _button( + position=(x, y), + label=bui.Lstr(resource=f'{self._r}.graphicsText'), + call=self._do_graphics, texture=bui.gettexture('graphicsIcon'), - draw_controller=gfxb, + imgsize=135, + imgoffs=(0, 4.0), ) + x += bwidth + margin - v -= baseh - 5 - - abtn = self._audio_button = bui.buttonwidget( - parent=self._root_widget, - autoselect=True, - position=(x_offs4, v), - size=(basew, baseh), - button_type='square', - label='', - on_activate_call=self._do_audio, - ) - _b_title(x_offs4, v, abtn, bui.Lstr(resource=f'{self._r}.audioText')) - imgw = imgh = 120 - bui.imagewidget( - parent=self._root_widget, - position=(x_offs4 + basew * 0.49 - imgw * 0.5 + 5, v + 35), - size=(imgw, imgh), - color=(1, 1, 0), + self._audio_button = _button( + position=(x, y), + label=bui.Lstr(resource=f'{self._r}.audioText'), + call=self._do_audio, texture=bui.gettexture('audioIcon'), - draw_controller=abtn, + imgsize=150, + color=(1, 1, 0), + ) + x += bwidth + margin + + self._advanced_button = _button( + position=(x, y), + label=bui.Lstr(resource=f'{self._r}.advancedText'), + call=self._do_advanced, + texture=bui.gettexture('advancedIcon'), + imgsize=150, + color=(0.8, 0.95, 1), + imgoffs=(0, 5.0), ) - avb = self._advanced_button = bui.buttonwidget( - parent=self._root_widget, - autoselect=True, - position=(x_offs5, v), - size=(basew, baseh), - button_type='square', - label='', - on_activate_call=self._do_advanced, - ) - _b_title(x_offs5, v, avb, bui.Lstr(resource=f'{self._r}.advancedText')) - imgw = imgh = 120 - bui.imagewidget( - parent=self._root_widget, - position=(x_offs5 + basew * 0.49 - imgw * 0.5 + 5, v + 35), - size=(imgw, imgh), - color=(0.8, 0.95, 1), - texture=bui.gettexture('advancedIcon'), - draw_controller=avb, - ) + # Hmm; we're now wide enough that being limited to pressing up + # might be ok. + if bool(False): + # Left from our leftmost button should go to back button. + if self._back_button is None: + bbtn = bui.get_special_widget('back_button') + bui.widget(edit=self._controllers_button, left_widget=bbtn) + + # Right from our rightmost widget should go to squad button. + bui.widget( + edit=self._advanced_button, + right_widget=bui.get_special_widget('squad_button'), + ) + self._restore_state() - # noinspection PyUnresolvedReferences + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + @staticmethod def _preload_modules() -> None: """Preload modules we use; avoids hitches (called in bg thread).""" @@ -229,94 +242,52 @@ class AllSettingsWindow(bui.Window): import bauiv1lib.settings.audio as _unused4 import bauiv1lib.settings.advanced as _unused5 - def _do_back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.mainmenu import MainMenuWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - def _do_controllers(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.controls import ControlsSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ControlsSettingsWindow( - origin_widget=self._controllers_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + ControlsSettingsWindow(origin_widget=self._controllers_button) ) def _do_graphics(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.graphics import GraphicsSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - GraphicsSettingsWindow( - origin_widget=self._graphics_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + GraphicsSettingsWindow(origin_widget=self._graphics_button) ) def _do_audio(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.audio import AudioSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AudioSettingsWindow( - origin_widget=self._audio_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + AudioSettingsWindow(origin_widget=self._audio_button) ) def _do_advanced(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.advanced import AdvancedSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow( - origin_widget=self._advanced_button - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + AdvancedSettingsWindow(origin_widget=self._advanced_button) ) def _save_state(self) -> None: diff --git a/dist/ba_data/python/bauiv1lib/settings/audio.py b/dist/ba_data/python/bauiv1lib/settings/audio.py index d04cdf6..3589431 100644 --- a/dist/ba_data/python/bauiv1lib/settings/audio.py +++ b/dist/ba_data/python/bauiv1lib/settings/audio.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import logging import bauiv1 as bui @@ -13,89 +13,94 @@ if TYPE_CHECKING: pass -class AudioSettingsWindow(bui.Window): +class AudioSettingsWindow(bui.MainWindow): """Window for editing audio settings.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): - # pylint: disable=too-many-statements # pylint: disable=too-many-locals # pylint: disable=cyclic-import - from bauiv1lib.popup import PopupMenu from bauiv1lib.config import ConfigNumberEdit assert bui.app.classic is not None music = bui.app.classic.music - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - self._r = 'audioSettingsWindow' spacing = 50.0 - width = 460.0 - height = 210.0 + uiscale = bui.app.ui_v1.uiscale - # Update: hard-coding head-relative audio to true now, - # so not showing options. - # show_vr_head_relative_audio = True if bui.app.vr_mode else False - show_vr_head_relative_audio = False - - if show_vr_head_relative_audio: - height += 70 + width = 1200.0 if uiscale is bui.UIScale.SMALL else 500.0 + height = 800.0 if uiscale is bui.UIScale.SMALL else 350.0 show_soundtracks = False if music.have_music_player(): show_soundtracks = True - height += spacing * 2.0 - uiscale = bui.app.ui_v1.uiscale - base_scale = ( - 2.05 + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.2 if uiscale is bui.UIScale.SMALL - else 1.6 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 ) - popup_menu_scale = base_scale * 1.2 + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(width - 60, screensize[0] / scale) + target_height = min(height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - scale=base_scale, - scale_origin_stack_offset=scale_origin, - stack_offset=( - (0, -20) if uiscale is bui.UIScale.SMALL else (0, 0) + scale=scale, + toolbar_visibility=( + 'menu_minimal' + if uiscale is bui.UIScale.SMALL + else 'menu_full' ), - ) + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._back_button = back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(35, height - 55), - size=(120, 60), - scale=0.8, - text_scale=1.2, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._back, - autoselect=True, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) - v = height - 60 - v -= spacing * 1.0 + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + self._back_button = None + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(35, yoffs - 55), + size=(60, 60), + scale=0.8, + text_scale=1.2, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + autoselect=True, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) + bui.textwidget( parent=self._root_widget, - position=(width * 0.5, height - 32), + position=( + width * 0.5, + yoffs - (48 if uiscale is bui.UIScale.SMALL else 32), + ), size=(0, 0), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, @@ -104,16 +109,14 @@ class AudioSettingsWindow(bui.Window): v_align='center', ) - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) + # Roughly center everything else in our window. + x = width * 0.5 - 160 + y = height * 0.5 + (100 if show_soundtracks else 70) + y -= spacing * 1.0 self._sound_volume_numedit = svne = ConfigNumberEdit( parent=self._root_widget, - position=(40, v), + position=(x, y), xoffset=10, configkey='Sound Volume', displayname=bui.Lstr(resource=f'{self._r}.soundVolumeText'), @@ -122,15 +125,14 @@ class AudioSettingsWindow(bui.Window): increment=0.05, as_percent=True, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=svne.plusbutton, - right_widget=bui.get_special_widget('party_button'), - ) - v -= spacing + bui.widget( + edit=svne.plusbutton, + right_widget=bui.get_special_widget('squad_button'), + ) + y -= spacing self._music_volume_numedit = ConfigNumberEdit( parent=self._root_widget, - position=(40, v), + position=(x, y), xoffset=10, configkey='Music Volume', displayname=bui.Lstr(resource=f'{self._r}.musicVolumeText'), @@ -142,105 +144,70 @@ class AudioSettingsWindow(bui.Window): as_percent=True, ) - v -= 0.5 * spacing - - self._vr_head_relative_audio_button: bui.Widget | None - if show_vr_head_relative_audio: - v -= 40 - bui.textwidget( - parent=self._root_widget, - position=(40, v + 24), - size=(0, 0), - text=bui.Lstr(resource=f'{self._r}.headRelativeVRAudioText'), - color=(0.8, 0.8, 0.8), - maxwidth=230, - h_align='left', - v_align='center', - ) - - popup = PopupMenu( - parent=self._root_widget, - position=(290, v), - width=120, - button_size=(135, 50), - scale=popup_menu_scale, - choices=['Auto', 'On', 'Off'], - choices_display=[ - bui.Lstr(resource='autoText'), - bui.Lstr(resource='onText'), - bui.Lstr(resource='offText'), - ], - current_choice=bui.app.config.resolve('VR Head Relative Audio'), - on_value_change_call=self._set_vr_head_relative_audio, - ) - self._vr_head_relative_audio_button = popup.get_button() - bui.textwidget( - parent=self._root_widget, - position=(width * 0.5, v - 11), - size=(0, 0), - text=bui.Lstr( - resource=f'{self._r}.headRelativeVRAudioInfoText' - ), - scale=0.5, - color=(0.7, 0.8, 0.7), - maxwidth=400, - flatness=1.0, - h_align='center', - v_align='center', - ) - v -= 30 - else: - self._vr_head_relative_audio_button = None + y -= 0.5 * spacing self._soundtrack_button: bui.Widget | None if show_soundtracks: - v -= 1.2 * spacing + y -= 1.2 * spacing self._soundtrack_button = bui.buttonwidget( parent=self._root_widget, - position=((width - 310) / 2, v), + position=(width * 0.5 - 155, y), size=(310, 50), autoselect=True, label=bui.Lstr(resource=f'{self._r}.soundtrackButtonText'), on_activate_call=self._do_soundtracks, ) - v -= spacing * 0.5 + y -= spacing * 0.3 bui.textwidget( parent=self._root_widget, - position=(0, v), - size=(width, 20), + position=(0.5 * width, y), + size=(0.0, 0.0), text=bui.Lstr(resource=f'{self._r}.soundtrackDescriptionText'), flatness=1.0, h_align='center', + v_align='center', + maxwidth=400, scale=0.5, color=(0.7, 0.8, 0.7, 1.0), - maxwidth=400, ) else: self._soundtrack_button = None # Tweak a few navigation bits. - try: - bui.widget(edit=back_button, down_widget=svne.minusbutton) - except Exception: - logging.exception('Error wiring AudioSettingsWindow.') + if self._back_button is not None: + bui.widget(edit=self._back_button, down_widget=svne.minusbutton) + else: + spback = bui.get_special_widget('back_button') + bui.widget( + edit=svne.minusbutton, up_widget=spback, left_widget=spback + ) self._restore_state() - def _set_vr_head_relative_audio(self, val: str) -> None: - cfg = bui.app.config - cfg['VR Head Relative Audio'] = val - cfg.apply_and_commit() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() def _do_soundtracks(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.soundtrack import browser as stb + from bauiv1lib.soundtrack.browser import SoundtrackBrowserWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - # We require disk access for soundtracks; - # if we don't have it, request it. + # We require disk access for soundtracks; request it if we don't + # have it. if not bui.have_permission(bui.Permission.STORAGE): bui.getsound('ding').play() bui.screenmessage( @@ -252,34 +219,8 @@ class AudioSettingsWindow(bui.Window): ) return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - stb.SoundtrackBrowserWindow( - origin_widget=self._soundtrack_button - ).get_root_widget(), - from_window=self._root_widget, - ) - - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings import allsettings - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - allsettings.AllSettingsWindow( - transition='in_left' - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + SoundtrackBrowserWindow(origin_widget=self._soundtrack_button) ) def _save_state(self) -> None: @@ -297,8 +238,6 @@ class AudioSettingsWindow(bui.Window): sel_name = 'Soundtrack' elif sel == self._back_button: sel_name = 'Back' - elif sel == self._vr_head_relative_audio_button: - sel_name = 'VRHeadRelative' else: raise ValueError(f'unrecognized selection \'{sel}\'') assert bui.app.classic is not None @@ -319,8 +258,6 @@ class AudioSettingsWindow(bui.Window): sel = self._music_volume_numedit.minusbutton elif sel_name == 'MusicPlus': sel = self._music_volume_numedit.plusbutton - elif sel_name == 'VRHeadRelative': - sel = self._vr_head_relative_audio_button elif sel_name == 'Soundtrack': sel = self._soundtrack_button elif sel_name == 'Back': diff --git a/dist/ba_data/python/bauiv1lib/debug.py b/dist/ba_data/python/bauiv1lib/settings/benchmarks.py similarity index 70% rename from dist/ba_data/python/bauiv1lib/debug.py rename to dist/ba_data/python/bauiv1lib/settings/benchmarks.py index e57ae07..2399601 100644 --- a/dist/ba_data/python/bauiv1lib/debug.py +++ b/dist/ba_data/python/bauiv1lib/settings/benchmarks.py @@ -5,83 +5,124 @@ from __future__ import annotations import logging -from typing import cast +from typing import cast, override import bauiv1 as bui +import bascenev1 as bs -class DebugWindow(bui.Window): - """Window for debugging internal values.""" +class BenchmarksAndStressTestsWindow(bui.MainWindow): + """Window for launching benchmarks or stress tests.""" - def __init__(self, transition: str | None = 'in_right'): + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): + # pylint: disable=too-many-locals # pylint: disable=too-many-statements # pylint: disable=cyclic-import from bauiv1lib import popup - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_location('Benchmarks & Stress Tests') uiscale = bui.app.ui_v1.uiscale - self._width = width = 580 + self._width = width = 1200 if uiscale is bui.UIScale.SMALL else 580 self._height = height = ( - 350 + 900 if uiscale is bui.UIScale.SMALL else 420 if uiscale is bui.UIScale.MEDIUM else 520 ) - self._scroll_width = self._width - 100 - self._scroll_height = self._height - 120 - - self._sub_width = self._scroll_width * 0.95 - self._sub_height = 520 - self._stress_test_game_type = 'Random' self._stress_test_playlist = '__default__' self._stress_test_player_count = 8 self._stress_test_round_duration = 30 + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.32 + if uiscale is bui.UIScale.SMALL + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 70, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 31 + self._scroll_bottom = yoffs - 60 - self._scroll_height + + self._sub_width = min(510.0, self._scroll_width) + self._sub_height = 520 + self._r = 'debugWindow' uiscale = bui.app.ui_v1.uiscale super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - scale=( - 2.35 + scale=scale, + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.55 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -30) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._done_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(40, height - 67), - size=(120, 60), - scale=0.8, - autoselect=True, - label=bui.Lstr(resource='doneText'), - on_activate_call=self._done, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) + if bui.app.ui_v1.uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + self._back_button = bui.get_special_widget('back_button') + else: + self._back_button = btn = bui.buttonwidget( + parent=self._root_widget, + position=(40, yoffs - 53), + size=(60, 60), + scale=0.8, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + bui.textwidget( parent=self._root_widget, - position=(0, height - 60), - size=(width, 30), + position=( + self._width * 0.5, + yoffs - (45 if uiscale is bui.UIScale.SMALL else 30), + ), + size=(0, 0), + maxwidth=360, + scale=0.8 if uiscale is bui.UIScale.SMALL else 1.0, text=bui.Lstr(resource=f'{self._r}.titleText'), h_align='center', - color=bui.app.ui_v1.title_color, v_align='center', - maxwidth=260, + color=bui.app.ui_v1.title_color, ) self._scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, size=(self._scroll_width, self._scroll_height), - position=((self._width - self._scroll_width) * 0.5, 50), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, + ), + border_opacity=0.4, + center_small_content_horizontally=True, ) bui.containerwidget(edit=self._scrollwidget, claims_left_right=True) @@ -102,17 +143,7 @@ class DebugWindow(bui.Window): on_activate_call=self._run_cpu_benchmark_pressed, ) bui.widget( - edit=btn, up_widget=self._done_button, left_widget=self._done_button - ) - v -= 60 - - bui.buttonwidget( - parent=self._subcontainer, - position=((self._sub_width - button_width) * 0.5, v), - size=(button_width, 60), - autoselect=True, - label=bui.Lstr(resource=f'{self._r}.runGPUBenchmarkText'), - on_activate_call=self._run_gpu_benchmark_pressed, + edit=btn, up_widget=self._back_button, left_widget=self._back_button ) v -= 60 @@ -301,7 +332,17 @@ class DebugWindow(bui.Window): label=bui.Lstr(resource=f'{self._r}.runStressTestText'), on_activate_call=self._stress_test_pressed, ) - bui.widget(btn, show_buffer_bottom=50) + bui.widget(edit=btn, show_buffer_bottom=50) + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) def _stress_test_player_count_decrement(self) -> None: self._stress_test_player_count = max( @@ -344,12 +385,6 @@ class DebugWindow(bui.Window): return bui.app.classic.run_cpu_benchmark() - def _run_gpu_benchmark_pressed(self) -> None: - if bui.app.classic is None: - logging.warning('run-gpu-benchmark requires classic') - return - bui.app.classic.run_gpu_benchmark() - def _run_media_reload_benchmark_pressed(self) -> None: if bui.app.classic is None: logging.warning('run-media-reload-benchmark requires classic') @@ -357,31 +392,25 @@ class DebugWindow(bui.Window): bui.app.classic.run_media_reload_benchmark() def _stress_test_pressed(self) -> None: + from bascenev1lib.mainmenu import MainMenuActivity + if bui.app.classic is None: logging.warning('stress-test requires classic') return - bui.app.classic.run_stress_test( - playlist_type=self._stress_test_game_type, - playlist_name=cast( - str, bui.textwidget(query=self._stress_test_playlist_name_field) - ), - player_count=self._stress_test_player_count, - round_duration=self._stress_test_round_duration, - ) - bui.containerwidget(edit=self._root_widget, transition='out_right') - - def _done(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) + activity = bs.get_foreground_host_activity() + if isinstance(activity, MainMenuActivity): + bui.app.classic.run_stress_test( + playlist_type=self._stress_test_game_type, + playlist_name=cast( + str, + bui.textwidget(query=self._stress_test_playlist_name_field), + ), + player_count=self._stress_test_player_count, + round_duration=self._stress_test_round_duration, + ) + bui.containerwidget(edit=self._root_widget, transition='out_right') + else: + bui.screenmessage( + bui.Lstr(value='Already present in another activity.') + ) diff --git a/dist/ba_data/python/bauiv1lib/settings/controls.py b/dist/ba_data/python/bauiv1lib/settings/controls.py index 6a85dfd..3e6fbf6 100644 --- a/dist/ba_data/python/bauiv1lib/settings/controls.py +++ b/dist/ba_data/python/bauiv1lib/settings/controls.py @@ -4,17 +4,18 @@ from __future__ import annotations -from bauiv1lib.popup import PopupMenu +from typing import override + import bascenev1 as bs import bauiv1 as bui -class ControlsSettingsWindow(bui.Window): +class ControlsSettingsWindow(bui.MainWindow): """Top level control settings window.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): # FIXME: should tidy up here. @@ -25,30 +26,24 @@ class ControlsSettingsWindow(bui.Window): self._have_selected_child = False - scale_origin: tuple[float, float] | None - - # If they provided an origin-widget, scale up from that. - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - self._r = 'configControllersWindow' + uiscale = bui.app.ui_v1.uiscale app = bui.app assert app.classic is not None spacing = 50.0 button_width = 350.0 - width = 460.0 - height = 130.0 + width = 1200.0 if uiscale is bui.UIScale.SMALL else 560.0 + height = 800 if uiscale is bui.UIScale.SMALL else 400.0 + # yoffs = -60 if uiscale is bui.UIScale.SMALL else 0 space_height = spacing * 0.3 - # FIXME: should create vis settings under platform or app-adapter - # to determine whether to show this stuff; not hard code it. + buttons_height = 0.0 + + # FIXME: should create vis settings under platform or + # app-adapter to determine whether to show this stuff; not + # hard-code it. show_gamepads = False platform = app.classic.platform @@ -58,88 +53,101 @@ class ControlsSettingsWindow(bui.Window): ) if platform in ('linux', 'android', 'mac') or non_vr_windows: show_gamepads = True - height += spacing + buttons_height += spacing show_touch = False if bs.have_touchscreen_input(): show_touch = True - height += spacing + buttons_height += spacing show_space_1 = False if show_gamepads or show_touch: show_space_1 = True - height += space_height + buttons_height += space_height show_keyboard = False if bs.getinputdevice('Keyboard', '#1', doraise=False) is not None: show_keyboard = True - height += spacing + buttons_height += spacing show_keyboard_p2 = False if app.env.vr else show_keyboard if show_keyboard_p2: - height += spacing + buttons_height += spacing show_space_2 = False if show_keyboard: show_space_2 = True - height += space_height + buttons_height += space_height if bool(True): show_remote = True - height += spacing + buttons_height += spacing else: show_remote = False - # On windows (outside of oculus/vr), show an option to disable xinput. + # On windows (outside of oculus/vr), show an option to disable + # xinput. show_xinput_toggle = False if platform == 'windows' and not app.env.vr: show_xinput_toggle = True - # On mac builds, show an option to switch between generic and - # made-for-iOS/Mac systems - # (we can run into problems where devices register as one of each - # type otherwise).. - # UPDATE: We always use the apple system these days (which should - # support older controllers). So no need for a switch. - show_mac_controller_subsystem = False - # if platform == 'mac' and bui.is_xcode_build(): - # show_mac_controller_subsystem = True - - if show_mac_controller_subsystem: - height += spacing * 1.5 - if show_xinput_toggle: - height += spacing + buttons_height += spacing assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - smallscale = 1.7 if show_keyboard else 2.2 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.0 + if uiscale is bui.UIScale.SMALL + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(width - 60, screensize[0] / scale) + target_height = min(height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - scale_origin_stack_offset=scale_origin, - stack_offset=( - (0, -10) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - scale=( - smallscale + scale=scale, + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + self._back_button: bui.Widget | None + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back ) - ) - self._back_button = btn = bui.buttonwidget( - parent=self._root_widget, - position=(35, height - 60), - size=(140, 65), - scale=0.8, - text_scale=1.2, - autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._back, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) + self._back_button = None + else: + self._back_button = btn = bui.buttonwidget( + parent=self._root_widget, + position=(35, height - 60), + size=(60, 60), + scale=0.8, + text_scale=1.2, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) # We need these vars to exist even if the buttons don't. self._gamepads_button: bui.Widget | None = None @@ -150,21 +158,20 @@ class ControlsSettingsWindow(bui.Window): bui.textwidget( parent=self._root_widget, - position=(0, height - 49), - size=(width, 25), + position=( + width * 0.5, + yoffs - (52 if uiscale is bui.UIScale.SMALL else 32), + ), + maxwidth=260, + size=(0, 0), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, h_align='center', - v_align='top', - ) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), + v_align='center', ) - v = height - 75 + # Roughly center the rest of our stuff. + v = height * 0.5 + buttons_height * 0.5 - 10 v -= spacing if show_touch: @@ -176,18 +183,18 @@ class ControlsSettingsWindow(bui.Window): label=bui.Lstr(resource=f'{self._r}.configureTouchText'), on_activate_call=self._do_touchscreen, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, + right_widget=bui.get_special_widget('squad_button'), + ) if not self._have_selected_child: bui.containerwidget( edit=self._root_widget, selected_child=self._touch_button ) - bui.widget( - edit=self._back_button, down_widget=self._touch_button - ) + if self._back_button is not None: + bui.widget( + edit=self._back_button, down_widget=self._touch_button + ) self._have_selected_child = True v -= spacing @@ -200,18 +207,19 @@ class ControlsSettingsWindow(bui.Window): label=bui.Lstr(resource=f'{self._r}.configureControllersText'), on_activate_call=self._do_gamepads, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, + right_widget=bui.get_special_widget('squad_button'), + ) if not self._have_selected_child: bui.containerwidget( edit=self._root_widget, selected_child=self._gamepads_button ) - bui.widget( - edit=self._back_button, down_widget=self._gamepads_button - ) + if self._back_button is not None: + bui.widget( + edit=self._back_button, + down_widget=self._gamepads_button, + ) self._have_selected_child = True v -= spacing else: @@ -232,18 +240,19 @@ class ControlsSettingsWindow(bui.Window): bui.widget( edit=self._keyboard_button, left_widget=self._keyboard_button ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, + right_widget=bui.get_special_widget('squad_button'), + ) if not self._have_selected_child: bui.containerwidget( edit=self._root_widget, selected_child=self._keyboard_button ) - bui.widget( - edit=self._back_button, down_widget=self._keyboard_button - ) + if self._back_button is not None: + bui.widget( + edit=self._back_button, + down_widget=self._keyboard_button, + ) self._have_selected_child = True v -= spacing if show_keyboard_p2: @@ -274,18 +283,19 @@ class ControlsSettingsWindow(bui.Window): bui.widget( edit=self._idevices_button, left_widget=self._idevices_button ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=btn, - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=btn, + right_widget=bui.get_special_widget('squad_button'), + ) if not self._have_selected_child: bui.containerwidget( edit=self._root_widget, selected_child=self._idevices_button ) - bui.widget( - edit=self._back_button, down_widget=self._idevices_button - ) + if self._back_button is not None: + bui.widget( + edit=self._back_button, + down_widget=self._idevices_button, + ) self._have_selected_child = True v -= spacing @@ -301,7 +311,10 @@ class ControlsSettingsWindow(bui.Window): xinput_checkbox = bui.checkboxwidget( parent=self._root_widget, - position=(100, v + 3), + position=( + width * (0.35 if uiscale is bui.UIScale.SMALL else 0.25), + v + 3, + ), size=(120, 30), value=(not bui.get_low_level_config_value('enablexinput', 1)), maxwidth=200, @@ -327,50 +340,22 @@ class ControlsSettingsWindow(bui.Window): ) v -= spacing - if show_mac_controller_subsystem: - PopupMenu( - parent=self._root_widget, - position=(260, v - 10), - width=160, - button_size=(150, 50), - scale=1.5, - choices=['Classic', 'MFi', 'Both'], - choices_display=[ - bui.Lstr(resource='macControllerSubsystemClassicText'), - bui.Lstr(resource='macControllerSubsystemMFiText'), - bui.Lstr(resource='macControllerSubsystemBothText'), - ], - current_choice=bui.app.config.resolve( - 'Mac Controller Subsystem' - ), - on_value_change_call=self._set_mac_controller_subsystem, - ) - bui.textwidget( - parent=self._root_widget, - position=(245, v + 13), - size=(0, 0), - text=bui.Lstr(resource='macControllerSubsystemTitleText'), - scale=1.0, - h_align='right', - v_align='center', - color=bui.app.ui_v1.infotextcolor, - maxwidth=180, - ) - bui.textwidget( - parent=self._root_widget, - position=(width * 0.5, v - 20), - size=(0, 0), - text=bui.Lstr(resource='macControllerSubsystemDescriptionText'), - scale=0.5, - h_align='center', - v_align='center', - color=bui.app.ui_v1.infotextcolor, - maxwidth=width * 0.8, - ) - v -= spacing * 1.5 - self._restore_state() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _set_mac_controller_subsystem(self, val: str) -> None: cfg = bui.app.config cfg['Mac Controller Subsystem'] = val @@ -380,85 +365,55 @@ class ControlsSettingsWindow(bui.Window): # pylint: disable=cyclic-import from bauiv1lib.settings.keyboard import ConfigKeyboardWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ConfigKeyboardWindow( - bs.getinputdevice('Keyboard', '#1') - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + ConfigKeyboardWindow(bs.getinputdevice('Keyboard', '#1')) ) def _config_keyboard2(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.keyboard import ConfigKeyboardWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ConfigKeyboardWindow( - bs.getinputdevice('Keyboard', '#2') - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + ConfigKeyboardWindow(bs.getinputdevice('Keyboard', '#2')) ) def _do_mobile_devices(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.remoteapp import RemoteAppSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - RemoteAppSettingsWindow().get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_replace(RemoteAppSettingsWindow()) def _do_gamepads(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.gamepadselect import GamepadSelectWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - GamepadSelectWindow().get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_replace(GamepadSelectWindow()) def _do_touchscreen(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.settings.touchscreen import TouchscreenSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - TouchscreenSettingsWindow().get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_replace(TouchscreenSettingsWindow()) def _save_state(self) -> None: sel = self._root_widget.get_selected_child() @@ -499,21 +454,3 @@ class ControlsSettingsWindow(bui.Window): else self._back_button ) bui.containerwidget(edit=self._root_widget, selected_child=sel) - - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.allsettings import AllSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AllSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/settings/devtools.py b/dist/ba_data/python/bauiv1lib/settings/devtools.py index 2db6e9c..93a381b 100644 --- a/dist/ba_data/python/bauiv1lib/settings/devtools.py +++ b/dist/ba_data/python/bauiv1lib/settings/devtools.py @@ -4,6 +4,8 @@ from __future__ import annotations +from typing import override + import babase import bauiv1 as bui from bauiv1lib.popup import PopupMenu @@ -11,79 +13,85 @@ from bauiv1lib.confirm import ConfirmWindow from bauiv1lib.config import ConfigCheckBox -class DevToolsWindow(bui.Window): +class DevToolsWindow(bui.MainWindow): """Window for accessing modding tools.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): app = bui.app assert app.classic is not None - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - uiscale = app.ui_v1.uiscale - self._width = 970.0 if uiscale is bui.UIScale.SMALL else 670.0 - x_inset = 150 if uiscale is bui.UIScale.SMALL else 0 + self._width = 1200.0 if uiscale is bui.UIScale.SMALL else 670.0 self._height = ( - 390.0 + 800 if uiscale is bui.UIScale.SMALL else 450.0 if uiscale is bui.UIScale.MEDIUM else 520.0 ) - self._spacing = 32 - top_extra = 10 if uiscale is bui.UIScale.SMALL else 0 - self._scroll_width = self._width - (100 + 2 * x_inset) - self._scroll_height = self._height - 115.0 + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.13 + if uiscale is bui.UIScale.SMALL + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 80, screensize[0] / scale) + target_height = min(self._height - 90, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 35 + self._scroll_bottom = yoffs - 64 - self._scroll_height + self._sub_width = self._scroll_width * 0.95 - self._sub_height = 350.0 + self._sub_height = 300.0 super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.06 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -25) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) self._r = 'settingsDevTools' - if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._do_back + edit=self._root_widget, on_cancel_call=self.main_window_back ) self._back_button = None else: self._back_button = bui.buttonwidget( parent=self._root_widget, - position=(53 + x_inset, self._height - 60), + position=(53, yoffs - 50), size=(140, 60), scale=0.8, autoselect=True, label=bui.Lstr(resource='backText'), button_type='back', - on_activate_call=self._do_back, + on_activate_call=self.main_window_back, ) bui.containerwidget( edit=self._root_widget, cancel_button=self._back_button @@ -91,8 +99,12 @@ class DevToolsWindow(bui.Window): self._title_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 48), + position=( + self._width * 0.5, + yoffs - (60 if uiscale is bui.UIScale.SMALL else 42), + ), size=(0, 25), + scale=(0.8 if uiscale is bui.UIScale.SMALL else 1.0), maxwidth=self._width - 200, text=bui.Lstr(resource='settingsWindowAdvanced.devToolsText'), color=app.ui_v1.title_color, @@ -110,11 +122,15 @@ class DevToolsWindow(bui.Window): self._scrollwidget = bui.scrollwidget( parent=self._root_widget, - position=(50 + x_inset, 50), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, + ), simple_culling_v=20.0, highlight=False, size=(self._scroll_width, self._scroll_height), selection_loops_to_parent=True, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, right_widget=self._scrollwidget) self._subcontainer = bui.containerwidget( @@ -169,36 +185,50 @@ class DevToolsWindow(bui.Window): ), ) - v -= self._spacing * 2.5 - bui.textwidget( - parent=self._subcontainer, - position=(170, v + 10), - size=(0, 0), - text=bui.Lstr(resource='uiScaleText'), - color=app.ui_v1.title_color, - h_align='center', - v_align='center', - ) + # Currently this is not wired up. The current official way to test + # UIScales is either to use the switcher in the dev-console or to + # set the BA_UI_SCALE env var. + if bool(False): + v -= self._spacing * 2.5 + bui.textwidget( + parent=self._subcontainer, + position=(170, v + 10), + size=(0, 0), + text=bui.Lstr(resource='uiScaleText'), + color=app.ui_v1.title_color, + h_align='center', + v_align='center', + ) - PopupMenu( - parent=self._subcontainer, - position=(230, v - 20), - button_size=(200.0, 60.0), - width=100.0, - choices=[ - 'auto', - 'small', - 'medium', - 'large', - ], - choices_display=[ - bui.Lstr(resource='autoText'), - bui.Lstr(resource='sizeSmallText'), - bui.Lstr(resource='sizeMediumText'), - bui.Lstr(resource='sizeLargeText'), - ], - current_choice=app.config.get('UI Scale', 'auto'), - on_value_change_call=self._set_uiscale, + PopupMenu( + parent=self._subcontainer, + position=(230, v - 20), + button_size=(200.0, 60.0), + width=100.0, + choices=[ + 'auto', + 'small', + 'medium', + 'large', + ], + choices_display=[ + bui.Lstr(resource='autoText'), + bui.Lstr(resource='sizeSmallText'), + bui.Lstr(resource='sizeMediumText'), + bui.Lstr(resource='sizeLargeText'), + ], + current_choice=app.config.get('UI Scale', 'auto'), + on_value_change_call=self._set_uiscale, + ) + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) ) def _set_uiscale(self, val: str) -> None: @@ -210,19 +240,3 @@ class DevToolsWindow(bui.Window): bui.Lstr(resource='settingsWindowAdvanced.mustRestartText'), color=(1.0, 0.5, 0.0), ) - - def _do_back(self) -> None: - from bauiv1lib.settings.advanced import AdvancedSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/settings/gamepad.py b/dist/ba_data/python/bauiv1lib/settings/gamepad.py index 390af52..d8b5de6 100644 --- a/dist/ba_data/python/bauiv1lib/settings/gamepad.py +++ b/dist/ba_data/python/bauiv1lib/settings/gamepad.py @@ -6,7 +6,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from bauiv1lib.popup import PopupMenuWindow import bascenev1 as bs @@ -14,29 +14,32 @@ import bauiv1 as bui if TYPE_CHECKING: from typing import Any, Callable + from bauiv1lib.popup import PopupWindow -class GamepadSettingsWindow(bui.Window): +class GamepadSettingsWindow(bui.MainWindow): """Window for configuring a gamepad.""" # pylint: disable=too-many-public-methods def __init__( self, - gamepad: bs.InputDevice, - is_main_menu: bool = True, - transition: str = 'in_right', + inputdevice: bs.InputDevice, + *, + modal: bool = False, + transition: str | None = 'in_right', transition_out: str = 'out_right', + origin_widget: bui.Widget | None = None, settings: dict | None = None, ): - self._input = gamepad + self._inputdevice = inputdevice # If our input-device went away, just return an empty zombie. - if not self._input: + if not self._inputdevice: return - self._name = self._input.name + self._name = self._inputdevice.name self._r = 'configGamepadWindow' self._transition_out = transition_out @@ -44,7 +47,7 @@ class GamepadSettingsWindow(bui.Window): # We're a secondary gamepad if supplied with settings. self._is_secondary = settings is not None self._ext = '_B' if self._is_secondary else '' - self._is_main_menu = is_main_menu + self._modal = modal self._displayname = self._name self._width = 700 if self._is_secondary else 730 self._height = 440 if self._is_secondary else 450 @@ -55,23 +58,45 @@ class GamepadSettingsWindow(bui.Window): root_widget=bui.containerwidget( size=(self._width, self._height), scale=( - 1.63 + 1.4 if uiscale is bui.UIScale.SMALL - else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=( - (-20, -16) if uiscale is bui.UIScale.SMALL else (0, 0) + (0, -10) if uiscale is bui.UIScale.SMALL else (0, 0) ), - transition=transition, - ) + ), + transition=transition, + origin_widget=origin_widget, ) self._settings: dict[str, int] = {} if not self._is_secondary: self._get_config_mapping() + # Don't ask to config joysticks while we're in here. self._rebuild_ui() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull stuff out of self here; if we do it in the lambda we keep + # self alive which we don't want. + assert not self._is_secondary + assert not self._modal + + inputdevice = self._inputdevice + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + inputdevice=inputdevice, + transition=transition, + origin_widget=origin_widget, + ) + ) + def _get_config_mapping(self, default: bool = False) -> None: for button in [ 'buttonJump', @@ -134,7 +159,7 @@ class GamepadSettingsWindow(bui.Window): ]: assert bui.app.classic is not None val = bui.app.classic.get_input_device_mapped_value( - self._input, button, default + self._inputdevice, button, default ) if val != -1: self._settings[button] = val @@ -416,7 +441,7 @@ class GamepadSettingsWindow(bui.Window): def get_input(self) -> bs.InputDevice: """(internal)""" - return self._input + return self._inputdevice def _do_advanced(self) -> None: # pylint: disable=cyclic-import @@ -532,8 +557,8 @@ class GamepadSettingsWindow(bui.Window): def show_secondary_editor(self) -> None: """(internal)""" GamepadSettingsWindow( - self._input, - is_main_menu=False, + self._inputdevice, + modal=True, settings=self._settings, transition='in_scale', transition_out='out_scale', @@ -559,16 +584,16 @@ class GamepadSettingsWindow(bui.Window): assert isinstance(sval2, (int, type(None))) if sval1 is not None and sval2 is not None: return ( - self._input.get_axis_name(sval1) + self._inputdevice.get_axis_name(sval1) + ' / ' - + self._input.get_axis_name(sval2) + + self._inputdevice.get_axis_name(sval2) ) return bui.Lstr(resource=f'{self._r}.unsetText') # If they're looking for triggers. if control in ['triggerRun1' + self._ext, 'triggerRun2' + self._ext]: if control in self._settings: - return self._input.get_axis_name(self._settings[control]) + return self._inputdevice.get_axis_name(self._settings[control]) return bui.Lstr(resource=f'{self._r}.unsetText') # Dead-zone. @@ -589,7 +614,9 @@ class GamepadSettingsWindow(bui.Window): # If *any* dpad buttons are assigned, show only button assignments. if any(b in self._settings for b in dpad_buttons): if control in self._settings: - return self._input.get_button_name(self._settings[control]) + return self._inputdevice.get_button_name( + self._settings[control] + ) return bui.Lstr(resource=f'{self._r}.unsetText') # No dpad buttons - show the dpad number for all 4. @@ -614,7 +641,7 @@ class GamepadSettingsWindow(bui.Window): # Other buttons. if control in self._settings: - return self._input.get_button_name(self._settings[control]) + return self._inputdevice.get_button_name(self._settings[control]) return bui.Lstr(resource=f'{self._r}.unsetText') def _gamepad_event( @@ -691,7 +718,7 @@ class GamepadSettingsWindow(bui.Window): # Now launch the up/down listener. AwaitGamepadInputWindow( - self._input, + self._inputdevice, 'analogStickUD' + ext, self._gamepad_event, bui.Lstr(resource=f'{self._r}.pressUpDownText'), @@ -739,6 +766,7 @@ class GamepadSettingsWindow(bui.Window): color: tuple[float, float, float], texture: bui.Texture, button: str, + *, scale: float = 1.0, message: bui.Lstr | None = None, message2: bui.Lstr | None = None, @@ -780,7 +808,7 @@ class GamepadSettingsWindow(bui.Window): edit=btn, on_activate_call=bui.Call( AwaitGamepadInputWindow, - self._input, + self._inputdevice, button, self._gamepad_event, message, @@ -792,21 +820,16 @@ class GamepadSettingsWindow(bui.Window): return btn def _cancel(self) -> None: - from bauiv1lib.settings.controls import ControlsSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if self._is_main_menu: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ControlsSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, + if self._modal: + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + bui.containerwidget( + edit=self._root_widget, transition=self._transition_out ) + else: + self.main_window_back() def _reset(self) -> None: from bauiv1lib.confirm import ConfirmWindow @@ -894,18 +917,20 @@ class GamepadSettingsWindow(bui.Window): if not self._root_widget or self._root_widget.transitioning_out: return - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - # If we're a secondary editor we just go away (we were editing our # parent's settings dict). if self._is_secondary: + assert self._modal + bui.containerwidget( + edit=self._root_widget, transition=self._transition_out + ) return assert self._settings is not None - if self._input: - dst = classic.get_input_device_config(self._input, default=True) + if self._inputdevice: + dst = classic.get_input_device_config( + self._inputdevice, default=True + ) dst2: dict[str, Any] = dst[0][dst[1]] dst2.clear() @@ -916,7 +941,7 @@ class GamepadSettingsWindow(bui.Window): # If we're allowed to phone home, send this config so we can # generate more defaults in the future. - inputhash = classic.get_input_device_map_hash(self._input) + inputhash = classic.get_input_device_map_hash(self._inputdevice) classic.master_server_v1_post( 'controllerConfig', { @@ -933,14 +958,13 @@ class GamepadSettingsWindow(bui.Window): else: bui.getsound('error').play() - if self._is_main_menu: - from bauiv1lib.settings.controls import ControlsSettingsWindow - - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ControlsSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, + if self._modal: + bui.containerwidget( + edit=self._root_widget, transition=self._transition_out ) + else: + assert self.main_window_has_control() + self.main_window_back() class AwaitGamepadInputWindow(bui.Window): @@ -954,6 +978,7 @@ class AwaitGamepadInputWindow(bui.Window): message: bui.Lstr | None = None, message2: bui.Lstr | None = None, ): + # pylint: disable=too-many-positional-arguments if message is None: print('AwaitGamepadInputWindow message is None!') # Shouldn't get here. diff --git a/dist/ba_data/python/bauiv1lib/settings/gamepadadvanced.py b/dist/ba_data/python/bauiv1lib/settings/gamepadadvanced.py index 7ac9b80..ab06216 100644 --- a/dist/ba_data/python/bauiv1lib/settings/gamepadadvanced.py +++ b/dist/ba_data/python/bauiv1lib/settings/gamepadadvanced.py @@ -40,7 +40,7 @@ class GamepadAdvancedSettingsWindow(bui.Window): size=(self._width, self._height), scale=1.06 * ( - 1.85 + 1.6 if uiscale is bui.UIScale.SMALL else 1.35 if uiscale is bui.UIScale.MEDIUM else 1.0 ), @@ -99,7 +99,6 @@ class GamepadAdvancedSettingsWindow(bui.Window): ), size=(self._scroll_width, self._scroll_height), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._subcontainer = bui.containerwidget( @@ -107,7 +106,6 @@ class GamepadAdvancedSettingsWindow(bui.Window): size=(self._sub_width, self._sub_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) bui.containerwidget( @@ -473,6 +471,7 @@ class GamepadAdvancedSettingsWindow(bui.Window): name: bui.Lstr, control: str, position: tuple[float, float], + *, min_val: float = 0.0, max_val: float = 100.0, increment: float = 1.0, diff --git a/dist/ba_data/python/bauiv1lib/settings/gamepadselect.py b/dist/ba_data/python/bauiv1lib/settings/gamepadselect.py index ab0e7e1..79c4abb 100644 --- a/dist/ba_data/python/bauiv1lib/settings/gamepadselect.py +++ b/dist/ba_data/python/bauiv1lib/settings/gamepadselect.py @@ -4,8 +4,7 @@ from __future__ import annotations -import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bascenev1 as bs import bauiv1 as bui @@ -14,98 +13,14 @@ if TYPE_CHECKING: from typing import Any -def gamepad_configure_callback(event: dict[str, Any]) -> None: - """Respond to a gamepad button press during config selection.""" - from bauiv1lib.settings import gamepad - - # Ignore all but button-presses. - if event['type'] not in ['BUTTONDOWN', 'HATMOTION']: - return - bs.release_gamepad_input() - assert bui.app.classic is not None - try: - bui.app.ui_v1.clear_main_menu_window(transition='out_left') - except Exception: - logging.exception('Error transitioning out main_menu_window.') - bui.getsound('activateBeep').play() - bui.getsound('swish').play() - device = event['input_device'] - assert isinstance(device, bs.InputDevice) - if device.allows_configuring: - bui.app.ui_v1.set_main_menu_window( - gamepad.GamepadSettingsWindow(device).get_root_widget(), - from_window=None, - ) - else: - width = 700 - height = 200 - button_width = 80 - uiscale = bui.app.ui_v1.uiscale - dlg = bui.containerwidget( - scale=( - 1.7 - if uiscale is bui.UIScale.SMALL - else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - size=(width, height), - transition='in_right', - ) - bui.app.ui_v1.set_main_menu_window(dlg, from_window=None) - - if device.allows_configuring_in_system_settings: - msg = bui.Lstr( - resource='configureDeviceInSystemSettingsText', - subs=[('${DEVICE}', device.name)], - ) - elif device.is_controller_app: - msg = bui.Lstr( - resource='bsRemoteConfigureInAppText', - subs=[('${REMOTE_APP_NAME}', bui.get_remote_app_name())], - ) - else: - msg = bui.Lstr( - resource='cantConfigureDeviceText', - subs=[('${DEVICE}', device.name)], - ) - bui.textwidget( - parent=dlg, - position=(0, height - 80), - size=(width, 25), - text=msg, - scale=0.8, - h_align='center', - v_align='top', - ) - - def _ok() -> None: - from bauiv1lib.settings import controls - - # no-op if our underlying widget is dead or on its way out. - if not dlg or dlg.transitioning_out: - return - - bui.containerwidget(edit=dlg, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - controls.ControlsSettingsWindow( - transition='in_left' - ).get_root_widget(), - from_window=dlg, - ) - - bui.buttonwidget( - parent=dlg, - position=((width - button_width) / 2, 20), - size=(button_width, 60), - label=bui.Lstr(resource='okText'), - on_activate_call=_ok, - ) - - -class GamepadSelectWindow(bui.Window): +class GamepadSelectWindow(bui.MainWindow): """Window for selecting a gamepad to configure.""" - def __init__(self) -> None: + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ) -> None: from typing import cast width = 480 @@ -123,8 +38,9 @@ class GamepadSelectWindow(bui.Window): else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 ), size=(width, height), - transition='in_right', - ) + ), + transition=transition, + origin_widget=origin_widget, ) btn = bui.buttonwidget( @@ -134,10 +50,11 @@ class GamepadSelectWindow(bui.Window): label=bui.Lstr(resource='backText'), button_type='back', scale=0.8, - on_activate_call=self._back, + on_activate_call=self.main_window_back, ) - # Let's not have anything selected by default; its misleading looking - # for the controller getting configured. + + # Let's not have anything selected by default; its misleading + # looking for the controller getting configured. bui.containerwidget( edit=self._root_widget, cancel_button=btn, @@ -188,21 +105,133 @@ class GamepadSelectWindow(bui.Window): v_align='top', ) - bs.capture_gamepad_input(gamepad_configure_callback) + bs.capture_gamepad_input(bui.WeakCall(self.gamepad_configure_callback)) - def _back(self) -> None: - from bauiv1lib.settings import controls + def __del__(self) -> None: + bs.release_gamepad_input() - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + def gamepad_configure_callback(self, event: dict[str, Any]) -> None: + """Respond to a gamepad button press during config selection.""" + from bauiv1lib.settings.gamepad import GamepadSettingsWindow + + if not self.main_window_has_control(): return + # Ignore all but button-presses. + if event['type'] not in ['BUTTONDOWN', 'HATMOTION']: + return bs.release_gamepad_input() - bui.containerwidget(edit=self._root_widget, transition='out_right') + assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - controls.ControlsSettingsWindow( - transition='in_left' - ).get_root_widget(), - from_window=self._root_widget, + + bui.getsound('activateBeep').play() + bui.getsound('swish').play() + device = event['input_device'] + assert isinstance(device, bs.InputDevice) + + # No matter where we redirect to, we want their back + # functionality to skip over us and go to our parent. + assert self.main_window_back_state is not None + back_state = self.main_window_back_state + + if device.allows_configuring: + self.main_window_replace( + GamepadSettingsWindow(device), back_state=back_state + ) + else: + self.main_window_replace( + _NotConfigurableWindow(device), back_state=back_state + ) + + +class _NotConfigurableWindow(bui.MainWindow): + + def __init__( + self, + device: bs.InputDevice, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ) -> None: + width = 700 + height = 200 + button_width = 80 + uiscale = bui.app.ui_v1.uiscale + super().__init__( + root_widget=bui.containerwidget( + scale=( + 1.7 + if uiscale is bui.UIScale.SMALL + else (1.4 if uiscale is bui.UIScale.MEDIUM else 1.0) + ), + size=(width, height), + ), + transition=transition, + origin_widget=origin_widget, + ) + self.device = device + + if device.allows_configuring_in_system_settings: + msg = bui.Lstr( + resource='configureDeviceInSystemSettingsText', + subs=[('${DEVICE}', device.name)], + ) + elif device.is_controller_app: + msg = bui.Lstr( + resource='bsRemoteConfigureInAppText', + subs=[ + ( + '${REMOTE_APP_NAME}', + bui.get_remote_app_name(), + ) + ], + ) + else: + msg = bui.Lstr( + resource='cantConfigureDeviceText', + subs=[('${DEVICE}', device.name)], + ) + bui.textwidget( + parent=self._root_widget, + position=(0, height - 80), + size=(width, 25), + text=msg, + scale=0.8, + h_align='center', + v_align='top', + ) + + btn = bui.buttonwidget( + parent=self._root_widget, + position=((width - button_width) / 2, 20), + size=(button_width, 60), + label=bui.Lstr(resource='okText'), + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull stuff out of self here; if we do it in the lambda we'll + # keep self alive which we don't want. + device = self.device + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + device=device, + transition=transition, + origin_widget=origin_widget, + ) ) diff --git a/dist/ba_data/python/bauiv1lib/settings/graphics.py b/dist/ba_data/python/bauiv1lib/settings/graphics.py index 650d3cd..5c85d50 100644 --- a/dist/ba_data/python/bauiv1lib/settings/graphics.py +++ b/dist/ba_data/python/bauiv1lib/settings/graphics.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, cast, override from bauiv1lib.popup import PopupMenu from bauiv1lib.config import ConfigCheckBox @@ -14,28 +14,18 @@ if TYPE_CHECKING: from typing import Any -class GraphicsSettingsWindow(bui.Window): +class GraphicsSettingsWindow(bui.MainWindow): """Window for graphics settings.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-locals # pylint: disable=too-many-branches # pylint: disable=too-many-statements - # if they provided an origin-widget, scale up from that - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - self._r = 'graphicsSettingsWindow' app = bui.app assert app.classic is not None @@ -43,8 +33,8 @@ class GraphicsSettingsWindow(bui.Window): spacing = 32 self._have_selected_child = False uiscale = app.ui_v1.uiscale - width = 450.0 - height = 302.0 + width = 1200 if uiscale is bui.UIScale.SMALL else 450.0 + height = 900 if uiscale is bui.UIScale.SMALL else 302.0 self._max_fps_dirty = False self._last_max_fps_set_time = bui.apptime() self._last_max_fps_str = '' @@ -69,52 +59,80 @@ class GraphicsSettingsWindow(bui.Window): app.classic.platform == 'android' and app.classic.subplatform == 'cardboard' ) - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - base_scale = ( - 2.0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.9 if uiscale is bui.UIScale.SMALL - else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 ) - popup_menu_scale = base_scale * 1.2 - v = height - 50 - v -= spacing * 1.15 + popup_menu_scale = scale * 1.2 + + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(width - 80, screensize[0] / scale) + target_height = min(height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition=transition, - scale_origin_stack_offset=scale_origin, - scale=base_scale, - stack_offset=( - (0, -30) if uiscale is bui.UIScale.SMALL else (0, 0) + scale=scale, + toolbar_visibility=( + 'menu_minimal' + if uiscale is bui.UIScale.SMALL + else 'menu_full' ), + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + # Center most of our content in the middle of the window. + v = height * 0.5 + 85 + h_offs = width * 0.5 - 220 + + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + back_button = None + else: + back_button = bui.buttonwidget( + parent=self._root_widget, + position=(35, yoffs - 50), + size=(60, 60), + scale=0.8, + text_scale=1.2, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=back_button ) - ) - - back_button = bui.buttonwidget( - parent=self._root_widget, - position=(35, height - 50), - # size=(120, 60), - size=(60, 60), - scale=0.8, - text_scale=1.2, - autoselect=True, - label=bui.charstr(bui.SpecialChar.BACK), - button_type='backSmall', - on_activate_call=self._back, - ) - - bui.containerwidget(edit=self._root_widget, cancel_button=back_button) bui.textwidget( parent=self._root_widget, - position=(0, height - 44), - size=(width, 25), + position=( + width * 0.5, + yoffs - (53 if uiscale is bui.UIScale.SMALL else 25), + ), + size=(0, 0), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, h_align='center', - v_align='top', + v_align='center', ) self._fullscreen_checkbox: bui.Widget | None = None @@ -135,7 +153,7 @@ class GraphicsSettingsWindow(bui.Window): ) self._fullscreen_checkbox = bui.checkboxwidget( parent=self._root_widget, - position=(100, v), + position=(h_offs + 100, v), value=bui.fullscreen_control_get(), on_value_change_call=bui.fullscreen_control_set, maxwidth=250, @@ -157,7 +175,7 @@ class GraphicsSettingsWindow(bui.Window): # Quality bui.textwidget( parent=self._root_widget, - position=(60, v), + position=(h_offs + 60, v), size=(160, 25), text=bui.Lstr(resource=f'{self._r}.visualsText'), color=bui.app.ui_v1.heading_color, @@ -168,7 +186,7 @@ class GraphicsSettingsWindow(bui.Window): ) PopupMenu( parent=self._root_widget, - position=(60, v - 50), + position=(h_offs + 60, v - 50), width=150, scale=popup_menu_scale, choices=['Auto', 'Higher', 'High', 'Medium', 'Low'], @@ -191,7 +209,7 @@ class GraphicsSettingsWindow(bui.Window): # Texture controls bui.textwidget( parent=self._root_widget, - position=(230, v), + position=(h_offs + 230, v), size=(160, 25), text=bui.Lstr(resource=f'{self._r}.texturesText'), color=bui.app.ui_v1.heading_color, @@ -202,7 +220,7 @@ class GraphicsSettingsWindow(bui.Window): ) textures_popup = PopupMenu( parent=self._root_widget, - position=(230, v - 50), + position=(h_offs + 230, v - 50), width=150, scale=popup_menu_scale, choices=['Auto', 'High', 'Medium', 'Low'], @@ -215,15 +233,12 @@ class GraphicsSettingsWindow(bui.Window): current_choice=bui.app.config.resolve('Texture Quality'), on_value_change_call=self._set_textures, ) - if bui.app.ui_v1.use_toolbars: - bui.widget( - edit=textures_popup.get_button(), - right_widget=bui.get_special_widget('party_button'), - ) + bui.widget( + edit=textures_popup.get_button(), + right_widget=bui.get_special_widget('squad_button'), + ) v -= 80 - h_offs = 0 - resolution_popup: PopupMenu | None = None if show_resolution: @@ -317,7 +332,7 @@ class GraphicsSettingsWindow(bui.Window): if show_vsync: bui.textwidget( parent=self._root_widget, - position=(230, v), + position=(h_offs + 230, v), size=(160, 25), text=bui.Lstr(resource=f'{self._r}.verticalSyncText'), color=bui.app.ui_v1.heading_color, @@ -328,7 +343,7 @@ class GraphicsSettingsWindow(bui.Window): ) vsync_popup = PopupMenu( parent=self._root_widget, - position=(230, v - 50), + position=(h_offs + 230, v - 50), width=150, scale=popup_menu_scale, choices=['Auto', 'Always', 'Never'], @@ -358,7 +373,7 @@ class GraphicsSettingsWindow(bui.Window): v -= 5 bui.textwidget( parent=self._root_widget, - position=(155, v + 10), + position=(h_offs + 155, v + 10), size=(0, 0), text=bui.Lstr(resource=f'{self._r}.maxFPSText'), color=bui.app.ui_v1.heading_color, @@ -372,7 +387,7 @@ class GraphicsSettingsWindow(bui.Window): self._last_max_fps_str = max_fps_str self._max_fps_text = bui.textwidget( parent=self._root_widget, - position=(170, v - 5), + position=(h_offs + 170, v - 5), size=(105, 30), text=max_fps_str, max_chars=5, @@ -395,7 +410,7 @@ class GraphicsSettingsWindow(bui.Window): fpsc = ConfigCheckBox( parent=self._root_widget, - position=(69, v - 6), + position=(h_offs + 69, v - 6), size=(210, 30), scale=0.86, configkey='Show FPS', @@ -415,7 +430,7 @@ class GraphicsSettingsWindow(bui.Window): if show_tv_mode: tvc = ConfigCheckBox( parent=self._root_widget, - position=(240, v - 6), + position=(h_offs + 240, v - 6), size=(210, 30), scale=0.86, configkey='TV Border', @@ -433,28 +448,20 @@ class GraphicsSettingsWindow(bui.Window): 0.25, bui.WeakCall(self._update_controls), repeat=True ) - def _back(self) -> None: - from bauiv1lib.settings import allsettings + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - # Applying max-fps takes a few moments. Apply if it hasn't been - # yet. + @override + def on_main_window_close(self) -> None: self._apply_max_fps() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - allsettings.AllSettingsWindow( - transition='in_left' - ).get_root_widget(), - from_window=self._root_widget, - ) - def _set_quality(self, quality: str) -> None: cfg = bui.app.config cfg['Graphics Quality'] = quality diff --git a/dist/ba_data/python/bauiv1lib/settings/keyboard.py b/dist/ba_data/python/bauiv1lib/settings/keyboard.py index 9bda0fb..0225a6f 100644 --- a/dist/ba_data/python/bauiv1lib/settings/keyboard.py +++ b/dist/ba_data/python/bauiv1lib/settings/keyboard.py @@ -4,7 +4,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from bauiv1lib.popup import PopupMenuWindow import bauiv1 as bui @@ -12,13 +12,19 @@ import bascenev1 as bs if TYPE_CHECKING: from typing import Any + from bauiv1lib.popup import PopupWindow -class ConfigKeyboardWindow(bui.Window): +class ConfigKeyboardWindow(bui.MainWindow): """Window for configuring keyboards.""" - def __init__(self, c: bs.InputDevice, transition: str = 'in_right'): + def __init__( + self, + c: bs.InputDevice, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): self._r = 'configKeyboardWindow' self._input = c self._name = self._input.name @@ -39,13 +45,15 @@ class ConfigKeyboardWindow(bui.Window): root_widget=bui.containerwidget( size=(self._width, self._height), scale=( - 1.6 + 1.4 if uiscale is bui.UIScale.SMALL else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 ), stack_offset=(0, 5) if uiscale is bui.UIScale.SMALL else (0, 0), transition=transition, - ) + ), + transition=transition, + origin_widget=origin_widget, ) self._settings: dict[str, int] = {} @@ -53,6 +61,23 @@ class ConfigKeyboardWindow(bui.Window): self._rebuild_ui() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull things from self here; if we do it within the lambda + # we'll keep self alive which is bad. + inputdevice = self._input + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + c=inputdevice, + ) + ) + def _get_config_mapping(self, default: bool = False) -> None: for button in [ 'buttonJump', @@ -87,7 +112,7 @@ class ConfigKeyboardWindow(bui.Window): size=(170, 60), label=bui.Lstr(resource='cancelText'), scale=0.9, - on_activate_call=self._cancel, + on_activate_call=self.main_window_back, ) save_button = bui.buttonwidget( parent=self._root_widget, @@ -246,6 +271,7 @@ class ConfigKeyboardWindow(bui.Window): button: str, scale: float = 1.0, ) -> None: + # pylint: disable=too-many-positional-arguments base_size = 79 btn = bui.buttonwidget( parent=self._root_widget, @@ -287,20 +313,6 @@ class ConfigKeyboardWindow(bui.Window): bui.pushcall(doit) - def _cancel(self) -> None: - from bauiv1lib.settings.controls import ControlsSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - ControlsSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - def _reset(self) -> None: from bauiv1lib.confirm import ConfirmWindow @@ -366,17 +378,16 @@ class ConfigKeyboardWindow(bui.Window): """Called when the popup is closing.""" def _save(self) -> None: - from bauiv1lib.settings.controls import ControlsSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return assert bui.app.classic is not None - bui.containerwidget(edit=self._root_widget, transition='out_right') bui.getsound('gunCocking').play() - # There's a chance the device disappeared; handle that gracefully. + # There's a chance the device disappeared; handle that + # gracefully. if not self._input: return @@ -391,8 +402,8 @@ class ConfigKeyboardWindow(bui.Window): if val != -1: dst2[key] = val - # Send this config to the master-server so we can generate - # more defaults in the future. + # Send this config to the master-server so we can generate more + # defaults in the future. if bui.app.classic is not None: bui.app.classic.master_server_v1_post( 'controllerConfig', @@ -405,10 +416,8 @@ class ConfigKeyboardWindow(bui.Window): }, ) bui.app.config.apply_and_commit() - bui.app.ui_v1.set_main_menu_window( - ControlsSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) + + self.main_window_back() class AwaitKeyboardInputWindow(bui.Window): diff --git a/dist/ba_data/python/bauiv1lib/settings/nettesting.py b/dist/ba_data/python/bauiv1lib/settings/nettesting.py index 2e7f7e8..4d36f5e 100644 --- a/dist/ba_data/python/bauiv1lib/settings/nettesting.py +++ b/dist/ba_data/python/bauiv1lib/settings/nettesting.py @@ -8,7 +8,7 @@ import time import copy import weakref from threading import Thread -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from efro.error import CleanError from bauiv1lib.settings.testing import TestingWindow @@ -22,40 +22,94 @@ if TYPE_CHECKING: MAX_TEST_SECONDS = 60 * 2 -class NetTestingWindow(bui.Window): +class NetTestingWindow(bui.MainWindow): """Window that runs a networking test suite to help diagnose issues.""" - def __init__(self, transition: str = 'in_right'): - self._width = 820 - self._height = 500 + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): + uiscale = bui.app.ui_v1.uiscale + self._width = 1200 if uiscale is bui.UIScale.SMALL else 820 + self._height = ( + 800 + if uiscale is bui.UIScale.SMALL + else 550 if uiscale is bui.UIScale.MEDIUM else 650 + ) + self._printed_lines: list[str] = [] assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.75 + if uiscale is bui.UIScale.SMALL + else 1.0 if uiscale is bui.UIScale.MEDIUM else 0.75 + ) + + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 90, screensize[0] / scale) + target_height = min(self._height - 90, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + scroll_width = target_width + scroll_height = target_height - 52 + scroll_bottom = yoffs - 82 - scroll_height + super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - scale=( - 1.56 + scale=scale, + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.2 if uiscale is bui.UIScale.MEDIUM else 0.8 + else 'menu_full' ), - stack_offset=(0.0, -7 if uiscale is bui.UIScale.SMALL else 0.0), - transition=transition, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + self._back_button: bui.Widget | None + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + self._back_button = None + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(46, yoffs - 77), + size=(60, 60), + scale=0.9, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + autoselect=True, + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button ) - ) - self._done_button = bui.buttonwidget( - parent=self._root_widget, - position=(40, self._height - 77), - size=(120, 60), - scale=0.8, - autoselect=True, - label=bui.Lstr(resource='doneText'), - on_activate_call=self._done, - ) + # Avoid squads button on small mode. + # xinset = -50 if uiscale is bui.UIScale.SMALL else 0 + + xextra = -80 if uiscale is bui.UIScale.SMALL else 0 self._copy_button = bui.buttonwidget( parent=self._root_widget, - position=(self._width - 200, self._height - 77), + position=( + self._width * 0.5 + scroll_width * 0.5 - 210 + 80 + xextra, + yoffs - 79, + ), size=(100, 60), scale=0.8, autoselect=True, @@ -65,7 +119,10 @@ class NetTestingWindow(bui.Window): self._settings_button = bui.buttonwidget( parent=self._root_widget, - position=(self._width - 100, self._height - 77), + position=( + self._width * 0.5 + scroll_width * 0.5 - 110 + 80 + xextra, + yoffs - 77, + ), size=(60, 60), scale=0.8, autoselect=True, @@ -73,31 +130,27 @@ class NetTestingWindow(bui.Window): on_activate_call=self._show_val_testing, ) - twidth = self._width - 450 bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 55), + position=(self._width * 0.5, yoffs - 55), size=(0, 0), text=bui.Lstr(resource='settingsWindowAdvanced.netTestingText'), color=(0.8, 0.8, 0.8, 1.0), h_align='center', v_align='center', - maxwidth=twidth, + maxwidth=250, ) self._scroll = bui.scrollwidget( parent=self._root_widget, - position=(50, 50), - size=(self._width - 100, self._height - 140), + size=(scroll_width, scroll_height), + position=(self._width * 0.5 - scroll_width * 0.5, scroll_bottom), capture_arrows=True, autoselect=True, + border_opacity=0.4, ) self._rows = bui.columnwidget(parent=self._scroll) - bui.containerwidget( - edit=self._root_widget, cancel_button=self._done_button - ) - # Now kick off the tests. # Pass a weak-ref to this window so we don't keep it alive # if we back out before it completes. Also set is as daemon @@ -107,6 +160,16 @@ class NetTestingWindow(bui.Window): target=bui.Call(_run_diagnostics, weakref.ref(self)), ).start() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + def print(self, text: str, color: tuple[float, float, float]) -> None: """Print text to our console thingie.""" for line in text.splitlines(): @@ -134,30 +197,11 @@ class NetTestingWindow(bui.Window): def _show_val_testing(self) -> None: assert bui.app.classic is not None - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - bui.app.ui_v1.set_main_menu_window( - NetValTestingWindow().get_root_widget(), - from_window=self._root_widget, - ) - bui.containerwidget(edit=self._root_widget, transition='out_left') - - def _done(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - bui.containerwidget(edit=self._root_widget, transition='out_right') + self.main_window_replace(get_net_val_testing_window()) def _run_diagnostics(weakwin: weakref.ref[NetTestingWindow]) -> None: @@ -449,27 +493,48 @@ def _test_nearby_zone_ping(nearest_zone: tuple[str, float] | None) -> None: raise RuntimeError('Ping too high.') -class NetValTestingWindow(TestingWindow): - """Window to test network related settings.""" +def get_net_val_testing_window() -> TestingWindow: + """Create a window for testing net values.""" + entries = [ + {'name': 'bufferTime', 'label': 'Buffer Time', 'increment': 1.0}, + { + 'name': 'delaySampling', + 'label': 'Delay Sampling', + 'increment': 1.0, + }, + { + 'name': 'dynamicsSyncTime', + 'label': 'Dynamics Sync Time', + 'increment': 10, + }, + {'name': 'showNetInfo', 'label': 'Show Net Info', 'increment': 1}, + ] + return TestingWindow( + title=bui.Lstr(resource='settingsWindowAdvanced.netTestingText'), + entries=entries, + ) - def __init__(self, transition: str = 'in_right'): - entries = [ - {'name': 'bufferTime', 'label': 'Buffer Time', 'increment': 1.0}, - { - 'name': 'delaySampling', - 'label': 'Delay Sampling', - 'increment': 1.0, - }, - { - 'name': 'dynamicsSyncTime', - 'label': 'Dynamics Sync Time', - 'increment': 10, - }, - {'name': 'showNetInfo', 'label': 'Show Net Info', 'increment': 1}, - ] - super().__init__( - title=bui.Lstr(resource='settingsWindowAdvanced.netTestingText'), - entries=entries, - transition=transition, - back_call=lambda: NetTestingWindow(transition='in_left'), - ) + +# class NetValTestingWindow(TestingWindow): +# """Window to test network related settings.""" + +# def __init__(self, transition: str = 'in_right'): +# entries = [ +# {'name': 'bufferTime', 'label': 'Buffer Time', 'increment': 1.0}, +# { +# 'name': 'delaySampling', +# 'label': 'Delay Sampling', +# 'increment': 1.0, +# }, +# { +# 'name': 'dynamicsSyncTime', +# 'label': 'Dynamics Sync Time', +# 'increment': 10, +# }, +# {'name': 'showNetInfo', 'label': 'Show Net Info', 'increment': 1}, +# ] +# super().__init__( +# title=bui.Lstr(resource='settingsWindowAdvanced.netTestingText'), +# entries=entries, +# transition=transition, +# ) diff --git a/dist/ba_data/python/bauiv1lib/settings/plugins.py b/dist/ba_data/python/bauiv1lib/settings/plugins.py index b33216b..283e371 100644 --- a/dist/ba_data/python/bauiv1lib/settings/plugins.py +++ b/dist/ba_data/python/bauiv1lib/settings/plugins.py @@ -4,9 +4,9 @@ from __future__ import annotations -from enum import Enum import logging -from typing import TYPE_CHECKING, assert_never +from enum import Enum +from typing import TYPE_CHECKING, assert_never, override import bauiv1 as bui from bauiv1lib import popup @@ -28,77 +28,85 @@ class Category(Enum): return f'{self.value}Text' -class PluginWindow(bui.Window): +class PluginWindow(bui.MainWindow): """Window for configuring plugins.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): - # pylint: disable=too-many-statements + # pylint: disable=too-many-locals app = bui.app self._category = Category.ALL - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 870.0 if uiscale is bui.UIScale.SMALL else 670.0 - x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 + self._width = 1200.0 if uiscale is bui.UIScale.SMALL else 670.0 self._height = ( - 390.0 + 900.0 if uiscale is bui.UIScale.SMALL else 450.0 if uiscale is bui.UIScale.MEDIUM else 520.0 ) - top_extra = 10 if uiscale is bui.UIScale.SMALL else 0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.9 + if uiscale is bui.UIScale.SMALL + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 80, screensize[0] / scale) + target_height = min(self._height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 20.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 40 + self._scroll_bottom = yoffs - 64 - self._scroll_height + super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + top_extra), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.06 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -25) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._scroll_width = self._width - (100 + 2 * x_inset) - self._scroll_height = self._height - 115.0 self._sub_width = self._scroll_width * 0.95 self._sub_height = 724.0 assert app.classic is not None - if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._do_back + edit=self._root_widget, on_cancel_call=self.main_window_back ) self._back_button = None else: self._back_button = bui.buttonwidget( parent=self._root_widget, - position=(53 + x_inset, self._height - 60), - size=(140, 60), + position=(53, yoffs - 49), + size=(60, 60), scale=0.8, autoselect=True, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._do_back, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) bui.containerwidget( edit=self._root_widget, cancel_button=self._back_button @@ -106,7 +114,10 @@ class PluginWindow(bui.Window): self._title_text = bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 41), + position=( + self._width * 0.5, + yoffs - (42 if uiscale is bui.UIScale.SMALL else 30), + ), size=(0, 0), text=bui.Lstr(resource='pluginsText'), color=app.ui_v1.title_color, @@ -115,19 +126,16 @@ class PluginWindow(bui.Window): v_align='center', ) - if self._back_button is not None: - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - settings_button_x = 670 if uiscale is bui.UIScale.SMALL else 570 + settings_button_x = ( + self._width * 0.5 + + self._scroll_width * 0.5 + - (100 if uiscale is bui.UIScale.SMALL else 40) + ) + button_row_yoffs = yoffs + (-2 if uiscale is bui.UIScale.SMALL else 10) self._num_plugins_text = bui.textwidget( parent=self._root_widget, - position=(settings_button_x - 130, self._height - 41), + position=(settings_button_x - 130, button_row_yoffs - 41), size=(0, 0), text='', h_align='center', @@ -137,7 +145,7 @@ class PluginWindow(bui.Window): self._category_button = bui.buttonwidget( parent=self._root_widget, scale=0.7, - position=(settings_button_x - 105, self._height - 60), + position=(settings_button_x - 105, button_row_yoffs - 60), size=(130, 60), label=bui.Lstr(resource='allText'), autoselect=True, @@ -148,7 +156,7 @@ class PluginWindow(bui.Window): self._settings_button = bui.buttonwidget( parent=self._root_widget, - position=(settings_button_x, self._height - 58), + position=(settings_button_x, button_row_yoffs - 58), size=(40, 40), label='', on_activate_call=self._open_settings, @@ -156,7 +164,7 @@ class PluginWindow(bui.Window): bui.imagewidget( parent=self._root_widget, - position=(settings_button_x + 3, self._height - 57), + position=(settings_button_x + 3, button_row_yoffs - 57), draw_controller=self._settings_button, size=(35, 35), texture=bui.gettexture('settingsIcon'), @@ -170,12 +178,16 @@ class PluginWindow(bui.Window): self._scrollwidget = bui.scrollwidget( parent=self._root_widget, - position=(50 + x_inset, 50), + size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, + ), simple_culling_v=20.0, highlight=False, - size=(self._scroll_width, self._scroll_height), selection_loops_to_parent=True, claims_left_right=True, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, right_widget=self._scrollwidget) @@ -213,6 +225,20 @@ class PluginWindow(bui.Window): ) self._restore_state() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _check_value_changed(self, plug: bui.PluginSpec, value: bool) -> None: bui.screenmessage( bui.Lstr(resource='settingsWindowAdvanced.mustRestartText'), @@ -228,17 +254,11 @@ class PluginWindow(bui.Window): # pylint: disable=cyclic-import from bauiv1lib.settings.pluginsettings import PluginSettingsWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we don't have control. + if not self.main_window_has_control(): return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PluginSettingsWindow(transition='in_right').get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_replace(PluginSettingsWindow(transition='in_right')) def _show_category_options(self) -> None: uiscale = bui.app.ui_v1.uiscale @@ -451,21 +471,3 @@ class PluginWindow(bui.Window): bui.containerwidget(edit=self._root_widget, selected_child=sel) except Exception: logging.exception('Error restoring state for %s.', self) - - def _do_back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AdvancedSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/settings/pluginsettings.py b/dist/ba_data/python/bauiv1lib/settings/pluginsettings.py index d59554f..9d3344c 100644 --- a/dist/ba_data/python/bauiv1lib/settings/pluginsettings.py +++ b/dist/ba_data/python/bauiv1lib/settings/pluginsettings.py @@ -4,73 +4,101 @@ from __future__ import annotations +from typing import override + import bauiv1 as bui from bauiv1lib.confirm import ConfirmWindow -class PluginSettingsWindow(bui.Window): +class PluginSettingsWindow(bui.MainWindow): """Plugin Settings Window""" - def __init__(self, transition: str = 'in_right'): - scale_origin: tuple[float, float] | None - self._transition_out = 'out_right' - scale_origin = None + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ): assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - width = 470.0 if uiscale is bui.UIScale.SMALL else 470.0 - height = ( - 365.0 + self._width = 1200.0 if uiscale is bui.UIScale.SMALL else 470.0 + self._height = 900.0 if uiscale is bui.UIScale.SMALL else 360.0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.06 if uiscale is bui.UIScale.SMALL - else 300.0 if uiscale is bui.UIScale.MEDIUM else 370.0 + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 ) - top_extra = 10 if uiscale is bui.UIScale.SMALL else 0 + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 100, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + self._yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 super().__init__( root_widget=bui.containerwidget( - size=(width, height + top_extra), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.06 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -25) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - self._back_button = bui.buttonwidget( - parent=self._root_widget, - position=(53, height - 60), - size=(60, 60), - scale=0.8, - autoselect=True, - label=bui.charstr(bui.SpecialChar.BACK), - button_type='backSmall', - on_activate_call=self._do_back, - ) - bui.containerwidget( - edit=self._root_widget, cancel_button=self._back_button - ) + if uiscale is bui.UIScale.SMALL: + self._back_button = bui.get_special_widget('back_button') + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(55, self._yoffs - 33), + size=(60, 60), + scale=0.8, + autoselect=True, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) self._title_text = bui.textwidget( parent=self._root_widget, - position=(0, height - 52), - size=(width, 25), + position=( + self._width * 0.5, + self._yoffs - (55 if uiscale is bui.UIScale.SMALL else 10), + ), + size=(0, 0), text=bui.Lstr(resource='pluginSettingsText'), + maxwidth=230, color=bui.app.ui_v1.title_color, h_align='center', - v_align='top', + v_align='center', ) - self._y_position = 170 if uiscale is bui.UIScale.MEDIUM else 205 + # Roughly center our few bits of content. + x = self._width * 0.5 - 175 + y = self._height * 0.5 + 30 + self._enable_plugins_button = bui.buttonwidget( parent=self._root_widget, - position=(65, self._y_position), + position=(x, y), size=(350, 60), autoselect=True, label=bui.Lstr(resource='pluginsEnableAllText'), @@ -80,10 +108,10 @@ class PluginSettingsWindow(bui.Window): ), ) - self._y_position -= 70 + y -= 70 self._disable_plugins_button = bui.buttonwidget( parent=self._root_widget, - position=(65, self._y_position), + position=(x, y), size=(350, 60), autoselect=True, label=bui.Lstr(resource='pluginsDisableAllText'), @@ -93,10 +121,10 @@ class PluginSettingsWindow(bui.Window): ), ) - self._y_position -= 70 + y -= 70 self._enable_new_plugins_check_box = bui.checkboxwidget( parent=self._root_widget, - position=(65, self._y_position), + position=(x, y), size=(350, 60), value=bui.app.config.get( bui.app.plugins.AUTO_ENABLE_NEW_PLUGINS_CONFIG_KEY, @@ -108,9 +136,10 @@ class PluginSettingsWindow(bui.Window): on_value_change_call=self._update_value, ) - bui.widget( - edit=self._back_button, down_widget=self._enable_plugins_button - ) + if uiscale is not bui.UIScale.SMALL: + bui.widget( + edit=self._back_button, down_widget=self._enable_plugins_button + ) bui.widget( edit=self._disable_plugins_button, @@ -124,6 +153,16 @@ class PluginSettingsWindow(bui.Window): down_widget=self._enable_new_plugins_check_box, ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + def _enable_all_plugins(self) -> None: cfg = bui.app.config plugs: dict[str, dict] = cfg.setdefault('Plugins', {}) @@ -152,20 +191,3 @@ class PluginSettingsWindow(bui.Window): cfg = bui.app.config cfg[bui.app.plugins.AUTO_ENABLE_NEW_PLUGINS_CONFIG_KEY] = val cfg.apply_and_commit() - - def _do_back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.plugins import PluginWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - PluginWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/settings/remoteapp.py b/dist/ba_data/python/bauiv1lib/settings/remoteapp.py index f6a8216..0c124d7 100644 --- a/dist/ba_data/python/bauiv1lib/settings/remoteapp.py +++ b/dist/ba_data/python/bauiv1lib/settings/remoteapp.py @@ -4,49 +4,86 @@ from __future__ import annotations +from typing import override + import bauiv1 as bui -class RemoteAppSettingsWindow(bui.Window): +class RemoteAppSettingsWindow(bui.MainWindow): """Window showing info/settings related to the remote app.""" - def __init__(self) -> None: + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ) -> None: self._r = 'connectMobileDevicesWindow' - width = 700 - height = 390 + app = bui.app + uiscale = app.ui_v1.uiscale + width = 1200 if uiscale is bui.UIScale.SMALL else 700 + height = 800 if uiscale is bui.UIScale.SMALL else 390 + # yoffs = -48 if uiscale is bui.UIScale.SMALL else 0 spacing = 40 assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.75 + if uiscale is bui.UIScale.SMALL + else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(width - 60, screensize[0] / scale) + target_height = min(height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * height + 0.5 * target_height + 30.0 + super().__init__( root_widget=bui.containerwidget( size=(width, height), - transition='in_right', - scale=( - 1.85 + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.3 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (-10, 0) if uiscale is bui.UIScale.SMALL else (0, 0) + else 'menu_full' ), + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self.get_root_widget(), + on_cancel_call=self.main_window_back, ) - ) - btn = bui.buttonwidget( - parent=self._root_widget, - position=(40, height - 67), - size=(140, 65), - scale=0.8, - label=bui.Lstr(resource='backText'), - button_type='back', - text_scale=1.1, - autoselect=True, - on_activate_call=self._back, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) + else: + btn = bui.buttonwidget( + parent=self._root_widget, + position=(40, yoffs - 67), + size=(60, 60), + scale=0.8, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + text_scale=1.1, + autoselect=True, + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) bui.textwidget( parent=self._root_widget, - position=(width * 0.5, height - 42), + position=( + width * 0.5, + yoffs - (62 if uiscale is bui.UIScale.SMALL else 42), + ), size=(0, 0), text=bui.Lstr(resource=f'{self._r}.titleText'), maxwidth=370, @@ -56,14 +93,8 @@ class RemoteAppSettingsWindow(bui.Window): v_align='center', ) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - - v = height - 70.0 + # Generally center the rest of our contents vertically. + v = height * 0.5 + 140.0 v -= spacing * 1.2 bui.textwidget( parent=self._root_widget, @@ -108,7 +139,7 @@ class RemoteAppSettingsWindow(bui.Window): scale=0.65, text=bui.Lstr(resource=f'{self._r}.bestResultsText'), maxwidth=width * 0.95, - max_height=height * 0.19, + max_height=100, h_align='center', v_align='center', ) @@ -125,23 +156,17 @@ class RemoteAppSettingsWindow(bui.Window): on_value_change_call=self._on_check_changed, ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + def _on_check_changed(self, value: bool) -> None: cfg = bui.app.config cfg['Enable Remote App'] = not value cfg.apply_and_commit() - - def _back(self) -> None: - from bauiv1lib.settings import controls - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - controls.ControlsSettingsWindow( - transition='in_left' - ).get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/bauiv1lib/settings/testing.py b/dist/ba_data/python/bauiv1lib/settings/testing.py index 5af029b..712ce93 100644 --- a/dist/ba_data/python/bauiv1lib/settings/testing.py +++ b/dist/ba_data/python/bauiv1lib/settings/testing.py @@ -5,7 +5,7 @@ from __future__ import annotations import copy -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -13,83 +13,120 @@ if TYPE_CHECKING: from typing import Any, Callable -class TestingWindow(bui.Window): +class TestingWindow(bui.MainWindow): """Window for conveniently testing various settings.""" def __init__( self, title: bui.Lstr, entries: list[dict[str, Any]], - transition: str = 'in_right', - back_call: Callable[[], bui.Window] | None = None, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): + # pylint: disable=too-many-locals assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 600 - self._height = 324 if uiscale is bui.UIScale.SMALL else 400 + self._width = 1200 if uiscale is bui.UIScale.SMALL else 600 + self._height = 800 if uiscale is bui.UIScale.SMALL else 400 + self._entries_orig = copy.deepcopy(entries) self._entries = copy.deepcopy(entries) - self._back_call = back_call + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.27 + if uiscale is bui.UIScale.SMALL + else 1.2 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 47 + self._scroll_bottom = yoffs - 78 - self._scroll_height + super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition=transition, - scale=( - 2.5 + scale=scale, + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.2 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (0, -28) if uiscale is bui.UIScale.SMALL else (0, 0) + else 'menu_full' ), + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, + ) + + if uiscale is bui.UIScale.SMALL: + self._back_button = bui.get_special_widget('back_button') + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back ) - ) - self._back_button = btn = bui.buttonwidget( - parent=self._root_widget, - autoselect=True, - position=(65, self._height - 59), - size=(130, 60), - scale=0.8, - text_scale=1.2, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._do_back, - ) + else: + self._back_button = btn = bui.buttonwidget( + parent=self._root_widget, + autoselect=True, + position=(35, yoffs - 59), + size=(60, 60), + scale=0.8, + text_scale=1.2, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) + + self.title = title bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 35), + position=( + self._width * 0.5, + yoffs - (43 if uiscale is bui.UIScale.SMALL else 35), + ), size=(0, 0), + scale=0.7 if uiscale is bui.UIScale.SMALL else 1.0, color=bui.app.ui_v1.title_color, h_align='center', v_align='center', maxwidth=245, - text=title, - ) - - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), + text=self.title, ) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 75), + position=( + self._width * 0.5, + yoffs - 65, + ), size=(0, 0), + scale=0.5, color=bui.app.ui_v1.infotextcolor, h_align='center', v_align='center', - maxwidth=self._width * 0.75, + maxwidth=self._scroll_width * 0.75, text=bui.Lstr(resource='settingsWindowAdvanced.forTestingText'), ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) - self._scroll_width = self._width - 130 - self._scroll_height = self._height - 140 self._scrollwidget = bui.scrollwidget( parent=self._root_widget, size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, + ), highlight=False, - position=((self._width - self._scroll_width) * 0.5, 40), + border_opacity=0.4, ) bui.containerwidget(edit=self._scrollwidget, claims_left_right=True) @@ -109,8 +146,8 @@ class TestingWindow(bui.Window): for i, entry in enumerate(self._entries): entry_name = entry['name'] - # If we haven't yet, record the default value for this name so - # we can reset if we want.. + # If we haven't yet, record the default value for this name + # so we can reset if we want.. if entry_name not in bui.app.classic.value_test_defaults: bui.app.classic.value_test_defaults[entry_name] = ( bui.app.classic.value_test(entry_name) @@ -138,7 +175,6 @@ class TestingWindow(bui.Window): ) if i == 0: bui.widget(edit=btn, up_widget=self._back_button) - # pylint: disable=consider-using-f-string entry['widget'] = bui.textwidget( parent=self._subcontainer, position=(h + 100, v), @@ -146,7 +182,7 @@ class TestingWindow(bui.Window): h_align='center', v_align='center', maxwidth=60, - text='%.4g' % bui.app.classic.value_test(entry_name), + text=f'{bui.app.classic.value_test(entry_name):.4g}', ) btn = bui.buttonwidget( parent=self._subcontainer, @@ -185,10 +221,9 @@ class TestingWindow(bui.Window): entry['name'], absolute=bui.app.classic.value_test_defaults[entry['name']], ) - # pylint: disable=consider-using-f-string bui.textwidget( edit=entry['widget'], - text='%.4g' % bui.app.classic.value_test(entry['name']), + text=f'{bui.app.classic.value_test(entry['name']):.4g}', ) def _on_minus_press(self, entry_name: str) -> None: @@ -211,21 +246,21 @@ class TestingWindow(bui.Window): text='%.4g' % bui.app.classic.value_test(entry['name']), ) - def _do_back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.advanced import AdvancedSettingsWindow + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return + # Pull values from self here; if we do it in the lambda we'll + # keep self alive which we don't want. + title = self.title + entries = self._entries_orig - bui.containerwidget(edit=self._root_widget, transition='out_right') - backwin = ( - self._back_call() - if self._back_call is not None - else AdvancedSettingsWindow(transition='in_left') - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - backwin.get_root_widget(), from_window=self._root_widget + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + title=title, + entries=entries, + transition=transition, + origin_widget=origin_widget, + ) ) diff --git a/dist/ba_data/python/bauiv1lib/settings/touchscreen.py b/dist/ba_data/python/bauiv1lib/settings/touchscreen.py index 38aec5f..7dcfdf1 100644 --- a/dist/ba_data/python/bauiv1lib/settings/touchscreen.py +++ b/dist/ba_data/python/bauiv1lib/settings/touchscreen.py @@ -3,25 +3,25 @@ """UI settings functionality related to touchscreens.""" from __future__ import annotations +from typing import override + import bauiv1 as bui import bascenev1 as bs -class TouchscreenSettingsWindow(bui.Window): +class TouchscreenSettingsWindow(bui.MainWindow): """Settings window for touchscreens.""" def __del__(self) -> None: - # Note - this happens in 'back' too; - # we just do it here too in case the window is closed by other means. - - # FIXME: Could switch to a UI destroy callback now that those are a - # thing that exists. bs.set_touchscreen_editing(False) - def __init__(self) -> None: - self._width = 650 + def __init__( + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ) -> None: + self._width = 780 self._height = 380 - self._spacing = 40 self._r = 'configTouchscreenWindow' bs.set_touchscreen_editing(True) @@ -31,29 +31,43 @@ class TouchscreenSettingsWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition='in_right', scale=( 1.9 if uiscale is bui.UIScale.SMALL else 1.55 if uiscale is bui.UIScale.MEDIUM else 1.2 ), - ) + toolbar_visibility=( + 'menu_minimal' + if uiscale is bui.UIScale.SMALL + else 'menu_full' + ), + stack_offset=( + (0, -20) if uiscale is bui.UIScale.SMALL else (0, 0) + ), + ), + transition=transition, + origin_widget=origin_widget, ) - btn = bui.buttonwidget( - parent=self._root_widget, - position=(55, self._height - 60), - size=(120, 60), - label=bui.Lstr(resource='backText'), - button_type='back', - scale=0.8, - on_activate_call=self._back, - ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) + if uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back + ) + else: + btn = bui.buttonwidget( + parent=self._root_widget, + position=(55, self._height - 60), + size=(60, 60), + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + scale=0.8, + on_activate_call=self.main_window_back, + ) + bui.containerwidget(edit=self._root_widget, cancel_button=btn) bui.textwidget( parent=self._root_widget, - position=(25, self._height - 50), + position=(25, self._height - 57), size=(self._width, 25), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, @@ -62,13 +76,6 @@ class TouchscreenSettingsWindow(bui.Window): v_align='center', ) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) - self._scroll_width = self._width - 100 self._scroll_height = self._height - 110 self._sub_width = self._scroll_width - 20 @@ -82,7 +89,6 @@ class TouchscreenSettingsWindow(bui.Window): ), size=(self._scroll_width, self._scroll_height), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._subcontainer = bui.containerwidget( @@ -90,12 +96,22 @@ class TouchscreenSettingsWindow(bui.Window): size=(self._sub_width, self._sub_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._build_gui() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + def _build_gui(self) -> None: + # pylint: disable=too-many-locals from bauiv1lib.config import ConfigNumberEdit, ConfigCheckBox from bauiv1lib.radiogroup import make_radio_group @@ -104,13 +120,16 @@ class TouchscreenSettingsWindow(bui.Window): for child in children: child.delete() h = 30 + hoffs = 100 + hoffs2 = 70 + hoffs3 = 320 v = self._sub_height - 85 clr = (0.8, 0.8, 0.8, 1.0) clr2 = (0.8, 0.8, 0.8) bui.textwidget( parent=self._subcontainer, - position=(-10, v + 43), - size=(self._sub_width, 25), + position=(self._sub_width * 0.5, v + 63), + size=(0, 0), text=bui.Lstr(resource=f'{self._r}.swipeInfoText'), flatness=1.0, color=(0, 0.9, 0.1, 0.7), @@ -131,7 +150,7 @@ class TouchscreenSettingsWindow(bui.Window): ) cb1 = bui.checkboxwidget( parent=self._subcontainer, - position=(h + 220, v), + position=(h + hoffs + 220, v), size=(170, 30), text=bui.Lstr(resource=f'{self._r}.joystickText'), maxwidth=100, @@ -140,7 +159,7 @@ class TouchscreenSettingsWindow(bui.Window): ) cb2 = bui.checkboxwidget( parent=self._subcontainer, - position=(h + 357, v), + position=(h + hoffs + 357, v), size=(170, 30), text=bui.Lstr(resource=f'{self._r}.swipeText'), maxwidth=100, @@ -155,7 +174,7 @@ class TouchscreenSettingsWindow(bui.Window): ConfigNumberEdit( parent=self._subcontainer, position=(h, v), - xoffset=65, + xoffset=hoffs2 + 65, configkey='Touch Controls Scale Movement', displayname=bui.Lstr( resource=f'{self._r}.movementControlScaleText' @@ -178,7 +197,7 @@ class TouchscreenSettingsWindow(bui.Window): ) cb1 = bui.checkboxwidget( parent=self._subcontainer, - position=(h + 220, v), + position=(h + hoffs + 220, v), size=(170, 30), text=bui.Lstr(resource=f'{self._r}.buttonsText'), maxwidth=100, @@ -187,7 +206,7 @@ class TouchscreenSettingsWindow(bui.Window): ) cb2 = bui.checkboxwidget( parent=self._subcontainer, - position=(h + 357, v), + position=(h + hoffs + 357, v), size=(170, 30), text=bui.Lstr(resource=f'{self._r}.swipeText'), maxwidth=100, @@ -201,7 +220,7 @@ class TouchscreenSettingsWindow(bui.Window): ConfigNumberEdit( parent=self._subcontainer, position=(h, v), - xoffset=65, + xoffset=hoffs2 + 65, configkey='Touch Controls Scale Actions', displayname=bui.Lstr(resource=f'{self._r}.actionControlScaleText'), changesound=False, @@ -211,13 +230,23 @@ class TouchscreenSettingsWindow(bui.Window): ) v -= 50 + bui.textwidget( + parent=self._subcontainer, + position=(h, v - 2), + size=(0, 30), + text=bui.Lstr(resource=f'{self._r}.swipeControlsHiddenText'), + maxwidth=190, + color=clr, + v_align='center', + ) + ConfigCheckBox( parent=self._subcontainer, - position=(h, v), - size=(400, 30), + position=(h + hoffs3, v), + size=(100, 30), maxwidth=400, configkey='Touch Controls Swipe Hidden', - displayname=bui.Lstr(resource=f'{self._r}.swipeControlsHiddenText'), + displayname='', ) v -= 65 @@ -270,20 +299,3 @@ class TouchscreenSettingsWindow(bui.Window): del cfg[cfgkey] cfg.apply_and_commit() bui.apptimer(0, self._build_gui) - - def _back(self) -> None: - from bauiv1lib.settings import controls - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - bui.containerwidget(edit=self._root_widget, transition='out_right') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - controls.ControlsSettingsWindow( - transition='in_left' - ).get_root_widget(), - from_window=self._root_widget, - ) - bs.set_touchscreen_editing(False) diff --git a/dist/ba_data/python/bauiv1lib/soundtrack/browser.py b/dist/ba_data/python/bauiv1lib/soundtrack/browser.py index f16073b..fbfc17c 100644 --- a/dist/ba_data/python/bauiv1lib/soundtrack/browser.py +++ b/dist/ba_data/python/bauiv1lib/soundtrack/browser.py @@ -6,88 +6,86 @@ from __future__ import annotations import copy import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui if TYPE_CHECKING: from typing import Any +REQUIRE_PRO = False -class SoundtrackBrowserWindow(bui.Window): + +class SoundtrackBrowserWindow(bui.MainWindow): """Window for browsing soundtracks.""" def __init__( self, - transition: str = 'in_right', + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): - # pylint: disable=too-many-locals # pylint: disable=too-many-statements - - # If they provided an origin-widget, scale up from that. - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None + # pylint: disable=too-many-locals self._r = 'editSoundtrackWindow' assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 800 if uiscale is bui.UIScale.SMALL else 600 - x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 - self._height = ( - 340 + self._width = 1200 if uiscale is bui.UIScale.SMALL else 650 + self._height = 800 if uiscale is bui.UIScale.SMALL else 400 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 2.1 if uiscale is bui.UIScale.SMALL - else 370 if uiscale is bui.UIScale.MEDIUM else 440 + else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 ) - spacing = 40.0 - v = self._height - 40.0 - v -= spacing * 1.0 + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + # target_width = min(self._width - 60, screensize[0] / scale) + target_height = min(self._height - 70, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 2.3 + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 1.6 if uiscale is bui.UIScale.MEDIUM else 1.0 + else 'menu_full' ), - stack_offset=( - (0, -18) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) assert bui.app.classic is not None - if bui.app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + if uiscale is bui.UIScale.SMALL: self._back_button = None else: self._back_button = bui.buttonwidget( parent=self._root_widget, - position=(45 + x_inset, self._height - 60), - size=(120, 60), - scale=0.8, - label=bui.Lstr(resource='backText'), - button_type='back', - autoselect=True, - ) - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', + position=(50, yoffs - 60), size=(60, 60), + scale=0.8, label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + autoselect=True, ) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 35), + position=( + self._width * 0.5, + yoffs - (55 if uiscale is bui.UIScale.SMALL else 35), + ), size=(0, 0), maxwidth=300, text=bui.Lstr(resource=f'{self._r}.titleText'), @@ -96,18 +94,17 @@ class SoundtrackBrowserWindow(bui.Window): v_align='center', ) + # Generally center all other content + x_inset = self._width * 0.5 - 320 + vbase = v = self._height * 0.5 + 130 + h = 43 + x_inset - v = self._height - 60 b_color = (0.6, 0.53, 0.63) b_textcolor = (0.75, 0.7, 0.8) lock_tex = bui.gettexture('lock') self._lock_images: list[bui.Widget] = [] - scl = ( - 1.0 - if uiscale is bui.UIScale.SMALL - else 1.13 if uiscale is bui.UIScale.MEDIUM else 1.4 - ) + scl = 1.2 v -= 60.0 * scl self._new_button = btn = bui.buttonwidget( parent=self._root_widget, @@ -227,23 +224,20 @@ class SoundtrackBrowserWindow(bui.Window): ) self._update() - v = self._height - 65 - scroll_height = self._height - 105 + v = vbase - 6 + scroll_height = 280 v -= scroll_height self._scrollwidget = scrollwidget = bui.scrollwidget( parent=self._root_widget, position=(152 + x_inset, v), highlight=False, - size=(self._width - (205 + 2 * x_inset), scroll_height), + size=(450, scroll_height), + border_opacity=0.4, ) bui.widget( edit=self._scrollwidget, left_widget=self._new_button, - right_widget=( - bui.get_special_widget('party_button') - if bui.app.ui_v1.use_toolbars - else self._scrollwidget - ), + right_widget=bui.get_special_widget('squad_button'), ) self._col = bui.columnwidget(parent=scrollwidget, border=2, margin=0) @@ -255,23 +249,39 @@ class SoundtrackBrowserWindow(bui.Window): self._refresh() if self._back_button is not None: bui.buttonwidget( - edit=self._back_button, on_activate_call=self._back + edit=self._back_button, on_activate_call=self.main_window_back ) bui.containerwidget( edit=self._root_widget, cancel_button=self._back_button ) else: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back + edit=self._root_widget, on_cancel_call=self.main_window_back ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _update(self) -> None: - have = ( + have_pro = ( bui.app.classic is None or bui.app.classic.accounts.have_pro_options() ) for lock in self._lock_images: - bui.imagewidget(edit=lock, opacity=0.0 if have else 1.0) + bui.imagewidget( + edit=lock, opacity=0.0 if (have_pro or not REQUIRE_PRO) else 1.0 + ) def _do_delete_soundtrack(self) -> None: cfg = bui.app.config @@ -292,7 +302,7 @@ class SoundtrackBrowserWindow(bui.Window): from bauiv1lib.purchase import PurchaseWindow from bauiv1lib.confirm import ConfirmWindow - if ( + if REQUIRE_PRO and ( bui.app.classic is not None and not bui.app.classic.accounts.have_pro_options() ): @@ -321,7 +331,7 @@ class SoundtrackBrowserWindow(bui.Window): # pylint: disable=cyclic-import from bauiv1lib.purchase import PurchaseWindow - if ( + if REQUIRE_PRO and ( bui.app.classic is not None and not bui.app.classic.accounts.have_pro_options() ): @@ -387,29 +397,11 @@ class SoundtrackBrowserWindow(bui.Window): music.music_types[bui.app.classic.MusicPlayMode.REGULAR] ) - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.settings.audio import AudioSettingsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - AudioSettingsWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - def _edit_soundtrack_with_sound(self) -> None: # pylint: disable=cyclic-import from bauiv1lib.purchase import PurchaseWindow - if ( + if REQUIRE_PRO and ( bui.app.classic is not None and not bui.app.classic.accounts.have_pro_options() ): @@ -423,18 +415,20 @@ class SoundtrackBrowserWindow(bui.Window): from bauiv1lib.purchase import PurchaseWindow from bauiv1lib.soundtrack.edit import SoundtrackEditWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we don't have control. + if not self.main_window_has_control(): return - if ( + if REQUIRE_PRO and ( bui.app.classic is not None and not bui.app.classic.accounts.have_pro_options() ): PurchaseWindow(items=['pro']) return + if self._selected_soundtrack is None: return + if self._selected_soundtrack == '__default__': bui.getsound('error').play() bui.screenmessage( @@ -443,14 +437,8 @@ class SoundtrackBrowserWindow(bui.Window): ) return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - SoundtrackEditWindow( - existing_soundtrack=self._selected_soundtrack - ).get_root_widget(), - from_window=self._root_widget, + self.main_window_replace( + SoundtrackEditWindow(existing_soundtrack=self._selected_soundtrack) ) def _get_soundtrack_display_name(self, soundtrack: str) -> bui.Lstr: @@ -541,18 +529,18 @@ class SoundtrackBrowserWindow(bui.Window): from bauiv1lib.purchase import PurchaseWindow from bauiv1lib.soundtrack.edit import SoundtrackEditWindow - if ( + # no-op if we're not in control. + if not self.main_window_has_control(): + return + + if REQUIRE_PRO and ( bui.app.classic is not None and not bui.app.classic.accounts.have_pro_options() ): PurchaseWindow(items=['pro']) return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.app.ui_v1.set_main_menu_window( - SoundtrackEditWindow(existing_soundtrack=None).get_root_widget(), - from_window=self._root_widget, - ) + + self.main_window_replace(SoundtrackEditWindow(existing_soundtrack=None)) def _create_done(self, new_soundtrack: str) -> None: if new_soundtrack is not None: diff --git a/dist/ba_data/python/bauiv1lib/soundtrack/edit.py b/dist/ba_data/python/bauiv1lib/soundtrack/edit.py index 9a155a5..8d02e7f 100644 --- a/dist/ba_data/python/bauiv1lib/soundtrack/edit.py +++ b/dist/ba_data/python/bauiv1lib/soundtrack/edit.py @@ -6,7 +6,7 @@ from __future__ import annotations import copy import os -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, cast, override import bascenev1 as bs import bauiv1 as bui @@ -15,47 +15,71 @@ if TYPE_CHECKING: from typing import Any -class SoundtrackEditWindow(bui.Window): +class SoundtrackEditWindow(bui.MainWindow): """Window for editing a soundtrack.""" def __init__( self, existing_soundtrack: str | dict[str, Any] | None, - transition: str = 'in_right', + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-statements + # pylint: disable=too-many-locals + appconfig = bui.app.config self._r = 'editSoundtrackWindow' self._folder_tex = bui.gettexture('folder') self._file_tex = bui.gettexture('file') assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - self._width = 848 if uiscale is bui.UIScale.SMALL else 648 - x_inset = 100 if uiscale is bui.UIScale.SMALL else 0 + self._width = 1200 if uiscale is bui.UIScale.SMALL else 648 self._height = ( - 395 + 800 if uiscale is bui.UIScale.SMALL else 450 if uiscale is bui.UIScale.MEDIUM else 560 ) + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.8 + if uiscale is bui.UIScale.SMALL + else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 70, screensize[0] / scale) + target_height = min(self._height - 80, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = ( + 0.5 * self._height + + 0.5 * target_height + + (10.0 if uiscale is bui.UIScale.SMALL else 20) + ) + + self._scroll_width = target_width + self._scroll_height = target_height - 113 + scroll_bottom = yoffs - 120 - self._scroll_height + + x_inset = self._width * 0.5 - 0.5 * self._scroll_width + super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height), - transition=transition, - scale=( - 2.08 - if uiscale is bui.UIScale.SMALL - else 1.5 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (0, -48) - if uiscale is bui.UIScale.SMALL - else (0, 15) if uiscale is bui.UIScale.MEDIUM else (0, 0) - ), - ) + size=(self._width, self._height), scale=scale + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) cancel_button = bui.buttonwidget( parent=self._root_widget, - position=(38 + x_inset, self._height - 60), + position=(x_inset + 10, yoffs - 60), size=(160, 60), autoselect=True, label=bui.Lstr(resource='cancelText'), @@ -63,7 +87,12 @@ class SoundtrackEditWindow(bui.Window): ) save_button = bui.buttonwidget( parent=self._root_widget, - position=(self._width - (168 + x_inset), self._height - 60), + position=( + self._width * 0.5 + + self._scroll_width * 0.5 + - (190 if uiscale is bui.UIScale.SMALL else 140), + yoffs - 60, + ), autoselect=True, size=(160, 60), label=bui.Lstr(resource='saveText'), @@ -73,7 +102,7 @@ class SoundtrackEditWindow(bui.Window): bui.widget(edit=cancel_button, right_widget=save_button) bui.textwidget( parent=self._root_widget, - position=(0, self._height - 50), + position=(0, yoffs - 50), size=(self._width, 25), text=bui.Lstr( resource=self._r @@ -86,13 +115,14 @@ class SoundtrackEditWindow(bui.Window): color=bui.app.ui_v1.title_color, h_align='center', v_align='center', - maxwidth=280, + maxwidth=270, ) - v = self._height - 110 + v = yoffs - 110 if 'Soundtracks' not in appconfig: appconfig['Soundtracks'] = {} self._soundtrack_name: str | None + self._existing_soundtrack = existing_soundtrack self._existing_soundtrack_name: str | None if existing_soundtrack is not None: # if they passed just a name, pull info from that soundtrack @@ -104,7 +134,7 @@ class SoundtrackEditWindow(bui.Window): self._existing_soundtrack_name = existing_soundtrack self._last_edited_song_type = None else: - # otherwise they can pass info on an in-progress edit + # Otherwise they can pass info on an in-progress edit. self._soundtrack = existing_soundtrack['soundtrack'] self._soundtrack_name = existing_soundtrack['name'] self._existing_soundtrack_name = existing_soundtrack[ @@ -161,22 +191,23 @@ class SoundtrackEditWindow(bui.Window): on_return_press_call=self._do_it_with_sound, ) - scroll_height = self._height - 180 self._scrollwidget = scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, - position=(40 + x_inset, v - (scroll_height + 10)), - size=(self._width - (80 + 2 * x_inset), scroll_height), + size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + scroll_bottom, + ), simple_culling_v=10, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, + border_opacity=0.4, ) bui.widget(edit=self._text_field, down_widget=self._scrollwidget) self._col = bui.columnwidget( parent=scrollwidget, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) @@ -189,6 +220,28 @@ class SoundtrackEditWindow(bui.Window): bui.widget(edit=self._text_field, up_widget=cancel_button) bui.widget(edit=cancel_button, down_widget=self._text_field) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull this out of self here; if we do it in the lambda we'll + # keep our window alive due to the 'self' reference. + existing_soundtrack = { + 'name': self._soundtrack_name, + 'existing_name': self._existing_soundtrack_name, + 'soundtrack': self._soundtrack, + 'last_edited_song_type': self._last_edited_song_type, + } + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + existing_soundtrack=existing_soundtrack, + ) + ) + def _refresh(self) -> None: for widget in self._col.get_children(): widget.delete() @@ -224,21 +277,20 @@ class SoundtrackEditWindow(bui.Window): for index, song_type in enumerate(types): row = bui.rowwidget( parent=self._col, - size=(self._width - 40, 40), + size=(self._scroll_width, 40), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) type_name = type_names_translated.get(song_type, song_type) bui.textwidget( parent=row, - size=(230, 25), + size=(self._scroll_width - 350, 25), always_highlight=True, text=type_name, scale=0.7, h_align='left', v_align='center', - maxwidth=190, + maxwidth=self._scroll_width - 360, ) if song_type in self._soundtrack: @@ -346,10 +398,11 @@ class SoundtrackEditWindow(bui.Window): else: soundtrack[musictype] = entry - bui.app.ui_v1.set_main_menu_window( - cls(state, transition='in_left').get_root_widget(), - from_window=False, # Disable check here. - ) + mainwindow = bui.app.ui_v1.get_main_window() + assert mainwindow is not None + + mainwindow.main_window_back_state = state['back_state'] + mainwindow.main_window_back() def _get_entry( self, song_type: str, entry: Any, selection_target_name: str @@ -357,8 +410,8 @@ class SoundtrackEditWindow(bui.Window): assert bui.app.classic is not None music = bui.app.classic.music - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return if selection_target_name != '': @@ -369,17 +422,17 @@ class SoundtrackEditWindow(bui.Window): 'soundtrack': self._soundtrack, 'last_edited_song_type': song_type, } - bui.containerwidget(edit=self._root_widget, transition='out_left') - bui.app.ui_v1.set_main_menu_window( - music.get_music_player() - .select_entry( - bui.Call(self._restore_editor, state, song_type), - entry, - selection_target_name, - ) - .get_root_widget(), - from_window=self._root_widget, + new_win = music.get_music_player().select_entry( + bui.Call(self._restore_editor, state, song_type), + entry, + selection_target_name, ) + self.main_window_replace(new_win) + + # Once we've set the new window, grab the back-state; we'll use + # that to jump back here after selection completes. + assert new_win.main_window_back_state is not None + state['back_state'] = new_win.main_window_back_state def _test(self, song_type: bs.MusicType) -> None: assert bui.app.classic is not None @@ -423,7 +476,7 @@ class SoundtrackEditWindow(bui.Window): return None def _cancel(self) -> None: - from bauiv1lib.soundtrack.browser import SoundtrackBrowserWindow + # from bauiv1lib.soundtrack.browser import SoundtrackBrowserWindow # no-op if our underlying widget is dead or on its way out. if not self._root_widget or self._root_widget.transitioning_out: @@ -434,14 +487,10 @@ class SoundtrackEditWindow(bui.Window): # Resets music back to normal. music.set_music_play_mode(bui.app.classic.MusicPlayMode.REGULAR) - bui.containerwidget(edit=self._root_widget, transition='out_right') - bui.app.ui_v1.set_main_menu_window( - SoundtrackBrowserWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) + + self.main_window_back() def _do_it(self) -> None: - from bauiv1lib.soundtrack.browser import SoundtrackBrowserWindow # no-op if our underlying widget is dead or on its way out. if not self._root_widget or self._root_widget.transitioning_out: @@ -487,17 +536,13 @@ class SoundtrackEditWindow(bui.Window): cfg.commit() bui.getsound('gunCocking').play() - bui.containerwidget(edit=self._root_widget, transition='out_right') # Resets music back to normal. music.set_music_play_mode( bui.app.classic.MusicPlayMode.REGULAR, force_restart=True ) - bui.app.ui_v1.set_main_menu_window( - SoundtrackBrowserWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) + self.main_window_back() def _do_it_with_sound(self) -> None: bui.getsound('swish').play() diff --git a/dist/ba_data/python/bauiv1lib/soundtrack/entrytypeselect.py b/dist/ba_data/python/bauiv1lib/soundtrack/entrytypeselect.py index d0e6547..ff47eac 100644 --- a/dist/ba_data/python/bauiv1lib/soundtrack/entrytypeselect.py +++ b/dist/ba_data/python/bauiv1lib/soundtrack/entrytypeselect.py @@ -4,7 +4,7 @@ from __future__ import annotations import copy -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -12,7 +12,7 @@ if TYPE_CHECKING: from typing import Any, Callable -class SoundtrackEntryTypeSelectWindow(bui.Window): +class SoundtrackEntryTypeSelectWindow(bui.MainWindow): """Window for selecting a soundtrack entry type.""" def __init__( @@ -20,12 +20,16 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): callback: Callable[[Any], Any], current_entry: Any, selection_target_name: str, - transition: str = 'in_right', + *, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): + # pylint: disable=too-many-locals assert bui.app.classic is not None music = bui.app.classic.music self._r = 'editSoundtrackWindow' + self._selection_target_name = selection_target_name self._callback = callback self._current_entry = copy.deepcopy(current_entry) @@ -53,13 +57,12 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): # NOTE: When something is selected, we close our UI and kick off # another window which then calls us back when its done, so the - # standard UI-cleanup-check complains that something is holding on - # to our instance after its ui is gone. Should restructure in a - # cleaner way, but just disabling that check for now. + # standard UI-cleanup-check complains that something is holding + # on to our instance after its ui is gone. Should restructure in + # a cleaner way, but just disabling that check for now. super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition=transition, scale=( 1.7 if uiscale is bui.UIScale.SMALL @@ -67,6 +70,8 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): ), ), cleanupcheck=False, + transition=transition, + origin_widget=origin_widget, ) btn = bui.buttonwidget( parent=self._root_widget, @@ -157,6 +162,27 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): bui.containerwidget(edit=self._root_widget, selected_child=btn) v -= spacing + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull these out of self here; if we reference self in the + # lambda we'll keep our window alive which is bad. + current_entry = self._current_entry + callback = self._callback + selection_target_name = self._selection_target_name + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, + origin_widget=origin_widget, + current_entry=current_entry, + callback=callback, + selection_target_name=selection_target_name, + ) + ) + def _on_mac_music_app_playlist_press(self) -> None: assert bui.app.classic is not None music = bui.app.classic.music @@ -164,12 +190,10 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): MacMusicAppPlaylistSelectWindow, ) - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - bui.containerwidget(edit=self._root_widget, transition='out_left') - current_playlist_entry: str | None if ( music.get_soundtrack_entry_type(self._current_entry) @@ -180,11 +204,11 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): ) else: current_playlist_entry = None - bui.app.ui_v1.set_main_menu_window( + + self.main_window_replace( MacMusicAppPlaylistSelectWindow( self._callback, current_playlist_entry, self._current_entry - ).get_root_widget(), - from_window=self._root_widget, + ) ) def _on_music_file_press(self) -> None: @@ -192,14 +216,14 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): from baclassic.osmusic import OSMusicPlayer from bauiv1lib.fileselector import FileSelectorWindow - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - bui.containerwidget(edit=self._root_widget, transition='out_left') base_path = android_get_external_files_dir() assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( + + self.main_window_replace( FileSelectorWindow( base_path, callback=self._music_file_selector_cb, @@ -208,30 +232,28 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): OSMusicPlayer.get_valid_music_file_extensions() ), allow_folders=False, - ).get_root_widget(), - from_window=self._root_widget, + ), ) def _on_music_folder_press(self) -> None: from bauiv1lib.fileselector import FileSelectorWindow from babase import android_get_external_files_dir - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: + # no-op if we're not in control. + if not self.main_window_has_control(): return - bui.containerwidget(edit=self._root_widget, transition='out_left') base_path = android_get_external_files_dir() assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( + + self.main_window_replace( FileSelectorWindow( base_path, callback=self._music_folder_selector_cb, show_base_path=False, valid_file_extensions=[], allow_folders=True, - ).get_root_widget(), - from_window=self._root_widget, + ), ) def _music_file_selector_cb(self, result: str | None) -> None: @@ -247,9 +269,9 @@ class SoundtrackEntryTypeSelectWindow(bui.Window): self._callback({'type': 'musicFolder', 'name': result}) def _on_default_press(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_right') + self.main_window_back() self._callback(None) def _on_cancel_press(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_right') + self.main_window_back() self._callback(self._current_entry) diff --git a/dist/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py b/dist/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py index 99c60a6..ee21dfe 100644 --- a/dist/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py +++ b/dist/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py @@ -5,7 +5,7 @@ from __future__ import annotations import copy -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -13,7 +13,7 @@ if TYPE_CHECKING: from typing import Any, Callable -class MacMusicAppPlaylistSelectWindow(bui.Window): +class MacMusicAppPlaylistSelectWindow(bui.MainWindow): """Window for selecting an iTunes playlist.""" def __init__( @@ -21,6 +21,9 @@ class MacMusicAppPlaylistSelectWindow(bui.Window): callback: Callable[[Any], Any], existing_playlist: str | None, existing_entry: Any, + *, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, ): from baclassic.macmusicapp import MacMusicAppMusicPlayer @@ -34,9 +37,9 @@ class MacMusicAppPlaylistSelectWindow(bui.Window): v = self._height - 90.0 v -= self._spacing * 1.0 super().__init__( - root_widget=bui.containerwidget( - size=(self._width, self._height), transition='in_right' - ) + root_widget=bui.containerwidget(size=(self._width, self._height)), + transition=transition, + origin_widget=origin_widget, ) btn = bui.buttonwidget( parent=self._root_widget, @@ -62,13 +65,11 @@ class MacMusicAppPlaylistSelectWindow(bui.Window): parent=self._root_widget, position=(40, v - 340), size=(self._width - 80, 400), - claims_tab=True, selection_loops_to_parent=True, ) bui.widget(edit=self._scrollwidget, right_widget=self._scrollwidget) self._column = bui.columnwidget( parent=self._scrollwidget, - claims_tab=True, selection_loops_to_parent=True, ) @@ -87,6 +88,27 @@ class MacMusicAppPlaylistSelectWindow(bui.Window): edit=self._root_widget, selected_child=self._scrollwidget ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull stuff out of self here; if we do it in the lambda we wind + # up keeping self alive which we don't want. + callback = self._callback + existing_playlist = self._existing_playlist + existing_entry = self._existing_entry + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + callback=callback, + existing_playlist=existing_playlist, + existing_entry=existing_entry, + transition=transition, + origin_widget=origin_widget, + ) + ) + def _playlists_cb(self, playlists: list[str]) -> None: if self._column: for widget in self._column.get_children(): @@ -112,9 +134,12 @@ class MacMusicAppPlaylistSelectWindow(bui.Window): def _sel(self, selection: str) -> None: if self._root_widget: - bui.containerwidget(edit=self._root_widget, transition='out_right') + # bui.containerwidget( + # edit=self._root_widget, transition='out_right') self._callback({'type': 'iTunesPlaylist', 'name': selection}) + self.main_window_back() def _back(self) -> None: - bui.containerwidget(edit=self._root_widget, transition='out_right') + # bui.containerwidget(edit=self._root_widget, transition='out_right') + self.main_window_back() self._callback(self._existing_entry) diff --git a/dist/ba_data/python/bauiv1lib/specialoffer.py b/dist/ba_data/python/bauiv1lib/specialoffer.py deleted file mode 100644 index 3385342..0000000 --- a/dist/ba_data/python/bauiv1lib/specialoffer.py +++ /dev/null @@ -1,569 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""UI for presenting sales/etc.""" - -from __future__ import annotations - -import copy -import logging -from typing import TYPE_CHECKING - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any - - -class SpecialOfferWindow(bui.Window): - """Window for presenting sales/etc.""" - - def __init__(self, offer: dict[str, Any], transition: str = 'in_right'): - # pylint: disable=too-many-statements - # pylint: disable=too-many-branches - # pylint: disable=too-many-locals - from babase import SpecialChar - from bauiv1lib.store import item as storeitemui - - plus = bui.app.plus - assert plus is not None - - assert bui.app.classic is not None - store = bui.app.classic.store - - self._cancel_delay = offer.get('cancelDelay', 0) - - # First thing: if we're offering pro or an IAP, see if we have a - # price for it. - # If not, abort and go into zombie mode (the user should never see - # us that way). - - real_price: str | None - - # Misnomer: 'pro' actually means offer 'pro_sale'. - if offer['item'] in ['pro', 'pro_fullprice']: - real_price = plus.get_price( - 'pro' if offer['item'] == 'pro_fullprice' else 'pro_sale' - ) - if real_price is None and bui.app.env.debug: - print('NOTE: Faking prices for debug build.') - real_price = '$1.23' - zombie = real_price is None - elif isinstance(offer['price'], str): - # (a string price implies IAP id) - real_price = plus.get_price(offer['price']) - if real_price is None and bui.app.env.debug: - print('NOTE: Faking price for debug build.') - real_price = '$1.23' - zombie = real_price is None - else: - real_price = None - zombie = False - if real_price is None: - real_price = '?' - - if offer['item'] in ['pro', 'pro_fullprice']: - self._offer_item = 'pro' - else: - self._offer_item = offer['item'] - - # If we wanted a real price but didn't find one, go zombie. - if zombie: - return - - # This can pop up suddenly, so lets block input for 1 second. - bui.lock_all_input() - bui.apptimer(1.0, bui.unlock_all_input) - bui.getsound('ding').play() - bui.apptimer(0.3, bui.getsound('ooh').play) - self._offer = copy.deepcopy(offer) - self._width = 580 - self._height = 590 - uiscale = bui.app.ui_v1.uiscale - super().__init__( - root_widget=bui.containerwidget( - size=(self._width, self._height), - transition=transition, - scale=( - 1.2 - if uiscale is bui.UIScale.SMALL - else 1.15 if uiscale is bui.UIScale.MEDIUM else 1.0 - ), - stack_offset=( - (0, -15) if uiscale is bui.UIScale.SMALL else (0, 0) - ), - ) - ) - self._is_bundle_sale = False - try: - if offer['item'] in ['pro', 'pro_fullprice']: - original_price_str = plus.get_price('pro') - if original_price_str is None: - original_price_str = '?' - new_price_str = plus.get_price('pro_sale') - if new_price_str is None: - new_price_str = '?' - percent_off_text = '' - else: - # If the offer includes bonus tickets, it's a bundle-sale. - if ( - 'bonusTickets' in offer - and offer['bonusTickets'] is not None - ): - self._is_bundle_sale = True - original_price = plus.get_v1_account_misc_read_val( - 'price.' + self._offer_item, 9999 - ) - - # For pure ticket prices we can show a percent-off. - if isinstance(offer['price'], int): - new_price = offer['price'] - tchar = bui.charstr(SpecialChar.TICKET) - original_price_str = tchar + str(original_price) - new_price_str = tchar + str(new_price) - percent_off = int( - round( - 100.0 - (float(new_price) / original_price) * 100.0 - ) - ) - percent_off_text = ' ' + bui.Lstr( - resource='store.salePercentText' - ).evaluate().replace('${PERCENT}', str(percent_off)) - else: - original_price_str = new_price_str = '?' - percent_off_text = '' - - except Exception: - logging.exception('Error setting up special-offer: %s.', offer) - original_price_str = new_price_str = '?' - percent_off_text = '' - - # If its a bundle sale, change the title. - if self._is_bundle_sale: - sale_text = bui.Lstr( - resource='store.saleBundleText', - fallback_resource='store.saleText', - ).evaluate() - else: - # For full pro we say 'Upgrade?' since its not really a sale. - if offer['item'] == 'pro_fullprice': - sale_text = bui.Lstr( - resource='store.upgradeQuestionText', - fallback_resource='store.saleExclaimText', - ).evaluate() - else: - sale_text = bui.Lstr( - resource='store.saleExclaimText', - fallback_resource='store.saleText', - ).evaluate() - - self._title_text = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height - 40), - size=(0, 0), - text=sale_text - + ( - (' ' + bui.Lstr(resource='store.oneTimeOnlyText').evaluate()) - if self._offer['oneTimeOnly'] - else '' - ) - + percent_off_text, - h_align='center', - v_align='center', - maxwidth=self._width * 0.9 - 220, - scale=1.4, - color=(0.3, 1, 0.3), - ) - - self._flash_on = False - self._flashing_timer: bui.AppTimer | None = bui.AppTimer( - 0.05, bui.WeakCall(self._flash_cycle), repeat=True - ) - bui.apptimer(0.6, bui.WeakCall(self._stop_flashing)) - - size = store.get_store_item_display_size(self._offer_item) - display: dict[str, Any] = {} - storeitemui.instantiate_store_item_display( - self._offer_item, - display, - parent_widget=self._root_widget, - b_pos=( - self._width * 0.5 - - size[0] * 0.5 - + 10 - - ((size[0] * 0.5 + 30) if self._is_bundle_sale else 0), - self._height * 0.5 - - size[1] * 0.5 - + 20 - + (20 if self._is_bundle_sale else 0), - ), - b_width=size[0], - b_height=size[1], - button=not self._is_bundle_sale, - ) - - # Wire up the parts we need. - if self._is_bundle_sale: - self._plus_text = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height * 0.5 + 50), - size=(0, 0), - text='+', - h_align='center', - v_align='center', - maxwidth=self._width * 0.9, - scale=1.4, - color=(0.5, 0.5, 0.5), - ) - self._plus_tickets = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5 + 120, self._height * 0.5 + 50), - size=(0, 0), - text=bui.charstr(SpecialChar.TICKET_BACKING) - + str(offer['bonusTickets']), - h_align='center', - v_align='center', - maxwidth=self._width * 0.9, - scale=2.5, - color=(0.2, 1, 0.2), - ) - self._price_text = bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, 150), - size=(0, 0), - text=real_price, - h_align='center', - v_align='center', - maxwidth=self._width * 0.9, - scale=1.4, - color=(0.2, 1, 0.2), - ) - # Total-value if they supplied it. - total_worth_item = offer.get('valueItem', None) - if total_worth_item is not None: - price = plus.get_price(total_worth_item) - total_worth_price = ( - store.get_clean_price(price) if price is not None else None - ) - if total_worth_price is not None: - total_worth_text = bui.Lstr( - resource='store.totalWorthText', - subs=[('${TOTAL_WORTH}', total_worth_price)], - ) - self._total_worth_text = bui.textwidget( - parent=self._root_widget, - text=total_worth_text, - position=(self._width * 0.5, 210), - scale=0.9, - maxwidth=self._width * 0.7, - size=(0, 0), - h_align='center', - v_align='center', - shadow=1.0, - flatness=1.0, - color=(0.3, 1, 1), - ) - - elif offer['item'] == 'pro_fullprice': - # for full-price pro we simply show full price - bui.textwidget(edit=display['price_widget'], text=real_price) - bui.buttonwidget( - edit=display['button'], on_activate_call=self._purchase - ) - else: - # Show old/new prices otherwise (for pro sale). - bui.buttonwidget( - edit=display['button'], on_activate_call=self._purchase - ) - bui.imagewidget(edit=display['price_slash_widget'], opacity=1.0) - bui.textwidget( - edit=display['price_widget_left'], text=original_price_str - ) - bui.textwidget( - edit=display['price_widget_right'], text=new_price_str - ) - - # Add ticket button only if this is ticket-purchasable. - if isinstance(offer.get('price'), int): - self._get_tickets_button = bui.buttonwidget( - parent=self._root_widget, - position=(self._width - 125, self._height - 68), - size=(90, 55), - scale=1.0, - button_type='square', - color=(0.7, 0.5, 0.85), - textcolor=(0.2, 1, 0.2), - autoselect=True, - label=bui.Lstr(resource='getTicketsWindow.titleText'), - on_activate_call=self._on_get_more_tickets_press, - ) - - self._ticket_text_update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update_tickets_text), repeat=True - ) - self._update_tickets_text() - - self._update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update), repeat=True - ) - - self._cancel_button = bui.buttonwidget( - parent=self._root_widget, - position=( - (50, 40) - if self._is_bundle_sale - else (self._width * 0.5 - 75, 40) - ), - size=(150, 60), - scale=1.0, - on_activate_call=self._cancel, - autoselect=True, - label=bui.Lstr(resource='noThanksText'), - ) - self._cancel_countdown_text = bui.textwidget( - parent=self._root_widget, - text='', - position=( - (50 + 150 + 20, 40 + 27) - if self._is_bundle_sale - else (self._width * 0.5 - 75 + 150 + 20, 40 + 27) - ), - scale=1.1, - size=(0, 0), - h_align='left', - v_align='center', - shadow=1.0, - flatness=1.0, - color=(0.6, 0.5, 0.5), - ) - self._update_cancel_button_graphics() - - if self._is_bundle_sale: - self._purchase_button = bui.buttonwidget( - parent=self._root_widget, - position=(self._width - 200, 40), - size=(150, 60), - scale=1.0, - on_activate_call=self._purchase, - autoselect=True, - label=bui.Lstr(resource='store.purchaseText'), - ) - - bui.containerwidget( - edit=self._root_widget, - cancel_button=self._cancel_button, - start_button=( - self._purchase_button if self._is_bundle_sale else None - ), - selected_child=( - self._purchase_button - if self._is_bundle_sale - else display['button'] - ), - ) - - def _stop_flashing(self) -> None: - self._flashing_timer = None - bui.textwidget(edit=self._title_text, color=(0.3, 1, 0.3)) - - def _flash_cycle(self) -> None: - if not self._root_widget: - return - self._flash_on = not self._flash_on - bui.textwidget( - edit=self._title_text, - color=(0.3, 1, 0.3) if self._flash_on else (1, 0.5, 0), - ) - - def _update_cancel_button_graphics(self) -> None: - bui.buttonwidget( - edit=self._cancel_button, - color=( - (0.5, 0.5, 0.5) if self._cancel_delay > 0 else (0.7, 0.4, 0.34) - ), - textcolor=( - (0.5, 0.5, 0.5) if self._cancel_delay > 0 else (0.9, 0.9, 1.0) - ), - ) - bui.textwidget( - edit=self._cancel_countdown_text, - text=str(self._cancel_delay) if self._cancel_delay > 0 else '', - ) - - def _update(self) -> None: - plus = bui.app.plus - assert plus is not None - - # If we've got seconds left on our countdown, update it. - if self._cancel_delay > 0: - self._cancel_delay = max(0, self._cancel_delay - 1) - self._update_cancel_button_graphics() - - can_die = False - - # We go away if we see that our target item is owned. - if self._offer_item == 'pro': - assert bui.app.classic is not None - if bui.app.classic.accounts.have_pro(): - can_die = True - else: - if plus.get_purchased(self._offer_item): - can_die = True - - if can_die: - self._transition_out('out_left') - - def _transition_out(self, transition: str = 'out_left') -> None: - # Also clear any pending-special-offer we've stored at this point. - cfg = bui.app.config - if 'pendingSpecialOffer' in cfg: - del cfg['pendingSpecialOffer'] - cfg.commit() - - bui.containerwidget(edit=self._root_widget, transition=transition) - - def _update_tickets_text(self) -> None: - from babase import SpecialChar - - plus = bui.app.plus - assert plus is not None - - if not self._root_widget: - return - sval: str | bui.Lstr - if plus.get_v1_account_state() == 'signed_in': - sval = bui.charstr(SpecialChar.TICKET) + str( - plus.get_v1_account_ticket_count() - ) - else: - sval = bui.Lstr(resource='getTicketsWindow.titleText') - bui.buttonwidget(edit=self._get_tickets_button, label=sval) - - def _on_get_more_tickets_press(self) -> None: - from bauiv1lib import account - from bauiv1lib import gettickets - - plus = bui.app.plus - assert plus is not None - - if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() - return - gettickets.GetTicketsWindow(modal=True).get_root_widget() - - def _purchase(self) -> None: - from bauiv1lib import gettickets - from bauiv1lib import confirm - - plus = bui.app.plus - assert plus is not None - - assert bui.app.classic is not None - store = bui.app.classic.store - - if self._offer['item'] == 'pro': - plus.purchase('pro_sale') - elif self._offer['item'] == 'pro_fullprice': - plus.purchase('pro') - elif self._is_bundle_sale: - # With bundle sales, the price is the name of the IAP. - plus.purchase(self._offer['price']) - else: - ticket_count: int | None - try: - ticket_count = plus.get_v1_account_ticket_count() - except Exception: - ticket_count = None - if ticket_count is not None and ticket_count < self._offer['price']: - gettickets.show_get_tickets_prompt() - bui.getsound('error').play() - return - - def do_it() -> None: - assert plus is not None - - plus.in_game_purchase( - 'offer:' + str(self._offer['id']), self._offer['price'] - ) - - bui.getsound('swish').play() - confirm.ConfirmWindow( - bui.Lstr( - resource='store.purchaseConfirmText', - subs=[ - ( - '${ITEM}', - store.get_store_item_name_translated( - self._offer['item'] - ), - ) - ], - ), - width=400, - height=120, - action=do_it, - ok_text=bui.Lstr( - resource='store.purchaseText', fallback_resource='okText' - ), - ) - - def _cancel(self) -> None: - if self._cancel_delay > 0: - bui.getsound('error').play() - return - self._transition_out('out_right') - - -def show_offer() -> bool: - """(internal)""" - try: - from bauiv1lib import feedback - - plus = bui.app.plus - assert plus is not None - - app = bui.app - if app.classic is None: - raise RuntimeError( - 'Classic feature-set is required to show offers.' - ) - - # Space things out a bit so we don't hit the poor user with an - # ad and then an in-game offer. - has_been_long_enough_since_ad = True - if app.classic.ads.last_ad_completion_time is not None and ( - bui.apptime() - app.classic.ads.last_ad_completion_time < 30.0 - ): - has_been_long_enough_since_ad = False - - if ( - app.classic.special_offer is not None - and has_been_long_enough_since_ad - ): - # Special case: for pro offers, store this in our prefs so - # we can re-show it if the user kills us (set phasers to - # 'NAG'!!!). - if app.classic.special_offer.get('item') == 'pro_fullprice': - cfg = app.config - cfg['pendingSpecialOffer'] = { - 'a': plus.get_v1_account_public_login_id(), - 'o': app.classic.special_offer, - } - cfg.commit() - - if app.classic.special_offer['item'] == 'rating': - # Go with a native thing if we've got one. - if bui.native_review_request_supported(): - bui.native_review_request() - else: - if app.ui_v1.available: - feedback.ask_for_rating() - else: - if app.ui_v1.available: - SpecialOfferWindow(app.classic.special_offer) - - app.classic.special_offer = None - return True - except Exception: - logging.exception('Error showing offer.') - - return False diff --git a/dist/ba_data/python/bauiv1lib/store/browser.py b/dist/ba_data/python/bauiv1lib/store/browser.py index 8ab5210..5a4baf8 100644 --- a/dist/ba_data/python/bauiv1lib/store/browser.py +++ b/dist/ba_data/python/bauiv1lib/store/browser.py @@ -13,7 +13,7 @@ import weakref import datetime from enum import Enum from threading import Thread -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from efro.util import utc_now from efro.error import CommunicationError @@ -26,13 +26,13 @@ if TYPE_CHECKING: MERCH_LINK_KEY = 'Merch Link' -class StoreBrowserWindow(bui.Window): +class StoreBrowserWindow(bui.MainWindow): """Window for browsing the store.""" class TabID(Enum): """Our available tab types.""" - EXTRAS = 'extras' + # EXTRAS = 'extras' MAPS = 'maps' MINIGAMES = 'minigames' CHARACTERS = 'characters' @@ -40,12 +40,10 @@ class StoreBrowserWindow(bui.Window): def __init__( self, - transition: str = 'in_right', - modal: bool = False, - show_tab: StoreBrowserWindow.TabID | None = None, - on_close_call: Callable[[], Any] | None = None, - back_location: str | None = None, + transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, + show_tab: StoreBrowserWindow.TabID | None = None, + minimal_toolbars: bool = False, ): # pylint: disable=too-many-statements # pylint: disable=too-many-locals @@ -58,110 +56,85 @@ class StoreBrowserWindow(bui.Window): bui.set_analytics_screen('Store Window') - scale_origin: tuple[float, float] | None - - # If they provided an origin-widget, scale up from that. - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - self.button_infos: dict[str, dict[str, Any]] | None = None self.update_buttons_timer: bui.AppTimer | None = None self._status_textwidget_update_timer = None - self._back_location = back_location - self._on_close_call = on_close_call self._show_tab = show_tab - self._modal = modal - self._width = 1440 if uiscale is bui.UIScale.SMALL else 1040 - self._x_inset = x_inset = 200 if uiscale is bui.UIScale.SMALL else 0 - self._height = ( - 578 + self._width = ( + 1800 if uiscale is bui.UIScale.SMALL - else 645 if uiscale is bui.UIScale.MEDIUM else 800 + else 1000 if uiscale is bui.UIScale.MEDIUM else 1120 + ) + self._height = ( + 1200 + if uiscale is bui.UIScale.SMALL + else 700 if uiscale is bui.UIScale.MEDIUM else 800 ) self._current_tab: StoreBrowserWindow.TabID | None = None - extra_top = 30 if uiscale is bui.UIScale.SMALL else 0 + # extra_top = 30 if uiscale is bui.UIScale.SMALL else 0 self.request: Any = None self._r = 'store' self._last_buy_time: float | None = None + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.5 + if uiscale is bui.UIScale.SMALL + else 0.9 if uiscale is bui.UIScale.MEDIUM else 0.8 + ) + + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 120, screensize[0] / scale) + target_height = min(self._height - 140, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 59 + self._scroll_bottom = yoffs - 87 - self._scroll_height + super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + extra_top), - transition=transition, - toolbar_visibility='menu_full', - scale=( - 1.3 - if uiscale is bui.UIScale.SMALL - else 0.9 if uiscale is bui.UIScale.MEDIUM else 0.8 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_store' + if (uiscale is bui.UIScale.SMALL or minimal_toolbars) + else 'menu_full' ), - scale_origin_stack_offset=scale_origin, - stack_offset=( - (0, -5) - if uiscale is bui.UIScale.SMALL - else (0, 0) if uiscale is bui.UIScale.MEDIUM else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) self._back_button = btn = bui.buttonwidget( parent=self._root_widget, - position=(70 + x_inset, self._height - 74), - size=(140, 60), + position=(70, yoffs - 37), + size=(60, 60), scale=1.1, autoselect=True, - label=bui.Lstr(resource='doneText' if self._modal else 'backText'), - button_type=None if self._modal else 'back', - on_activate_call=self._back, + label=bui.charstr(SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) - bui.containerwidget(edit=self._root_widget, cancel_button=btn) - self._ticket_count_text: bui.Widget | None = None - self._get_tickets_button: bui.Widget | None = None - - if app.classic.allow_ticket_purchases: - self._get_tickets_button = bui.buttonwidget( - parent=self._root_widget, - size=(210, 65), - on_activate_call=self._on_get_more_tickets_press, - autoselect=True, - scale=0.9, - text_scale=1.4, - left_widget=self._back_button, - color=(0.7, 0.5, 0.85), - textcolor=(0.2, 1.0, 0.2), - label=bui.Lstr(resource='getTicketsWindow.titleText'), + if uiscale is bui.UIScale.SMALL: + self._back_button.delete() + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self.main_window_back ) else: - self._ticket_count_text = bui.textwidget( - parent=self._root_widget, - size=(210, 64), - color=(0.2, 1.0, 0.2), - h_align='center', - v_align='center', - ) - - # Move this dynamically to keep it out of the way of the party icon. - self._update_get_tickets_button_pos() - self._get_ticket_pos_update_timer = bui.AppTimer( - 1.0, - bui.WeakCall(self._update_get_tickets_button_pos), - repeat=True, - ) - if self._get_tickets_button: - bui.widget( - edit=self._back_button, right_widget=self._get_tickets_button - ) - self._ticket_text_update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update_tickets_text), repeat=True - ) - self._update_tickets_text() + bui.containerwidget(edit=self._root_widget, cancel_button=btn) if ( app.classic.platform in ['mac', 'ios'] @@ -183,29 +156,28 @@ class StoreBrowserWindow(bui.Window): bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 44), + position=( + ( + self._width * 0.5 + + ( + (self._scroll_width * -0.5 + 90.0) + if uiscale is bui.UIScale.SMALL + else 0.0 + ) + ), + yoffs - (62 if uiscale is bui.UIScale.SMALL else -3.0), + ), size=(0, 0), color=app.ui_v1.title_color, - scale=1.5, - h_align='center', + scale=1.1 if uiscale is bui.UIScale.SMALL else 1.3, + h_align='left' if uiscale is bui.UIScale.SMALL else 'center', v_align='center', text=bui.Lstr(resource='storeText'), - maxwidth=420, + maxwidth=100 if uiscale is bui.UIScale.SMALL else 290, ) - if not self._modal: - bui.buttonwidget( - edit=self._back_button, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(SpecialChar.BACK), - ) - - scroll_buffer_h = 130 + 2 * x_inset - tab_buffer_h = 250 + 2 * x_inset - tabs_def = [ - (self.TabID.EXTRAS, bui.Lstr(resource=f'{self._r}.extrasText')), + # (self.TabID.EXTRAS, bui.Lstr(resource=f'{self._r}.extrasText')), (self.TabID.MAPS, bui.Lstr(resource=f'{self._r}.mapsText')), ( self.TabID.MINIGAMES, @@ -218,11 +190,15 @@ class StoreBrowserWindow(bui.Window): (self.TabID.ICONS, bui.Lstr(resource=f'{self._r}.iconsText')), ] + tab_inset = 200 if uiscale is bui.UIScale.SMALL else 100 self._tab_row = TabRow( self._root_widget, tabs_def, - pos=(tab_buffer_h * 0.5, self._height - 130), - size=(self._width - tab_buffer_h, 50), + size=(self._scroll_width - 2.0 * tab_inset, 50), + pos=( + self._width * 0.5 - self._scroll_width * 0.5 + tab_inset, + self._scroll_bottom + self._scroll_height - 4.0, + ), on_select_call=self._set_tab, ) @@ -239,8 +215,8 @@ class StoreBrowserWindow(bui.Window): center = (pos[0] + 0.1 * size[0], pos[1] + 0.9 * size[1]) img = bui.imagewidget( parent=self._root_widget, - position=(center[0] - rad * 1.04, center[1] - rad * 1.15), - size=(rad * 2.2, rad * 2.2), + position=(center[0] - rad * 1.1, center[1] - rad * 1.2), + size=(rad * 2.4, rad * 2.4), texture=bui.gettexture('circleShadow'), color=(1, 0, 0), ) @@ -302,53 +278,34 @@ class StoreBrowserWindow(bui.Window): ) self._update_tabs() - if self._get_tickets_button: + if uiscale is bui.UIScale.SMALL: + first_tab_button = self._tab_row.tabs[tabs_def[0][0]].button last_tab_button = self._tab_row.tabs[tabs_def[-1][0]].button bui.widget( - edit=self._get_tickets_button, down_widget=last_tab_button + edit=first_tab_button, + left_widget=bui.get_special_widget('back_button'), + up_widget=bui.get_special_widget('back_button'), ) bui.widget( edit=last_tab_button, - up_widget=self._get_tickets_button, - right_widget=self._get_tickets_button, + up_widget=bui.get_special_widget('tickets_meter'), + right_widget=bui.get_special_widget('tickets_meter'), ) - self._scroll_width = self._width - scroll_buffer_h - self._scroll_height = self._height - 180 + # self._scroll_width = self._width - scroll_buffer_h + # self._scroll_height = self._height - 180 self._scrollwidget: bui.Widget | None = None self._status_textwidget: bui.Widget | None = None self._restore_state() - def _update_get_tickets_button_pos(self) -> None: - assert bui.app.classic is not None - uiscale = bui.app.ui_v1.uiscale - pos = ( - self._width - - 252 - - ( - self._x_inset - + ( - 47 - if uiscale is bui.UIScale.SMALL - and bui.is_party_icon_visible() - else 0 - ) - ), - self._height - 70, - ) - if self._get_tickets_button: - bui.buttonwidget(edit=self._get_tickets_button, position=pos) - if self._ticket_count_text: - bui.textwidget(edit=self._ticket_count_text, position=pos) - def _restore_purchases(self) -> None: - from bauiv1lib import account + from bauiv1lib.account.signin import show_sign_in_prompt plus = bui.app.plus assert plus is not None if plus.accounts.primary is None: - account.show_sign_in_prompt() + show_sign_in_prompt() else: plus.restore_purchases() @@ -385,25 +342,6 @@ class StoreBrowserWindow(bui.Window): bui.textwidget(edit=tab_data['text'], text='') bui.imagewidget(edit=tab_data['img'], opacity=0.0) - def _update_tickets_text(self) -> None: - from bauiv1 import SpecialChar - - if not self._root_widget: - return - plus = bui.app.plus - assert plus is not None - sval: str | bui.Lstr - if plus.get_v1_account_state() == 'signed_in': - sval = bui.charstr(SpecialChar.TICKET) + str( - plus.get_v1_account_ticket_count() - ) - else: - sval = bui.Lstr(resource='getTicketsWindow.titleText') - if self._get_tickets_button: - bui.buttonwidget(edit=self._get_tickets_button, label=sval) - if self._ticket_count_text: - bui.textwidget(edit=self._ticket_count_text, text=sval) - def _set_tab(self, tab_id: TabID) -> None: if self._current_tab is tab_id: return @@ -424,14 +362,14 @@ class StoreBrowserWindow(bui.Window): self._scrollwidget = bui.scrollwidget( parent=self._root_widget, highlight=False, - position=( - (self._width - self._scroll_width) * 0.5, - self._height - self._scroll_height - 79 - 48, - ), size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_bottom, + ), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, + border_opacity=0.4, ) # NOTE: this stuff is modified by the _Store class. @@ -465,7 +403,6 @@ class StoreBrowserWindow(bui.Window): window = self._window() if window is not None and (window.request is self): window.request = None - # noinspection PyProtectedMember window._on_response(data) # Kick off a server request. @@ -572,9 +509,8 @@ class StoreBrowserWindow(bui.Window): def buy(self, item: str) -> None: """Attempt to purchase the provided item.""" - from bauiv1lib import account + from bauiv1lib.account.signin import show_sign_in_prompt from bauiv1lib.confirm import ConfirmWindow - from bauiv1lib import gettickets assert bui.app.classic is not None store = bui.app.classic.store @@ -592,7 +528,7 @@ class StoreBrowserWindow(bui.Window): bui.getsound('error').play() else: if plus.get_v1_account_state() != 'signed_in': - account.show_sign_in_prompt() + show_sign_in_prompt() else: self._last_buy_time = curtime @@ -620,7 +556,11 @@ class StoreBrowserWindow(bui.Window): our_tickets = plus.get_v1_account_ticket_count() if price is not None and our_tickets < price: bui.getsound('error').play() - gettickets.show_get_tickets_prompt() + bui.screenmessage( + bui.Lstr(resource='notEnoughTicketsText'), + color=(1, 0, 0), + ) + # gettickets.show_get_tickets_prompt() else: def do_it() -> None: @@ -703,12 +643,13 @@ class StoreBrowserWindow(bui.Window): assert bui.app.classic is not None purchased = bui.app.classic.accounts.have_pro() else: - purchased = plus.get_purchased(b_type) + purchased = plus.get_v1_account_product_purchased(b_type) sale_opacity = 0.0 sale_title_text: str | bui.Lstr = '' sale_time_text: str | bui.Lstr = '' + call: Callable | None if purchased: title_color = (0.8, 0.7, 0.9, 1.0) color = (0.63, 0.55, 0.78) @@ -915,11 +856,12 @@ class StoreBrowserWindow(bui.Window): ) if 'title' not in section: section['title'] = '' - section['x_offs'] = ( - 130 - if self._tab == 'extras' - else 270 if self._tab == 'maps' else 0 - ) + section['x_offs'] = 0.0 + # section['x_offs'] = ( + # 130 + # if self._tab == 'extras' + # else 270 if self._tab == 'maps' else 0 + # ) section['y_offs'] = ( 20 if ( @@ -951,7 +893,7 @@ class StoreBrowserWindow(bui.Window): title_spacing = 40 button_border = 20 button_spacing = 4 - boffs_h = 40 + boffs_h = 0.0 self._height = 80.0 # Calc total height. @@ -960,17 +902,16 @@ class StoreBrowserWindow(bui.Window): assert self._height is not None self._height += title_spacing b_width, b_height = section['button_size'] - b_column_count = int( - math.floor( - (self._width - boffs_h - 20) - / (b_width + button_spacing) - ) - ) - b_row_count = int( - math.ceil( - float(len(section['items'])) / b_column_count - ) + b_count = len(section['items']) + b_column_count = min( + b_count, + int( + math.floor( + self._width / (b_width + button_spacing) + ) + ), ) + b_row_count = int(math.ceil(b_count / b_column_count)) b_height_total = ( 2 * button_border + b_row_count * b_height @@ -985,7 +926,6 @@ class StoreBrowserWindow(bui.Window): size=(self._width, self._height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) v = self._height - 20 @@ -996,11 +936,7 @@ class StoreBrowserWindow(bui.Window): subs=[ ( '${SETTINGS}', - bui.Lstr( - resource=( - 'accountSettingsWindow.titleText' - ) - ), + bui.Lstr(resource='inventoryText'), ), ( '${PLAYER_PROFILES}', @@ -1100,12 +1036,15 @@ class StoreBrowserWindow(bui.Window): v -= button_border b_width, b_height = section['button_size'] b_count = len(section['items']) - b_column_count = int( - math.floor( - (self._width - boffs_h - 20) - / (b_width + button_spacing) - ) + b_column_count = min( + b_count, + int( + math.floor( + self._width / (b_width + button_spacing) + ) + ), ) + col = 0 item: dict[str, Any] assert self._store_window.button_infos is not None @@ -1116,15 +1055,17 @@ class StoreBrowserWindow(bui.Window): item['call'] = bui.WeakCall( self._store_window.buy, item_name ) - if 'x_offs' in section: - boffs_h2 = section['x_offs'] - else: - boffs_h2 = 0 + boffs_h2 = section.get('x_offs', 0.0) + boffs_v2 = section.get('y_offs', 0.0) + + # Calc the diff between the space we use and + # the space available and nudge us right by + # half that to center things. + boffs_h2 += 0.5 * ( + self._width + - ((b_width + button_spacing) * b_column_count) + ) - if 'y_offs' in section: - boffs_v2 = section['y_offs'] - else: - boffs_v2 = 0 b_pos = ( boffs_h + boffs_h2 @@ -1204,7 +1145,7 @@ class StoreBrowserWindow(bui.Window): self._store_window.update_buttons() if self._current_tab in ( - self.TabID.EXTRAS, + # self.TabID.EXTRAS, self.TabID.MINIGAMES, self.TabID.CHARACTERS, self.TabID.MAPS, @@ -1223,7 +1164,6 @@ class StoreBrowserWindow(bui.Window): size=(self._scroll_width, self._scroll_height * 0.95), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._status_textwidget = bui.textwidget( @@ -1242,6 +1182,20 @@ class StoreBrowserWindow(bui.Window): maxwidth=self._scroll_width * 0.9, ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _save_state(self) -> None: try: sel = self._root_widget.get_selected_child() @@ -1250,9 +1204,7 @@ class StoreBrowserWindow(bui.Window): for tab_id, tab in self._tab_row.tabs.items() if sel == tab.button ] - if sel == self._get_tickets_button: - sel_name = 'GetTickets' - elif sel == self._scrollwidget: + if sel == self._scrollwidget: sel_name = 'Scroll' elif sel == self._back_button: sel_name = 'Back' @@ -1269,7 +1221,6 @@ class StoreBrowserWindow(bui.Window): logging.exception('Error saving state for %s.', self) def _restore_state(self) -> None: - from efro.util import enum_by_value try: sel: bui.Widget | None @@ -1280,32 +1231,26 @@ class StoreBrowserWindow(bui.Window): assert isinstance(sel_name, (str, type(None))) try: - current_tab = enum_by_value( - self.TabID, bui.app.config.get('Store Tab') - ) + current_tab = self.TabID(bui.app.config.get('Store Tab')) except ValueError: current_tab = self.TabID.CHARACTERS if self._show_tab is not None: current_tab = self._show_tab - if sel_name == 'GetTickets' and self._get_tickets_button: - sel = self._get_tickets_button - elif sel_name == 'Back': + if sel_name == 'Back': sel = self._back_button elif sel_name == 'Scroll': sel = self._scrollwidget elif isinstance(sel_name, str) and sel_name.startswith('Tab:'): try: - sel_tab_id = enum_by_value( - self.TabID, sel_name.split(':')[-1] - ) + sel_tab_id = self.TabID(sel_name.split(':')[-1]) except ValueError: sel_tab_id = self.TabID.CHARACTERS sel = self._tab_row.tabs[sel_tab_id].button else: sel = self._tab_row.tabs[current_tab].button - # If we were requested to show a tab, select it too.. + # If we were requested to show a tab, select it too. if ( self._show_tab is not None and self._show_tab in self._tab_row.tabs @@ -1317,68 +1262,13 @@ class StoreBrowserWindow(bui.Window): except Exception: logging.exception('Error restoring state for %s.', self) - def _on_get_more_tickets_press(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.account import show_sign_in_prompt - from bauiv1lib.gettickets import GetTicketsWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - plus = bui.app.plus - assert plus is not None - - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - return - self._save_state() - bui.containerwidget(edit=self._root_widget, transition='out_left') - window = GetTicketsWindow( - from_modal_store=self._modal, - store_back_location=self._back_location, - ).get_root_widget() - if not self._modal: - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - window, from_window=self._root_widget - ) - - def _back(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.coop.browser import CoopBrowserWindow - from bauiv1lib.mainmenu import MainMenuWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - if not self._modal: - assert bui.app.classic is not None - if self._back_location == 'CoopBrowserWindow': - bui.app.ui_v1.set_main_menu_window( - CoopBrowserWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - else: - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) - if self._on_close_call is not None: - self._on_close_call() - def _check_merch_availability_in_bg_thread() -> None: # pylint: disable=cell-var-from-loop - # Merch is available from some countries only. - # Make a reasonable check to ask the master-server about this at - # launch and store the results. + # Merch is available from some countries only. Make a reasonable + # check to ask the master-server about this at launch and store the + # results. plus = bui.app.plus assert plus is not None diff --git a/dist/ba_data/python/bauiv1lib/store/button.py b/dist/ba_data/python/bauiv1lib/store/button.py deleted file mode 100644 index f205035..0000000 --- a/dist/ba_data/python/bauiv1lib/store/button.py +++ /dev/null @@ -1,324 +0,0 @@ -# Released under the MIT License. See LICENSE for details. -# -"""UI functionality for a button leading to the store.""" -from __future__ import annotations - -import logging -from typing import TYPE_CHECKING - -from efro.util import utc_now - -import bauiv1 as bui - -if TYPE_CHECKING: - from typing import Any, Sequence, Callable - - -class StoreButton: - """A button leading to the store.""" - - def __init__( - self, - parent: bui.Widget, - position: Sequence[float], - size: Sequence[float], - scale: float, - on_activate_call: Callable[[], Any] | None = None, - transition_delay: float | None = None, - color: Sequence[float] | None = None, - textcolor: Sequence[float] | None = None, - show_tickets: bool = False, - button_type: str | None = None, - sale_scale: float = 1.0, - ): - self._position = position - self._size = size - self._scale = scale - - if on_activate_call is None: - on_activate_call = bui.WeakCall(self._default_on_activate_call) - self._on_activate_call = on_activate_call - - self._button = bui.buttonwidget( - parent=parent, - size=size, - label='' if show_tickets else bui.Lstr(resource='storeText'), - scale=scale, - autoselect=True, - on_activate_call=self._on_activate, - transition_delay=transition_delay, - color=color, - button_type=button_type, - ) - - self._title_text: bui.Widget | None - self._ticket_text: bui.Widget | None - - if show_tickets: - self._title_text = bui.textwidget( - parent=parent, - position=( - position[0] + size[0] * 0.5 * scale, - position[1] + size[1] * 0.65 * scale, - ), - size=(0, 0), - h_align='center', - v_align='center', - maxwidth=size[0] * scale * 0.65, - text=bui.Lstr(resource='storeText'), - draw_controller=self._button, - scale=scale, - transition_delay=transition_delay, - color=textcolor, - ) - self._ticket_text = bui.textwidget( - parent=parent, - size=(0, 0), - h_align='center', - v_align='center', - maxwidth=size[0] * scale * 0.85, - text='', - color=(0.2, 1.0, 0.2), - flatness=1.0, - shadow=0.0, - scale=scale * 0.6, - transition_delay=transition_delay, - ) - else: - self._title_text = None - self._ticket_text = None - - self._circle_rad = 12 * scale - self._circle_center = (0.0, 0.0) - self._sale_circle_center = (0.0, 0.0) - - self._available_purchase_backing = bui.imagewidget( - parent=parent, - color=(1, 0, 0), - draw_controller=self._button, - size=(2.2 * self._circle_rad, 2.2 * self._circle_rad), - texture=bui.gettexture('circleShadow'), - transition_delay=transition_delay, - ) - self._available_purchase_text = bui.textwidget( - parent=parent, - size=(0, 0), - h_align='center', - v_align='center', - text='', - draw_controller=self._button, - color=(1, 1, 1), - flatness=1.0, - shadow=1.0, - scale=0.6 * scale, - maxwidth=self._circle_rad * 1.4, - transition_delay=transition_delay, - ) - - self._sale_circle_rad = 18 * scale * sale_scale - self._sale_backing = bui.imagewidget( - parent=parent, - color=(0.5, 0, 1.0), - draw_controller=self._button, - size=(2 * self._sale_circle_rad, 2 * self._sale_circle_rad), - texture=bui.gettexture('circleZigZag'), - transition_delay=transition_delay, - ) - self._sale_title_text = bui.textwidget( - parent=parent, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=self._button, - color=(0, 1, 0), - flatness=1.0, - shadow=0.0, - scale=0.5 * scale * sale_scale, - maxwidth=self._sale_circle_rad * 1.5, - transition_delay=transition_delay, - ) - self._sale_time_text = bui.textwidget( - parent=parent, - size=(0, 0), - h_align='center', - v_align='center', - draw_controller=self._button, - color=(0, 1, 0), - flatness=1.0, - shadow=0.0, - scale=0.4 * scale * sale_scale, - maxwidth=self._sale_circle_rad * 1.5, - transition_delay=transition_delay, - ) - - self.set_position(position) - self._update_timer = bui.AppTimer( - 1.0, bui.WeakCall(self._update), repeat=True - ) - self._update() - - def _on_activate(self) -> None: - bui.increment_analytics_count('Store button press') - self._on_activate_call() - - def set_position(self, position: Sequence[float]) -> None: - """Set the button position.""" - self._position = position - self._circle_center = ( - position[0] + 0.1 * self._size[0] * self._scale, - position[1] + self._size[1] * self._scale * 0.8, - ) - self._sale_circle_center = ( - position[0] + 0.07 * self._size[0] * self._scale, - position[1] + self._size[1] * self._scale * 0.8, - ) - - if not self._button: - return - bui.buttonwidget(edit=self._button, position=self._position) - if self._title_text is not None: - bui.textwidget( - edit=self._title_text, - position=( - self._position[0] + self._size[0] * 0.5 * self._scale, - self._position[1] + self._size[1] * 0.65 * self._scale, - ), - ) - if self._ticket_text is not None: - bui.textwidget( - edit=self._ticket_text, - position=( - position[0] + self._size[0] * 0.5 * self._scale, - position[1] + self._size[1] * 0.28 * self._scale, - ), - size=(0, 0), - ) - bui.imagewidget( - edit=self._available_purchase_backing, - position=( - self._circle_center[0] - self._circle_rad * 1.02, - self._circle_center[1] - self._circle_rad * 1.13, - ), - ) - bui.textwidget( - edit=self._available_purchase_text, position=self._circle_center - ) - - bui.imagewidget( - edit=self._sale_backing, - position=( - self._sale_circle_center[0] - self._sale_circle_rad, - self._sale_circle_center[1] - self._sale_circle_rad, - ), - ) - bui.textwidget( - edit=self._sale_title_text, - position=( - self._sale_circle_center[0], - self._sale_circle_center[1] + self._sale_circle_rad * 0.3, - ), - ) - bui.textwidget( - edit=self._sale_time_text, - position=( - self._sale_circle_center[0], - self._sale_circle_center[1] - self._sale_circle_rad * 0.3, - ), - ) - - def _default_on_activate_call(self) -> None: - # pylint: disable=cyclic-import - from bauiv1lib.account import show_sign_in_prompt - from bauiv1lib.store.browser import StoreBrowserWindow - - plus = bui.app.plus - assert plus is not None - if plus.get_v1_account_state() != 'signed_in': - show_sign_in_prompt() - return - StoreBrowserWindow(modal=True, origin_widget=self._button) - - def get_button(self) -> bui.Widget: - """Return the underlying button widget.""" - return self._button - - def _update(self) -> None: - # pylint: disable=too-many-branches - # pylint: disable=cyclic-import - from babase import SpecialChar - - plus = bui.app.plus - assert plus is not None - assert bui.app.classic is not None - store = bui.app.classic.store - - if not self._button: - return # Our instance may outlive our UI objects. - - if self._ticket_text is not None: - if plus.get_v1_account_state() == 'signed_in': - sval = bui.charstr(SpecialChar.TICKET) + str( - plus.get_v1_account_ticket_count() - ) - else: - sval = '-' - bui.textwidget(edit=self._ticket_text, text=sval) - available_purchases = store.get_available_purchase_count() - - # Old pro sale stuff.. - sale_time = store.get_available_sale_time('extras') - - # ..also look for new style sales. - if sale_time is None: - import datetime - - sales_raw = plus.get_v1_account_misc_read_val('sales', {}) - sale_times = [] - try: - # Look at the current set of sales; filter any with time - # remaining that we don't own. - for sale_item, sale_info in list(sales_raw.items()): - if not plus.get_purchased(sale_item): - to_end = ( - datetime.datetime.fromtimestamp( - sale_info['e'], datetime.UTC - ) - - utc_now() - ).total_seconds() - if to_end > 0: - sale_times.append(to_end) - except Exception: - logging.exception('Error parsing sales.') - if sale_times: - sale_time = int(min(sale_times) * 1000) - - if sale_time is not None: - bui.textwidget( - edit=self._sale_title_text, - text=bui.Lstr(resource='store.saleText'), - ) - bui.textwidget( - edit=self._sale_time_text, - text=bui.timestring(sale_time / 1000.0, centi=False), - ) - bui.imagewidget(edit=self._sale_backing, opacity=1.0) - bui.imagewidget(edit=self._available_purchase_backing, opacity=1.0) - bui.textwidget(edit=self._available_purchase_text, text='') - bui.imagewidget(edit=self._available_purchase_backing, opacity=0.0) - else: - bui.imagewidget(edit=self._sale_backing, opacity=0.0) - bui.textwidget(edit=self._sale_time_text, text='') - bui.textwidget(edit=self._sale_title_text, text='') - if available_purchases > 0: - bui.textwidget( - edit=self._available_purchase_text, - text=str(available_purchases), - ) - bui.imagewidget( - edit=self._available_purchase_backing, opacity=1.0 - ) - else: - bui.textwidget(edit=self._available_purchase_text, text='') - bui.imagewidget( - edit=self._available_purchase_backing, opacity=0.0 - ) diff --git a/dist/ba_data/python/bauiv1lib/store/item.py b/dist/ba_data/python/bauiv1lib/store/item.py index ee779cb..ca27e16 100644 --- a/dist/ba_data/python/bauiv1lib/store/item.py +++ b/dist/ba_data/python/bauiv1lib/store/item.py @@ -19,6 +19,7 @@ def instantiate_store_item_display( b_pos: tuple[float, float], b_width: float, b_height: float, + *, boffs_h: float = 0.0, boffs_h2: float = 0.0, boffs_v2: float = 0, @@ -26,6 +27,7 @@ def instantiate_store_item_display( button: bool = True, ) -> None: """(internal)""" + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-statements # pylint: disable=too-many-branches # pylint: disable=too-many-locals @@ -74,7 +76,7 @@ def instantiate_store_item_display( tint_color = None tint2_color = None tex_name: str | None = None - desc: str | None = None + desc: bui.Lstr | None = None modes: bui.Lstr | None = None if item_name.startswith('characters.'): @@ -149,6 +151,30 @@ def instantiate_store_item_display( base_text_scale = 0.8 title_v = 0.48 price_v = 0.17 + elif item_name == 'upgrades.infinite_runaround': + base_text_scale = 0.8 + desc = bui.Lstr( + translate=( + 'gameDescriptions', + 'Prevent enemies from reaching the exit.', + ) + ) + modes = bui.Lstr(resource='playModes.coopText') + tex_name = 'towerDPreview' + title_v = 0.48 + price_v = 0.17 + elif item_name == 'upgrades.infinite_onslaught': + base_text_scale = 0.8 + desc = bui.Lstr( + translate=( + 'gameDescriptions', + 'Defeat all enemies.', + ) + ) + modes = bui.Lstr(resource='playModes.coopText') + tex_name = 'doomShroomPreview' + title_v = 0.48 + price_v = 0.17 elif item_name.startswith('icons.'): base_text_scale = 1.5 @@ -510,7 +536,10 @@ def instantiate_store_item_display( texture=bui.gettexture(tex_name), ) - if item_name.startswith('games.'): + if item_name.startswith('games.') or item_name in ( + 'upgrades.infinite_runaround', + 'upgrades.infinite_onslaught', + ): frame_size = b_width * 0.8 im_dim = frame_size * (100.0 / 113.0) im_pos = ( diff --git a/dist/ba_data/python/bauiv1lib/tabs.py b/dist/ba_data/python/bauiv1lib/tabs.py index ffb0cff..c5bfef8 100644 --- a/dist/ba_data/python/bauiv1lib/tabs.py +++ b/dist/ba_data/python/bauiv1lib/tabs.py @@ -37,6 +37,7 @@ class TabRow(Generic[T]): tabdefs: list[tuple[T, bui.Lstr]], pos: tuple[float, float], size: tuple[float, float], + *, on_select_call: Callable[[T], None] | None = None, ) -> None: if not tabdefs: @@ -71,12 +72,12 @@ class TabRow(Generic[T]): bui.buttonwidget( edit=tab.button, color=(0.5, 0.4, 0.93), - textcolor=(0.85, 0.75, 0.95), + textcolor=(0.82, 0.72, 0.92), ) # lit else: bui.buttonwidget( edit=tab.button, - color=(0.52, 0.48, 0.63), + color=(0.50, 0.44, 0.63), textcolor=(0.65, 0.6, 0.7), ) # unlit diff --git a/dist/ba_data/python/bauiv1lib/tournamententry.py b/dist/ba_data/python/bauiv1lib/tournamententry.py index 972fddc..550beaf 100644 --- a/dist/ba_data/python/bauiv1lib/tournamententry.py +++ b/dist/ba_data/python/bauiv1lib/tournamententry.py @@ -28,11 +28,13 @@ class TournamentEntryWindow(PopupWindow): offset: tuple[float, float] = (0.0, 0.0), on_close_call: Callable[[], Any] | None = None, ): - # Needs some tidying. + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-locals # pylint: disable=too-many-branches # pylint: disable=too-many-statements + from bauiv1lib.coop.tournamentbutton import USE_ENTRY_FEES + assert bui.app.classic is not None assert bui.app.plus bui.set_analytics_screen('Tournament Entry Window') @@ -42,9 +44,15 @@ class TournamentEntryWindow(PopupWindow): self._tournament_id ] + self._purchase_name: str | None + self._purchase_price_name: str | None + # Set a few vars depending on the tourney fee. self._fee = self._tournament_info['fee'] - self._allow_ads = self._tournament_info['allowAds'] + assert isinstance(self._fee, int | None) + self._allow_ads = ( + self._tournament_info['allowAds'] if USE_ENTRY_FEES else False + ) if self._fee == 4: self._purchase_name = 'tournament_entry_4' self._purchase_price_name = 'price.tournament_entry_4' @@ -57,6 +65,9 @@ class TournamentEntryWindow(PopupWindow): elif self._fee == 1: self._purchase_name = 'tournament_entry_1' self._purchase_price_name = 'price.tournament_entry_1' + elif self._fee is None or self._fee == -1: + self._purchase_name = None + self._purchase_price_name = 'FREE-WOOT' else: if self._fee != 0: raise ValueError('invalid fee: ' + str(self._fee)) @@ -100,7 +111,7 @@ class TournamentEntryWindow(PopupWindow): scale=scale, bg_color=bg_color, offset=offset, - toolbar_visibility='menu_currency', + toolbar_visibility='menu_store_no_back', ) self._last_ad_press_time = -9999.0 @@ -135,7 +146,8 @@ class TournamentEntryWindow(PopupWindow): scale=0.6, text=bui.Lstr(resource='tournamentEntryText'), maxwidth=180, - color=(1, 1, 1, 0.4), + # color=(1, 1, 1, 0.4), + color=bui.app.ui_v1.title_color, ) btn = self._pay_with_tickets_button = bui.buttonwidget( @@ -218,7 +230,7 @@ class TournamentEntryWindow(PopupWindow): h_align='center', v_align='center', scale=0.6, - # Note: AdMob now requires rewarded ad usage + # Note to self: AdMob requires rewarded ad usage # specifically says 'Ad' in it. text=bui.Lstr(resource='watchAnAdText'), maxwidth=95, @@ -273,28 +285,6 @@ class TournamentEntryWindow(PopupWindow): self._get_tickets_button: bui.Widget | None = None self._ticket_count_text: bui.Widget | None = None - if not bui.app.ui_v1.use_toolbars: - if bui.app.classic.allow_ticket_purchases: - self._get_tickets_button = bui.buttonwidget( - parent=self.root_widget, - position=(self._width - 190 + 105, self._height - 34), - autoselect=True, - scale=0.5, - size=(120, 60), - textcolor=(0.2, 1, 0.2), - label=bui.charstr(bui.SpecialChar.TICKET), - color=(0.65, 0.5, 0.8), - on_activate_call=self._on_get_tickets_press, - ) - else: - self._ticket_count_text = bui.textwidget( - parent=self.root_widget, - scale=0.5, - position=(self._width - 190 + 125, self._height - 34), - color=(0.2, 1, 0.2), - h_align='center', - v_align='center', - ) self._seconds_remaining = None @@ -461,29 +451,52 @@ class TournamentEntryWindow(PopupWindow): ) # Keep price up-to-date and update the button with it. - self._purchase_price = plus.get_v1_account_misc_read_val( - self._purchase_price_name, None - ) + if self._purchase_price_name is not None: + self._purchase_price = ( + 0 + if self._purchase_price_name == 'FREE-WOOT' + else plus.get_v1_account_misc_read_val( + self._purchase_price_name, None + ) + ) + # HACK - this is always free now, so just have this say 'PLAY' bui.textwidget( edit=self._ticket_cost_text, text=( - bui.Lstr(resource='getTicketsWindow.freeText') - if self._purchase_price == 0 - else bui.Lstr( - resource='getTicketsWindow.ticketsText', - subs=[ - ( - '${COUNT}', - ( - str(self._purchase_price) - if self._purchase_price is not None - else '?' - ), - ) - ], - ) + bui.Lstr(resource='playText') + # if self._purchase_price == 0 + # else bui.Lstr( + # resource='getTicketsWindow.ticketsText', + # subs=[ + # ( + # '${COUNT}', + # ( + # str(self._purchase_price) + # if self._purchase_price is not None + # else '?' + # ), + # ) + # ], + # ) ), + # text=( + # bui.Lstr(resource='getTicketsWindow.freeText') + # if self._purchase_price == 0 + # else bui.Lstr( + # resource='getTicketsWindow.ticketsText', + # subs=[ + # ( + # '${COUNT}', + # ( + # str(self._purchase_price) + # if self._purchase_price is not None + # else '?' + # ), + # ) + # ], + # ) + # ), position=( self._ticket_cost_text_position_free if self._purchase_price == 0 @@ -494,19 +507,20 @@ class TournamentEntryWindow(PopupWindow): bui.textwidget( edit=self._free_plays_remaining_text, - text=( - '' - if ( - self._tournament_info['freeTriesRemaining'] in [None, 0] - or self._purchase_price != 0 - ) - else '' + str(self._tournament_info['freeTriesRemaining']) - ), + # text=( + # '' + # if ( + # self._tournament_info['freeTriesRemaining'] in [None, 0] + # or self._purchase_price != 0 + # ) + # else '' + str(self._tournament_info['freeTriesRemaining']) + # ), + text='', # No longer relevant. ) bui.imagewidget( edit=self._ticket_img, - opacity=0.2 if self._purchase_price == 0 else 1.0, + opacity=0.0 if self._purchase_price == 0 else 1.0, position=( self._ticket_img_pos_free if self._purchase_price == 0 @@ -569,15 +583,16 @@ class TournamentEntryWindow(PopupWindow): self._launched = True launched = False - # If they gave us an existing, non-consistent - # practice activity, just restart it. + # If they gave us an existing, non-consistent practice activity, + # just restart it. if ( self._tournament_activity is not None and not practice == self._tournament_activity.session.submit_score ): try: if not practice: - bui.apptimer(0.1, bui.getsound('cashRegister').play) + bui.apptimer(0.1, bui.getsound('drumRollShort').play) + # bui.apptimer(0.1, bui.getsound('cashRegister').play) bui.screenmessage( bui.Lstr( translate=( @@ -606,7 +621,8 @@ class TournamentEntryWindow(PopupWindow): # launch a new session. if not launched: if not practice: - bui.apptimer(0.1, bui.getsound('cashRegister').play) + bui.apptimer(0.1, bui.getsound('drumRollShort').play) + # bui.apptimer(0.1, bui.getsound('cashRegister').play) bui.screenmessage( bui.Lstr( translate=('serverResponses', 'Entering tournament...') @@ -632,7 +648,7 @@ class TournamentEntryWindow(PopupWindow): bui.apptimer(0 if practice else 1.25, self._transition_out) def _on_pay_with_tickets_press(self) -> None: - from bauiv1lib import gettickets + # from bauiv1lib import gettickets plus = bui.app.plus assert plus is not None @@ -675,15 +691,21 @@ class TournamentEntryWindow(PopupWindow): ticket_count = None ticket_cost = self._purchase_price if ticket_count is not None and ticket_count < ticket_cost: - gettickets.show_get_tickets_prompt() bui.getsound('error').play() + bui.screenmessage( + bui.Lstr(resource='notEnoughTicketsText'), + color=(1, 0, 0), + ) + # gettickets.show_get_tickets_prompt() self._transition_out() return cur_time = bui.apptime() self._last_ticket_press_time = cur_time - assert isinstance(ticket_cost, int) - plus.in_game_purchase(self._purchase_name, ticket_cost) + + if self._purchase_name is not None: + assert isinstance(ticket_cost, int) + plus.in_game_purchase(self._purchase_name, ticket_cost) self._entering = True plus.add_v1_account_transaction( @@ -763,7 +785,7 @@ class TournamentEntryWindow(PopupWindow): # This should have awarded us the tournament_entry_ad purchase; # make sure that's present. # (otherwise the server will ignore our tournament entry anyway) - if not plus.get_purchased('tournament_entry_ad'): + if not plus.get_v1_account_product_purchased('tournament_entry_ad'): print('no tournament_entry_ad purchase present in _on_ad_complete') bui.screenmessage(bui.Lstr(resource='errorText'), color=(1, 0, 0)) bui.getsound('error').play() @@ -780,30 +802,20 @@ class TournamentEntryWindow(PopupWindow): plus.run_v1_account_transactions() self._launch() - def _on_get_tickets_press(self) -> None: - from bauiv1lib import gettickets - - # If we're already entering, ignore presses. - if self._entering: - return - - # Bring up get-tickets window and then kill ourself (we're on the - # overlay layer so we'd show up above it). - gettickets.GetTicketsWindow( - modal=True, origin_widget=self._get_tickets_button - ) - self._transition_out() - def _on_cancel(self) -> None: plus = bui.app.plus assert plus is not None # Don't allow canceling for several seconds after poking an enter # button if it looks like we're waiting on a purchase or entering # the tournament. - if (bui.apptime() - self._last_ticket_press_time < 6.0) and ( - plus.have_outstanding_v1_account_transactions() - or plus.get_purchased(self._purchase_name) - or self._entering + if ( + (bui.apptime() - self._last_ticket_press_time < 6.0) + and self._purchase_name is not None + and ( + plus.have_outstanding_v1_account_transactions() + or plus.get_v1_account_product_purchased(self._purchase_name) + or self._entering + ) ): bui.getsound('error').play() return diff --git a/dist/ba_data/python/bauiv1lib/tournamentscores.py b/dist/ba_data/python/bauiv1lib/tournamentscores.py index e4be2db..b504c1d 100644 --- a/dist/ba_data/python/bauiv1lib/tournamentscores.py +++ b/dist/ba_data/python/bauiv1lib/tournamentscores.py @@ -21,33 +21,21 @@ class TournamentScoresWindow(PopupWindow): def __init__( self, tournament_id: str, - tournament_activity: bs.GameActivity | None = None, + *, position: tuple[float, float] = (0.0, 0.0), - scale: float | None = None, - offset: tuple[float, float] = (0.0, 0.0), - tint_color: Sequence[float] = (1.0, 1.0, 1.0), - tint2_color: Sequence[float] = (1.0, 1.0, 1.0), - selected_character: str | None = None, - on_close_call: Callable[[], Any] | None = None, ): plus = bui.app.plus assert plus is not None - del tournament_activity # unused arg - del tint_color # unused arg - del tint2_color # unused arg - del selected_character # unused arg self._tournament_id = tournament_id self._subcontainer: bui.Widget | None = None - self._on_close_call = on_close_call assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale - if scale is None: - scale = ( - 2.3 - if uiscale is bui.UIScale.SMALL - else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 - ) + scale = ( + 2.3 + if uiscale is bui.UIScale.SMALL + else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 + ) self._transitioning_out = False self._width = 400 @@ -59,13 +47,12 @@ class TournamentScoresWindow(PopupWindow): bg_color = (0.5, 0.4, 0.6) - # creates our _root_widget + # Creates our _root_widget. super().__init__( position=position, size=(self._width, self._height), scale=scale, bg_color=bg_color, - offset=offset, ) self._cancel_button = bui.buttonwidget( @@ -90,7 +77,7 @@ class TournamentScoresWindow(PopupWindow): scale=0.6, text=bui.Lstr(resource='tournamentStandingsText'), maxwidth=200, - color=(1, 1, 1, 0.4), + color=bui.app.ui_v1.title_color, ) self._scrollwidget = bui.scrollwidget( @@ -99,16 +86,20 @@ class TournamentScoresWindow(PopupWindow): position=(30, 30), highlight=False, simple_culling_v=10, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, autoselect=True) + self._loading_spinner = bui.spinnerwidget( + parent=self.root_widget, + position=(self._width * 0.5, self._height * 0.5), + style='bomb', + size=48, + ) self._loading_text = bui.textwidget( parent=self._scrollwidget, scale=0.5, - text=bui.Lstr( - value='${A}...', - subs=[('${A}', bui.Lstr(resource='loadingText'))], - ), + text='', size=(self._width - 60, 100), h_align='center', v_align='center', @@ -131,10 +122,12 @@ class TournamentScoresWindow(PopupWindow): self, data: dict[str, Any] | None ) -> None: if data is not None: - # this used to be the whole payload + # This used to be the whole payload. data_t: list[dict[str, Any]] = data['t'] - # kill our loading text if we've got scores.. otherwise just - # replace it with 'no scores yet' + + # Kill our loading text if we've got scores; otherwise just + # replace it with 'no scores yet'. + bui.spinnerwidget(edit=self._loading_spinner, visible=False) if data_t[0]['scores']: self._loading_text.delete() else: @@ -218,7 +211,8 @@ class TournamentScoresWindow(PopupWindow): def _show_player_info(self, entry: Any, textwidget: bui.Widget) -> None: from bauiv1lib.account.viewer import AccountViewerWindow - # for the moment we only work if a single player-info is present.. + # For the moment we only work if a single player-info is + # present. if len(entry[2]) != 1: bui.getsound('error').play() return @@ -237,8 +231,6 @@ class TournamentScoresWindow(PopupWindow): if not self._transitioning_out: self._transitioning_out = True bui.containerwidget(edit=self.root_widget, transition='out_scale') - if self._on_close_call is not None: - self._on_close_call() @override def on_popup_cancel(self) -> None: diff --git a/dist/ba_data/python/bauiv1lib/trophies.py b/dist/ba_data/python/bauiv1lib/trophies.py index a7982f6..25cea2a 100644 --- a/dist/ba_data/python/bauiv1lib/trophies.py +++ b/dist/ba_data/python/bauiv1lib/trophies.py @@ -32,8 +32,8 @@ class TrophiesWindow(popup.PopupWindow): else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 ) self._transitioning_out = False - self._width = 300 - self._height = 300 + self._width = 310 + self._height = 310 bg_color = (0.5, 0.4, 0.6) super().__init__( @@ -65,7 +65,8 @@ class TrophiesWindow(popup.PopupWindow): scale=0.6, text=bui.Lstr(resource='trophiesText'), maxwidth=200, - color=(1, 1, 1, 0.4), + # color=(1, 1, 1, 0.4), + color=bui.app.ui_v1.title_color, ) self._scrollwidget = bui.scrollwidget( @@ -73,6 +74,7 @@ class TrophiesWindow(popup.PopupWindow): size=(self._width - 60, self._height - 70), position=(30, 30), capture_arrows=True, + border_opacity=0.4, ) bui.widget(edit=self._scrollwidget, autoselect=True) @@ -134,6 +136,7 @@ class TrophiesWindow(popup.PopupWindow): sub_width: int, trophy_types: list[list[str]], ) -> int: + # pylint: disable=too-many-positional-arguments from bascenev1 import get_trophy_string total_pts = 0 diff --git a/dist/ba_data/python/bauiv1lib/v2upgrade.py b/dist/ba_data/python/bauiv1lib/v2upgrade.py index 1ce5b3b..381500e 100644 --- a/dist/ba_data/python/bauiv1lib/v2upgrade.py +++ b/dist/ba_data/python/bauiv1lib/v2upgrade.py @@ -11,7 +11,6 @@ class V2UpgradeWindow(bui.Window): """A window presenting a URL to the user visually.""" def __init__(self, login_name: str, code: str): - from bauiv1lib.account.settings import show_what_is_v2_page app = bui.app assert app.classic is not None @@ -116,3 +115,12 @@ class V2UpgradeWindow(bui.Window): def _done(self) -> None: bui.containerwidget(edit=self._root_widget, transition='out_left') + + +def show_what_is_v2_page() -> None: + """Show the webpage describing V2 accounts.""" + plus = bui.app.plus + assert plus is not None + + bamasteraddr = plus.get_master_server_address(version=2) + bui.open_url(f'{bamasteraddr}/whatisv2') diff --git a/dist/ba_data/python/bauiv1lib/watch.py b/dist/ba_data/python/bauiv1lib/watch.py index 84ef3c8..ae4a280 100644 --- a/dist/ba_data/python/bauiv1lib/watch.py +++ b/dist/ba_data/python/bauiv1lib/watch.py @@ -7,7 +7,7 @@ from __future__ import annotations import os import logging from enum import Enum -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, cast, override import bascenev1 as bs import bauiv1 as bui @@ -16,7 +16,7 @@ if TYPE_CHECKING: from typing import Any -class WatchWindow(bui.Window): +class WatchWindow(bui.MainWindow): """Window for watching replays.""" class TabID(Enum): @@ -31,20 +31,9 @@ class WatchWindow(bui.Window): origin_widget: bui.Widget | None = None, ): # pylint: disable=too-many-locals - # pylint: disable=too-many-statements from bauiv1lib.tabs import TabRow bui.set_analytics_screen('Watch Window') - scale_origin: tuple[float, float] | None - if origin_widget is not None: - self._transition_out = 'out_scale' - scale_origin = origin_widget.get_screen_space_center() - transition = 'in_scale' - else: - self._transition_out = 'out_right' - scale_origin = None - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_location('Watch') self._tab_data: dict[str, Any] = {} self._my_replays_scroll_width: float | None = None self._my_replays_watch_replay_button: bui.Widget | None = None @@ -56,68 +45,89 @@ class WatchWindow(bui.Window): self._r = 'watchWindow' uiscale = bui.app.ui_v1.uiscale self._width = 1440 if uiscale is bui.UIScale.SMALL else 1040 - x_inset = 200 if uiscale is bui.UIScale.SMALL else 0 self._height = ( - 578 + 900 if uiscale is bui.UIScale.SMALL else 670 if uiscale is bui.UIScale.MEDIUM else 800 ) self._current_tab: WatchWindow.TabID | None = None - extra_top = 20 if uiscale is bui.UIScale.SMALL else 0 + + # Do some fancy math to fill all available screen area up to the + # size of our backing container. This lets us fit to the exact + # screen shape at small ui scale. + screensize = bui.get_virtual_screen_size() + scale = ( + 1.5 + if uiscale is bui.UIScale.SMALL + else 0.85 if uiscale is bui.UIScale.MEDIUM else 0.65 + ) + # Calc screen size in our local container space and clamp to a + # bit smaller than our container size. + target_width = min(self._width - 120, screensize[0] / scale) + target_height = min(self._height - 120, screensize[1] / scale) + + # To get top/left coords, go to the center of our window and + # offset by half the width/height of our target area. + self.yoffs = 0.5 * self._height + 0.5 * target_height + 30.0 + + self._scroll_width = target_width + self._scroll_height = target_height - 55 + self._scroll_y = self.yoffs - 85 - self._scroll_height super().__init__( root_widget=bui.containerwidget( - size=(self._width, self._height + extra_top), - transition=transition, - toolbar_visibility='menu_minimal', - scale_origin_stack_offset=scale_origin, - scale=( - 1.3 + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' if uiscale is bui.UIScale.SMALL - else 0.97 if uiscale is bui.UIScale.MEDIUM else 0.8 + else 'menu_full' ), - stack_offset=( - (0, -10) - if uiscale is bui.UIScale.SMALL - else (0, 15) if uiscale is bui.UIScale.MEDIUM else (0, 0) - ), - ) + scale=scale, + ), + transition=transition, + origin_widget=origin_widget, + # We're affected by screen size only at small ui-scale. + refresh_on_screen_size_changes=uiscale is bui.UIScale.SMALL, ) - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: + if uiscale is bui.UIScale.SMALL: bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back + edit=self._root_widget, on_cancel_call=self.main_window_back ) self._back_button = None else: self._back_button = btn = bui.buttonwidget( parent=self._root_widget, autoselect=True, - position=(70 + x_inset, self._height - 74), - size=(140, 60), + position=(70, self.yoffs - 50), + size=(60, 60), scale=1.1, - label=bui.Lstr(resource='backText'), - button_type='back', - on_activate_call=self._back, + label=bui.charstr(bui.SpecialChar.BACK), + button_type='backSmall', + on_activate_call=self.main_window_back, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) - bui.buttonwidget( - edit=btn, - button_type='backSmall', - size=(60, 60), - label=bui.charstr(bui.SpecialChar.BACK), - ) bui.textwidget( parent=self._root_widget, - position=(self._width * 0.5, self._height - 38), + position=( + ( + self._width * 0.5 + + ( + (self._scroll_width * -0.5 + 93) + if uiscale is bui.UIScale.SMALL + else 0 + ) + ), + self.yoffs - (63 if uiscale is bui.UIScale.SMALL else 10), + ), size=(0, 0), color=bui.app.ui_v1.title_color, - scale=1.5, - h_align='center', + scale=1.3 if uiscale is bui.UIScale.SMALL else 1.5, + h_align='left' if uiscale is bui.UIScale.SMALL else 'center', v_align='center', text=bui.Lstr(resource=f'{self._r}.titleText'), - maxwidth=400, + maxwidth=200, ) tabdefs = [ @@ -125,55 +135,62 @@ class WatchWindow(bui.Window): self.TabID.MY_REPLAYS, bui.Lstr(resource=f'{self._r}.myReplaysText'), ), - # (self.TabID.TEST_TAB, bui.Lstr(value='Testing')), ] - scroll_buffer_h = 130 + 2 * x_inset - tab_buffer_h = 750 + 2 * x_inset + tab_bar_width = 200.0 * len(tabdefs) + tab_bar_inset = (self._scroll_width - tab_bar_width) * 0.5 self._tab_row = TabRow( self._root_widget, tabdefs, - pos=(tab_buffer_h * 0.5, self._height - 130), - size=(self._width - tab_buffer_h, 50), + pos=( + self._width * 0.5 - self._scroll_width * 0.5 + tab_bar_inset, + self._scroll_y + self._scroll_height - 4.0, + ), + size=(self._scroll_width - 2.0 * tab_bar_inset, 50), on_select_call=self._set_tab, ) - if bui.app.ui_v1.use_toolbars: - first_tab = self._tab_row.tabs[tabdefs[0][0]] - last_tab = self._tab_row.tabs[tabdefs[-1][0]] - bui.widget( - edit=last_tab.button, - right_widget=bui.get_special_widget('party_button'), - ) - if uiscale is bui.UIScale.SMALL: - bbtn = bui.get_special_widget('back_button') - bui.widget( - edit=first_tab.button, up_widget=bbtn, left_widget=bbtn - ) - - self._scroll_width = self._width - scroll_buffer_h - self._scroll_height = self._height - 180 + first_tab = self._tab_row.tabs[tabdefs[0][0]] + last_tab = self._tab_row.tabs[tabdefs[-1][0]] + bui.widget( + edit=last_tab.button, + right_widget=bui.get_special_widget('squad_button'), + ) + if uiscale is bui.UIScale.SMALL: + bbtn = bui.get_special_widget('back_button') + bui.widget(edit=first_tab.button, up_widget=bbtn, left_widget=bbtn) # Not actually using a scroll widget anymore; just an image. - scroll_left = (self._width - self._scroll_width) * 0.5 - scroll_bottom = self._height - self._scroll_height - 79 - 48 - buffer_h = 10 - buffer_v = 4 bui.imagewidget( parent=self._root_widget, - position=(scroll_left - buffer_h, scroll_bottom - buffer_v), - size=( - self._scroll_width + 2 * buffer_h, - self._scroll_height + 2 * buffer_v, + size=(self._scroll_width, self._scroll_height), + position=( + self._width * 0.5 - self._scroll_width * 0.5, + self._scroll_y, ), texture=bui.gettexture('scrollWidget'), mesh_transparent=bui.getmesh('softEdgeOutside'), + opacity=0.4, ) self._tab_container: bui.Widget | None = None self._restore_state() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _set_tab(self, tab_id: TabID) -> None: # pylint: disable=too-many-locals @@ -193,7 +210,7 @@ class WatchWindow(bui.Window): if self._tab_container: self._tab_container.delete() scroll_left = (self._width - self._scroll_width) * 0.5 - scroll_bottom = self._height - self._scroll_height - 79 - 48 + scroll_bottom = self._scroll_y # A place where tabs can store data to get cleared when # switching to a different tab @@ -243,9 +260,9 @@ class WatchWindow(bui.Window): b_width = 140 if uiscale is bui.UIScale.SMALL else 178 b_height = ( - 107 + 110 if uiscale is bui.UIScale.SMALL - else 142 if uiscale is bui.UIScale.MEDIUM else 190 + else 142 if uiscale is bui.UIScale.MEDIUM else 180 ) b_space_extra = ( 0 @@ -258,14 +275,18 @@ class WatchWindow(bui.Window): btnv = ( c_height - ( - 48 + 40 if uiscale is bui.UIScale.SMALL - else 45 if uiscale is bui.UIScale.MEDIUM else 40 + else 40 if uiscale is bui.UIScale.MEDIUM else 40 ) - b_height ) - btnh = 40 if uiscale is bui.UIScale.SMALL else 40 - smlh = 190 if uiscale is bui.UIScale.SMALL else 225 + # Roughly center buttons and scroll-widget in the middle. + xextra = ( + self._scroll_width - (sub_scroll_width + b_width) + ) * 0.5 - 50.0 + btnh = (40 if uiscale is bui.UIScale.SMALL else 40) + xextra + smlh = (190 if uiscale is bui.UIScale.SMALL else 225) + xextra tscl = 1.0 if uiscale is bui.UIScale.SMALL else 1.2 self._my_replays_watch_replay_button = btn1 = bui.buttonwidget( parent=cnt, @@ -281,7 +302,7 @@ class WatchWindow(bui.Window): ) bui.widget(edit=btn1, up_widget=self._tab_row.tabs[tab_id].button) assert bui.app.classic is not None - if uiscale is bui.UIScale.SMALL and bui.app.ui_v1.use_toolbars: + if uiscale is bui.UIScale.SMALL: bui.widget( edit=btn1, left_widget=bui.get_special_widget('back_button'), @@ -350,6 +371,10 @@ class WatchWindow(bui.Window): return bui.increment_analytics_count('Replay watch') + # Save our place in the UI so we return there when done. + if bui.app.classic is not None: + bui.app.classic.save_ui_state() + def do_it() -> None: try: # Reset to normal speed. @@ -357,7 +382,7 @@ class WatchWindow(bui.Window): bui.fade_screen(True) assert self._my_replay_selected is not None bs.new_replay_session( - bui.get_replays_dir() + '/' + self._my_replay_selected + f'{bui.get_replays_dir()}/{self._my_replay_selected}' ) except Exception: logging.exception('Error running replay session.') @@ -611,8 +636,6 @@ class WatchWindow(bui.Window): logging.exception('Error saving state for %s.', self) def _restore_state(self) -> None: - from efro.util import enum_by_value - try: sel: bui.Widget | None assert bui.app.classic is not None @@ -621,9 +644,7 @@ class WatchWindow(bui.Window): ) assert isinstance(sel_name, (str, type(None))) try: - current_tab = enum_by_value( - self.TabID, bui.app.config.get('Watch Tab') - ) + current_tab = self.TabID(bui.app.config.get('Watch Tab')) except ValueError: current_tab = self.TabID.MY_REPLAYS self._set_tab(current_tab) @@ -634,9 +655,7 @@ class WatchWindow(bui.Window): sel = self._tab_container elif isinstance(sel_name, str) and sel_name.startswith('Tab:'): try: - sel_tab_id = enum_by_value( - self.TabID, sel_name.split(':')[-1] - ) + sel_tab_id = self.TabID(sel_name.split(':')[-1]) except ValueError: sel_tab_id = self.TabID.MY_REPLAYS sel = self._tab_row.tabs[sel_tab_id].button @@ -648,20 +667,3 @@ class WatchWindow(bui.Window): bui.containerwidget(edit=self._root_widget, selected_child=sel) except Exception: logging.exception('Error restoring state for %s.', self) - - def _back(self) -> None: - from bauiv1lib.mainmenu import MainMenuWindow - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - assert bui.app.classic is not None - bui.app.ui_v1.set_main_menu_window( - MainMenuWindow(transition='in_left').get_root_widget(), - from_window=self._root_widget, - ) diff --git a/dist/ba_data/python/efro/call.py b/dist/ba_data/python/efro/call.py index 66b0f01..11a5dbd 100644 --- a/dist/ba_data/python/efro/call.py +++ b/dist/ba_data/python/efro/call.py @@ -4,14 +4,94 @@ from __future__ import annotations -import functools -from typing import TYPE_CHECKING +import weakref +import threading +from typing import TYPE_CHECKING, TypeVar, Generic + +T = TypeVar('T') if TYPE_CHECKING: - pass + from typing import Callable -# TODO: should deprecate tpartial since it nowadays simply wraps -# functools.partial (mypy added support for functools.partial in 1.11 so -# there's no benefit to rolling our own type-safe version anymore). -# Perhaps we can use Python 13's @warnings.deprecated() stuff for this. -tpartial = functools.partial + +class CallbackSet(Generic[T]): + """A simple way to manage a set of callbacks. + + Any number of calls can be registered with a callback set. Each + registration results in a Registration object that can be used to + deregister the call from the set later. Callbacks are also + implicitly deregistered when an entry is deallocated, so make sure + to hold on to the return value when adding. + + CallbackSet instances should be used from a single thread only + (this will be checked in debug mode). + """ + + def __init__(self) -> None: + self._entries: list[weakref.ref[CallbackRegistration[T]]] = [] + self.thread: threading.Thread + if __debug__: + self.thread = threading.current_thread() + + def register(self, call: T) -> CallbackRegistration[T]: + """Register a new callback.""" + assert threading.current_thread() == self.thread + + self._prune() + + entry = CallbackRegistration(call, self) + self._entries.append(weakref.ref(entry)) + return entry + + def getcalls(self) -> list[T]: + """Return the current set of registered calls. + + Note that this returns a flattened list of calls; generally this + should protect against calls which themselves add or remove + callbacks. + """ + assert threading.current_thread() == self.thread + + self._prune() + + # Ignore calls that have been deallocated or explicitly + # deregistered. + entries = [e() for e in self._entries] + return [e.call for e in entries if e is not None and e.call is not None] + + def _prune(self) -> None: + + # Quick-out if all our entries are intact. + needs_prune = False + for entry in self._entries: + entrytarget = entry() + if entrytarget is None or entrytarget.call is None: + needs_prune = True + break + if not needs_prune: + return + + # Ok; something needs pruning. Rebuild the entries list. + newentries: list[weakref.ref[CallbackRegistration[T]]] = [] + for entry in self._entries: + entrytarget = entry() + if entrytarget is not None and entrytarget.call is not None: + newentries.append(entry) + self._entries = newentries + + +class CallbackRegistration(Generic[T]): + """An entry for a callback set.""" + + def __init__(self, call: T, callbackset: CallbackSet[T]) -> None: + self.call: T | None = call + self.callbackset: CallbackSet[T] | None = callbackset + + def deregister(self) -> None: + """Explicitly remove a callback from a CallbackSet.""" + assert ( + self.callbackset is None + or threading.current_thread() == self.callbackset.thread + ) + # Simply clear the call to mark us as dead. + self.call = None diff --git a/dist/ba_data/python/efro/dataclassio/_api.py b/dist/ba_data/python/efro/dataclassio/_api.py index 7475cba..d494c6d 100644 --- a/dist/ba_data/python/efro/dataclassio/_api.py +++ b/dist/ba_data/python/efro/dataclassio/_api.py @@ -99,18 +99,20 @@ def dataclass_to_json( def dataclass_from_dict( cls: type[T], values: dict, + *, codec: Codec = Codec.JSON, coerce_to_float: bool = True, allow_unknown_attrs: bool = True, discard_unknown_attrs: bool = False, + lossy: bool = False, ) -> T: """Given a dict, return a dataclass of a given type. The dict must be formatted to match the specified codec (generally json-friendly object types). This means that sequence values such as tuples or sets should be passed as lists, enums should be passed as - their associated values, nested dataclasses should be passed as dicts, - etc. + their associated values, nested dataclasses should be passed as + dicts, etc. All values are checked to ensure their types/values are valid. @@ -120,14 +122,22 @@ def dataclass_from_dict( (as this would break the ability to do a lossless round-trip with data). - If coerce_to_float is True, int values passed for float typed fields - will be converted to float values. Otherwise, a TypeError is raised. + If `coerce_to_float` is True, int values passed for float typed + fields will be converted to float values. Otherwise, a TypeError is + raised. - If `allow_unknown_attrs` is False, AttributeErrors will be raised for - attributes present in the dict but not on the data class. Otherwise, - they will be preserved as part of the instance and included if it is - exported back to a dict, unless `discard_unknown_attrs` is True, in - which case they will simply be discarded. + If 'allow_unknown_attrs' is False, AttributeErrors will be raised + for attributes present in the dict but not on the data class. + Otherwise, they will be preserved as part of the instance and + included if it is exported back to a dict, unless + `discard_unknown_attrs` is True, in which case they will simply be + discarded. + + If `lossy` is True, Enum attrs and IOMultiType types are allowed to + use any fallbacks defined for them. This can allow older schemas to + successfully load newer data, but this can fundamentally modify the + data, so the resulting object is flagged as 'lossy' and prevented + from being serialized back out by default. """ val = _Inputter( cls, @@ -135,6 +145,7 @@ def dataclass_from_dict( coerce_to_float=coerce_to_float, allow_unknown_attrs=allow_unknown_attrs, discard_unknown_attrs=discard_unknown_attrs, + lossy=lossy, ).run(values) assert isinstance(val, cls) return val @@ -143,9 +154,11 @@ def dataclass_from_dict( def dataclass_from_json( cls: type[T], json_str: str, + *, coerce_to_float: bool = True, allow_unknown_attrs: bool = True, discard_unknown_attrs: bool = False, + lossy: bool = False, ) -> T: """Return a dataclass instance given a json string. @@ -158,6 +171,7 @@ def dataclass_from_json( coerce_to_float=coerce_to_float, allow_unknown_attrs=allow_unknown_attrs, discard_unknown_attrs=discard_unknown_attrs, + lossy=lossy, ) diff --git a/dist/ba_data/python/efro/dataclassio/_base.py b/dist/ba_data/python/efro/dataclassio/_base.py index 246b04e..191119d 100644 --- a/dist/ba_data/python/efro/dataclassio/_base.py +++ b/dist/ba_data/python/efro/dataclassio/_base.py @@ -24,6 +24,11 @@ SIMPLE_TYPES = {int, bool, str, float, type(None)} # present. EXTRA_ATTRS_ATTR = '_DCIOEXATTRS' +# Attr name for a bool attr for flagging data as lossy, which means it +# may have been modified in some way during load and should generally not +# be written back out. +LOSSY_ATTR = '_DCIOLOSSY' + class Codec(Enum): """Specifies expected data format exported to or imported from.""" @@ -127,42 +132,68 @@ class IOMultiType(Generic[EnumT]): The default is an obscure value so that it does not conflict with members of individual type attrs, but in some cases one - might prefer to serialize it to something simpler like 'type' - by overriding this call. One just needs to make sure that no + might prefer to serialize it to something simpler like 'type' by + overriding this call. One just needs to make sure that no encompassed types serialize anything to 'type' themself. """ return '_dciotype' + # NOTE: Currently (Jan 2025) mypy complains if overrides annotate + # return type of 'Self | None'. Substituting their own explicit type + # works though (see test_dataclassio). + @classmethod + def get_unknown_type_fallback(cls) -> Self | None: + """Return a fallback object in cases of unrecognized types. + + This can allow newer data to remain readable in older + environments. Use caution with this option, however, as it + effectively modifies data. + """ + return None + class IOAttrs: """For specifying io behavior in annotations. 'storagename', if passed, is the name used when storing to json/etc. - 'store_default' can be set to False to avoid writing values when equal - to the default value. Note that this requires the dataclass field - to define a default or default_factory or for its IOAttrs to - define a soft_default value. + + 'store_default' can be set to False to avoid writing values when + equal to the default value. Note that this requires the + dataclass field to define a default or default_factory or for + its IOAttrs to define a soft_default value. + 'whole_days', if True, requires datetime values to be exactly on day boundaries (see efro.util.utc_today()). - 'whole_hours', if True, requires datetime values to lie exactly on hour - boundaries (see efro.util.utc_this_hour()). - 'whole_minutes', if True, requires datetime values to lie exactly on minute - boundaries (see efro.util.utc_this_minute()). + + 'whole_hours', if True, requires datetime values to lie exactly on + hour boundaries (see efro.util.utc_this_hour()). + + 'whole_minutes', if True, requires datetime values to lie exactly on + minute boundaries (see efro.util.utc_this_minute()). + 'soft_default', if passed, injects a default value into dataclass instantiation when the field is not present in the input data. This allows dataclasses to add new non-optional fields while - gracefully 'upgrading' old data. Note that when a soft_default is - present it will take precedence over field defaults when determining - whether to store a value for a field with store_default=False - (since the soft_default value is what we'll get when reading that - same data back in when the field is omitted). + gracefully 'upgrading' old data. Note that when a soft_default + is present it will take precedence over field defaults when + determining whether to store a value for a field with + store_default=False (since the soft_default value is what we'll + get when reading that same data back in when the field is + omitted). + 'soft_default_factory' is similar to 'default_factory' in dataclass - fields; it should be used instead of 'soft_default' for mutable types - such as lists to prevent a single default object from unintentionally - changing over time. + fields; it should be used instead of 'soft_default' for mutable + types such as lists to prevent a single default object from + unintentionally changing over time. + + 'enum_fallback', if provided, specifies an enum value that can be + substituted in the case of unrecognized input values. This can + allow newer data to remain loadable in older environments. Note + that 'lossy' must be enabled in the top level load call for this + to apply, since it can fundamentally modify data. """ - # A sentinel object to detect if a parameter is supplied or not. Use + # A sentinel object to detect if a parameter is supplied or not. Use # a class to give it a better repr. class _MissingType: pass @@ -176,16 +207,19 @@ class IOAttrs: whole_minutes: bool = False soft_default: Any = MISSING soft_default_factory: Callable[[], Any] | _MissingType = MISSING + enum_fallback: Enum | None = None def __init__( self, storagename: str | None = storagename, + *, store_default: bool = store_default, whole_days: bool = whole_days, whole_hours: bool = whole_hours, whole_minutes: bool = whole_minutes, soft_default: Any = MISSING, soft_default_factory: Callable[[], Any] | _MissingType = MISSING, + enum_fallback: Enum | None = None, ): # Only store values that differ from class defaults to keep # our instances nice and lean. @@ -215,6 +249,8 @@ class IOAttrs: raise ValueError( 'Cannot set both soft_default and soft_default_factory' ) + if enum_fallback is not cls.enum_fallback: + self.enum_fallback = enum_fallback def validate_for_field(self, cls: type, field: dataclasses.Field) -> None: """Ensure the IOAttrs instance is ok to use with the provided field.""" diff --git a/dist/ba_data/python/efro/dataclassio/_inputter.py b/dist/ba_data/python/efro/dataclassio/_inputter.py index e913816..597d2f9 100644 --- a/dist/ba_data/python/efro/dataclassio/_inputter.py +++ b/dist/ba_data/python/efro/dataclassio/_inputter.py @@ -15,11 +15,12 @@ import types import datetime from typing import TYPE_CHECKING -from efro.util import enum_by_value, check_utc +from efro.util import check_utc from efro.dataclassio._base import ( Codec, _parse_annotated, EXTRA_ATTRS_ATTR, + LOSSY_ATTR, _is_valid_for_codec, _get_origin, SIMPLE_TYPES, @@ -41,10 +42,12 @@ class _Inputter: def __init__( self, cls: type[Any], + *, codec: Codec, coerce_to_float: bool, allow_unknown_attrs: bool = True, discard_unknown_attrs: bool = False, + lossy: bool = False, ): self._cls = cls self._codec = codec @@ -52,6 +55,7 @@ class _Inputter: self._allow_unknown_attrs = allow_unknown_attrs self._discard_unknown_attrs = discard_unknown_attrs self._soft_default_validator: _Outputter | None = None + self._lossy = lossy if not allow_unknown_attrs and discard_unknown_attrs: raise ValueError( @@ -65,11 +69,12 @@ class _Inputter: outcls: type[Any] # If we're dealing with a multi-type subclass which is NOT a - # dataclass, we must rely on its stored type to figure out - # what type of dataclass we're going to. If we are a dataclass - # then we already know what type we're going to so we can - # survive without this, which is often necessary when reading - # old data that doesn't have a type id attr yet. + # dataclass (generally a custom multitype base class), then we + # must rely on its stored type enum to figure out what type of + # dataclass we're going to create. If we *are* dealing with a + # dataclass then we already know what type we're going to so we + # can survive without this, which is often necessary when + # reading old data that doesn't have a type id attr yet. if issubclass(self._cls, IOMultiType) and not dataclasses.is_dataclass( self._cls ): @@ -80,7 +85,40 @@ class _Inputter: f' {values}.' ) type_id_enum = self._cls.get_type_id_type() - enum_val = type_id_enum(type_id_val) + try: + enum_val = type_id_enum(type_id_val) + except ValueError as exc: + + # Check the fallback even if not in lossy mode, as we + # inform the user of its existence in errors in that + # case. + fallback = self._cls.get_unknown_type_fallback() + + # Sanity check that fallback is correct type. + assert isinstance(fallback, self._cls | None) + + # If we're in lossy mode, provide the fallback value. + if self._lossy: + if fallback is not None: + # Ok; they provided a fallback. Flag it as lossy + # to prevent it from being written back out by + # default, and return it. + setattr(fallback, LOSSY_ATTR, True) + return fallback + else: + # If we're *not* in lossy mode, inform the user if + # we *would* have succeeded if we were. This is + # useful for debugging these sorts of situations. + if fallback is not None: + raise ValueError( + 'Failed loading unrecognized multitype object.' + ' Note that the multitype provides a fallback' + ' and thus would succeed in lossy mode.' + ) from exc + + # Otherwise the error stands as-is. + raise + outcls = self._cls.get_type(enum_val) else: outcls = self._cls @@ -99,6 +137,17 @@ class _Inputter: if is_ext: out.did_input() + # If we're running in lossy mode, flag the object as such so we + # don't allow writing it back out and potentially accidentally + # losing data. + # + # FIXME - We are currently only flagging this at the top level, + # but this will not prevent sub-objects from being written out. + # Is that worth worrying about? Though perfect is the enemy of + # good I suppose. + if self._lossy: + setattr(out, LOSSY_ATTR, True) + return out def _value_from_input( @@ -110,6 +159,7 @@ class _Inputter: ioattrs: IOAttrs | None, ) -> Any: """Convert an assigned value to what a dataclass field expects.""" + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-return-statements # pylint: disable=too-many-branches @@ -181,14 +231,29 @@ class _Inputter: # dataclass (all dataclasses inheriting from the multi-type # should just be processed as dataclasses). if issubclass(origin, IOMultiType): - return self._dataclass_from_input( - _get_multitype_type(anntype, fieldpath, value), - fieldpath, - value, - ) + return self._multitype_obj(anntype, fieldpath, value) if issubclass(origin, Enum): - return enum_by_value(origin, value) + try: + return origin(value) + except ValueError as exc: + # If a fallback enum was provided in ioattrs AND we're + # in lossy mode, return that for unrecognized values. If + # one was provided but we're *not* in lossy mode, note + # that we could have loaded it if lossy mode was + # enabled. + if ioattrs is not None and ioattrs.enum_fallback is not None: + # Sanity check; make sure fallback is valid. + assert type(ioattrs.enum_fallback) is origin + if self._lossy: + return ioattrs.enum_fallback + raise ValueError( + 'Failed to load Enum. Note that it has a fallback' + ' value and thus would succeed in lossy mode.' + ) from exc + + # Otherwise the error stands as-is. + raise if issubclass(origin, datetime.datetime): return self._datetime_from_input(cls, fieldpath, value, ioattrs) @@ -232,16 +297,17 @@ class _Inputter: """Given a dict, instantiates a dataclass of the given type. The dict must be in the json-friendly format as emitted from - dataclass_to_dict. This means that sequence values such as tuples or - sets should be passed as lists, enums should be passed as their - associated values, and nested dataclasses should be passed as dicts. + dataclass_to_dict. This means that sequence values such as + tuples or sets should be passed as lists, enums should be passed + as their associated values, and nested dataclasses should be + passed as dicts. """ try: return self._do_dataclass_from_input(cls, fieldpath, values) except Exception as exc: - # Extended data types can choose to sub default data in case - # of failures (generally not a good idea but occasionally - # useful). + # Extended data types can choose to substitute default data + # in case of failures (generally not a good idea but + # occasionally useful). if issubclass(cls, IOExtendedData): fallback = cls.handle_input_error(exc) if fallback is None: @@ -293,8 +359,8 @@ class _Inputter: # However we do want to make sure the class we're loading # doesn't itself use this same name, as this could lead to # tricky breakage. We can't verify this for types at prep - # time because IOMultiTypes are lazy-loaded, so this is - # the best we can do. + # time because IOMultiTypes are lazy-loaded, so this is the + # best we can do. if type_id_store_name in fields_by_name: raise RuntimeError( f"{cls} contains a '{type_id_store_name}' field" @@ -413,6 +479,7 @@ class _Inputter: value: Any, ioattrs: IOAttrs | None, ) -> Any: + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-branches # pylint: disable=too-many-locals @@ -491,7 +558,7 @@ class _Inputter: if enumvaltype is str: for key, val in value.items(): try: - enumval = enum_by_value(keyanntype, key) + enumval = keyanntype(key) except ValueError as exc: raise ValueError( f'Got invalid key value {key} for' @@ -506,7 +573,7 @@ class _Inputter: else: for key, val in value.items(): try: - enumval = enum_by_value(keyanntype, int(key)) + enumval = keyanntype(int(key)) except (ValueError, TypeError) as exc: raise ValueError( f'Got invalid key value {key} for' @@ -533,6 +600,7 @@ class _Inputter: seqtype: type, ioattrs: IOAttrs | None, ) -> Any: + # pylint: disable=too-many-positional-arguments # Because we are json-centric, we expect a list for all sequences. if type(value) is not list: raise TypeError( @@ -561,12 +629,7 @@ class _Inputter: # values to determine which type to load for each element. if issubclass(childanntype, IOMultiType): return seqtype( - self._dataclass_from_input( - _get_multitype_type(childanntype, fieldpath, i), - fieldpath, - i, - ) - for i in value + self._multitype_obj(childanntype, fieldpath, i) for i in value ) return seqtype( @@ -574,6 +637,21 @@ class _Inputter: for i in value ) + def _multitype_obj(self, anntype: Any, fieldpath: str, value: Any) -> Any: + try: + mttype = _get_multitype_type(anntype, fieldpath, value) + except ValueError: + if self._lossy: + out = anntype.get_unknown_type_fallback() + if out is not None: + # Ok; they provided a fallback. Make sure its of our + # expected type and return it. + assert isinstance(out, anntype) + return out + raise + + return self._dataclass_from_input(mttype, fieldpath, value) + def _tuple_from_input( self, cls: type, @@ -582,6 +660,7 @@ class _Inputter: value: Any, ioattrs: IOAttrs | None, ) -> Any: + # pylint: disable=too-many-positional-arguments out: list = [] # Because we are json-centric, we expect a list for all sequences. diff --git a/dist/ba_data/python/efro/dataclassio/_outputter.py b/dist/ba_data/python/efro/dataclassio/_outputter.py index 1ca3118..e3404bd 100644 --- a/dist/ba_data/python/efro/dataclassio/_outputter.py +++ b/dist/ba_data/python/efro/dataclassio/_outputter.py @@ -21,6 +21,7 @@ from efro.dataclassio._base import ( Codec, _parse_annotated, EXTRA_ATTRS_ATTR, + LOSSY_ATTR, _is_valid_for_codec, _get_origin, SIMPLE_TYPES, @@ -40,6 +41,7 @@ class _Outputter: def __init__( self, obj: Any, + *, create: bool, codec: Codec, coerce_to_float: bool, @@ -60,6 +62,14 @@ class _Outputter: # isinstance call below fails. assert dataclasses.is_dataclass(self._obj) + # If this data has been flagged as lossy, don't allow outputting + # it. This hopefully helps avoid unintentional data + # modification/loss. + if getattr(obj, LOSSY_ATTR, False): + raise ValueError( + 'Object has been flagged as lossy; output is disallowed.' + ) + # For special extended data types, call their 'will_output' callback. # FIXME - should probably move this into _process_dataclass so it # can work on nested values. @@ -192,6 +202,7 @@ class _Outputter: value: Any, ioattrs: IOAttrs | None, ) -> Any: + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-return-statements # pylint: disable=too-many-branches # pylint: disable=too-many-statements @@ -393,7 +404,8 @@ class _Outputter: ), key=( None - if childanntypes[0] in [str, int, float, bool] + if childanntypes[0] + in [str, int, float, bool, datetime.datetime] else lambda v: json.dumps(v, sort_keys=True) ), ) @@ -511,6 +523,7 @@ class _Outputter: value: dict, ioattrs: IOAttrs | None, ) -> Any: + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-branches if not isinstance(value, dict): raise TypeError( diff --git a/dist/ba_data/python/efro/dataclassio/_prep.py b/dist/ba_data/python/efro/dataclassio/_prep.py index 8321dbd..1f1e41c 100644 --- a/dist/ba_data/python/efro/dataclassio/_prep.py +++ b/dist/ba_data/python/efro/dataclassio/_prep.py @@ -185,7 +185,7 @@ class PrepSession: # which allows us to pick up nested classes, etc. resolved_annotations = get_type_hints( cls, - localns=vars(cls), # type: ignore[arg-type] + localns=vars(cls), globalns=self.globalns, include_extras=True, ) @@ -261,6 +261,7 @@ class PrepSession: recursion_level: int, ) -> None: """Run prep on a dataclass.""" + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-return-statements # pylint: disable=too-many-branches # pylint: disable=too-many-statements @@ -361,7 +362,7 @@ class PrepSession: pass elif issubclass(childtypes[0], Enum): # Allow our usual str or int enum types as keys. - self.prep_enum(childtypes[0]) + self.prep_enum(childtypes[0], ioattrs=None) else: raise TypeError( f'Dict key type {childtypes[0]} for \'{attrname}\'' @@ -411,7 +412,7 @@ class PrepSession: return if issubclass(origin, Enum): - self.prep_enum(origin) + self.prep_enum(origin, ioattrs=ioattrs) return # We allow datetime objects (and google's extended subclass of @@ -461,7 +462,11 @@ class PrepSession: recursion_level=recursion_level + 1, ) - def prep_enum(self, enumtype: type[Enum]) -> None: + def prep_enum( + self, + enumtype: type[Enum], + ioattrs: IOAttrs | None, + ) -> None: """Run prep on an enum type.""" valtype: Any = None @@ -484,3 +489,13 @@ class PrepSession: f' value types; dataclassio requires' f' them to be uniform.' ) + + if ioattrs is not None: + # If they provided a fallback enum value, make sure it + # is the correct type. + if ioattrs.enum_fallback is not None: + if type(ioattrs.enum_fallback) is not enumtype: + raise TypeError( + f'enum_fallback {ioattrs.enum_fallback} does not' + f' match the field type ({enumtype}.' + ) diff --git a/dist/ba_data/python/efro/dataclassio/templatemultitype.py b/dist/ba_data/python/efro/dataclassio/templatemultitype.py new file mode 100644 index 0000000..9e91853 --- /dev/null +++ b/dist/ba_data/python/efro/dataclassio/templatemultitype.py @@ -0,0 +1,63 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Template for an IOMultitype setup. + +To use this template, simply copy the contents of this module somewhere +and then replace 'TemplateMultiType' with 'YourType'. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, assert_never, override + +from enum import Enum +from dataclasses import dataclass + +from efro.dataclassio import ioprepped, IOMultiType + +if TYPE_CHECKING: + pass + + +class TemplateMultiTypeTypeID(Enum): + """Type ID for each of our subclasses.""" + + TEST = 'test' + + +class TemplateMultiType(IOMultiType[TemplateMultiTypeTypeID]): + """Top level class for our multitype.""" + + @override + @classmethod + def get_type_id(cls) -> TemplateMultiTypeTypeID: + # Require child classes to supply this themselves. If we did a + # full type registry/lookup here it would require us to import + # everything and would prevent lazy loading. + raise NotImplementedError() + + @override + @classmethod + def get_type( + cls, type_id: TemplateMultiTypeTypeID + ) -> type[TemplateMultiType]: + """Return the subclass for each of our type-ids.""" + # pylint: disable=cyclic-import + + t = TemplateMultiTypeTypeID + if type_id is t.TEST: + return Test + + # Important to make sure we provide all types. + assert_never(type_id) + + +@ioprepped +@dataclass +class Test(TemplateMultiType): + """Just a test.""" + + @override + @classmethod + def get_type_id(cls) -> TemplateMultiTypeTypeID: + return TemplateMultiTypeTypeID.TEST diff --git a/dist/ba_data/python/efro/debug.py b/dist/ba_data/python/efro/debug.py index 01a3f77..6afeb65 100644 --- a/dist/ba_data/python/efro/debug.py +++ b/dist/ba_data/python/efro/debug.py @@ -312,6 +312,7 @@ def _desc(obj: Any) -> str: def _printrefs( obj: Any, + *, level: int, max_level: int, exclude_objs: list, diff --git a/dist/ba_data/python/efro/error.py b/dist/ba_data/python/efro/error.py index fed4252..791fe2c 100644 --- a/dist/ba_data/python/efro/error.py +++ b/dist/ba_data/python/efro/error.py @@ -9,6 +9,7 @@ import errno if TYPE_CHECKING: from typing import Any + import urllib3.response from efro.terminal import ClrBase @@ -105,6 +106,79 @@ class AuthenticationError(Exception): """ +class _Urllib3HttpError(Exception): + """Exception raised for non-200 html codes.""" + + def __init__(self, code: int) -> None: + self.code = code + + # So we can see code in tracebacks. + @override + def __str__(self) -> str: + from http import HTTPStatus + + try: + desc = HTTPStatus(self.code).description + except ValueError: + desc = 'Unknown HTTP Status Code' + return f'{self.code}: {desc}' + + +def raise_for_urllib3_status( + response: urllib3.response.BaseHTTPResponse, +) -> None: + """Raise an exception for html error codes aside from 200.""" + if response.status != 200: + raise _Urllib3HttpError(code=response.status) + + +def is_urllib3_communication_error(exc: BaseException, url: str | None) -> bool: + """Is the provided exception from urllib3 a communication-related error? + + Url, if provided, can provide extra context for when to treat an error + as such an error. + + This should be passed an exception which resulted from making + requests with urllib3. It returns True for any errors that could + conceivably arise due to unavailable/poor network connections, + firewall/connectivity issues, or other issues out of our control. + These errors can often be safely ignored or presented to the user as + general 'network-unavailable' states. + """ + # Need to start building these up. For now treat everything as a + # real error. + import urllib3.exceptions + + # If this error is from hitting max-retries, look at the underlying + # error instead. + if isinstance(exc, urllib3.exceptions.MaxRetryError): + # Hmm; will a max-retry error ever not have an underlying error? + if exc.reason is None: + return False + exc = exc.reason + + if isinstance(exc, _Urllib3HttpError): + # Special sub-case: appspot.com hosting seems to give 403 errors + # (forbidden) to some countries. I'm assuming for legal reasons?.. + # Let's consider that a communication error since its out of our + # control so we don't fill up logs with it. + if exc.code == 403 and url is not None and '.appspot.com' in url: + return True + + elif isinstance(exc, urllib3.exceptions.ReadTimeoutError): + return True + + elif isinstance(exc, urllib3.exceptions.ProtocolError): + # Most protocol errors quality as CommunicationErrors, but some + # may be due to server misconfigurations or whatnot so let's + # take it on a case by case basis. + excstr = str(exc) + if 'Connection aborted.' in excstr: + return True + + return False + + def is_urllib_communication_error(exc: BaseException, url: str | None) -> bool: """Is the provided exception from urllib a communication-related error? @@ -251,6 +325,11 @@ def is_asyncio_streams_communication_error(exc: BaseException) -> bool: if 'SSL: WRONG_VERSION_NUMBER' in excstr: return True + # Also getting this sometimes which sounds like corrupt SSL data + # or something. + if 'SSL: BAD_RECORD_TYPE' in excstr: + return True + # And seeing this very rarely; assuming its just data corruption? if 'SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC' in excstr: return True diff --git a/dist/ba_data/python/efro/log.py b/dist/ba_data/python/efro/logging.py similarity index 81% rename from dist/ba_data/python/efro/log.py rename to dist/ba_data/python/efro/logging.py index 3e1326c..40fd984 100644 --- a/dist/ba_data/python/efro/log.py +++ b/dist/ba_data/python/efro/logging.py @@ -17,12 +17,12 @@ from typing import TYPE_CHECKING, Annotated, override from threading import Thread, current_thread, Lock from efro.util import utc_now -from efro.terminal import Clr +from efro.terminal import Clr, color_enabled from efro.dataclassio import ioprepped, IOAttrs, dataclass_to_json if TYPE_CHECKING: from pathlib import Path - from typing import Any, Callable, TextIO + from typing import Any, Callable, TextIO, Literal class LogLevel(Enum): @@ -126,23 +126,26 @@ class LogHandler(logging.Handler): def __init__( self, + *, path: str | Path | None, echofile: TextIO | None, - suppress_non_root_debug: bool, cache_size_limit: int, cache_time_limit: datetime.timedelta | None, + echofile_timestamp_format: Literal['default', 'relative'] = 'default', + launch_time: float | None = None, ): super().__init__() # pylint: disable=consider-using-with self._file = None if path is None else open(path, 'w', encoding='utf-8') self._echofile = echofile + self._echofile_timestamp_format = echofile_timestamp_format self._callbacks: list[Callable[[LogEntry], None]] = [] - self._suppress_non_root_debug = suppress_non_root_debug self._file_chunks: dict[str, list[str]] = {'stdout': [], 'stderr': []} self._file_chunk_ship_task: dict[str, asyncio.Task | None] = { 'stdout': None, 'stderr': None, } + self._launch_time = time.time() if launch_time is None else launch_time self._cache_size = 0 assert cache_size_limit >= 0 self._cache_size_limit = cache_size_limit @@ -158,8 +161,8 @@ class LogHandler(logging.Handler): self._thread.start() # Spin until our thread is up and running; otherwise we could - # wind up trying to push stuff to our event loop before the - # loop exists. + # wind up trying to push stuff to our event loop before the loop + # exists. while not self._thread_bootstrapped: time.sleep(0.001) @@ -234,8 +237,8 @@ class LogHandler(logging.Handler): await asyncio.sleep(61.27) now = utc_now() with self._cache_lock: - # Prune the oldest entry as long as there is a first one that - # is too old. + # Prune the oldest entry as long as there is a first one + # that is too old. while ( self._cache and (now - self._cache[0][1].time) >= self._cache_time_limit @@ -251,9 +254,9 @@ class LogHandler(logging.Handler): This will only include entries that have been processed by the background thread, so may not include just-submitted logs or - entries for partially written stdout/stderr lines. - Entries from the range [start_index:start_index+max_entries] - which are still present in the cache will be returned. + entries for partially written stdout/stderr lines. Entries from + the range [start_index:start_index+max_entries] which are still + present in the cache will be returned. """ assert start_index >= 0 @@ -282,11 +285,11 @@ class LogHandler(logging.Handler): def _cache_slice( self, start: int, end: int, step: int = 1 ) -> list[LogEntry]: - # Deque doesn't natively support slicing but we can do it manually. - # It sounds like rotating the deque and pulling from the beginning - # is the most efficient way to do this. The downside is the deque - # gets temporarily modified in the process so we need to make sure - # we're holding the lock. + # Deque doesn't natively support slicing but we can do it + # manually. It sounds like rotating the deque and pulling from + # the beginning is the most efficient way to do this. The + # downside is the deque gets temporarily modified in the process + # so we need to make sure we're holding the lock. assert self._cache_lock.locked() cache = self._cache cache.rotate(-start) @@ -309,25 +312,19 @@ class LogHandler(logging.Handler): @override def emit(self, record: logging.LogRecord) -> None: # pylint: disable=too-many-branches + # pylint: disable=too-many-locals + if __debug__: starttime = time.monotonic() # Called by logging to send us records. - # TODO - kill this. - if ( - self._suppress_non_root_debug - and record.name != 'root' - and record.levelname == 'DEBUG' - ): - return - # Optimization: if our log args are all simple immutable values, - # we can just kick the whole thing over to our background thread to - # be formatted there at our leisure. If anything is mutable and - # thus could possibly change between now and then or if we want - # to do immediate file echoing then we need to bite the bullet - # and do that stuff here at the call site. + # we can just kick the whole thing over to our background thread + # to be formatted there at our leisure. If anything is mutable + # and thus could possibly change between now and then or if we + # want to do immediate file echoing then we need to bite the + # bullet and do that stuff here at the call site. fast_path = self._echofile is None and self._is_immutable_log_data( record.args ) @@ -359,37 +356,39 @@ class LogHandler(logging.Handler): if __debug__: formattime = time.monotonic() - # Also immediately print pretty colored output to our echo file - # (generally stderr). We do this part here instead of in our bg - # thread because the delay can throw off command line prompts or - # make tight debugging harder. + # Also immediately print pretty colored output to our echo + # file (generally stderr). We do this part here instead of + # in our bg thread because the delay can throw off command + # line prompts or make tight debugging harder. if self._echofile is not None: - # try: - # if self._report_blocking_io_on_echo_error: - # premsg = ( - # 'WARNING: BlockingIOError ON LOG ECHO OUTPUT;' - # ' YOU ARE PROBABLY MISSING LOGS\n' - # ) - # self._report_blocking_io_on_echo_error = False - # else: - # premsg = '' - ends = LEVELNO_COLOR_CODES.get(record.levelno) - namepre = f'{Clr.WHT}{record.name}:{Clr.RST} ' - if ends is not None: - self._echofile.write( - f'{namepre}{ends[0]}' - f'{msg}{ends[1]}\n' - # f'{namepre}{ends[0]}' f'{premsg}{msg}{ends[1]}\n' - ) + if self._echofile_timestamp_format == 'relative': + timestamp = f'{record.created - self._launch_time:.3f}' else: - self._echofile.write(f'{namepre}{msg}\n') + timestamp = ( + datetime.datetime.fromtimestamp( + record.created, tz=datetime.UTC + ).strftime('%H:%M:%S') + + f'.{int(record.msecs):03d}' + ) + + # If color printing is disabled, show level through text + # instead of color. + lvlnameex = ( + '' + if color_enabled + else f' {logging.getLevelName(record.levelno)}' + ) + + preinfo = ( + f'{Clr.WHT}{timestamp}{lvlnameex} {record.name}:' + f'{Clr.RST} ' + ) + ends = LEVELNO_COLOR_CODES.get(record.levelno) + if ends is not None: + self._echofile.write(f'{preinfo}{ends[0]}{msg}{ends[1]}\n') + else: + self._echofile.write(f'{preinfo}{msg}\n') self._echofile.flush() - # except BlockingIOError: - # # Ran into this when doing a bunch of logging; assuming - # # this is asyncio's doing?.. For now trying to survive - # # the error but telling the user something is probably - # # missing in their output. - # self._report_blocking_io_on_echo_error = True if __debug__: echotime = time.monotonic() @@ -407,30 +406,29 @@ class LogHandler(logging.Handler): if __debug__: # pylint: disable=used-before-assignment - # Make noise if we're taking a significant amount of time here. - # Limit the noise to once every so often though; otherwise we - # could get a feedback loop where every log emit results in a - # warning log which results in another, etc. + # + # Make noise if we're taking a significant amount of time + # here. Limit the noise to once every so often though; + # otherwise we could get a feedback loop where every log + # emit results in a warning log which results in another, + # etc. now = time.monotonic() - # noinspection PyUnboundLocalVariable - duration = now - starttime # pyright: ignore - # noinspection PyUnboundLocalVariable - format_duration = formattime - starttime # pyright: ignore - # noinspection PyUnboundLocalVariable - echo_duration = echotime - formattime # pyright: ignore + duration = now - starttime + format_duration = formattime - starttime + echo_duration = echotime - formattime if duration > 0.05 and ( self._last_slow_emit_warning_time is None or now > self._last_slow_emit_warning_time + 10.0 ): - # Logging calls from *within* a logging handler - # sounds sketchy, so let's just kick this over to - # the bg event loop thread we've already got. + # Logging calls from *within* a logging handler sounds + # sketchy, so let's just kick this over to the bg event + # loop thread we've already got. self._last_slow_emit_warning_time = now self._event_loop.call_soon_threadsafe( partial( logging.warning, - 'efro.log.LogHandler emit took too long' - ' (%.2fs total; %.2fs format, %.2fs echo,' + 'efro.logging.LogHandler emit took too long' + ' (%.3fs total; %.3fs format, %.3fs echo,' ' fast_path=%s).', duration, format_duration, @@ -447,6 +445,7 @@ class LogHandler(logging.Handler): message: str | logging.LogRecord, labels: dict[str, str], ) -> None: + # pylint: disable=too-many-positional-arguments try: # If they passed a raw record here, bake it down to a string. if isinstance(message, logging.LogRecord): @@ -489,17 +488,17 @@ class LogHandler(logging.Handler): self._file_chunks[name].append(output) - # Individual parts of a print come across as separate writes, - # and the end of a print will be a standalone '\n' by default. - # Let's use that as a hint that we're likely at the end of - # a full print statement and ship what we've got. + # Individual parts of a print come across as separate + # writes, and the end of a print will be a standalone '\n' + # by default. Let's use that as a hint that we're likely at + # the end of a full print statement and ship what we've got. if output == '\n': self._ship_file_chunks(name, cancel_ship_task=True) else: - # By default just keep adding chunks. - # However we keep a timer running anytime we've got - # unshipped chunks so that we can ship what we've got - # after a short bit if we never get a newline. + # By default just keep adding chunks. However we keep a + # timer running anytime we've got unshipped chunks so + # that we can ship what we've got after a short bit if + # we never get a newline. ship_task = self._file_chunk_ship_task[name] if ship_task is None: self._file_chunk_ship_task[name] = ( @@ -610,6 +609,7 @@ class LogHandler(logging.Handler): self._run_callback_on_entry(call, entry) # Dump to our structured log file. + # # TODO: should set a timer for flushing; don't flush every line. if self._file is not None: entry_s = dataclass_to_json(entry) @@ -642,23 +642,9 @@ class FileLogEcho: self._name = name self._handler = handler - # Think this was a result of setting non-blocking stdin somehow; - # probably not needed. - # self._report_blocking_io_error = False - def write(self, output: Any) -> None: """Override standard write call.""" - # try: - # if self._report_blocking_io_error: - # self._report_blocking_io_error = False - # self._original.write( - # 'WARNING: BlockingIOError ENCOUNTERED;' - # ' OUTPUT IS PROBABLY MISSING' - # ) - self._original.write(output) - # except BlockingIOError: - # self._report_blocking_io_error = True self._handler.file_write(self._name, output) def flush(self) -> None: @@ -678,11 +664,12 @@ class FileLogEcho: def setup_logging( log_path: str | Path | None, level: LogLevel, - suppress_non_root_debug: bool = False, + *, log_stdout_stderr: bool = False, echo_to_stderr: bool = True, cache_size_limit: int = 0, cache_time_limit: datetime.timedelta | None = None, + launch_time: float | None = None, ) -> LogHandler: """Set up our logging environment. @@ -698,34 +685,35 @@ def setup_logging( LogLevel.CRITICAL: logging.CRITICAL, } - # Wire logger output to go to a structured log file. - # Also echo it to stderr IF we're running in a terminal. - # UPDATE: Actually gonna always go to stderr. Is there a - # reason we shouldn't? This makes debugging possible if all - # we have is access to a non-interactive terminal or file dump. - # We could add a '--quiet' arg or whatnot to change this behavior. + # Wire logger output to go to a structured log file. Also echo it to + # stderr IF we're running in a terminal. + # + # UPDATE: Actually gonna always go to stderr. Is there a reason we + # shouldn't? This makes debugging possible if all we have is access + # to a non-interactive terminal or file dump. We could add a + # '--quiet' arg or whatnot to change this behavior. # Note: by passing in the *original* stderr here before we - # (potentially) replace it, we ensure that our log echos - # won't themselves be intercepted and sent to the logger - # which would create an infinite loop. + # (potentially) replace it, we ensure that our log echos won't + # themselves be intercepted and sent to the logger which would + # create an infinite loop. loghandler = LogHandler( - log_path, + path=log_path, echofile=sys.stderr if echo_to_stderr else None, - suppress_non_root_debug=suppress_non_root_debug, + echofile_timestamp_format='relative', cache_size_limit=cache_size_limit, cache_time_limit=cache_time_limit, + launch_time=launch_time, ) # Note: going ahead with force=True here so that we replace any - # existing logger. Though we warn if it looks like we are doing - # that so we can try to avoid creating the first one. + # existing logger. Though we warn if it looks like we are doing that + # so we can try to avoid creating the first one. had_previous_handlers = bool(logging.root.handlers) logging.basicConfig( level=lmap[level], - # format='%(name)s: %(message)s', - # We dump *only* the message here. We pass various log record bits - # around and format things fancier where they end up. + # We dump *only* the message here. We pass various log record + # bits around so we can write rich logs or format things later. format='%(message)s', handlers=[loghandler], force=True, diff --git a/dist/ba_data/python/efro/message/_module.py b/dist/ba_data/python/efro/message/_module.py index 2fa91fa..db96f3b 100644 --- a/dist/ba_data/python/efro/message/_module.py +++ b/dist/ba_data/python/efro/message/_module.py @@ -19,6 +19,7 @@ def create_sender_module( protocol_create_code: str, enable_sync_sends: bool, enable_async_sends: bool, + *, private: bool = False, protocol_module_level_import_code: str | None = None, build_time_protocol_create_code: str | None = None, @@ -61,6 +62,7 @@ def create_receiver_module( basename: str, protocol_create_code: str, is_async: bool, + *, private: bool = False, protocol_module_level_import_code: str | None = None, build_time_protocol_create_code: str | None = None, diff --git a/dist/ba_data/python/efro/message/_protocol.py b/dist/ba_data/python/efro/message/_protocol.py index 928d1fa..8f0c3c3 100644 --- a/dist/ba_data/python/efro/message/_protocol.py +++ b/dist/ba_data/python/efro/message/_protocol.py @@ -42,10 +42,12 @@ class MessageProtocol: self, message_types: dict[int, type[Message]], response_types: dict[int, type[Response]], + *, forward_communication_errors: bool = False, forward_clean_errors: bool = False, remote_errors_include_stack_traces: bool = False, log_errors_on_receiver: bool = True, + log_response_decode_errors: bool = True, ) -> None: """Create a protocol with a given configuration. @@ -77,14 +79,22 @@ class MessageProtocol: goal is usually to avoid returning opaque RemoteErrors and to instead return something meaningful as part of the expected response type (even if that value itself represents a logical - error state). If 'log_errors_on_receiver' is False, however, such - exceptions will *not* be logged on the receiver. This can be - useful in combination with 'remote_errors_include_stack_traces' - and 'forward_clean_errors' in situations where all error - logging/management will be happening on the sender end. Be - aware, however, that in that case it may be possible for - communication errors to prevent such error messages from - ever being seen. + error state). If 'log_errors_on_receiver' is False, however, + such exceptions will *not* be logged on the receiver. This can + be useful in combination with + 'remote_errors_include_stack_traces' and 'forward_clean_errors' + in situations where all error logging/management will be + happening on the sender end. Be aware, however, that in that + case it may be possible for communication errors to prevent some + errors from ever being acknowledged. + + If an error occurs when decoding a message response, a + RuntimeError is generated locally. However, in practice it is + likely for such errors to be silently ignored by message + handling code alongside more common communication type errors, + meaning serious protocol breakage could go unnoticed. To avoid + this, a log message is also printed in such cases. Pass + 'log_response_decode_errors' as False to disable this logging. """ # pylint: disable=too-many-locals self.message_types_by_id: dict[int, type[Message]] = {} @@ -169,6 +179,7 @@ class MessageProtocol: remote_errors_include_stack_traces ) self.log_errors_on_receiver = log_errors_on_receiver + self.log_response_decode_errors = log_response_decode_errors @staticmethod def encode_dict(obj: dict) -> str: @@ -251,7 +262,7 @@ class MessageProtocol: return out def message_from_dict(self, data: dict) -> Message: - """Decode a message from a json string.""" + """Decode a message from a dict.""" out = self._from_dict(data, self.message_types_by_id, 'message') assert isinstance(out, Message) return out @@ -283,7 +294,14 @@ class MessageProtocol: raise UnregisteredMessageIDError( f'Got unregistered {opname} id of {m_id}.' ) - return dataclass_from_dict(msgtype, msgdict) + + # Explicitly allow any fallbacks we define for our enums and + # multitypes. This allows us to build message types that remain + # loadable even when containing unrecognized future + # enums/multitype data. Be aware that this flags the object as + # 'lossy' however which prevents it from being reserialized by + # default. + return dataclass_from_dict(msgtype, msgdict, lossy=True) def _get_module_header( self, @@ -414,6 +432,7 @@ class MessageProtocol: protocol_module_level_import_code: str | None = None, ) -> str: """Used by create_sender_module(); do not call directly.""" + # pylint: disable=too-many-positional-arguments # pylint: disable=too-many-locals # pylint: disable=too-many-branches import textwrap @@ -531,6 +550,7 @@ class MessageProtocol: ) -> str: """Used by create_receiver_module(); do not call directly.""" # pylint: disable=too-many-locals + # pylint: disable=too-many-positional-arguments import textwrap desc = 'asynchronous' if is_async else 'synchronous' diff --git a/dist/ba_data/python/efro/message/_sender.py b/dist/ba_data/python/efro/message/_sender.py index 93cd38f..189c218 100644 --- a/dist/ba_data/python/efro/message/_sender.py +++ b/dist/ba_data/python/efro/message/_sender.py @@ -6,6 +6,7 @@ Supports static typing for message types and possible return types. from __future__ import annotations +import logging from typing import TYPE_CHECKING from efro.error import CleanError, RemoteError, CommunicationError @@ -369,6 +370,19 @@ class MessageSender: bound_obj, message, response_dict, response ) except Exception as exc: + + # We pragmatically log by default if decoding fails. This + # means a message type was likely changed in a way that + # breaks the protocol, but individual message handlers are + # likely to lump all errors together (communication and + # otherwise) which could cause such breakage to go + # unnoticed. + if self.protocol.log_response_decode_errors: + logging.exception( + 'Error decoding message response;' + ' protocol might be broken.', + ) + response = ErrorSysResponse( error_message='Error decoding raw response.', error_type=ErrorSysResponse.ErrorType.LOCAL, diff --git a/dist/ba_data/python/efro/rpc.py b/dist/ba_data/python/efro/rpc.py index 9acfab0..e4477cb 100644 --- a/dist/ba_data/python/efro/rpc.py +++ b/dist/ba_data/python/efro/rpc.py @@ -180,6 +180,7 @@ class RPCEndpoint: reader: asyncio.StreamReader, writer: asyncio.StreamWriter, label: str, + *, debug_print: bool = False, debug_print_io: bool = False, debug_print_call: Callable[[str], None] | None = None, @@ -426,6 +427,7 @@ class RPCEndpoint: bytes_awaitable: asyncio.Task[bytes], message_id: int, ) -> bytes: + # pylint: disable=too-many-positional-arguments # We need to know their protocol, so if we haven't gotten a handshake # from them yet, just wait. while self._peer_info is None: diff --git a/dist/ba_data/python/efro/threadpool.py b/dist/ba_data/python/efro/threadpool.py new file mode 100644 index 0000000..e10a94a --- /dev/null +++ b/dist/ba_data/python/efro/threadpool.py @@ -0,0 +1,87 @@ +# Released under the MIT License. See LICENSE for details. +# +"""Thread pool functionality.""" + +from __future__ import annotations + +import time +import logging +import threading +from typing import TYPE_CHECKING, ParamSpec +from concurrent.futures import ThreadPoolExecutor + +if TYPE_CHECKING: + from typing import Any, Callable + from concurrent.futures import Future + +P = ParamSpec('P') + +logger = logging.getLogger(__name__) + + +class ThreadPoolExecutorPlus(ThreadPoolExecutor): + """A ThreadPoolExecutor with additional functionality added.""" + + def __init__( + self, + max_workers: int | None = None, + thread_name_prefix: str = '', + initializer: Callable[[], None] | None = None, + max_no_wait_count: int | None = None, + ) -> None: + super().__init__( + max_workers=max_workers, + thread_name_prefix=thread_name_prefix, + initializer=initializer, + ) + self.no_wait_count = 0 + + self._max_no_wait_count = ( + max_no_wait_count + if max_no_wait_count is not None + else 50 if max_workers is None else max_workers * 2 + ) + self._last_no_wait_warn_time: float | None = None + self._no_wait_count_lock = threading.Lock() + + def submit_no_wait( + self, call: Callable[P, Any], *args: P.args, **keywds: P.kwargs + ) -> None: + """Submit work to the threadpool with no expectation of waiting. + + Any errors occurring in the passed callable will be logged. This + call will block and log a warning if the threadpool reaches its + max queued no-wait call count. + """ + # If we're too backlogged, issue a warning and block until we + # aren't. We don't bother with the lock here since this can be + # slightly inexact. In general we should aim to not hit this + # limit but it is good to have backpressure to avoid runaway + # queues in cases of network outages/etc. + if self.no_wait_count > self._max_no_wait_count: + now = time.monotonic() + if ( + self._last_no_wait_warn_time is None + or now - self._last_no_wait_warn_time > 10.0 + ): + logger.warning( + 'ThreadPoolExecutorPlus hit max no-wait limit of %s;' + ' blocking.', + self._max_no_wait_count, + ) + self._last_no_wait_warn_time = now + while self.no_wait_count > self._max_no_wait_count: + time.sleep(0.01) + + fut = self.submit(call, *args, **keywds) + with self._no_wait_count_lock: + self.no_wait_count += 1 + fut.add_done_callback(self._no_wait_done) + + def _no_wait_done(self, fut: Future) -> None: + with self._no_wait_count_lock: + self.no_wait_count -= 1 + try: + fut.result() + except Exception: + logger.exception('Error in work submitted via submit_no_wait().') diff --git a/dist/ba_data/python/efro/util.py b/dist/ba_data/python/efro/util.py index a771cb4..f3731d8 100644 --- a/dist/ba_data/python/efro/util.py +++ b/dist/ba_data/python/efro/util.py @@ -1,19 +1,22 @@ # Released under the MIT License. See LICENSE for details. # +# pylint: disable=too-many-lines """Small handy bits of functionality.""" from __future__ import annotations import os import time +import random import weakref +import functools import datetime from enum import Enum -from typing import TYPE_CHECKING, cast, TypeVar, Generic, overload +from typing import TYPE_CHECKING, cast, TypeVar, Generic, overload, ParamSpec if TYPE_CHECKING: import asyncio - from typing import Any, Callable, Literal + from typing import Any, Callable, Literal, Sequence T = TypeVar('T') ValT = TypeVar('ValT') @@ -22,6 +25,8 @@ SelfT = TypeVar('SelfT') RetT = TypeVar('RetT') EnumT = TypeVar('EnumT', bound=Enum) +P = ParamSpec('P') + class _EmptyObj: pass @@ -32,6 +37,36 @@ class _EmptyObj: _g_empty_weak_ref = weakref.ref(_EmptyObj()) assert _g_empty_weak_ref() is None +# Note to self: adding a special form of partial for when we don't need +# to pass further args/kwargs (which I think is most cases). Even though +# partial is now type-checked in Mypy (as of Nov 2024) there are still some +# pitfalls that this avoids (see func docs below). Perhaps it would make +# sense to simply define a Call class for this purpose; it might be more +# efficient than wrapping partial anyway (should test this). +if TYPE_CHECKING: + + def strict_partial( + func: Callable[P, T], *args: P.args, **kwargs: P.kwargs + ) -> Callable[[], T]: + """A version of functools.partial requiring all args to be passed. + + This helps avoid pitfalls where a function is wrapped in a + partial but then an extra required arg is added to the function + but no type checking error is triggered at usage sites because + vanilla partial assumes that extra arg will be provided at call + time. + + Note: it would seem like this pitfall could also be avoided on + the back end by ensuring that the thing accepting the partial + asks for Callable[[], None] instead of just Callable, but as of + Nov 2024 it seems that Mypy does not support this; it in fact + allows partials to be passed for any callable signature(!). + """ + ... + +else: + strict_partial = functools.partial + def explicit_bool(val: bool) -> bool: """Return a non-inferable boolean value. @@ -42,8 +77,6 @@ def explicit_bool(val: bool) -> bool: # pylint: disable=no-else-return if TYPE_CHECKING: # infer this! - import random - return random.random() < 0.5 else: return val @@ -62,35 +95,6 @@ def snake_case_to_camel_case(val: str) -> str: return val.replace('_', ' ').title().replace(' ', '') -def enum_by_value(cls: type[EnumT], value: Any) -> EnumT: - """Create an enum from a value. - - This is basically the same as doing 'obj = EnumType(value)' except - that it works around an issue where a reference loop is created - if an exception is thrown due to an invalid value. Since we disable - the cyclic garbage collector for most of the time, such loops can lead - to our objects sticking around longer than we want. - This issue has been submitted to Python as a bug so hopefully we can - remove this eventually if it gets fixed: https://bugs.python.org/issue42248 - UPDATE: This has been fixed as of later 3.8 builds, so we can kill this - off once we are 3.9+ across the board. - """ - - # Note: we don't recreate *ALL* the functionality of the Enum constructor - # such as the _missing_ hook; but this should cover our basic needs. - value2member_map = getattr(cls, '_value2member_map_') - assert value2member_map is not None - try: - out = value2member_map[value] - assert isinstance(out, cls) - return out - except KeyError: - # pylint: disable=consider-using-f-string - raise ValueError( - '%r is not a valid %s' % (value, cls.__name__) - ) from None - - def check_utc(value: datetime.datetime) -> None: """Ensure a datetime value is timezone-aware utc.""" if value.tzinfo is not datetime.UTC: @@ -114,11 +118,24 @@ def utc_now_naive() -> datetime.datetime: This can be used to replace datetime.utcnow(), which is now deprecated. Most all code should migrate to use timezone-aware times instead of - this. + relying on this. """ return datetime.datetime.now(datetime.UTC).replace(tzinfo=None) +def utc_from_timestamp_naive(timestamp: float) -> datetime.datetime: + """Get a naive utc time from a timestamp. + + This can be used to replace datetime.utcfromtimestamp(), which is now + deprecated. Most all code should migrate to use timezone-aware times + instead of relying on this. + """ + + return datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).replace( + tzinfo=None + ) + + def utc_today() -> datetime.datetime: """Get offset-aware midnight in the utc time zone.""" now = datetime.datetime.now(datetime.UTC) @@ -198,27 +215,33 @@ def data_size_str(bytecount: int, compact: bool = False) -> str: class DirtyBit: - """Manages whether a thing is dirty and regulates attempts to clean it. + """Manages whether a thing is dirty and regulates cleaning it. + + To use, simply set the 'dirty' value on this object to True when + some update is needed, and then check the 'should_update' value to + regulate when the actual update should occur. Set 'dirty' back to + False after a successful update. + + If 'use_lock' is True, an asyncio Lock will be created and + incorporated into update attempts to prevent simultaneous updates + (should_update will only return True when the lock is unlocked). + Note that It is up to the user to lock/unlock the lock during the + actual update attempt. + + If a value is passed for 'auto_dirty_seconds', the dirtybit will + flip itself back to dirty after being clean for the given amount of + time. - To use, simply set the 'dirty' value on this object to True when some - action is needed, and then check the 'should_update' value to regulate - when attempts to clean it should be made. Set 'dirty' back to False after - a successful update. - If 'use_lock' is True, an asyncio Lock will be created and incorporated - into update attempts to prevent simultaneous updates (should_update will - only return True when the lock is unlocked). Note that It is up to the user - to lock/unlock the lock during the actual update attempt. - If a value is passed for 'auto_dirty_seconds', the dirtybit will flip - itself back to dirty after being clean for the given amount of time. 'min_update_interval' can be used to enforce a minimum update - interval even when updates are successful (retry_interval only applies - when updates fail) + interval even when updates are successful (retry_interval only + applies when updates fail) """ def __init__( self, dirty: bool = False, retry_interval: float = 5.0, + *, use_lock: bool = False, auto_dirty_seconds: float | None = None, min_update_interval: float | None = None, @@ -313,7 +336,7 @@ class DispatchMethodWrapper(Generic[ArgT, RetT]): @staticmethod def register( - func: Callable[[Any, Any], RetT] + func: Callable[[Any, Any], RetT], ) -> Callable[[Any, Any], RetT]: """Register a new dispatch handler for this dispatch-method.""" raise RuntimeError('Should not get here') @@ -323,7 +346,7 @@ class DispatchMethodWrapper(Generic[ArgT, RetT]): # noinspection PyProtectedMember,PyTypeHints def dispatchmethod( - func: Callable[[Any, ArgT], RetT] + func: Callable[[Any, ArgT], RetT], ) -> DispatchMethodWrapper[ArgT, RetT]: """A variation of functools.singledispatch for methods. @@ -407,7 +430,7 @@ class ValueDispatcher(Generic[ValT, RetT]): def valuedispatch1arg( - call: Callable[[ValT, ArgT], RetT] + call: Callable[[ValT, ArgT], RetT], ) -> ValueDispatcher1Arg[ValT, ArgT, RetT]: """Like valuedispatch but for functions taking an extra argument.""" return ValueDispatcher1Arg(call) @@ -458,7 +481,7 @@ if TYPE_CHECKING: def valuedispatchmethod( - call: Callable[[SelfT, ValT], RetT] + call: Callable[[SelfT, ValT], RetT], ) -> ValueDispatcherMethod[ValT, RetT]: """Like valuedispatch but works with methods instead of functions.""" @@ -959,3 +982,30 @@ def extract_arg( del args[argindex : argindex + 2] return val + + +def pairs_to_flat(pairs: Sequence[tuple[T, T]]) -> list[T]: + """Given a sequence of same-typed pairs, flattens to a list.""" + return [item for pair in pairs for item in pair] + + +def pairs_from_flat(flat: Sequence[T]) -> list[tuple[T, T]]: + """Given a flat even numbered sequence, returns pairs.""" + if len(flat) % 2 != 0: + raise ValueError('Provided sequence has an odd number of elements.') + out: list[tuple[T, T]] = [] + for i in range(0, len(flat) - 1, 2): + out.append((flat[i], flat[i + 1])) + return out + + +def weighted_choice(*args: tuple[T, float]) -> T: + """Given object/weight pairs as args, returns a random object. + + Intended as a shorthand way to call random.choices on a few explicit + options. + """ + items: tuple[T] + weights: tuple[float] + items, weights = zip(*args) + return random.choices(items, weights=weights)[0] diff --git a/dist/ba_root/config.json b/dist/ba_root/config.json index 316be79..b9d2709 100644 --- a/dist/ba_root/config.json +++ b/dist/ba_root/config.json @@ -127,21 +127,23 @@ "Auto Account State": "Server", "Auto Balance Teams": true, "Campaigns": {}, - "Default Player Profiles": {}, + "Default Player Profiles": { + "Client Input Device #1": "__account__" + }, "FFA Series Length": 24, - "Fleet Zone Ping Last Flush Time": 1716129094, + "Fleet Zone Ping Last Flush Time": 1739040124, "Fleet Zone Pings": { "prod": { - "delhi.v4": 14.10211762590956, - "hyderabad.v4": 37.66881892027117, - "mumbai.v4": 60.45953764687152 + "delhi.v4": 20.047312009415414, + "hyderabad.v4": 59.521362172204654, + "mumbai.v4": 46.37120131159789 } }, "Free-for-All Playlist Randomize": true, "Free-for-All Playlist Selection": "__default__", "Free-for-All Playlists": {}, "Idle Exit Minutes": null, - "Local Account Name": "Server17290774", + "Local Account Name": "Server19749648", "Player Profiles": { "__account__": { "character": "Spaz", @@ -175,7 +177,7 @@ "Team Tournament Playlist Selection": "\u041a\u043e\u043f\u0438\u044f \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442 \u0440\u0435\u0436\u0438\u043c\u0430 \u041a\u043e\u043c\u0430\u043d\u0434\u044b", "Team Tournament Playlists": {}, "Teams Series Length": 7, - "launchCount": 17, + "launchCount": 54, "lc14173": 1, "lc14292": 1 } \ No newline at end of file diff --git a/dist/ba_root/config.json.prev b/dist/ba_root/config.json.prev index 5531361..b34e9a7 100644 --- a/dist/ba_root/config.json.prev +++ b/dist/ba_root/config.json.prev @@ -127,21 +127,23 @@ "Auto Account State": "Server", "Auto Balance Teams": true, "Campaigns": {}, - "Default Player Profiles": {}, + "Default Player Profiles": { + "Client Input Device #1": "__account__" + }, "FFA Series Length": 24, - "Fleet Zone Ping Last Flush Time": 1716129094, + "Fleet Zone Ping Last Flush Time": 1739040124, "Fleet Zone Pings": { "prod": { - "delhi.v4": 11.398733474327724, - "hyderabad.v4": 37.2009791625173, - "mumbai.v4": 73.59297864995176 + "delhi.v4": 24.82968499630806, + "hyderabad.v4": 71.47282006521709, + "mumbai.v4": 53.8184435996518 } }, "Free-for-All Playlist Randomize": true, "Free-for-All Playlist Selection": "__default__", "Free-for-All Playlists": {}, "Idle Exit Minutes": null, - "Local Account Name": "Server17290774", + "Local Account Name": "Server19749648", "Player Profiles": { "__account__": { "character": "Spaz", @@ -175,7 +177,7 @@ "Team Tournament Playlist Selection": "\u041a\u043e\u043f\u0438\u044f \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043b\u0435\u0439-\u043b\u0438\u0441\u0442 \u0440\u0435\u0436\u0438\u043c\u0430 \u041a\u043e\u043c\u0430\u043d\u0434\u044b", "Team Tournament Playlists": {}, "Teams Series Length": 7, - "launchCount": 17, + "launchCount": 54, "lc14173": 1, "lc14292": 1 } \ No newline at end of file diff --git a/dist/ba_root/mods/changelogs.json b/dist/ba_root/mods/changelogs.json index db8d621..dd78ab5 100644 --- a/dist/ba_root/mods/changelogs.json +++ b/dist/ba_root/mods/changelogs.json @@ -58,6 +58,10 @@ "80": { "log": "finally releasing API 8 after 1 year", "time": "22 Nov 2024" + }, + "81": { + "log": "api 9 , latest changes for 1.7.37 from master", + "time": "09 Feb 2025" } } \ No newline at end of file diff --git a/dist/ba_root/mods/chathandle/chatcommands/commands/management.py b/dist/ba_root/mods/chathandle/chatcommands/commands/management.py index b221a83..769c860 100644 --- a/dist/ba_root/mods/chathandle/chatcommands/commands/management.py +++ b/dist/ba_root/mods/chathandle/chatcommands/commands/management.py @@ -493,7 +493,7 @@ def get_roles_of_player(arguments, clientid): for i in session.sessionplayers: if i.inputdevice.client_id == int(arguments[0]): roles = pdata.get_player_roles(i.get_v1_account_id()) - print(roles) + for role in roles: reply = reply + role + "," send(reply, clientid) diff --git a/dist/ba_root/mods/custom_hooks.py b/dist/ba_root/mods/custom_hooks.py index 3161a71..b536090 100644 --- a/dist/ba_root/mods/custom_hooks.py +++ b/dist/ba_root/mods/custom_hooks.py @@ -1,6 +1,6 @@ """Custom hooks to pull of the in-game functions.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) # pylint: disable=import-error @@ -70,7 +70,7 @@ class modSetup(babase.Plugin): if (settings["useV2Account"]): if (plus.get_v1_account_state() == - 'signed_in' and plus.get_v1_account_type() == 'V2'): + 'signed_in' and plus.get_v1_account_type() == 'V2'): logging.debug("Account V2 is active") else: logging.warning("Account V2 login require ....stay tuned.") @@ -337,21 +337,21 @@ def shutdown(func) -> None: "Server will restart on next opportunity. (series end)") _babase.restart_scheduled = True bs.get_foreground_host_activity().restart_msg = bs.newnode('text', - attrs={ - 'text': "Server going to restart after this series.", - 'flatness': 1.0, - 'h_align': 'right', - 'v_attach': 'bottom', - 'h_attach': 'right', - 'scale': 0.5, - 'position': ( - -25, - 54), - 'color': ( - 1, - 0.5, - 0.7) - }) + attrs={ + 'text': "Server going to restart after this series.", + 'flatness': 1.0, + 'h_align': 'right', + 'v_attach': 'bottom', + 'h_attach': 'right', + 'scale': 0.5, + 'position': ( + -25, + 54), + 'color': ( + 1, + 0.5, + 0.7) + }) func(*args, **kwargs) return wrapper @@ -373,9 +373,9 @@ def on_player_request(func) -> bool: count += 1 if count >= settings["maxPlayersPerDevice"]: bs.broadcastmessage("Reached max players limit per device", - clients=[ - player.inputdevice.client_id], - transient=True, ) + clients=[ + player.inputdevice.client_id], + transient=True, ) return False return func(*args, **kwargs) diff --git a/dist/ba_root/mods/playersdata/profiles.json b/dist/ba_root/mods/playersdata/profiles.json index e3c4d6f..93fa88d 100644 --- a/dist/ba_root/mods/playersdata/profiles.json +++ b/dist/ba_root/mods/playersdata/profiles.json @@ -22992,5 +22992,28 @@ "lastMsgTime": 1692388464.9424736, "lastMsg": "/ping all", "cSameMsg": 0 + }, + "pb-IF4CUGMfXA==": { + "display_string": [ + "\ue030PC913901" + ], + "profiles": [], + "name": "\ue030PC913901", + "accountAge": "2023-04-29 21:29:25", + "registerOn": 1732811067.9550145, + "spamCount": 0, + "lastSpam": 1732811067.9550183, + "totaltimeplayer": 0, + "warnCount": 0, + "lastWarned": 1732815847.8397744, + "verified": true, + "rejoincount": 1, + "lastJoin": 1732815847.8397763, + "lastIP": "axj~|h~}hhai", + "deviceUUID": "794cde3b6d1a862addc825b3bd75d7dcddc379e0", + "cMsgCount": 0, + "lastMsgTime": 1732811106.4264228, + "lastMsg": "make meadmin", + "cSameMsg": 0 } } \ No newline at end of file diff --git a/dist/ba_root/mods/playersdata/profiles.json.backup b/dist/ba_root/mods/playersdata/profiles.json.backup index 275f971..93fa88d 100644 --- a/dist/ba_root/mods/playersdata/profiles.json.backup +++ b/dist/ba_root/mods/playersdata/profiles.json.backup @@ -22982,15 +22982,38 @@ "lastSpam": 1692041275.3951833, "totaltimeplayer": 0, "warnCount": 0, - "lastWarned": 1692388352.1588542, + "lastWarned": 1692388455.527413, "verified": true, "rejoincount": 1, - "lastJoin": 1692388352.1588569, + "lastJoin": 1692388455.5274153, "lastIP": "axj~|h~}hhai", "deviceUUID": "26f30cfd3921c2d15574b534cb824c952b14f189", - "cMsgCount": 0, - "lastMsgTime": 1692092832.8181152, + "cMsgCount": 1, + "lastMsgTime": 1692388464.9424736, "lastMsg": "/ping all", "cSameMsg": 0 + }, + "pb-IF4CUGMfXA==": { + "display_string": [ + "\ue030PC913901" + ], + "profiles": [], + "name": "\ue030PC913901", + "accountAge": "2023-04-29 21:29:25", + "registerOn": 1732811067.9550145, + "spamCount": 0, + "lastSpam": 1732811067.9550183, + "totaltimeplayer": 0, + "warnCount": 0, + "lastWarned": 1732815847.8397744, + "verified": true, + "rejoincount": 1, + "lastJoin": 1732815847.8397763, + "lastIP": "axj~|h~}hhai", + "deviceUUID": "794cde3b6d1a862addc825b3bd75d7dcddc379e0", + "cMsgCount": 0, + "lastMsgTime": 1732811106.4264228, + "lastMsg": "make meadmin", + "cSameMsg": 0 } } \ No newline at end of file diff --git a/dist/ba_root/mods/playersdata/roles.json b/dist/ba_root/mods/playersdata/roles.json index e3da243..d1ba115 100644 --- a/dist/ba_root/mods/playersdata/roles.json +++ b/dist/ba_root/mods/playersdata/roles.json @@ -71,7 +71,7 @@ "commands": [], "ids": [ "pb-IF4VAk4a", - "pb-IF5RU3EcAg==" + "pb-IF4CUGMfXA==" ] }, "bypass-warn": { diff --git a/dist/ba_root/mods/setting.py b/dist/ba_root/mods/setting.py index 657c027..8d0c85f 100644 --- a/dist/ba_root/mods/setting.py +++ b/dist/ba_root/mods/setting.py @@ -1,6 +1,6 @@ """Module to update `setting.json`.""" -# ba_meta require api 8 +# ba_meta require api 9 # (see https://ballistica.net/wiki/meta-tag-system) from __future__ import annotations diff --git a/dist/ba_root/mods/spazmod/tag.py b/dist/ba_root/mods/spazmod/tag.py index 0761c9a..6369903 100644 --- a/dist/ba_root/mods/spazmod/tag.py +++ b/dist/ba_root/mods/spazmod/tag.py @@ -25,7 +25,7 @@ def addtag(node, player): tag = roles[role]['tag'] col = ( 0.7, 0.7, 0.7) if 'tagcolor' not in roles[role] else \ - roles[role]['tagcolor'] + roles[role]['tagcolor'] break if tag: Tag(node, tag, col) @@ -49,7 +49,7 @@ def addhp(node, spaz): else: spaz.hptimer = None - spaz.hptimer = bs.Timer(100, babase.Call( + spaz.hptimer = bs.Timer(2, babase.Call( showHP), repeat=True) @@ -165,5 +165,5 @@ class HitPoint(object): self._Text.delete() m.delete() - self.timer = bs.Timer(1.2, babase.Call( + self.timer = bs.Timer(2, babase.Call( a)) diff --git a/dist/ba_root/mods/tools/server_update.py b/dist/ba_root/mods/tools/server_update.py index e18ca14..0feed8a 100644 --- a/dist/ba_root/mods/tools/server_update.py +++ b/dist/ba_root/mods/tools/server_update.py @@ -10,13 +10,10 @@ import bascenev1 from efro.terminal import Clr from playersdata import pdata -VERSION = 80 +VERSION = 81 def check(): - print(babase.app.classic) - print(babase.app.classic.server) - _thread.start_new_thread(updateProfilesJson, ()) _thread.start_new_thread(checkChangelog, ()) diff --git a/dist/bombsquad_headless b/dist/bombsquad_headless index 282d177f858d0ac69a6fd0cad949f4f2bb645de6..eeb1f45e7a11d57ad797c76bb3d5e565a8f473cb 100644 GIT binary patch literal 7878960 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%0DAu7+!6rmt%{`T9VALm=yQT{p?>7JMuC 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

_yU@i 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ʵ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 z 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

Ffx;6QLW2Zj2Ri+)J%1$m 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

|Oqk@p*_2Zfn1DuQ5bhe3rZp&{xjOz~^9x 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

#;{gKnCpw@%leSHNCX7q}8b}$i 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

XgPWH^o-$;;_bzY!#K}-i2(O)~$1xmY#FA`@?$6 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

-B!Z|$dn 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�`1veI0g-cYuB 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∓l5rhWCkC@@@jcue(*ASVV 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%0DBAdErGJbFe-magKRRm}rO2o;o3H9~N!jeA5ep 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

1zRHl?4<`1a9{_OdO8C9m@vP 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%0DI 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

aaz9%Sb(8XlcgCaMPfwx`-uzO2^_(aT zk%EuYb=QaHcmzN4&iLSZoD_YHGW4bFrghSRV9&$f*qYasTlFZ*J<7tq?Kvz*YP~6f z@&!9fJ>Vu8Noz6nA!!W|c6tk+aBw{3ow4ou<7S@@o0Yt)!x`Rf9r^fNi1RIzfE3H= z*c7h5qcOjQVul^~k6q&!dEke~V}k=SEt;zh^T9N2%xs?5LVL-_ow}4DO2Imv4?(Q* zkH{7jLNZJI5NZa+Mhdaze20u!OWW!4fSXC_Qk-eE<2N(igKs8wvi9aGrCn#gEbz`h zVPBVv-h63t;UQA=iHYF()Zv_A%L4H8-cP;^L)g=m_tynQviTD&YXWEhzKl?{6hE;?!R_%Acjw+gni{ng zA3e>syJ=NP7zWGs6i9OP|61dh%srb3_A*nLoRiDih{>HGhE=4GT>k*1Q)dA8Y zon}6m`$y$lEK-S4Y|nk!elO+qPo_V4RdNz;7^Qr|FN*p3iKQPCm*b*Hi>-EA>0%vI zs;On*)yMNHO~(lgpVm8mKTYiA$n6-x>aB`Wn$~hM4K@q8pgiy|)d{^s5&tHw3m4v? z*&*6wD@X;i+4~^M@L$SQ%xy&~k5Ube9^|+w^`1LQU&{%X_!k;g|HtBRN2xNwnKDM@ zl#pLP_N#=l`q`l$*-%SAnUax#AV_7!lN5t+p=F!pnJ=VTAVaq1Y#M<(spBO4IC6jj zXVp()Ke@Mo#r6Xj`IXU1R%&^HbeIgMmdXa~T5i(d5(ND%9siCBYVqfHqDWgk zXB}rIbP6Ex_TrBnis{ym5b$>bs44kTrlb@wW{kgwfDZlawT0KIG4T;G*8MEG@firv z10xC1B|8YbCs}c|Zit!oag`8=y^}6Dbz_UejBaodeiiyN+E*$1wU8#mFuh ztA?HUy+nd((WM{rj%CLcCOj`{U5FCo%TsSN(z0nxC+IW)+=Mtt)O0$&F>i9H7M48>x*@RO+u&_fNq z$-LjPlxxuhd<0~;3L0TKHXvHiu$E8T<~V7sj#Jehq8Ry7FNw3p3WV*%%fNyS&C9Pa z@ZTv2M*grzFEd2j#@P{6UHQC$z%vKp@`oLYNsojVZDANEHxg1ftJ~TW%iQRL1URb< zLx6fm4=naSOC-4tKc>TEJHcPD$sG7iO}ohdsCH&4=`xb zUfRZ*9e_XLd)i=Wn%lglj5*(QGhcWX^T|rnIda{s6Qvt%`=j+|?Zz^-9S$3ZQV^y? zMaRrb%vg8=+q@@P8GkU-4VCj2GCL3f?wGF zwwLr4%qLCUtk0d^g0*mOdL{m}ga3!XL2?h(icd1d_%U{;`$dVT z#6Xox-n8HjLSYpNsn>~z^!3cxld_3pWYoxytUf@Aa% zYd7{24`WFv#uMl7o!-PXR0JC{!yb^8>(z^JMa)|;!Ir&94w^BcP{8BB&UmxyNp2Kb zq+j(K2Y!133+eBy3h+(VZp{ZsPrC>@YkW_0!=@Vv{sod4y3|cO5auL|Qg&HrjwAp? z2a?Vc5psG((i{AQeo&eH`iC~5igp_lt8#x}_0QhIelOw4OYXjKP$sFMrGg?0@9Tsy*zg{ohxcWRm})gS5;QKW`WgS_X)LA zqvht8+|(P)neto(pcnK}dcULP8Y~hUF;(m`9f*KI`h{B`(T`;QU$sJJw#M<$4okk` zzB!2Pn&33_pQF+@Y#T*{$Hpz-51;w! zG4DMzbVwVh@ju4@`?2pmWXk3Tjl|L?Q=`hN?&#qfNmPyL%dmcQ$s#G=izg%7~g?u zxg6+^$J6f_QH-lwN#=FDFV@@Bae8!(oZWNkvWwx}59#=Z_fxYkoq8O9U(0@F7ZIoBwmmI)}d3@k-sh zY=1lETgJ}WU#Ramo)_?3&%5T#%Kn1YKj`Fp+1%&V^L^Rtt|&zA%Wk*G*RrYJ$k(zD z6R9Ka^N2)vV6U{#YBBsor{sQ3dO%kWPg}v)zN1g>`73BzT6m8&I>B~yj^23R^w4DE zREOvD5O7_&To1=Gf3rc|RM*T`iFxYd^=@@X{~STom1Mv5KF1}Qzuie(c5MRS07|=H zjRG&F=C+LJ^L#1#QR5FC^Yj#1H4k>fWA#LsxpqyS48s-wHRo1lHLBOy^cA{8;E*q7 znYB2dl+WCy;$q*HnXk~#7P-u_vh@=ztI6Z|FXfrG0)B!c5Ovt#8Tm0lp|R z(An9jDL(pSE~kXvm@CRGcxflJa9PknVIwANsDr&=2phd%+;wbb;kXD6%UytD#m92@ z1;la}0I@S(@K2xp7FTt(fUlj-pt1UVz~=|to~T;zJOS6ejG+R$<3Q_i*5cl z<~cy-+J;N9-Oxb9J8o(oKmVxL{#k8qqTaOQub0fhN-7CatW9-sMc12f)h-$#V1p37a1qk7!N&kmsO`l7lC z=j%QMSD@}q@s0$0-q5&6{n$sn`QNunuW7E&jN{;!tDx{vul-L!%{Nl>d){#NG}*r( zwAE)86rd)YuenRCma5kXY^tt{#K%7C&2P1;CsTEuRm~%rJ2}@4s-8;K`@G@PI5lpx zs^=F~JwIP{w!Wi3HE+P`Sv8*v&|TjA3$5l0sQFy0xoNyEZpMO|zZa>`bf|)O`b8o2 zEpPaYa6|Sjq}lq86YDefjJU&mM?HGe8E8y&BqAISwVE#m$5C*+)ocI9pwjaJ_lY=f zrwK}3GHT_oHyr0c**jHn=4O`=4^NM$pQ+FMIp2d$we)m-$5&|x$q_rSqnG(QteviV zL8=7YERE*Crdto8(c{Xj6R}-x{I%NPP!SDe1xy1#Zv@^R+Q$x`0d# zO|kT4WNIc;on;zBCU8rpW@WmuC{q)e##yFnGU<5PyS71@E-T8EAk%qhps$6h@-1Ct z>Gd3U)6`5fYv(G%=}e((n;N*y5fqhy>%8`HU>O~3X{kW=*Nwmtuz*G~qyw6bU+ z=*^wG!+({t0UK#glZp5CMz%+s^KppZ+C zsbsIZ)A$7ktgr?MR`##aiFN4>?uG5(j+J(S*Vc1N^X*D+_<-=c=M6Z{o3E`)EMrro zPW~LY{rQ9=;Y?w!bo1CO+PoQS>(kLnhBF$;W+omz+Ht!IBR^GfRbc4&sk$T(!A{Zo z$vptxws+?L2Vxx)HK0RzA@|Bk4pbwoulXabV4Y{|hsL;5=VyO||8=YuhKeHn9I}$_ zi$Cc;MDTuim%5<$%_BoTwyAgpIN^7%-iR2;tr-&v>ajS|oHA*kp4etS`aFCtxj>>{ z_DgT~!+Oj47R>&>!3hS(JU7=hY=`YO^j6kN!mj^)oZ{Nv2`%Xbl zdoO$XU?;q-1YreP_R|*mTK3nyk*{TsBQlo$esg|Gaazngk(}1O=QTPnqR_YGwY9|k z-qM}CbY3<a~Www27^*yuRI|)V<&7`&3u&cZa>!)%$ImV3|PEeo%jPtm9`U1hLgF z%bqFqqhGCk_smj4(V6^wdp3J{HqqSi^OJTrL^h2{u5sw`H)-mdwIp|`R8xh1*)Q|k zV7d&112*A%^&>rYau*A?9M;HeP0dAmrOc5Dx{S9cLvvfV61 zP()4sn|ez6ewBKMKsO08z4)alRgo|EHp!I^%ZJw*7uZQ!0$uwAN+r=XOz0upsYtGn zOz5Gi^+ZbXmN-aY2a(dJqe*g-B(jj6O_D)?d(Rhyn9Y6u0cP^@!h_vTx+tM8G)v!^ zQ1?PNr2sRg5}a1Jhnk!C5Kho7ri zH2hgL{9NB~l{blJHzuw1hG5$;=`kclTlKt2>s`zf#N0(qByO}A|NNOmt+FWp92T-k z@S#baq!BF!0SvADDg2G4?+~33Er=Zbu-U1M-MmRnjp_u*m{+?gUoLn^y-$8U01==1 zAG)T32*wjGEnlc#^YZbd-k`s+jt8@f@3$}3wxK5b{Mh45>c{S#lZ|B_RQ?BQ)X2Np zvhNzt%PCIaH`;diM6BdQ|9v>8_r?U1jw&AylXy zYUmvGhO5K%k9ww)=-`QE$5T&y>?;P33Ox{`p36tQ%cduH9d+4y5=+nPGhdAmf4?WWR9m;EwuAKj;^6#2bAeFXhO`e1az`1E>qs+=Qot&P|8uwgF^UJ9wzOM2NyV6sRt z^~f4mTqcR~ULgbjCEnea)x`Q=R^8eX!+dcN?R8vO8|!EplYZR0`>R^4pI~ve`vDsj z#Utf+&nk`evvvFh=~m?yV@XllZjZHiXwAu<+(gZ9W|51HNS7gXM?WdgvLC#AY*0+ib>R`sTI) zhxU33&J3sRNM=28K{hIf*V~H)sBqU>8_swtp9Aph;f_vf(-lv?>6n$EKZUlBX{JvL zPXWgcGsQB?aaz%dSz=v`SD5@w=MG>Pu`2s#8VFrb9z&gU@}@eAtn~&>6mt*VST2p! zV2LP}Q0EQeAw@(j@Otb?{l8ILul$rhZxKmkS|ZUjH%sn5DVpwz_rGuq!E;LE{l|?F zQN)OdWiFe>{UG`Yn>|tXr9PJn{fi-x0>f1LiTn&f+8&oetFI@L%t_6-86q|eSd@20 zCj?b?@Hf7g@K$fgBVOpjxaceQFKiXFE7tY7o?!DM%B!lmdLERF?B^-qjc-WDE^Q(2 z93EgwOlPr(htKLWF%sPNW|QTUR2p^<%>L#Q%@f?ltj~V^Qq7awHBZvIMdY6qhV+>% zv#MLK*JOE@$-;GvF&&rGrnh-_e_rr!PCvtp0s%8Ndv~{#Dr#M<-;?^gPqw!#J~J?C z&}5P8E3k2vhJw=ui4eL9=g%zX$H@kAH5eiT)1Zo%bLBiV*hw2h7PhbL(3 zp3)sq*+8alkTZE%Dm}p&SCjK3c(3OBWMN z^;tp9>cnAU9-$0&;N+4UF-6jTJbb2tdWcU~9H`Y~6Hdgjn;W1*7|zKnp3`w1){Yg= z0DxI);)P+zHY!C5afS*q2&8_Q!6aX`HsDc_oiY%W6h-Vu{3Lc#!4AQI=;HhZSS(r9 zBy&h!1WC3l7jGy{pMY7dlQcvn&J{TW)QO24$(a{I6m?|LuqX>*nfwWz%muyXB)9z) zJ3ZVusG@Rj$a5U!HpMDJd@# zlFe4ddIFLpsn+~Y2*0quiYFw*V65Pa$%H0D&seN;SHrCy-u&MB}Sel$W6N5|1 zE5*`6UVe#AcvzWq^{hPm=n2~PY!ch42Do~z_e8RR&tu!y5RNjXvV(3{vbxm~5;ZtMZ z>%45@#EG(ws~z428N!sWWTk)lJSoAluhC_8(KBmx*=Jw25|v@?EjPw=hmC^}-Z48f zoZa>p`qfc3;a@SE(}jWbzIYmjE0tX(%TX0VW=Zze&-E{YvgmNWy30~Gle)zv)agY(&PX4hdy*nL-{vjBja0{3^dz1t8F|nO z9HqcV#9{?9DO+enE8BX!^2PhT6dk+Ko8O4CfmvvR2dlV0?A9K*DQmr^G4m7lpue!! zZniovYP%ClXSDplfa_3k?2{A`s+-B@jkEc=T?5G9f0aG|?M&8OOV5qBf;8W6oKo|zYsK>m~j^4@!qX`TVl z)ccrNUXL~XnnS17r(f$c*O+HE*Pt|;Ywu-$JfwfgLlWK|@cBWI&;Fj6jdihpx@Y%; zyQN+^VzW!Pa>`!*r7zbmx^Tb@M>fcQ8D1j4nzzd0D4MAglFQQHvY9pbPh>|c)lZm? zt?6Oh5RBiB^+W7@Kj3%%S7JEAa|6oFhAVjTh?g9pSbr)GcVscgXnI$?Ko#rdFB2n0 z4IHAuWUZiAJc4zemY>+zb#wj<(aVxZb_Fe`-15B16gr?tmi?FyT?4`D4*Ex^)-4L2 zX_jk=)WLZAw|%CAH)y;j!{1uzCV&4L%!AwiC-Xozh20`I=S#;3yZ}G=|G1O2rV&Y0 zB=|OX*z=R@Kiv=E75M+L`?b1Jn{)3VoaX6K`?J8jQw(^UohHUJzr9mq(zdrU`yc3g z(H`#q9>=Z_fE^!mT3Dl%WYc`@>nZIg-PCn@Y^pBuof}nQw z`jG)9$75 z^g2<2_B7eYFg=W?Uyr4^nr$+`YUl`+c4@f2aCF0-7hxVNgFI*fSQ~QB`H}&8we@*^ zmnpmbyVx^46r-0q<yyvr;m(k1x@}}%_>qz&U zML`nZVq2%dFA$Q%{mdr8T=siv>~D(H9uw4)|!bDIikk0IiI`8>lRG$veli zXBJ&-0j2;cK9Oax=bSs7vmcZIIZQb8JwU)aS;bo3ZTAL^63zeze9iA>`Mq50>9O)` zbV7al0KOFDq>URpoH11?xYxVSq&gk%?CbcN98YgxoT6!NVC~mvt>+5}PC4r~rsdT4 z@$)^3+aR4p4NISbBcHr{r=jSlAK@rPkre&oQ%)38(hkc)Stf6GbxT-Z!+n*xF)9Mf z=6WHCTFOhx3_vT5l}zG1KshI@$Hms)evaM$r@1@Ikf5>HOze8i6_U6xG zB_Gi~++nGox;EYqT=IAyG4kRdOF0G0H`SQ_MKQoE&_aSL$OLGX zXDF@H#gNQ3fWQk)kEFk5&Gp_t7}+)NME0hrg;-+|#vt)Ggg3n%Q!Uwl!XyHrz=X$%GR?KS>!koP=OYM5T_-{nJ#ycbHEnH^RT-@o6+%Q+=26pb1 z#OgQBl=UEive$TefMVKMuj4|_yl)xq0 zAA!)t`F$nT?6Mk2`!3KKq(+qIO(X5X@^qsF-z#W8bkTHcrf{?;RU}x&uv2(rQ=PqP z)t26~K4Hk*$5N|h;Z9m1AC!s2^fGio*qv(E zRH+-}e$m#cJ)9s}Dy0G8?E5vwsAB1L*^3Bz{^w$umEn6z#ftaEHnoReCa8aG`Mlvg z-M}X@lTS(mwdkLsTU~UO!i!b7gYq~YASjYTvZJr~72rGj^&gswS2ER^+ci!tco$H4 zh6WD}3TntIEltm=SOldN$kqd8pdkL$*|z!&2;COub>w_#2r0)(@pAYH(~uVSi6GErD0Nb6sI)MitANrEX|oEh6XE@ zSv{OkNW-41J*<_?;u99|UH58983Xn#CFN53wv`;sK0w6J~M5PU`K>lXLb-#!)x zNtzRkZt&&C_MYI&HNGVHa*Zz!zFgxggD=7p3*&)6@&nwpd#0+15-KAF5z~K9k^3 zL~%+De(1v^&JZ&>Ef3fH-i;F#qD7C z^gZ5HixG0BV?F7$-$p(Ofn%pP&3RotJ|Wt6>oRIQj%7w3LmH^QzT;LCg*(m)%kTAK zq6|I@Q0Ba%VbN#NxahNJVDwouGWskU8hsXxjXsM8N1uI1r_OX~|nM>*<)Nb~yXQF}2TNv4x=` z8oq;yNUZOeFYI?TvxqjJU2mvPALft&-rGOM(E?{p{b%y`den){V_KV0yw87(lJN7L zQpvobpO;a!e1B6Slj|9E;|4BxL`*A9 zj8x;5n>iw^JgLfvlRL_m6O?%-$|6aVXu2z&k$c7u(3c%n zN)0-MLjvT8yi%cWNPeh{8};)N`t41Mrq3>VH;qy`>TcS^b#U?{y-U*x?e(eVa6bP= z)nH}F%-b(si_2~IdjcmT;FGgQ?%?YBx6UTHr3MyPhuf*vU>#O9KO3G`l)1---19C`DRqTgvgHCEb9do}?j7_t5;a)m#^a4Onf(2yo0x zTFXs3su0Os)5$qQCx|nQ?=lP$yActRuxmre)@T}R&D4``#ohR%mz1W^E~@Gg4tnde z7zU4iCAiazN7W|iuQoi*;}vy>Ho2B#?OJYt8cLGu4aWk%TYcvisc@B`b}zyG-WF=X z^oAZB@doj_oggy*9if%x4xaNYJhZ$o9Ly81wTIj_7lqS8N5-fa$i9oeLZ=2q&bacp zjH~=jK$(oPdoyRHHjlq`lg*NS4@?Qov0j@;6G_Gk#wHP z-s0Yfr7X~M%+%m0=5#Vh>JlBNUv zxG90K@suN=&0YXUC3N~tJ7}|0wJMU#n+sM*5nV@KuL#*vCG0+*p6%hRb&URqq$w@m zCkZ>S{5$PzBFe78LRxV_XVup5huuA`Bc2Db4uEy4;srJ4a_U|n8x|VXxuz}++8ttT zNna!)cyx>wboP%hl)c{0V@Iehcm9B;!O)laUa=3^?`Le7Ca+m2Z4=L znik8fr#w*Nc3rF-;@`A18*xC@FLIyGb^4-UpTjw9rQl}8)$rV7dB|*@=k(l(c4{Q7 zGN?&dMh?b9t zZ4T58TF~$bBBy6^v?~8Ya9^tQSK8jzK7E0<(lLBkwXTD5`Y3@0Fg3NbsOKH_B)V(8 zGam649$^DOMl97CE%w1H!aZy*2upV21rt6fj*+Ca4Cv{QwLJNL-Y+T%V&%<=qdnzv zIY5qusdz>3NUBvaO&;ZRZytgY{kZbn`fpH4%Pq?11LyBAk!qHkuexgA^d^j0a+1_3 zi7mjUtr^ugI?Awz5SkYBPz}6$g>htQ zof-!YuH*#)r^{9_0`=`DB~24yEvlkwlQWnO>X%@=cVW22)j z+Dl=lH4=imS)7w0bh!VaijJg?KUf`lDYs_`YafhbcMS3zPdf&AV%HQ4khefZLEgf_9392kKB}8Q|FYpO z&I>|)aR*8${Ry~R9?Zr7i7Z!^lZgo#Cbx_B#NG{qZh|HuNvh&0JSr`q(a7$pzPJmj z3h1vFe;yA3m?oYVGF@v+!ZtdHe$+feyD~k@Qpi=P=oYdUqc(sjPoDvLXFBvwVpe_< zZ7#Dmk3nylP2oIx-^c z`%1$48{se6&fmR`}7HmD6pfZ+V2SHF}6^#D#0`A?Fc$rOnV*e6NTeGIj zHt_D0VTK-t%CEZFP_Aic< z+eWJKaIyYahw(|t)`Eeh1)c=|?k3=vKBqUN7{?4aR$i`POK!ST8e&QqQ)iaL1Sr4E z%D}$bRU;gE8>_*zqlm4>>&4z|sbCeD$trMukh0owd|Oz^xWcV0gq9lHSK%d&$rFOn znk(%so%@2G<0(q6OBrw{8^dsz>qKiU8n*WL?*ghed4?d%$CRUi?F_ zaJvBBRAR##h-q?fC9h~^Cg4;R45;}_mT-%?K-n9Z!P_Q4?+(#Xp`MK&8(39o?&Tz0 zvzy!jDLyQtc{RIC_!8yW02#Gv$GSc{qK83YI9<2VPZ<%o-a8_2C{~^VwL%a7HDNg9 z7lvLVn>!8eVAHf)BV-bq4Ke_kV38Ncj4B=|4+eL6Ad5jVJ5&zjpiZVYt;(P=5@FcL zGWgZX!pH@*N@jWgV~UxKrD?(ZtOhB6_`uEF)s7jEXN4PVLMDZU$j1cfp@gOs(Y4{} zMO2U}8q(_CZ5_K01mof{AX1wiGYo|R`q&WU2T1Byk?k@8 z8;q8&hH5~h%k@4!8e~hMiCdqoc>e$6p%A8X|8UTT!lAf#C^VoCoMb32;)!5@BdNm3 z(TSCIvcgo*NgK)V9ZDX{4p*D*F*s6NVRUmWI}9ed;h&!a0W(}$;DW|kcD{Bu3f3AsQ((4UCQX@r3(-+-+Zk!~^+TB3mUG*}~DwIm14 z`)Z)jtK1-V8>XNZ7*hT^8iuDG3cxK?986mQ$&po%>RJKbzQEIU9O9f%)C1I_y*&_8 zt$thV1Wuuq{Mzn_TuDI>3T;{sJij8Gt3${)qL)sB>7J+hE&(SIP7K~H)&oSWK#tnb z5&^)(WSM|z4RO8dCM}?3$HJD{xdr6jJ1_E_$;7bPT7p4`5farqPGt8}7$dj(z`X;( z>6j(BXl2j>;6^@>$^KiScj9&t(c9Xb!l;1fM7UfYBIf z2uE`U2gEMa~wGhcs7NY|b5zNr0sdzax=N*8TduZoHlQGF~k1{wFx_OI6 zS)SnRUMD!H)$ye1+Lm&Uw%oC( z)5D(@D{41`720Bp2M|&a+@-%Hbn(~9#4R~uEjvpC8=mEst{LJoqE;2zL=F@zGzO>$ zHLbD?&?Pl-y6DGc#Rr|^zsehg)hLbX(`ro+$lm>1Tr%mfk;0-ry1v?FF>c^8x0Hr6 z4ZI%yBH*nItDH#jlqVkMn#__pb4dV0E#GYY4>r|2d4<_bUbSM6U?B-f zR85v$K?X*(-MCsqEVI=31kR7_e3c2YAH>Q#nN-s;98gMC-LWJbv(J@g*~_ihv-r$j z@Wj!hS40!NI_^tYT5_kDTCG--cl20oP-R{RHfD#%5ObP~nH`RU6CSV_JtQA7z3l_$ zz#Z(e+xGA@?wgoV67z65lp0+HP$k}yHQtg=@7~RAYfi*;e5QAAmv?Vx+nO?zj(pF+ zlDx^TJvgVsSOLbS?v(aZ#HoKE2(^q0EV5ZfqNr5=NMzZu0JLjUi&Uva^p7EhDa_Pt zNjJfk=7KX5uDyzJjK;btm3%5NBsWYECtmprcWem>Z~@y1Ld39 zo3A-v6}MWIR3en{k6?KawAtE9oPpC2fYaJr$1S~eJg++Z-a4E%S4Ck-RaSv)W|V7j zZz-T789q;UPbZnwI}544lTv*-g~P!&7~}L<6;u`A^OrBZhYv5Zk7%b$w)N;KWm^{1 zQ?+CAtr5RnW$p=TA-F0C zD!L}fM=%xy72O$RVZzWTXT5YQL3~#sKDj4`r?+O}68WaQ|oi1(9$L@t*8EQAo6Rc`I_?q}4uc7b37 zA+oHQb$U?Av4z*TH@t$fK)Tq$Of5GMicQ@So4RQ{zg(xNiD!Q3vv|>gMQ&|4hmG9Q znc(#Rq4t#u>3C=;u-V1=IJ{OA6i;u~OMW=_?~(&Q(RRC)i>E8Xy1z99FC#8%_PH*u zcW^HY=V3B3qT;2l;*JW8-d)FaJ*I|Zb~O~&tCc}@IL`mdyC)E}H7=hnD(v9ny{nT+ zC_s)$$Z>qD>54~-TTjt?Y-%dp6q^e7<5pgrj~TkL!_msQT+`I1)?c(pT@@5SNx#%t z&F6MQ3xL_^&{Kmy0D&jt3UK!A@@t!PkT-x=9Vwx1SH(fMu+-a7O>sZ1gJ7<)?5ufu5*X!(`L0)1~d@OeD^T%^u6~j|Dui}6gbrA%rZ+(uZ?_e#@UAc=htHS*_ zx*(PAv$-qZ(?J=$7DYXKZwa3=Vz(W{VLB6aiIf9=O?~cwI?+y%O@9p;PJyhe} z`|c{~$KYepwzVhnTEvHKo47W*)|-e$_GKS>=dCqki}adRI{b-wZ-}Dv8hruE(r_{5iZO^&`agTPPwc|tu*s?0)dbTMy#;6;OqaO zx>5*x!Zms2{7Nq^rS>u+U>W}hv8hMLPu*I)dI+2Vij@XeZ0bhRHTm?9A%Y_W8J1gy z`l;(|2@BRL+IcSy*^5U~Q0s^O5zOXuurTzfNKX)U^V;YSmt7kF@_;#fM z8G^``H56=C0lb@x%!vcz*by3{mAul_1~i~&K-fEA6h}jPc1&+VC78_Yl`7rlUJIc7 zFHnngX-vm<`b{~B_Ok8d{HIYblnmJ73~LE2bbs@~j@ zqPmy$=Dw>acXe;>ytJjd@9E9Gswj6&Z|+!8-JQL;yNYr*^ybcsSE{?aH}{UB+)cf? zr|0Wt?<%6re)tP}Iwd8eStJ*ydNDEI*8L7}O2wz=X9V-s(93Y>unfsk)}qKzRpfxr zOT;uU7SAY0UhR?G5Nr+u!!(kR7okcS{vrUIibo{kg_egS)TC%fXA-Qq%WJ2X3PUpr zn?EfxwwKrk!LVJfV$t9WUtWrVzSej@83WS-el3ua_M#^K*{h_H@O=Q)U7sxJWOY8)}^9bbyK`(+iKJVhNWd$;G&811iEopfv(ZiUDM+L{`S!dNx z-57;;0w)^>UHq>th=5Y4Xg3_H)Q@h{hZ0T_#G>{Rc6v07H1{n+R-Ad8oE@&Dl$?0U z>@@kjS;5OG01o@q@mXIF8vJ-uo7IZx|8SW|u&E$*UgO%L)k%Z|)vPGhxJCv2$1BrJ zt+WgVyj&B65~YSUMA2Urfd8oh-!dWGWW0tQW^*uOAv?5EciI;kGszGlC1TMK5v%9X zxb^}u@IgzcOtL zmGQ^M9?^gX7?uk2gp|aZP#3Iq}(*%wK);L&7{BFrl+cr zvTM`t)~9zA_#tQpKBIGKXB{G)LyK4KoJ70+}9~#N*orJ4Z-tAwPOc ziG7>`Ry^wsS*Oi{x}E*gYU?fdCX+~w&4=sVa_e1y1JJKddlkFbu4<@5|HNn7Hl0#|GpiKxklTmz_RXkml2;t)`Esh5Y{y83o z|01G73?-}RrhHG$lwiu=8InBt+XN^jxzC{WryDt3n(T+hz!SPI)QjA>ct0&G&(t)- zZE8lik}LX-;8P#vc{^Kk@~}1G=XHLjyr!RhC{ei}m*PgxaXK?6D1{*;IEDM0IGs!# zf&#BE&+Xutht{!5zh13tRI8Y&ZWB+o-9=geQVVwqQfzO~u=;A=P^Yo&g726zF9==Em(zZ65!*3^H6?KW)xqbH;0c| z-{{y5aPXoqw38xwH9IA#+E!{U2&sPR?DYqw6OrWO)B>O-qPc&_@s<^a0q}hw20y)I;ZthZC z+DnRRD$fmb06>^C2pNsg_>Md(I0Puhf*lQ|;%tlibyFL>VhVJZVviLXV`U+%Cy0n^ zY3oe}4%xPup*tSd^C{p_PEte7<+*+AmK~|yZPrO5RWKY)<4)2YvQX;|TIJe`re;u~ zi2jj}0Z|>KlG2+B41fz{8YNOf0%XdgL^G(IDoD!8eZv|zi4m=s`J|Bqw;}f!HVLCT zc_T4*5R)C)#s^VjHxG-)M9o$w`k=9*`$fR_YYz>zO1gf?sPzOYV3ElZqa)m0#goGJ z=ik@s3U_UI230{j(bT2e{zs$fcP8RK7?hq6OT$L|Mu7D%DhH-c{)-pnFRCWcN#RN%P4z_4{qk$j-rzzLaS~& zk?@oKPZn4Sv~&F<bB2ny-Eu03oFjn4gM+bjKQ)5EF=Lx;n{?(e`#_qS{Sf4xDcg!IXD zDf0=;IZ<9AIG>w0@N%O>4YT`pd+!nce>(yR4e`?Ui+4S|eSo%=Rl(F(P=AQ=l~rc6et_lXV2B5kkYoSZ(Ep;U(Mgd8!bav~5{S@3I`8u?Mh`s({()H|l==om=J68y+PUn7o)lg6NTDLAT{!u8sUm%NlTOt>L~v4v)q+mkxAVmx*LS*Q)KSB&;2S12Ak zWhWJ)?krR|?@!*Ku>ef1*OjkZEFK_#jdkgba`%L0RTG~{FF&?7@72)8Gb4Vr;}ovE z6ddbw$V0r`$duhcN_~0`3twfn)f4Zo2=zBb|wAMtO`YP_$V?i2oP5XPO;h~E>= zp80M*uRm}x5x6FdS{}dbI+r&R%Z&aiL2e>bs8*ptWg~(-Kd`@{vSIwqHh;xdjM z{D}txMlT~OmieP}p0PEr^^d2A{X&_BkN7&pHkCckul{AHr_8|XlqFWPKlm0)euTWZ zg<|6QWs_XWz`6X5rOWQ-k5|D-I6lMvV2bx)v#rd}DWiXo$|+y8Od|gg7g*wTL1JuE z*{mSw4S{0)fu~veck+=HXdwJyUs8Ea;5w-fAz6)`pr|3xoAj*k6=c^K-};~A#597k$x zhlr_{uS4KmEir%G+92u?nELfnk4&sg<;mGJ>92s3)oj&BNi#F(=qIUtIa^V94rZ3v;u$`!g$u8dCL z{}n6>q51~JT_F`pD2m)2`q2ahFHR7=*qj#CHxZ0Z<0m;?Ny!;3m{~JD!jlj&{x@#{ z0g%e*#r!o_LPUp zq6MEPC0J_3Mmx5#6#^A1RB00lFwtP61~P+Vph}TjQ>BPVTbfcP5XKOsS6k^VZ%bck z>uqV}R^Ccm+Xe_E0xJKis3<|A&In3SL{y5u&v&0^CKF2U?Onh3x7J<1td(cZ|3CZe zv(G;J?6Z%u)1l}FuYWG5P0n&l8w)PVYSE_%=v28E_ja{8&);^6PvBq#8&HT5i!;_< zWQM4N%9I~70MV1#1=5Wu`@Tr0vK1>EeUgnB%Y_?*6_!i=e3E};qd{}H+D06UBI<2Y zIj*+?BCRaa>Z}iVFSSHO(hDbQ80LExhR6r?1)j-U_s zCMC0JresX3M2_j^uBiGe5mrD9TW@gv(=V$c1KgkgDiy5#kCuv?$E?lsmv zWI?E9aQ>|g-R#hnLhC_SlMq%?i`Ib8IL2Chhk6kx8SoY5V3CXAv$fsNmA+F&+pcbSY9LAt%@6~p{H>S&F> zHM<%b4^jhBU~;mu`7x745Yq1+nnK^={Fvcu6DyeItk{cs_7ij!;qm)TR6>@o#n5X7 zj4pLKC-Bpjckffd(hrT|)dI_LIWb<%;N^eSk$6K$gr5Fl$F#jI?>5qlz3^g^+A)|j zSph3qH}nS-+t7`<(p3`ykL-iNsq1#nMuFJ!a2_XWzo?M z6H1raR}}Pnl&Ituc9vQT{;g0E^#d-j^8La0=$CHgo#iS_cl)a@zTbOfHiM}3BW@%J ziUo2PA~t@3`AWv&pshQ`~BQ+{pcs;XR2%$2y|CZ#ws99 zG0e=Tx_kdRz1L|x7!3R+TYx!@9y_%{s1U{#N(R66d93VwlEbLrLZ%XX(^iWZhSo3x$D<8cEwf>S zWRL>0`Yq%shF8F54FUF^ObcL@m?+Y9Dol@fB_kdj1w3yAo|3N^Jl)j+nR>B~aK}P3 zSr{{)-{fzRFVaot%LblHk2<+m9~9A0i%uBcdG5@^?uG%A83b{tDew+hx78L&>5HNy zWDx%;K^!sB50Jqh{cm{bO1r=>nBgWFI;EPcls4DFi`T+V1FtRzFHG_M--6ejBLjFz zLiNwUYk{f7|8wvf;s@}`7bJSZD`N1PyCn-=Qw?5UCMXMDlkxr!g4dYK19)*X`A@;? z`a}Obew{RR6lnfPJBHJI11ARG`M4;N=8^!^Zz^7BE+OZKWNVX^iu6d&IQAAy;z3TB6CpkKJ z*@8(&V&?rDvfigj3RQa}uqnvdjSFBVnRz2=TVaZ5@PN+&tx?QI2|5kC++)llm-7iq z4(I+84R<~qE?PwIP2`^h%+~r{Uq=r)PNMgDliCAdR1rS993RY^C4{9D1H_r3KVmrH zOp>R#D&ZBr!*RD7o9-^t4WS-P8^LB2Q3MO0bru##2O~ zAZUdgC4)X+I3nn?4| zs8!Hw!ZfguuLx=b5rmT$UpbskeuRP5feW2X-iBtnhV2U11*f=EFRe*du~NRQD0~O> zr(LWpNE{ecW0&&stxwdr!LiVT-`cDxuLqP+TVx4vEQN#=j!J`)FcmU}i2bkNrbnp` z-82J=#SuiggDRQ*vn1W)#dzH3S>uz%B$|EAy|4p&aAUbI24@o6Mq)^DF^p-zN>I8I zJRhKVhFcLNBvjwWzqppqUIrv?0}{HF2qY+ggAY&@;Ax>rUdI`dAafxJ1c3s2Crnl< z*o!lq*U#%E2ebX{O^lq3wraKGh|g9lQ(%{^KT}75Ya}H%J@9MO5i?d5Kx?i{({6*g zE3WKsj2gXSzhT#QKmew`Z#m`)EHSj^qij@);pw6nwTd0loYC+{pMa8_1WLzgMf4a^ zV97QEq6m!HAlOP@-GWUC`!p1^=b+r88vDd@$=g^ta4;b>=$xN14X}}C{eX_`(u8N&F#B7)hbFG) zJPtYsVig}u54Sc#M7^#c*M2dque(0TJ|r_7Mh*-NNFC9UgOIq-S{Hr+fnzk&Tm)yQ zqSfj710Z$+E5{&HtPWLT(;EMPnhgrqRy54U zawVZzdpU58RnWiq9+!EV4H;x-=GJT8yuGET>Xe0 zEh-(}|A@9P9A8M|XRUR?C<@wBUgRxdtolkl# z*OjXap2!)a~U_Vpd^nTDQd`;$`Q^|jO*^$lHVB`Vz zpxY@=CYYs&#(rKlW3+8vz3Eez+eU_acnCsF3%cJINK1*cLt#h(%Sf>Uxmfh*i>xYQ zfht3#^a~{gEs2up$JFj9`&g&1KqR4x39vkwAGAofw@B~$i6ja4fR?`)DvVyMU+o?r z!J#dv+XI`X-yT&j`5(txwx2?7qRI3(E3AsjB*&*+5FNdHV=s)EokYnAwQ{}2sIW`W zi#@S^m$ZTgHT^!ji63mdp8K30CJ8rAO{99eJ!to`2kv)1E6 z?U4Zho!((Urjd^eGz8lS>%3L!QVuqm(MldY;HoOOs+c0wC((>Hp({16z(Qu0`Ege* z<(h`_F6I=V&DLkNC7TR`0q!;XT@~{ZE5(nnrxs z0IiJdg^hbvCqS>*PF66`I%tTv9pEaF1!oE1O){G@PmnT&BrMb(o_n^s z3Mj4^>*m@Olff21j{cDEL92;D$R!2x2#--8hT2Y1N;bjI1m1T?9r2ci(B#5e^{sRx z(G_maozMS`Qf9$YM;5?PE@}_hM#0r64wiC}=qk+^y=+u)H5y!$a)$i*Ucptx3gdCJ zmf|pPE&gi4!kx48xpzu&A!B$;~-=YWkkIS-Gw^%`~3Tl%;a)k4J0LcCdfFA@9W zU)6zUa#iB$#KGJC7w%T| zdJEU1P~+@3j=1WNpjmuVZpElKyoCcGxghQ52m@&sUV|C}I0;^O3p;VAUgcx?m;)4) zfyKh3s7_SG*Xu2{;<8c4y@ekmAoVelyKz$G=jy|}^CuakuFc1(_tWgDG`|lH)DlQC zB|kNvc33?CkBKATCBL!Pk-iGx3cVXK`VY1Q^c&`W2fJVOU$V8rRO*wm^%3arP!6;} zvu7~BwN8x+PvXR-1;MUxjD_Ip%Uge^M=YR=M`~h-S7tdx@c^bVuNtCYg@K)!{E#| z+-$}Ti!D(V*}Q@oGH$rq+J>jdJZb?R88=+*9xN!BQEHxLE(R^>z&weJ8-9UayB_zj zZJ4QZ_;%ij$-%av8XZoIo0@u)+gywx{9-VXoB$A3VL3rIk%ZYyo>exZY%Xyk`JBU< z0U#ncGazrB4YM*smfm?39|)Is3`ej9WJA~)1iP}e60u;rt)NXQSCQ{3B0pGCoLc>+ zSy~J?|FMf6J4=fX97uOF^#FKA`;j*V?VqMCB~u)+FSCBC&H4z15yWV%ZdtqByttk>M9Xm4Q%HO$lnC#+U3mhukzdC{u^8 z(vX9t>nOE4s=S4s3VZ@HrgX!11twqFW8hu*8O8mFi$i3q%92}xxEYH3zKcVyZgIZ} z;(o5UZ@9SrLEOIvah;00iMYh(RE(eG<71>g;#Bhn{rH)z%YCL_C4C(o7(T7fK6|h2 zIo@k4n`lpMPSj&<+TC$qHD8alO)cjvZDtSUosmTAv9=h-h*s}B=^j68O_uFKMTY&x zd>W_=sx!igjmgIz$;+vT*AKKQD-_h9*YImtRaW)dwbC7MTNGY5(o4Ke#mPM%5)%4n z%3{n6ZEbiRscDh0Nra<|U(><`72JDCq#Xl!#Fsa)UUn z_B_21_=?PTJV*(F`G)q$?d1!-_G{zR0hDIaIYkAXLG&DZ&mVOhDG&HiFm^!CC@h;jKmBAZR-lJ4I zmK9y%%9T_`cir;|4B_mu=JBX&JQivp0&2C8m)uwn!?!THa?MTs48p$*D%z<7PSdA2 zhVOCtGEYT)QocaN!kc`Sd@a(LsL$8;Bfw;8rCf7N%i>=w^vmY{lDWrg+7!&S$u+Z@ zr6{au$_;4` zc^ktZX+~hze6FI1Jcyq8LdqL;!rL?RrbiNYl zoac45g{#m+Bd&WLO#xLMJ**nxuCFN~K6+caY(#iL*$Td;7<7p|k*P*LgnEc*s7D9O z5?9ojq5w(})E6{YPefa-MG#gh6B~bvRrIZpGYo*R$uvl!ccN;HDA^!Ur1H&Tz1=2z z#fvx@wBBTmtjA|B+F*ddPA;kVQX;fv6#3T1L+HV70l9ian^O@}ZCEu1cgi^}q@q-r znZbiOgc55`-EWp^K!_9YJddddWImtWw)I%p>Lbp!|1*oCPPcmBmNT;N{oP&$rPoYA~LWyb$cKSp)Y!D z*3RhBv0U#p){@P#oKKWVE0skyE?Fe#oL%Y07jenaK2R;kbXTe7;)>tFsh0o{melRE zdro!v6?LK6Uh{mCae02GF5*lD5UXrgrv<))WNbq=mBlw zA8`+^K>3Q?MUuKuWcJ-q01-nJr?Q`ZJLx_AS;&Ds`F1r=zv&6Mtf$`^E@F+NKc57v z{CeXb=RhX?v*iC5^M5&C?vLp6B?}mzpPEN5@8hNH#Ow{w8OdM$CJ!>iZ6P|BwdFYv zFIyh19Oa2*)|MyGYn2s&Fx9b$BIgXFeXxcu05i9rPSvySs~)ARvUJShQxkpC63r*0 zr7I;J!_%|8RVKwr-IOVhB}|3RHDwAdDRaqIRut~lUKambuli8Hcf(?{g#nXpYUh%7 zJMY%2++JN}qyBmqiq0L}e4)s!QRE6V?eGdN%o@5fM()em1NY^k)EKfQM_k#xCjamU ztjTG9+v(40DL$#s;j+Xtwj>|cdi=MtYS!b#TP(?1g|r-pwH#OXSdO(^X*ou8mmIWJ z%kg2JMos<}C+c<;=m<9Fy}VjVCB?~K=W*$z8PjRuX4Y0yXl455CpYyb9M$^2@yjK% z8BMxRrBw{=#D4KmB?0aY71}#pS_D4 z+^3P39uTV;skGym^?28&y^alNO?w?5usiK7vc&7sUbon{r@h4%YqX1!16H6Th)uHs zof*GafyeOa&vGVlWD&}WrtfP$6S7xH_``X~9P_`JJnxgaIl~@r;GkxKIDqE7Bfr#G zGWT=WA3g&jmREm3$^KhYN1k0zW;%XIzX=tu61ujqc@&t*ERnQ3w@=RoZt{6un5jm(0wqRL_db&wfMxLStCsi0yQ-s-G zltx)NUVA@vQZ6ZUUq~-#lR3NHgl88MNy(o(gJ}*1Z5b2oL&l9 zh`HwzaT~DiH?pfFFWpWXc2f~*m&M%i(7hBho21har;EqsUz*U)$Cg7H9jOLnl752! zwmhouI)C=KcvP%L63fPbrp1giphyqH?M$YK4zZ5mdy9W~C52c~%pL4ZQxO;NP!77( z3gKS2Xg5iwYzp5+GYiw{TvuRN zxCIHH5pmH26%F*H1KCAY^n*Kwl&X6al3Ty81iD>j<~XFDsCVV;eZ-l7xgbKv3aSPs ze?G~q3e<(lwUmgk*nS?0i>sJLT((!k0fGpKA-Dz!%dS$hL=~K$@fgw-pXFj&96suy5S7*0W{zueXh#Y zcQQTlFX!K`Y2BgWC7KTxXZT*9pQ<)Cpqy>tvm)VIax#nmU7uj#*ZP!b|NC`6{?f_R zMqW8cUN&Nz#^RYx1VmOnf!FC zt#fwenA>Q{Kj7En6If?#&U^c35-t}f^ITv>qAj_F>lx}ax6$~j$E<+7q9x9RrG~IR z^Zzna!Ze-opKFGo1bMGvK2nLM2Ri7fE>3TeIjW|{Bwp@MbNjS63#(sx@WV!55q_51 zJIW6#Sz>eLsHr1)N10u1S$smiH1%1g@s9olW(u^7s*3dXmL~Pw*~&Du!g8pLO#ff+ zZ|#b;>ML^fjTMj@Lc#S2dp`L;-`ZO8V#^GJr(Le*4YsKktDDJNvG;-C%58EV%m=FB z+)B2#jQ0#N9Lop_GR&V(2HOmeGSsK#cb5)6-6JE>p88P zZ;^;qcXEq&?jcpp%gd9W$CQ9Az7)zs%B-N3O8SgGC$)+yT-Uq`YU_lkXhicB!@-ZJ zDL*k&zL2KB-T}6QEY<+6I~>rn?4Z%i&XSGj`kq#Wdg;gwSl zqO@6sIl>v?E+x0#g39d7Oge4!%GN}yQ=}onNf{b1M^v8p4i*OykI0*Rbj=oaqFOpv zgmdUDQz>s-pGl(Eq9b3@tG`D`R~d@orwnTdIa%4vU(62&s-T>m^O{v&Wp%2g(hgB} z)4B4`N5)ay!Ai&_0==Xc(+xdtCG$aRgSH^8MD?iH_Wx+iVH$xR*@Z=&EKfrl9yK)b ztCN(=FqenQ^)t<${FCO=AA zhWI+3PvV^99oN~iei=z5LFBv273TT3*diFb90!`bB1k6rL=L%hNmpsK)52`l5`iTz zG47ZMd)aIJ6wEf%+L@hm3egNQoRO1Ca7mvUXNUR%B3KWEFv5*k7vm;WXYSExFh)J# zsbW3o${U+RsB5$av%+vkBpVKrys8k^7x)`mtBd<~^~GkN=90Szqd4*y!z-D{F*SY@ zqi*^{DWx-($V}SmlFw^Fu^68uD>?^JSq{*-vfTknDcZ7akxMd@x8#r=k4REyek6RH z@^z;mq6gUxTkOMRbYuygo!Dlg5IIFPd!QQC16qF|6pZP@g*dmjDJXV?$fr~g*KxSD zx?m-XGzvqndX3|NG_F^?#wE5B8q)gB-d@9Y+$0BHte#Smiabu^YEAk7T?&jIp@;31 zE?XEho{zMU&`Y6?Z6q~a0NVs`tWKD?bz+H7$0Ibhdc?)?YK z&bi?58{UFo5f$?3vIwHU;zQ~V&;lK38k8!+Vm6Qd?jsGbc$ir?1%eWTaYd(svhsP^ z3N~(LhRGMVj8IcFu$rD7B9-Yg!T>YNBS~t3R_ZEq0cd1*$;+WZPRC=m4pM@!zAhC_ z2~%MVdH~CtOL5f_#K5sv3hmt6p~vkQ7jo@I*fSw>(>smWKOh>1Flk7K*I15%sk_Wy z+d(uZ?%025D?OiyL3r&R!luGq*KWrVaM>nY&2EoQLgc}a@mjR}OZ542uD;Ry)Q`wEec4zY@BRWrYvT!Zb>K9zuV2G%Fn-el z`BxSb%z3}z=NI5b0{q0q&}fq=6qJ3H7>hMX9RDb_2qAUfOXv!Qi5=xxUnbGpUdc%> zE=~%-0ek31ox@&`8cjrDCTb!Mm4(2pqK2oSZ7W{GUAt;$=nbM1t2e+SUBcpt_w~t1 zjpXppwemMMi%O7F7fT8Agcm9f(uL&%BH*~2JEwXqQY&?-m1c{rts;@2nVSJa8xw~<#*;h=HQBU zr!h(lg8IooXuu+WBZ;@*Es+-MwDq4-B&~N%KTD+_;v`P;OnQAtbt{Dze_Ej^zt)T{ z841f2OHwCRJ&Dam{S`9tAyU1u^Q8#}77R-vDeK@uAfk0#|5i2?@IUUnbp| zhDU(6M4dC~{J0`MwT0p4dgh!zNz2dl^P!|Il9;d$^>Jg|iYe~b+q9U|mr77XFNBkT z_wc7f45D4$xoBT*SM@_=$by{`PNMkMDq9q@wOc&@0tHO!>v8`NZS;cMeQy9%0-WCD zZQeA|TlyCOCsVfboH({Q_nbgK#UDw|NHKC({Z3WEkx0JOnQ>J0^$ISaDPeV?R2`aY zGN75~BiN7>UNS<-A|gmS_(3W{t}Udi8i=5m0CCNcR?ZQK7c=e^KI5HB2g%yO-E#Ou z#58Je*{G+zg}0mPMAXi|M1W>8QKG_uPd_PF3x(C%vS)LX%dybwTCKd$TB39zp!QjL ztsk{J;9nm1h6rR>Y0;MsHBJ!@naz`e(xT*;ak|nd3J)b=_~3c&a64QGY;kH~fKPOZ z9pqQ?u}*vHp3xtD+)qNpv=SS)#P2ZJVKv`M{x#GK>@-?5sSNbCsX+^M%H(kk@17o|A zgcv949d7!bgb3m0@-tenLu7Glh-2J!l;BQm@f4Xy72+A1yy*LC6}#%D#j3jb>mMZg zhQhZT3$K5rclgXTDzY*$ePn7ewyW4w-}@|A_fnrj6l4AENteDLW4}h1=KV-~7lyL3 zL3MdEpgNB<#E4UcPz7rbOce@-%zopZ-XNFpQl`v(DhHMNJ<3!(vT2R}L#cY-yiQF| zKCnLBmHG0g&?(@QV)WcI{G8-xKDF(GzYv(Sj_E?vI4=-~jd72EBbt+39@=_fi5g9e zm~tjK{9}U!O=ep}aHj>gd)58E=7Q04C%8kw)p=1D#!@!9CAn=NR%LE?UF`{k&yp-P zfG$8UrQ`xldmAV`jdLIWo%|n6wSjG5ns%0KG>Vyt^K8?BMKauIl_o!Qi5d4GIK5{8 zoFs(ZA_f5c3a1f!5^wld1hj+w7*5(`418wng>*_cGqsc!CVzfm_i@zu^LnU=6z>t1noWFsoiw;$5y_zly&I%Zv^ z41yz|^%^f`P%08{HC^UC+BRyl*DwHoSz;&r($bIMq!AbYB*%x?BQvfaz3NaO%%)W) z_85KgM|5IBQ|lu%)$gUxb*wVz2YNAhPrS&;y;zt}aF0pk*VDyL4zYC@cRyoC6}|Yc z(E3!$$`B0~Dqca#C{0dMS8wJ{!AEJyoLjt-NRhL+Gp7bv>cLsMx=z@|;P;yD)wChL zX(6iA<~o68x!IwG%AnBvfSt{b9H{=VeuaA-*BWvWYslD!mf8JolmV;seihzSYPx5Z)p2fdELW zLbr9riTdM*6MlC{&MyrmLVQCkMF;F0#)MH49L3%tPK*=h4}A7(ZPjT_mwe&}*IOb& zPRgNI31Y2ek=TPBIiD#-%JYt5l~InUoY}h z;{kkhN@3f$06n_X5$h|~pQ0H77)VEv-3bWx#}ncMJ1>ehX;dY4$1{htAJTi_sUFy)iJDFN~ zhdwIC|Bed0TiA80_(gyGP&iA*fI}@dJb-_j0G`D6D*q;xvJ)LZXnnDlcW$LJSxBT~ z3`i^g87L2>WX?aRjrRIqbXDLAs!UgAby#g~KYg0Y1PkHWtu)(JMkjh!rfzgs#>pkU z5?Ece=t=yeo>BdtpnG5#J)_yKGKzGSjRa>VNf6MZdn4(n6a$Z!Ra4KPDGU4LOuPY? zdJM^NTG?B57Eva_u*k~?pm-qvB3+@h4POPfUIftcV)>&T3 zZZF=-o?Yht8xPw43)#sw8Kf_ipjj505gKjB3G`Ta_o_zL9>1`Unz(}qjv0##WT64BG{#xK-f zjm9PUfw{4AWn3|43Uk#V9Wlgo1|1VuND8&j$(^f1My8*!7AS@IC?nrT|3Q2Hz@d$6 zPjLX1n3V@8Br;WTYMXvsi#RH#DRm4iKhr|$BUG4ArvJ}b?f;;@1)2KtPgkFol~d|7 zG^umgGA*Qm{qMm0>P&qyvgx{U9H1CB)`b8Ihu&#;a!u5@Pgx2QY`F(d)L~U==RdGTXRbYKkzuBI(uS35<> zY%rib3R=%&Xeq^BO3=)aHh_Wlpn^3)?Z}5Kd?hBrvZ=RSQ*VnG-(lngt-FU@*^&=4 z&nQ$y3u~-smB|!B0BMjEiMG9krV+OSUBUY^b9$Q>e<)q>0|5Z*XcTR(3~i%_NJIU8 z|BFqZf|yCJH+$*a-)t6BD*GED0WT93JkIz4T>|U zQnf2f*Cl(Fh4Q0uiog-F$UyCe)z&q9>%?A_lD^z$D8QN(a~6uo(M6mN&K%7;WO*VI z_jB%Gm!^RUYzm4UBE(3g*#?S3i@f48aj(5(&zvt(Z!84T)^NYQW{a`!3mysAWKNDw-p?6PlyB zsb<^6Hi%PzhHo#k7uVgoWGj+eoGQF=8(5oCQ%Ie~;)2u*`o70@7t_rP&cva1m4|kV z2;!oj*i5t8H#V-ABH|*Ymf%sD=+4UliEZOKSSc)Gi{G7L-At;aGqylSVohy(7 zrUkA*dUTV^@KUNZLYx{fRz}{@srH>$Ov9n0MJ)L(T{?w0@*W^FS0FLS> zjiAB@Z$Y!mm%*fOE8i_W@_~!Wm&QZE)LZa8=@`NcN^e!Z&zzFa*8e)FjquIoy9^0j zcD_&GPrXG)yW0saxcaj5-F8a88

m|8>3xPsw+m^2M|BWspT9>kx&eCcOnmUDkkD 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℞Az^+OFUTH#jJyA+qN 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%0DWmc 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