private void ParseExtraControls() { var section = ConfigIni.GetSection("$ExtraControls"); if (section == null) { return; } foreach (var kvp in section.Keys) { if (!kvp.Key.StartsWith("$CC")) { continue; } string[] parts = kvp.Value.Split(':'); if (parts.Length != 2) { throw new ClientConfigurationException("Invalid $ExtraControl specified in " + Name + ": " + kvp.Value); } if (!Children.Any(child => child.Name == parts[0])) { var control = CreateChildControl(this, kvp.Value); control.Name = parts[0]; control.DrawOrder = -Children.Count; ReadINIForControl(control); } } }
/// <summary> /// Reads a second set of attributes for a control's child controls. /// Enables linking controls to controls that are defined after them. /// </summary> private void ReadLateAttributesForControl(XNAControl control) { var section = ConfigIni.GetSection(control.Name); if (section == null) { return; } var children = Children.ToList(); foreach (var child in children) { // This logic should also be enabled for other types in the future, // but it requires changes in XNAUI if (!(child is XNATextBox)) { continue; } var childSection = ConfigIni.GetSection(child.Name); if (childSection == null) { continue; } string nextControl = childSection.GetStringValue("NextControl", null); if (!string.IsNullOrWhiteSpace(nextControl)) { var otherChild = children.Find(c => c.Name == nextControl); if (otherChild != null) { ((XNATextBox)child).NextControl = otherChild; } } string previousControl = childSection.GetStringValue("PreviousControl", null); if (!string.IsNullOrWhiteSpace(previousControl)) { var otherChild = children.Find(c => c.Name == previousControl); if (otherChild != null) { ((XNATextBox)child).PreviousControl = otherChild; } } } }
protected void ReadINIForControl(XNAControl control) { var section = ConfigIni.GetSection(control.Name); if (section == null) { return; } Parser.Instance.SetPrimaryControl(this); foreach (var kvp in section.Keys) { if (kvp.Key.StartsWith("$CC")) { var child = CreateChildControl(control, kvp.Value); ReadINIForControl(child); child.Initialize(); } else if (kvp.Key == "$X") { control.X = Parser.Instance.GetExprValue(kvp.Value, control); } else if (kvp.Key == "$Y") { control.Y = Parser.Instance.GetExprValue(kvp.Value, control); } else if (kvp.Key == "$Width") { control.Width = Parser.Instance.GetExprValue(kvp.Value, control); } else if (kvp.Key == "$Height") { control.Height = Parser.Instance.GetExprValue(kvp.Value, control); } else if (kvp.Key == "$TextAnchor" && control is XNALabel) { // TODO refactor these to be more object-oriented ((XNALabel)control).TextAnchor = (LabelTextAnchorInfo)Enum.Parse(typeof(LabelTextAnchorInfo), kvp.Value); } else if (kvp.Key == "$AnchorPoint" && control is XNALabel) { string[] parts = kvp.Value.Split(','); if (parts.Length != 2) { throw new FormatException("Invalid format for AnchorPoint: " + kvp.Value); } ((XNALabel)control).AnchorPoint = new Vector2(Parser.Instance.GetExprValue(parts[0], control), Parser.Instance.GetExprValue(parts[1], control)); } else if (kvp.Key == "$LeftClickAction") { if (kvp.Value == "Disable") { control.LeftClick += (s, e) => Disable(); } } else { control.ParseAttributeFromINI(ConfigIni, kvp.Key, kvp.Value); } } }