From 0ecaf6d61c71c434830787ef99afb52906fd8618 Mon Sep 17 00:00:00 2001 From: Dzianis Zhukouski Date: Wed, 27 Mar 2024 19:48:22 +0300 Subject: [PATCH 1/2] add bindable text path to BindableButton component --- .../UITK/BindableUIElements/BindableButton.cs | 20 +++++++++++++++++++ .../Uxmls/BindableButton.Uxml.cs | 18 +++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) 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 69702a8..496ec9a 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 @@ -10,7 +10,9 @@ public partial class BindableButton : BaseButton, IBindableElement private int? _buttonId; private IBaseCommand _command; + private IReadOnlyProperty _textProperty; private CommandBindingData _commandBindingData; + private PropertyBindingData _propertyBindingData; public virtual void SetBindingContext(IBindingContext context, IObjectProvider objectProvider) { @@ -30,6 +32,13 @@ public virtual void SetBindingContext(IBindingContext context, IObjectProvider o clicked += OnButtonClicked; SetControlEnabled(_command.CanExecute()); + + _propertyBindingData ??= BindingTextPath.ToPropertyBindingData(); + + _textProperty = objectProvider.RentReadOnlyProperty(context, _propertyBindingData); + _textProperty.ValueChanged += OnPropertyValueChanged; + + UpdateControlText(_textProperty.Value); } public virtual void ResetBindingContext(IObjectProvider objectProvider) @@ -49,6 +58,12 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider) SetControlEnabled(true); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected virtual void UpdateControlText(string newText) + { + text = newText; + } + private void OnButtonClicked() { _command.Execute(_buttonId!.Value); @@ -64,5 +79,10 @@ private void SetControlEnabled(bool isEnabled) { Enabled = isEnabled; } + + private void OnPropertyValueChanged(object sender, string newText) + { + UpdateControlText(newText); + } } } \ 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 92477cd..b4ecc56 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,8 @@ partial class BindableButton { public string Command { get; private set; } + public string BindingTextPath { get; private set; } + public new class UxmlFactory : UxmlFactory { } @@ -18,25 +20,37 @@ partial class BindableButton // ReSharper disable once InconsistentNaming #pragma warning disable 649 [UnityEngine.SerializeField] private string Command; - #pragma warning restore 649 +#pragma warning restore 649 + + [UnityEngine.SerializeField] private string BindingTextPath; public override object CreateInstance() => new BindableButton(); + public override void Deserialize(object visualElement) { base.Deserialize(visualElement); visualElement.As().Command = Command; + visualElement.As().BindingTextPath = BindingTextPath; } } #else public new class UxmlTraits : BaseButton.UxmlTraits { private readonly UxmlStringAttributeDescription _commandAttribute = new() - { name = "command", defaultValue = "" }; + { + name = "command", defaultValue = "" + }; + + private readonly UxmlStringAttributeDescription _bindingTextAttribute = new() + { + name = "binding-text-path", defaultValue = "" + }; public override void Init(VisualElement visualElement, IUxmlAttributes bag, CreationContext context) { base.Init(visualElement, bag, context); visualElement.As().Command = _commandAttribute.GetValueFromBag(bag, context); + visualElement.As().BindingTextPath = _bindingTextAttribute.GetValueFromBag(bag, context); } } #endif From 048d25a4495306b676e3d9d48092c816882db423 Mon Sep 17 00:00:00 2001 From: Dzianis Zhukouski Date: Wed, 27 Mar 2024 19:54:01 +0300 Subject: [PATCH 2/2] Add proper reset and set binding context logic --- .../UITK/BindableUIElements/BindableButton.cs | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) 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 496ec9a..ca792fc 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 @@ -33,16 +33,25 @@ public virtual void SetBindingContext(IBindingContext context, IObjectProvider o clicked += OnButtonClicked; SetControlEnabled(_command.CanExecute()); - _propertyBindingData ??= BindingTextPath.ToPropertyBindingData(); - - _textProperty = objectProvider.RentReadOnlyProperty(context, _propertyBindingData); - _textProperty.ValueChanged += OnPropertyValueChanged; - - UpdateControlText(_textProperty.Value); + if (!string.IsNullOrWhiteSpace(BindingTextPath)) + { + _propertyBindingData ??= BindingTextPath.ToPropertyBindingData(); + _textProperty = objectProvider.RentReadOnlyProperty(context, _propertyBindingData); + _textProperty.ValueChanged += OnPropertyValueChanged; + UpdateControlText(_textProperty.Value); + } } public virtual void ResetBindingContext(IObjectProvider objectProvider) { + if (_textProperty != null) + { + _textProperty.ValueChanged -= OnPropertyValueChanged; + objectProvider.ReturnReadOnlyProperty(_textProperty); + _textProperty = null; + UpdateControlText(null); + } + if (_command is null) { return; @@ -56,6 +65,7 @@ public virtual void ResetBindingContext(IObjectProvider objectProvider) clicked -= OnButtonClicked; SetControlEnabled(true); + } [MethodImpl(MethodImplOptions.AggressiveInlining)]