using Microsoft.Extensions.DependencyInjection;
using PixiEditor.Helpers.Extensions;
using PixiEditor.Models.DataHolders;
using PixiEditor.Models.UserPreferences;
using PixiEditor.ViewModels;
using PixiEditor.Views.Dialogs;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
namespace PixiEditor
{
///
/// Interaction logic for MainWindow.xaml.
///
public partial class MainWindow : Window
{
private static WriteableBitmap pixiEditorLogo;
private readonly IPreferences preferences;
public new ViewModelMain DataContext { get => (ViewModelMain)base.DataContext; set => base.DataContext = value; }
public MainWindow()
{
IServiceProvider services = new ServiceCollection()
.AddPixiEditor()
.BuildServiceProvider();
preferences = services.GetRequiredService();
DataContext = services.GetRequiredService();
DataContext.Setup(services);
InitializeComponent();
pixiEditorLogo = BitmapFactory.FromResource(@"/Images/PixiEditorLogo.png");
UpdateWindowChromeBorderThickness();
StateChanged += MainWindow_StateChanged;
Activated += MainWindow_Activated;
DataContext.CloseAction = Close;
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
DataContext.BitmapManager.DocumentChanged += BitmapManager_DocumentChanged;
preferences.AddCallback("ImagePreviewInTaskbar", x =>
{
if (x)
{
UpdateTaskbarIcon(DataContext.BitmapManager.ActiveDocument);
}
else
{
UpdateTaskbarIcon(null);
}
});
}
protected override void OnClosing(CancelEventArgs e)
{
DataContext.CloseWindow(e);
DataContext.DiscordViewModel.Dispose();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
((HwndSource)PresentationSource.FromVisual(this)).AddHook(Helpers.WindowSizeHelper.SetMaxSizeHook);
}
[Conditional("RELEASE")]
private static void CloseHelloThereIfRelease()
{
Application.Current.Windows.OfType().ToList().ForEach(x => { if (!x.IsClosing) x.Close(); });
}
private void BitmapManager_DocumentChanged(object sender, Models.Events.DocumentChangedEventArgs e)
{
if (preferences.GetPreference("ImagePreviewInTaskbar", false))
{
UpdateTaskbarIcon(e.NewDocument);
}
}
private void UpdateTaskbarIcon(Document document)
{
if (document?.PreviewImage == null)
{
Icon = pixiEditorLogo;
return;
}
var previewCopy = document.PreviewImage.Clone()
.Resize(512, 512, WriteableBitmapExtensions.Interpolation.NearestNeighbor);
previewCopy.Blit(new Rect(256, 256, 256, 256), pixiEditorLogo, new Rect(0, 0, 512, 512));
Icon = previewCopy;
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void CommandBinding_Executed_Minimize(object sender, ExecutedRoutedEventArgs e)
{
SystemCommands.MinimizeWindow(this);
}
private void CommandBinding_Executed_Maximize(object sender, ExecutedRoutedEventArgs e)
{
SystemCommands.MaximizeWindow(this);
}
private void CommandBinding_Executed_Restore(object sender, ExecutedRoutedEventArgs e)
{
SystemCommands.RestoreWindow(this);
}
private void CommandBinding_Executed_Close(object sender, ExecutedRoutedEventArgs e)
{
SystemCommands.CloseWindow(this);
}
private void MainWindow_Activated(object sender, EventArgs e)
{
CloseHelloThereIfRelease();
}
private void UpdateWindowChromeBorderThickness()
{
if (WindowState == WindowState.Maximized)
{
windowsChrome.ResizeBorderThickness = new Thickness(0, 0, 0, 0);
}
else
{
windowsChrome.ResizeBorderThickness = new Thickness(5, 5, 5, 5);
}
}
private void MainWindow_StateChanged(object sender, EventArgs e)
{
UpdateWindowChromeBorderThickness();
if (WindowState == WindowState.Maximized)
{
RestoreButton.Visibility = Visibility.Visible;
MaximizeButton.Visibility = Visibility.Collapsed;
}
else
{
RestoreButton.Visibility = Visibility.Collapsed;
MaximizeButton.Visibility = Visibility.Visible;
}
}
private void MainWindow_Initialized(object sender, EventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += (sender, e) => Helpers.CrashHelper.SaveCrashInfo((Exception)e.ExceptionObject);
}
private void MainWindow_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
DataContext.FileSubViewModel.Open(files[0]);
}
}
}
}