示例#1
0
    public LicenseAgreementPage()
        : base("Cancel")
    {
        string eulaText = StaticData.Instance.ReadAllText("MatterControl EULA.txt").Replace("\r\n", "\n");

        var scrollable = new ScrollableWidget(true);

        scrollable.AnchorAll();
        scrollable.ScrollArea.HAnchor = HAnchor.ParentLeftRight;
        contentRow.AddChild(scrollable);

        var textBox = new WrappedTextWidget(eulaText, 200, textColor: ActiveTheme.Instance.PrimaryTextColor);

        scrollable.AddChild(textBox);

        var acceptButton = textImageButtonFactory.Generate("Accept".Localize());

        acceptButton.Click += (s, e) =>
        {
            UserSettings.Instance.set("SoftwareLicenseAccepted", "true");
            UiThread.RunOnIdle(WizardWindow.Close);
        };

        acceptButton.Visible = true;
        cancelButton.Visible = true;

        cancelButton.Click += (s, e) => UiThread.RunOnIdle(WizardWindow.Close);

        //Add buttons to buttonContainer
        footerRow.AddChild(acceptButton);
        footerRow.AddChild(new HorizontalSpacer());
        footerRow.AddChild(cancelButton);

        footerRow.Visible = true;
    }
示例#2
0
        public ExploreItem(FeedItemData item, ThemeConfig theme)
        {
            this.HAnchor = HAnchor.Absolute;
            this.Width   = 400 * GuiWidget.DeviceScale;
            //this.Border = spacing;
            this.Padding = ItemSpacing;
            this.item    = item;

            if (item.icon != null)
            {
                ImageBuffer image = new ImageBuffer(IconSize, IconSize);

                var imageWidget = new ImageWidget(image)
                {
                    Selectable = false,
                    VAnchor    = VAnchor.Top,
                    Margin     = new BorderDouble(right: ItemSpacing)
                };

                imageWidget.Load += (s, e) => ApplicationController.Instance.DownloadToImageAsync(image, item.icon, true, new BlenderPreMultBGRA());
                this.AddChild(imageWidget);
            }
            else if (item.widget_url != null)
            {
                ImageBuffer image = new ImageBuffer(IconSize, IconSize);

                var whiteBackground = new GuiWidget(IconSize, IconSize)
                {
                    // these images expect to be on white so change the background to white
                    BackgroundColor = Color.White,
                    Margin          = new BorderDouble(right: ItemSpacing)
                };
                this.AddChild(whiteBackground);

                var imageWidget = new ImageWidget(image)
                {
                    Selectable = false,
                    VAnchor    = VAnchor.Center,
                };

                imageWidget.Load += (s, e) => ApplicationController.Instance.DownloadToImageAsync(image, item.widget_url, true, new BlenderPreMultBGRA());
                whiteBackground.AddChild(imageWidget);
            }

            var wrappedText = new WrappedTextWidget(item.title, textColor: ActiveTheme.Instance.PrimaryTextColor, pointSize: theme.DefaultFontSize)
            {
                Selectable = false,
                VAnchor    = VAnchor.Center | VAnchor.Fit,
                Margin     = 3
            };

            this.AddChild(wrappedText);
            wrappedText.Load += (s, e) =>
            {
                wrappedText.VAnchor = VAnchor.Top | VAnchor.Fit;
            };

            this.Cursor = Cursors.Hand;
        }
示例#3
0
        public ArticleItem(FeedItemData item, ThemeConfig theme)
        {
            this.HAnchor = HAnchor.Absolute;
            this.Width   = 400 * GuiWidget.DeviceScale;
            //this.Border = spacing;
            this.Padding = ItemSpacing;
            this.item    = item;
            this.theme   = theme;

            var image = new ImageBuffer(IconSize, IconSize);

            if (item.icon != null)
            {
                var imageWidget = new ImageWidget(image)
                {
                    Selectable = false,
                    VAnchor    = VAnchor.Top,
                    Margin     = new BorderDouble(right: ItemSpacing)
                };

                Load += (s, e) => WebCache.RetrieveImageAsync(image, item.icon, true);
                this.AddChild(imageWidget);
            }
            else if (item.widget_url != null)
            {
                var whiteBackground = new GuiWidget(IconSize, IconSize)
                {
                    // these images expect to be on white so change the background to white
                    BackgroundColor = Color.White,
                    Margin          = new BorderDouble(right: ItemSpacing)
                };
                this.AddChild(whiteBackground);

                var imageWidget = new ImageWidget(image)
                {
                    Selectable = false,
                    VAnchor    = VAnchor.Center,
                };

                Load += (s, e) => WebCache.RetrieveImageAsync(image, item.widget_url, true);
                whiteBackground.AddChild(imageWidget);
            }

            var wrappedText = new WrappedTextWidget(item.title, textColor: theme.TextColor, pointSize: theme.DefaultFontSize)
            {
                Selectable = false,
                VAnchor    = VAnchor.Center | VAnchor.Fit,
                Margin     = 3
            };

            this.AddChild(wrappedText);
            wrappedText.Load += (s, e) =>
            {
                wrappedText.VAnchor = VAnchor.Top | VAnchor.Fit;
            };

            this.Cursor = Cursors.Hand;
        }
        public ShowAuthPanel()
        {
            WrappedTextWidget userLoginPromptLabel = new WrappedTextWidget("Sign in to access your cloud printer profiles.\n\nOnce signed in you will be able to access:".Localize())
            {
                TextColor = ActiveTheme.Instance.PrimaryTextColor,
            };

            contentRow.AddChild(userLoginPromptLabel);

            AddBulletPointAndDescription(contentRow,
                                         "Cloud Library".Localize(),
                                         "Save your designs to the cloud and access them from anywhere in the world. You can also share them any time with with anyone you want.".Localize());
            AddBulletPointAndDescription(contentRow,
                                         "Cloud Printer Profiles".Localize(),
                                         "Create your machine settings once, and have them available anywhere you want to print. All your changes appear on all your devices.".Localize());
            AddBulletPointAndDescription(contentRow,
                                         "Remote Monitoring".Localize(),
                                         "Check on your prints from anywhere. With cloud monitoring, you have access to your printer no matter where you go.".Localize());

            var skipButton = textImageButtonFactory.Generate("Skip".Localize());

            skipButton.Name   = "Connection Wizard Skip Sign In Button";
            skipButton.Click += (sender, e) =>
            {
                if (!ProfileManager.Instance.ActiveProfiles.Any())
                {
                    WizardWindow.ChangeToPage <SetupStepMakeModelName>();
                }
                else
                {
                    UiThread.RunOnIdle(WizardWindow.Close);
                }
            };
            var createAccountButton = textImageButtonFactory.Generate("Create Account".Localize());

            createAccountButton.Name   = "Create Account From Connection Wizard Button";
            createAccountButton.Margin = new Agg.BorderDouble(right: 5);
            createAccountButton.Click += (s, e) =>
            {
                WizardWindow.ChangeToAccountCreate();
                UiThread.RunOnIdle(WizardWindow.Close);
            };

            var signInButton = textImageButtonFactory.Generate("Sign In".Localize());

            signInButton.Name   = "Sign In From Connection Wizard Button";
            signInButton.Click += (s, e) =>
            {
                WizardWindow.ShowAuthDialog?.Invoke();
                UiThread.RunOnIdle(WizardWindow.Close);
            };

            footerRow.AddChild(skipButton);
            footerRow.AddChild(new HorizontalSpacer());
            footerRow.AddChild(createAccountButton);
            footerRow.AddChild(signInButton);
        }
