Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Reflection;
- using Cityscaper;
- using Cityscaper.Types;
- using UnityEditor;
- using UnityEngine;
- using UnityEngine.UIElements;
- public enum ScreenSizePrefix
- {
- sm,
- lg
- }
- [RequireComponent(typeof(UIDocument))]
- public class ScreenDependentStylesheets : MonoBehaviour
- {
- private UIDocument root;
- private Dictionary<ScreenSizePrefix, List<StyleSheet>> sheets;
- public float[] breakpoints = new[] {0.15f}; // in cm
- private List<StyleSheet> loadedStylesheets;
- void Start()
- {
- root = GetComponent<UIDocument>();
- if (breakpoints.Length != Enum.GetNames(typeof(ScreenSizePrefix)).Length - 1)
- {
- Debug.LogWarning("The amount of breakpoints configured do not match the amount of screen size prefixes.");
- }
- UI.Instance.resolutionChanged += (res) => updateScreenSize(res);
- loadedStylesheets = new List<StyleSheet>();
- }
- void updateScreenSize(Vector2 res)
- {
- if (root.rootVisualElement == null)
- {
- return;
- }
- if (root.rootVisualElement.styleSheets.count > 0 && sheets == null)
- {
- loadInitalReplacementSheets();
- }
- float screenWidthInMeters = ((float)Screen.width / Screen.dpi) * 0.0254f;
- int breakpoint;
- for (breakpoint = 0; breakpoint < breakpoints.Length; breakpoint++)
- {
- if (screenWidthInMeters < breakpoints[breakpoint])
- {
- break;
- }
- }
- ScreenSizePrefix prefix = (ScreenSizePrefix)breakpoint;
- List<StyleSheet> newStyleSheets = sheets[prefix];
- List<StyleSheet> sheetsToRemove = loadedStylesheets.FindAll((loaded) => !newStyleSheets.Contains(loaded));
- List<StyleSheet> sheetsToAdd = newStyleSheets.FindAll((news) => !loadedStylesheets.Contains(news));
- foreach (var sheet in sheetsToRemove)
- {
- loadedStylesheets.Remove(sheet);
- root.rootVisualElement.styleSheets.Remove(sheet);
- }
- foreach (var sheet in sheetsToAdd)
- {
- loadedStylesheets.Add(sheet);
- root.rootVisualElement.styleSheets.Add(sheet);
- }
- if (sheetsToAdd.Count > 0 || sheetsToRemove.Count > 0)
- {
- Debug.Log(string.Format("Loaded Stylesheets for {0}. Screen size: {1}cm. Sheets:",
- Enum.GetName(typeof(ScreenSizePrefix), prefix), screenWidthInMeters * 100.0f));
- foreach (var sheet in loadedStylesheets)
- {
- Debug.Log(sheet.name);
- }
- }
- }
- private void loadInitalReplacementSheets()
- {
- // Debug.Log("Loading pseudo size stylesheets. Root styles: " + root.rootVisualElement.styleSheets.count);
- sheets = new Dictionary<ScreenSizePrefix, List<StyleSheet>>();
- int totalSheetsLoaded = 0;
- for(int i = 0; i < root.rootVisualElement.styleSheets.count; i++)
- {
- var sheet = root.rootVisualElement.styleSheets[i];
- foreach (ScreenSizePrefix prefix in Enum.GetValues(typeof(ScreenSizePrefix)))
- {
- if (!sheets.ContainsKey(prefix))
- {
- sheets.Add(prefix, new List<StyleSheet>());
- }
- string sheetPath = Enum.GetName(typeof(ScreenSizePrefix), prefix) + "_" + sheet.name;
- StyleSheet ls =
- Resources.Load<StyleSheet>(sheetPath);
- if (ls != null)
- {
- sheets[prefix].Add(ls);
- totalSheetsLoaded++;
- }
- else
- {
- Debug.LogWarning("Failed to load: " + sheetPath);
- }
- }
- }
- // Debug.Log("Pseudosheets loaded: " + totalSheetsLoaded);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement