private Action <object, object> MakeFieldCloner(Meta.Item yi) { if (yi.SetValue != null) { var cloner = cl.GetCloner(yi.Type); if (yi.SerializeCond != null) { return (dst, src) => { var v = yi.GetValue(src); if (yi.SerializeCond(src, v)) { yi.SetValue(dst, cloner(v)); } } } ; else { return((dst, src) => yi.SetValue(dst, cloner(yi.GetValue(src)))); } } else { var merger = cl.GetMerger(yi.Type); if (yi.SerializeCond != null) { return (dst, src) => { var v = yi.GetValue(src); if (yi.SerializeCond(src, v)) { merger(yi.GetValue(dst), v); } } } ; else { return((dst, src) => merger(yi.GetValue(dst), yi.GetValue(src))); } } }
private Action <object> MakeReadOrMergeFunc(Meta.Item yi) { if (yi.SetValue != null) { var rf = ReadValueFunc(yi.Type); return(obj => yi.SetValue(obj, rf())); } else { var mf = MergeValueFunc(yi.Type); return(obj => mf(yi.GetValue(obj))); } }
private void CreateOverridesWidgets(CookingRulesCollection crc, string key, Target target, Meta.Item yi, CookingRules rules, Widget overridesWidget) { Widget innerContainer; var sourceFilenameText = string.IsNullOrEmpty(rules.SourceFilename) ? "Default" : rules.SourceFilename.Substring(The.Workspace.AssetsDirectory.Length); var targetName = target == null ? "" : $" ({target.Name})"; var container = new Widget { Padding = new Thickness { Right = 30 }, Nodes = { (innerContainer = new Widget { Layout = new HBoxLayout(), }), new ThemedSimpleText(sourceFilenameText + targetName) { FontHeight = 16, ForceUncutText = false, OverflowMode = TextOverflowMode.Ellipsis, HAlignment = HAlignment.Right, VAlignment = VAlignment.Center, MinSize = new Vector2(100, RowHeight), MaxSize = new Vector2(500, RowHeight) }, (new ToolbarButton { Texture = IconPool.GetTexture("Filesystem.ArrowRight"), Padding = Thickness.Zero, Size = RowHeight * Vector2.One, MinMaxSize = RowHeight * Vector2.One, Clicked = () => navigateAndSelect(rules.SourceFilename), }) }, Layout = new HBoxLayout(), }; container.CompoundPostPresenter.Add(new DelegatePresenter <Widget>((w) => { var topmostOverride = crc[key]; while ( topmostOverride.Parent != null && !(topmostOverride.CommonRules.FieldOverrides.Contains(yi) || RulesForActiveTarget(topmostOverride).FieldOverrides.Contains(yi)) ) { topmostOverride = topmostOverride.Parent; } w.PrepareRendererState(); if (target != activeTarget || rules != topmostOverride) { Renderer.DrawLine(10.0f - 30.0f, w.Height * 0.6f, w.Width - 10.0f, w.Height * 0.6f, Color4.Black.Transparentify(0.5f), 1.0f); } else { Renderer.DrawRect(Vector2.Right * -20.0f, w.Size, Color4.Green.Lighten(0.5f).Transparentify(0.5f)); } })); container.Components.Add(new PropertyOverrideComponent { Rules = rules, YuzuItem = yi, }); overridesWidget.Nodes.Add(container); var targetRuels = RulesForTarget(rules, target); var editorParams = new PropertyEditorParams(innerContainer, targetRuels, yi.Name) { ShowLabel = false, PropertySetter = (owner, name, value) => { yi.SetValue(owner, value); targetRuels.Override(name); rules.DeduceEffectiveRules(target); rules.Save(); }, NumericEditBoxFactory = () => { var r = new ThemedNumericEditBox(); r.MinMaxHeight = r.Height = RowHeight; r.TextWidget.VAlignment = VAlignment.Center; r.TextWidget.Padding.Top = r.TextWidget.Padding.Bottom = 0.0f; return(r); }, DropDownListFactory = () => { var r = new ThemedDropDownList(); r.MinMaxHeight = r.Height = RowHeight; return(r); }, EditBoxFactory = () => { var r = new ThemedEditBox(); r.MinMaxHeight = r.Height = RowHeight; r.TextWidget.Padding.Top = r.TextWidget.Padding.Bottom = 0.0f; return(r); }, }; CreatePropertyEditorForType(yi, editorParams); }