Ejemplo n.º 1
0
    public void Run()
    {
        RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;

        var visualizer = new MenuViewMessageInterpreter();
        var state      = new MenuViewMessage {
            Items =
            {
                MenuItemViewMessage.MakeRange("[-1, 1]: 0.5", -1, +1, 0.5, false),
                MenuItemViewMessage.MakeRange("[-1, 1]: -1",  -1, +1,  -1, true),
                MenuItemViewMessage.MakeRange("[-1, 1]: 0",   -1, +1,   0, false),
                MenuItemViewMessage.MakeRange("[-1, 1]: +1",  -1, +1,  +1, false),
                MenuItemViewMessage.MakeRange("[0, 1]: 0.5",   0,  1, 0.5, false),
                MenuItemViewMessage.MakeRange("[0, 1]: 0",     0,  1,   0, false),
                MenuItemViewMessage.MakeRange("[0, 1]: 1",     0,  1,   1, false)
            }
        };
        var visual = visualizer.Interpret(state);

        var window = new Window {
            Background = Brushes.Pink,
            Content    = visual
        };

        window.Show();

        Dispatcher.Run();
    }
    public MenuViewMessageInterpreter()
    {
        var itemForMeasuring = CreateItem(MenuItemViewMessage.MakeSubLevelButton("foo"));

        itemForMeasuring.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
        itemHeight = itemForMeasuring.DesiredSize.Height;
    }
    public MenuViewMessage AuthorMessage(MenuModel model)
    {
        List <MenuItemViewMessage> itemMessages = new List <MenuItemViewMessage>();

        for (int i = 0; i < model.Items.Count; ++i)
        {
            var  item      = model.Items[i];
            bool selected  = i == model.SelectedItemIdx;
            bool isEditing = selected && model.IsEditing;

            MenuItemViewMessage itemMessage;
            switch (item)
            {
            case UpMenuItem upMenuItem:
                itemMessage = MenuItemViewMessage.MakeUpLevelButton(upMenuItem.Label);
                break;

            case SubLevelMenuItem subLevelItem:
                itemMessage = MenuItemViewMessage.MakeSubLevelButton(subLevelItem.Label);
                break;

            case IRangeMenuItem rangeItem:
                itemMessage = MenuItemViewMessage.MakeRange(rangeItem.Label, rangeItem.Min, rangeItem.Max, rangeItem.Value, isEditing);
                break;

            case IToggleMenuItem toggleMenuItem:
                itemMessage = MenuItemViewMessage.MakeToggle(toggleMenuItem.Label, toggleMenuItem.IsSet);
                break;

            case ActionMenuItem actionMenuItem:
                itemMessage = MenuItemViewMessage.MakeActionButton(actionMenuItem.Label, actionMenuItem.RequiresMoreInformation);
                break;

            default:
                throw new InvalidOperationException();
            }

            if (selected)
            {
                itemMessage.Active = true;
            }
            itemMessages.Add(itemMessage);
        }

        return(new MenuViewMessage {
            Items = itemMessages,
            Position = model.ScrollPosition
        });
    }
    private FrameworkElement CreateItem(MenuItemViewMessage message)
    {
        SolidColorBrush backgroundBrush;

        if (message.Type == MenuItemViewType.UpLevelButton)
        {
            backgroundBrush = UpLevelButtonBackground;
        }
        else if (message.Type == MenuItemViewType.SubLevelButton)
        {
            backgroundBrush = SubLevelButtonBackground;
        }
        else if (message.Type == MenuItemViewType.Range)
        {
            if (message.IsEditing)
            {
                backgroundBrush = RangeEditingBackground;
            }
            else
            {
                backgroundBrush = RangeBackground;
            }
        }
        else if (message.Type == MenuItemViewType.Toggle)
        {
            if (message.IsSet)
            {
                backgroundBrush = ToggleSetBackground;
            }
            else
            {
                backgroundBrush = DefaultBackground;
            }
        }
        else
        {
            backgroundBrush = DefaultBackground;
        }

        var textOverlayGrid = new Grid {
            Background = backgroundBrush
        };

        if (message.Type == MenuItemViewType.Range)
        {
            double min   = message.Min;
            double max   = message.Max;
            double value = MathExtensions.Clamp(message.Value, min, max);

            double centerLeft, centerRight;
            if (value < 0)
            {
                centerLeft  = value;
                centerRight = Math.Min(0, max);
            }
            else
            {
                centerLeft  = Math.Max(0, min);
                centerRight = value;
            }

            var leftRect   = new Rectangle {
            };
            var middleRect = new Rectangle {
                Fill = message.IsEditing ? RangeEditingForeground : RangeForeground
            };
            var rightRect = new Rectangle {
            };

            var rectGrid = new Grid {
                Children = { leftRect, middleRect, rightRect },
            };
            rectGrid.ColumnDefinitions.Add(new ColumnDefinition {
                Width = new GridLength(centerLeft - min, GridUnitType.Star)
            });
            rectGrid.ColumnDefinitions.Add(new ColumnDefinition {
                Width = new GridLength(centerRight - centerLeft + (max - min) * 0.002, GridUnitType.Star)
            });
            rectGrid.ColumnDefinitions.Add(new ColumnDefinition {
                Width = new GridLength(max - centerRight, GridUnitType.Star)
            });
            Grid.SetColumn(leftRect, 0);
            Grid.SetColumn(middleRect, 1);
            Grid.SetColumn(rightRect, 2);

            textOverlayGrid.Children.Add(rectGrid);
        }

        var labelTextBlock = new TextBlock {
            Foreground          = Brushes.White,
            Text                = message.Label,
            FontSize            = 48,
            FontWeight          = FontWeights.SemiBold,
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment   = VerticalAlignment.Center
        };

        textOverlayGrid.Children.Add(labelTextBlock);

        var border = new Border {
            Child           = textOverlayGrid,
            BorderThickness = new Thickness(5),
            CornerRadius    = new CornerRadius(5),
            BorderBrush     = message.Active ? (message.IsEditing ? EditingBorderStroke : ActiveBorderStroke) : DefaultBorderStroke,
            Margin          = new Thickness(2)
        };

        return(border);
    }