From 52226f67481e6a80e01b3323bd84bb1ff19ba692 Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月28日 11:16:57 +0800 Subject: [PATCH 01/14] Remove public modifier from partial uxml classes. --- .../UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs | 2 +- .../Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs | 2 +- .../UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs index 69b4779..0e15ebf 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs @@ -2,7 +2,7 @@ namespace UnityMvvmToolkit.UITK.BindableUIElements { - public partial class BindableButton + partial class BindableButton { public string Command { get; private set; } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs index a58bd0e..ac4d617 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs @@ -2,7 +2,7 @@ namespace UnityMvvmToolkit.UITK.BindableUIElements { - public partial class BindableLabel + partial class BindableLabel { public string BindingTextPath { get; private set; } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs index 2ac5dde..c622b26 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs @@ -2,7 +2,7 @@ namespace UnityMvvmToolkit.UITK.BindableUIElements { - public partial class BindableTextField + partial class BindableTextField { public string BindingValuePath { get; private set; } From 21c9fcb10b55eabc995e61e05a416f637099ff3a Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 10:33:46 +0800 Subject: [PATCH 02/14] Fix #12. Define UGUI bindable elements only when TMP installed. --- .../Runtime/UGUI/BindableUGUIElements/BindableButton.cs | 8 ++++++-- .../UGUI/BindableUGUIElements/BindableInputField.cs | 8 ++++++-- .../Runtime/UGUI/BindableUGUIElements/BindableLabel.cs | 8 ++++++-- .../Runtime/UGUI/UnityMvvmToolkit.UGUI.asmdef | 9 +++++++-- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableButton.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableButton.cs index 0ff1670..b32f537 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableButton.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableButton.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +#if UNITYMVVMTOOLKIT_TEXTMESHPRO_SUPPORT + +using System.Runtime.CompilerServices; using UnityEngine; using UnityEngine.UI; using UnityMvvmToolkit.Core; @@ -66,4 +68,6 @@ private void SetControlEnabled(bool isEnabled) _button.enabled = isEnabled; } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableInputField.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableInputField.cs index 1a29a5b..0270104 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableInputField.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableInputField.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +#if UNITYMVVMTOOLKIT_TEXTMESHPRO_SUPPORT + +using System.Runtime.CompilerServices; using TMPro; using UnityEngine; using UnityMvvmToolkit.Core; @@ -59,4 +61,6 @@ protected virtual void UpdateControlValue(string newValue) _inputField.SetTextWithoutNotify(newValue); } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableLabel.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableLabel.cs index 35a35df..afc298f 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableLabel.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/BindableUGUIElements/BindableLabel.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +#if UNITYMVVMTOOLKIT_TEXTMESHPRO_SUPPORT + +using System.Runtime.CompilerServices; using TMPro; using UnityEngine; using UnityMvvmToolkit.Core; @@ -53,4 +55,6 @@ protected virtual void UpdateControlText(string newText) _label.text = newText; } } -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/UnityMvvmToolkit.UGUI.asmdef b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/UnityMvvmToolkit.UGUI.asmdef index 8761533..559c1d5 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/UnityMvvmToolkit.UGUI.asmdef +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/UnityMvvmToolkit.UGUI.asmdef @@ -1,6 +1,5 @@ { "name": "UnityMvvmToolkit.UGUI", - "rootNamespace": "", "references": [ "GUID:5c4878a33f8e8b04cb2f76d30bb7b0b0", "GUID:d63bf47557a71534d82ecda7a3a700a2", @@ -13,6 +12,12 @@ "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.textmeshpro", + "expression": "", + "define": "UNITYMVVMTOOLKIT_TEXTMESHPRO_SUPPORT" + } + ], "noEngineReferences": false } \ No newline at end of file From ab9d8c7675d64597efdfe10676057e759ba8507d Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 10:34:46 +0800 Subject: [PATCH 03/14] Remove empty root namespace. --- .../Runtime/Common/UnityMvvmToolkit.Common.asmdef | 1 - .../Runtime/External/UniTask/UnityMvvmToolkit.UniTask.asmdef | 1 - .../UnityMvvmToolkit/Runtime/UITK/UnityMvvmToolkit.UITK.asmdef | 1 - 3 files changed, 3 deletions(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/UnityMvvmToolkit.Common.asmdef b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/UnityMvvmToolkit.Common.asmdef index 6d1c97f..f6262db 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/UnityMvvmToolkit.Common.asmdef +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/UnityMvvmToolkit.Common.asmdef @@ -1,6 +1,5 @@ { "name": "UnityMvvmToolkit.Common", - "rootNamespace": "", "references": [ "GUID:5c4878a33f8e8b04cb2f76d30bb7b0b0" ], diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/UnityMvvmToolkit.UniTask.asmdef b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/UnityMvvmToolkit.UniTask.asmdef index 58f499e..47973eb 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/UnityMvvmToolkit.UniTask.asmdef +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/External/UniTask/UnityMvvmToolkit.UniTask.asmdef @@ -1,6 +1,5 @@ { "name": "UnityMvvmToolkit.UniTask", - "rootNamespace": "", "references": [ "UnityMvvmToolkit.Core", "UniTask" diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/UnityMvvmToolkit.UITK.asmdef b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/UnityMvvmToolkit.UITK.asmdef index 6d76979..8fbc588 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/UnityMvvmToolkit.UITK.asmdef +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/UnityMvvmToolkit.UITK.asmdef @@ -1,6 +1,5 @@ { "name": "UnityMvvmToolkit.UITK", - "rootNamespace": "", "references": [ "GUID:5c4878a33f8e8b04cb2f76d30bb7b0b0", "GUID:d63bf47557a71534d82ecda7a3a700a2" From 1f5ceccb6d4ed248200440fe47c830b3d63ab87e Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 12:43:24 +0800 Subject: [PATCH 04/14] Resolve #17. Add BindingContextProvider. --- .../Extensions/VisualElementExtensions.cs | 81 ---------- .../Common/Interfaces/IBindableCollection.cs | 8 + .../Interfaces/IBindableCollection.cs.meta | 3 + .../Interfaces/IBindingContextProvider.cs | 10 ++ .../IBindingContextProvider.cs.meta | 3 + .../Runtime/Common/MonoBehaviourView.cs | 16 +- .../Runtime/UGUI/CanvasView.cs | 14 +- ...dableListView.cs => BindableListView.T.cs} | 93 ++++++------ ...iew.cs.meta => BindableListView.T.cs.meta} | 0 ...eScrollView.cs => BindableScrollView.T.cs} | 28 ++-- ...w.cs.meta => BindableScrollView.T.cs.meta} | 0 .../BindingContextProvider.T.cs | 136 +++++++++++++++++ .../BindingContextProvider.T.cs.meta | 3 + ...iew.Uxml.cs => BindableListView.T.Uxml.cs} | 8 +- ...s.meta => BindableListView.T.Uxml.cs.meta} | 0 ...w.Uxml.cs => BindableScrollView.T.Uxml.cs} | 8 +- ...meta => BindableScrollView.T.Uxml.cs.meta} | 0 .../Uxmls/BindingContextProvider.T.Uxml.cs | 25 ++++ .../BindingContextProvider.T.Uxml.cs.meta | 3 + .../Runtime/UITK/DocumentView.cs | 16 +- .../Runtime/{Common => UITK}/Extensions.meta | 0 .../Extensions/VisualElementExtensions.cs | 138 ++++++++++++++++++ .../VisualElementExtensions.cs.meta | 0 ...tyMvvmToolkit.UnityPackage.sln.DotSettings | 1 + 24 files changed, 433 insertions(+), 161 deletions(-) delete mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions/VisualElementExtensions.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs.meta create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs.meta rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/{BindableListView.cs => BindableListView.T.cs} (60%) rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/{BindableListView.cs.meta => BindableListView.T.cs.meta} (100%) rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/{BindableScrollView.cs => BindableScrollView.T.cs} (88%) rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/{BindableScrollView.cs.meta => BindableScrollView.T.cs.meta} (100%) create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs.meta rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/{BindableListView.Uxml.cs => BindableListView.T.Uxml.cs} (67%) rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/{BindableListView.Uxml.cs.meta => BindableListView.T.Uxml.cs.meta} (100%) rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/{BindableScrollView.Uxml.cs => BindableScrollView.T.Uxml.cs} (67%) rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/{BindableScrollView.Uxml.cs.meta => BindableScrollView.T.Uxml.cs.meta} (100%) create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs.meta rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/{Common => UITK}/Extensions.meta (100%) create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/{Common => UITK}/Extensions/VisualElementExtensions.cs.meta (100%) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions/VisualElementExtensions.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions/VisualElementExtensions.cs deleted file mode 100644 index 349ddb9..0000000 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions/VisualElementExtensions.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Linq; -using System.Runtime.CompilerServices; -using UnityEngine.UIElements; -using UnityMvvmToolkit.Common.Interfaces; -using UnityMvvmToolkit.Core.Interfaces; - -namespace UnityMvvmToolkit.Common.Extensions -{ - public static class VisualElementExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static VisualElement InstantiateBindableElement(this VisualTreeAsset visualTreeAsset) - { - var visualElement = visualTreeAsset.Instantiate(); - visualElement.userData = GetBindableElements(visualElement); - - return visualElement; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static IBindableElement[] GetBindableElements(this VisualElement visualElement) - { - return visualElement - .Query() - .Where(element => element is IBindableElement) - .Build() - .Cast() - .ToArray(); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SetBindingContext(this VisualElement visualElement, IBindingContext context, - IObjectProvider objectProvider, bool initialize = false) - { - var bindableElementsSpan = ((IBindableElement[]) visualElement.userData).AsSpan(); - - for (var i = 0; i < bindableElementsSpan.Length; i++) - { - SetBindingContext(bindableElementsSpan[i], context, objectProvider, initialize); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void ResetBindingContext(this VisualElement visualElement, IObjectProvider objectProvider, - bool dispose = false) - { - var bindableElementsSpan = ((IBindableElement[]) visualElement.userData).AsSpan(); - - for (var i = 0; i < bindableElementsSpan.Length; i++) - { - ResetBindingContext(bindableElementsSpan[i], objectProvider, dispose); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void SetBindingContext(IBindableElement bindableElement, IBindingContext context, - IObjectProvider objectProvider, bool initialize) - { - if (initialize && bindableElement is IInitializable initializable) - { - initializable.Initialize(); - } - - bindableElement.ResetBindingContext(objectProvider); - bindableElement.SetBindingContext(context, objectProvider); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void ResetBindingContext(IBindableElement bindableElement, IObjectProvider objectProvider, - bool dispose) - { - bindableElement.ResetBindingContext(objectProvider); - - if (dispose && bindableElement is IDisposable disposable) - { - disposable.Dispose(); - } - } - } -} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs new file mode 100644 index 0000000..469c41a --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs @@ -0,0 +1,8 @@ +using UnityMvvmToolkit.Core.Interfaces; + +namespace UnityMvvmToolkit.Common.Interfaces +{ + public interface IBindableCollection : IBindableElement + { + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs.meta new file mode 100644 index 0000000..27ca981 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindableCollection.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5756458f1b94fe887269fd727c96ee6 +timeCreated: 1685251353 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs new file mode 100644 index 0000000..9845751 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs @@ -0,0 +1,10 @@ +using UnityMvvmToolkit.Core.Interfaces; + +namespace UnityMvvmToolkit.Common.Interfaces +{ + public interface IBindingContextProvider + { + bool IsValid { get; } + IBindingContext BindingContext { get;} + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs.meta new file mode 100644 index 0000000..f3c6ece --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Interfaces/IBindingContextProvider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 62eee7d2604e484ebc8762f36f1fa9a1 +timeCreated: 1685004356 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/MonoBehaviourView.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/MonoBehaviourView.cs index e0c388e..80f956c 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/MonoBehaviourView.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/MonoBehaviourView.cs @@ -31,11 +31,12 @@ private void Awake() private void OnDestroy() { ResetBindingContext(); + OnDispose(); } public void SetBindingContext(IBindingContext context, IObjectProvider objectProvider) { - if (_bindingContext != null) + if (_bindingContext is not null) { throw new InvalidOperationException( $"{GetType().Name} - binding context was not reset. Reset the binding context first."); @@ -53,11 +54,12 @@ public void ResetBindingContext(IObjectProvider objectProvider) } protected abstract void OnInit(); - protected abstract IBindableElement[] GetBindableElements(); + protected abstract void OnDispose(); + protected abstract IReadOnlyList GetBindableElements(); protected virtual TBindingContext GetBindingContext() { - if (typeof(TBindingContext).GetConstructor(Type.EmptyTypes) == null) + if (typeof(TBindingContext).GetConstructor(Type.EmptyTypes) is null) { throw new InvalidOperationException( $"Cannot create an instance of the type parameter {typeof(TBindingContext)} because it does not have a parameterless constructor."); @@ -109,13 +111,13 @@ private void ResetBindingContext() } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void SetBindingContext(ReadOnlySpan bindableElements, IBindingContext context, + private void SetBindingContext(IReadOnlyList bindableElements, IBindingContext context, IObjectProvider objectProvider, bool initialize) { _bindingContext = (TBindingContext) context; _objectProvider = objectProvider; - for (var i = 0; i < bindableElements.Length; i++) + for (var i = 0; i < bindableElements.Count; i++) { var bindableElement = bindableElements[i]; @@ -129,10 +131,10 @@ private void SetBindingContext(ReadOnlySpan bindableElements, } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ResetBindingContext(ReadOnlySpan bindableElements, + private void ResetBindingContext(IReadOnlyList bindableElements, IObjectProvider objectProvider, bool dispose) { - for (var i = 0; i < bindableElements.Length; i++) + for (var i = 0; i < bindableElements.Count; i++) { var bindableElement = bindableElements[i]; diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/CanvasView.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/CanvasView.cs index ecc11f5..8b06539 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/CanvasView.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UGUI/CanvasView.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEngine; using UnityMvvmToolkit.Common; using UnityMvvmToolkit.Core.Interfaces; @@ -8,7 +9,7 @@ namespace UnityMvvmToolkit.UGUI public abstract class CanvasView : MonoBehaviourView where TBindingContext : class, IBindingContext { - private IBindableElement[] _bindableElements; + private List _bindableElements; public GameObject RootElement { get; private set; } @@ -19,12 +20,17 @@ protected override void OnInit() _bindableElements = RootElement .GetComponentsInChildren(true) .Where(element => ((MonoBehaviour) element).gameObject != RootElement) - .ToArray(); + .ToList(); } - protected override IBindableElement[] GetBindableElements() + protected override IReadOnlyList GetBindableElements() { return _bindableElements; } + + protected override void OnDispose() + { + _bindableElements.Clear(); + } } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.T.cs similarity index 60% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.cs rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.T.cs index 25aa2ae..fb62d52 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.T.cs @@ -1,18 +1,19 @@ using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; -using System.Runtime.CompilerServices; +using JetBrains.Annotations; using UnityEngine.UIElements; -using UnityMvvmToolkit.Common.Extensions; using UnityMvvmToolkit.Common.Interfaces; using UnityMvvmToolkit.Core; using UnityMvvmToolkit.Core.Extensions; using UnityMvvmToolkit.Core.Interfaces; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { - public abstract partial class BindableListView : ListView, IBindableElement - where TItemBindingContext : ICollectionItem + public abstract partial class BindableListView : ListView, IBindableCollection, + IInitializable, IDisposable where TItemBindingContext : ICollectionItem { private VisualTreeAsset _itemTemplate; @@ -20,6 +21,22 @@ public abstract partial class BindableListView : ListView, private IReadOnlyProperty> _itemsSource; private IObjectProvider _objectProvider; + private List _itemAssets; + + public virtual void Initialize() + { + _itemAssets = new List(); + } + + public virtual void Dispose() + { + for (var i = 0; i < _itemAssets.Count; i++) + { + _itemAssets[i].DisposeBindableElement(_objectProvider); + } + + _itemAssets.Clear(); + } public virtual void SetBindingContext(IBindingContext context, IObjectProvider objectProvider) { @@ -28,31 +45,29 @@ public virtual void SetBindingContext(IBindingContext context, IObjectProvider o _objectProvider = objectProvider; - _itemsSource = - objectProvider.RentReadOnlyProperty>(context, - _itemsSourceBindingData); + _itemsSource = objectProvider + .RentReadOnlyProperty>(context, _itemsSourceBindingData); _itemsSource.Value.CollectionChanged += OnItemsCollectionChanged; itemsSource = _itemsSource.Value; - makeItem += MakeItem; - bindItem += BindItem; - unbindItem += UnbindItem; + makeItem += OnMakeItem; + bindItem += OnBindItem; + unbindItem += OnUnbindItem; } public virtual void ResetBindingContext(IObjectProvider objectProvider) { - if (_itemsSource == null) + if (_itemsSource is null) { return; } _itemsSource.Value.CollectionChanged -= OnItemsCollectionChanged; - makeItem -= MakeItem; - bindItem -= BindItem; - unbindItem -= UnbindItem; - - ClearItems(); + makeItem -= OnMakeItem; + bindItem -= OnBindItem; + unbindItem -= OnUnbindItem; + itemsSource = Array.Empty(); objectProvider.ReturnReadOnlyProperty(_itemsSource); @@ -63,39 +78,42 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider) protected virtual VisualElement MakeItem(VisualTreeAsset itemTemplate) { - return itemTemplate.InstantiateBindableElement(); // TODO: Pool. + return itemTemplate + .InstantiateBindableElement() + .InitializeBindableElement(); } protected virtual void BindItem(VisualElement item, int index, TItemBindingContext bindingContext, IObjectProvider objectProvider) { - item.SetBindingContext(bindingContext, objectProvider, true); + item.SetChildsBindingContext(bindingContext, objectProvider); } - protected virtual void UnbindItem(VisualElement item, int index, TItemBindingContext bindingContext, + protected virtual void UnbindItem(VisualElement item, int index, [CanBeNull] TItemBindingContext bindingContext, IObjectProvider objectProvider) { - item.ResetBindingContext(objectProvider, true); + item.ResetChildsBindingContext(objectProvider); } - private VisualElement MakeItem() + private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { - return MakeItem(_itemTemplate); + RefreshItems(); // TODO: Do not refresh all items. } - private void BindItem(VisualElement item, int index) + private VisualElement OnMakeItem() { - if (index>= 0 && index < itemsSource.Count) - { - BindItem(item, index, _itemsSource.Value[index], _objectProvider); - } - else - { - BindItem(item, index, default, _objectProvider); - } + var item = MakeItem(_itemTemplate); + _itemAssets.Add(item); + + return item; } - private void UnbindItem(VisualElement item, int index) + private void OnBindItem(VisualElement item, int index) + { + BindItem(item, index, _itemsSource.Value[index], _objectProvider); + } + + private void OnUnbindItem(VisualElement item, int index) { if (index>= 0 && index < itemsSource.Count) { @@ -106,16 +124,5 @@ private void UnbindItem(VisualElement item, int index) UnbindItem(item, index, default, _objectProvider); } } - - private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) - { - RefreshItems(); // TODO: Do not refresh all items. - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ClearItems() - { - itemsSource = Array.Empty(); - } } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.T.cs.meta similarity index 100% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.cs.meta rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableListView.T.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.T.cs similarity index 88% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.cs rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.T.cs index 859cb22..9279c96 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.T.cs @@ -5,15 +5,15 @@ using System.Runtime.CompilerServices; using UnityEngine.Pool; using UnityEngine.UIElements; -using UnityMvvmToolkit.Common.Extensions; using UnityMvvmToolkit.Common.Interfaces; using UnityMvvmToolkit.Core; using UnityMvvmToolkit.Core.Extensions; using UnityMvvmToolkit.Core.Interfaces; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { - public abstract partial class BindableScrollView : ScrollView, IBindableElement, + public abstract partial class BindableScrollView : ScrollView, IBindableCollection, IInitializable, IDisposable where TItemBindingContext : ICollectionItem { private int _itemsCount; @@ -37,7 +37,7 @@ public virtual void Initialize() public virtual void Dispose() { - if (_itemsSource == null) + if (_itemsSource is null) { _itemsCount = 0; _itemAssets.Clear(); @@ -57,9 +57,8 @@ public virtual void SetBindingContext(IBindingContext context, IObjectProvider o _objectProvider = objectProvider; - _itemsSource = - objectProvider.RentReadOnlyProperty>(context, - _itemsSourceBindingData); + _itemsSource = objectProvider + .RentReadOnlyProperty>(context, _itemsSourceBindingData); _itemsSource.Value.CollectionChanged += OnItemsCollectionChanged; AddItems(_itemsSource.Value); @@ -67,7 +66,7 @@ public virtual void SetBindingContext(IBindingContext context, IObjectProvider o public virtual void ResetBindingContext(IObjectProvider objectProvider) { - if (_itemsSource == null) + if (_itemsSource is null) { return; } @@ -85,19 +84,21 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider) protected virtual VisualElement MakeItem(VisualTreeAsset itemTemplate) { - return itemTemplate.InstantiateBindableElement(); + return itemTemplate + .InstantiateBindableElement() + .InitializeBindableElement(); } protected virtual void BindItem(VisualElement item, int index, TItemBindingContext bindingContext, IObjectProvider objectProvider) { - item.SetBindingContext(bindingContext, objectProvider, true); + item.SetChildsBindingContext(bindingContext, objectProvider); } protected virtual void UnbindItem(VisualElement item, int index, TItemBindingContext bindingContext, IObjectProvider objectProvider) { - item.ResetBindingContext(objectProvider, true); + item.ResetChildsBindingContext(objectProvider); } private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) @@ -149,7 +150,7 @@ private void RemoveItem(TItemBindingContext itemBindingContext) var item = _itemAssets[itemBindingContext.Id]; - if (_objectProvider != null) + if (_objectProvider is not null) { UnbindItem(item, _itemsCount, itemBindingContext, _objectProvider); } @@ -179,10 +180,7 @@ private void OnPooReleaseItem(VisualElement item) private void OnPoolDestroyItem(VisualElement item) { - if (_objectProvider != null) - { - item.ResetBindingContext(_objectProvider, true); - } + item.DisposeBindableElement(_objectProvider); } } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.T.cs.meta similarity index 100% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.cs.meta rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableScrollView.T.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs new file mode 100644 index 0000000..1a231e6 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using UnityEngine.UIElements; +using UnityMvvmToolkit.Common.Interfaces; +using UnityMvvmToolkit.Core; +using UnityMvvmToolkit.Core.Extensions; +using UnityMvvmToolkit.Core.Interfaces; +using UnityMvvmToolkit.UITK.Extensions; + +namespace UnityMvvmToolkit.UITK.BindableUIElements +{ + public abstract partial class BindingContextProvider : VisualElement, IBindableElement, + IBindingContextProvider, IInitializable, IDisposable where TBindingContext : IBindingContext + { + private IObjectProvider _objectProvider; + private List _bindableElements; + + private PropertyBindingData _propertyBindingData; + private IReadOnlyProperty _bindingContextProperty; + + protected IReadOnlyList BindableElements => _bindableElements; + + public bool IsValid => !string.IsNullOrWhiteSpace(BindingContextPath); + public IBindingContext BindingContext { get; protected set; } + + public virtual void Initialize() + { + if (IsValid == false) + { + return; + } + + _bindableElements = this.GetBindableChilds(); + + for (var i = 0; i < _bindableElements.Count; i++) + { + if (_bindableElements[i] is IInitializable initializable) + { + initializable.Initialize(); + } + } + } + + public virtual void Dispose() + { + if (IsValid == false) + { + return; + } + + for (var i = 0; i < _bindableElements.Count; i++) + { + if (_bindableElements[i] is IDisposable disposable) + { + disposable.Dispose(); + } + } + + _bindableElements.Clear(); + } + + public virtual void SetBindingContext(IBindingContext context, IObjectProvider objectProvider) + { + if (IsValid == false) + { + BindingContext = context; + return; + } + + _objectProvider = objectProvider; + _propertyBindingData ??= BindingContextPath.ToPropertyBindingData(); + + OnSetBindingContext(context, objectProvider, _propertyBindingData); + } + + public virtual void ResetBindingContext(IObjectProvider objectProvider) + { + if (IsValid) + { + OnResetBindingContext(objectProvider); + } + } + + private void OnBindingContextPropertyValueChanged(object sender, TBindingContext bindingContext) + { + SetChildsBindingContext(bindingContext, _objectProvider); + } + + protected virtual void OnSetBindingContext(IBindingContext context, IObjectProvider objectProvider, + PropertyBindingData propertyBindingData) + { + _bindingContextProperty = + objectProvider.RentReadOnlyProperty(context, propertyBindingData); + _bindingContextProperty.ValueChanged += OnBindingContextPropertyValueChanged; + + if (_bindingContextProperty.Value is null) + { + return; + } + + BindingContext = _bindingContextProperty.Value; + SetChildsBindingContext(BindingContext, objectProvider); + } + + protected virtual void OnResetBindingContext(IObjectProvider objectProvider) + { + _bindingContextProperty.ValueChanged -= OnBindingContextPropertyValueChanged; + + objectProvider.ReturnReadOnlyProperty(_bindingContextProperty); + + _bindingContextProperty = null; + + BindingContext = default; + ResetChildsBindingContext(objectProvider); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void SetChildsBindingContext(IBindingContext bindingContext, IObjectProvider objectProvider) + { + for (var i = 0; i < _bindableElements.Count; i++) + { + _bindableElements[i].SetBindingContext(bindingContext, objectProvider); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void ResetChildsBindingContext(IObjectProvider objectProvider) + { + for (var i = 0; i < _bindableElements.Count; i++) + { + _bindableElements[i].ResetBindingContext(objectProvider); + } + } + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs.meta new file mode 100644 index 0000000..5bf0e6e --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindingContextProvider.T.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 998562ac834141858f62d888829b3eec +timeCreated: 1685005011 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs similarity index 67% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.Uxml.cs rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs index e50ea9f..d786b50 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs @@ -1,8 +1,9 @@ using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { - public partial class BindableListView + partial class BindableListView { public string BindingItemsSourcePath { get; private set; } @@ -15,8 +16,9 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea { base.Init(visualElement, bag, context); - var bindableListView = (BindableListView) visualElement; - bindableListView.BindingItemsSourcePath = _bindingItemsSourceAttribute.GetValueFromBag(bag, context); + visualElement + .As>() + .BindingItemsSourcePath = _bindingItemsSourceAttribute.GetValueFromBag(bag, context); } } } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.Uxml.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs.meta similarity index 100% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.Uxml.cs.meta rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs similarity index 67% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.Uxml.cs rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs index 1a7e7d1..8fb86d5 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs @@ -1,8 +1,9 @@ using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { - public partial class BindableScrollView + partial class BindableScrollView { public string BindingItemsSourcePath { get; private set; } @@ -15,8 +16,9 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea { base.Init(visualElement, bag, context); - var bindableScrollView = (BindableScrollView) visualElement; - bindableScrollView.BindingItemsSourcePath = _bindingItemsSourceAttribute.GetValueFromBag(bag, context); + visualElement + .As>() + .BindingItemsSourcePath = _bindingItemsSourceAttribute.GetValueFromBag(bag, context); } } } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.Uxml.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs.meta similarity index 100% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.Uxml.cs.meta rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs new file mode 100644 index 0000000..969610a --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs @@ -0,0 +1,25 @@ +using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; + +namespace UnityMvvmToolkit.UITK.BindableUIElements +{ + partial class BindingContextProvider + { + public string BindingContextPath { get; protected set; } + + public new class UxmlTraits : VisualElement.UxmlTraits + { + private readonly UxmlStringAttributeDescription _bindingContextPath = new() + { name = "binding-context-path", defaultValue = default }; + + public override void Init(VisualElement visualElement, IUxmlAttributes bag, CreationContext context) + { + base.Init(visualElement, bag, context); + + visualElement + .As>() + .BindingContextPath = _bindingContextPath.GetValueFromBag(bag, context); + } + } + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs.meta new file mode 100644 index 0000000..4866e00 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d7952512243e48ea9af1fcd3407beb76 +timeCreated: 1685005057 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/DocumentView.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/DocumentView.cs index 9524454..bfda115 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/DocumentView.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/DocumentView.cs @@ -1,8 +1,9 @@ -using UnityEngine; +using System.Collections.Generic; +using UnityEngine; using UnityEngine.UIElements; using UnityMvvmToolkit.Common; -using UnityMvvmToolkit.Common.Extensions; using UnityMvvmToolkit.Core.Interfaces; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK { @@ -11,19 +12,24 @@ public abstract class DocumentView : MonoBehaviourView _bindableElements; public VisualElement RootVisualElement => _uiDocument == null ? null : _uiDocument.rootVisualElement; protected override void OnInit() { _uiDocument = GetComponent(); - _bindableElements = RootVisualElement.GetBindableElements(); + _bindableElements = RootVisualElement.GetBindableChilds(); } - protected override IBindableElement[] GetBindableElements() + protected override IReadOnlyList GetBindableElements() { return _bindableElements; } + + protected override void OnDispose() + { + _bindableElements.Clear(); + } } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions.meta similarity index 100% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions.meta rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs new file mode 100644 index 0000000..5c98634 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using JetBrains.Annotations; +using UnityEngine.UIElements; +using UnityMvvmToolkit.Common.Interfaces; +using UnityMvvmToolkit.Core.Interfaces; + +namespace UnityMvvmToolkit.UITK.Extensions +{ + public static class VisualElementExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T As(this VisualElement visualElement) where T : VisualElement + { + return (T) visualElement; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static VisualElement InstantiateBindableElement(this VisualTreeAsset visualTreeAsset) + { + var visualElement = visualTreeAsset.Instantiate(); + visualElement.userData = visualElement.GetBindableChilds(); + + return visualElement; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static List GetBindableChilds(this VisualElement visualElement) + { + var bindableChilds = new List(); + + var itemChildCount = visualElement.childCount; + + for (var i = 0; i < itemChildCount; i++) + { + GetBindableElements(visualElement[i], bindableChilds); + } + + return bindableChilds; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static VisualElement InitializeBindableElement(this VisualElement visualElement) + { + if (visualElement is IInitializable initializable) + { + initializable.Initialize(); + } + + var bindableElements = (List) visualElement.userData; + + for (var i = 0; i < bindableElements.Count; i++) + { + if (bindableElements[i] is IInitializable initializableChild) + { + initializableChild.Initialize(); + } + } + + return visualElement; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void SetChildsBindingContext(this VisualElement visualElement, IBindingContext bindingContext, + IObjectProvider objectProvider) + { + var bindableElements = (List) visualElement.userData; + + for (var i = 0; i < bindableElements.Count; i++) + { + bindableElements[i].SetBindingContext(bindingContext, objectProvider); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void ResetChildsBindingContext(this VisualElement visualElement, IObjectProvider objectProvider) + { + var bindableElements = (List) visualElement.userData; + + for (var i = 0; i < bindableElements.Count; i++) + { + bindableElements[i].ResetBindingContext(objectProvider); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void DisposeBindableElement(this VisualElement visualElement, + [CanBeNull] IObjectProvider objectProvider = null) + { + var bindableElements = (List) visualElement.userData; + + for (var i = 0; i < bindableElements.Count; i++) + { + var bindableElement = bindableElements[i]; + + if (objectProvider is not null) + { + bindableElement.ResetBindingContext(objectProvider); + } + + if (bindableElement is IDisposable disposableChild) + { + disposableChild.Dispose(); + } + } + + if (visualElement is IDisposable disposable) + { + disposable.Dispose(); + } + + bindableElements.Clear(); + visualElement.userData = null; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void GetBindableElements(VisualElement visualElement, ICollection elements) + { + if (visualElement is IBindableElement bindableElement) + { + elements.Add(bindableElement); + } + + if (visualElement is IBindableCollection or IBindingContextProvider { IsValid: true }) + { + return; + } + + var itemChildCount = visualElement.childCount; + + for (var i = 0; i < itemChildCount; i++) + { + GetBindableElements(visualElement[i], elements); + } + } + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions/VisualElementExtensions.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs.meta similarity index 100% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Common/Extensions/VisualElementExtensions.cs.meta rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/UnityMvvmToolkit.UnityPackage.sln.DotSettings b/src/UnityMvvmToolkit.UnityPackage/UnityMvvmToolkit.UnityPackage.sln.DotSettings index 355817a..f4966da 100644 --- a/src/UnityMvvmToolkit.UnityPackage/UnityMvvmToolkit.UnityPackage.sln.DotSettings +++ b/src/UnityMvvmToolkit.UnityPackage/UnityMvvmToolkit.UnityPackage.sln.DotSettings @@ -1,3 +1,4 @@  + True True True \ No newline at end of file From 8e1e93d677af584566bf171cb5fffd8946d21e3b Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 12:44:00 +0800 Subject: [PATCH 05/14] Refactoring. --- .../UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs | 3 ++- .../BindableUIElements/Uxmls/BindableTextField.Uxml.cs | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs index ac4d617..2d4cc7e 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs @@ -1,4 +1,5 @@ using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { @@ -18,7 +19,7 @@ partial class BindableLabel public override void Init(VisualElement visualElement, IUxmlAttributes bag, CreationContext context) { base.Init(visualElement, bag, context); - ((BindableLabel) visualElement).BindingTextPath = _bindingTextAttribute.GetValueFromBag(bag, context); + visualElement.As().BindingTextPath = _bindingTextAttribute.GetValueFromBag(bag, context); } } } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs index c622b26..ad4e43c 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs @@ -1,4 +1,5 @@ using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { @@ -18,8 +19,10 @@ partial class BindableTextField public override void Init(VisualElement visualElement, IUxmlAttributes bag, CreationContext context) { base.Init(visualElement, bag, context); - ((BindableTextField) visualElement).BindingValuePath = - _bindingValueAttribute.GetValueFromBag(bag, context); + + visualElement + .As() + .BindingValuePath = _bindingValueAttribute.GetValueFromBag(bag, context); } } } From 31e14f26cf3a383eaba47cd7139f9e25cf2cc79f Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 12:44:19 +0800 Subject: [PATCH 06/14] Update packages. --- src/UnityMvvmToolkit.UnityPackage/Packages/manifest.json | 2 +- src/UnityMvvmToolkit.UnityPackage/Packages/packages-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Packages/manifest.json b/src/UnityMvvmToolkit.UnityPackage/Packages/manifest.json index 0c632a5..7f13b4d 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Packages/manifest.json +++ b/src/UnityMvvmToolkit.UnityPackage/Packages/manifest.json @@ -8,7 +8,7 @@ "com.unity.ide.vscode": "1.2.5", "com.unity.test-framework": "1.1.33", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.6.4", + "com.unity.timeline": "1.6.5", "com.unity.ugui": "1.0.0", "com.unity.visualscripting": "1.8.0", "com.unity.modules.ai": "1.0.0", diff --git a/src/UnityMvvmToolkit.UnityPackage/Packages/packages-lock.json b/src/UnityMvvmToolkit.UnityPackage/Packages/packages-lock.json index 8803f67..644693f 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Packages/packages-lock.json +++ b/src/UnityMvvmToolkit.UnityPackage/Packages/packages-lock.json @@ -182,7 +182,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.6.4", + "version": "1.6.5", "depth": 0, "source": "registry", "dependencies": { From 4de66acfc5300f5965a6f1908f907c37abc7147f Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 12:45:40 +0800 Subject: [PATCH 07/14] Rename ButtonUITK to BaseButton. --- .../UITK/BindableUIElements/BaseButton.cs | 13 +++++++++++++ .../UITK/BindableUIElements/BaseButton.cs.meta | 3 +++ .../UITK/BindableUIElements/BindableButton.cs | 2 +- .../{ButtonUITK.Uxml.cs => BaseButton.Uxml.cs} | 17 +++-------------- .../Uxmls/BaseButton.Uxml.cs.meta | 3 +++ .../Uxmls/BindableButton.Uxml.cs | 7 +++---- .../Uxmls/ButtonUITK.Uxml.cs.meta | 3 --- 7 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs.meta rename src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/{ButtonUITK.Uxml.cs => BaseButton.Uxml.cs} (55%) create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs.meta delete mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs new file mode 100644 index 0000000..8b65cdf --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs @@ -0,0 +1,13 @@ +using UnityEngine.UIElements; + +namespace UnityMvvmToolkit.UITK.BindableUIElements +{ + public abstract partial class BaseButton : Button + { + public bool Enabled + { + get => enabledSelf; + set => SetEnabled(value); + } + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs.meta new file mode 100644 index 0000000..5f68c8b --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BaseButton.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d3f52a28fedf4eca97c6293c12219919 +timeCreated: 1685334079 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableButton.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableButton.cs index 598086e..a303a4c 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableButton.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/BindableButton.cs @@ -5,7 +5,7 @@ namespace UnityMvvmToolkit.UITK.BindableUIElements { - public partial class BindableButton : ButtonUITK, IBindableElement + public partial class BindableButton : BaseButton, IBindableElement { private int? _buttonId; diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs similarity index 55% rename from src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs rename to src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs index ff086b1..13e7cfd 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs @@ -1,19 +1,10 @@ using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { - public class ButtonUITK : Button + partial class BaseButton { - public bool Enabled - { - get => enabledSelf; - set => SetEnabled(value); - } - - public new class UxmlFactory : UxmlFactory - { - } - public new class UxmlTraits : Button.UxmlTraits { private readonly UxmlBoolAttributeDescription _enabledAttribute = new() @@ -22,9 +13,7 @@ public bool Enabled public override void Init(VisualElement visualElement, IUxmlAttributes bag, CreationContext context) { base.Init(visualElement, bag, context); - - var bindableButton = (ButtonUITK) visualElement; - bindableButton.Enabled = _enabledAttribute.GetValueFromBag(bag, context); + visualElement.As().Enabled = _enabledAttribute.GetValueFromBag(bag, context); } } } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs.meta new file mode 100644 index 0000000..75e4f5c --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 79e6d2ce5b7749b6bd14b6a3aa9321e5 +timeCreated: 1685334109 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs index 0e15ebf..b80f904 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs @@ -1,4 +1,5 @@ using UnityEngine.UIElements; +using UnityMvvmToolkit.UITK.Extensions; namespace UnityMvvmToolkit.UITK.BindableUIElements { @@ -10,7 +11,7 @@ partial class BindableButton { } - public new class UxmlTraits : ButtonUITK.UxmlTraits + public new class UxmlTraits : BaseButton.UxmlTraits { private readonly UxmlStringAttributeDescription _commandAttribute = new() { name = "command", defaultValue = "" }; @@ -18,9 +19,7 @@ partial class BindableButton public override void Init(VisualElement visualElement, IUxmlAttributes bag, CreationContext context) { base.Init(visualElement, bag, context); - - var bindableButton = (BindableButton) visualElement; - bindableButton.Command = _commandAttribute.GetValueFromBag(bag, context); + visualElement.As().Command = _commandAttribute.GetValueFromBag(bag, context); } } } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs.meta deleted file mode 100644 index 76a7b27..0000000 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/ButtonUITK.Uxml.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4bcb57a577fa46dbbbaec989011f48ab -timeCreated: 1681884189 \ No newline at end of file From 155d7a6ddda77493d997563b86b52bfd45223749 Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 12:56:52 +0800 Subject: [PATCH 08/14] Fix calc sample button issues. --- samples/Unity.Mvvm.Calc/Assets/UI Toolkit/CalcView.uxml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/Unity.Mvvm.Calc/Assets/UI Toolkit/CalcView.uxml b/samples/Unity.Mvvm.Calc/Assets/UI Toolkit/CalcView.uxml index 2c8aed0..3fa81a9 100644 --- a/samples/Unity.Mvvm.Calc/Assets/UI Toolkit/CalcView.uxml +++ b/samples/Unity.Mvvm.Calc/Assets/UI Toolkit/CalcView.uxml @@ -7,8 +7,8 @@ - - + + @@ -31,7 +31,7 @@ - + From b8ef5d3847308fba11a7342beb9f71bcc79a54d8 Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 20:12:41 +0800 Subject: [PATCH 09/14] Resolve #15. Unify ObservableAttribute logic for properties and commands. --- .../Attributes/ObservableAttribute.cs | 7 +--- .../BindingContextObjectProvider.cs | 6 +-- .../Internal/BindingContextMemberProvider.cs | 35 ++++++++++------- .../IsExternalInit.cs | 12 ++++++ .../Core/Attributes/ObservableAttribute.cs | 7 +--- .../Core/BindingContextObjectProvider.cs | 6 +-- .../Internal/BindingContextMemberProvider.cs | 35 ++++++++++------- .../Core/System.Runtime.CompilerServices.meta | 8 ++++ .../IsExternalInit.cs | 12 ++++++ .../IsExternalInit.cs.meta | 11 ++++++ .../BindingContextObjectProviderTests.cs | 38 +------------------ .../TestBindingContext/NotBindingContext.cs | 5 --- .../BindingContextMemberProviderTests.cs | 37 ++++++++++++++++-- .../CommandBindingContext.cs | 31 +++++++++++++++ ...BindingContext.cs => NotBindingContext.cs} | 2 +- .../ObservablePropertyBindingContext.cs | 23 +++++++++++ .../PublicFieldBindingContext.cs | 7 ++++ .../PublicPropertyBindingContext.cs | 6 +++ 18 files changed, 194 insertions(+), 94 deletions(-) create mode 100644 src/UnityMvvmToolkit.Core/System.Runtime.CompilerServices/IsExternalInit.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices.meta create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs.meta delete mode 100644 tests/UnityMvvmToolkit.Test.Integration/TestBindingContext/NotBindingContext.cs rename tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/{NoBindingContext.cs => NotBindingContext.cs} (67%) create mode 100644 tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/ObservablePropertyBindingContext.cs diff --git a/src/UnityMvvmToolkit.Core/Attributes/ObservableAttribute.cs b/src/UnityMvvmToolkit.Core/Attributes/ObservableAttribute.cs index 2523f22..fce3b91 100644 --- a/src/UnityMvvmToolkit.Core/Attributes/ObservableAttribute.cs +++ b/src/UnityMvvmToolkit.Core/Attributes/ObservableAttribute.cs @@ -1,13 +1,8 @@ using System; -namespace System.Runtime.CompilerServices -{ - internal static class IsExternalInit {} -} - namespace UnityMvvmToolkit.Core.Attributes { - [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public sealed class ObservableAttribute : Attribute { /// diff --git a/src/UnityMvvmToolkit.Core/BindingContextObjectProvider.cs b/src/UnityMvvmToolkit.Core/BindingContextObjectProvider.cs index e709519..ed4c326 100644 --- a/src/UnityMvvmToolkit.Core/BindingContextObjectProvider.cs +++ b/src/UnityMvvmToolkit.Core/BindingContextObjectProvider.cs @@ -109,8 +109,7 @@ public TCommand GetCommand(IBindingContext context, string propertyNam { EnsureIsNotNullOrWhiteSpace(propertyName, nameof(propertyName)); - if (TryGetContextMemberInfo(context.GetType(), propertyName, out var memberInfo) == false || - memberInfo.MemberType != MemberTypes.Property) + if (TryGetContextMemberInfo(context.GetType(), propertyName, out var memberInfo) == false) { throw new InvalidOperationException($"Command '{propertyName}' not found."); } @@ -131,8 +130,7 @@ public IBaseCommand RentCommandWrapper(IBindingContext context, CommandBindingDa EnsureIsNotNullOrWhiteSpace(bindingData.ParameterValue, $"Command '{bindingData.PropertyName}' has no parameter. Use {nameof(GetCommand)} instead."); - if (TryGetContextMemberInfo(context.GetType(), bindingData.PropertyName, out var memberInfo) == false || - memberInfo.MemberType != MemberTypes.Property) + if (TryGetContextMemberInfo(context.GetType(), bindingData.PropertyName, out var memberInfo) == false) { throw new InvalidOperationException($"Command '{bindingData.PropertyName}' not found."); } diff --git a/src/UnityMvvmToolkit.Core/Internal/BindingContextMemberProvider.cs b/src/UnityMvvmToolkit.Core/Internal/BindingContextMemberProvider.cs index 0e26964..399cec4 100644 --- a/src/UnityMvvmToolkit.Core/Internal/BindingContextMemberProvider.cs +++ b/src/UnityMvvmToolkit.Core/Internal/BindingContextMemberProvider.cs @@ -58,32 +58,39 @@ private static bool TryGetFieldHashCode(Type contextType, FieldInfo fieldInfo, o return false; } - if (fieldInfo.IsPublic) + if (HasObservableAttribute(fieldInfo, out var propertyName)) { - return TryGetHashCode(contextType, fieldInfo.Name, fieldInfo.FieldType, out hashCode); + return string.IsNullOrWhiteSpace(propertyName) + ? TryGetHashCode(contextType, GetBindableName(fieldInfo.Name), fieldInfo.FieldType, out hashCode) + : TryGetHashCode(contextType, propertyName, fieldInfo.FieldType, out hashCode); } - if (HasObservableAttribute(fieldInfo, out var propertyName) == false) + if (fieldInfo.IsPublic) { - hashCode = default; - return false; + return TryGetHashCode(contextType, fieldInfo.Name, fieldInfo.FieldType, out hashCode); } - return string.IsNullOrWhiteSpace(propertyName) - ? TryGetHashCode(contextType, GetFieldName(fieldInfo.Name), fieldInfo.FieldType, out hashCode) - : TryGetHashCode(contextType, propertyName, fieldInfo.FieldType, out hashCode); + hashCode = default; + return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool TryGetPropertyHashCode(Type contextType, PropertyInfo propertyInfo, out int hashCode) { - if (propertyInfo.GetMethod.IsPrivate) + if (HasObservableAttribute(propertyInfo, out var propertyName)) { - hashCode = default; - return false; + return string.IsNullOrWhiteSpace(propertyName) + ? TryGetHashCode(contextType, GetBindableName(propertyInfo.Name), propertyInfo.PropertyType, out hashCode) + : TryGetHashCode(contextType, propertyName, propertyInfo.PropertyType, out hashCode); } - return TryGetHashCode(contextType, propertyInfo.Name, propertyInfo.PropertyType, out hashCode); + if (propertyInfo.GetMethod.IsPublic) + { + return TryGetHashCode(contextType, propertyInfo.Name, propertyInfo.PropertyType, out hashCode); + } + + hashCode = default; + return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -116,9 +123,9 @@ private static bool HasObservableAttribute(MemberInfo fieldInfo, out string prop } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static string GetFieldName(string fieldName) + private static string GetBindableName(string memberName) { - var resultName = fieldName; + var resultName = memberName; if (resultName.Length> 1) { diff --git a/src/UnityMvvmToolkit.Core/System.Runtime.CompilerServices/IsExternalInit.cs b/src/UnityMvvmToolkit.Core/System.Runtime.CompilerServices/IsExternalInit.cs new file mode 100644 index 0000000..5487d8b --- /dev/null +++ b/src/UnityMvvmToolkit.Core/System.Runtime.CompilerServices/IsExternalInit.cs @@ -0,0 +1,12 @@ +using System.ComponentModel; + +// ReSharper disable CheckNamespace +// ReSharper disable UnusedType.Global + +namespace System.Runtime.CompilerServices +{ + [EditorBrowsable(EditorBrowsableState.Never)] + internal static class IsExternalInit + { + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Attributes/ObservableAttribute.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Attributes/ObservableAttribute.cs index 2523f22..fce3b91 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Attributes/ObservableAttribute.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Attributes/ObservableAttribute.cs @@ -1,13 +1,8 @@ using System; -namespace System.Runtime.CompilerServices -{ - internal static class IsExternalInit {} -} - namespace UnityMvvmToolkit.Core.Attributes { - [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] public sealed class ObservableAttribute : Attribute { /// diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/BindingContextObjectProvider.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/BindingContextObjectProvider.cs index e709519..ed4c326 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/BindingContextObjectProvider.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/BindingContextObjectProvider.cs @@ -109,8 +109,7 @@ public TCommand GetCommand(IBindingContext context, string propertyNam { EnsureIsNotNullOrWhiteSpace(propertyName, nameof(propertyName)); - if (TryGetContextMemberInfo(context.GetType(), propertyName, out var memberInfo) == false || - memberInfo.MemberType != MemberTypes.Property) + if (TryGetContextMemberInfo(context.GetType(), propertyName, out var memberInfo) == false) { throw new InvalidOperationException($"Command '{propertyName}' not found."); } @@ -131,8 +130,7 @@ public IBaseCommand RentCommandWrapper(IBindingContext context, CommandBindingDa EnsureIsNotNullOrWhiteSpace(bindingData.ParameterValue, $"Command '{bindingData.PropertyName}' has no parameter. Use {nameof(GetCommand)} instead."); - if (TryGetContextMemberInfo(context.GetType(), bindingData.PropertyName, out var memberInfo) == false || - memberInfo.MemberType != MemberTypes.Property) + if (TryGetContextMemberInfo(context.GetType(), bindingData.PropertyName, out var memberInfo) == false) { throw new InvalidOperationException($"Command '{bindingData.PropertyName}' not found."); } diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Internal/BindingContextMemberProvider.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Internal/BindingContextMemberProvider.cs index 0e26964..399cec4 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Internal/BindingContextMemberProvider.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/Internal/BindingContextMemberProvider.cs @@ -58,32 +58,39 @@ private static bool TryGetFieldHashCode(Type contextType, FieldInfo fieldInfo, o return false; } - if (fieldInfo.IsPublic) + if (HasObservableAttribute(fieldInfo, out var propertyName)) { - return TryGetHashCode(contextType, fieldInfo.Name, fieldInfo.FieldType, out hashCode); + return string.IsNullOrWhiteSpace(propertyName) + ? TryGetHashCode(contextType, GetBindableName(fieldInfo.Name), fieldInfo.FieldType, out hashCode) + : TryGetHashCode(contextType, propertyName, fieldInfo.FieldType, out hashCode); } - if (HasObservableAttribute(fieldInfo, out var propertyName) == false) + if (fieldInfo.IsPublic) { - hashCode = default; - return false; + return TryGetHashCode(contextType, fieldInfo.Name, fieldInfo.FieldType, out hashCode); } - return string.IsNullOrWhiteSpace(propertyName) - ? TryGetHashCode(contextType, GetFieldName(fieldInfo.Name), fieldInfo.FieldType, out hashCode) - : TryGetHashCode(contextType, propertyName, fieldInfo.FieldType, out hashCode); + hashCode = default; + return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static bool TryGetPropertyHashCode(Type contextType, PropertyInfo propertyInfo, out int hashCode) { - if (propertyInfo.GetMethod.IsPrivate) + if (HasObservableAttribute(propertyInfo, out var propertyName)) { - hashCode = default; - return false; + return string.IsNullOrWhiteSpace(propertyName) + ? TryGetHashCode(contextType, GetBindableName(propertyInfo.Name), propertyInfo.PropertyType, out hashCode) + : TryGetHashCode(contextType, propertyName, propertyInfo.PropertyType, out hashCode); } - return TryGetHashCode(contextType, propertyInfo.Name, propertyInfo.PropertyType, out hashCode); + if (propertyInfo.GetMethod.IsPublic) + { + return TryGetHashCode(contextType, propertyInfo.Name, propertyInfo.PropertyType, out hashCode); + } + + hashCode = default; + return false; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -116,9 +123,9 @@ private static bool HasObservableAttribute(MemberInfo fieldInfo, out string prop } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static string GetFieldName(string fieldName) + private static string GetBindableName(string memberName) { - var resultName = fieldName; + var resultName = memberName; if (resultName.Length> 1) { diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices.meta new file mode 100644 index 0000000..48da47c --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf3ff4caec98b3b45a22b215431f8b1c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs new file mode 100644 index 0000000..5487d8b --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs @@ -0,0 +1,12 @@ +using System.ComponentModel; + +// ReSharper disable CheckNamespace +// ReSharper disable UnusedType.Global + +namespace System.Runtime.CompilerServices +{ + [EditorBrowsable(EditorBrowsableState.Never)] + internal static class IsExternalInit + { + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs.meta new file mode 100644 index 0000000..5a859a3 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/Core/System.Runtime.CompilerServices/IsExternalInit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f4d9a115f8046041803af35abf88681 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/tests/UnityMvvmToolkit.Test.Integration/BindingContextObjectProviderTests.cs b/tests/UnityMvvmToolkit.Test.Integration/BindingContextObjectProviderTests.cs index 17a0344..143767d 100644 --- a/tests/UnityMvvmToolkit.Test.Integration/BindingContextObjectProviderTests.cs +++ b/tests/UnityMvvmToolkit.Test.Integration/BindingContextObjectProviderTests.cs @@ -96,7 +96,7 @@ public void WarmupViewModel_ShouldWarmupBindingContext_WhenBindingContextIsNotWa } [Theory] - [InlineData(typeof(NoBindingContext))] + [InlineData(typeof(NotBindingContext))] [InlineData(typeof(AbstractBindingContext))] [InlineData(typeof(IInterfaceBindingContext))] public void WarmupViewModel_ShouldThrow_WhenBindingContextIsNotSupported(Type bindingContextType) @@ -437,23 +437,6 @@ public void GetCommand_ShouldThrow_WhenCommandIsNotFound() .WithMessage($"Command '{notPresentedCommand}' not found."); } - [Fact] - public void GetCommand_ShouldThrow_WhenMemberTypeIsNotProperty() - { - // Arrange - const string commandName = nameof(MyBindingContext.FieldCommand); - - var objectProvider = new BindingContextObjectProvider(Array.Empty()); - var bindingContext = new MyBindingContext(); - - // Assert - objectProvider - .Invoking(sut => sut.GetCommand(bindingContext, commandName)) - .Should() - .Throw() - .WithMessage($"Command '{commandName}' not found."); - } - [Fact] public void GetCommand_ShouldThrow_WhenCommandTypeIsNotAssignableFromPropertyType() { @@ -553,25 +536,6 @@ public void RentCommandWrapper_ShouldThrow_WhenCommandIsNotFound() .WithMessage($"Command '{notPresentedCommand}' not found."); } - [Fact] - public void RentCommandWrapper_ShouldThrow_WhenMemberTypeIsNotProperty() - { - // Arrange - const string commandName = nameof(MyBindingContext.FieldCommand); - - var objectProvider = new BindingContextObjectProvider(Array.Empty()); - var bindingContext = new MyBindingContext(); - - var commandBindingData = $"{commandName}, 5".ToCommandBindingData(0); - - // Assert - objectProvider - .Invoking(sut => sut.RentCommandWrapper(bindingContext, commandBindingData)) - .Should() - .Throw() - .WithMessage($"Command '{commandName}' not found."); - } - [Fact] public void GetCollectionItemTemplate_ShouldReturnObject_WhenCollectionIsNotEmpty() { diff --git a/tests/UnityMvvmToolkit.Test.Integration/TestBindingContext/NotBindingContext.cs b/tests/UnityMvvmToolkit.Test.Integration/TestBindingContext/NotBindingContext.cs deleted file mode 100644 index 991c035..0000000 --- a/tests/UnityMvvmToolkit.Test.Integration/TestBindingContext/NotBindingContext.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace UnityMvvmToolkit.Test.Integration.TestBindingContext; - -public class NotBindingContext -{ -} \ No newline at end of file diff --git a/tests/UnityMvvmToolkit.Test.Unit/BindingContextMemberProviderTests.cs b/tests/UnityMvvmToolkit.Test.Unit/BindingContextMemberProviderTests.cs index 09a8f08..9472a99 100644 --- a/tests/UnityMvvmToolkit.Test.Unit/BindingContextMemberProviderTests.cs +++ b/tests/UnityMvvmToolkit.Test.Unit/BindingContextMemberProviderTests.cs @@ -97,14 +97,14 @@ public void GetBindingContextMembers_ShouldThrow_WhenAttributesShareSameName() public void GetBindingContextMembers_ShouldThrow_WhenTypeIsNotAssignableFromIBindingContext() { // Arrange - var bindingContextType = typeof(NoBindingContext); + var bindingContextType = typeof(NotBindingContext); // Assert _memberProvider .Invoking(sut => sut.GetBindingContextMembers(bindingContextType, null)) .Should() .Throw() - .WithMessage($"{nameof(NoBindingContext)} is not assignable from {nameof(IBindingContext)}."); + .WithMessage($"{nameof(NotBindingContext)} is not assignable from {nameof(IBindingContext)}."); } [Fact] @@ -126,6 +126,7 @@ private static IEnumerable BindingContextDataSets() yield return GetObservableFieldBindingContextTestData(); yield return GetPublicFieldBindingContextTestData(); yield return GetPrivatePropertyBindingContextTestData(); + yield return GetObservablePropertyBindingContextTestData(); yield return GetSameFieldAndPropertyNamesBindingContextTestData(); yield return GetPublicPropertyBindingContextTestData(); yield return GetCommandBindingContextTestData(); @@ -167,6 +168,8 @@ private static object[] GetPublicFieldBindingContextTestData() (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(PublicFieldBindingContext.m_floatField)), MemberTypes.Field), (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(PublicFieldBindingContext.StrField)), + MemberTypes.Field), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "ObservableField"), MemberTypes.Field) } }; @@ -177,6 +180,20 @@ private static object[] GetPrivatePropertyBindingContextTestData() return new object[] { typeof(PrivatePropertyBindingContext), Array.Empty<(int, MemberTypes)>() }; } + private static object[] GetObservablePropertyBindingContextTestData() + { + var bindingContextType = typeof(ObservablePropertyBindingContext); + return new object[] + { + bindingContextType, + new (int, MemberTypes)[] + { + (HashCodeHelper.GetMemberHashCode(bindingContextType, "Bool"), MemberTypes.Property), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "BoolName"), MemberTypes.Property) + } + }; + } + private static object[] GetSameFieldAndPropertyNamesBindingContextTestData() { var bindingContextType = typeof(SameFieldAndPropertyNamesBindingContext); @@ -206,6 +223,8 @@ private static object[] GetPublicPropertyBindingContextTestData() (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(PublicPropertyBindingContext.m_floatProperty)), MemberTypes.Property), (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(PublicPropertyBindingContext.StrProperty)), + MemberTypes.Property), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "ObservableProperty"), MemberTypes.Property) } }; @@ -217,8 +236,18 @@ private static object[] GetCommandBindingContextTestData() return new object[] { bindingContextType, - new (int, MemberTypes)[] + new[] { + (HashCodeHelper.GetMemberHashCode(bindingContextType, "PrivateFieldCommand"), + MemberTypes.Field), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "PrivateCommand"), + MemberTypes.Field), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "ProtectedFieldCommand"), + MemberTypes.Field), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "PrivatePropertyCommand"), + MemberTypes.Property), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "ProtectedPropertyCommand"), + MemberTypes.Property), (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(CommandBindingContext.incrementCommand)), MemberTypes.Property), (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(CommandBindingContext._decrementCommand)), @@ -226,6 +255,8 @@ private static object[] GetCommandBindingContextTestData() (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(CommandBindingContext.m_multiplyCommand)), MemberTypes.Property), (HashCodeHelper.GetMemberHashCode(bindingContextType, nameof(CommandBindingContext.DivideCommand)), + MemberTypes.Property), + (HashCodeHelper.GetMemberHashCode(bindingContextType, "ObservableCommand"), MemberTypes.Property) } }; diff --git a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/CommandBindingContext.cs b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/CommandBindingContext.cs index 2003d98..3c6eec0 100644 --- a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/CommandBindingContext.cs +++ b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/CommandBindingContext.cs @@ -1,8 +1,12 @@ using UnityMvvmToolkit.Core; +using UnityMvvmToolkit.Core.Attributes; using UnityMvvmToolkit.Core.Interfaces; using UnityMvvmToolkit.Test.Unit.TestCommands; // ReSharper disable InconsistentNaming +// ReSharper disable NotAccessedField.Local +// ReSharper disable NotAccessedField.Global +// ReSharper disable UnusedAutoPropertyAccessor.Local // ReSharper disable UnusedAutoPropertyAccessor.Global namespace UnityMvvmToolkit.Test.Unit.TestBindingContext; @@ -11,15 +15,42 @@ public class CommandBindingContext : IBindingContext { public CommandBindingContext() { + _privateFieldCommand = new Command(default); + m_protectedFieldCommand = new Command(default); + _observablePrivateCommand = new Command(default); + + _privatePropertyCommand = new Command(default); + m_protectedPropertyCommand = new Command(default); + incrementCommand = new Command(default); _decrementCommand = new MyCommand(default); m_multiplyCommand = new Command(default); DivideCommand = new MyCommand(default); + + ObservablePublicCommand = new Command(default); } + [Observable] + private ICommand _privateFieldCommand; + + [Observable] + protected ICommand m_protectedFieldCommand; + + [Observable("PrivateCommand")] + private ICommand _observablePrivateCommand; + + [Observable] + private ICommand _privatePropertyCommand { get; } + + [Observable] + protected ICommand m_protectedPropertyCommand { get; } + public ICommand incrementCommand { get; } public IMyCommand _decrementCommand { get; } public ICommand m_multiplyCommand { get; } public IMyCommand DivideCommand { get; } + + [Observable("ObservableCommand")] + public ICommand ObservablePublicCommand { get; } } \ No newline at end of file diff --git a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/NoBindingContext.cs b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/NotBindingContext.cs similarity index 67% rename from tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/NoBindingContext.cs rename to tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/NotBindingContext.cs index 3aa4915..dfbb45f 100644 --- a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/NoBindingContext.cs +++ b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/NotBindingContext.cs @@ -1,5 +1,5 @@ namespace UnityMvvmToolkit.Test.Unit.TestBindingContext; -public class NoBindingContext +public class NotBindingContext { } \ No newline at end of file diff --git a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/ObservablePropertyBindingContext.cs b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/ObservablePropertyBindingContext.cs new file mode 100644 index 0000000..b60a600 --- /dev/null +++ b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/ObservablePropertyBindingContext.cs @@ -0,0 +1,23 @@ +using UnityMvvmToolkit.Core; +using UnityMvvmToolkit.Core.Attributes; +using UnityMvvmToolkit.Core.Interfaces; + +// ReSharper disable InconsistentNaming +// ReSharper disable UnusedAutoPropertyAccessor.Local + +namespace UnityMvvmToolkit.Test.Unit.TestBindingContext; + +public class ObservablePropertyBindingContext : IBindingContext +{ + [Observable] + private IProperty _bool { get; } + + [Observable("BoolName")] + protected IProperty m_boolWithPropertyName { get; } + + public ObservablePropertyBindingContext() + { + _bool = new Property(); + m_boolWithPropertyName = new Property(); + } +} \ No newline at end of file diff --git a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicFieldBindingContext.cs b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicFieldBindingContext.cs index 15ef399..6dc19a6 100644 --- a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicFieldBindingContext.cs +++ b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicFieldBindingContext.cs @@ -1,7 +1,9 @@ using UnityMvvmToolkit.Core; +using UnityMvvmToolkit.Core.Attributes; using UnityMvvmToolkit.Core.Interfaces; // ReSharper disable InconsistentNaming +// ReSharper disable NotAccessedField.Global namespace UnityMvvmToolkit.Test.Unit.TestBindingContext; @@ -14,10 +16,15 @@ public PublicFieldBindingContext() m_floatField = new Property(); StrField = new ReadOnlyProperty(nameof(PublicFieldBindingContext)); + + ObservablePublicField = new Property(); } public IProperty boolField; public IReadOnlyProperty _intField; public Property m_floatField; public ReadOnlyProperty StrField; + + [Observable("ObservableField")] + public IProperty ObservablePublicField; } \ No newline at end of file diff --git a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicPropertyBindingContext.cs b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicPropertyBindingContext.cs index c792947..62f4494 100644 --- a/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicPropertyBindingContext.cs +++ b/tests/UnityMvvmToolkit.Test.Unit/TestBindingContext/PublicPropertyBindingContext.cs @@ -1,4 +1,5 @@ using UnityMvvmToolkit.Core; +using UnityMvvmToolkit.Core.Attributes; using UnityMvvmToolkit.Core.Interfaces; // ReSharper disable InconsistentNaming @@ -14,10 +15,15 @@ public PublicPropertyBindingContext() m_floatProperty = new Property(); StrProperty = new ReadOnlyProperty(nameof(PublicPropertyBindingContext)); + + ObservablePublicProperty = new Property(); } public IProperty boolProperty { get; } public IReadOnlyProperty _intProperty { get; } public Property m_floatProperty { get; } public ReadOnlyProperty StrProperty { get; } + + [Observable("ObservableProperty")] + public IProperty ObservablePublicProperty { get; } } \ No newline at end of file From 70aba946318dedf41346a183bb169ef10409b408 Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 20:13:15 +0800 Subject: [PATCH 10/14] Bump stryker version. --- src/UnityMvvmToolkit.Core/.config/dotnet-tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnityMvvmToolkit.Core/.config/dotnet-tools.json b/src/UnityMvvmToolkit.Core/.config/dotnet-tools.json index 65c02cb..e77cc7e 100644 --- a/src/UnityMvvmToolkit.Core/.config/dotnet-tools.json +++ b/src/UnityMvvmToolkit.Core/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "dotnet-stryker": { - "version": "3.7.1", + "version": "3.9.0", "commands": [ "dotnet-stryker" ] From b7c48b5aedad9a0212365c27734ad1f3f914667d Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 20:41:05 +0800 Subject: [PATCH 11/14] Fix transition property layout. --- .../Unity.Mvvm.ToDoList/Assets/UI Toolkit/Styles/check-box.uss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Unity.Mvvm.ToDoList/Assets/UI Toolkit/Styles/check-box.uss b/samples/Unity.Mvvm.ToDoList/Assets/UI Toolkit/Styles/check-box.uss index 818d919..5513434 100644 --- a/samples/Unity.Mvvm.ToDoList/Assets/UI Toolkit/Styles/check-box.uss +++ b/samples/Unity.Mvvm.ToDoList/Assets/UI Toolkit/Styles/check-box.uss @@ -105,7 +105,7 @@ } .check-box__tick--animation { - transition-property: width height; + transition-property: width, height; transition-duration: 150ms, 150ms; transition-timing-function: ease-out-back, ease-out-back; } From c810eaaa047d89cbcfae8519d92e1cd4a5ed6a4a Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 22:21:00 +0800 Subject: [PATCH 12/14] Fix #16. Add Unity 2023 UxmlElement attribute support. --- .../Uxmls/BaseButton.Uxml.cs | 17 ++++++++++++++ .../Uxmls/BindableButton.Uxml.cs | 20 ++++++++++++++++- .../Uxmls/BindableLabel.Uxml.cs | 20 ++++++++++++++++- .../Uxmls/BindableListView.T.Uxml.cs | 20 +++++++++++++++++ .../Uxmls/BindableScrollView.T.Uxml.cs | 20 +++++++++++++++++ .../Uxmls/BindableTextField.Uxml.cs | 20 ++++++++++++++++- .../Uxmls/BindingContextProvider.T.Uxml.cs | 20 +++++++++++++++++ .../VisualElementExtensions.Uxml.cs | 22 +++++++++++++++++++ .../VisualElementExtensions.Uxml.cs.meta | 3 +++ .../Extensions/VisualElementExtensions.cs | 8 +------ 10 files changed, 160 insertions(+), 10 deletions(-) create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs create mode 100644 src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs.meta diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs index 13e7cfd..00de5e5 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BaseButton.Uxml.cs @@ -5,6 +5,22 @@ namespace UnityMvvmToolkit.UITK.BindableUIElements { partial class BaseButton { +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : Button.UxmlSerializedData + { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private bool Enabled; + #pragma warning disable 649 + + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + visualElement.As().Enabled = Enabled; + } + } +#else public new class UxmlTraits : Button.UxmlTraits { private readonly UxmlBoolAttributeDescription _enabledAttribute = new() @@ -16,5 +32,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea visualElement.As().Enabled = _enabledAttribute.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs index b80f904..aa1731e 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs @@ -7,10 +7,27 @@ partial class BindableButton { public string Command { get; private set; } - public new class UxmlFactory : UxmlFactory +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : BaseButton.UxmlSerializedData { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private string Command; + #pragma warning disable 649 + + public override object CreateInstance() => new BindableButton(); + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + visualElement.As().Command = Command; + } } + public new class UxmlFactory : UxmlFactory + { + } +#else public new class UxmlTraits : BaseButton.UxmlTraits { private readonly UxmlStringAttributeDescription _commandAttribute = new() @@ -22,5 +39,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea visualElement.As().Command = _commandAttribute.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs index 2d4cc7e..853b9b8 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs @@ -7,10 +7,27 @@ partial class BindableLabel { public string BindingTextPath { get; private set; } - public new class UxmlFactory : UxmlFactory +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : Label.UxmlSerializedData { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private string BindingTextPath; + #pragma warning disable 649 + + public override object CreateInstance() => new BindableLabel(); + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + visualElement.As().BindingTextPath = BindingTextPath; + } } + public new class UxmlFactory : UxmlFactory + { + } +#else public new class UxmlTraits : Label.UxmlTraits { private readonly UxmlStringAttributeDescription _bindingTextAttribute = new() @@ -22,5 +39,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea visualElement.As().BindingTextPath = _bindingTextAttribute.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs index d786b50..0df4d5d 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableListView.T.Uxml.cs @@ -7,6 +7,25 @@ partial class BindableListView { public string BindingItemsSourcePath { get; private set; } +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : ListView.UxmlSerializedData + { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private string BindingItemsSourcePath; + #pragma warning disable 649 + + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + + visualElement + .As>() + .BindingItemsSourcePath = BindingItemsSourcePath; + } + } +#else public new class UxmlTraits : ListView.UxmlTraits { private readonly UxmlStringAttributeDescription _bindingItemsSourceAttribute = new() @@ -21,5 +40,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea .BindingItemsSourcePath = _bindingItemsSourceAttribute.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs index 8fb86d5..196598b 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableScrollView.T.Uxml.cs @@ -7,6 +7,25 @@ partial class BindableScrollView { public string BindingItemsSourcePath { get; private set; } +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : ScrollView.UxmlSerializedData + { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private string BindingItemsSourcePath; + #pragma warning disable 649 + + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + + visualElement + .As>() + .BindingItemsSourcePath = BindingItemsSourcePath; + } + } +#else public new class UxmlTraits : ScrollView.UxmlTraits { private readonly UxmlStringAttributeDescription _bindingItemsSourceAttribute = new() @@ -21,5 +40,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea .BindingItemsSourcePath = _bindingItemsSourceAttribute.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs index ad4e43c..6ff0a5a 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs @@ -7,10 +7,27 @@ partial class BindableTextField { public string BindingValuePath { get; private set; } - public new class UxmlFactory : UxmlFactory +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : TextField.UxmlSerializedData { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private string BindingValuePath; + #pragma warning disable 649 + + public override object CreateInstance() => new BindableTextField(); + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + visualElement.As().BindingValuePath = BindingValuePath; + } } + public new class UxmlFactory : UxmlFactory + { + } +#else public new class UxmlTraits : TextField.UxmlTraits { private readonly UxmlStringAttributeDescription _bindingValueAttribute = new() @@ -25,5 +42,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea .BindingValuePath = _bindingValueAttribute.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs index 969610a..db63760 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindingContextProvider.T.Uxml.cs @@ -7,6 +7,25 @@ partial class BindingContextProvider { public string BindingContextPath { get; protected set; } +#if UNITY_2023_2_OR_NEWER + [System.Serializable] + public new class UxmlSerializedData : VisualElement.UxmlSerializedData + { + // ReSharper disable once InconsistentNaming + #pragma warning disable 649 + [UnityEngine.SerializeField] private string BindingContextPath; + #pragma warning disable 649 + + public override void Deserialize(object visualElement) + { + base.Deserialize(visualElement); + + visualElement + .As>() + .BindingContextPath = BindingContextPath; + } + } +#else public new class UxmlTraits : VisualElement.UxmlTraits { private readonly UxmlStringAttributeDescription _bindingContextPath = new() @@ -21,5 +40,6 @@ public override void Init(VisualElement visualElement, IUxmlAttributes bag, Crea .BindingContextPath = _bindingContextPath.GetValueFromBag(bag, context); } } +#endif } } \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs new file mode 100644 index 0000000..e880961 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs @@ -0,0 +1,22 @@ +using System.Runtime.CompilerServices; +using UnityEngine.UIElements; + +namespace UnityMvvmToolkit.UITK.Extensions +{ + partial class VisualElementExtensions + { +#if UNITY_2023_2_OR_NEWER + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static T As(this object visualElement) where T : VisualElement + { + return (T) visualElement; + } +#else + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static T As(this VisualElement visualElement) where T : VisualElement + { + return (T) visualElement; + } +#endif + } +} \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs.meta b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs.meta new file mode 100644 index 0000000..37c91a7 --- /dev/null +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.Uxml.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bacacd7cd6a548d59b688f9494539171 +timeCreated: 1685369710 \ No newline at end of file diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs index 5c98634..939ecdc 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/Extensions/VisualElementExtensions.cs @@ -8,14 +8,8 @@ namespace UnityMvvmToolkit.UITK.Extensions { - public static class VisualElementExtensions + public static partial class VisualElementExtensions { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static T As(this VisualElement visualElement) where T : VisualElement - { - return (T) visualElement; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static VisualElement InstantiateBindableElement(this VisualTreeAsset visualTreeAsset) { From 1c48a6f10f1e1bcf891a72109ef0582363848c5d Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月29日 22:30:12 +0800 Subject: [PATCH 13/14] Fix bindable elements UxmlFactory issue. --- .../UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs | 8 ++++---- .../UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs | 8 ++++---- .../BindableUIElements/Uxmls/BindableTextField.Uxml.cs | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs index aa1731e..46f9c8c 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableButton.Uxml.cs @@ -7,6 +7,10 @@ partial class BindableButton { public string Command { get; private set; } + public new class UxmlFactory : UxmlFactory + { + } + #if UNITY_2023_2_OR_NEWER [System.Serializable] public new class UxmlSerializedData : BaseButton.UxmlSerializedData @@ -23,10 +27,6 @@ public override void Deserialize(object visualElement) visualElement.As().Command = Command; } } - - public new class UxmlFactory : UxmlFactory - { - } #else public new class UxmlTraits : BaseButton.UxmlTraits { diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs index 853b9b8..2499a95 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableLabel.Uxml.cs @@ -7,6 +7,10 @@ partial class BindableLabel { public string BindingTextPath { get; private set; } + public new class UxmlFactory : UxmlFactory + { + } + #if UNITY_2023_2_OR_NEWER [System.Serializable] public new class UxmlSerializedData : Label.UxmlSerializedData @@ -23,10 +27,6 @@ public override void Deserialize(object visualElement) visualElement.As().BindingTextPath = BindingTextPath; } } - - public new class UxmlFactory : UxmlFactory - { - } #else public new class UxmlTraits : Label.UxmlTraits { diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs index 6ff0a5a..4336cc1 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/Runtime/UITK/BindableUIElements/Uxmls/BindableTextField.Uxml.cs @@ -7,6 +7,10 @@ partial class BindableTextField { public string BindingValuePath { get; private set; } + public new class UxmlFactory : UxmlFactory + { + } + #if UNITY_2023_2_OR_NEWER [System.Serializable] public new class UxmlSerializedData : TextField.UxmlSerializedData @@ -23,10 +27,6 @@ public override void Deserialize(object visualElement) visualElement.As().BindingValuePath = BindingValuePath; } } - - public new class UxmlFactory : UxmlFactory - { - } #else public new class UxmlTraits : TextField.UxmlTraits { From b5c5a052afabb04408d38a7380abec913604fa54 Mon Sep 17 00:00:00 2001 From: ChebanovDD Date: 2023年5月30日 12:06:25 +0800 Subject: [PATCH 14/14] Bump package version. --- .../Assets/Plugins/UnityMvvmToolkit/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/package.json b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/package.json index db907b0..d1f2ff2 100644 --- a/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/package.json +++ b/src/UnityMvvmToolkit.UnityPackage/Assets/Plugins/UnityMvvmToolkit/package.json @@ -2,7 +2,7 @@ "name": "com.chebanovdd.unitymvvmtoolkit", "displayName": "Unity MVVM Toolkit", "author": { "name": "ChebanovDD", "url": "https://github.com/ChebanovDD" }, - "version": "1.0.2", + "version": "1.1.0", "unity": "2018.4", "description": "The Unity Mvvm Toolkit allows you to use data binding to establish a connection between the app UI and the data it displays. This is a simple and consistent way to achieve clean separation of business logic from UI.", "keywords": [ "mvvm", "binding", "ui", "toolkit" ],

AltStyle によって変換されたページ (->オリジナル) /