Beispiel #1
0
        public PrintPopupMenu(PrinterConfig printer, ThemeConfig theme)
            : base(theme)
        {
            this.printer         = printer;
            this.DrawArrow       = true;
            this.BackgroundColor = theme.ToolbarButtonBackground;
            this.HoverColor      = theme.ToolbarButtonHover;
            this.MouseDownColor  = theme.ToolbarButtonDown;
            this.Name            = "PrintPopupMenu";
            this.HAnchor         = HAnchor.Fit;
            this.VAnchor         = VAnchor.Fit;

            settingsContext = new SettingsContext(printer, null, NamedSettingsLayers.All);

            this.DynamicPopupContent = () =>
            {
                var menuTheme = ApplicationController.Instance.MenuTheme;

                int tabIndex = 0;

                allUiFields.Clear();

                var column = new FlowLayoutWidget(FlowDirection.TopToBottom)
                {
                    Padding         = 10,
                    BackgroundColor = menuTheme.Colors.PrimaryBackgroundColor
                };

                column.AddChild(new TextWidget("Options".Localize(), textColor: menuTheme.Colors.PrimaryTextColor)
                {
                    HAnchor = HAnchor.Left
                });

                var optionsPanel = new IgnoredFlowLayout()
                {
                    Name        = "PrintPopupMenu Panel",
                    HAnchor     = HAnchor.Fit | HAnchor.Left,
                    VAnchor     = VAnchor.Fit,
                    Padding     = 5,
                    MinimumSize = new Vector2(400, 65),
                    Margin      = new BorderDouble(top: 10),
                };
                column.AddChild(optionsPanel);

                foreach (var key in new[] { "layer_height", "fill_density", "support_material", "create_raft" })
                {
                    var settingsData = SettingsOrganizer.Instance.GetSettingsData(key);
                    var row          = SliceSettingsTabView.CreateItemRow(settingsData, settingsContext, printer, menuTheme, ref tabIndex, allUiFields);

                    SliceSettingsRow.AddBordersToEditFields(row);

                    optionsPanel.AddChild(row);
                }

                var subPanel = new FlowLayoutWidget(FlowDirection.TopToBottom);

                var sectionWidget = new SectionWidget("Advanced", subPanel, menuTheme, expanded: true)
                {
                    Name    = "Advanced Section",
                    HAnchor = HAnchor.Stretch,
                    VAnchor = VAnchor.Fit,
                    Margin  = 0
                };
                column.AddChild(sectionWidget);

                bool anySettingOverridden = false;
                anySettingOverridden |= printer.Settings.GetValue <bool>(SettingsKey.spiral_vase);
                anySettingOverridden |= !string.IsNullOrWhiteSpace(printer.Settings.GetValue(SettingsKey.layer_to_pause));

                sectionWidget.Load += (s, e) =>
                {
                    sectionWidget.Checkbox.Checked = anySettingOverridden;
                };

                foreach (var key in new[] { SettingsKey.spiral_vase, SettingsKey.layer_to_pause })
                {
                    var settingsData = SettingsOrganizer.Instance.GetSettingsData(key);
                    var row          = SliceSettingsTabView.CreateItemRow(settingsData, settingsContext, printer, menuTheme, ref tabIndex, allUiFields);

                    SliceSettingsRow.AddBordersToEditFields(row);

                    subPanel.AddChild(row);
                }

                theme.ApplyBoxStyle(sectionWidget);

                sectionWidget.Margin = new BorderDouble(0, 10);
                sectionWidget.ContentPanel.Children <SettingsRow>().First().Border = new BorderDouble(0, 1);
                sectionWidget.ContentPanel.Children <SettingsRow>().Last().Border  = 0;

                var button = new TextButton("Start Print".Localize(), menuTheme)
                {
                    Name    = "Start Print Button",
                    HAnchor = HAnchor.Right,
                    VAnchor = VAnchor.Absolute,
                };
                button.Click += (s, e) =>
                {
                    // Exit if the bed is not GCode and the bed has no printable items
                    if ((printer.Bed.EditContext.SourceItem as ILibraryAsset)?.ContentType != "gcode" &&
                        !printer.PrintableItems(printer.Bed.EditContext.Content).Any())
                    {
                        return;
                    }

                    UiThread.RunOnIdle(async() =>
                    {
                        // Save any pending changes before starting print operation
                        await ApplicationController.Instance.Tasks.Execute("Saving Changes".Localize(), printer.Bed.SaveChanges);

                        await ApplicationController.Instance.PrintPart(
                            printer.Bed.EditContext,
                            printer,
                            null,
                            CancellationToken.None);
                    });
                };
                column.AddChild(button);

                theme.ApplyPrimaryActionStyle(button);

                return(column);
            };

            this.AddChild(new TextButton("Print".Localize(), theme)
            {
                Selectable = false,
                Padding    = theme.TextButtonPadding.Clone(right: 5)
            });

            PrinterSettings.SettingChanged.RegisterEvent((s, e) =>
            {
                if (e is StringEventArgs stringEvent)
                {
                    string settingsKey = stringEvent.Data;
                    if (allUiFields.TryGetValue(settingsKey, out UIField uifield))
                    {
                        string currentValue = settingsContext.GetValue(settingsKey);
                        if (uifield.Value != currentValue ||
                            settingsKey == "com_port")
                        {
                            uifield.SetValue(
                                currentValue,
                                userInitiated: false);
                        }
                    }
                }
            },
                                                         ref unregisterEvents);
        }
        public void CorrectStyleForSettingsRow()
        {
            var settings = new PrinterSettings();
            var printer  = new PrinterConfig(settings);

            settings.OemLayer      = new PrinterSettingsLayer();
            settings.QualityLayer  = new PrinterSettingsLayer();
            settings.MaterialLayer = new PrinterSettingsLayer();
            Assert.AreEqual(0, settings.UserLayer.Count);

            var theme           = new ThemeConfig();
            var settingsContext = new SettingsContext(printer, null, NamedSettingsLayers.All);

            var key = SettingsKey.layer_height;

            void TestStyle(Color color, bool restoreButton)
            {
                var data = SliceSettingsRow.GetStyleData(printer, theme, settingsContext, key, true);

                Assert.AreEqual(color, data.highlightColor);
                Assert.AreEqual(restoreButton, data.showRestoreButton);
            }

            // make sure all the colors are different
            Assert.AreNotEqual(Color.Transparent, theme.PresetColors.MaterialPreset);
            Assert.AreNotEqual(Color.Transparent, theme.PresetColors.QualityPreset);
            Assert.AreNotEqual(theme.PresetColors.MaterialPreset, theme.PresetColors.QualityPreset);
            Assert.AreNotEqual(theme.PresetColors.MaterialPreset, theme.PresetColors.UserOverride);
            Assert.AreNotEqual(theme.PresetColors.QualityPreset, theme.PresetColors.UserOverride);

            // nothing set no override
            TestStyle(Color.Transparent, false);

            // user override
            settings.UserLayer[key] = "123";
            TestStyle(theme.PresetColors.UserOverride, true);
            settings.UserLayer.Remove(key);

            // Quality override
            settings.QualityLayer[key] = "123";
            TestStyle(theme.PresetColors.QualityPreset, false);
            settings.QualityLayer.Remove(key);

            // Material override
            settings.MaterialLayer[key] = "123";
            TestStyle(theme.PresetColors.MaterialPreset, false);
            settings.MaterialLayer.Remove(key);

            // user override that is the same as the default
            settings.UserLayer[key] = settings.BaseLayer[key];
            TestStyle(Color.Transparent, false);
            settings.UserLayer.Remove(key);

            // Quality override same as default
            settings.QualityLayer[key] = settings.BaseLayer[key];
            TestStyle(theme.PresetColors.QualityPreset, false);
            settings.QualityLayer.Remove(key);

            // Material override same as default
            settings.MaterialLayer[key] = settings.BaseLayer[key];
            TestStyle(theme.PresetColors.MaterialPreset, false);
            settings.MaterialLayer.Remove(key);
        }
