Beispiel #1
0
        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");
            }
        }
Beispiel #2
0
        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));
                }
            }
        }