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; }
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; }
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); }
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()); }
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); }
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); }
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); }
public FormField(MHTextEditWidget textEditWidget, WrappedTextWidget errorMessageWidget, ValidationHandler[] validationHandlers) { this.FieldEditWidget = textEditWidget; this.FieldErrorMessageWidget = errorMessageWidget; this.FieldValidationHandlers = validationHandlers; }
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) }; }