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