Files
monde-usage-unity/Assets/Scripts/UI/ObjectZoomPanel.cs
2024-09-29 22:52:50 +02:00

111 lines
3.1 KiBLFS
C#

#nullable enable
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[Serializable]
public class ObjectPresentation
{
public string name;
public RawImage image;
public TMPro.TextMeshProUGUI text;
public GameObject root;
public ObjectPresentation(
string name,
RawImage image,
TMPro.TextMeshProUGUI text,
GameObject root
)
{
this.name = name;
this.image = image;
this.text = text;
this.root = root;
}
}
public class ObjectZoomPanel : MonoBehaviour
{
public List<ObjectPresentation> objectPresentations;
public Dictionary<string, ObjectPresentation> objectPresentationDict;
void BuildDic()
{
objectPresentationDict = new Dictionary<string, ObjectPresentation>();
foreach (ObjectPresentation objectPresentation in objectPresentations)
{
objectPresentationDict[objectPresentation.name] = objectPresentation;
}
}
private void SetImageDim(RawImage image, Texture texture)
{
image.texture = texture;
// Get the RectTransforms
RectTransform rectTransform = image.GetComponent<RectTransform>();
RectTransform parentRectTransform = rectTransform.parent as RectTransform;
// Get the size of the parent RectTransform
float parentWidth = parentRectTransform.rect.width;
float parentHeight = parentRectTransform.rect.height;
// Calculate the aspect ratio of the image
float imageAspectRatio = (float)texture.width / texture.height;
float parentAspectRatio = parentWidth / parentHeight;
float newWidth, newHeight;
// Fit the image to the parent while maintaining aspect ratio
if (imageAspectRatio > parentAspectRatio)
{
// Image is wider relative to its height than the parent
newWidth = parentWidth;
newHeight = parentWidth / imageAspectRatio;
}
else
{
// Image is taller relative to its width than the parent
newWidth = parentHeight * imageAspectRatio;
newHeight = parentHeight;
}
// fit new image size to parent size
// Set the size of the RectTransform to the new size
rectTransform.sizeDelta = new Vector2(newWidth, newHeight);
// Center the RectTransform in the parent
rectTransform.anchoredPosition = Vector2.zero;
}
public void SetImage(ClickableZoom clickableZoom)
{
if (objectPresentationDict == null || objectPresentationDict.Count == 0) BuildDic();
ObjectPresentation objectPresentation = objectPresentationDict["horizontal"];
if (clickableZoom.text.Split("\n").Length > 2 || !clickableZoom.Horizontal)
{
objectPresentation = objectPresentationDict["vertical"];
}
foreach (ObjectPresentation op in objectPresentations)
{
op.root.SetActive(op == objectPresentation);
}
SetImageDim(objectPresentation.image, clickableZoom.fullImage);
objectPresentation.text.text = clickableZoom.text;
}
}