private static void CreateViewItems(ConfigurationProvider <RealTimeConfig> configProvider, IViewItemFactory itemFactory, ICollection <IViewItem> viewItems) { var properties = configProvider.Configuration.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) .Select(p => new { Property = p, Attribute = GetCustomItemAttribute <ConfigItemAttribute>(p) }) .Where(v => v.Attribute != null); foreach (var tab in properties.GroupBy(p => p.Attribute.TabId).OrderBy(p => p.Key)) { IContainerViewItem tabItem = itemFactory.CreateTabItem(tab.Key); viewItems.Add(tabItem); foreach (var group in tab.GroupBy(p => p.Attribute.GroupId).OrderBy(p => p.Key)) { IContainerViewItem containerItem; if (string.IsNullOrEmpty(group.Key)) { containerItem = tabItem; } else { containerItem = itemFactory.CreateGroup(tabItem, group.Key); viewItems.Add(containerItem); } foreach (var item in group.OrderBy(i => i.Attribute.Order)) { IViewItem viewItem = CreateViewItem(containerItem, item.Property, configProvider, itemFactory); if (viewItem != null) { viewItems.Add(viewItem); } } } } }
public static ConfigUI Create(object config, IViewItemFactory itemFactory) { if (config == null) { throw new ArgumentNullException(nameof(config)); } if (itemFactory == null) { throw new ArgumentNullException(nameof(itemFactory)); } var properties = config.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) .Select(p => new { Property = p, Attribute = GetCustomItemAttribute <ConfigItemAttribute>(p) }) .Where(v => v.Attribute != null); var viewItems = new List <IViewItem>(); foreach (var group in properties.GroupBy(p => p.Attribute.GroupId).OrderBy(p => p.Key)) { IContainerViewItem groupItem = itemFactory.CreateGroup(group.Key); viewItems.Add(groupItem); foreach (var item in group.OrderBy(i => i.Attribute.Order)) { IViewItem viewItem = CreateViewItem(groupItem, item.Property, config, itemFactory); if (viewItem != null) { viewItems.Add(viewItem); } } } return(new ConfigUI(viewItems)); }
/// <summary> /// Creates the mod's configuration page using the specified object as data source. /// </summary> /// <param name="config">The configuration object to use as data source.</param> /// <param name="itemFactory">The view item factory to use for creating the UI elements.</param> /// <returns>A configured instance of the <see cref="ConfigUI"/> class.</returns> /// <exception cref="ArgumentNullException">Thrown when any argument is null.</exception> public static ConfigUI Create(RealTimeConfig config, IViewItemFactory itemFactory) { if (config == null) { throw new ArgumentNullException(nameof(config)); } if (itemFactory == null) { throw new ArgumentNullException(nameof(itemFactory)); } var properties = config.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) .Select(p => new { Property = p, Attribute = GetCustomItemAttribute <ConfigItemAttribute>(p) }) .Where(v => v.Attribute != null); var viewItems = new List <IViewItem>(); foreach (var tab in properties.GroupBy(p => p.Attribute.TabId).OrderBy(p => p.Key)) { IContainerViewItem tabItem = itemFactory.CreateTabItem(tab.Key); viewItems.Add(tabItem); foreach (var group in tab.GroupBy(p => p.Attribute.GroupId).OrderBy(p => p.Key)) { IContainerViewItem containerItem; if (string.IsNullOrEmpty(group.Key)) { containerItem = tabItem; } else { containerItem = itemFactory.CreateGroup(tabItem, group.Key); viewItems.Add(containerItem); } foreach (var item in group.OrderBy(i => i.Attribute.Order)) { IViewItem viewItem = CreateViewItem(containerItem, item.Property, config, itemFactory); if (viewItem != null) { viewItems.Add(viewItem); } } } } var result = new ConfigUI(config, viewItems); IContainerViewItem toolsTab = itemFactory.CreateTabItem(ToolsId); viewItems.Add(toolsTab); IViewItem resetButton = itemFactory.CreateButton(toolsTab, ResetToDefaultsId, result.ResetToDefaults); viewItems.Add(resetButton); return(result); }