示例#5
0
        public WelcomePage()
            : base("Done".Localize())
        {
            this.WindowTitle = "MatterControl".Localize();
            this.WindowSize  = new Vector2(400, 250);

            this.HeaderText = "Welcome to MatterControl".Localize();

            var welcome = "Let's show you around before you get started.".Localize();

            var textWidget = new WrappedTextWidget(welcome)
            {
                Margin    = new BorderDouble(left: 10, top: 10),
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch
            };

            contentRow.AddChild(textWidget);

            contentRow.AddChild(new VerticalSpacer());

            var showWelcomePageCheckBox = new CheckBox("Don't remind me again".Localize())
            {
                TextColor = theme.TextColor,
                Margin    = new BorderDouble(top: 6, left: 6),
                HAnchor   = Agg.UI.HAnchor.Left,
                Checked   = ApplicationSettings.Instance.get(UserSettingsKey.ShownWelcomeMessage) == "false"
            };

            showWelcomePageCheckBox.Click += (sender, e) =>
            {
                if (showWelcomePageCheckBox.Checked)
                {
                    ApplicationSettings.Instance.set(UserSettingsKey.ShownWelcomeMessage, "false");
                }
                else
                {
                    ApplicationSettings.Instance.set(UserSettingsKey.ShownWelcomeMessage, "true");
                }
            };
            contentRow.AddChild(showWelcomePageCheckBox);

            var nextButton = theme.CreateDialogButton("Next".Localize());

            nextButton.Name   = "Next Button";
            nextButton.Click += (s, e) =>
            {
                this.DialogWindow.CloseOnIdle();
                UiThread.RunOnIdle(ProductTour.StartTour);
            };

            this.AddPageAction(nextButton);
        }
        public FlowLayoutWidget createPrinterConnectionMessageContainer()
        {
            var container = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                VAnchor = VAnchor.Stretch,
                Margin  = new BorderDouble(5)
            };

            var elementMargin = new BorderDouble(top: 5);

            var printerMessageOne = new TextWidget("MatterControl will now attempt to auto-detect your printer.".Localize(), 0, 0, 10)
            {
                Margin    = elementMargin,
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch
            };

            container.AddChild(printerMessageOne);

            var printerMessageFour = new TextWidget(string.Format("1.) {0}.", "Plug in printer USB cable and turn printer on".Localize()), 0, 0, 12)
            {
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };

            container.AddChild(printerMessageFour);

            printerConnectionMessage = new WrappedTextWidget("", 10)
            {
                TextColor = Color.Red,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };
            container.AddChild(printerConnectionMessage);

            var removeImage = StaticData.Instance.LoadImage(Path.Combine("Images", "insert usb.png")).SetPreMultiply();

            container.AddChild(new ImageWidget(removeImage)
            {
                HAnchor = HAnchor.Center,
                Margin  = new BorderDouble(0, 10),
            });

            container.AddChild(new GuiWidget
            {
                VAnchor = VAnchor.Stretch
            });

            container.HAnchor = HAnchor.Stretch;
            return(container);
        }
        private GuiWidget CreateDetailInfo(string detailText)
        {
            var wrappedText = new WrappedTextWidget(detailText)
            {
                TextColor = ActiveTheme.Instance.PrimaryTextColor,
            };

            var container = new GuiWidget(HAnchor.ParentLeftRight, VAnchor.FitToChildren)
            {
                Margin = new BorderDouble(25, 15, 5, 5),
            };

            container.AddChild(wrappedText);

            return(container);
        }
        public ImportSucceeded(string successMessage) :
            base("Done", "Import Wizard")
        {
            this.headerLabel.Text = "Import Successful".Localize();

            var container = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.ParentLeftRight,
            };

            contentRow.AddChild(container);

            var successMessageWidget = new WrappedTextWidget(successMessage, textColor: ActiveTheme.Instance.PrimaryTextColor);

            container.AddChild(successMessageWidget);

            footerRow.AddChild(new HorizontalSpacer());
            footerRow.AddChild(cancelButton);
        }
    public LicenseAgreementPage()
    {
        string eulaText = StaticData.Instance.ReadAllText("MatterControl EULA.txt").Replace("\r\n", "\n");

        var scrollable = new ScrollableWidget(true);

        scrollable.AnchorAll();
        scrollable.ScrollArea.HAnchor = HAnchor.ParentLeftRight;
        contentRow.AddChild(scrollable);

        var textBox = new WrappedTextWidget(eulaText, textColor: ActiveTheme.Instance.PrimaryTextColor, doubleBufferText: false)
        {
            DrawFromHintedCache = true,
            Name = "LicenseAgreementPage",
        };

        scrollable.ScrollArea.Margin = new BorderDouble(0, 0, 15, 0);
        scrollable.AddChild(textBox);

        var acceptButton = textImageButtonFactory.Generate("Accept".Localize());

        acceptButton.Click += (s, e) =>
        {
            UserSettings.Instance.set("SoftwareLicenseAccepted", "true");
            UiThread.RunOnIdle(WizardWindow.Close);
        };

        acceptButton.Visible = true;
        cancelButton.Visible = true;

        // Exit if EULA is not accepted
        cancelButton.Click += (s, e) => UiThread.RunOnIdle(MatterControlApplication.Instance.Close);

        //Add buttons to buttonContainer
        footerRow.AddChild(acceptButton);
        footerRow.AddChild(new HorizontalSpacer());
        footerRow.AddChild(cancelButton);

        footerRow.Visible = true;

        UiThread.RunOnIdle(MakeFrontWindow, .2);
    }
        public ContactFormPage()
        {
            this.WindowTitle = "MatterControl : " + "Submit Feedback".Localize();
            this.HeaderText  = "How can we improve?".Localize();

            contentRow.Padding = theme.DefaultContainerPadding;

            submitButton        = theme.CreateDialogButton("Submit".Localize());
            submitButton.Click += (sender, eventArgs) =>
            {
                if (ValidateContactForm())
                {
                    ContactFormRequest postRequest = new ContactFormRequest(questionInput.Text, detailInput.Text, emailInput.Text, nameInput.Text, "");

                    contentRow.RemoveChildren();

                    contentRow.AddChild(messageContainer);

                    submitButton.Visible = false;

                    postRequest.RequestSucceeded += (s, e) =>
                    {
                        submissionStatus.Text = "Thank you!  Your information has been submitted.".Localize();
                        this.SetCancelButtonText("Done".Localize());
                    };
                    postRequest.RequestFailed += (s, e) =>
                    {
                        submissionStatus.Text = "Sorry!  We weren't able to submit your request.".Localize();
                    };
                    postRequest.Request();
                }
            };
            this.AddPageAction(submitButton);

            messageContainer = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch
            };

            submissionStatus = new TextWidget("Submitting your information...".Localize(), pointSize: 13)
            {
                AutoExpandBoundsToText = true,
                Margin    = new BorderDouble(0, 5),
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Left
            };

            messageContainer.AddChild(submissionStatus);

            // Default sizing results in too much top whitespace, revise Subject row to only be as big as content
            var subjectRow = CreateLabelRow("Subject".Localize());

            subjectRow.VAnchor = VAnchor.Fit;
            contentRow.AddChild(subjectRow);
            contentRow.AddChild(questionInput = new MHTextEditWidget("", theme)
            {
                HAnchor = HAnchor.Stretch
            });
            contentRow.AddChild(questionErrorMessage = CreateErrorRow());

            contentRow.AddChild(CreateLabelRow("Message".Localize()));
            contentRow.AddChild(detailInput = new MHTextEditWidget("", theme, pixelHeight: 120, multiLine: true)
            {
                HAnchor = HAnchor.Stretch
            });
            contentRow.AddChild(detailErrorMessage = CreateErrorRow());

            contentRow.AddChild(CreateLabelRow("Email Address".Localize()));
            contentRow.AddChild(emailInput = new MHTextEditWidget("", theme)
            {
                HAnchor = HAnchor.Stretch
            });
            contentRow.AddChild(emailErrorMessage = CreateErrorRow());

            contentRow.AddChild(CreateLabelRow("Name".Localize()));
            contentRow.AddChild(nameInput = new MHTextEditWidget("", theme)
            {
                HAnchor = HAnchor.Stretch
            });
            contentRow.AddChild(nameErrorMessage = CreateErrorRow());
        }
示例#11
0
        public static GuiWidget CreatePropertyEditor(EditableProperty property, UndoBuffer undoBuffer, PPEContext context, ThemeConfig theme)
        {
            var object3D             = property.Item;
            var propertyGridModifier = property.Item as IPropertyGridModifier;

            GuiWidget rowContainer = null;

            // Get reflected property value once, then test for each case below
            var propertyValue = property.Value;

            void RegisterValueChanged(UIField field, Func <string, object> valueFromString, Func <object, string> valueToString = null)
            {
                field.ValueChanged += (s, e) =>
                {
                    var newValue = field.Value;
                    var oldValue = property.Value.ToString();
                    if (valueToString != null)
                    {
                        oldValue = valueToString(property.Value);
                    }

                    // field.Content
                    if (undoBuffer != null)
                    {
                        undoBuffer.AddAndDo(new UndoRedoActions(() =>
                        {
                            property.SetValue(valueFromString(oldValue));
                            object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                            propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                        },
                                                                () =>
                        {
                            property.SetValue(valueFromString(newValue));
                            object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                            propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                        }));
                    }
                    else
                    {
                        property.SetValue(valueFromString(newValue));
                        object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                        propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                    }
                };
            }

            var readOnly = property.PropertyInfo.GetCustomAttributes(true).OfType <ReadOnlyAttribute>().FirstOrDefault() != null;

            // create a double editor
            if (propertyValue is double doubleValue)
            {
                if (readOnly)
                {
                    var valueField = new TextWidget(string.Format("{0:n}", doubleValue), textColor: theme.TextColor, pointSize: 10)
                    {
                        AutoExpandBoundsToText = true
                    };

                    rowContainer = new SettingsRow(property.DisplayName.Localize(),
                                                   property.Description,
                                                   valueField,
                                                   theme);

                    void RefreshField(object s, InvalidateArgs e)
                    {
                        if (e.InvalidateType.HasFlag(InvalidateType.DisplayValues))
                        {
                            double newValue = (double)property.Value;
                            valueField.Text = string.Format("{0:n}", newValue);
                        }
                    }

                    object3D.Invalidated += RefreshField;
                    valueField.Closed    += (s, e) => object3D.Invalidated -= RefreshField;
                }
                else                 // normal edit row
                {
                    var field = new DoubleField(theme);
                    field.Initialize(0);
                    field.DoubleValue = doubleValue;
                    field.ClearUndoHistory();
                    RegisterValueChanged(field, (valueString) => { return(double.Parse(valueString)); });

                    void RefreshField(object s, InvalidateArgs e)
                    {
                        if (e.InvalidateType.HasFlag(InvalidateType.DisplayValues))
                        {
                            double newValue = (double)property.Value;
                            if (newValue != field.DoubleValue)
                            {
                                field.DoubleValue = newValue;
                            }
                        }
                    }

                    object3D.Invalidated += RefreshField;
                    field.Content.Descendants <InternalTextEditWidget>().First().Name = property.DisplayName + " Edit";
                    field.Content.Closed += (s, e) => object3D.Invalidated -= RefreshField;

                    rowContainer = CreateSettingsRow(property, field, theme);
                }
            }
            else if (propertyValue is Color color)
            {
                var field = new ColorField(theme, object3D.Color);
                field.Initialize(0);
                field.ValueChanged += (s, e) =>
                {
                    property.SetValue(field.Color);
                    object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                    propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                };

                rowContainer = CreateSettingsRow(property, field, theme);
            }
            else if (propertyValue is Vector2 vector2)
            {
                var field = new Vector2Field(theme);
                field.Initialize(0);
                field.Vector2 = vector2;
                field.ClearUndoHistory();

                RegisterValueChanged(field,
                                     (valueString) => Vector2.Parse(valueString),
                                     (value) =>
                {
                    var s = ((Vector2)value).ToString();
                    return(s.Substring(1, s.Length - 2));
                });

                rowContainer = CreateSettingsColumn(property, field);
            }
            else if (propertyValue is Vector3 vector3)
            {
                var field = new Vector3Field(theme);
                field.Initialize(0);
                field.Vector3 = vector3;
                field.ClearUndoHistory();

                RegisterValueChanged(
                    field,
                    (valueString) => Vector3.Parse(valueString),
                    (value) =>
                {
                    var s = ((Vector3)value).ToString();
                    return(s.Substring(1, s.Length - 2));
                });

                rowContainer = CreateSettingsColumn(property, field);
            }
            else if (propertyValue is DirectionVector directionVector)
            {
                var field = new DirectionVectorField(theme);
                field.Initialize(0);
                field.SetValue(directionVector);
                field.ClearUndoHistory();

                field.ValueChanged += (s, e) =>
                {
                    property.SetValue(field.DirectionVector);
                    object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                    propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                };

                rowContainer = CreateSettingsRow(property, field, theme);
            }
            else if (propertyValue is DirectionAxis directionAxis)
            {
                rowContainer = CreateSettingsColumn(property);

                var field1 = new DirectionVectorField(theme);
                field1.Initialize(0);
                field1.ClearUndoHistory();

                field1.SetValue(new DirectionVector()
                {
                    Normal = directionAxis.Normal
                });

                rowContainer.AddChild(new SettingsRow("Axis".Localize(), null, field1.Content, theme));

                // the direction axis
                // the distance from the center of the part
                // create a double editor
                var field2 = new Vector3Field(theme);
                field2.Initialize(0);
                field2.Vector3 = directionAxis.Origin - property.Item.Children.First().GetAxisAlignedBoundingBox().Center;
                field2.ClearUndoHistory();

                var row2 = CreateSettingsColumn("Offset".Localize(), field2);

                // update this when changed
                void UpdateData(object s, InvalidateArgs e)
                {
                    field2.Vector3 = ((DirectionAxis)property.Value).Origin - property.Item.Children.First().GetAxisAlignedBoundingBox().Center;
                }

                property.Item.Invalidated += UpdateData;
                field2.Content.Closed     += (s, e) =>
                {
                    property.Item.Invalidated -= UpdateData;
                };

                // update functions
                field1.ValueChanged += (s, e) =>
                {
                    property.SetValue(new DirectionAxis()
                    {
                        Normal = field1.DirectionVector.Normal,
                        Origin = property.Item.Children.First().GetAxisAlignedBoundingBox().Center + field2.Vector3
                    });
                    object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                    propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                };
                field2.ValueChanged += (s, e) =>
                {
                    property.SetValue(new DirectionAxis()
                    {
                        Normal = field1.DirectionVector.Normal,
                        Origin = property.Item.Children.First().GetAxisAlignedBoundingBox().Center + field2.Vector3
                    });
                    object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                    propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                };

                rowContainer.AddChild(row2);
            }
            else if (propertyValue is SelectedChildren childSelector)
            {
                var showAsList = property.PropertyInfo.GetCustomAttributes(true).OfType <ShowAsListAttribute>().FirstOrDefault() != null;
                if (showAsList)
                {
                    UIField field = new ChildrenSelectorListField(property, theme);

                    field.Initialize(0);
                    RegisterValueChanged(field,
                                         (valueString) =>
                    {
                        var childrenSelector = new SelectedChildren();
                        foreach (var child in valueString.Split(','))
                        {
                            childrenSelector.Add(child);
                        }

                        return(childrenSelector);
                    });

                    rowContainer = CreateSettingsRow(property, field, theme);
                }
                else                 // show the subtract editor for boolean subtract and subtract and replace
                {
                    rowContainer = CreateSettingsColumn(property);
                    if (property.Item is OperationSourceContainerObject3D sourceContainer)
                    {
                        Action selected = null;
                        if (!(context.item.GetType().GetCustomAttributes(typeof(ShowUpdateButtonAttribute), true).FirstOrDefault() is ShowUpdateButtonAttribute showUpdate))
                        {
                            selected = () =>
                            {
                                object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                            };
                        }

                        rowContainer.AddChild(CreateSourceChildSelector(childSelector, sourceContainer, theme, selected));
                    }
                    else
                    {
                        rowContainer.AddChild(CreateSelector(childSelector, property.Item, theme));
                    }
                }
            }
            else if (propertyValue is ImageBuffer imageBuffer)
            {
                rowContainer = CreateSettingsColumn(property);
                rowContainer.AddChild(new ImageWidget(imageBuffer)
                {
                    HAnchor = HAnchor.Left,
                    Margin  = new BorderDouble(0, 3)
                });
            }
#if !__ANDROID__
            else if (propertyValue is List <string> stringList)
            {
                var field = new SurfacedEditorsField(theme, property.Item);
                field.Initialize(0);
                field.ListValue     = stringList;
                field.ValueChanged += (s, e) =>
                {
                    property.SetValue(field.ListValue);
                };

                rowContainer = CreateSettingsColumn(property, field);

                rowContainer.Descendants <HorizontalSpacer>().FirstOrDefault()?.Close();
            }
#endif
            // create a int editor
            else if (propertyValue is int intValue)
            {
                if (readOnly)
                {
                    var valueField = new TextWidget(string.Format("{0:n0}", intValue),
                                                    textColor: theme.TextColor,
                                                    pointSize: 10)
                    {
                        AutoExpandBoundsToText = true
                    };

                    rowContainer = new SettingsRow(property.DisplayName.Localize(),
                                                   property.Description,
                                                   valueField,
                                                   theme);

                    void RefreshField(object s, InvalidateArgs e)
                    {
                        if (e.InvalidateType.HasFlag(InvalidateType.DisplayValues))
                        {
                            int newValue = (int)property.Value;
                            valueField.Text = string.Format("{0:n0}", newValue);
                        }
                    }

                    object3D.Invalidated += RefreshField;
                    valueField.Closed    += (s, e) => object3D.Invalidated -= RefreshField;
                }
                else                 // normal edit row
                {
                    var field = new IntField(theme);
                    field.Initialize(0);
                    field.IntValue = intValue;
                    field.ClearUndoHistory();

                    RegisterValueChanged(field, (valueString) => { return(int.Parse(valueString)); });

                    void RefreshField(object s, InvalidateArgs e)
                    {
                        if (e.InvalidateType.HasFlag(InvalidateType.DisplayValues))
                        {
                            int newValue = (int)property.Value;
                            if (newValue != field.IntValue)
                            {
                                field.IntValue = newValue;
                            }
                        }
                    }

                    object3D.Invalidated += RefreshField;
                    field.Content.Closed += (s, e) => object3D.Invalidated -= RefreshField;

                    rowContainer = CreateSettingsRow(property, field, theme);
                }
            }
            else if (propertyValue is bool boolValue)
            {
                // create a bool editor
                var field = new ToggleboxField(theme);
                field.Initialize(0);
                field.Checked = boolValue;

                RegisterValueChanged(field,
                                     (valueString) => { return(valueString == "1"); },
                                     (value) => { return(((bool)value) ? "1" : "0"); });
                rowContainer = CreateSettingsRow(property, field, theme);
            }
            else if (propertyValue is string stringValue)
            {
                if (readOnly)
                {
                    rowContainer = new WrappedTextWidget(stringValue,
                                                         textColor: theme.TextColor,
                                                         pointSize: 10)
                    {
                        Margin = 5
                    };
                }
                else                 // normal edit row
                {
                    var multiLineEditAttribute = property.PropertyInfo.GetCustomAttributes(true).OfType <MultiLineEditAttribute>().FirstOrDefault();

                    if (multiLineEditAttribute != null)
                    {
                        // create a a multi-line string editor
                        var field = new MultilineStringField(theme);
                        field.Initialize(0);
                        field.SetValue(stringValue, false);
                        field.ClearUndoHistory();
                        field.Content.HAnchor = HAnchor.Stretch;
                        // field.Content.MinimumSize = new Vector2(0, 200 * GuiWidget.DeviceScale);
                        RegisterValueChanged(field, (valueString) => valueString);
                        rowContainer = CreateSettingsColumn(property, field, fullWidth: true);
                    }
                    else
                    {
                        // create a string editor
                        var field = new TextField(theme);
                        field.Initialize(0);
                        field.SetValue(stringValue, false);
                        field.ClearUndoHistory();
                        field.Content.HAnchor = HAnchor.Stretch;
                        RegisterValueChanged(field, (valueString) => valueString);
                        rowContainer = CreateSettingsRow(property, field, theme);

                        var label = rowContainer.Children.First();

                        var spacer = rowContainer.Children.OfType <HorizontalSpacer>().FirstOrDefault();
                        spacer.HAnchor = HAnchor.Absolute;
                        spacer.Width   = Math.Max(0, 100 - label.Width);
                    }
                }
            }
            else if (propertyValue is char charValue)
            {
                // create a char editor
                var field = new CharField(theme);
                field.Initialize(0);
                field.SetValue(charValue.ToString(), false);
                field.ClearUndoHistory();
                field.ValueChanged += (s, e) =>
                {
                    property.SetValue(Convert.ToChar(field.Value));
                    object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                    propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                };

                rowContainer = CreateSettingsRow(property, field, theme);
            }
            else if (property.PropertyType.IsEnum)
            {
                // create an enum editor
                UIField field;
                var     enumDisplayAttribute = property.PropertyInfo.GetCustomAttributes(true).OfType <EnumDisplayAttribute>().FirstOrDefault();
                var     addToSettingsRow     = true;
                if (enumDisplayAttribute != null)
                {
                    field = new EnumDisplayField(property, enumDisplayAttribute, theme)
                    {
                        InitialValue = propertyValue.ToString(),
                    };

                    if (enumDisplayAttribute.Mode == EnumDisplayAttribute.PresentationMode.Tabs)
                    {
                        addToSettingsRow = false;
                    }
                }
                else
                {
                    if (property.PropertyType == typeof(NamedTypeFace))
                    {
                        field = new FontSelectorField(property, theme);
                    }
                    else
                    {
                        field = new EnumField(property, theme);
                    }
                }

                field.Initialize(0);
                RegisterValueChanged(field,
                                     (valueString) =>
                {
                    return(Enum.Parse(property.PropertyType, valueString));
                });

                field.ValueChanged += (s, e) =>
                {
                    if (property.Value.ToString() != field.Value)
                    {
                        property.SetValue(Enum.Parse(property.PropertyType, field.Value));
                        object3D?.Invalidate(new InvalidateArgs(context.item, InvalidateType.Properties));
                        propertyGridModifier?.UpdateControls(new PublicPropertyChange(context, property.PropertyInfo.Name));
                    }
                };

                if (addToSettingsRow)
                {
                    rowContainer = CreateSettingsRow(property, field, theme);
                }
                else
                {
                    // field.Content.Margin = new BorderDouble(3, 0);
                    field.Content.HAnchor = HAnchor.Stretch;
                    rowContainer          = field.Content;
                }
            }
            else if (propertyValue is IObject3D item &&
                     ApplicationController.Instance.Extensions.GetEditorsForType(property.PropertyType)?.FirstOrDefault() is IObject3DEditor iObject3DEditor)
            {
                // Use known IObject3D editors
                rowContainer = iObject3DEditor.Create(item, undoBuffer, theme);
            }

            // remember the row name and widget
            context.editRows.Add(property.PropertyInfo.Name, rowContainer);

            return(rowContainer);
        }
