Advertisement
_Cery

Dynamic stylesheet loading

Jun 4th, 2021
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.94 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using Cityscaper;
  6. using Cityscaper.Types;
  7. using UnityEditor;
  8. using UnityEngine;
  9. using UnityEngine.UIElements;
  10.  
  11. public enum ScreenSizePrefix
  12. {
  13.     sm,
  14.     lg
  15. }
  16.  
  17. [RequireComponent(typeof(UIDocument))]
  18. public class ScreenDependentStylesheets : MonoBehaviour
  19. {
  20.     private UIDocument root;
  21.     private Dictionary<ScreenSizePrefix, List<StyleSheet>> sheets;
  22.     public float[] breakpoints = new[] {0.15f}; // in cm
  23.     private List<StyleSheet> loadedStylesheets;
  24.    
  25.     void Start()
  26.     {
  27.         root = GetComponent<UIDocument>();
  28.         if (breakpoints.Length != Enum.GetNames(typeof(ScreenSizePrefix)).Length - 1)
  29.         {
  30.             Debug.LogWarning("The amount of breakpoints configured do not match the amount of screen size prefixes.");
  31.         }
  32.         UI.Instance.resolutionChanged += (res) => updateScreenSize(res);
  33.         loadedStylesheets = new List<StyleSheet>();
  34.     }
  35.  
  36.     void updateScreenSize(Vector2 res)
  37.     {
  38.         if (root.rootVisualElement == null)
  39.         {
  40.             return;
  41.         }
  42.         if (root.rootVisualElement.styleSheets.count > 0 && sheets == null)
  43.         {
  44.             loadInitalReplacementSheets();
  45.         }
  46.         float screenWidthInMeters = ((float)Screen.width / Screen.dpi) * 0.0254f;
  47.  
  48.         int breakpoint;
  49.         for (breakpoint = 0; breakpoint < breakpoints.Length; breakpoint++)
  50.         {
  51.             if (screenWidthInMeters < breakpoints[breakpoint])
  52.             {
  53.                 break;
  54.             }
  55.         }
  56.  
  57.         ScreenSizePrefix prefix = (ScreenSizePrefix)breakpoint;
  58.  
  59.         List<StyleSheet> newStyleSheets = sheets[prefix];
  60.         List<StyleSheet> sheetsToRemove = loadedStylesheets.FindAll((loaded) => !newStyleSheets.Contains(loaded));
  61.         List<StyleSheet> sheetsToAdd = newStyleSheets.FindAll((news) => !loadedStylesheets.Contains(news));
  62.        
  63.         foreach (var sheet in sheetsToRemove)
  64.         {
  65.             loadedStylesheets.Remove(sheet);
  66.             root.rootVisualElement.styleSheets.Remove(sheet);
  67.         }
  68.        
  69.         foreach (var sheet in sheetsToAdd)
  70.         {
  71.             loadedStylesheets.Add(sheet);
  72.             root.rootVisualElement.styleSheets.Add(sheet);
  73.         }
  74.  
  75.         if (sheetsToAdd.Count > 0 || sheetsToRemove.Count > 0)
  76.         {
  77.             Debug.Log(string.Format("Loaded Stylesheets for {0}. Screen size: {1}cm. Sheets:",
  78.                 Enum.GetName(typeof(ScreenSizePrefix), prefix), screenWidthInMeters * 100.0f));
  79.             foreach (var sheet in loadedStylesheets)
  80.             {
  81.                 Debug.Log(sheet.name);
  82.             }
  83.         }
  84.     }
  85.  
  86.     private void loadInitalReplacementSheets()
  87.     {
  88.         // Debug.Log("Loading pseudo size stylesheets. Root styles: " + root.rootVisualElement.styleSheets.count);
  89.         sheets = new Dictionary<ScreenSizePrefix, List<StyleSheet>>();
  90.         int totalSheetsLoaded = 0;
  91.         for(int i = 0; i < root.rootVisualElement.styleSheets.count; i++)
  92.         {
  93.             var sheet = root.rootVisualElement.styleSheets[i];
  94.             foreach (ScreenSizePrefix prefix in Enum.GetValues(typeof(ScreenSizePrefix)))
  95.             {
  96.                 if (!sheets.ContainsKey(prefix))
  97.                 {
  98.                     sheets.Add(prefix, new List<StyleSheet>());
  99.                 }
  100.  
  101.                 string sheetPath = Enum.GetName(typeof(ScreenSizePrefix), prefix) + "_" + sheet.name;
  102.                 StyleSheet ls =
  103.                     Resources.Load<StyleSheet>(sheetPath);
  104.                 if (ls != null)
  105.                 {
  106.                     sheets[prefix].Add(ls);
  107.                     totalSheetsLoaded++;
  108.                 }
  109.                 else
  110.                 {
  111.                     Debug.LogWarning("Failed to load: " + sheetPath);
  112.                 }
  113.             }
  114.         }
  115.         // Debug.Log("Pseudosheets loaded: " + totalSheetsLoaded);
  116.     }
  117. }
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement