using MahApps.Metro.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
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.Navigation;
using System.Windows.Shapes;
using Tango.Core.DI;
using Tango.FSE.Common;
using Tango.FSE.Common.FSEApplication;
using Tango.FSE.Common.Resolution;
using Tango.FSE.UI.DemoMode;
using Tango.Settings;
namespace Tango.FSE.UI
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : MetroWindow
{
public static MainWindow Instance { get; set; }
private Point _startPoint;
private bool _isMouseDown;
private FSESettings _settings;
private IResolutionService _resolutionService;
public MainWindow()
{
Instance = this;
InitializeComponent();
_settings = SettingsManager.Default.GetOrCreate();
ApplyAdaptiveTransform();
IFSEApplicationManager appManager = TangoIOC.Default.GetInstance();
ContentRendered += (_, __) =>
{
if (appManager.DemoMode)
{
DemoModeWindow demoWindow = new DemoModeWindow();
demoWindow.Show();
}
};
Closing += (x, e) =>
{
e.Cancel = true;
appManager.ShutDown();
};
btnMinimize.Click += (_, __) => WindowState = WindowState.Minimized;
btnMaximize.Click += (_, __) => WindowState = WindowState == WindowState.Maximized ? WindowState = WindowState.Normal : WindowState = WindowState.Maximized;
btnClose.Click += (_, __) => Close();
gridTitle.MouseLeftButtonDown += (x, e) =>
{
Mouse.Capture(gridTitle);
_startPoint = e.GetPosition(this);
if (e.ClickCount > 1 && appManager.DisplayWindowControls)
{
WindowState = WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal;
return;
}
_isMouseDown = true;
};
gridTitle.MouseLeftButtonUp += (x, e) =>
{
_isMouseDown = false;
gridTitle.ReleaseMouseCapture();
};
gridTitle.MouseMove += GridTitle_MouseMove;
StateChanged += MainWindow_StateChanged;
}
private void MainWindow_StateChanged(object sender, EventArgs e)
{
if (WindowState == WindowState.Maximized)
{
btnMaximize.Icon = MaterialDesignThemes.Wpf.PackIconKind.WindowRestore;
_settings.WindowMaximizedOnStartup = true;
_settings.Save();
}
else if (WindowState == WindowState.Normal)
{
btnMaximize.Icon = MaterialDesignThemes.Wpf.PackIconKind.WindowMaximize;
_settings.WindowMaximizedOnStartup = false;
_settings.Save();
}
}
private void GridTitle_MouseMove(object sender, MouseEventArgs e)
{
if (_isMouseDown)
{
if (WindowState == WindowState.Maximized)
{
var previousWidth = Width;
WindowState = WindowState.Normal;
var currentWidth = Width;
var locationPrecentageBefore = _startPoint.X / previousWidth;
var newLocationX = currentWidth * locationPrecentageBefore;
_startPoint = new Point(newLocationX, _startPoint.Y);
}
else
{
Point pointToWindow = Mouse.GetPosition(this);
Point pointToScreen = PointToScreen(pointToWindow);
Left = pointToScreen.X - _startPoint.X;
Top = pointToScreen.Y - _startPoint.Y;
}
}
}
private void ApplyAdaptiveTransform()
{
var resolution = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size;
if (_resolutionService == null)
{
_resolutionService = TangoIOC.Default.GetInstance();
}
if (_settings.EnableAdaptiveScaling && resolution.Width < 1600)
{
_resolutionService.AdaptiveScalingMode = true;
var grid = mainGrid;
grid.Width = 1920;
grid.Height = 1040;
Content = null;
Content = new Viewbox()
{
Child = mainGrid,
Stretch = Stretch.Fill,
};
var ratio = 1280d / 720d;
MinWidth = resolution.Width / (1920d / 1280d);
MinHeight = MinWidth / ratio;
Width = resolution.Width - 100;
Height = Width / ratio;
}
else
{
IgnoreTaskbarOnMaximize = resolution.Height <= 768; //Allow full screen when resolution is small.
}
if (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height < Height)
{
Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
}
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
//Add this to keep aspect ratio when AdaptiveTransform
//if (_resolutionService.AdaptiveTransformMode)
//{
// var aspect = 1920d / 1040d;
// if (sizeInfo.WidthChanged) this.Width = sizeInfo.NewSize.Height * aspect;
// else this.Height = sizeInfo.NewSize.Width / aspect;
//}
}
}
}