From 690da5a3da7856199caedf24d97cba5f9dae2f95 Mon Sep 17 00:00:00 2001 From: Eric Froemling Date: Tue, 31 Dec 2024 08:57:27 -0800 Subject: [PATCH] more ui work --- .efrocachemap | 56 ++++---- CHANGELOG.md | 7 +- .../ba_data/python/baclassic/_appmode.py | 22 +++ src/assets/ba_data/python/baenv.py | 2 +- .../python/bauiv1lib/account/settings.py | 2 - .../ba_data/python/bauiv1lib/coop/browser.py | 2 - .../ba_data/python/bauiv1lib/credits.py | 3 +- .../ba_data/python/bauiv1lib/fileselector.py | 2 - src/assets/ba_data/python/bauiv1lib/help.py | 1 - .../python/bauiv1lib/playlist/editgame.py | 2 - .../bauiv1lib/settings/gamepadadvanced.py | 2 - .../python/bauiv1lib/settings/touchscreen.py | 2 - .../python/bauiv1lib/soundtrack/edit.py | 3 - .../bauiv1lib/soundtrack/macmusicapp.py | 2 - .../ba_data/python/bauiv1lib/store/browser.py | 3 - .../base/input/device/keyboard_input.cc | 10 +- src/ballistica/base/ui/widget_message.h | 4 +- .../python/methods/python_methods_classic.cc | 33 ++++- src/ballistica/shared/ballistica.cc | 2 +- .../python/methods/python_methods_ui_v1.cc | 75 ++++------ src/ballistica/ui_v1/widget/column_widget.cc | 1 - .../ui_v1/widget/container_widget.cc | 10 +- .../ui_v1/widget/container_widget.h | 4 +- .../ui_v1/widget/h_scroll_widget.cc | 1 - src/ballistica/ui_v1/widget/root_widget.cc | 129 +++++++++++++----- src/ballistica/ui_v1/widget/root_widget.h | 13 ++ src/ballistica/ui_v1/widget/row_widget.cc | 1 - src/ballistica/ui_v1/widget/scroll_widget.cc | 1 - 28 files changed, 231 insertions(+), 164 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index 71db7536..71686050 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -2303,14 +2303,14 @@ "build/assets/ba_data/textures/scorchBig.pvr": "a35c52bae0e4c3b787ae7ec075b022be", "build/assets/ba_data/textures/scorchBig_preview.png": "dabfeb58b47b9bc18f318954000e7b60", "build/assets/ba_data/textures/scorch_preview.png": "41931a131dd0e5bfc39b2778d64ee856", - "build/assets/ba_data/textures/scrollWidget.dds": "06189c8c39cfbd2611afa65500cdec7d", - "build/assets/ba_data/textures/scrollWidget.ktx": "c31f2240c43b4a166a6ff786772f4f35", - "build/assets/ba_data/textures/scrollWidget.pvr": "4b0fccd31b5e7176650db786992c6ca6", + "build/assets/ba_data/textures/scrollWidget.dds": "973cc49dd5ef456cb3a2f7c376cf71ea", + "build/assets/ba_data/textures/scrollWidget.ktx": "da663d8b4dad29717ca04d0a210fee1e", + "build/assets/ba_data/textures/scrollWidget.pvr": "4194daf9f5be8f6774cd5c578d58a491", "build/assets/ba_data/textures/scrollWidgetGlow.dds": "35cfa5b182b234fd193cb7ff1dbaa23b", "build/assets/ba_data/textures/scrollWidgetGlow.ktx": "ecc17e1824545b8c64510522b200ed3d", "build/assets/ba_data/textures/scrollWidgetGlow.pvr": "9443f6d6a5530c88a9cb907357da48d5", "build/assets/ba_data/textures/scrollWidgetGlow_preview.png": "071937a6bc76b6dd8dc9fa4e3c9114f0", - "build/assets/ba_data/textures/scrollWidget_preview.png": "4bcb8b8b7595d35fbad54fe575dcbfc0", + "build/assets/ba_data/textures/scrollWidget_preview.png": "96477fe2f5294d4886bc95b77d7309f5", "build/assets/ba_data/textures/settingsIcon.dds": "b2bde3d666e4751ab97086c04846e5bf", "build/assets/ba_data/textures/settingsIcon.ktx": "c3123be94bde0a30604a97a30687c48c", "build/assets/ba_data/textures/settingsIcon.pvr": "1caecc02aac9c2161466a5c2c9f5f8b8", @@ -4103,22 +4103,22 @@ "build/assets/windows/Win32/ucrtbased.dll": "bfd1180c269d3950b76f35a63655e9e1", "build/assets/windows/Win32/vc_redist.x86.exe": "15a5f1f876503885adbdf5b3989b3718", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "5bf2fb190bf3a50a89f960334df4d305", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "ed8593ca6f1ff5b9e2531e050c709788", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "172c306c8fc50fe4d688636772baa455", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "e9a020f503a89ccbbbe45e0d5b29b2f1", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "d9be694c1b7aba9796a17f81d7abccc8", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "9cb37831a43d787f34f587fbdfccf0c2", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "b73f382527c980e6187008a4fa7c3d84", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "4501a7c845060a3754dd2b7b9e937088", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "244be2eeecafbac57442bc88d5c35172", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "d94961ab202eff037b0aca4305a646a1", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "224fb1f5cb77ce62fe755e8d6797cb18", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "429a0a6b752cbe48cca155228f791916", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "15003e60d7f2633cd56766bc0af31b4e", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "86077c01bedaf0b9d4b727df1ffad14e", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "773eb771722c4fd86394ef1160db0a5a", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "ec8fa3c1077167307ebe8b5814ad8f9a", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "390472d8d44b0a650796bfd6022d0549", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "23f27d6f139c653f23a15a0af7f7e02c", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "097b082f8f5abb18d824b2044da1de78", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "c027478f038af2faedcc4103e75bc39d", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "5c7f18d5ff9eb14421fe3743550ddf57", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "cef0bc0d149a4c433c2e4bee5b47414a", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "25546af5cf64a0e1e1d1f46b38298820", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "7f172d6c531c371837302f370f77db08", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "0d79db47846defaffaa0bf97ec6b23fc", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "45373e10bb60989787e415ae938756fe", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "0cc3834e81761efdc50babed9e5c7151", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "4e28c4abb0e7128d08f2b84a87d8a765", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "96b856d3db5d061527383b42e588a333", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "124afb5eec04365e42b059b0c2ec98e7", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "0271c53794bdb4a762ae7210d9828fb7", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "f8b3744f90503502618130c8d28f1aa4", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "33a0ae6f1ea5a0b0c60055ce01478488", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "aad882eaf2230b89973e2cf4f13c9759", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "33a0ae6f1ea5a0b0c60055ce01478488", @@ -4131,14 +4131,14 @@ "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "ae4e3f563892f6b9311c4b7284f28c11", "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "01dab862a43d9e7c4ee4e49212442d42", "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "ae4e3f563892f6b9311c4b7284f28c11", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "eee9e6778b27ea4722efb65b573673a6", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "18fdfa5978141a5b2f3ce553117f741e", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "2296e1d8cbec0cc429a68cde4949b8b7", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "a35f0e217ab1a526852f96dba1b469cb", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "91f829af919fd293012d9a1beccea706", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "c323032fb0f5ba9e85e96b86d34919ba", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "71207aad7fb9de8eb6c77525c402b904", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "2d17014f6f47829e1dab77cc371f125c", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "2f581e3dead7038e5b94bc096a7b8c80", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "4538ad0d6b4794de96fb78742ebcdc84", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "0d1a2f2066ae412549034e981ae39e2c", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "55180e66455f91d3af8f15c0c81607a4", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "bb2c15187840ef373ae79cdf1623d3b5", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "8ee1bb4440c364f9fa91791276d64b87", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "863f70d88ab9b3c7c6910d94e26b6f35", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "bb928df1aa05c84889b45f2a00544e64", "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": "06042d31df0ff9af96b99477162e2a91", diff --git a/CHANGELOG.md b/CHANGELOG.md index da54f800..705afdda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.37 (build 22152, api 9, 2024-12-30) +### 1.7.37 (build 22155, api 9, 2024-12-31) - 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. @@ -171,6 +171,11 @@ See 'Getter/Setter Function Names' in https://github.com/efroemling/ballistica/wiki/Coding-Style-Guide for more info. +- Removed support for tab key navigation. This has been largely ignored for + years and behaved in a mostly broken way in all recent UIs. Keyboard users + should use arrow keys for navigation. To update any old UI code, search for + and remove any 'claims_tab' arguments to UI calls since that argument no + longer exists. ### 1.7.36 (build 21944, api 8, 2024-07-26) - Wired up Tokens, BombSquad's new purchasable currency. The first thing these diff --git a/src/assets/ba_data/python/baclassic/_appmode.py b/src/assets/ba_data/python/baclassic/_appmode.py index 63fbe0d8..e6cb68a1 100644 --- a/src/assets/ba_data/python/baclassic/_appmode.py +++ b/src/assets/ba_data/python/baclassic/_appmode.py @@ -210,6 +210,14 @@ class ClassicAppMode(babase.AppMode): 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() @@ -281,6 +289,20 @@ class ClassicAppMode(babase.AppMode): 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, + chest_2_unlock_time=-1.0, + chest_3_unlock_time=-1.0, + 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, + chest_2_ad_allow_time=-1.0, + chest_3_ad_allow_time=-1.0, ) # Note that we have values and updated faded state accordingly. diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 3108bac0..370155c1 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -53,7 +53,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 22152 +TARGET_BALLISTICA_BUILD = 22155 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 979780c7..6a4628b9 100644 --- a/src/assets/ba_data/python/bauiv1lib/account/settings.py +++ b/src/assets/ba_data/python/bauiv1lib/account/settings.py @@ -162,7 +162,6 @@ class AccountSettingsWindow(bui.MainWindow): ), size=(self._scroll_width, self._scroll_height), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._subcontainer: bui.Widget | None = None @@ -452,7 +451,6 @@ class AccountSettingsWindow(bui.MainWindow): size=(self._sub_width, self._sub_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) diff --git a/src/assets/ba_data/python/bauiv1lib/coop/browser.py b/src/assets/ba_data/python/bauiv1lib/coop/browser.py index 0a50d1c0..c73137da 100644 --- a/src/assets/ba_data/python/bauiv1lib/coop/browser.py +++ b/src/assets/ba_data/python/bauiv1lib/coop/browser.py @@ -273,7 +273,6 @@ class CoopBrowserWindow(bui.MainWindow): size=(self._scroll_width, self._scroll_height), simple_culling_v=10.0, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._subcontainer: bui.Widget | None = None @@ -717,7 +716,6 @@ class CoopBrowserWindow(bui.MainWindow): size=(self._subcontainerwidth, self._subcontainerheight), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) diff --git a/src/assets/ba_data/python/bauiv1lib/credits.py b/src/assets/ba_data/python/bauiv1lib/credits.py index a3dc4e08..e25b6119 100644 --- a/src/assets/ba_data/python/bauiv1lib/credits.py +++ b/src/assets/ba_data/python/bauiv1lib/credits.py @@ -5,6 +5,7 @@ from __future__ import annotations import os +import json import logging from typing import TYPE_CHECKING, override @@ -24,7 +25,6 @@ class CreditsWindow(bui.MainWindow): ): # pylint: disable=too-many-locals # pylint: disable=too-many-statements - import json bui.set_analytics_screen('Credits Window') @@ -332,7 +332,6 @@ class CreditsWindow(bui.MainWindow): size=(self._sub_width, self._sub_height), background=False, claims_left_right=False, - claims_tab=False, ) voffs = 0 diff --git a/src/assets/ba_data/python/bauiv1lib/fileselector.py b/src/assets/ba_data/python/bauiv1lib/fileselector.py index 9bafedc9..b99164ff 100644 --- a/src/assets/ba_data/python/bauiv1lib/fileselector.py +++ b/src/assets/ba_data/python/bauiv1lib/fileselector.py @@ -387,12 +387,10 @@ class FileSelectorWindow(bui.MainWindow): 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, ) diff --git a/src/assets/ba_data/python/bauiv1lib/help.py b/src/assets/ba_data/python/bauiv1lib/help.py index d0652d59..8117d966 100644 --- a/src/assets/ba_data/python/bauiv1lib/help.py +++ b/src/assets/ba_data/python/bauiv1lib/help.py @@ -137,7 +137,6 @@ class HelpWindow(bui.MainWindow): size=(self._sub_width, self._sub_height), background=False, claims_left_right=False, - claims_tab=False, ) spacing = 1.0 diff --git a/src/assets/ba_data/python/bauiv1lib/playlist/editgame.py b/src/assets/ba_data/python/bauiv1lib/playlist/editgame.py index 1dd46eda..6a7be089 100644 --- a/src/assets/ba_data/python/bauiv1lib/playlist/editgame.py +++ b/src/assets/ba_data/python/bauiv1lib/playlist/editgame.py @@ -205,7 +205,6 @@ class PlaylistEditGameWindow(bui.MainWindow): ), highlight=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._subcontainer = bui.containerwidget( @@ -213,7 +212,6 @@ class PlaylistEditGameWindow(bui.MainWindow): size=(scroll_width, scroll_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) diff --git a/src/assets/ba_data/python/bauiv1lib/settings/gamepadadvanced.py b/src/assets/ba_data/python/bauiv1lib/settings/gamepadadvanced.py index 53b1eafe..ab06216c 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/gamepadadvanced.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/gamepadadvanced.py @@ -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( diff --git a/src/assets/ba_data/python/bauiv1lib/settings/touchscreen.py b/src/assets/ba_data/python/bauiv1lib/settings/touchscreen.py index e468f0c2..7dcfdf1e 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/touchscreen.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/touchscreen.py @@ -89,7 +89,6 @@ class TouchscreenSettingsWindow(bui.MainWindow): ), size=(self._scroll_width, self._scroll_height), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._subcontainer = bui.containerwidget( @@ -97,7 +96,6 @@ class TouchscreenSettingsWindow(bui.MainWindow): size=(self._sub_width, self._sub_height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) self._build_gui() diff --git a/src/assets/ba_data/python/bauiv1lib/soundtrack/edit.py b/src/assets/ba_data/python/bauiv1lib/soundtrack/edit.py index 1edbe8fe..b36b4ff6 100644 --- a/src/assets/ba_data/python/bauiv1lib/soundtrack/edit.py +++ b/src/assets/ba_data/python/bauiv1lib/soundtrack/edit.py @@ -177,14 +177,12 @@ class SoundtrackEditWindow(bui.MainWindow): size=(self._width - (80 + 2 * x_inset), scroll_height), simple_culling_v=10, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) 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, ) @@ -256,7 +254,6 @@ class SoundtrackEditWindow(bui.MainWindow): parent=self._col, size=(self._width - 40, 40), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) type_name = type_names_translated.get(song_type, song_type) diff --git a/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py b/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py index 813bb2a6..ee21dfe9 100644 --- a/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py +++ b/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py @@ -65,13 +65,11 @@ class MacMusicAppPlaylistSelectWindow(bui.MainWindow): 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, ) diff --git a/src/assets/ba_data/python/bauiv1lib/store/browser.py b/src/assets/ba_data/python/bauiv1lib/store/browser.py index 09426875..575e61e7 100644 --- a/src/assets/ba_data/python/bauiv1lib/store/browser.py +++ b/src/assets/ba_data/python/bauiv1lib/store/browser.py @@ -349,7 +349,6 @@ class StoreBrowserWindow(bui.MainWindow): ), size=(self._scroll_width, self._scroll_height), claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) @@ -904,7 +903,6 @@ class StoreBrowserWindow(bui.MainWindow): size=(self._width, self._height), background=False, claims_left_right=True, - claims_tab=True, selection_loops_to_parent=True, ) v = self._height - 20 @@ -1142,7 +1140,6 @@ class StoreBrowserWindow(bui.MainWindow): 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( diff --git a/src/ballistica/base/input/device/keyboard_input.cc b/src/ballistica/base/input/device/keyboard_input.cc index 7201316e..b25c8152 100644 --- a/src/ballistica/base/input/device/keyboard_input.cc +++ b/src/ballistica/base/input/device/keyboard_input.cc @@ -57,11 +57,11 @@ auto KeyboardInput::HandleKey(const SDL_Keysym* keysym, bool down) -> bool { if (down) { switch (keysym->sym) { case SDLK_TAB: - if (keysym->mod & KMOD_SHIFT) { // NOLINT (signed bitwise) - c = WidgetMessage::Type::kTabPrev; - } else { - c = WidgetMessage::Type::kTabNext; - } + // if (keysym->mod & KMOD_SHIFT) { // NOLINT (signed bitwise) + // c = WidgetMessage::Type::kTabPrev; + // } else { + // c = WidgetMessage::Type::kTabNext; + // } pass = true; break; case SDLK_LEFT: diff --git a/src/ballistica/base/ui/widget_message.h b/src/ballistica/base/ui/widget_message.h index 0e409662..8c383349 100644 --- a/src/ballistica/base/ui/widget_message.h +++ b/src/ballistica/base/ui/widget_message.h @@ -24,8 +24,8 @@ struct WidgetMessage { // In order to work in all-joystick environments, // don't rely on the following to be available (they're just a luxury). kKey, - kTabNext, - kTabPrev, + // kTabNext, + // kTabPrev, kMouseDown, kMouseUp, kMouseWheel, diff --git a/src/ballistica/classic/python/methods/python_methods_classic.cc b/src/ballistica/classic/python/methods/python_methods_classic.cc index cfcf45fa..2cc6d478 100644 --- a/src/ballistica/classic/python/methods/python_methods_classic.cc +++ b/src/ballistica/classic/python/methods/python_methods_classic.cc @@ -308,6 +308,14 @@ static auto PySetRootUIAccountValues(PyObject* self, PyObject* args, const char* chest_1_appearance; const char* chest_2_appearance; const char* chest_3_appearance; + float chest_0_unlock_time; + float chest_1_unlock_time; + float chest_2_unlock_time; + float chest_3_unlock_time; + float chest_0_ad_allow_time; + float chest_1_ad_allow_time; + float chest_2_ad_allow_time; + float chest_3_ad_allow_time; int gold_pass{}; static const char* kwlist[] = {"tickets_text", @@ -323,13 +331,24 @@ static auto PySetRootUIAccountValues(PyObject* self, PyObject* args, "chest_1_appearance", "chest_2_appearance", "chest_3_appearance", + "chest_0_unlock_time", + "chest_1_unlock_time", + "chest_2_unlock_time", + "chest_3_unlock_time", + "chest_0_ad_allow_time", + "chest_1_ad_allow_time", + "chest_2_ad_allow_time", + "chest_3_ad_allow_time", nullptr}; if (!PyArg_ParseTupleAndKeywords( - args, keywds, "sssssssspssss", const_cast(kwlist), + args, keywds, "sssssssspssssffffffff", const_cast(kwlist), &tickets_text, &tokens_text, &league_rank_text, &league_type, &achievements_percent_text, &level_text, &xp_text, &inbox_count_text, &gold_pass, &chest_0_appearance, &chest_1_appearance, - &chest_2_appearance, &chest_3_appearance)) { + &chest_2_appearance, &chest_3_appearance, &chest_0_unlock_time, + &chest_1_unlock_time, &chest_2_unlock_time, &chest_3_unlock_time, + &chest_0_ad_allow_time, &chest_1_ad_allow_time, + &chest_2_ad_allow_time, &chest_3_ad_allow_time)) { return nullptr; } BA_PRECONDITION(g_base->InLogicThread()); @@ -350,6 +369,8 @@ static auto PySetRootUIAccountValues(PyObject* self, PyObject* args, appmode->SetRootUIChests(chest_0_appearance, chest_1_appearance, chest_2_appearance, chest_3_appearance); + printf("WOULD SET TIMES TO %.2f %.2f\n", chest_0_unlock_time, + chest_0_ad_allow_time); Py_RETURN_NONE; BA_PYTHON_CATCH; } @@ -373,6 +394,14 @@ static PyMethodDef PySetRootUIAccountValuesDef = { " chest_1_appearance: str,\n" " chest_2_appearance: str,\n" " chest_3_appearance: str,\n" + " chest_0_unlock_time: float,\n" + " chest_1_unlock_time: float,\n" + " chest_2_unlock_time: float,\n" + " chest_3_unlock_time: float,\n" + " chest_0_ad_allow_time: float,\n" + " chest_1_ad_allow_time: float,\n" + " chest_2_ad_allow_time: float,\n" + " chest_3_ad_allow_time: float,\n" ") -> None\n" "\n" "(internal)", diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 89258c34..82c917e0 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 = 22152; +const int kEngineBuildNumber = 22155; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 9; diff --git a/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc b/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc index 4ce9db70..e10084fd 100644 --- a/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc +++ b/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc @@ -924,7 +924,6 @@ static auto PyColumnWidget(PyObject* self, PyObject* args, PyObject* keywds) PyObject* border_obj{Py_None}; PyObject* margin_obj{Py_None}; PyObject* claims_left_right_obj{Py_None}; - PyObject* claims_tab_obj{Py_None}; static const char* kwlist[] = {"edit", "parent", "size", @@ -941,15 +940,14 @@ static auto PyColumnWidget(PyObject* self, PyObject* args, PyObject* keywds) "border", "margin", "claims_left_right", - "claims_tab", nullptr}; if (!PyArg_ParseTupleAndKeywords( - args, keywds, "|OOOOOOOOOOOOOOOOO", const_cast(kwlist), + args, keywds, "|OOOOOOOOOOOOOOOO", const_cast(kwlist), &edit_obj, &parent_obj, &size_obj, &pos_obj, &background_obj, &selected_child_obj, &visible_child_obj, &single_depth_obj, &print_list_exit_instructions_obj, &left_border_obj, &top_border_obj, &bottom_border_obj, &selection_loops_to_parent_obj, &border_obj, - &margin_obj, &claims_left_right_obj, &claims_tab_obj)) + &margin_obj, &claims_left_right_obj)) return nullptr; if (!g_base->CurrentContext().IsEmpty()) { @@ -1034,9 +1032,6 @@ static auto PyColumnWidget(PyObject* self, PyObject* args, PyObject* keywds) if (claims_left_right_obj != Py_None) { widget->set_claims_left_right(Python::GetPyBool(claims_left_right_obj)); } - if (claims_tab_obj != Py_None) { - widget->set_claims_tab(Python::GetPyBool(claims_tab_obj)); - } // If making a new widget, add it at the end. if (edit_obj == Py_None) { @@ -1072,8 +1067,7 @@ static PyMethodDef PyColumnWidgetDef = { " selection_loops_to_parent: bool | None = None,\n" " border: float | None = None,\n" " margin: float | None = None,\n" - " claims_left_right: bool | None = None,\n" - " claims_tab: bool | None = None) -> bauiv1.Widget\n" + " claims_left_right: bool | None = None) -> bauiv1.Widget\n" "\n" "Create or edit a column widget.\n" "\n" @@ -1100,7 +1094,6 @@ static auto PyContainerWidget(PyObject* self, PyObject* args, PyObject* keywds) PyObject* on_activate_call_obj{Py_None}; PyObject* claims_left_right_obj{Py_None}; PyObject* claims_up_down_obj{Py_None}; - PyObject* claims_tab_obj{Py_None}; PyObject* selection_loops_obj{Py_None}; PyObject* selection_loops_to_parent_obj{Py_None}; PyObject* scale_obj{Py_None}; @@ -1136,7 +1129,6 @@ static auto PyContainerWidget(PyObject* self, PyObject* args, PyObject* keywds) "root_selectable", "on_activate_call", "claims_left_right", - "claims_tab", "selection_loops", "selection_loops_to_parent", "scale", @@ -1158,16 +1150,16 @@ static auto PyContainerWidget(PyObject* self, PyObject* args, PyObject* keywds) nullptr}; if (!PyArg_ParseTupleAndKeywords( - args, keywds, "|OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + args, keywds, "|OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", const_cast(kwlist), &edit_obj, &parent_obj, &id_obj, &size_obj, &pos_obj, &background_obj, &selected_child_obj, &transition_obj, &cancel_button_obj, &start_button_obj, &root_selectable_obj, &on_activate_call_obj, &claims_left_right_obj, - &claims_tab_obj, &selection_loops_obj, &selection_loops_to_parent_obj, - &scale_obj, &on_outside_click_call_obj, &single_depth_obj, - &visible_child_obj, &stack_offset_obj, &color_obj, - &on_cancel_call_obj, &print_list_exit_instructions_obj, - &click_activate_obj, &always_highlight_obj, &selectable_obj, + &selection_loops_obj, &selection_loops_to_parent_obj, &scale_obj, + &on_outside_click_call_obj, &single_depth_obj, &visible_child_obj, + &stack_offset_obj, &color_obj, &on_cancel_call_obj, + &print_list_exit_instructions_obj, &click_activate_obj, + &always_highlight_obj, &selectable_obj, &scale_origin_stack_offset_obj, &toolbar_visibility_obj, &on_select_call_obj, &claim_outside_clicks_obj, &claims_up_down_obj)) { @@ -1325,9 +1317,6 @@ static auto PyContainerWidget(PyObject* self, PyObject* args, PyObject* keywds) if (claims_up_down_obj != Py_None) { widget->set_claims_up_down(Python::GetPyBool(claims_up_down_obj)); } - if (claims_tab_obj != Py_None) { - widget->set_claims_tab(Python::GetPyBool(claims_tab_obj)); - } if (selection_loops_obj != Py_None) { widget->set_selection_loops(Python::GetPyBool(selection_loops_obj)); } @@ -1410,7 +1399,6 @@ static PyMethodDef PyContainerWidgetDef = { " root_selectable: bool | None = None,\n" " on_activate_call: Callable[[], None] | None = None,\n" " claims_left_right: bool | None = None,\n" - " claims_tab: bool | None = None,\n" " selection_loops: bool | None = None,\n" " selection_loops_to_parent: bool | None = None,\n" " scale: float | None = None,\n" @@ -1465,21 +1453,24 @@ static auto PyRowWidget(PyObject* self, PyObject* args, PyObject* keywds) PyObject* edit_obj{Py_None}; ContainerWidget* parent_widget{}; PyObject* claims_left_right_obj{Py_None}; - PyObject* claims_tab_obj{Py_None}; PyObject* selection_loops_to_parent_obj{Py_None}; - static const char* kwlist[] = {"edit", "parent", - "size", "position", - "background", "selected_child", - "visible_child", "claims_left_right", - "claims_tab", "selection_loops_to_parent", + static const char* kwlist[] = {"edit", + "parent", + "size", + "position", + "background", + "selected_child", + "visible_child", + "claims_left_right", + "selection_loops_to_parent", nullptr}; if (!PyArg_ParseTupleAndKeywords( - args, keywds, "|OOOOOOOOOO", const_cast(kwlist), &edit_obj, + args, keywds, "|OOOOOOOOO", const_cast(kwlist), &edit_obj, &parent_obj, &size_obj, &pos_obj, &background_obj, &selected_child_obj, &visible_child_obj, &claims_left_right_obj, - &claims_tab_obj, &selection_loops_to_parent_obj)) + &selection_loops_to_parent_obj)) return nullptr; if (!g_base->CurrentContext().IsEmpty()) { @@ -1533,9 +1524,6 @@ static auto PyRowWidget(PyObject* self, PyObject* args, PyObject* keywds) if (claims_left_right_obj != Py_None) { widget->set_claims_left_right(Python::GetPyBool(claims_left_right_obj)); } - if (claims_tab_obj != Py_None) { - widget->set_claims_tab(Python::GetPyBool(claims_tab_obj)); - } if (selection_loops_to_parent_obj != Py_None) { widget->set_selection_loops_to_parent( Python::GetPyBool(selection_loops_to_parent_obj)); @@ -1567,7 +1555,6 @@ static PyMethodDef PyRowWidgetDef = { " selected_child: bauiv1.Widget | None = None,\n" " visible_child: bauiv1.Widget | None = None,\n" " claims_left_right: bool | None = None,\n" - " claims_tab: bool | None = None,\n" " selection_loops_to_parent: bool | None = None) -> bauiv1.Widget\n" "\n" "Create or edit a row widget.\n" @@ -1601,7 +1588,6 @@ static auto PyScrollWidget(PyObject* self, PyObject* args, PyObject* keywds) PyObject* selection_loops_to_parent_obj{Py_None}; PyObject* claims_left_right_obj{Py_None}; PyObject* claims_up_down_obj{Py_None}; - PyObject* claims_tab_obj{Py_None}; PyObject* autoselect_obj{Py_None}; static const char* kwlist[] = {"edit", @@ -1620,18 +1606,17 @@ static auto PyScrollWidget(PyObject* self, PyObject* args, PyObject* keywds) "selection_loops_to_parent", "claims_left_right", "claims_up_down", - "claims_tab", "autoselect", nullptr}; if (!PyArg_ParseTupleAndKeywords( - args, keywds, "|OOOOOOOOOOOOOOOOOO", const_cast(kwlist), + args, keywds, "|OOOOOOOOOOOOOOOOO", const_cast(kwlist), &edit_obj, &parent_obj, &size_obj, &pos_obj, &background_obj, &selected_child_obj, &capture_arrows_obj, &on_select_call_obj, ¢er_small_content_obj, &color_obj, &highlight_obj, &border_opacity_obj, &simple_culling_v_obj, &selection_loops_to_parent_obj, &claims_left_right_obj, - &claims_up_down_obj, &claims_tab_obj, &autoselect_obj)) + &claims_up_down_obj, &autoselect_obj)) return nullptr; if (!g_base->CurrentContext().IsEmpty()) { @@ -1714,9 +1699,6 @@ static auto PyScrollWidget(PyObject* self, PyObject* args, PyObject* keywds) if (claims_up_down_obj != Py_None) { widget->set_claims_up_down(Python::GetPyBool(claims_up_down_obj)); } - if (claims_tab_obj != Py_None) { - widget->set_claims_tab(Python::GetPyBool(claims_tab_obj)); - } if (autoselect_obj != Py_None) { widget->set_auto_select(Python::GetPyBool(autoselect_obj)); } @@ -1756,7 +1738,6 @@ static PyMethodDef PyScrollWidgetDef = { " selection_loops_to_parent: bool | None = None,\n" " claims_left_right: bool | None = None,\n" " claims_up_down: bool | None = None,\n" - " claims_tab: bool | None = None,\n" " autoselect: bool | None = None) -> bauiv1.Widget\n" "\n" "Create or edit a scroll widget.\n" @@ -1790,7 +1771,6 @@ static auto PyHScrollWidget(PyObject* self, PyObject* args, PyObject* keywds) PyObject* simple_culling_h_obj{Py_None}; PyObject* claims_left_right_obj{Py_None}; PyObject* claims_up_down_obj{Py_None}; - PyObject* claims_tab_obj{Py_None}; PyObject* autoselect_obj{Py_None}; static const char* kwlist[] = {"edit", @@ -1808,17 +1788,16 @@ static auto PyHScrollWidget(PyObject* self, PyObject* args, PyObject* keywds) "simple_culling_h", "claims_left_right", "claims_up_down", - "claims_tab", "autoselect", nullptr}; if (!PyArg_ParseTupleAndKeywords( - args, keywds, "|OOOOOOOOOOOOOOOO", const_cast(kwlist), + args, keywds, "|OOOOOOOOOOOOOOO", const_cast(kwlist), &edit_obj, &parent_obj, &size_obj, &pos_obj, &background_obj, &selected_child_obj, &capture_arrows_obj, &on_select_call_obj, ¢er_small_content_obj, &color_obj, &highlight_obj, &border_opacity_obj, &simple_culling_h_obj, &claims_left_right_obj, - &claims_up_down_obj, &claims_tab_obj, &autoselect_obj)) + &claims_up_down_obj, &autoselect_obj)) return nullptr; if (!g_base->CurrentContext().IsEmpty()) { @@ -1896,9 +1875,6 @@ static auto PyHScrollWidget(PyObject* self, PyObject* args, PyObject* keywds) if (claims_up_down_obj != Py_None) { widget->set_claims_up_down(Python::GetPyBool(claims_up_down_obj)); } - if (claims_tab_obj != Py_None) { - widget->set_claims_tab(Python::GetPyBool(claims_tab_obj)); - } if (autoselect_obj != Py_None) { widget->set_auto_select(Python::GetPyBool(autoselect_obj)); } @@ -1936,8 +1912,7 @@ static PyMethodDef PyHScrollWidgetDef = { " border_opacity: float | None = None,\n" " simple_culling_h: float | None = None,\n" " claims_left_right: bool | None = None,\n" - " claims_up_down: bool | None = None,\n" - " claims_tab: bool | None = None) -> bauiv1.Widget\n" + " claims_up_down: bool | None = None) -> bauiv1.Widget\n" "\n" "Create or edit a horizontal scroll widget.\n" "\n" diff --git a/src/ballistica/ui_v1/widget/column_widget.cc b/src/ballistica/ui_v1/widget/column_widget.cc index 5fb6663e..0494c796 100644 --- a/src/ballistica/ui_v1/widget/column_widget.cc +++ b/src/ballistica/ui_v1/widget/column_widget.cc @@ -7,7 +7,6 @@ namespace ballistica::ui_v1 { ColumnWidget::ColumnWidget() { set_background(false); // Influences default event handling; ew. set_claims_left_right(false); - set_claims_tab(false); set_draggable(false); set_selection_loops(false); } diff --git a/src/ballistica/ui_v1/widget/container_widget.cc b/src/ballistica/ui_v1/widget/container_widget.cc index d6e6d32e..15512ce7 100644 --- a/src/ballistica/ui_v1/widget/container_widget.cc +++ b/src/ballistica/ui_v1/widget/container_widget.cc @@ -368,12 +368,9 @@ auto ContainerWidget::HandleMessage(const base::WidgetMessage& m) -> bool { break; } - case base::WidgetMessage::Type::kTabNext: + // case base::WidgetMessage::Type::kTabNext: case base::WidgetMessage::Type::kMoveRight: case base::WidgetMessage::Type::kMoveDown: { - if (m.type == base::WidgetMessage::Type::kTabNext && !claims_tab_) { - break; - } if (m.type == base::WidgetMessage::Type::kMoveRight && !claims_left_right_) { break; @@ -404,12 +401,9 @@ auto ContainerWidget::HandleMessage(const base::WidgetMessage& m) -> bool { break; } - case base::WidgetMessage::Type::kTabPrev: + // case base::WidgetMessage::Type::kTabPrev: case base::WidgetMessage::Type::kMoveLeft: case base::WidgetMessage::Type::kMoveUp: { - if (m.type == base::WidgetMessage::Type::kTabPrev && !claims_tab_) { - break; - } if (m.type == base::WidgetMessage::Type::kMoveLeft && !claims_left_right_) { break; diff --git a/src/ballistica/ui_v1/widget/container_widget.h b/src/ballistica/ui_v1/widget/container_widget.h index f2a864ee..d44b95d6 100644 --- a/src/ballistica/ui_v1/widget/container_widget.h +++ b/src/ballistica/ui_v1/widget/container_widget.h @@ -127,8 +127,8 @@ class ContainerWidget : public Widget { void set_draggable(bool d) { draggable_ = d; } - auto claims_tab() const -> bool { return claims_tab_; } - void set_claims_tab(bool c) { claims_tab_ = c; } + // auto claims_tab() const -> bool { return claims_tab_; } + // void set_claims_tab(bool c) { claims_tab_ = c; } auto claims_left_right() const -> bool { return claims_left_right_; } void set_claims_left_right(bool c) { claims_left_right_ = c; } diff --git a/src/ballistica/ui_v1/widget/h_scroll_widget.cc b/src/ballistica/ui_v1/widget/h_scroll_widget.cc index ff754f5c..fcc21557 100644 --- a/src/ballistica/ui_v1/widget/h_scroll_widget.cc +++ b/src/ballistica/ui_v1/widget/h_scroll_widget.cc @@ -19,7 +19,6 @@ HScrollWidget::HScrollWidget() : touch_mode_(!g_core->platform->IsRunningOnDesktop()) { set_draggable(false); set_claims_left_right(false); - set_claims_tab(false); } HScrollWidget::~HScrollWidget() = default; diff --git a/src/ballistica/ui_v1/widget/root_widget.cc b/src/ballistica/ui_v1/widget/root_widget.cc index 0fb6163e..2277528a 100644 --- a/src/ballistica/ui_v1/widget/root_widget.cc +++ b/src/ballistica/ui_v1/widget/root_widget.cc @@ -730,7 +730,6 @@ void RootWidget::Setup() { b.h_align = 0.0f; b.v_align = VAlign_::kBottom; b.width = b.height = 60.0f; - // b.x = bx; b.y = b.height * 0.5f + 2.0f; b.color_r = kBotLeftColorR; b.color_g = kBotLeftColorG; @@ -741,7 +740,6 @@ void RootWidget::Setup() { | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) | static_cast(Widget::ToolbarVisibility::kMenuFullRoot)); AddButton_(b); - // bx += 70.0f; } // Settings button. @@ -750,7 +748,6 @@ void RootWidget::Setup() { b.h_align = 0.0f; b.v_align = VAlign_::kBottom; b.width = b.height = 60.0f; - // b.x = bx; b.y = b.height * 0.58f - 2.0f; b.color_r = kBotLeftColorR; b.color_g = kBotLeftColorG; @@ -767,22 +764,8 @@ void RootWidget::Setup() { bottom_left_buttons_.push_back(settings_button_); } - // Chests. + // Chest slots. { - float backing_r = 0.43f; - float backing_g = 0.40f; - float backing_b = 0.53f; - float backing_cover_r = backing_r; - float backing_cover_g = backing_g; - float backing_cover_b = backing_b; - float backing_a = 1.0f; - 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; - // Bar backing. { ButtonDef_ bd; @@ -795,10 +778,10 @@ void RootWidget::Setup() { bd.img = "uiAtlas2"; bd.mesh_transparent = "toolbarBackingBottom2"; bd.selectable = false; - bd.color_r = backing_r; - bd.color_g = backing_g; - bd.color_b = backing_b; - bd.opacity = backing_a; + bd.color_r = 0.473f; + bd.color_g = 0.44f; + bd.color_b = 0.583f; + bd.opacity = 1.0f; bd.depth_min = 0.2f; bd.call = UIV1Python::ObjID::kEmptyCall; @@ -810,6 +793,7 @@ void RootWidget::Setup() { chest_backing_ = AddButton_(bd); } + // Chest/Slot buttons. ButtonDef_ b; b.h_align = 0.5f; b.v_align = VAlign_::kBottom; @@ -824,9 +808,6 @@ void RootWidget::Setup() { b.y = 44.0f; b.img = "chestIconEmpty"; b.width = b.height = 80.0f; - b.color_r = backing_cover_r; - b.color_g = backing_cover_g; - b.color_b = backing_cover_b; b.opacity = 1.0f; b.call = UIV1Python::ObjID::kRootUIChestSlot0PressCall; @@ -844,6 +825,57 @@ void RootWidget::Setup() { b.x = 1.5f * spacing; b.call = UIV1Python::ObjID::kRootUIChestSlot3PressCall; chest_3_button_ = AddButton_(b); + + // Lock icons. + { + ImageDef_ imgd; + imgd.x = -45.0f; + imgd.y = -23.0f; + imgd.width = 32.0f; + imgd.height = 32.0f; + imgd.img = "lock"; + imgd.depth_min = 0.3f; + + imgd.button = chest_0_button_; + chest_0_lock_icon_ = AddImage_(imgd); + + imgd.button = chest_1_button_; + chest_1_lock_icon_ = AddImage_(imgd); + + imgd.button = chest_2_button_; + chest_2_lock_icon_ = AddImage_(imgd); + + imgd.button = chest_3_button_; + chest_3_lock_icon_ = AddImage_(imgd); + } + + // Lock times. + { + TextDef_ td; + // td.width = 0.0f; + td.text = "3h 2m"; + td.x = 0.0f; + td.y = 55.0f; + td.scale = 0.7f; + td.flatness = 1.0f; + td.shadow = 1.0f; + td.depth_min = 0.3f; + td.color_r = 0.6f; + td.color_g = 1.0f; + td.color_b = 0.6f; + + td.button = chest_0_button_; + chest_0_time_text_ = AddText_(td); + + td.button = chest_1_button_; + chest_1_time_text_ = AddText_(td); + + td.button = chest_2_button_; + chest_2_time_text_ = AddText_(td); + + td.button = chest_3_button_; + chest_3_time_text_ = AddText_(td); + } } // Inventory button. @@ -873,7 +905,6 @@ void RootWidget::Setup() { b.h_align = 1.0f; b.v_align = VAlign_::kBottom; b.width = b.height = 85.0f; - // b.x = -206.0f; b.y = b.height * 0.5f; b.img = "storeIcon"; b.call = UIV1Python::ObjID::kRootUIStoreButtonPressCall; @@ -1526,42 +1557,66 @@ void RootWidget::SetChests(const std::string& chest_0_appearance, const std::string& chest_1_appearance, const std::string& chest_2_appearance, const std::string& chest_3_appearance) { - std::vector> pairs = { - {chest_0_appearance, chest_0_button_}, - {chest_1_appearance, chest_1_button_}, - {chest_2_appearance, chest_2_button_}, - {chest_3_appearance, chest_3_button_}, - }; + chest_0_appearance_ = chest_0_appearance; + chest_1_appearance_ = chest_1_appearance; + chest_2_appearance_ = chest_2_appearance; + chest_3_appearance_ = chest_3_appearance; + UpdateChests_(); +} +void RootWidget::UpdateChests_() { + std::vector> slots = + // NOLINTNEXTLINE (clang-format's formatting here upsets cpplint). + { + {chest_0_appearance_, chest_0_button_, chest_0_lock_icon_, + chest_0_time_text_}, + {chest_1_appearance_, chest_1_button_, chest_1_lock_icon_, + chest_1_time_text_}, + {chest_2_appearance_, chest_2_button_, chest_2_lock_icon_, + chest_2_time_text_}, + {chest_3_appearance_, chest_3_button_, chest_3_lock_icon_, + chest_3_time_text_}, + }; + + // We drop the backing/slots down a bit if we have no chests. auto have_chests{false}; - for (const auto& [appearance, b] : pairs) { + for (const auto& [appearance, b, l, t] : slots) { if (appearance != "") { have_chests = true; } } - for (const auto& [appearance, b] : pairs) { + for (const auto& [appearance, b, l, t] : slots) { assert(b); + assert(l); + Object::Ref tex; if (appearance == "") { + // Empty slot. b->widget->set_color(0.473f, 0.44f, 0.583f); b->width = b->height = 80.0f; b->y = have_chests ? 44.0f : -2.0f; { base::Assets::AssetListLock lock; - b->widget->SetTexture( - g_base->assets->GetTexture("chestIconEmpty").get()); + tex = g_base->assets->GetTexture("chestIconEmpty"); } + l->visible = false; + t->visible = false; } else { + // Chest in slot. have_chests = true; b->widget->set_color(1.0f, 1.0f, 1.0f); b->width = b->height = 110.0f; b->y = 44.0f; { base::Assets::AssetListLock lock; - b->widget->SetTexture(g_base->assets->GetTexture("chestIcon").get()); + tex = g_base->assets->GetTexture("chestIcon"); } + l->visible = true; + t->visible = true; } + b->widget->SetTexture(tex.get()); } + assert(chest_backing_); chest_backing_->y = have_chests ? 41.0f : -15.0f; diff --git a/src/ballistica/ui_v1/widget/root_widget.h b/src/ballistica/ui_v1/widget/root_widget.h index 2b7c085f..80c5266d 100644 --- a/src/ballistica/ui_v1/widget/root_widget.h +++ b/src/ballistica/ui_v1/widget/root_widget.h @@ -65,6 +65,7 @@ class RootWidget : public ContainerWidget { enum class MeterType_ { kLevel, kTrophy, kTickets, kTokens }; enum class VAlign_ { kTop, kCenter, kBottom }; + void UpdateChests_(); void UpdateTokensMeterText_(); void UpdateForFocusedWindow_(Widget* widget); auto AddButton_(const ButtonDef_& def) -> Button_*; @@ -75,6 +76,10 @@ class RootWidget : public ContainerWidget { bool plus, const std::string& s); void UpdateTokensMeterTextColor_(); + std::string chest_0_appearance_; + std::string chest_1_appearance_; + std::string chest_2_appearance_; + std::string chest_3_appearance_; std::list buttons_; std::list texts_; std::list images_; @@ -107,6 +112,10 @@ class RootWidget : public ContainerWidget { Image_* tickets_meter_icon_{}; Image_* tokens_meter_icon_{}; Image_* inbox_count_backing_{}; + Image_* chest_0_lock_icon_{}; + Image_* chest_1_lock_icon_{}; + Image_* chest_2_lock_icon_{}; + Image_* chest_3_lock_icon_{}; Text_* squad_size_text_{}; Text_* account_name_text_{}; Text_* tickets_meter_text_{}; @@ -116,6 +125,10 @@ class RootWidget : public ContainerWidget { Text_* level_text_{}; Text_* xp_text_{}; Text_* inbox_count_text_{}; + Text_* chest_0_time_text_{}; + Text_* chest_1_time_text_{}; + Text_* chest_2_time_text_{}; + Text_* chest_3_time_text_{}; float base_scale_{1.0f}; float bottom_left_height_{}; millisecs_t update_time_{}; diff --git a/src/ballistica/ui_v1/widget/row_widget.cc b/src/ballistica/ui_v1/widget/row_widget.cc index a3d3008d..7419109f 100644 --- a/src/ballistica/ui_v1/widget/row_widget.cc +++ b/src/ballistica/ui_v1/widget/row_widget.cc @@ -10,7 +10,6 @@ RowWidget::RowWidget() { set_background(false); // Influences default event handling. set_draggable(false); set_claims_left_right(false); - set_claims_tab(false); set_selection_loops_to_parent(true); set_selection_loops(false); } diff --git a/src/ballistica/ui_v1/widget/scroll_widget.cc b/src/ballistica/ui_v1/widget/scroll_widget.cc index 24cb910b..9a4b64d6 100644 --- a/src/ballistica/ui_v1/widget/scroll_widget.cc +++ b/src/ballistica/ui_v1/widget/scroll_widget.cc @@ -19,7 +19,6 @@ ScrollWidget::ScrollWidget() set_background(false); // Influences default event handling. set_draggable(false); set_claims_left_right(false); - set_claims_tab(false); } ScrollWidget::~ScrollWidget() = default;