private void AddTranslation(VBoxContainer keys, GridContainer values, VBoxContainer englishContainer, string key, string english, Dictionary <string, string> locales) { var label = new Label() { Text = key, RectMinSize = new Vector2(0, 32) }; keys.AddChild(label); var lineEdit = new LineEdit() { Text = english, Editable = false }; lineEdit.AddFontOverride("font", UI.InternationalFont); englishContainer.AddChild(lineEdit); foreach (var lang in Languages.GetList()) { string code = Languages.LanguageToCode(lang); if (!locales.ContainsKey(code)) { locales.Add(code, ""); } lineEdit = new LineEdit() { Text = locales[code] }; lineEdit.AddFontOverride("font", UI.InternationalFont); values.AddChild(lineEdit); var lambda = new LambdaWrapper <string>((str) => locales[code] = str); lambda.SelfConnect(lineEdit, "text_changed"); } }
private void DoEditorConnections <T>(Node editor, T obj) { foreach (var prop in obj.GetType().GetProperties()) { if (Attribute.IsDefined(prop, typeof(DoNotAutoConnectAttribute))) { continue; } if (prop.PropertyType == typeof(string)) { string path = prop.Name + "/LineEdit"; var lineEdit = editor.GetNode <LineEdit>(path); lineEdit.Text = (string)prop.GetValue(obj); var lambda = new LambdaWrapper <string>((str) => prop.SetValue(obj, str)); if (prop.Name == "Name") { lambda = new LambdaWrapper <string>((str) => { activeEntry.SetText(0, str); prop.SetValue(obj, str); }); } lambda.SelfConnect(lineEdit, "text_changed"); } else if (prop.PropertyType == typeof(int)) { string path = prop.Name + "/SpinBox"; var intEdit = editor.GetNode <SpinBox>(path); intEdit.Value = (int)prop.GetValue(obj); var lambda = new LambdaWrapper <float>((value) => prop.SetValue(obj, (int)value)); lambda.SelfConnect(intEdit, "value_changed"); } else if (prop.PropertyType == typeof(double)) { string path = prop.Name + "/SpinBox"; var doubleEdit = editor.GetNode <SpinBox>(path); doubleEdit.Value = (double)prop.GetValue(obj) * (editor.HasNode(prop.Name + "/PercentLabel") ? 100 : 1); var lambda = new LambdaWrapper <float>((value) => prop.SetValue(obj, ((double)value) / (editor.HasNode(prop.Name + "/PercentLabel") ? 100.0 : 1.0))); lambda.SelfConnect(doubleEdit, "value_changed"); } else if (prop.PropertyType == typeof(bool)) { string path = prop.Name + "/CheckBox"; var checkBox = editor.GetNode <CheckBox>(path); checkBox.Pressed = (bool)prop.GetValue(obj); var lambda = new LambdaWrapper <bool>((value) => prop.SetValue(obj, value)); lambda.SelfConnect(checkBox, "toggled"); } else if (prop.PropertyType.IsEnum) { string path = prop.Name + "/OptionButton"; var optionButton = editor.GetNode <OptionButton>(path); int selInd = 0; for (int i = 0; i < optionButton.GetItemCount(); ++i) { if (optionButton.GetItemText(i) == prop.GetValue(obj).ToString()) { selInd = i; break; } } optionButton.Selected = selInd; var lambda = new LambdaWrapper <int>((idx) => { var str = optionButton.GetItemText(idx); prop.SetValue(obj, Enum.Parse(prop.PropertyType, str)); }); lambda.SelfConnect(optionButton, "item_selected"); } else if (prop.PropertyType == typeof(Color)) { string path = prop.Name + "/ColorPickerButton"; var colorPicker = editor.GetNode <ColorPickerButton>(path); colorPicker.Color = (Color)prop.GetValue(obj); var lambda = new LambdaWrapper <Color>((color) => prop.SetValue(obj, color)); lambda.SelfConnect(colorPicker, "color_changed"); } else if (prop.PropertyType == typeof(List <object>)) { string path = prop.Name + "/StringListEditor"; var stringsEditor = editor.GetNode <StringListEditor>(path); var strings = (List <object>)prop.GetValue(obj); foreach (var entry in strings) { stringsEditor.AddString((string)entry); } var lambdaAdd = new LambdaWrapper(() => strings.Add("")); var lambdaDelete = new LambdaWrapper <int>((ind) => strings.RemoveAt(ind)); var lambdaEdit = new LambdaWrapper <int, string>((ind, str) => strings[ind] = str); lambdaAdd.SelfConnect(stringsEditor, nameof(StringListEditor.entry_added)); lambdaDelete.SelfConnect(stringsEditor, nameof(StringListEditor.entry_deleted)); lambdaEdit.SelfConnect(stringsEditor, nameof(StringListEditor.entry_changed)); } else if (prop.PropertyType == typeof(List <string>)) { string path = prop.Name + "/StringListEditor"; var stringsEditor = editor.GetNode <StringListEditor>(path); var strings = (List <string>)prop.GetValue(obj); foreach (var entry in strings) { stringsEditor.AddString(entry); } var lambdaAdd = new LambdaWrapper(() => strings.Add("")); var lambdaDelete = new LambdaWrapper <int>((ind) => strings.RemoveAt(ind)); var lambdaEdit = new LambdaWrapper <int, string>((ind, str) => strings[ind] = str); lambdaAdd.SelfConnect(stringsEditor, nameof(StringListEditor.entry_added)); lambdaDelete.SelfConnect(stringsEditor, nameof(StringListEditor.entry_deleted)); lambdaEdit.SelfConnect(stringsEditor, nameof(StringListEditor.entry_changed)); } else if (prop.PropertyType == typeof(List <Color>)) { string path = prop.Name + "/ColorListEditor"; var colorsEditor = editor.GetNode <ColorListEditor>(path); var colors = (List <Color>)prop.GetValue(obj); foreach (var entry in colors) { colorsEditor.AddColor(entry); } var lambdaAdd = new LambdaWrapper(() => colors.Add(Colors.Black)); var lambdaDelete = new LambdaWrapper <int>((ind) => colors.RemoveAt(ind)); var lambdaEdit = new LambdaWrapper <int, Color>((ind, col) => colors[ind] = col); lambdaAdd.SelfConnect(colorsEditor, nameof(StringListEditor.entry_added)); lambdaDelete.SelfConnect(colorsEditor, nameof(StringListEditor.entry_deleted)); lambdaEdit.SelfConnect(colorsEditor, nameof(StringListEditor.entry_changed)); } else if (prop.PropertyType == typeof(ImageResourceReference)) { string path = prop.Name + "/SubImageEditor"; var imageEditor = editor.GetNode <SubImageEditor>(path); imageEditor.SetValues((ImageResourceReference)prop.GetValue(obj)); var lambda = new LambdaWrapper <SubImageEditor>((ie) => prop.SetValue(obj, ie.GetImageRef())); lambda.SelfConnect(imageEditor, nameof(SubImageEditor.image_changed)); } } }