This commit is contained in:
CortexCore 2025-04-17 19:21:44 +08:00
parent d8b8ddb8b6
commit 2d8978e694
7 changed files with 117 additions and 37 deletions

View File

@ -836,6 +836,24 @@
"processors": "", "processors": "",
"interactions": "", "interactions": "",
"initialStateCheck": true "initialStateCheck": true
},
{
"name": "Chat",
"type": "Button",
"id": "346fc321-a6f0-4d95-81d1-bc531ed3ed28",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Confirm",
"type": "Button",
"id": "0c71f40f-c39e-4893-b4d7-2c1968a9730d",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
} }
], ],
"bindings": [ "bindings": [
@ -1146,6 +1164,39 @@
"action": "Delta", "action": "Delta",
"isComposite": false, "isComposite": false,
"isPartOfComposite": false "isPartOfComposite": false
},
{
"name": "",
"id": "4f11c618-09f3-4ace-8f9f-efd7821ebe37",
"path": "<Keyboard>/enter",
"interactions": "",
"processors": "",
"groups": "",
"action": "Chat",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "265f9627-ae29-4f03-80b9-80a64c28a9bf",
"path": "<Keyboard>/enter",
"interactions": "",
"processors": "",
"groups": "",
"action": "Confirm",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "97306299-e0e4-4e18-805b-51a1674b037d",
"path": "<Keyboard>/space",
"interactions": "",
"processors": "",
"groups": "",
"action": "Confirm",
"isComposite": false,
"isPartOfComposite": false
} }
] ]
}, },

View File

@ -8,20 +8,31 @@ using System.Linq;
namespace BITKit namespace BITKit
{ {
[System.Serializable] [Serializable]
public class InputActionGroup : IDisposable public class InputActionGroup : IDisposable
{ {
public override string ToString() private class InputActionProxy
{ {
return $"Source:{Source}\nEnabled:{isEnabled}\nInitialized:{state}\nKeys:{string.Join("\n",actions.Keys)}"; public event Action<InputAction.CallbackContext> Callback;
public void Invoke(InputAction.CallbackContext context)
{
try
{
Callback?.Invoke(context);
} }
public string Source; catch (OperationCanceledException)
private int lockFile = Guid.NewGuid().GetHashCode(); {
}
}
}
private int _lockFile = Guid.NewGuid().GetHashCode();
public bool allowGlobalActivation = true; public bool allowGlobalActivation = true;
[SerializeField, ReadOnly] private bool isEnabled; [SerializeField, ReadOnly] private bool isEnabled;
private InitializationState state = InitializationState.None; private InitializationState _state = InitializationState.None;
public readonly ValidHandle allowInput = new(); public readonly ValidHandle allowInput = new();
private readonly ConcurrentDictionary<string,InputAction> actions = new(); private readonly ConcurrentDictionary<string,InputAction> _actions = new();
private readonly ConcurrentDictionary<int, InputActionProxy> _callbacks = new();
/// <summary> /// <summary>
/// 注册所有(started,performed,canceled)回调 /// 注册所有(started,performed,canceled)回调
@ -33,20 +44,14 @@ namespace BITKit
Action<InputAction.CallbackContext> callback) Action<InputAction.CallbackContext> callback)
{ {
var action = EnsureCreated(reference); var action = EnsureCreated(reference);
action.RegisterCallback(callback); _callbacks[action.GetHashCode()].Callback += callback;
return this; return this;
} }
public InputActionGroup RegisterCallback(InputAction inputAction,Action<InputAction.CallbackContext> callback) public InputActionGroup RegisterCallback(InputAction inputAction,Action<InputAction.CallbackContext> callback)
{ {
EnsureConfiguration(); var action = EnsureCreated(inputAction);
_callbacks[action.GetHashCode()].Callback += callback;
var action = actions.GetOrAdd(inputAction.name, _=>inputAction.Clone());
allowInput.Invoke();
action.RegisterCallback(callback);
return this; return this;
} }
@ -59,10 +64,16 @@ namespace BITKit
} }
EnsureConfiguration(); EnsureConfiguration();
var action = actions.GetOrAdd(reference.name, _ => var action = _actions.GetOrAdd(reference.name, _ =>
{ {
var newAction = reference.action.Clone(); var newAction = reference.action.Clone();
newAction.Rename(reference.name); newAction.Rename(reference.name);
var callback = _callbacks[newAction.GetHashCode()] = new();
newAction.performed += callback.Invoke;
newAction.canceled+=callback.Invoke;
newAction.started+=callback.Invoke;
return newAction; return newAction;
}); });
@ -73,10 +84,16 @@ namespace BITKit
public InputAction EnsureCreated(InputAction inputAction) public InputAction EnsureCreated(InputAction inputAction)
{ {
EnsureConfiguration(); EnsureConfiguration();
var action = actions.GetOrAdd(inputAction.name, _ => var action = _actions.GetOrAdd(inputAction.name, _ =>
{ {
var newAction = inputAction.Clone(); var newAction = inputAction.Clone();
newAction.Rename(inputAction.name); newAction.Rename(inputAction.name);
var callback = _callbacks[newAction.GetHashCode()] = new();
newAction.performed += callback.Invoke;
newAction.canceled+=callback.Invoke;
newAction.started+=callback.Invoke;
return newAction; return newAction;
}); });
@ -91,34 +108,38 @@ namespace BITKit
} }
public InputAction GetAction(string name) public InputAction GetAction(string name)
{ {
if(actions.TryGetValue(name,out var action)) if(_actions.TryGetValue(name,out var action))
return action; return action;
throw new ArgumentException($"未知的引用{name}"); throw new ArgumentException($"未知的引用{name}");
} }
public InputAction GetAction(InputActionReference reference) public InputAction GetAction(InputActionReference reference)
{ {
if(actions.TryGetValue(reference.name,out var action)) if(_actions.TryGetValue(reference.name,out var action))
return action; return action;
throw new ArgumentException($"未知的引用{reference.name}"); throw new ArgumentException($"未知的引用{reference.name}");
} }
public void UnRegisterCallback(InputActionReference reference, Action<InputAction.CallbackContext> callback) public void UnRegisterCallback(InputActionReference reference, Action<InputAction.CallbackContext> callback)
{ {
if(actions.TryGetValue(reference.name,out var action)) if (_actions.TryGetValue(reference.name, out var action))
action.UnRegisterCallback(callback); {
_callbacks[action.GetHashCode()].Callback -= callback;
}
} }
public void UnRegisterCallback(InputAction inputAction, Action<InputAction.CallbackContext> callback) public void UnRegisterCallback(InputAction inputAction, Action<InputAction.CallbackContext> callback)
{ {
if(actions.TryGetValue(inputAction.name,out var action)) if (_actions.TryGetValue(inputAction.name, out var action))
action.UnRegisterCallback(callback); {
_callbacks[action.GetHashCode()].Callback -= callback;
}
} }
private void EnsureConfiguration() private void EnsureConfiguration()
{ {
if (state is not InitializationState.Initialized) if (_state is not InitializationState.Initialized)
{ {
Init(); Init();
state = InitializationState.Initialized; _state = InitializationState.Initialized;
} }
} }
@ -131,12 +152,12 @@ namespace BITKit
private void ListenGlobalInput(bool allowInput) private void ListenGlobalInput(bool allowInput)
{ {
this.allowInput.SetDisableElements(lockFile, !allowInput); this.allowInput.SetDisableElements(_lockFile, !allowInput);
} }
private void AllowInput(bool allow) private void AllowInput(bool allow)
{ {
foreach (var action in actions.Values) foreach (var action in _actions.Values)
{ {
if (allow) if (allow)
{ {
@ -151,12 +172,12 @@ namespace BITKit
} }
public void Dispose() public void Dispose()
{ {
foreach (var action in actions.Values) foreach (var action in _actions.Values)
{ {
action.Disable(); action.Disable();
action.Dispose(); action.Dispose();
} }
actions.Clear(); _actions.Clear();
} }
} }
} }

