public InlineStyleAccess(VisualElement ve) { this.ve = ve; if (ve.computedStyle.isShared) { var inlineStyle = ComputedStyle.Create(false); inlineStyle.CopyShared(ve.m_SharedStyle); ve.m_Style = inlineStyle; } }
void ProcessMatchedRules(VisualElement element, List <SelectorMatchRecord> matchingSelectors) { matchingSelectors.Sort((a, b) => SelectorMatchRecord.Compare(a, b)); Int64 matchingRulesHash = element.fullTypeName.GetHashCode(); // Let current DPI contribute to the hash so cache is invalidated when this changes matchingRulesHash = (matchingRulesHash * 397) ^ currentPixelsPerPoint.GetHashCode(); int oldVariablesHash = m_StyleMatchingContext.variableContext.GetVariableHash(); int customPropertiesCount = 0; foreach (var record in matchingSelectors) { StyleRule rule = record.complexSelector.rule; int specificity = record.complexSelector.specificity; matchingRulesHash = (matchingRulesHash * 397) ^ rule.GetHashCode(); matchingRulesHash = (matchingRulesHash * 397) ^ specificity; if (rule.customPropertiesCount > 0) { customPropertiesCount += rule.customPropertiesCount; ProcessMatchedVariables(record.sheet, rule); } } var parent = element.hierarchy.parent; int inheritedStyleHash = parent != null ? parent.inheritedStylesHash : 0; matchingRulesHash = (matchingRulesHash * 397) ^ inheritedStyleHash; int variablesHash = oldVariablesHash; if (customPropertiesCount > 0) { // Element defines new variables, add the parents variables at the beginning of the processing context m_ProcessVarContext.InsertRange(0, m_StyleMatchingContext.variableContext); variablesHash = m_ProcessVarContext.GetVariableHash(); } matchingRulesHash = (matchingRulesHash * 397) ^ variablesHash; if (oldVariablesHash != variablesHash) { StyleVariableContext ctx; if (!StyleCache.TryGetValue(variablesHash, out ctx)) { ctx = new StyleVariableContext(m_ProcessVarContext); StyleCache.SetValue(variablesHash, ctx); } m_StyleMatchingContext.variableContext = ctx; } element.variableContext = m_StyleMatchingContext.variableContext; m_ProcessVarContext.Clear(); ComputedStyle resolvedStyles; if (StyleCache.TryGetValue(matchingRulesHash, out resolvedStyles)) { element.SetSharedStyles(resolvedStyles); } else { var parentStyle = parent?.computedStyle; resolvedStyles = ComputedStyle.Create(parentStyle, true); float dpiScaling = element.scaledPixelsPerPoint; foreach (var record in matchingSelectors) { m_StylePropertyReader.SetContext(record.sheet, record.complexSelector, m_StyleMatchingContext.variableContext, dpiScaling); resolvedStyles.ApplyProperties(m_StylePropertyReader, parentStyle); } resolvedStyles.FinalizeApply(parentStyle); StyleCache.SetValue(matchingRulesHash, resolvedStyles); element.SetSharedStyles(resolvedStyles); } }
private VisualElement CloneSetupRecursively(VisualElementAsset root, Dictionary <int, List <VisualElementAsset> > idToChildren, CreationContext context) { VisualElement ve = Create(root, context); // context.target is the created templateContainer if (root.id == context.visualTreeAsset.contentContainerId) { if (context.target is TemplateContainer) { ((TemplateContainer)context.target).SetContentContainer(ve); } else { Debug.LogError( "Trying to clone a VisualTreeAsset with a custom content container into a element which is not a template container"); } } // if the current element had a slot-name attribute, put it in the resulting slot mapping string slotName; if (context.slotInsertionPoints != null && TryGetSlotInsertionPoint(root.id, out slotName)) { context.slotInsertionPoints.Add(slotName, ve); } if (root.ruleIndex != -1) { if (inlineSheet == null) { Debug.LogWarning("VisualElementAsset has a RuleIndex but no inlineStyleSheet"); } else { StyleRule r = inlineSheet.rules[root.ruleIndex]; var stylesData = ComputedStyle.Create(false); ve.SetInlineRule(inlineSheet, r); } } var templateAsset = root as TemplateAsset; List <VisualElementAsset> children; if (idToChildren.TryGetValue(root.id, out children)) { children.Sort(CompareForOrder); foreach (VisualElementAsset childVea in children) { // this will fill the slotInsertionPoints mapping VisualElement childVe = CloneSetupRecursively(childVea, idToChildren, context); if (childVe == null) { continue; } // if the parent is not a template asset, just add the child to whatever hierarchy we currently have // if ve is a scrollView (with contentViewport as contentContainer), this will go to the right place if (templateAsset == null) { ve.Add(childVe); continue; } int index = templateAsset.slotUsages == null ? -1 : templateAsset.slotUsages.FindIndex(u => u.assetId == childVea.id); if (index != -1) { VisualElement parentSlot; string key = templateAsset.slotUsages[index].slotName; Assert.IsFalse(String.IsNullOrEmpty(key), "a lost name should not be null or empty, this probably points to an importer or serialization bug"); if (context.slotInsertionPoints == null || !context.slotInsertionPoints.TryGetValue(key, out parentSlot)) { Debug.LogErrorFormat("Slot '{0}' was not found. Existing slots: {1}", key, context.slotInsertionPoints == null ? String.Empty : String.Join(", ", System.Linq.Enumerable.ToArray(context.slotInsertionPoints.Keys))); ve.Add(childVe); } else { parentSlot.Add(childVe); } } else { ve.Add(childVe); } } } if (templateAsset != null && context.slotInsertionPoints != null) { context.slotInsertionPoints.Clear(); } return(ve); }