/// <summary> /// Clones an already existing <see cref="CssValue"/> /// </summary> internal CssValue(CssValue sv) { type = sv.Type; value = sv.value; unit = sv.Unit; flags = sv.Flags; }
public bool Has_Flags(ECssValueFlags Flags) => 0 != (flags & Flags);
private static ECssValueFlags Get_Inherent_Value_Type_Flags(ECssValueTypes Type, ECssUnit Unit, object Value) { ECssValueFlags Flags = ECssValueFlags.None; /*if (Value is Array) * { * Flags |= ECssValueFlags.Collection; * }*/ switch (Type) { // NOTE: Auto values get calculated in vastly different ways, sometimes this doesn't even indicate that a value depends on the value of other properties, //so it should NOT get the 'Depends' flag case ECssValueTypes.INHERIT: // Inherited values function like redirects which compute to the current value of the matching property for the owning element's parent case ECssValueTypes.PERCENT: // Percentage values represent a percentage of another property's value { Flags |= ECssValueFlags.Depends; break; } case ECssValueTypes.NULL: case ECssValueTypes.NONE: case ECssValueTypes.INITIAL: case ECssValueTypes.INTEGER: case ECssValueTypes.NUMBER: case ECssValueTypes.STRING: case ECssValueTypes.KEYWORD: case ECssValueTypes.COLOR: case ECssValueTypes.IMAGE: case ECssValueTypes.POSITION: // The position has already been resolved here. case ECssValueTypes.FUNCTION: // The function args have already been resolved here. { Flags |= ECssValueFlags.Absolute; break; } case ECssValueTypes.UNSET: case ECssValueTypes.AUTO: case ECssValueTypes.DIMENSION: case ECssValueTypes.RATIO: case ECssValueTypes.RESOLUTION: { /* XXX: * These values when used on properties CAN be dependant but arent always so idk maybe its best to leave them as absolute? * Maybe we can come up with some sort of intermediate state that causes them to resolve their flag to absolute/dependent AFTER they get assigned to a property? */ Flags |= ECssValueFlags.Absolute; break; } case ECssValueTypes.COLLECTION: // A collections flags are the combined flags of all it's sub-values { if (Value is Array array) { // Multi object foreach (object o in array) { if (o is CssValue cssValue) { Flags |= Get_Inherent_Value_Type_Flags(cssValue.Type, cssValue.Unit, cssValue.value); } else { throw new CssException($"All {nameof(CssValue)} collection members must be {nameof(CssValue)}s"); } } return(Flags); } else if (Value is CssValue cssValue) { // Single object Flags |= Get_Inherent_Value_Type_Flags(cssValue.Type, cssValue.Unit, cssValue.value); } else { throw new CssException($"All {nameof(CssValue)} collection members must be {nameof(CssValue)}s"); } break; } default: { throw new NotImplementedException($"Flag handling for the '{Enum.GetName(typeof(ECssValueTypes), Type)}' css-value type has not been implemented!"); } } return(Flags); }
internal CssValue(ECssValueTypes type, object value, ECssValueFlags flags) : this(type) { this.value = value; this.flags |= flags; this.value = value; }
private CssValue(ECssValueTypes type) { this.type = type; flags |= Get_Inherent_Value_Type_Flags(type, unit, value); }