From 5c0adf2d72a52dbc5f8d4a4ffc349a36c9455936 Mon Sep 17 00:00:00 2001 From: Richard Fine Date: Sun, 28 Jan 2024 22:59:16 -0500 Subject: [PATCH 1/2] Add QRCodeDisplay UIToolkit control --- QRCoder.Unity/QRCodeDisplay.cs | 115 +++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 QRCoder.Unity/QRCodeDisplay.cs diff --git a/QRCoder.Unity/QRCodeDisplay.cs b/QRCoder.Unity/QRCodeDisplay.cs new file mode 100644 index 0000000..26c3097 --- /dev/null +++ b/QRCoder.Unity/QRCodeDisplay.cs @@ -0,0 +1,115 @@ +#if ENABLE_UIELEMENTS_CONTROLS +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UIElements; + +namespace QRCoder.Unity +{ + public class QRCodeDisplay : VisualElement + { + public QRCodeDisplay() + { + value = null; + style.unityBackgroundScaleMode = ScaleMode.ScaleToFit; + } + + public void Update(string value, QRCodeGenerator.ECCLevel eccLevel, int pixelsPerModule) + { + _value = value; + _eccLevel = eccLevel; + _pixelsPerModule = pixelsPerModule; + RegenerateImage(); + } + + public QRCodeGenerator.ECCLevel eccLevel + { + get => _eccLevel; + set + { + if (_eccLevel == value) + return; + _eccLevel = value; + RegenerateImage(); + } + } + + public int pixelsPerModule + { + get => _pixelsPerModule; + set + { + if (_pixelsPerModule == value) + return; + _pixelsPerModule = value; + RegenerateImage(); + } + } + + private string _value; + private Texture2D _image; + private QRCodeGenerator.ECCLevel _eccLevel = QRCodeGenerator.ECCLevel.Q; + private int _pixelsPerModule = 8; + + public string value + { + get => _value; + set + { + if (_value == value) + return; + _value = value; + RegenerateImage(); + } + } + + private void RegenerateImage() + { + if (_image != null) + Object.DestroyImmediate(_image, true); + + _image = null; + + if (value == null) + return; + + using var generator = new QRCodeGenerator(); + using var data = generator.CreateQrCode(value, eccLevel); + var unityCode = new UnityQRCode(data); + _image = unityCode.GetGraphic(pixelsPerModule); + _image.name = "Generated QR code"; + + style.backgroundImage = _image; + } + + public new class UxmlFactory : UxmlFactory + { + } + + public new class UxmlTraits : VisualElement.UxmlTraits + { + private UxmlStringAttributeDescription m_Value = new() { name = "value" }; + + private UxmlEnumAttributeDescription m_ECCLevel = new() + { name = "ecc-level", defaultValue = QRCodeGenerator.ECCLevel.Q }; + + private UxmlIntAttributeDescription m_PixelsPerModule = new() + { name = "pixels-per-module", defaultValue = 8 }; + + public override IEnumerable uxmlChildElementsDescription + { + get { yield break; } + } + + public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc) + { + base.Init(ve, bag, cc); + + var qr = (QRCodeDisplay)ve; + qr.Update(m_Value.GetValueFromBag(bag, cc), + m_ECCLevel.GetValueFromBag(bag, cc), + m_PixelsPerModule.GetValueFromBag(bag, cc)); + } + } + } +} +#endif \ No newline at end of file From 48f7144c289976cd5d132dbd667ce1302d164346 Mon Sep 17 00:00:00 2001 From: Richard Fine Date: Sun, 28 Jan 2024 23:00:33 -0500 Subject: [PATCH 2/2] Remove #ifdefs --- QRCoder.Unity/QRCodeDisplay.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/QRCoder.Unity/QRCodeDisplay.cs b/QRCoder.Unity/QRCodeDisplay.cs index 26c3097..97ea152 100644 --- a/QRCoder.Unity/QRCodeDisplay.cs +++ b/QRCoder.Unity/QRCodeDisplay.cs @@ -1,4 +1,3 @@ -#if ENABLE_UIELEMENTS_CONTROLS using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; @@ -112,4 +111,3 @@ public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext } } } -#endif \ No newline at end of file