Exemple #1
0
        private Control BuildSettingControl(SettingNode setting)
        {
            Control control = null;

            string editorName = setting.Editor;

            if (string.IsNullOrEmpty(editorName))
            {
                var settingType = GetSettingValue <object>(setting.Name).GetType();
                editorName = DefaultEditors.ContainsKey(settingType) ? DefaultEditors[settingType] : null;
            }

            if (editorName == null)
            {
                throw new DynamicSettingsException($"Setting `{setting.Name}` has undefined editor. Make sure you have specified `editor` attribute in settings layout.");
            }

            if (EditorBuilders.ContainsKey(editorName))
            {
                control = EditorBuilders[editorName].Invoke(setting);
            }
            else
            {
                throw new DynamicSettingsException($"Setting `{setting.Name}` has unknown editor `{editorName}`. Make sure you have added the editor builder function with key `{editorName}` to `EditorBuilders` dictionary.");
            }

            control.Name = setting.Name;

            editors.Add(control);
            return(control);
        }
Exemple #2
0
        public DynamicSettingsControl()
        {
            InitializeComponent();
            evaluator = new DataTable();

            DefaultEditors.Add(typeof(bool), "checkbox");
            DefaultEditors.Add(typeof(string), "textbox");
            DefaultEditors.Add(typeof(Color), "colorpicker");
            DefaultEditors.Add(typeof(Font), "fontpicker");

            #region Default Control Builders

            // Checkbox Builder
            EditorBuilders.Add("checkbox", setting =>
            {
                var checkBox = new CheckBox()
                {
                    Text     = setting.Title,
                    Checked  = GetSettingValue <bool>(setting.Name),
                    AutoSize = true,
                    UseVisualStyleBackColor = true
                };
                checkBox.CheckedChanged += (s, e) => SetSettingValue(setting.Name, checkBox.Checked);
                return(checkBox);
            });

            // Radio Group Builder
            EditorBuilders.Add("radio", setting =>
            {
                var group = new GroupBox()
                {
                    AutoSize = true,
                    Text     = setting.Title,
                    Dock     = DockStyle.Top
                };

                FlowLayoutPanel panel = new FlowLayoutPanel()
                {
                    AutoSize      = true,
                    FlowDirection = FlowDirection.TopDown,
                    Dock          = DockStyle.Fill
                };

                object settingValue = GetSettingValue <object>(setting.Name);
                Array values        = Enum.GetValues(settingValue.GetType());
                foreach (var value in values)
                {
                    RadioButton radio = new RadioButton()
                    {
                        Name     = $"{setting.Name}.{value}",
                        AutoSize = true,
                        Checked  = value.Equals(settingValue),
                        Text     = value.GetType()
                                   .GetMember(value.ToString())
                                   .FirstOrDefault()
                                   ?.GetCustomAttribute <DescriptionAttribute>()
                                   ?.Description
                    };
                    radio.CheckedChanged += (s, e) => { if (radio.Checked)
                                                        {
                                                            SetSettingValue(setting.Name, value);
                                                        }
                    };

                    panel.Controls.Add(radio);
                }

                group.Controls.Add(panel);

                return(group);
            });

            // Textbox Builder
            EditorBuilders.Add("textbox", setting =>
            {
                TextPicker picker = new TextPicker()
                {
                    Title         = setting.Title,
                    SelectedValue = GetSettingValue <string>(setting.Name),
                    Dock          = DockStyle.Fill
                };
                picker.SelectedValueChanged += (s, e) => SetSettingValue(setting.Name, picker.SelectedValue);

                return(picker);
            });

            // Color Picker Builder
            EditorBuilders.Add("colorpicker", setting =>
            {
                ColorPicker picker = new ColorPicker()
                {
                    Text          = setting.Title,
                    SelectedValue = GetSettingValue <Color>(setting.Name),
                    AutoSize      = true
                };
                picker.SelectedValueChanged += (s, e) => SetSettingValue(setting.Name, picker.SelectedValue);

                return(picker);
            });

            // Font Picker Builder
            EditorBuilders.Add("fontpicker", setting =>
            {
                Font font         = GetSettingValue <Font>(setting.Name);
                FontPicker picker = new FontPicker()
                {
                    Title         = setting.Title,
                    SelectedValue = font,
                    Dock          = DockStyle.Fill
                };

                picker.SelectedValueChanged += (s, e) => SetSettingValue(setting.Name, picker.SelectedValue);

                return(picker);
            });

            // Directory Picker Builder
            EditorBuilders.Add("directorypicker", setting =>
            {
                string directory       = GetSettingValue <string>(setting.Name);
                DirectoryPicker picker = new DirectoryPicker()
                {
                    Title         = setting.Title,
                    SelectedValue = directory,
                    Dock          = DockStyle.Fill
                };

                picker.SelectedValueChanged += (s, e) => SetSettingValue(setting.Name, picker.SelectedValue);

                return(picker);
            });

            #endregion Default Control Builders
        }