diff --git a/.efrocachemap b/.efrocachemap index b800ac8b..3012707e 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -4096,26 +4096,26 @@ "build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1", "build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "4c5719f4c7ab007be49e25f7d1c2ebc3", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "f94530fb06665cc65da84a0998a8c34f", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "4565fe7bf5497a1e6f26791d370cbf36", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "861bb4628d6e98833f34cd7fe188ccb4", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "ef45f0ea1f16016366069670869a105b", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "ecb70cb07e1f2a971faa6932278e623e", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "80cad1c9c9d7e95bba8fca46a7ad71cb", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "a62d9dcfec465b4e8e9e7b516ce20d6c", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "53ea2045ee7324176fc41f2c92e34c83", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "a48f988081b53a8cef28978e2779ad53", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "ca6f9f14f49e9578c79d4e192bae2a23", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "b3189be75ff31435fbd0deebf4d05d86", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "37457582e66d96fd63583e64d3392521", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "1505da6f4c3b5a5b5987c485271f567f", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "540e2954f30c48148e1c4824f484ba42", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "bd41f4930a3c1b0dfe1eb992bd1bd2c4", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "d226791f74aa398fd07909ba69eb2a19", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "59f65a8cbcdf13fcb30aec30d053fa85", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "cefcdb5c49a4a3f848119a9159d832f7", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "ea787281130d9e3565dd49b7776fb3f0", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "009e9834589fdca68dad7af91b56a9ae", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "5f307993914ffd163b31824495103533", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "eb06b4b7905a67fb2b7e65d543872b8d", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "4fce2d86cf75558f089f8bc67476cd8e", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "954288b391c83f0c124d0ab9b2f3ef5b", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "1883286f80c4f53723f3d0338a3c3c31", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "ad63b8d21e6ae4fd0274875c4e66f6bf", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "f5c69292fa9b046ac86b9c938b139dbe", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "9e53108985b005b5c5403d992a8eb5bd", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "f5e9323ce05bdde512c4a853e0a46d71", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "1a572a5722992601bfc510499083d980", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "b26537fa8323d1fb159f4f07c035d0d3", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "a70a22456f7d6d3cc2826f27627f302d", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "868d55c194a4834d8a373c8d9300f4a1", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "1a35b2a949f8d900a1fb640592a6d5f9", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "f2465aed23f9dc56fe1ba17a8e528563", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "d32b49718718560b44ef3b4e99a1dd96", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "6ff6d0b91e51c4d3a8bb134be2bff23b", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "64c03fe1e1bc86b49079bf5dec74d484", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "b905501fa611121ae9e34db5fb841921", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ad908b297b41c2fdf13582e34c434245", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "086a2ce72497e44079ad6b747fc5439f", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ad908b297b41c2fdf13582e34c434245", @@ -4132,14 +4132,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "d7a1d4deb51b0792d083737477e6833b", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "4c11b81a574aa9af593f54db4d998e61", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "d7a1d4deb51b0792d083737477e6833b", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "d52d476f324fd3c0c1f99add058aa405", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "059bd84629b72597c692b3a6b6cf6aa9", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "8428089ffce127d5eedf8d9cbafa2ffa", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "0d267d44801387189b44896d4b6027b3", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "114f954bc27541998dce635b25e3ec01", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "eb84b5585f44e853604fa059ac57f388", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "579d3f0ad1d0f79522408d6197413a88", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "85b61a46caa9ada867f0c643ff28b6cd", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "e900c88682cb4e25a3f36e798aa167db", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "d74de72b01b831df93e14a77f8351a75", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "44a8676feda50e8b831f707041b6053e", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "c7b6d06e55a914e94cf7ab84dd7ed617", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "cd7aab8432d4ba5eefd1d36261bc1928", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "1058ad3d671eb62dc52a971cf231f5e3", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "96908e3c333c66c2010136c11ac4fde6", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "d962d4f91a10bfae22e96c9e74466c4a", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "794d258d59fd17a61752843a9a0551ad", "src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d", diff --git a/CHANGELOG.md b/CHANGELOG.md index 229ce86c..caf97a4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.37 (build 22011, api 9, 2024-09-24) +### 1.7.37 (build 22012, api 9, 2024-09-24) - Bumping api version to 9. As you'll see below, there's some UI changes that will require a bit of work for any UI mods to adapt to. If your mods don't touch UI stuff at all you can simply bump your api version and call it a day. diff --git a/src/assets/ba_data/python/baclassic/_appmode.py b/src/assets/ba_data/python/baclassic/_appmode.py index 85e5a6d2..7d130394 100644 --- a/src/assets/ba_data/python/baclassic/_appmode.py +++ b/src/assets/ba_data/python/baclassic/_appmode.py @@ -264,17 +264,23 @@ class ClassicAppMode(AppMode): import bauiv1 from bauiv1lib.achievements import AchievementsWindow - btn = bauiv1.get_special_widget('achievements_button') - - AchievementsWindow(position=btn.get_screen_space_center()) + 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: import bauiv1 from bauiv1lib.inbox import InboxWindow - btn = bauiv1.get_special_widget('inbox_button') - - InboxWindow(position=btn.get_screen_space_center()) + 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: import bauiv1 @@ -339,26 +345,16 @@ class ClassicAppMode(AppMode): origin_widget=bauiv1.get_special_widget('inventory_button') ), ) - # ui = app.ui_v1 - - # # If the window is already showing, back out of it. - # current_main_window = ui.get_main_window() - # if isinstance(current_main_window, InventoryWindow): - # current_main_window.main_window_back() - # return - - # self._jump_to_auxiliary_window( - # InventoryWindow( - # origin_widget=bauiv1.get_special_widget('inventory_button') - # ) - # ) def _root_ui_get_tokens_press(self) -> None: import bauiv1 from bauiv1lib.gettokens import GetTokensWindow - GetTokensWindow( - origin_widget=bauiv1.get_special_widget('get_tokens_button') + 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: diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 00a3d142..ef617cf6 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -52,7 +52,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 22011 +TARGET_BALLISTICA_BUILD = 22012 TARGET_BALLISTICA_VERSION = '1.7.37' diff --git a/src/assets/ba_data/python/bauiv1lib/account/settings.py b/src/assets/ba_data/python/bauiv1lib/account/settings.py index 0a16d8c4..eb4bdc4f 100644 --- a/src/assets/ba_data/python/bauiv1lib/account/settings.py +++ b/src/assets/ba_data/python/bauiv1lib/account/settings.py @@ -334,20 +334,6 @@ class AccountSettingsWindow(bui.MainWindow): ) 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 - - # Update: No longer showing this since its visible on main - # toolbar. - show_achievements_button = False - 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 @@ -422,8 +408,6 @@ class AccountSettingsWindow(bui.MainWindow): 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: @@ -876,43 +860,7 @@ class AccountSettingsWindow(bui.MainWindow): 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 - bui.widget( - edit=btn, right_widget=bui.get_special_widget('squad_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 @@ -1212,15 +1160,6 @@ class AccountSettingsWindow(bui.MainWindow): 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_manage_account_press(self) -> None: self._do_manage_account_press(WebLocation.ACCOUNT_EDITOR) @@ -1401,10 +1340,7 @@ class AccountSettingsWindow(bui.MainWindow): 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 @@ -1417,8 +1353,6 @@ class AccountSettingsWindow(bui.MainWindow): 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 diff --git a/src/assets/ba_data/python/bauiv1lib/achievements.py b/src/assets/ba_data/python/bauiv1lib/achievements.py index 00744b3b..36d182ca 100644 --- a/src/assets/ba_data/python/bauiv1lib/achievements.py +++ b/src/assets/ba_data/python/bauiv1lib/achievements.py @@ -6,55 +6,69 @@ 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 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 = 600 if uiscale is bui.UIScale.SMALL else 450 self._height = ( 300 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 super().__init__( - position=position, - size=(self._width, self._height), - scale=scale, - bg_color=bg_color, - edge_buffer_scale=4.0, # Try to keep button unobscured. + root_widget=bui.containerwidget( + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' + if uiscale is bui.UIScale.SMALL + else 'menu_full' + ), + scale=( + 2.3 + if uiscale is bui.UIScale.SMALL + else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 + ), + stack_offset=( + (0, -10) + if uiscale is bui.UIScale.SMALL + else (0, 0) if uiscale is bui.UIScale.MEDIUM else (0, 0) + ), + ), + transition=transition, + origin_widget=origin_widget, ) - 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, self._height - 38), + 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]) @@ -67,8 +81,11 @@ 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, + self._height - (27 if uiscale is bui.UIScale.SMALL else 20), + ), size=(0, 0), h_align='center', v_align='center', @@ -79,16 +96,21 @@ class AchievementsWindow(PopupWindow): ) self._scrollwidget = bui.scrollwidget( - parent=self.root_widget, + parent=self._root_widget, size=(self._width - 60, self._height - 70), position=(30, 30), capture_arrows=True, simple_culling_v=10, ) 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 @@ -224,15 +246,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/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py b/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py index d4492bf9..dc185f2d 100644 --- a/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py +++ b/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py @@ -24,7 +24,7 @@ from bacommon.net import ( 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 @@ -551,13 +551,13 @@ 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 diff --git a/src/assets/ba_data/python/bauiv1lib/gettokens.py b/src/assets/ba_data/python/bauiv1lib/gettokens.py index 0c3baeb8..c923ae18 100644 --- a/src/assets/ba_data/python/bauiv1lib/gettokens.py +++ b/src/assets/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, + # 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,7 @@ class GetTokensWindow(bui.Window): ] self._transitioning_out = False - self._restore_previous_call = restore_previous_call + # self._restore_previous_call = restore_previous_call self._textcolor = (0.92, 0.92, 2.0) self._query_in_flight = False @@ -314,14 +312,14 @@ class GetTokensWindow(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 + # 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 @@ -334,8 +332,8 @@ class GetTokensWindow(bui.Window): super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), - transition=transition, - scale_origin_stack_offset=scale_origin, + # transition=transition, + # scale_origin_stack_offset=scale_origin, color=(0.3, 0.23, 0.36), scale=( 1.5 @@ -346,13 +344,19 @@ class GetTokensWindow(bui.Window): (0, -3) if uiscale is bui.UIScale.SMALL else (0, 0) ), # toolbar_visibility='menu_minimal', - toolbar_visibility='get_tokens', - ) + toolbar_visibility=( + 'get_tokens' + if uiscale is bui.UIScale.SMALL + else 'menu_full' + ), + ), + transition=transition, + origin_widget=origin_widget, ) 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 = bui.get_special_widget('back_button') else: @@ -363,23 +367,26 @@ class GetTokensWindow(bui.Window): self._height - 80 + self._y_offset, ), size=( - (140, 60) - if self._restore_previous_call is None - else (60, 60) + # (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) + # 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' + # 'regular' + # if self._restore_previous_call is None + # else + 'backSmall' ), - on_activate_call=self._back, + on_activate_call=self.main_window_back, ) # if uiscale is bui.UIScale.SMALL: # bui.widget( @@ -446,6 +453,16 @@ class GetTokensWindow(bui.Window): # 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. if not self._root_widget or self._root_widget.transitioning_out: @@ -815,17 +832,18 @@ class GetTokensWindow(bui.Window): # self._ticking_sound = None # bui.getsound('cashRegister2').play() - def _back(self) -> None: + # 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 + # self.main_ + # 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) + # 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) diff --git a/src/assets/ba_data/python/bauiv1lib/inbox.py b/src/assets/ba_data/python/bauiv1lib/inbox.py index ee4b4108..cb3ad3d5 100644 --- a/src/assets/ba_data/python/bauiv1lib/inbox.py +++ b/src/assets/ba_data/python/bauiv1lib/inbox.py @@ -6,58 +6,107 @@ from __future__ import annotations from typing import override -from bauiv1lib.popup import PopupWindow +# from bauiv1lib.popup import PopupWindow import bauiv1 as bui -class InboxWindow(PopupWindow): +class InboxWindow(bui.MainWindow): """Popup window to show account messages.""" def __init__( - self, position: tuple[float, float], scale: float | None = None + self, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + # position: tuple[float, float], + # scale: float | None = None, ): 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 + # 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 = 600 if uiscale is bui.UIScale.SMALL else 450 self._height = ( 300 if uiscale is bui.UIScale.SMALL else 370 if uiscale is bui.UIScale.MEDIUM else 450 ) - bg_color = (0.5, 0.4, 0.6) + # bg_color = (0.5, 0.4, 0.6) # creates our _root_widget + # super().__init__( + # position=position, + # size=(self._width, self._height), + # scale=scale, + # bg_color=bg_color, + # edge_buffer_scale=4.0, # Try to keep button unobscured. + # ) super().__init__( - position=position, - size=(self._width, self._height), - scale=scale, - bg_color=bg_color, - edge_buffer_scale=4.0, # Try to keep button unobscured. + root_widget=bui.containerwidget( + size=(self._width, self._height), + toolbar_visibility=( + 'menu_minimal' + if uiscale is bui.UIScale.SMALL + else 'menu_full' + ), + scale=( + 2.3 + if uiscale is bui.UIScale.SMALL + else 1.65 if uiscale is bui.UIScale.MEDIUM else 1.23 + ), + stack_offset=( + (0, -10) + if uiscale is bui.UIScale.SMALL + else (0, 0) if uiscale is bui.UIScale.MEDIUM else (0, 0) + ), + ), + transition=transition, + origin_widget=origin_widget, ) - 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, self._height - 38), + 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._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, + # ) 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, + self._height - (27 if uiscale is bui.UIScale.SMALL else 20), + ), size=(0, 0), h_align='center', v_align='center', @@ -68,16 +117,21 @@ class InboxWindow(PopupWindow): ) self._scrollwidget = bui.scrollwidget( - parent=self.root_widget, + parent=self._root_widget, size=(self._width - 60, self._height - 70), position=(30, 30), capture_arrows=True, simple_culling_v=10, ) 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 ) entries: list[str] = [] @@ -105,15 +159,26 @@ class InboxWindow(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 + ) + ) + + # 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() diff --git a/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py b/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py index 97078465..a4a1fb67 100644 --- a/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py +++ b/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py @@ -186,16 +186,14 @@ class LeagueRankWindow(bui.MainWindow): self._update(show=info is None) def _on_achievements_press(self) -> None: - from bauiv1lib import achievements + 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( diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 15c6dc5b..74a5fc0c 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int { namespace ballistica { // These are set automatically via script; don't modify them here. -const int kEngineBuildNumber = 22011; +const int kEngineBuildNumber = 22012; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 9; diff --git a/src/ballistica/ui_v1/widget/root_widget.cc b/src/ballistica/ui_v1/widget/root_widget.cc index bf8132f6..0f37e62c 100644 --- a/src/ballistica/ui_v1/widget/root_widget.cc +++ b/src/ballistica/ui_v1/widget/root_widget.cc @@ -54,6 +54,7 @@ struct RootWidget::ButtonDef { float h_align{}; float x{}; float y{}; + float y_offs_small{}; float width{100.0f}; float height{30.0f}; float scale{1.0f}; @@ -74,12 +75,13 @@ struct RootWidget::Button { Object::Ref widget; float h_align{}; VAlign v_align{VAlign::kTop}; - float x{}; // user provided x - float y{}; // user provided y - float x_target{}; // final target x (accounting for visibility, etc) - float y_target{}; // final target y (accounting for visibility, etc) - float x_smoothed{}; // current x (on way to target) - float y_smoothed{}; // current y (on way to target) + float x{}; // user provided x + float y{}; // user provided y + float y_offs_small{}; // user provided y offset for small uiscale + float x_target{}; // final target x (accounting for visibility, etc) + float y_target{}; // final target y (accounting for visibility, etc) + float x_smoothed{}; // current x (on way to target) + float y_smoothed{}; // current y (on way to target) float width{100.0f}; float height{30.0f}; float scale{1.0f}; @@ -178,10 +180,10 @@ auto RootWidget::AddCover_(float h_align, VAlign v_align, float x, float y, // phone-size; for other sizes we always draw a backing. // // UPDATE: We no longer do backings, so ignore that. - if (g_base->ui->scale() != UIScale::kSmall) { - bd.visibility_mask |= - static_cast(Widget::ToolbarVisibility::kMenuFull); - } + // if (g_base->ui->scale() != UIScale::kSmall) { + // bd.visibility_mask |= + // static_cast(Widget::ToolbarVisibility::kMenuFull); + // } Button* b = AddButton_(bd); return b; @@ -189,7 +191,9 @@ auto RootWidget::AddCover_(float h_align, VAlign v_align, float x, float y, void RootWidget::AddMeter_(MeterType type, float h_align, float r, float g, float b, bool plus, const std::string& s) { - float yoffs = (g_base->ui->scale() == UIScale::kSmall) ? 0.0f : -7.0f; + // float yoffs = (g_base->ui->scale() == UIScale::kSmall) ? 0.0f : -7.0f; + + float y_offs_small{7.0f}; float width = (type == MeterType::kTrophy) ? 80.0f : 110.0f; width = 110.0f; @@ -202,7 +206,8 @@ void RootWidget::AddMeter_(MeterType type, float h_align, float r, float g, bd.width = width; bd.height = 36.0f; // bd.x = x; - bd.y = -36.0f + 10.0f + yoffs; + bd.y = -36.0f + 10.0f - y_offs_small; + bd.y_offs_small = y_offs_small; bd.img = "uiAtlas2"; bd.mesh_transparent = "currencyMeter"; bd.selectable = true; @@ -466,17 +471,18 @@ void RootWidget::AddMeter_(MeterType type, float h_align, float r, float g, bd.v_align = VAlign::kTop; bd.width = bd.height = 45.0f; // bd.x = x - 68; - bd.y = -36.0f + 11.0f + yoffs; + bd.y = -36.0f + 11.0f - y_offs_small; + bd.y_offs_small = y_offs_small; bd.img = "uiAtlas2"; bd.mesh_transparent = "currencyPlusButton"; bd.color_r = 0.35f; bd.color_g = 0.35f; bd.color_b = 0.55f; - if (g_base->ui->scale() != UIScale::kSmall) { - // bd.color_r *= TOOLBAR_COLOR_R; - // bd.color_g *= TOOLBAR_COLOR_G; - // bd.color_b *= TOOLBAR_COLOR_B; - } + // if (g_base->ui->scale() != UIScale::kSmall) { + // bd.color_r *= TOOLBAR_COLOR_R; + // bd.color_g *= TOOLBAR_COLOR_G; + // bd.color_b *= TOOLBAR_COLOR_B; + // } bd.depth_min = 0.3f; switch (type) { case MeterType::kTokens: @@ -615,9 +621,9 @@ void RootWidget::Setup() { bd.h_align = 0.5f; bd.v_align = VAlign::kTop; bd.width = 850.0f; - if (g_base->ui->scale() != UIScale::kSmall) { - bd.width = 850.0f; - } + // if (g_base->ui->scale() != UIScale::kSmall) { + // bd.width = 850.0f; + // } bd.height = 90.0f; bd.x = 0.0f; bd.y = -20.0f; @@ -628,14 +634,14 @@ void RootWidget::Setup() { bd.color_g = 0.41f; bd.color_b = 0.56f; bd.opacity = 1.0f; - if (g_base->ui->scale() != UIScale::kSmall) { - bd.color_r *= TOOLBAR_COLOR_R * TOOLBAR_BACK_COLOR_R; - bd.color_g *= TOOLBAR_COLOR_G * TOOLBAR_BACK_COLOR_G; - bd.color_b *= TOOLBAR_COLOR_B * TOOLBAR_BACK_COLOR_B; - bd.opacity *= TOOLBAR_OPACITY; - } else { - bd.opacity *= TOOLBAR_OPACITY_2; - } + // if (g_base->ui->scale() != UIScale::kSmall) { + // bd.color_r *= TOOLBAR_COLOR_R * TOOLBAR_BACK_COLOR_R; + // bd.color_g *= TOOLBAR_COLOR_G * TOOLBAR_BACK_COLOR_G; + // bd.color_b *= TOOLBAR_COLOR_B * TOOLBAR_BACK_COLOR_B; + // bd.opacity *= TOOLBAR_OPACITY; + // } else { + // bd.opacity *= TOOLBAR_OPACITY_2; + // } bd.depth_min = 0.2f; // bd.call = ""; bd.call = UIV1Python::ObjID::kEmptyCall; @@ -649,7 +655,7 @@ void RootWidget::Setup() { } // float xoffs = (g_base->ui->scale() == UIScale::kSmall) ? 90.0f : 0.0f; - float yoffs = (g_base->ui->scale() == UIScale::kSmall) ? 0.0f : -10.0f; + // float yoffs = (g_base->ui->scale() == UIScale::kSmall) ? 0.0f : -10.0f; // Account Button { @@ -660,16 +666,18 @@ void RootWidget::Setup() { bd.height = 60.0f; bd.depth_min = 0.3f; // bd.x = 110.0f + xoffs; - bd.y = -24.0f + yoffs; + // bd.y = -24.0f + yoffs; + bd.y = -34.0f; + bd.y_offs_small = 10.0f; bd.color_r = 0.56f; bd.color_g = 0.5f; bd.color_b = 0.73f; bd.call = UIV1Python::ObjID::kRootUIAccountButtonPressCall; - if (g_base->ui->scale() != UIScale::kSmall) { - // bd.color_r *= TOOLBAR_COLOR_R; - // bd.color_g *= TOOLBAR_COLOR_G; - // bd.color_b *= TOOLBAR_COLOR_B; - } + // if (g_base->ui->scale() != UIScale::kSmall) { + // bd.color_r *= TOOLBAR_COLOR_R; + // bd.color_g *= TOOLBAR_COLOR_G; + // bd.color_b *= TOOLBAR_COLOR_B; + // } bd.pre_buffer = 10.0f; bd.visibility_mask = (static_cast(Widget::ToolbarVisibility::kMenuFull) @@ -752,7 +760,7 @@ void RootWidget::Setup() { top_right_buttons_.push_back(menu_button_); } - // Party button. + // Squad button. { ButtonDef b; b.h_align = 1.0f; @@ -786,16 +794,16 @@ void RootWidget::Setup() { // Bot-left cover // AddCover(0.0f, VAlign::kBottom, 0.0f, -210.0f, 600.0f, 600.0f, 0.25f); - float bx = 55.0f; + // float bx = 55.0f; // Inbox button. { ButtonDef b; b.h_align = 0.0f; b.v_align = VAlign::kBottom; - b.width = b.height = 55.0f; + b.width = b.height = 60.0f; // b.x = bx; - b.y = b.height * 0.5f + 5; + b.y = b.height * 0.5f + 2.0f; b.color_r = BOT_LEFT_COLOR_R; b.color_g = BOT_LEFT_COLOR_G; b.color_b = BOT_LEFT_COLOR_B; @@ -805,22 +813,22 @@ void RootWidget::Setup() { (static_cast(Widget::ToolbarVisibility::kMenuFull) | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) | static_cast(Widget::ToolbarVisibility::kMenuFullRoot)); - b.pre_buffer = 20.0f; + b.pre_buffer = 25.0f; b.allow_in_game = false; inbox_button_ = AddButton_(b); bottom_left_buttons_.push_back(inbox_button_); } - bx += 80.0f; + // bx += 80.0f; // Achievements button. if (explicit_bool(true)) { ButtonDef b; b.h_align = 0.0f; b.v_align = VAlign::kBottom; - b.width = b.height = 55.0f; + b.width = b.height = 60.0f; // b.x = bx; - b.y = b.height * 0.5f + 5; + b.y = b.height * 0.5f + 2.0f; b.color_r = BOT_LEFT_COLOR_R; b.color_g = BOT_LEFT_COLOR_G; b.color_b = BOT_LEFT_COLOR_B; @@ -830,11 +838,11 @@ void RootWidget::Setup() { (static_cast(Widget::ToolbarVisibility::kMenuFull) | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) | static_cast(Widget::ToolbarVisibility::kMenuFullRoot)); - b.pre_buffer = 20.0f; + b.pre_buffer = 25.0f; b.allow_in_game = false; achievements_button_ = AddButton_(b); bottom_left_buttons_.push_back(achievements_button_); - bx += 80.0f; + // bx += 80.0f; // Achievement count. // { @@ -928,9 +936,9 @@ void RootWidget::Setup() { ButtonDef b; b.h_align = 0.0f; b.v_align = VAlign::kBottom; - b.width = b.height = 50.0f; + b.width = b.height = 60.0f; // b.x = bx; - b.y = b.height * 0.5f + 5; + b.y = b.height * 0.5f + 2.0f; b.color_r = BOT_LEFT_COLOR_R; b.color_g = BOT_LEFT_COLOR_G; b.color_b = BOT_LEFT_COLOR_B; @@ -940,7 +948,7 @@ void RootWidget::Setup() { | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) | static_cast(Widget::ToolbarVisibility::kMenuFullRoot)); AddButton_(b); - bx += 70.0f; + // bx += 70.0f; } // Settings button. @@ -948,9 +956,9 @@ void RootWidget::Setup() { ButtonDef b; b.h_align = 0.0f; b.v_align = VAlign::kBottom; - b.width = b.height = 55.0f; + b.width = b.height = 60.0f; // b.x = bx; - b.y = b.height * 0.58f; + b.y = b.height * 0.58f - 2.0f; b.color_r = BOT_LEFT_COLOR_R; b.color_g = BOT_LEFT_COLOR_G; b.color_b = BOT_LEFT_COLOR_B; @@ -961,7 +969,7 @@ void RootWidget::Setup() { | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) | static_cast(Widget::ToolbarVisibility::kMenuFullRoot) | static_cast(Widget::ToolbarVisibility::kMenuInGame)); - b.pre_buffer = 20.0f; + b.pre_buffer = 25.0f; settings_button_ = AddButton_(b); bottom_left_buttons_.push_back(settings_button_); } @@ -981,23 +989,23 @@ void RootWidget::Setup() { float backing_cover_g = backing_g; float backing_cover_b = backing_b; float backingA = 1.0f; - if (g_base->ui->scale() != UIScale::kSmall) { - backing_r *= TOOLBAR_COLOR_R * TOOLBAR_BACK_COLOR_R; - backing_g *= TOOLBAR_COLOR_G * TOOLBAR_BACK_COLOR_G; - backing_b *= TOOLBAR_COLOR_B * TOOLBAR_BACK_COLOR_B; - backing_cover_r *= TOOLBAR_COLOR_R; - backing_cover_g *= TOOLBAR_COLOR_G; - backing_cover_b *= TOOLBAR_COLOR_B; - backingA *= TOOLBAR_OPACITY; - } else { - backing_r *= 1.1f; - backing_g *= 1.1f; - backing_b *= 1.1f; - backing_cover_r *= 1.1f; - backing_cover_g *= 1.1f; - backing_cover_b *= 1.1f; - backingA *= TOOLBAR_OPACITY_2; - } + // if (g_base->ui->scale() != UIScale::kSmall) { + // backing_r *= TOOLBAR_COLOR_R * TOOLBAR_BACK_COLOR_R; + // backing_g *= TOOLBAR_COLOR_G * TOOLBAR_BACK_COLOR_G; + // backing_b *= TOOLBAR_COLOR_B * TOOLBAR_BACK_COLOR_B; + // backing_cover_r *= TOOLBAR_COLOR_R; + // backing_cover_g *= TOOLBAR_COLOR_G; + // backing_cover_b *= TOOLBAR_COLOR_B; + // backingA *= TOOLBAR_OPACITY; + // } else { + backing_r *= 1.1f; + backing_g *= 1.1f; + backing_b *= 1.1f; + backing_cover_r *= 1.1f; + backing_cover_g *= 1.1f; + backing_cover_b *= 1.1f; + backingA *= TOOLBAR_OPACITY_2; + // } // Bar backing. { @@ -1161,6 +1169,7 @@ auto RootWidget::AddButton_(const ButtonDef& def) -> RootWidget::Button* { Button& b(buttons_.back()); b.x = b.x_smoothed = b.x_target = def.x; b.y = b.y_smoothed = b.y_target = def.y; + b.y_offs_small = def.y_offs_small; b.visibility_mask = def.visibility_mask; b.disable_offset_scale = def.disable_offset_scale; b.pre_buffer = def.pre_buffer; @@ -1293,6 +1302,8 @@ void RootWidget::StepPositions_(float dt) { return; } + bool is_small{g_base->ui->scale() == UIScale::kSmall}; + // Update enabled-state for all buttons. for (Button& b : buttons_) { bool enable_button = @@ -1319,11 +1330,9 @@ void RootWidget::StepPositions_(float dt) { // enable_button = false; // } } - if (&b == back_button_) { - // Back button is always disabled in medium/large UI. - if (g_base->ui->scale() != UIScale::kSmall) { - enable_button = false; - } + // Back button is always disabled in medium/large UI. + if (&b == back_button_ && !is_small) { + enable_button = false; } b.enabled = enable_button; } @@ -1385,7 +1394,7 @@ void RootWidget::StepPositions_(float dt) { for (Button& b : buttons_) { // Update our target position. b.x_target = b.x; - b.y_target = b.y; + b.y_target = b.y + (is_small ? b.y_offs_small : 0.0f); float disable_offset = b.disable_offset_scale * 110.0f * ((b.v_align == VAlign::kTop) ? 1.0f : -1.0f); // float top_right_offset = 100.0f;