예제 #1
0
        private void AddStandardUi(ThemeConfig theme)
        {
            var extensionArea = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.TabBarBackground,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(left: 8)
            };

            SearchPanel searchPanel = null;

            bool searchPanelOpenOnMouseDown = false;

            var searchButton = theme.CreateSearchButton();

            searchButton.Name       = "App Search Button";
            searchButton.MouseDown += (s, e) =>
            {
                searchPanelOpenOnMouseDown = searchPanel != null;
            };

            searchButton.Click += SearchButton_Click;
            extensionArea.AddChild(searchButton);

            async void SearchButton_Click(object sender, EventArgs e)
            {
                if (searchPanel == null && !searchPanelOpenOnMouseDown)
                {
                    void ShowSearchPanel()
                    {
                        searchPanel         = new SearchPanel(this.TabControl, searchButton, theme);
                        searchPanel.Closed += SearchPanel_Closed;

                        var systemWindow = this.Parents <SystemWindow>().FirstOrDefault();

                        systemWindow.ShowRightSplitPopup(
                            new MatePoint(searchButton),
                            new MatePoint(searchPanel),
                            borderWidth: 0);
                    }

                    if (HelpIndex.IndexExists)
                    {
                        ShowSearchPanel();
                    }
                    else
                    {
                        searchButton.Enabled = false;

                        try
                        {
                            // Show popover
                            var popover = new Popover(ArrowDirection.Up, 7, 5, 0)
                            {
                                TagColor = theme.AccentMimimalOverlay
                            };

                            popover.AddChild(new TextWidget("Preparing help".Localize() + "...", pointSize: theme.DefaultFontSize - 1, textColor: theme.TextColor));

                            popover.ArrowOffset = (int)(popover.Width - (searchButton.Width / 2));

                            this.Parents <SystemWindow>().FirstOrDefault().ShowPopover(
                                new MatePoint(searchButton)
                            {
                                Mate    = new MateOptions(MateEdge.Right, MateEdge.Bottom),
                                AltMate = new MateOptions(MateEdge.Right, MateEdge.Bottom),
                                Offset  = new RectangleDouble(12, 0, 12, 0)
                            },
                                new MatePoint(popover)
                            {
                                Mate    = new MateOptions(MateEdge.Right, MateEdge.Top),
                                AltMate = new MateOptions(MateEdge.Left, MateEdge.Bottom)
                            });

                            await Task.Run(async() =>
                            {
                                // Start index generation
                                await HelpIndex.RebuildIndex();

                                UiThread.RunOnIdle(() =>
                                {
                                    // Close popover
                                    popover.Close();

                                    // Continue to original task
                                    ShowSearchPanel();
                                });
                            });
                        }
                        catch
                        {
                        }

                        searchButton.Enabled = true;
                    }
                }
                else
                {
                    searchPanel?.CloseOnIdle();
                    searchPanelOpenOnMouseDown = false;
                }
            }

            void SearchPanel_Closed(object sender, EventArgs e)
            {
                // Unregister
                searchPanel.Closed -= SearchPanel_Closed;

                // Release
                searchPanel = null;
            }

            tabControl = new ChromeTabs(extensionArea, theme)
            {
                VAnchor         = VAnchor.Stretch,
                HAnchor         = HAnchor.Stretch,
                BackgroundColor = theme.BackgroundColor,
                BorderColor     = theme.MinimalShade,
                Border          = new BorderDouble(left: 1),
            };

            tabControl.PlusClicked += (s, e) => UiThread.RunOnIdle(() =>
            {
                this.CreatePartTab().ConfigureAwait(false);
            });

            // Force the ActionArea to be as high as ButtonHeight
            tabControl.TabBar.ActionArea.MinimumSize = new Vector2(0, theme.ButtonHeight);
            tabControl.TabBar.BackgroundColor        = theme.TabBarBackground;
            tabControl.TabBar.BorderColor            = theme.BackgroundColor;

            // Force common padding into top region
            tabControl.TabBar.Padding = theme.TabbarPadding.Clone(top: theme.TabbarPadding.Top * 2, bottom: 0);

            if (Application.EnableNetworkTraffic)
            {
                // add in the update available button
                updateAvailableButton = new LinkLabel("Update Available".Localize(), theme)
                {
                    Visible     = false,
                    Name        = "Update Available Link",
                    ToolTipText = "There is a new update available for download".Localize(),
                    VAnchor     = VAnchor.Center,
                    Margin      = new BorderDouble(10, 0)
                };

                // Register listeners
                UserSettings.Instance.SettingChanged += SetLinkButtonsVisibility;

                SetLinkButtonsVisibility(this, null);

                updateAvailableButton.Click += (s, e) =>
                {
                    UpdateControlData.Instance.CheckForUpdate();
                    DialogWindow.Show <CheckForUpdatesPage>();
                };

                tabControl.TabBar.ActionArea.AddChild(updateAvailableButton);

                UpdateControlData.Instance.UpdateStatusChanged.RegisterEvent((s, e) =>
                {
                    SetLinkButtonsVisibility(s, new StringEventArgs("Unknown"));
                }, ref unregisterEvents);
            }

            this.AddChild(tabControl);

            ApplicationController.Instance.NotifyPrintersTabRightElement(extensionArea);

            // Store tab
            tabControl.AddTab(
                new ChromeTab("Store", "Store".Localize(), tabControl, new StoreTabPage(theme), theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Store Tab",
                Padding     = new BorderDouble(15, 0),
            });

            // Library tab
            var libraryWidget = new LibraryWidget(this, theme)
            {
                BackgroundColor = theme.BackgroundColor
            };

            tabControl.AddTab(
                new ChromeTab("Library", "Library".Localize(), tabControl, libraryWidget, theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Library Tab",
                Padding     = new BorderDouble(15, 0),
            });

            // Hardware tab
            tabControl.AddTab(
                new ChromeTab(
                    "Hardware",
                    "Hardware".Localize(),
                    tabControl,
                    new HardwareTabPage(theme)
            {
                BackgroundColor = theme.BackgroundColor
            },
                    theme,
                    hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Hardware Tab",
                Padding     = new BorderDouble(15, 0),
            });

            SetInitialTab();

            var brandMenu = new BrandMenuButton(theme)
            {
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit,
                BackgroundColor = theme.TabBarBackground,
                Padding         = theme.TabbarPadding.Clone(right: theme.DefaultContainerPadding)
            };

            tabControl.TabBar.ActionArea.AddChild(brandMenu, 0);

            // Restore active workspace tabs
            foreach (var workspace in ApplicationController.Instance.Workspaces)
            {
                ChromeTab newTab;

                // Create and switch to new printer tab
                if (workspace.Printer?.Settings.PrinterSelected == true)
                {
                    newTab = this.CreatePrinterTab(workspace, theme);
                }
                else
                {
                    newTab = this.CreatePartTab(workspace);
                }

                if (newTab.Key == ApplicationController.Instance.MainTabKey)
                {
                    tabControl.ActiveTab = newTab;
                }

                tabControl.RefreshTabPointers();
            }

            statusBar = new Toolbar(theme)
            {
                HAnchor         = HAnchor.Stretch,
                VAnchor         = VAnchor.Absolute,
                Padding         = 1,
                Height          = 22,
                BackgroundColor = theme.BackgroundColor,
                Border          = new BorderDouble(top: 1),
                BorderColor     = theme.BorderColor20,
            };
            this.AddChild(statusBar);

            statusBar.ActionArea.VAnchor = VAnchor.Stretch;

            tasksContainer = new FlowLayoutWidget(FlowDirection.LeftToRight)
            {
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Stretch,
                BackgroundColor = theme.MinimalShade,
                Name            = "runningTasksPanel"
            };
            statusBar.AddChild(tasksContainer);

            stretchStatusPanel = new GuiWidget()
            {
                HAnchor         = HAnchor.Stretch,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(right: 3),
                Margin          = new BorderDouble(right: 2, top: 1, bottom: 1),
                Border          = new BorderDouble(1),
                BackgroundColor = theme.MinimalShade.WithAlpha(10),
                BorderColor     = theme.SlightShade,
                Width           = 200
            };
            statusBar.AddChild(stretchStatusPanel);

            var panelBackgroundColor = theme.MinimalShade.WithAlpha(10);

            statusBar.AddChild(
                this.CreateThemeStatusPanel(theme, panelBackgroundColor));

            statusBar.AddChild(
                this.CreateNetworkStatusPanel(theme));

            this.RenderRunningTasks(theme, ApplicationController.Instance.Tasks);
        }
