Example #1
0
        void ConfigureLeaveActions(ToastAdorner adorner, ToastAdornerSettings settings, int lifetime, Action leaveAction, Action cancelAction)
        {
            if (lifetime - settings.LeaveTime <= 0)
            {
                return;
            }

            var leaveTimer = new Timer(lifetime - settings.LeaveTime);

            leaveTimer.Elapsed += (s, e) =>
            {
                leaveTimer?.Dispose();
                leaveTimer = null;

                void Leave()
                {
                    leaveAction?.Invoke();
                }

                Application.Current?.Dispatcher?.Invoke((ActionDelegate)Leave);
            };

            if (settings.RefreshLifetimeOnMouseOver)
            {
                adorner.MouseEnter += (s, e) =>
                {
                    leaveTimer?.Dispose();
                    leaveTimer = null;

                    void Cancel()
                    {
                        cancelAction?.Invoke();
                    }

                    Application.Current?.Dispatcher?.Invoke((ActionDelegate)Cancel);
                };

                adorner.MouseLeave += (s, e) =>
                {
                    leaveTimer          = new Timer(lifetime - settings.LeaveTime);
                    leaveTimer.Elapsed += (sender, args) =>
                    {
                        leaveTimer?.Dispose();
                        leaveTimer = null;

                        void Leave()
                        {
                            leaveAction?.Invoke();
                        }

                        Application.Current?.Dispatcher?.Invoke((ActionDelegate)Leave);
                    };
                    leaveTimer.Start();
                };
            }

            leaveTimer.AutoReset = false;
            leaveTimer.Start();
        }
Example #2
0
        void Configure(ToastAdorner adorner, ToastAdornerSettings settings, Action clickAction, string title, string message)
        {
            ConfigureClose(adorner, settings);
            ConfigureClickAction(adorner, settings, clickAction);
            var lifetime = settings.DynamicLifetime ? GetDynamicLifetime(settings, title, message) : settings.Lifetime;

            ConfigureRemove(adorner, settings, lifetime);
            ConfigureLeave(adorner, settings, lifetime);
        }
Example #3
0
 void ToastSettings_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     if (!(ToastSettings.SelectedItem is ToastAdornerSettings settings))
     {
         return;
     }
     Settings = settings;
     OnSettingChanged();
 }
Example #4
0
        ToastAdornerSettings GetToastSettings()
        {
            ToastAdornerSettings toastSettings = null;

            if (!string.IsNullOrWhiteSpace(Properties.Settings.Default.toastSettingsName))
            {
                toastSettings = _savedSettings.GetToastSettings(Properties.Settings.Default.toastSettingsName);
            }
            return(toastSettings ?? Defaults.DefaultSettings.DefaultToastSettings);
        }
Example #5
0
 void ConfigureClickAction(ToastAdorner adorner, ToastAdornerSettings settings, Action clickAction)
 {
     adorner.ToastView.MouseLeftButtonUp += (s, e) =>
     {
         clickAction();
         if (settings.CloseAfterClickAction)
         {
             Remove(adorner);
         }
     };
 }