View File

@ -124,11 +124,9 @@ namespace BITKit.UX
{ {
//WaitUtilTransitionCompleted = new(); //WaitUtilTransitionCompleted = new();
} }
public readonly InputActionGroup InputActionGroup = new()
protected readonly InputActionGroup InputActionGroup = new()
{ {
allowGlobalActivation = false, allowGlobalActivation = false,
Source = nameof(UIToolKitPanel)
}; };
public virtual bool CloseWhenClickOutside { get;} public virtual bool CloseWhenClickOutside { get;}
public virtual bool IsWindow { get; } public virtual bool IsWindow { get; }

View File

@ -679,7 +679,7 @@ namespace BITKit
self.schedule.Execute(() => self.schedule.Execute(() =>
{ {
self.scrollOffset = new Vector2(0, float.MaxValue); self.scrollOffset = new Vector2(0, float.MaxValue);
}); }).ExecuteLater(1);;
} }
public static void ScrollToBottomAutomatic(this ScrollView self, float delay = 0.02f) public static void ScrollToBottomAutomatic(this ScrollView self, float delay = 0.02f)
{ {
@ -707,7 +707,8 @@ namespace BITKit
public static Vector2 GetScreenPosition(this VisualElement self, Vector3 worldPosition) public static Vector2 GetScreenPosition(this VisualElement self, Vector3 worldPosition)
{ {
var panel = (self.panel ?? self.parent.panel) ?? self.parent.parent.panel; var panel = self.panel;
if (panel is null) return default;
var pos = RuntimePanelUtils var pos = RuntimePanelUtils
.CameraTransformWorldToPanel(panel, worldPosition, Camera); .CameraTransformWorldToPanel(panel, worldPosition, Camera);

View File

@ -7,7 +7,7 @@ ScrollView {
--unity-metrics-single_line-height: 500px; --unity-metrics-single_line-height: 500px;
} }
ScrollView Scroller.unity-scroller{ ScrollView Scroller.unity-scroller {
width: 8; width: 8;
} }
@ -653,3 +653,8 @@ OnScreenButton.selected {
transform-origin: left top; transform-origin: left top;
scale: 0.8 0.8; scale: 0.8 0.8;
} }
.text-overflow-warp-normal .unity-text-element {
overflow: hidden;
white-space: normal;
}

View File

@ -53,6 +53,10 @@ Slider.material {
min-width: 128px; min-width: 128px;
} }
.material .selected Button {
background-color: rgba(26, 115, 232, 0.25);
}
.material Button:hover { .material Button:hover {
background-color: rgba(26, 115, 232, 0.25); background-color: rgba(26, 115, 232, 0.25);
transition-duration: 0.32s; transition-duration: 0.32s;