예제 #2
0
        public SelectedObjectPanel(View3DWidget view3DWidget, BedConfig sceneContext, ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.HAnchor      = HAnchor.Stretch;
            this.VAnchor      = VAnchor.Top | VAnchor.Fit;
            this.Padding      = 0;
            this.view3DWidget = view3DWidget;
            this.theme        = theme;
            this.sceneContext = sceneContext;

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

            var scrollable = new ScrollableWidget(true)
            {
                Name    = "editorPanel",
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch,
            };

            scrollable.AddChild(this.ContentPanel);
            scrollable.ScrollArea.HAnchor = HAnchor.Stretch;

            this.AddChild(scrollable);

            var toolbar = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.TabBodyBackground,
                Padding         = theme.ToolbarPadding,
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit
            };

            var scene = sceneContext.Scene;

            // put in a make permanent button
            var icon        = AggContext.StaticData.LoadIcon("fa-check_16.png", 16, 16, theme.InvertIcons).SetPreMultiply();
            var applyButton = new IconButton(icon, theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Apply operation and make permanent".Localize(),
                Enabled     = scene.SelectedItem?.CanApply == true
            };

            applyButton.Click += (s, e) =>
            {
                this.item.Apply(view3DWidget.Scene.UndoBuffer);
                scene.SelectedItem = null;
            };
            scene.SelectionChanged += (s, e) => applyButton.Enabled = scene.SelectedItem?.CanApply == true;
            toolbar.AddChild(applyButton);

            // put in a remove button
            var removeButton = new IconButton(AggContext.StaticData.LoadIcon("close.png", 16, 16, theme.InvertIcons), theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Remove operation from parts".Localize()
            };

            removeButton.Click += (s, e) =>
            {
                var rootSelection = scene.SelectedItemRoot;

                item.Remove(view3DWidget.Scene.UndoBuffer);

                scene.SelectedItem = null;

                if (item != rootSelection)
                {
                    scene.SelectedItem = rootSelection;
                }
            };
            toolbar.AddChild(removeButton);

            var overflowButton = new OverflowBar.OverflowMenuButton(theme);

            overflowButton.Enabled  = scene.SelectedItem != null;
            scene.SelectionChanged += (s, e) => overflowButton.Enabled = scene.SelectedItem != null;

            overflowButton.PopupBorderColor    = ApplicationController.Instance.MenuTheme.GetBorderColor(120);
            overflowButton.DynamicPopupContent = () =>
            {
                return(ApplicationController.Instance.GetActionMenuForSceneItem(item, sceneContext.Scene));
            };
            toolbar.AddChild(overflowButton);

            editorPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Name    = "editorPanel",
                Padding = new BorderDouble(right: theme.DefaultContainerPadding + 1)
            };

            // Wrap editorPanel with scrollable container
            var scrollableWidget = new ScrollableWidget(true)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch
            };

            scrollableWidget.AddChild(editorPanel);
            scrollableWidget.ScrollArea.HAnchor = HAnchor.Stretch;
            scrollableWidget.Padding            = new BorderDouble(right: theme.DefaultContainerPadding * .8);

            editorSectionWidget = new ResizableSectionWidget("Editor", sceneContext.ViewState.SelectedObjectEditorHeight, scrollableWidget, theme, serializationKey: UserSettingsKey.EditorPanelExpanded, rightAlignedContent: toolbar, defaultExpansion: true)
            {
                VAnchor = VAnchor.Fit,
            };
            editorSectionWidget.Resized += (s, e) =>
            {
                sceneContext.ViewState.SelectedObjectEditorHeight = editorSectionWidget.ResizeContainer.Height;
            };

            int topBottom = theme.DefaultContainerPadding / 2;

            editorSectionWidget.ResizeContainer.Padding = new BorderDouble(left: theme.DefaultContainerPadding, top: topBottom, bottom: topBottom + editorSectionWidget.ResizeContainer.SplitterHeight);

            this.ContentPanel.AddChild(editorSectionWidget);

            var colorSection = new SectionWidget(
                "Color".Localize(),
                new ColorSwatchSelector(scene, theme, buttonSize: 16, buttonSpacing: new BorderDouble(1, 1, 0, 0))
            {
                Margin = new BorderDouble(left: 10)
            },
                theme,
                serializationKey: UserSettingsKey.ColorPanelExpanded)
            {
                Name = "Color Panel",
            };

            this.ContentPanel.AddChild(colorSection);

            var materialsSection = new SectionWidget("Materials".Localize(), new MaterialControls(scene, theme), theme, serializationKey: UserSettingsKey.MaterialsPanelExpanded)
            {
                Name = "Materials Panel",
            };

            this.ContentPanel.AddChild(materialsSection);

            // Enforce panel padding in sidebar
            foreach (var sectionWidget in this.ContentPanel.Children <SectionWidget>())
            {
                // Special case for editorResizeWrapper due to ResizeContainer
                if (sectionWidget is ResizableSectionWidget resizableSectionWidget)
                {
                    // Apply padding to ResizeContainer not wrapper
                    //resizableSectionWidget.ResizeContainer.Padding = new BorderDouble(10, 10, 10, 0);
                }
                else
                {
                    sectionWidget.ContentPanel.Padding   = new BorderDouble(10, 10, 10, 0);
                    sectionWidget.ExpandableWhenDisabled = true;
                    sectionWidget.Enabled = false;
                }
            }
        }
예제 #3
0
        public PartPreviewContent(ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.AnchorAll();

            var extensionArea = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.TabBarBackground,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(left: 8)
            };

            tabControl = new ChromeTabs(extensionArea, theme)
            {
                VAnchor         = VAnchor.Stretch,
                HAnchor         = HAnchor.Stretch,
                BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor,
                BorderColor     = theme.MinimalShade,
                Border          = new BorderDouble(left: 1),
                NewTabPage      = () =>
                {
                    return(new StartTabPage(this, theme));
                }
            };
            tabControl.ActiveTabChanged += (s, e) =>
            {
                if (this.tabControl.ActiveTab?.TabContent is PartTabPage tabPage)
                {
                    var dragDropData = ApplicationController.Instance.DragDropData;

                    // Set reference on tab change
                    dragDropData.View3DWidget = tabPage.view3DWidget;
                    dragDropData.SceneContext = tabPage.sceneContext;
                }
            };

            // Force the ActionArea to be as high as ButtonHeight
            tabControl.TabBar.ActionArea.MinimumSize = new Vector2(0, theme.ButtonHeight);
            tabControl.TabBar.BackgroundColor        = theme.TabBarBackground;
            tabControl.TabBar.BorderColor            = theme.ActiveTabColor;

            // Force common padding into top region
            tabControl.TabBar.Padding = theme.TabbarPadding.Clone(top: theme.TabbarPadding.Top * 2, bottom: 0);

            // add in a what's new button
            var seeWhatsNewButton = new LinkLabel("What's New...".Localize(), theme)
            {
                Name        = "What's New Link",
                ToolTipText = "See what's new in this version of MatterControl".Localize(),
                VAnchor     = VAnchor.Center,
                Margin      = new BorderDouble(10, 0),
                TextColor   = theme.Colors.PrimaryTextColor
            };

            seeWhatsNewButton.Click += (s, e) => UiThread.RunOnIdle(() =>
            {
                UserSettings.Instance.set(UserSettingsKey.LastReadWhatsNew, JsonConvert.SerializeObject(DateTime.Now));
                DialogWindow.Show(new HelpPage("What's New"));
            });

            tabControl.TabBar.ActionArea.AddChild(seeWhatsNewButton);

            // add in the update available button
            var updateAvailableButton = new LinkLabel("Update Available".Localize(), theme)
            {
                Visible = false,
            };

            // make the function inline so we don't have to create members for the buttons
            EventHandler SetLinkButtonsVisibility = (s, e) =>
            {
                if (UserSettings.Instance.HasLookedAtWhatsNew())
                {
                    // hide it
                    seeWhatsNewButton.Visible = false;
                }

                if (UpdateControlData.Instance.UpdateStatus == UpdateControlData.UpdateStatusStates.UpdateAvailable)
                {
                    updateAvailableButton.Visible = true;
                    // if we are going to show the update link hide the whats new link no matter what
                    seeWhatsNewButton.Visible = false;
                }
                else
                {
                    updateAvailableButton.Visible = false;
                }
            };

            UserSettings.Instance.Changed += SetLinkButtonsVisibility;
            Closed += (s, e) => UserSettings.Instance.Changed -= SetLinkButtonsVisibility;

            RunningInterval showUpdateInterval = null;

            updateAvailableButton.VisibleChanged += (s, e) =>
            {
                if (!updateAvailableButton.Visible)
                {
                    if (showUpdateInterval != null)
                    {
                        showUpdateInterval.Continue = false;
                        showUpdateInterval          = null;
                    }
                    return;
                }

                showUpdateInterval = UiThread.SetInterval(() =>
                {
                    double displayTime  = 1;
                    double pulseTime    = 1;
                    double totalSeconds = 0;
                    var textWidgets     = updateAvailableButton.Descendants <TextWidget>().Where((w) => w.Visible == true).ToArray();
                    Color startColor    = theme.Colors.PrimaryTextColor;
                    // Show a highlight on the button as the user did not click it
                    Animation flashBackground = null;
                    flashBackground           = new Animation()
                    {
                        DrawTarget      = updateAvailableButton,
                        FramesPerSecond = 10,
                        Update          = (s1, updateEvent) =>
                        {
                            totalSeconds += updateEvent.SecondsPassed;
                            if (totalSeconds < displayTime)
                            {
                                double blend = AttentionGetter.GetFadeInOutPulseRatio(totalSeconds, pulseTime);
                                var color    = new Color(startColor, (int)((1 - blend) * 255));
                                foreach (var textWidget in textWidgets)
                                {
                                    textWidget.TextColor = color;
                                }
                            }
                            else
                            {
                                foreach (var textWidget in textWidgets)
                                {
                                    textWidget.TextColor = startColor;
                                }
                                flashBackground.Stop();
                            }
                        }
                    };
                    flashBackground.Start();
                }, 120);
            };

            updateAvailableButton.Name = "Update Available Link";
            SetLinkButtonsVisibility(this, null);
            updateAvailableButton.ToolTipText = "There is a new update available for download".Localize();
            updateAvailableButton.VAnchor     = VAnchor.Center;
            updateAvailableButton.Margin      = new BorderDouble(10, 0);
            updateAvailableButton.Click      += (s, e) => UiThread.RunOnIdle(() =>
            {
                UiThread.RunOnIdle(() =>
                {
                    UpdateControlData.Instance.CheckForUpdate();
                    DialogWindow.Show <CheckForUpdatesPage>();
                });
            });

            tabControl.TabBar.ActionArea.AddChild(updateAvailableButton);

            UpdateControlData.Instance.UpdateStatusChanged.RegisterEvent(SetLinkButtonsVisibility, ref unregisterEvents);

            this.AddChild(tabControl);

            ActiveSliceSettings.SettingChanged.RegisterEvent((s, e) =>
            {
                if (e is StringEventArgs stringEvent &&
                    stringEvent.Data == SettingsKey.printer_name &&
                    printerTab != null)
                {
                    printerTab.Text = ActiveSliceSettings.Instance.GetValue(SettingsKey.printer_name);
                }
            }, ref unregisterEvents);

            ActiveSliceSettings.ActivePrinterChanged.RegisterEvent((s, e) =>
            {
                var activePrinter = ApplicationController.Instance.ActivePrinter;

                // If ActivePrinter has been nulled and a printer tab is open, close it
                var tab1 = tabControl.AllTabs.Skip(1).FirstOrDefault();
                if ((activePrinter == null || !activePrinter.Settings.PrinterSelected) &&
                    tab1?.TabContent is PrinterTabPage)
                {
                    tabControl.RemoveTab(tab1);
                }
                else
                {
                    this.CreatePrinterTab(activePrinter, theme);
                }
            }, ref unregisterEvents);

            ApplicationController.Instance.NotifyPrintersTabRightElement(extensionArea);

            // Show fixed start page
            tabControl.AddTab(
                new ChromeTab("Start".Localize(), tabControl, tabControl.NewTabPage(), theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Start Tab",
                Padding     = new BorderDouble(15, 0)
            });

            // Add a tab for the current printer
            if (ActiveSliceSettings.Instance.PrinterSelected)
            {
                this.CreatePrinterTab(ApplicationController.Instance.ActivePrinter, theme);
            }

            // Restore active tabs
            foreach (var bed in ApplicationController.Instance.Workspaces)
            {
                this.CreatePartTab("New Part", bed, theme);
            }
        }
        public MainViewWidget(ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.AnchorAll();
            this.theme           = theme;
            this.Name            = "PartPreviewContent";
            this.BackgroundColor = theme.BackgroundColor;

            // Push TouchScreenMode into GuiWidget
            GuiWidget.TouchScreenMode = UserSettings.Instance.IsTouchScreen;

            var extensionArea = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.TabBarBackground,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(left: 8)
            };

            tabControl = new ChromeTabs(extensionArea, theme)
            {
                VAnchor         = VAnchor.Stretch,
                HAnchor         = HAnchor.Stretch,
                BackgroundColor = theme.BackgroundColor,
                BorderColor     = theme.MinimalShade,
                Border          = new BorderDouble(left: 1),
            };

            tabControl.PlusClicked += (s, e) =>
            {
                UiThread.RunOnIdle(() =>
                {
                    this.CreatePartTab().ConfigureAwait(false);
                });
            };

            tabControl.ActiveTabChanged += (s, e) =>
            {
                if (this.tabControl.ActiveTab?.TabContent is PartTabPage tabPage)
                {
                    var dragDropData = ApplicationController.Instance.DragDropData;

                    // Set reference on tab change
                    dragDropData.View3DWidget = tabPage.view3DWidget;
                    dragDropData.SceneContext = tabPage.sceneContext;

                    ApplicationController.Instance.PrinterTabSelected = true;
                }
                else
                {
                    ApplicationController.Instance.PrinterTabSelected = false;
                }

                ApplicationController.Instance.MainTabKey = tabControl.SelectedTabKey;
            };

            // Force the ActionArea to be as high as ButtonHeight
            tabControl.TabBar.ActionArea.MinimumSize = new Vector2(0, theme.ButtonHeight);
            tabControl.TabBar.BackgroundColor        = theme.TabBarBackground;
            tabControl.TabBar.BorderColor            = theme.BackgroundColor;

            // Force common padding into top region
            tabControl.TabBar.Padding = theme.TabbarPadding.Clone(top: theme.TabbarPadding.Top * 2, bottom: 0);

            // add in a what's new button
            seeWhatsNewButton = new LinkLabel("What's New...".Localize(), theme)
            {
                Name        = "What's New Link",
                ToolTipText = "See what's new in this version of MatterControl".Localize(),
                VAnchor     = VAnchor.Center,
                Margin      = new BorderDouble(10, 0),
                TextColor   = theme.TextColor
            };
            seeWhatsNewButton.Click += (s, e) => UiThread.RunOnIdle(() =>
            {
                UserSettings.Instance.set(UserSettingsKey.LastReadWhatsNew, JsonConvert.SerializeObject(DateTime.Now));
                DialogWindow.Show(new HelpPage("What's New"));
            });

            tabControl.TabBar.ActionArea.AddChild(seeWhatsNewButton);

            // add in the update available button
            updateAvailableButton = new LinkLabel("Update Available".Localize(), theme)
            {
                Visible     = false,
                Name        = "Update Available Link",
                ToolTipText = "There is a new update available for download".Localize(),
                VAnchor     = VAnchor.Center,
                Margin      = new BorderDouble(10, 0)
            };

            // Register listeners
            UserSettings.Instance.SettingChanged += SetLinkButtonsVisibility;

            RunningInterval showUpdateInterval = null;

            updateAvailableButton.VisibleChanged += (s, e) =>
            {
                if (!updateAvailableButton.Visible)
                {
                    if (showUpdateInterval != null)
                    {
                        UiThread.ClearInterval(showUpdateInterval);
                        showUpdateInterval = null;
                    }
                    return;
                }

                showUpdateInterval = UiThread.SetInterval(() =>
                {
                    double displayTime  = 1;
                    double pulseTime    = 1;
                    double totalSeconds = 0;
                    var textWidgets     = updateAvailableButton.Descendants <TextWidget>().Where((w) => w.Visible == true).ToArray();
                    Color startColor    = theme.TextColor;
                    // Show a highlight on the button as the user did not click it
                    Animation flashBackground = null;
                    flashBackground           = new Animation()
                    {
                        DrawTarget      = updateAvailableButton,
                        FramesPerSecond = 10,
                        Update          = (s1, updateEvent) =>
                        {
                            totalSeconds += updateEvent.SecondsPassed;
                            if (totalSeconds < displayTime)
                            {
                                double blend = AttentionGetter.GetFadeInOutPulseRatio(totalSeconds, pulseTime);
                                var color    = new Color(startColor, (int)((1 - blend) * 255));
                                foreach (var textWidget in textWidgets)
                                {
                                    textWidget.TextColor = color;
                                }
                            }
                            else
                            {
                                foreach (var textWidget in textWidgets)
                                {
                                    textWidget.TextColor = startColor;
                                }
                                flashBackground.Stop();
                            }
                        }
                    };
                    flashBackground.Start();
                }, 120);
            };

            SetLinkButtonsVisibility(this, null);
            updateAvailableButton.Click += (s, e) => UiThread.RunOnIdle(() =>
            {
                UpdateControlData.Instance.CheckForUpdate();
                DialogWindow.Show <CheckForUpdatesPage>();
            });

            tabControl.TabBar.ActionArea.AddChild(updateAvailableButton);

            this.AddChild(tabControl);

            ApplicationController.Instance.NotifyPrintersTabRightElement(extensionArea);

            // Store tab
            tabControl.AddTab(
                new ChromeTab("Store", "Store".Localize(), tabControl, new StoreTabPage(theme), theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Store Tab",
                Padding     = new BorderDouble(15, 0),
            });

            // Library tab
            var libraryWidget = new LibraryWidget(this, theme)
            {
                BackgroundColor = theme.BackgroundColor
            };

            tabControl.AddTab(
                new ChromeTab("Library", "Library".Localize(), tabControl, libraryWidget, theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Library Tab",
                Padding     = new BorderDouble(15, 0),
            });

            // Hardware tab
            tabControl.AddTab(
                new ChromeTab(
                    "Hardware",
                    "Hardware".Localize(),
                    tabControl,
                    new HardwareTabPage(theme)
            {
                BackgroundColor = theme.BackgroundColor
            },
                    theme,
                    hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Hardware Tab",
                Padding     = new BorderDouble(15, 0),
            });

            if (ApplicationController.Instance.Workspaces.Count == 0)
            {
                this.CreatePartTab().ConfigureAwait(false);
            }

            string tabKey = ApplicationController.Instance.MainTabKey;

            if (string.IsNullOrEmpty(tabKey))
            {
                tabKey = "Hardware";
            }

            // HACK: Restore to the first printer tab if PrinterTabSelected and tabKey not found. This allows sign in/out to remain on the printer tab across different users
            if (!tabControl.AllTabs.Any(t => t.Key == tabKey) &&
                ApplicationController.Instance.PrinterTabSelected)
            {
                var key = tabControl.AllTabs.Where(t => t.TabContent is PrinterTabPage).FirstOrDefault()?.Key;
                if (key != null)
                {
                    tabKey = key;
                }
            }

            var brandMenu = new BrandMenuButton(theme)
            {
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit,
                BackgroundColor = theme.TabBarBackground,
                Padding         = theme.TabbarPadding.Clone(right: theme.DefaultContainerPadding)
            };

            tabControl.TabBar.ActionArea.AddChild(brandMenu, 0);

            // Restore active tabs
            foreach (var workspace in ApplicationController.Instance.Workspaces)
            {
                this.CreatePartTab(workspace);
            }

            tabControl.SelectedTabKey = tabKey;

            statusBar = new Toolbar(theme)
            {
                HAnchor         = HAnchor.Stretch,
                VAnchor         = VAnchor.Absolute,
                Padding         = 1,
                Height          = 22,
                BackgroundColor = theme.BackgroundColor,
                Border          = new BorderDouble(top: 1),
                BorderColor     = theme.BorderColor20,
            };
            this.AddChild(statusBar);

            statusBar.ActionArea.VAnchor = VAnchor.Stretch;

            tasksContainer = new FlowLayoutWidget(FlowDirection.LeftToRight)
            {
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Stretch,
                BackgroundColor = theme.MinimalShade,
                Name            = "runningTasksPanel"
            };
            statusBar.AddChild(tasksContainer);

            var tasks = ApplicationController.Instance.Tasks;

            tasks.TasksChanged += (s, e) =>
            {
                RenderRunningTasks(theme, tasks);
            };

            stretchStatusPanel = new GuiWidget()
            {
                HAnchor         = HAnchor.Stretch,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(right: 3),
                Margin          = new BorderDouble(right: 2, top: 1, bottom: 1),
                Border          = new BorderDouble(1),
                BackgroundColor = theme.MinimalShade.WithAlpha(10),
                BorderColor     = theme.SlightShade,
                Width           = 200
            };
            statusBar.AddChild(stretchStatusPanel);

            var panelBackgroundColor = theme.MinimalShade.WithAlpha(10);

            statusBar.AddChild(
                this.CreateThemeStatusPanel(theme, panelBackgroundColor));

            statusBar.AddChild(
                this.CreateNetworkStatusPanel(theme));

            this.RenderRunningTasks(theme, tasks);

            // Register listeners
            PrinterSettings.AnyPrinterSettingChanged           += Printer_SettingChanged;
            ApplicationController.Instance.OpenPrintersChanged += OpenPrinters_Changed;

            UpdateControlData.Instance.UpdateStatusChanged.RegisterEvent((s, e) =>
            {
                SetLinkButtonsVisibility(s, new StringEventArgs("Unknown"));
            }, ref unregisterEvents);

            ApplicationController.Instance.MainView = this;
        }
        public SelectedObjectPanel(View3DWidget view3DWidget, BedConfig sceneContext, ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.HAnchor      = HAnchor.Stretch;
            this.VAnchor      = VAnchor.Top | VAnchor.Fit;
            this.Padding      = 0;
            this.view3DWidget = view3DWidget;
            this.theme        = theme;
            this.sceneContext = sceneContext;

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

            var scrollable = new ScrollableWidget(true)
            {
                Name    = "editorPanel",
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch,
            };

            scrollable.AddChild(this.ContentPanel);
            scrollable.ScrollArea.HAnchor = HAnchor.Stretch;

            this.AddChild(scrollable);

            var toolbar = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.TabBodyBackground,
                Padding         = theme.ToolbarPadding,
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit
            };

            var scene = sceneContext.Scene;

            // put in a make permanent button
            var icon        = AggContext.StaticData.LoadIcon("fa-check_16.png", 16, 16, theme.InvertIcons).SetPreMultiply();
            var applyButton = new IconButton(icon, theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Apply operation and make permanent".Localize()
            };

            applyButton.Click += (s, e) =>
            {
                this.item.Apply(view3DWidget.Scene.UndoBuffer);
                scene.SelectedItem = null;
            };
            scene.SelectionChanged += (s, e) => applyButton.Enabled = scene.SelectedItem?.CanApply == true;
            toolbar.AddChild(applyButton);

            // put in a remove button
            var removeButton = new IconButton(AggContext.StaticData.LoadIcon("close.png", 16, 16, theme.InvertIcons), theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Remove operation from parts".Localize()
            };

            removeButton.Click += (s, e) =>
            {
                item.Remove(view3DWidget.Scene.UndoBuffer);
                scene.SelectedItem = null;
            };
            scene.SelectionChanged += (s, e) => removeButton.Enabled = scene.SelectedItem?.CanRemove == true;
            toolbar.AddChild(removeButton);

            var overflowButton = new OverflowBar.OverflowMenuButton(theme);

            overflowButton.PopupBorderColor    = ApplicationController.Instance.MenuTheme.GetBorderColor(120);
            overflowButton.DynamicPopupContent = () =>
            {
                var popupMenu = new PopupMenu(ApplicationController.Instance.MenuTheme);

                var menuItem = popupMenu.CreateMenuItem("Rename");
                menuItem.Click += (s, e) =>
                {
                    DialogWindow.Show(
                        new InputBoxPage(
                            "Rename Item".Localize(),
                            "Name".Localize(),
                            item.Name,
                            "Enter New Name Here".Localize(),
                            "Rename".Localize(),
                            (newName) =>
                    {
                        item.Name = newName;
                        editorSectionWidget.Text = newName;
                    }));
                };

                popupMenu.CreateHorizontalLine();

                if (true)                 //allowOperations)
                {
                    var selectedItemType = item.GetType();
                    var selectedItem     = item;

                    foreach (var nodeOperation in ApplicationController.Instance.Graph.Operations)
                    {
                        foreach (var type in nodeOperation.MappedTypes)
                        {
                            if (type.IsAssignableFrom(selectedItemType) &&
                                (nodeOperation.IsVisible?.Invoke(selectedItem) != false) &&
                                nodeOperation.IsEnabled?.Invoke(selectedItem) != false)
                            {
                                var button = popupMenu.CreateMenuItem(nodeOperation.Title, nodeOperation.IconCollector?.Invoke()?.CreateScaledImage(16, 16));
                                button.Click += (s, e) =>
                                {
                                    nodeOperation.Operation(selectedItem, sceneContext.Scene).ConfigureAwait(false);
                                };
                            }
                        }
                    }
                }

                return(popupMenu);
            };
            toolbar.AddChild(overflowButton);

            editorPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Padding = new BorderDouble(top: 10)
            };

            // Wrap editorPanel with scrollable container
            var scrollableWidget = new ScrollableWidget(true)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch
            };

            scrollableWidget.AddChild(editorPanel);
            scrollableWidget.ScrollArea.HAnchor = HAnchor.Stretch;

            editorSectionWidget = new ResizableSectionWidget("Editor", sceneContext.ViewState.SelectedObjectEditorHeight, scrollableWidget, theme, serializationKey: UserSettingsKey.EditorPanelExpanded, rightAlignedContent: toolbar, defaultExpansion: true)
            {
                VAnchor = VAnchor.Fit,
            };
            editorSectionWidget.Resized += (s, e) =>
            {
                sceneContext.ViewState.SelectedObjectEditorHeight = editorSectionWidget.ResizeContainer.Height;
            };

            this.ContentPanel.AddChild(editorSectionWidget);

            var colorSection = new SectionWidget(
                "Color".Localize(),
                new ColorSwatchSelector(scene, theme, buttonSize: 16, buttonSpacing: new BorderDouble(1, 1, 0, 0))
            {
                Margin = new BorderDouble(left: 10)
            },
                theme,
                serializationKey: UserSettingsKey.ColorPanelExpanded)
            {
                Name = "Color Panel",
            };

            this.ContentPanel.AddChild(colorSection);

            var materialsSection = new SectionWidget("Materials".Localize(), new MaterialControls(scene, theme), theme, serializationKey: UserSettingsKey.MaterialsPanelExpanded)
            {
                Name = "Materials Panel",
            };

            this.ContentPanel.AddChild(materialsSection);

            // Enforce panel padding in sidebar
            foreach (var sectionWidget in this.ContentPanel.Children <SectionWidget>())
            {
                // Special case for editorResizeWrapper due to ResizeContainer
                if (sectionWidget is ResizableSectionWidget resizableSectionWidget)
                {
                    // Apply padding to ResizeContainer not wrapper
                    resizableSectionWidget.ResizeContainer.Padding = new BorderDouble(10, 10, 10, 0);
                }
                else
                {
                    sectionWidget.ContentPanel.Padding   = new BorderDouble(10, 10, 10, 0);
                    sectionWidget.ExpandableWhenDisabled = true;
                    sectionWidget.Enabled = false;
                }
            }
        }
예제 #6
0
        public SelectedObjectPanel(View3DWidget view3DWidget, BedConfig sceneContext, ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.HAnchor      = HAnchor.Stretch;
            this.VAnchor      = VAnchor.Top | VAnchor.Fit;
            this.Padding      = 0;
            this.view3DWidget = view3DWidget;
            this.theme        = theme;
            this.sceneContext = sceneContext;

            var toolbar = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.ActiveTabColor,
                Padding         = theme.ToolbarPadding,
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit
            };

            var scene = sceneContext.Scene;

            // put in a make permanent button
            var icon          = AggContext.StaticData.LoadIcon("noun_766157.png", 16, 16, theme.InvertIcons).SetPreMultiply();
            var flattenButton = new IconButton(icon, theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Flatten".Localize(),
                Enabled     = scene.SelectedItem?.CanFlatten == true
            };

            flattenButton.Click += (s, e) =>
            {
                this.item.Flatten(view3DWidget.Scene.UndoBuffer);
                scene.SelectedItem = null;
            };
            toolbar.AddChild(flattenButton);

            // put in a remove button
            var removeButton = new IconButton(AggContext.StaticData.LoadIcon("remove.png", 16, 16, theme.InvertIcons), theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Delete".Localize(),
                Enabled     = scene.SelectedItem != null
            };

            removeButton.Click += (s, e) =>
            {
                var rootSelection = scene.SelectedItemRoot;

                var removeItem = item;
                removeItem.Remove(view3DWidget.Scene.UndoBuffer);

                scene.SelectedItem = null;

                // Only restore the root selection if it wasn't the item removed
                if (removeItem != rootSelection)
                {
                    scene.SelectedItem = rootSelection;
                }
            };
            toolbar.AddChild(removeButton);

            var overflowButton = new OverflowBar.OverflowMenuButton(theme)
            {
                Enabled          = scene.SelectedItem != null,
                PopupBorderColor = ApplicationController.Instance.MenuTheme.GetBorderColor(120)
            };

            overflowButton.DynamicPopupContent = () =>
            {
                return(ApplicationController.Instance.GetActionMenuForSceneItem(item, sceneContext.Scene, false));
            };
            toolbar.AddChild(overflowButton);

            editorPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Name    = "editorPanel",
                Padding = new BorderDouble(right: theme.DefaultContainerPadding + 1)
            };

            // Wrap editorPanel with scrollable container
            var scrollableWidget = new ScrollableWidget(true)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch
            };

            scrollableWidget.AddChild(editorPanel);
            scrollableWidget.ScrollArea.HAnchor = HAnchor.Stretch;

            editorSectionWidget = new SectionWidget("Editor", scrollableWidget, theme, toolbar, expandingContent: false, defaultExpansion: true, setContentVAnchor: false)
            {
                VAnchor = VAnchor.Stretch
            };
            this.AddChild(editorSectionWidget);

            this.ContentPanel   = editorPanel;
            editorPanel.Padding = new BorderDouble(theme.DefaultContainerPadding, 0);

            scene.SelectionChanged += (s, e) =>
            {
                if (editorPanel.Children.FirstOrDefault()?.DescendantsAndSelf <SectionWidget>().FirstOrDefault() is SectionWidget firstSectionWidget)
                {
                    firstSectionWidget.Margin = firstSectionWidget.Margin.Clone(top: 0);
                }

                var selectedItem = scene.SelectedItem;

                flattenButton.Enabled  = selectedItem?.CanFlatten == true;
                removeButton.Enabled   = selectedItem != null;
                overflowButton.Enabled = selectedItem != null;
            };
        }