示例#12
0
        public CloneSettingsPage()
        {
            this.WindowTitle = "Import Printer".Localize();
            this.HeaderText  = "Import Printer".Localize() + ":";
            this.Name        = "Import Printer Window";

            var commonMargin = new BorderDouble(4, 2);

            contentRow.AddChild(new TextWidget("File Path".Localize(), pointSize: theme.DefaultFontSize, textColor: theme.TextColor));

            var pathRow = new FlowLayoutWidget()
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
            };

            contentRow.AddChild(pathRow);

            TextButton importButton = null;

            var textEditWidget = new MHTextEditWidget("", theme)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Center,
                Name    = "Profile Path Widget"
            };

            textEditWidget.ActualTextEditWidget.EditComplete += (s, e) =>
            {
                importButton.Enabled = !string.IsNullOrEmpty(textEditWidget.Text) &&
                                       File.Exists(textEditWidget.Text);
            };
            pathRow.AddChild(textEditWidget);

            // Must come before pathButton.Click definition
            RadioButton copyAndCalibrateOption = null;

            var openButton = new IconButton(StaticData.Instance.LoadIcon("fa-folder-open_16.png", 16, 16, theme.InvertIcons), theme)
            {
                BackgroundColor = theme.MinimalShade,
                Margin          = new BorderDouble(left: 8),
                Name            = "Open File Button"
            };

            openButton.Click += (s, e) =>
            {
                AggContext.FileDialogs.OpenFileDialog(
                    new OpenFileDialogParams("settings files|*.ini;*.printer;*.slice;*.fff"),
                    (result) =>
                {
                    if (!string.IsNullOrEmpty(result.FileName) &&
                        File.Exists(result.FileName))
                    {
                        textEditWidget.Text = result.FileName;
                    }

                    importButton.Enabled = !string.IsNullOrEmpty(textEditWidget.Text) &&
                                           File.Exists(textEditWidget.Text);
                });
            };
            pathRow.AddChild(openButton);

            var exactCloneColumn = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Margin  = new BorderDouble(top: 15)
            };

            contentRow.AddChild(exactCloneColumn);

            var siblingList = new List <GuiWidget>();

            var exactCloneOption = new RadioButton(new RadioButtonViewText("Exact clone".Localize(), theme.TextColor, fontSize: theme.DefaultFontSize))
            {
                HAnchor = HAnchor.Left,
                Margin  = commonMargin,
                Cursor  = Cursors.Hand,
                Name    = "Exact Clone Button",
                Checked = true,
                SiblingRadioButtonList = siblingList
            };

            exactCloneColumn.AddChild(exactCloneOption);
            siblingList.Add(exactCloneOption);

            var exactCloneSummary = new WrappedTextWidget("Copy all settings including hardware calibration".Localize(), pointSize: theme.DefaultFontSize - 1, textColor: theme.TextColor)
            {
                Margin = new BorderDouble(left: 30, bottom: 10, top: 4),
            };

            exactCloneColumn.AddChild(exactCloneSummary);

            var copySettingsColumn = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit
            };

            contentRow.AddChild(copySettingsColumn);

            // Create export button for each plugin
            copyAndCalibrateOption = new RadioButton(new RadioButtonViewText("Copy and recalibrate".Localize(), theme.TextColor, fontSize: theme.DefaultFontSize))
            {
                HAnchor = HAnchor.Left,
                Margin  = commonMargin,
                Cursor  = Cursors.Hand,
                Name    = "Copy and Calibrate Button",
                SiblingRadioButtonList = siblingList
            };
            copySettingsColumn.AddChild(copyAndCalibrateOption);
            siblingList.Add(copyAndCalibrateOption);

            string summary = string.Format(
                "{0}\r\n{1}",
                "Copy everything but hardware specific calibration settings".Localize(),
                "Ideal for cloning settings across different physical printers".Localize());

            var copySummary = new WrappedTextWidget(summary, pointSize: theme.DefaultFontSize - 1, textColor: theme.TextColor)
            {
                Margin = new BorderDouble(left: 30, bottom: 10, top: 4)
            };

            copySettingsColumn.AddChild(copySummary);

            importButton         = theme.CreateDialogButton("Import".Localize());
            importButton.Enabled = false;
            importButton.Name    = "Import Button";
            importButton.Click  += (s, e) =>
            {
                var filePath = textEditWidget.Text;

                if (ProfileManager.ImportFromExisting(filePath, copyAndCalibrateOption.Checked, out string importedName))
                {
                    string importPrinterSuccessMessage = "You have successfully imported a new printer profile. You can find '{0}' in your list of available printers.".Localize();
                    this.DialogWindow.ChangeToPage(
                        new ImportSucceededPage(
                            importPrinterSuccessMessage.FormatWith(importedName)));
                }
                else
                {
                    StyledMessageBox.ShowMessageBox(
                        string.Format(
                            "Oops! Settings file '{0}' did not contain any settings we could import.".Localize(),
                            Path.GetFileName(filePath)),
                        "Unable to Import".Localize());
                }
            };

            this.AddPageAction(importButton);
        }
