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); }
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 }