예제 #7
0
        public SelectedObjectPanel(View3DWidget view3DWidget, ISceneContext sceneContext, ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.HAnchor      = HAnchor.Stretch;
            this.VAnchor      = VAnchor.Top | VAnchor.Fit;
            this.Padding      = 0;
            this.view3DWidget = view3DWidget;
            this.theme        = theme;
            this.sceneContext = sceneContext;

            var toolbar = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.BackgroundColor,
                Padding         = theme.ToolbarPadding,
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit
            };

            scene = sceneContext.Scene;

            // put in a make permanent button
            var icon = AggContext.StaticData.LoadIcon("noun_766157.png", 16, 16, theme.InvertIcons).SetPreMultiply();

            flattenButton = new IconButton(icon, theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Flatten".Localize(),
                Enabled     = true
            };
            flattenButton.Click += (s, e) =>
            {
                if (this.item.CanFlatten)
                {
                    var item = this.item;
                    using (new SelectionMaintainer(view3DWidget.Scene))
                    {
                        item.Flatten(view3DWidget.Scene.UndoBuffer);
                    }
                }
                else
                {
                    // try to ungroup it
                    sceneContext.Scene.UngroupSelection();
                }
            };
            toolbar.AddChild(flattenButton);

            // put in a remove button
            removeButton = new IconButton(AggContext.StaticData.LoadIcon("remove.png", 16, 16, theme.InvertIcons), theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Delete".Localize(),
                Enabled     = scene.SelectedItem != null
            };
            removeButton.Click += (s, e) =>
            {
                var item = this.item;
                using (new SelectionMaintainer(view3DWidget.Scene))
                {
                    item.Remove(view3DWidget.Scene.UndoBuffer);
                }
            };
            toolbar.AddChild(removeButton);

            primaryActionsPanel = new FlowLayoutWidget()
            {
                HAnchor = HAnchor.Fit,
                VAnchor = VAnchor.Center | VAnchor.Fit
            };

            toolbar.AddChild(primaryActionsPanel);

            overflowButton = new OverflowBar.OverflowMenuButton(theme)
            {
                Enabled = scene.SelectedItem != null,
            };
            overflowButton.DynamicPopupContent = () =>
            {
                var remainingOperations = ApplicationController.Instance.Graph.Operations.Values.Except(primaryActions);

                return(ApplicationController.Instance.GetActionMenuForSceneItem(item, sceneContext.Scene, false, remainingOperations));
            };
            toolbar.AddChild(overflowButton);

            editorPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Name    = "editorPanel",
                Padding = new BorderDouble(right: theme.DefaultContainerPadding + 1)
            };

            // Wrap editorPanel with scrollable container
            var scrollableWidget = new ScrollableWidget(true)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch
            };

            scrollableWidget.AddChild(editorPanel);
            scrollableWidget.ScrollArea.HAnchor = HAnchor.Stretch;

            editorSectionWidget = new SectionWidget(editorTitle, scrollableWidget, theme, toolbar, expandingContent: false, defaultExpansion: true, setContentVAnchor: false)
            {
                VAnchor = VAnchor.Stretch
            };
            this.AddChild(editorSectionWidget);

            this.ContentPanel   = editorPanel;
            editorPanel.Padding = new BorderDouble(theme.DefaultContainerPadding, 0);

            // Register listeners
            scene.SelectionChanged += Scene_SelectionChanged;
        }
