private void AddDynamicMenu(AddDynamicMenuMessage args) { var parent = this.FindDynamicMenuEntry(args.DynamicMenu); if (parent == null) { throw new Exception($"{args} is not a registered dynamic menu."); } if (args.IsItem) { var valueDictionaryBinding = new ValueDictionaryBinding(args.Key, args.DynamicMenu.ValueStorage); var type = valueDictionaryBinding.ValueType; var view = this.viewRepository.GetView(type); var menuItemEntry = new MenuItemEntry(args.Name, args.TextureKey, view, this.context.Renderer, this.MenuConfig, valueDictionaryBinding); parent.AddChild(menuItemEntry); this.positionDirty = this.sizeDirty = true; } else { var menuEntry = new MenuEntry(args.Name, args.TextureKey, this.viewRepository.MenuView.Value, this.context.Renderer, this.MenuConfig, args.Instance); parent.AddChild(menuEntry); this.positionDirty = this.sizeDirty = true; } }
private void LoadItem(MenuItemEntry item) { // set default value by attribute var defaultValue = item.ValueBinding.GetCustomAttribute <DefaultValueAttribute>(); if (defaultValue != null) { item.Value = defaultValue.Value; item.AssignDefaultValue(); } var entry = item.LoadToken?[item.ValueBinding.Name]; if (entry != null) { if (item.Value is ILoadable loadable) { var loaded = this.menuSerializer.ToObject(entry, item.ValueBinding.ValueType); loadable.Load(loaded); } else { item.Value = this.menuSerializer.ToObject(entry, item.ValueBinding.ValueType); } } }
private void VisitItem(MenuEntry parent, object instance, MenuEntry rootMenu) { var type = instance.GetType(); var propertyInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var propertyInfo in propertyInfos.OrderBy(x => this.Order(propertyInfos, x)).ToArray()) { var menuItemAttribute = propertyInfo.GetCustomAttribute <ItemAttribute>(); if (menuItemAttribute == null) { continue; } var propertyValue = propertyInfo.GetValue(instance); if (propertyValue == null) { throw new NullReferenceException($"{type.FullName} {propertyInfo.Name}"); } var menuItemName = menuItemAttribute.Name; if (string.IsNullOrEmpty(menuItemName)) { menuItemName = propertyInfo.Name; } this.context.Container.BuildUp(propertyValue); var textureAttribute = propertyInfo.GetCustomAttribute <TextureAttribute>(); textureAttribute?.Load(this.context.Renderer); var view = this.viewRepository.GetView(propertyInfo.PropertyType); MenuItemEntry menuItemEntry; if (propertyInfo.GetCustomAttribute <PermaShowAttribute>() != null) { var tmp = new PermaMenuItemEntry( menuItemName, textureAttribute?.TextureKey, view, this.context.Renderer, this.MenuConfig, new ValuePropertyBinding(instance, propertyInfo)); tmp.RootMenuName = rootMenu.Name; this.permaItemEntries.Add(tmp); menuItemEntry = tmp; } else { menuItemEntry = new MenuItemEntry( menuItemName, textureAttribute?.TextureKey, view, this.context.Renderer, this.MenuConfig, new ValuePropertyBinding(instance, propertyInfo)); } var tooltip = propertyInfo.GetCustomAttribute <TooltipAttribute>(); if (tooltip != null) { menuItemEntry.Tooltip = tooltip.Text; } parent.AddChild(menuItemEntry); } }