diff --git a/MatterControlLib/SetupWizard/CarouselIndicators.cs b/MatterControlLib/SetupWizard/CarouselIndicators.cs new file mode 100644 index 000000000..7d6b36599 --- /dev/null +++ b/MatterControlLib/SetupWizard/CarouselIndicators.cs @@ -0,0 +1,111 @@ +/* +Copyright (c) 2018, Lars Brubaker, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using MatterHackers.Agg; +using MatterHackers.Agg.UI; + +namespace MatterHackers.MatterControl.Tour +{ + public class CarouselIndicators : FlowLayoutWidget + { + private ThemeConfig theme; + private int _activeIndex; + + public CarouselIndicators(ProductTour productTour, ThemeConfig theme) + { + this.Tour = productTour; + this.theme = theme; + + this.HAnchor = HAnchor.Fit; + this.VAnchor = VAnchor.Fit | VAnchor.Center; + + this.InactiveColor = theme.SlightShade; + this.ActiveColor = theme.PrimaryAccentColor; + this.HighlightColor = theme.PrimaryAccentColor; + + for (var i = 0; i < productTour.Count; i++) + { + this.AddChild(new StepIndicator(this, i) + { + //ToolTipText = productTour.Locations[i].Widget.Name ?? "" + }); + } + } + + public ProductTour Tour { get; } + + public int ActiveIndex + { + get => _activeIndex; + set + { + _activeIndex = value; + + Tour.ActiveIndex = value; + } + } + + public Color InactiveColor { get; set; } = Color.Black; + + public Color ActiveColor { get; set; } + + public Color HighlightColor { get; set; } = Color.White; + + private class StepIndicator : GuiWidget + { + private CarouselIndicators parent; + private int index; + + public StepIndicator(CarouselIndicators parent, int index) + { + this.HAnchor = HAnchor.Absolute; + this.VAnchor = VAnchor.Absolute; + this.parent = parent; + + this.index = index; + this.Width = 10; + this.Height = 10; + + this.Color = (parent.Tour.ActiveIndex == index) ? parent.ActiveColor : parent.InactiveColor; + } + + public Color Color { get; set; } = Color.Black; + + public Color HighlightColor { get; set; } = Color.White; + + public override void OnDraw(Graphics2D graphics2D) + { + //graphics2D.Circle(this.LocalBounds.Center, (this.Width - 3) / 2, this.FirstWidgetUnderMouse ? parent.HighlightColor : this.Color); + graphics2D.Circle(this.LocalBounds.Center, (this.Width - 3) / 2, this.Color); + + base.OnDraw(graphics2D); + } + } + } +} \ No newline at end of file diff --git a/MatterControlLib/SetupWizard/ProductTour.cs b/MatterControlLib/SetupWizard/ProductTour.cs index 4e08b9239..0fdb2b803 100644 --- a/MatterControlLib/SetupWizard/ProductTour.cs +++ b/MatterControlLib/SetupWizard/ProductTour.cs @@ -29,6 +29,7 @@ either expressed or implied, of the FreeBSD Project. using System.Collections.Generic; using System.Linq; +using MatterHackers.Agg; using MatterHackers.Agg.UI; namespace MatterHackers.MatterControl.Tour @@ -38,6 +39,7 @@ namespace MatterHackers.MatterControl.Tour private List tourLocations; private SystemWindow systemWindow; private ThemeConfig theme; + private int _activeIndex = -1; public ProductTour(SystemWindow topWindow, List tourLocations, ThemeConfig theme) { @@ -47,6 +49,8 @@ namespace MatterHackers.MatterControl.Tour this.theme = theme; } + public IReadOnlyList Locations => tourLocations; + public static async void StartTour() { var topWindow = ApplicationController.Instance.MainView.TopmostParent() as SystemWindow; @@ -84,7 +88,21 @@ namespace MatterHackers.MatterControl.Tour public int Count { get; } - public int ActiveIndex { get; private set; } = -1; + public int ActiveIndex + { + get =>_activeIndex; + set + { + if (_activeIndex != value) + { + _activeIndex = value; + this.ActiveItem = tourLocations[_activeIndex]; + + var tourOverlay = new TourOverlay(systemWindow, this, theme); + systemWindow.AddChild(tourOverlay); + } + } + } public TourLocation ActiveItem { get; private set; } @@ -96,10 +114,6 @@ namespace MatterHackers.MatterControl.Tour } this.ActiveIndex = locationIndex; - this.ActiveItem = tourLocations[locationIndex]; - - var tourOverlay = new TourOverlay(systemWindow, this, theme); - systemWindow.AddChild(tourOverlay); } } } \ No newline at end of file diff --git a/MatterControlLib/SetupWizard/TourPopover.cs b/MatterControlLib/SetupWizard/TourPopover.cs index d9701cfd6..0cf3e6d0f 100644 --- a/MatterControlLib/SetupWizard/TourPopover.cs +++ b/MatterControlLib/SetupWizard/TourPopover.cs @@ -205,11 +205,14 @@ namespace MatterHackers.MatterControl.Tour var buttonRow = new FlowLayoutWidget() { HAnchor = HAnchor.Stretch, - Margin = new BorderDouble(0, 0, 0, 5) + Margin = new BorderDouble(10, 0, 10, 5) }; body.AddChild(buttonRow); - var prevButton = theme.CreateDialogButton("Prev".Localize()); + var prevButton = new LinkLabel("Prev".Localize(), theme, pointSize: theme.DefaultFontSize - 2) + { + TextColor = theme.TextColor + }; prevButton.Click += (s, e) => { this.Parent.Close(); @@ -219,11 +222,14 @@ namespace MatterHackers.MatterControl.Tour buttonRow.AddChild(new HorizontalSpacer()); - buttonRow.AddChild(new TextWidget($"{productTour.ActiveIndex + 1} of {productTour.Count}", pointSize: theme.H1PointSize, textColor: theme.TextColor)); + buttonRow.AddChild(new CarouselIndicators(productTour, theme)); buttonRow.AddChild(new HorizontalSpacer()); - var nextButton = theme.CreateDialogButton("Next".Localize()); + var nextButton = new LinkLabel("Next".Localize(), theme, pointSize: theme.DefaultFontSize - 2) + { + TextColor = theme.TextColor + }; nextButton.Click += (s, e) => { this.Parent.Close();