예제 #8
0
        public SelectedObjectPanel(View3DWidget view3DWidget, ISceneContext sceneContext, ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.HAnchor      = HAnchor.Stretch;
            this.VAnchor      = VAnchor.Top | VAnchor.Fit;
            this.Padding      = 0;
            this.theme        = theme;
            this.sceneContext = sceneContext;

            var toolbar = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.BackgroundColor,
                Padding         = theme.ToolbarPadding,
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit
            };

            scene = sceneContext.Scene;

            // put in the container for dynamic actions
            primaryActionsPanel = new FlowLayoutWidget()
            {
                HAnchor = HAnchor.Fit,
                VAnchor = VAnchor.Center | VAnchor.Fit
            };

            toolbar.AddChild(primaryActionsPanel);

            // put in a make permanent button
            var icon = StaticData.Instance.LoadIcon("apply.png", 16, 16).SetToColor(theme.TextColor).SetPreMultiply();

            flattenButton = new IconButton(icon, theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Apply".Localize(),
                Enabled     = true
            };
            flattenButton.Click += (s, e) =>
            {
                if (this.item.CanFlatten)
                {
                    var item = this.item;
                    using (new SelectionMaintainer(view3DWidget.Scene))
                    {
                        item.Flatten(view3DWidget.Scene.UndoBuffer);
                    }
                }
                else
                {
                    // try to ungroup it
                    sceneContext.Scene.UngroupSelection();
                }
            };
            toolbar.AddChild(flattenButton);

            // put in a remove button
            removeButton = new IconButton(StaticData.Instance.LoadIcon("cancel.png", 16, 16).SetToColor(theme.TextColor).SetPreMultiply(), theme)
            {
                Margin      = theme.ButtonSpacing,
                ToolTipText = "Cancel".Localize(),
                Enabled     = scene.SelectedItem != null
            };
            removeButton.Click += (s, e) =>
            {
                var item = this.item;
                using (new SelectionMaintainer(view3DWidget.Scene))
                {
                    item.Remove(view3DWidget.Scene.UndoBuffer);
                }
            };
            toolbar.AddChild(removeButton);

            overflowButton = new OverflowBar.OverflowMenuButton(theme)
            {
                Enabled = scene.SelectedItem != null,
            };
            overflowButton.ToolTipText         = "Selected Object Options".Localize();
            overflowButton.DynamicPopupContent = () =>
            {
                return(ApplicationController.Instance.GetModifyMenu(view3DWidget.sceneContext));
            };
            toolbar.AddChild(overflowButton);

            editorPanel = new FlowLayoutWidget(FlowDirection.TopToBottom)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Fit,
                Name    = "editorPanel",
            };

            // Wrap editorPanel with scrollable container
            var scrollableWidget = new ScrollableWidget(true)
            {
                HAnchor = HAnchor.Stretch,
                VAnchor = VAnchor.Stretch
            };

            scrollableWidget.AddChild(editorPanel);
            scrollableWidget.ScrollArea.HAnchor = HAnchor.Stretch;

            editorSectionWidget = new SectionWidget(editorTitle, scrollableWidget, theme, toolbar, expandingContent: false, defaultExpansion: true, setContentVAnchor: false)
            {
                VAnchor = VAnchor.Stretch
            };
            this.AddChild(editorSectionWidget);

            this.ContentPanel = editorPanel;

            // Register listeners
            scene.SelectionChanged += Scene_SelectionChanged;
        }