Beispiel #3
0
        private GuiWidget GetPopupContent(ThemeConfig menuTheme)
        {
            var widget = new IgnoredPopupWidget()
            {
                Width           = 300,
                HAnchor         = HAnchor.Absolute,
                VAnchor         = VAnchor.Fit,
                Padding         = new BorderDouble(12, 0),
                BackgroundColor = menuTheme.ActiveTabColor
            };

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

            widget.AddChild(container);

            GuiWidget hotendRow;

            container.AddChild(hotendRow = new SettingsItem(
                                   "Heated Bed".Localize(),
                                   menuTheme,
                                   new SettingsItem.ToggleSwitchConfig()
            {
                Checked      = false,
                ToggleAction = (itemChecked) =>
                {
                    var goalTemp = itemChecked ? printer.Settings.GetValue <double>(SettingsKey.bed_temperature) : 0;

                    if (itemChecked)
                    {
                        SetTargetTemperature(goalTemp);
                    }
                    else
                    {
                        SetTargetTemperature(0);
                    }
                }
            },
                                   enforceGutter: false));

            var toggleWidget = hotendRow.Children.Where(o => o is ICheckbox).FirstOrDefault();

            toggleWidget.Name = "Toggle Heater";

            heatToggle = toggleWidget as ICheckbox;

            int tabIndex        = 0;
            var settingsContext = new SettingsContext(printer, null, NamedSettingsLayers.All);

            var settingsData   = SettingsOrganizer.Instance.GetSettingsData(SettingsKey.bed_temperature);
            var temperatureRow = SliceSettingsTabView.CreateItemRow(settingsData, settingsContext, printer, menuTheme, ref tabIndex, allUiFields);

            SliceSettingsRow.AddBordersToEditFields(temperatureRow);
            container.AddChild(temperatureRow);

            alwaysEnabled.Add(hotendRow);

            // add in the temp graph
            var graph = new DataViewGraph()
            {
                DynamicallyScaleRange = false,
                MinValue  = 0,
                ShowGoal  = true,
                GoalColor = ActiveTheme.Instance.PrimaryAccentColor,
                GoalValue = printer.Settings.GetValue <double>(SettingsKey.bed_temperature),
                MaxValue  = 150,             // could come from some profile value in the future
                Width     = widget.Width - 20,
                Height    = 35,              // this works better if it is a common multiple of the Width
                Margin    = new BorderDouble(0, 5, 0, 0),
            };

            var runningInterval = UiThread.SetInterval(() =>
            {
                graph.AddData(this.ActualTemperature);
            }, 1);

            this.Closed += (s, e) => runningInterval.Continue = false;

            var valueField  = temperatureRow.Descendants <MHNumberEdit>().FirstOrDefault();
            var settingsRow = temperatureRow.DescendantsAndSelf <SliceSettingsRow>().FirstOrDefault();

            PrinterSettings.SettingChanged.RegisterEvent((s, e) =>
            {
                if (e is StringEventArgs stringEvent)
                {
                    string settingsKey = stringEvent.Data;
                    if (this.allUiFields.TryGetValue(settingsKey, out UIField uifield))
                    {
                        string currentValue = settingsContext.GetValue(settingsKey);
                        if (uifield.Value != currentValue)
                        {
                            uifield.SetValue(
                                currentValue,
                                userInitiated: false);
                        }
                    }

                    if (stringEvent.Data == SettingsKey.bed_temperature)
                    {
                        var temp        = printer.Settings.GetValue <double>(SettingsKey.bed_temperature);
                        graph.GoalValue = temp;

                        // TODO: Why is this only when enabled? How does it get set to
                        if (heatToggle.Checked)
                        {
                            // TODO: Why is a UI widget who is listening to model events driving this behavior? What when it's not loaded?
                            SetTargetTemperature(temp);
                        }

                        settingsRow.UpdateStyle();
                    }
                }
                ;
            }, ref unregisterEvents);

            container.AddChild(graph);

            return(widget);
        }