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; //} } } }