예제 #9
0
        public MainViewWidget(ThemeConfig theme)
            : base(FlowDirection.TopToBottom)
        {
            this.AnchorAll();
            this.theme           = theme;
            this.Name            = "PartPreviewContent";
            this.BackgroundColor = theme.BackgroundColor;

            // Push TouchScreenMode into GuiWidget
            GuiWidget.TouchScreenMode = UserSettings.Instance.IsTouchScreen;

            var extensionArea = new LeftClipFlowLayoutWidget()
            {
                BackgroundColor = theme.TabBarBackground,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(left: 8)
            };

            tabControl = new ChromeTabs(extensionArea, theme)
            {
                VAnchor         = VAnchor.Stretch,
                HAnchor         = HAnchor.Stretch,
                BackgroundColor = theme.BackgroundColor,
                BorderColor     = theme.MinimalShade,
                Border          = new BorderDouble(left: 1),
            };

            tabControl.PlusClicked += (s, e) => UiThread.RunOnIdle(() =>
            {
                this.CreatePartTab().ConfigureAwait(false);
            });

            // Force the ActionArea to be as high as ButtonHeight
            tabControl.TabBar.ActionArea.MinimumSize = new Vector2(0, theme.ButtonHeight);
            tabControl.TabBar.BackgroundColor        = theme.TabBarBackground;
            tabControl.TabBar.BorderColor            = theme.BackgroundColor;

            // Force common padding into top region
            tabControl.TabBar.Padding = theme.TabbarPadding.Clone(top: theme.TabbarPadding.Top * 2, bottom: 0);

            if (Application.EnableNetworkTraffic)
            {
                // add in the update available button
                updateAvailableButton = new LinkLabel("Update Available".Localize(), theme)
                {
                    Visible     = false,
                    Name        = "Update Available Link",
                    ToolTipText = "There is a new update available for download".Localize(),
                    VAnchor     = VAnchor.Center,
                    Margin      = new BorderDouble(10, 0)
                };

                // Register listeners
                UserSettings.Instance.SettingChanged += SetLinkButtonsVisibility;

                SetLinkButtonsVisibility(this, null);

                updateAvailableButton.Click += (s, e) => UiThread.RunOnIdle(() =>
                {
                    UpdateControlData.Instance.CheckForUpdate();
                    DialogWindow.Show <CheckForUpdatesPage>();
                });

                tabControl.TabBar.ActionArea.AddChild(updateAvailableButton);

                UpdateControlData.Instance.UpdateStatusChanged.RegisterEvent((s, e) =>
                {
                    SetLinkButtonsVisibility(s, new StringEventArgs("Unknown"));
                }, ref unregisterEvents);
            }

            this.AddChild(tabControl);

            ApplicationController.Instance.NotifyPrintersTabRightElement(extensionArea);

            // Store tab
            tabControl.AddTab(
                new ChromeTab("Store", "Store".Localize(), tabControl, new StoreTabPage(theme), theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Store Tab",
                Padding     = new BorderDouble(15, 0),
            });

            // Library tab
            var libraryWidget = new LibraryWidget(this, theme)
            {
                BackgroundColor = theme.BackgroundColor
            };

            tabControl.AddTab(
                new ChromeTab("Library", "Library".Localize(), tabControl, libraryWidget, theme, hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Library Tab",
                Padding     = new BorderDouble(15, 0),
            });

            // Hardware tab
            tabControl.AddTab(
                new ChromeTab(
                    "Hardware",
                    "Hardware".Localize(),
                    tabControl,
                    new HardwareTabPage(theme)
            {
                BackgroundColor = theme.BackgroundColor
            },
                    theme,
                    hasClose: false)
            {
                MinimumSize = new Vector2(0, theme.TabButtonHeight),
                Name        = "Hardware Tab",
                Padding     = new BorderDouble(15, 0),
            });

            string tabKey = ApplicationController.Instance.MainTabKey;

            if (string.IsNullOrEmpty(tabKey))
            {
                tabKey = "Hardware";
            }

            // HACK: Restore to the first printer tab if PrinterTabSelected and tabKey not found. This allows sign in/out to remain on the printer tab across different users
            if (!tabControl.AllTabs.Any(t => t.Key == tabKey) &&
                ApplicationController.Instance.PrinterTabSelected)
            {
                var key = tabControl.AllTabs.Where(t => t.TabContent is PrinterTabPage).FirstOrDefault()?.Key;
                if (key != null)
                {
                    tabKey = key;
                }
            }

            var brandMenu = new BrandMenuButton(theme)
            {
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Fit,
                BackgroundColor = theme.TabBarBackground,
                Padding         = theme.TabbarPadding.Clone(right: theme.DefaultContainerPadding)
            };

            tabControl.TabBar.ActionArea.AddChild(brandMenu, 0);

            // Restore active workspace tabs
            foreach (var workspace in ApplicationController.Instance.Workspaces)
            {
                // Create and switch to new printer tab
                if (workspace.Printer?.Settings.PrinterSelected == true)
                {
                    tabControl.ActiveTab = this.CreatePrinterTab(workspace, theme);
                }
                else
                {
                    tabControl.ActiveTab = this.CreatePartTab(workspace);
                }

                tabControl.RefreshTabPointers();
            }

            tabControl.SelectedTabKey = tabKey;

            statusBar = new Toolbar(theme)
            {
                HAnchor         = HAnchor.Stretch,
                VAnchor         = VAnchor.Absolute,
                Padding         = 1,
                Height          = 22,
                BackgroundColor = theme.BackgroundColor,
                Border          = new BorderDouble(top: 1),
                BorderColor     = theme.BorderColor20,
            };
            this.AddChild(statusBar);

            statusBar.ActionArea.VAnchor = VAnchor.Stretch;

            tasksContainer = new FlowLayoutWidget(FlowDirection.LeftToRight)
            {
                HAnchor         = HAnchor.Fit,
                VAnchor         = VAnchor.Stretch,
                BackgroundColor = theme.MinimalShade,
                Name            = "runningTasksPanel"
            };
            statusBar.AddChild(tasksContainer);

            stretchStatusPanel = new GuiWidget()
            {
                HAnchor         = HAnchor.Stretch,
                VAnchor         = VAnchor.Stretch,
                Padding         = new BorderDouble(right: 3),
                Margin          = new BorderDouble(right: 2, top: 1, bottom: 1),
                Border          = new BorderDouble(1),
                BackgroundColor = theme.MinimalShade.WithAlpha(10),
                BorderColor     = theme.SlightShade,
                Width           = 200
            };
            statusBar.AddChild(stretchStatusPanel);

            var panelBackgroundColor = theme.MinimalShade.WithAlpha(10);

            statusBar.AddChild(
                this.CreateThemeStatusPanel(theme, panelBackgroundColor));

            statusBar.AddChild(
                this.CreateNetworkStatusPanel(theme));

            this.RenderRunningTasks(theme, ApplicationController.Instance.Tasks);

            // Register listeners
            PrinterSettings.AnyPrinterSettingChanged          += Printer_SettingChanged;
            ApplicationController.Instance.WorkspacesChanged  += Workspaces_Changed;
            ApplicationController.Instance.Tasks.TasksChanged += Tasks_TasksChanged;
            tabControl.ActiveTabChanged += TabControl_ActiveTabChanged;

            ApplicationController.Instance.ShellFileOpened += this.Instance_OpenNewFile;

            ApplicationController.Instance.MainView = this;
        }