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(); }
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); }
void ToastSettings_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (!(ToastSettings.SelectedItem is ToastAdornerSettings settings)) { return; } Settings = settings; OnSettingChanged(); }
ToastAdornerSettings GetToastSettings() { ToastAdornerSettings toastSettings = null; if (!string.IsNullOrWhiteSpace(Properties.Settings.Default.toastSettingsName)) { toastSettings = _savedSettings.GetToastSettings(Properties.Settings.Default.toastSettingsName); } return(toastSettings ?? Defaults.DefaultSettings.DefaultToastSettings); }
void ConfigureClickAction(ToastAdorner adorner, ToastAdornerSettings settings, Action clickAction) { adorner.ToastView.MouseLeftButtonUp += (s, e) => { clickAction(); if (settings.CloseAfterClickAction) { Remove(adorner); } }; }
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(); } }
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(); }
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(); }
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); }
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); } }
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); }
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); }
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)); }
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(); }
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); }
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(); } }
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); }
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(); }
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(); }
public ToasterManager(ToasterSettings settings = null, Func <string, string, UIElement> getDefaultView = null, ToastAdornerSettings defaultToastSettings = null) { _settings = settings; _getDefaultView = getDefaultView; _defaultToastSettings = defaultToastSettings; }
Duration GetLeaveTime(ToastAdornerSettings settings) { return(new Duration(new TimeSpan(0, 0, 0, 0, settings.LeaveTime))); }
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; }
void ConfigureLeave(ToastAdorner adorner, ToastAdornerSettings settings, int lifetime) { GetLeaveActions(adorner, settings, lifetime, out var leaveAction, out var cancelAction); ConfigureLeaveActions(adorner, settings, lifetime, leaveAction, cancelAction); }