Example #6
0
        void GetLeaveActions(ToastAdorner adorner, ToastAdornerSettings settings, int lifetime, out Action leaveAction, out Action cancelAction)
        {
            if (settings.LeaveTime <= 0 || lifetime - settings.LeaveTime <= 0)
            {
                leaveAction  = null;
                cancelAction = null;
                return;
            }

            var    elapsedStopwatch = new Stopwatch();
            double originalOpacity  = adorner.Opacity;
            double originalLeft     = adorner.Left;
            double originalTop      = adorner.Top;
            var    isLeaving        = false;

            switch (LeaveStyle)
            {
            case LeaveStyle.FadeOut:
                leaveAction  = () => Fade(originalOpacity, settings, adorner);
                cancelAction = () => CancelFade(adorner, originalOpacity);
                break;

            case LeaveStyle.SlideOut:
                leaveAction = () =>
                {
                    originalLeft = adorner.Left;
                    originalTop  = adorner.Top;

                    Slide(adorner, settings);
                    elapsedStopwatch.Start();
                    isLeaving = true;
                };
                cancelAction = () =>
                {
                    if (!isLeaving)
                    {
                        return;
                    }
                    isLeaving = false;
                    var elapsed = (int)elapsedStopwatch.ElapsedMilliseconds;
                    elapsedStopwatch.Reset();
                    CancelSlide(adorner, originalLeft, originalTop, elapsed);
                };
                break;

            case LeaveStyle.None:
                leaveAction  = null;
                cancelAction = null;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Example #7
0
        public void Initialize(ToastAdornerSettings settings, SavedSettings savedSettings)
        {
            Settings       = settings;
            _savedSettings = savedSettings;
            foreach (var setting in _savedSettings.ToastSettings)
            {
                ToastSettings.Items.Add(setting);
            }
            ToastSettings.SelectedItem = Settings;

            InitValues();
        }
Example #8
0
        void Delete_OnClick(object sender, RoutedEventArgs e)
        {
            if (Settings.Name == "default")
            {
                return;
            }

            _savedSettings.RemoveSettings(Settings);
            ToastSettings.Items.Remove(Settings);
            Settings = _savedSettings.ToastSettings.FirstOrDefault();
            ToastSettings.SelectedItem = Settings;
            OnSettingChanged();
        }
Example #9
0
        void AddToQueue(ToastAdorner adorner, ToastAdornerSettings toastSettings, Action clickAction, string title, string message)
        {
            var queueEntry = new ToastQueueEntry()
            {
                Adorner     = adorner,
                Settings    = toastSettings,
                ClickAction = clickAction,
                Title       = title,
                Message     = message
            };

            _queue.Enqueue(queueEntry);
        }
Example #10
0
        void ConfigureClose(ToastAdorner adorner, ToastAdornerSettings settings)
        {
            if (!settings.CanUserClose)
            {
                return;
            }

            adorner.CloseRequested += (s, e) => Remove(adorner);
            if (settings.CloseOnRightClick)
            {
                adorner.ToastView.MouseRightButtonUp += (s, e) => Remove(adorner);
            }
        }
Example #11
0
        void Fade(double originalOpacity, ToastAdornerSettings settings, ToastAdorner adorner)
        {
            void Animate()
            {
                var animation = new DoubleAnimation(
                    originalOpacity,
                    0,
                    GetLeaveTime(settings),
                    FillBehavior.Stop);

                adorner.BeginAnimation(UIElement.OpacityProperty, animation);
            }

            Application.Current?.Dispatcher?.Invoke((ActionDelegate)Animate);
        }
        static ToastAdornerSettings GetDefaultSettings(string name)
        {
            var settings = new ToastAdornerSettings(name)
            {
                CanUserClose          = true,
                CloseOnRightClick     = true,
                CloseAfterClickAction = true,
                Lifetime = 2500,
                RefreshLifetimeOnMouseOver = true,
                DynamicLifetime            = false,
                LeaveTime = 350
            };

            return(settings);
        }
Example #13
0
        void Slide(ToastAdorner adorner, ToastAdornerSettings settings)
        {
            double targetTop  = 0;
            double targetLeft = 0;

            void SetTargets()
            {
                targetTop  = adorner.Top;
                targetLeft = adorner.Left;

                if (LeaveDirection == Direction.Left)
                {
                    targetLeft = -adorner.ActualWidth;
                }
                else if (LeaveDirection == Direction.Right)
                {
                    targetLeft = GetWidth();
                }
                else if (LeaveDirection == Direction.Up)
                {
                    targetTop = -adorner.ActualHeight;
                }
                else if (LeaveDirection == Direction.Down)
                {
                    targetTop = GetHeight();
                }
                else
                {
                    throw new ArgumentOutOfRangeException();
                }
            }

            Application.Current?.Dispatcher?.Invoke((ActionDelegate)SetTargets);

            void Animate()
            {
                var horizontal = LeaveDirection == Direction.Left || LeaveDirection == Direction.Right;
                var animation  = new DoubleAnimation(
                    horizontal ? adorner.Left : adorner.Top,
                    horizontal ? targetLeft : targetTop,
                    GetLeaveTime(settings),
                    FillBehavior.Stop);

                adorner.BeginAnimation(horizontal ? ToastAdorner.LeftProperty : ToastAdorner.TopProperty, animation);
            }

            Application.Current?.Dispatcher?.Invoke((ActionDelegate)Animate);
        }
Example #14
0
 public ToastAdorner Show(
     string message,
     string title,
     Window window,
     ToastAdornerSettings toastSettings = null,
     UIElement toastView = null,
     Action clickAction  = null)
 {
     if (!_toasters.ContainsKey(window))
     {
         var toaster = new Toaster(window, _settings, _getDefaultView, _defaultToastSettings);
         toaster.IsEmpty += (s, e) => _toasters.Remove(window);
         _toasters.Add(window, toaster);
     }
     return(_toasters[window].Show(message, title, toastSettings, toastView, clickAction));
 }
Example #15
0
        public ToastSettingsView(ToastAdornerSettings settings, SavedSettings savedSettings)
        {
            InitializeComponent();

            if (_savedSettings != null)
            {
                foreach (var setting in _savedSettings.ToastSettings)
                {
                    ToastSettings.Items.Add(setting);
                }
            }

            _savedSettings = savedSettings;
            Settings       = settings;
            InitValues();
        }
Example #16
0
        public ToastAdorner Show(
            string message,
            string title,
            ToastAdornerSettings toastSettings = null,
            UIElement toastView = null,
            Action clickAction  = null)
        {
            if (toastSettings == null && DefaultToastSettings == null)
            {
                throw new ArgumentNullException(nameof(toastSettings), "Toast settings cannot be null if DefaultToastSettings has not been set.");
            }

            if (toastSettings == null)
            {
                toastSettings = DefaultToastSettings;
            }

            if (!toastSettings.CanUserClose && toastSettings.Lifetime <= 0)
            {
                throw new InvalidOperationException("Toast is configured to disallow user closing and to never expire.");
            }

            ToastAdorner adorner = null;

            void CreateAdorner()
            {
                adorner = new ToastAdorner(ElementToAdorn, toastView ?? _getDefaultView(title, message));
            }

            Application.Current?.Dispatcher?.Invoke((ActionDelegate)CreateAdorner);

            if (QueueToasts)
            {
                AddToQueue(adorner, toastSettings, clickAction, title, message);
                ProcessQueue();
            }
            else
            {
                Configure(adorner, toastSettings, clickAction, title, message);
                Add(adorner);
            }

            return(adorner);
        }
Example #17
0
        static void Show(
            string message,
            string title,
            Window window,
            ToastAdornerSettings settings,
            UIElement uiElement)
        {
            var adorner = ToasterManager.Show(
                message ?? string.Empty,
                title ?? string.Empty,
                window,
                settings,
                uiElement);

            if (adorner.ToastView is ToastView tv)
            {
                tv.CloseButtonClicked += (s, e) => adorner.RequestClose();
            }
        }
Example #18
0
        int GetDynamicLifetime(ToastAdornerSettings settings, string title, string message)
        {
            var lifetime =
                (
                    (string.IsNullOrEmpty(title) ? 0 : title.Length) +
                    (string.IsNullOrEmpty(message) ? 0 : message.Length)
                ) * settings.DynamicLifetimeMillisecondsPerCharacter +
                settings.DynamicLifetimeBase;

            if (lifetime < settings.DynamicLifetimeMinimum)
            {
                lifetime = settings.DynamicLifetimeMinimum;
            }
            if (settings.DynamicLifetimeMaximum > 0 && lifetime > settings.DynamicLifetimeMaximum)
            {
                lifetime = settings.DynamicLifetimeMaximum;
            }
            return(lifetime);
        }
Example #19
0
        void SaveAs_OnClick(object sender, RoutedEventArgs e)
        {
            var getName = new GetNameView();

            getName.ShowDialog();
            if (string.IsNullOrWhiteSpace(getName.SelectedName))
            {
                return;
            }

            if (_savedSettings.ToastSettings.Any(p => p.Name == getName.SelectedName))
            {
                MessageBox.Show("A settings file with that name already exists.");
                return;
            }

            Settings          = Settings.Clone(getName.SelectedName);
            SettingsName.Text = getName.SelectedName;
            DoSave();
            _savedSettings.AddSettings(Settings);
            ToastSettings.Items.Add(Settings);
            OnSettingChanged();
        }
Example #20
0
        void ConfigureRemove(ToastAdorner adorner, ToastAdornerSettings settings, int lifetime)
        {
            if (lifetime <= 0)
            {
                return;
            }

            var lifetimeTimer = new Timer(lifetime);

            lifetimeTimer.Elapsed += (s, e) =>
            {
                Remove(adorner);
                lifetimeTimer.Dispose();
            };

            if (settings.RefreshLifetimeOnMouseOver)
            {
                adorner.MouseEnter += (s, e) => lifetimeTimer.Stop();
                adorner.MouseLeave += (s, e) => lifetimeTimer.Start();
            }

            lifetimeTimer.AutoReset = false;
            lifetimeTimer.Start();
        }
Example #21
0
 public ToasterManager(ToasterSettings settings = null, Func <string, string, UIElement> getDefaultView = null, ToastAdornerSettings defaultToastSettings = null)
 {
     _settings             = settings;
     _getDefaultView       = getDefaultView;
     _defaultToastSettings = defaultToastSettings;
 }
Example #22
0
 Duration GetLeaveTime(ToastAdornerSettings settings)
 {
     return(new Duration(new TimeSpan(0, 0, 0, 0, settings.LeaveTime)));
 }
Example #23
0
 public Toaster(Window window, ToasterSettings settings = null, Func <string, string, UIElement> getDefaultView = null, ToastAdornerSettings defaultToastSettings = null)
 {
     _getDefaultView      = getDefaultView ?? DefaultSettings.GetDefaultToastViewFunc;
     _adornerLayer        = GetWindowAdornerLayer(window, out var elementToAdorn);
     _settings            = settings ?? DefaultSettings.DefaultToasterSettings;
     DefaultToastSettings = defaultToastSettings ?? DefaultSettings.DefaultToastSettings;
     ElementToAdorn       = elementToAdorn;
     Window = window;
 }
Example #24
0
 void ConfigureLeave(ToastAdorner adorner, ToastAdornerSettings settings, int lifetime)
 {
     GetLeaveActions(adorner, settings, lifetime, out var leaveAction, out var cancelAction);
     ConfigureLeaveActions(adorner, settings, lifetime, leaveAction, cancelAction);
 }