using System; using System.ComponentModel; using System.Windows; using System.Windows.Input; using System.Windows.Threading; namespace WarframeClock { /// /// Interaction logic for OverlayWindow.xaml /// public partial class OverlayWindow : OverlayWindowBase { private readonly OverlayWindowViewModel _vm; private readonly DispatcherTimer _updateTimer; public OverlayWindow(OverlayWindowViewModel vm) { InitializeComponent(); DataContext = _vm = vm; _vm.PropertyChanged += OnVmPropertyChanged; _updateTimer = new DispatcherTimer(TimeSpan.FromMilliseconds(100), DispatcherPriority.Background, (_, __) => AdjustOverlay(), Dispatcher.CurrentDispatcher); } protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); _updateTimer.Start(); } protected override void OnClosed(EventArgs e) { base.OnClosed(e); _updateTimer.Stop(); _vm.PropertyChanged -= OnVmPropertyChanged; } private void OnVmPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(OverlayWindowViewModel.Standalone) && _vm.Standalone) { (App.Current.MainWindow = new StandaloneOverlayWindow(_vm)).Show(); Close(); } } private Point _dragOriginalPosition; private bool _dragStarted; private Point _dragOffset; private void OverlayLabelOverlay_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (!_vm.SettingsMode) return; _dragStarted = true; _dragOriginalPosition = OverlayLabelOverlay.TranslatePoint(new Point(0, 0), this); _dragOffset = e.GetPosition(this); ((UIElement)sender).CaptureMouse(); } private void OverlayLabelOverlay_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (!_vm.SettingsMode) return; if (_dragStarted) { ((UIElement)sender).ReleaseMouseCapture(); _dragStarted = false; } } private void OverlayLabelOverlay_MouseMove(object sender, MouseEventArgs e) { if (!_vm.SettingsMode) return; if (_dragStarted) { var p = e.GetPosition(this); var newX = _dragOriginalPosition.X + p.X - _dragOffset.X; if (newX <= ActualWidth / 2) { Settings.DockToX = Settings.AlignmentX.Left; Settings.MarginX = newX; } else { Settings.DockToX = Settings.AlignmentX.Right; Settings.MarginX = ActualWidth - newX - OverlayLabelOverlay.ActualWidth; } var newY = _dragOriginalPosition.Y + p.Y - _dragOffset.Y; if (newY <= ActualHeight / 2) { Settings.DockToY = Settings.AlignmentY.Top; Settings.MarginY = newY; } else { Settings.DockToY = Settings.AlignmentY.Bottom; Settings.MarginY = ActualHeight - newY - OverlayLabelOverlay.ActualHeight; } _vm.RefreshPosition(); } } } }