111 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.IO; | |||
|  | 
 | |||
|  | using UnityEditor; | |||
|  | using UnityEngine.UIElements; | |||
|  | 
 | |||
|  | using PlasticGui; | |||
|  | using Unity.PlasticSCM.Editor.AssetUtils; | |||
|  | 
 | |||
|  | namespace Unity.PlasticSCM.Editor.UI.UIElements | |||
|  | { | |||
|  |     internal static class UIElementsExtensions | |||
|  |     { | |||
|  |         internal static void LoadLayout( | |||
|  |             this VisualElement element, | |||
|  |             string className) | |||
|  |         { | |||
|  |             string uxmlRelativePath = Path.Combine( | |||
|  |                 AssetsPath.GetLayoutsFolderRelativePath(), | |||
|  |                 string.Format("{0}.uxml", className)); | |||
|  | 
 | |||
|  |             VisualTreeAsset visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>( | |||
|  |                 uxmlRelativePath); | |||
|  | 
 | |||
|  |             if (visualTree == null) | |||
|  |             { | |||
|  |                 UnityEngine.Debug.LogErrorFormat( | |||
|  |                     "Layout {0} not found at path {1}", | |||
|  |                     className, | |||
|  |                     uxmlRelativePath); | |||
|  |                 return; | |||
|  |             } | |||
|  | 
 | |||
|  |             visualTree.CloneTree(element); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void LoadStyle( | |||
|  |             this VisualElement element, | |||
|  |             string className) | |||
|  |         { | |||
|  |             string ussRelativePath = Path.Combine( | |||
|  |                 AssetsPath.GetStylesFolderRelativePath(), | |||
|  |                 string.Format("{0}.uss", className)); | |||
|  | 
 | |||
|  |             StyleSheet sheet = AssetDatabase.LoadAssetAtPath<StyleSheet>( | |||
|  |                 ussRelativePath); | |||
|  | 
 | |||
|  |             if (sheet != null) | |||
|  |             { | |||
|  |                 element.styleSheets.Add(sheet); | |||
|  |             } | |||
|  | 
 | |||
|  |             string ussSkinRelativePath = Path.Combine( | |||
|  |                 AssetsPath.GetStylesFolderRelativePath(), | |||
|  |                 string.Format("{0}.{1}.uss", | |||
|  |                     className, EditorGUIUtility.isProSkin ? "dark" : "light")); | |||
|  | 
 | |||
|  |             StyleSheet skinSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>( | |||
|  |                 ussSkinRelativePath); | |||
|  | 
 | |||
|  |             if (skinSheet == null) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             element.styleSheets.Add(skinSheet); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void FocusOnceLoaded( | |||
|  |             this TextField elem) | |||
|  |         { | |||
|  |             // Really weird behavior from UIElements, apperently in order | |||
|  |             // to focus a text field you have to wait for it to attach to | |||
|  |             // the panel and then focus it's TextInputBaseField child | |||
|  |             // control rather than the TextField itself. For more see: | |||
|  |             // https://forum.unity.com/threads/focus-doesnt-seem-to-work.901130/ | |||
|  |             elem.RegisterCallback<AttachToPanelEvent>( | |||
|  |                 _ => elem.Q(TextInputBaseField<string>.textInputUssName).Focus()); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void FocusWorkaround(this TextField textField) | |||
|  |         { | |||
|  |             // https://issuetracker.unity3d.com/issues/uielements-textfield-is-not-focused-and-you-are-not-able-to-type-in-characters-when-using-focus-method | |||
|  |             textField.Q("unity-text-input").Focus(); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void SetControlImage( | |||
|  |             this VisualElement element, | |||
|  |             string name, | |||
|  |             Images.Name imageName) | |||
|  |         { | |||
|  |             Image imageElem = element.Query<Image>(name).First(); | |||
|  |             imageElem.image = Images.GetImage(imageName); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void SetControlText<T>( | |||
|  |             this VisualElement element, | |||
|  |             string name, PlasticLocalization.Name fieldName, | |||
|  |             params string[] format) where T : VisualElement | |||
|  |         { | |||
|  |             dynamic control = element.Query<T>(name).First(); | |||
|  |             string str = PlasticLocalization.GetString(fieldName); | |||
|  |             control.text = format.Length > 0 ? string.Format(str, format) : str; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal static void SetControlLabel<T>( | |||
|  |             this VisualElement element, | |||
|  |             string name, PlasticLocalization.Name fieldName)  where T : VisualElement | |||
|  |         { | |||
|  |             dynamic control = element.Query<T>(name).First(); | |||
|  |             control.label = PlasticLocalization.GetString(fieldName); | |||
|  |         } | |||
|  |     } | |||
|  | } |