示例#13
0
        public void TextWidgetAutoSizeTest()
        {
            // resize works on text widgets
            {
                TextWidget textItem = new TextWidget("test Item", 10, 10);
                textItem.AutoExpandBoundsToText = true;

                double origWidth = textItem.Width;
                textItem.Text = "test Items";
                double newlineWidth = textItem.Width;
                Assert.IsTrue(newlineWidth > origWidth);

                textItem.Text = "test Item";
                double backToOrignWidth = textItem.Width;
                Assert.IsTrue(backToOrignWidth == origWidth);


                double origHeight = textItem.Height;
                textItem.Text = "test\nItem";
                double newlineHeight = textItem.Height;
                textItem.Text = "test Item";
                double backToOrignHeight = textItem.Height;

                Assert.IsTrue(backToOrignHeight == origHeight);
            }

            // make sure text widget gets smaller vertically when it needs to
            {
                GuiWidget containerControl = new GuiWidget(640, 480);
                containerControl.DoubleBuffer = true;

                GuiWidget holder = new GuiWidget(500, 10)
                {
                    VAnchor     = VAnchor.Fit,
                    MinimumSize = Vector2.Zero
                };
                containerControl.AddChild(holder);

                var textItem = new WrappedTextWidget("some very long text that can wrap");
                holder.AddChild(textItem);

                var origSize = textItem.Size;
                Assert.IsTrue(origSize.X > 10, "The control expanded");
                holder.Width = 100;
                var bigSize = textItem.Size;

                Assert.IsTrue(bigSize.X < origSize.X, "The control got narrower and taller");
                Assert.IsTrue(bigSize.Y > origSize.Y, "The control got narrower and taller");

                holder.Width = 500;
                var backToOrignSize = textItem.Size;
                Assert.IsTrue(backToOrignSize.X == origSize.X);
                Assert.IsTrue(backToOrignSize.Y == origSize.Y);

                double origHeight = textItem.Height;
                textItem.Text = "test\nItem";
                double newlineHeight = textItem.Height;
                textItem.Text = "test Item";
                double backToOrignHeight = textItem.Height;

                Assert.IsTrue(backToOrignHeight == origHeight);
            }
        }
        public SetupStepComPortOne(PrinterConfig printer)
        {
            this.WindowTitle = "Setup Wizard".Localize();

            var container = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                VAnchor = VAnchor.Stretch,
                Margin  = new BorderDouble(5),
                HAnchor = HAnchor.Stretch
            };

            var elementMargin = new BorderDouble(top: 5);

            var printerMessageOne = new TextWidget("MatterControl will now attempt to auto-detect your printer.".Localize(), 0, 0, 10)
            {
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };

            container.AddChild(printerMessageOne);

            var printerMessageTwo = new WrappedTextWidget(string.Format("1.) {0} ({1}).", "Unplug printer USB cable from computer".Localize(), "if connected".Localize()), 12)
            {
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };

            container.AddChild(printerMessageTwo);

            var printerMessageThree = new TextWidget(string.Format("2.) {0} '{1}'.", "Press".Localize(), "Continue".Localize()), 0, 0, 12)
            {
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };

            container.AddChild(printerMessageThree);

            var removeImage = StaticData.Instance.LoadImage(Path.Combine("Images", "remove usb.png"));

            removeImage.SetRecieveBlender(new BlenderPreMultBGRA());
            container.AddChild(new ImageWidget(removeImage)
            {
                HAnchor = HAnchor.Center,
                Margin  = new BorderDouble(0, 10),
            });

            GuiWidget vSpacer = new GuiWidget();

            vSpacer.VAnchor = VAnchor.Stretch;
            container.AddChild(vSpacer);

            var setupManualConfigurationOrSkipConnectionWidget = new TextWidget("You can also".Localize() + ":", 0, 0, 10)
            {
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };

            container.AddChild(setupManualConfigurationOrSkipConnectionWidget);

            var manualLink = new LinkLabel("Manually Configure Connection".Localize(), theme)
            {
                Margin    = new BorderDouble(0, 5),
                TextColor = theme.TextColor
            };

            manualLink.Click += (s, e) => UiThread.RunOnIdle(() =>
            {
                DialogWindow.ChangeToPage(new SetupStepComPortManual(printer));
            });
            container.AddChild(manualLink);

            var printerMessageFour = new TextWidget("or".Localize(), 0, 0, 10)
            {
                TextColor = theme.TextColor,
                HAnchor   = HAnchor.Stretch,
                Margin    = elementMargin
            };

            container.AddChild(printerMessageFour);

            var skipConnectionLink = new LinkLabel("Skip Connection Setup".Localize(), theme)
            {
                Margin    = new BorderDouble(0, 8),
                TextColor = theme.TextColor
            };

            skipConnectionLink.Click += (s, e) =>
            {
                printer.Connection.HaltConnectionThread();
                Parent.Close();
            };
            container.AddChild(skipConnectionLink);

            contentRow.AddChild(container);

            // Construct buttons
            var nextButton = theme.CreateDialogButton("Continue".Localize());

            nextButton.Click += (s, e) =>
            {
                DialogWindow.ChangeToPage(new SetupStepComPortTwo(printer));
            };

            this.AddPageAction(nextButton);
        }
