Files
bodyshop-uploader/BodyshopUploader/Utils/Growls/GrowlNotification.xaml.cs
2020-01-17 11:03:11 -08:00

92 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace BodyshopUploader.Utils.Growls
{
public partial class GrowlNotification
{
private const byte MAX_NOTIFICATIONS = 4;
private int count;
public Notifications Notifications = new Notifications();
private readonly Notifications buffer = new Notifications();
public ViewModels.MainViewModel ShellVm;
public GrowlNotification(ViewModels.MainViewModel shellViewModel)
{
InitializeComponent();
ShellVm = shellViewModel;
NotificationsControl.DataContext = Notifications;
var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
this.Left = desktopWorkingArea.Right - 425;
//this.Top = desktopWorkingArea.Bottom - 425;
this.Top = 50;
}
public void AddNotification(Notification notification)
{
notification.Id = count++;
if (Notifications.Count + 1 > MAX_NOTIFICATIONS)
buffer.Add(notification);
else
Notifications.Add(notification);
//Show window if there're notifications
if (Notifications.Count > 0 && !IsActive)
Show();
}
public void RemoveNotification(Notification notification)
{
if (Notifications.Contains(notification))
Notifications.Remove(notification);
if (buffer.Count > 0)
{
Notifications.Add(buffer[0]);
buffer.RemoveAt(0);
}
//Close window if there's nothing to show
if (Notifications.Count < 1)
Hide();
}
private void NotificationWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
if (e.NewSize.Height != 0.0)
return;
var element = sender as Grid;
RemoveNotification(Notifications.First(
n => n.Id == Int32.Parse(element.Tag.ToString())));
}
private void NotificationWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Notification n = (Notification)((Grid)sender).DataContext;
BringWindowToFront();
RemoveNotification(n);
}
static void BringWindowToFront()
{
var currentProcess = Process.GetCurrentProcess();
var processes = Process.GetProcessesByName(currentProcess.ProcessName);
var process = processes.FirstOrDefault(p => p.Id == currentProcess.Id);
if (process == null) return;
SetForegroundWindow(process.MainWindowHandle);
}
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
}
}