more ui work

This commit is contained in:
Eric Froemling 2024-12-31 08:57:27 -08:00
parent 88e2affed1
commit 690da5a3da
No known key found for this signature in database
28 changed files with 231 additions and 164 deletions

56
.efrocachemap generated
View File

@ -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",

View File

@ -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

View File

@ -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.

View File

@ -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'

View File

@ -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,
)

View File

@ -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,
)

View File

@ -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

View File

@ -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,
)

View File

@ -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

View File

@ -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,
)

View File

@ -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(

View File

@ -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()

View File

@ -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)

View File

@ -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,
)

View File

@ -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(

View File

@ -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:

View File

@ -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,

View File

@ -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<char**>(kwlist),
args, keywds, "sssssssspssssffffffff", const_cast<char**>(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)",

View File

@ -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;

View File

@ -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<char**>(kwlist),
args, keywds, "|OOOOOOOOOOOOOOOO", const_cast<char**>(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<char**>(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<char**>(kwlist), &edit_obj,
args, keywds, "|OOOOOOOOO", const_cast<char**>(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<char**>(kwlist),
args, keywds, "|OOOOOOOOOOOOOOOOO", const_cast<char**>(kwlist),
&edit_obj, &parent_obj, &size_obj, &pos_obj, &background_obj,
&selected_child_obj, &capture_arrows_obj, &on_select_call_obj,
&center_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<char**>(kwlist),
args, keywds, "|OOOOOOOOOOOOOOO", const_cast<char**>(kwlist),
&edit_obj, &parent_obj, &size_obj, &pos_obj, &background_obj,
&selected_child_obj, &capture_arrows_obj, &on_select_call_obj,
&center_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"

View File

@ -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);
}

View File

@ -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;

View File

@ -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; }

View File

@ -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;

View File

@ -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<uint32_t>(Widget::ToolbarVisibility::kMenuFullNoBack)
| static_cast<uint32_t>(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<std::pair<const std::string&, Button_*>> 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<std::tuple<const std::string&, Button_*, Image_*, Text_*>> 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<base::TextureAsset> 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;

View File

@ -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<Button_> buttons_;
std::list<Text_> texts_;
std::list<Image_> 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_{};

View File

@ -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);
}

View File

@ -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;