示例#15
0
 public FormField(MHTextEditWidget textEditWidget, WrappedTextWidget errorMessageWidget, ValidationHandler[] validationHandlers)
 {
     this.FieldEditWidget         = textEditWidget;
     this.FieldErrorMessageWidget = errorMessageWidget;
     this.FieldValidationHandlers = validationHandlers;
 }
示例#16
0
		public MacroDetailPage(GCodeMacro gcodeMacro, PrinterSettings printerSettings)
		{
			// Form validation fields
			MHTextEditWidget macroNameInput;
			MHTextEditWidget macroCommandInput;
			WrappedTextWidget macroCommandError;
			WrappedTextWidget macroNameError;

			this.HeaderText = "Edit Macro".Localize();
			this.printerSettings = printerSettings;

			var elementMargin = new BorderDouble(top: 3);

			contentRow.Padding += 3;

			contentRow.AddChild(new TextWidget("Macro Name".Localize() + ":", 0, 0, 12)
			{
				TextColor = theme.TextColor,
				HAnchor = HAnchor.Stretch,
				Margin = new BorderDouble(0, 0, 0, 1)
			});

			contentRow.AddChild(macroNameInput = new MHTextEditWidget(GCodeMacro.FixMacroName(gcodeMacro.Name), theme)
			{
				HAnchor = HAnchor.Stretch
			});

			contentRow.AddChild(macroNameError = new WrappedTextWidget("Give the macro a name".Localize() + ".", 10)
			{
				TextColor = theme.TextColor,
				Margin = elementMargin
			});

			contentRow.AddChild(new TextWidget("Macro Commands".Localize() + ":", 0, 0, 12)
			{
				TextColor = theme.TextColor,
				HAnchor = HAnchor.Stretch,
				Margin = new BorderDouble(0, 0, 0, 1)
			});

			macroCommandInput = new MHTextEditWidget(gcodeMacro.GCode, theme, pixelHeight: 120, multiLine: true, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono))
			{
				HAnchor = HAnchor.Stretch,
				VAnchor = VAnchor.Stretch
			};
			macroCommandInput.ActualTextEditWidget.VAnchor = VAnchor.Stretch;
			macroCommandInput.DrawFromHintedCache();
			contentRow.AddChild(macroCommandInput);

			contentRow.AddChild(macroCommandError = new WrappedTextWidget("This should be in 'G-Code'".Localize() + ".", 10)
			{
				TextColor = theme.TextColor,
				Margin = elementMargin
			});

			var container = new FlowLayoutWidget
			{
				Margin = new BorderDouble(0, 5),
				HAnchor = HAnchor.Stretch
			};

			contentRow.AddChild(container);

			var saveMacroButton = theme.CreateDialogButton("Save".Localize());
			saveMacroButton.Click += (s, e) =>
			{
				UiThread.RunOnIdle(() =>
				{
					if (ValidateMacroForm())
					{
						// SaveActiveMacro
						gcodeMacro.Name = macroNameInput.Text;
						gcodeMacro.GCode = macroCommandInput.Text;

						if (!printerSettings.Macros.Contains(gcodeMacro))
						{
							printerSettings.Macros.Add(gcodeMacro);
						}

						printerSettings.NotifyMacrosChanged();
						printerSettings.Save();

						this.DialogWindow.ChangeToPage(new MacroListPage(printerSettings));
					}
				});
			};

			this.AddPageAction(saveMacroButton);

			// Define field validation
			var validationMethods = new ValidationMethods();
			var stringValidationHandlers = new FormField.ValidationHandler[] { validationMethods.StringIsNotEmpty };

			formFields = new List<FormField>
			{
				new FormField(macroNameInput, macroNameError, stringValidationHandlers),
				new FormField(macroCommandInput, macroCommandError, stringValidationHandlers)
			};
		}