Пример #1
0
 /// <summary>
 /// Begins a storyboard and waits for it to complete.
 /// </summary>
 public static async Task BeginAsync(this Storyboard storyboard)
 {
     await EventAsync.FromEvent <object>(
         eh => storyboard.Completed += eh,
         eh => storyboard.Completed -= eh,
         storyboard.Begin);
 }
Пример #2
0
        /// <summary>
        /// Waits for the element to load (construct and add to the main object tree).
        /// </summary>
        public static async Task WaitForLoadedAsync(this FrameworkElement frameworkElement)
        {
            if (frameworkElement.IsInVisualTree())
            {
                return;
            }

            await EventAsync.FromRoutedEvent(
                eh => frameworkElement.Loaded += eh,
                eh => frameworkElement.Loaded -= eh);
        }
Пример #3
0
        public void when_event_fires_then_the_action_is_executed()
        {
            var testScheduler = new CurrentThreadTaskScheduler();

            var stub = new StubClassWithEvent();

            var result = false;

            EventAsync.FromEvent(eh => stub.NoPayload += eh, eh => stub.NoPayload -= eh)
            .Do(() => result = true, testScheduler);

            stub.FireNoPayloadEvent();

            Assert.That(result, Is.True);
        }
Пример #4
0
        public void when_payload_event_is_fired_twice_then_the_second_time_the_event_is_not_recieved()
        {
            var testScheduler = new CurrentThreadTaskScheduler();

            var stub = new StubClassWithEvent();

            var count = 0;

            EventAsync.FromEvent <DataEventArgs <Guid> >(eh => stub.Payload += eh, eh => stub.Payload -= eh)
            .Do(_ => count++, testScheduler);

            stub.FirePayloadEvent(Guid.NewGuid());
            stub.FirePayloadEvent(Guid.NewGuid());

            Assert.That(count, Is.EqualTo(1));
        }
Пример #5
0
        private void ConnectUpClosing(IViewModel viewModel, Window window)
        {
            var supportClosing = viewModel as ISupportClosing;

            if (supportClosing == null)
            {
                return;
            }

            // ViewModel is closed, so close the Window
            supportClosing.ExecuteOnClosed(() => Task.Factory.StartNew(() => window.Close(), _scheduler.Dispatcher.TPL));

            // Window is closed, so close the ViewModel
            EventAsync.FromEvent(eh => window.Closed += eh, eh => window.Closed -= eh)
            .Do(() => supportClosing.ClosingStrategy.Close(), _scheduler.Dispatcher.TPL);
        }
Пример #6
0
        public void when_payload_event_fires_then_the_action_is_executed_and_the_payload_is_passed_through()
        {
            var testScheduler = new CurrentThreadTaskScheduler();

            var stub = new StubClassWithEvent();

            var result = Guid.Empty;

            EventAsync.FromEvent <DataEventArgs <Guid> >(eh => stub.Payload += eh, eh => stub.Payload -= eh)
            .Do(payload => result = payload.Value, testScheduler);

            var expected = Guid.NewGuid();

            stub.FirePayloadEvent(expected);

            Assert.That(result.Equals(expected), Is.True);
        }
Пример #7
0
        /// <summary>
        /// Scrolls to horizontal offset asynchronously.
        /// </summary>
        /// <param name="scrollViewer">The scroll viewer.</param>
        /// <param name="offset">The offset.</param>
        /// <returns>The task that completes when scrolling is complete.</returns>
        public static async Task ScrollToHorizontalOffsetAsync(this ScrollViewer scrollViewer, double offset)
        {
            if (offset < 0)
            {
                offset = 0;
            }

            if (offset > scrollViewer.ScrollableWidth)
            {
                offset = scrollViewer.ScrollableWidth;
            }

            var currentOffset = scrollViewer.HorizontalOffset;

            // ReSharper disable CompareOfFloatsByEqualityOperator
            if (offset == currentOffset)
            {
                return;
            }

            scrollViewer.ScrollToHorizontalOffset(offset);

            if (scrollViewer.HorizontalOffset == offset)
            {
                return;
            }

            if (scrollViewer.HorizontalOffset != currentOffset)
            {
                return;
            }
            // ReSharper restore CompareOfFloatsByEqualityOperator

            await EventAsync.FromEvent <ScrollViewerViewChangedEventArgs>(
                eh => scrollViewer.ViewChanged += eh,
                eh => scrollViewer.ViewChanged -= eh);
        }
Пример #8
0
        /// <summary>
        /// Scrolls to vertical offset with animation asynchronously.
        /// </summary>
        /// <param name="scrollViewer">The scroll viewer.</param>
        /// <param name="offset">The offset.</param>
        /// <returns>The task that completes when scrolling is complete.</returns>
        public static async Task ScrollToVerticalOffsetWithAnimationAsync(this ScrollViewer scrollViewer, double offset)
        {
            if (offset < 0)
            {
                offset = 0;
            }

            if (offset > scrollViewer.ScrollableHeight)
            {
                offset = scrollViewer.ScrollableHeight;
            }

            var currentOffset = scrollViewer.VerticalOffset;

            // ReSharper disable CompareOfFloatsByEqualityOperator
            if (offset == currentOffset)
            {
                return;
            }

            await scrollViewer.ScrollToVerticalOffsetWithAnimation(offset);

            if (scrollViewer.VerticalOffset == offset)
            {
                return;
            }

            if (scrollViewer.VerticalOffset != currentOffset)
            {
                return;
            }
            // ReSharper restore CompareOfFloatsByEqualityOperator

            await EventAsync.FromEvent <ScrollViewerViewChangedEventArgs>(
                eh => scrollViewer.ViewChanged += eh,
                eh => scrollViewer.ViewChanged -= eh);
        }
Пример #9
0
 /// <summary>
 /// Waits for the next layout update event.
 /// </summary>
 /// <param name="frameworkElement">The framework element.</param>
 /// <returns></returns>
 public static async Task WaitForLayoutUpdateAsync(this FrameworkElement frameworkElement)
 {
     await EventAsync.FromEvent <object>(
         eh => frameworkElement.LayoutUpdated += eh,
         eh => frameworkElement.LayoutUpdated -= eh);
 }
Пример #10
0
 /// <summary>
 /// Waits for the element to unload (disconnect from the main object tree).
 /// </summary>
 public static async Task WaitForUnloadedAsync(this FrameworkElement frameworkElement)
 {
     await EventAsync.FromRoutedEvent(
         eh => frameworkElement.Unloaded += eh,
         eh => frameworkElement.Unloaded -= eh);
 }
        public async Task <Viewport[]> EditViewportsAsync(ModuleViewportModel value)
        {
            if (!IsValidViewports(value.Viewports.ToArray()))
            {
                MessageBoxEx.Show($"One or more viewports were defined on a monitor that is no longer configured, they have been removed.{Environment.NewLine}Make sure you add any missing viewports before saving.", "Invalid Viewport");
            }

            var tasks      = new List <Task>();
            var screenIds  = GetDeviceViewportMonitorIds();
            var devices    = _profileSettingsService.GetViewportDevices(value.Module.Value.ModuleId).Where(d => value.Viewports.Any(v => v.SeatIndex == d.SeatIndex)).ToArray();
            var windows    = new List <Window>();
            var viewModels = new List <ViewportEditorWindowViewModel>();

            var editorScreens  = Screen.AllScreens.Where(s => screenIds.Contains(s.DeviceName));
            var overlayScreens = Screen.AllScreens.Where(s => !screenIds.Contains(s.DeviceName) && !value.Viewports.Select(v => v.MonitorId).Contains(s.DeviceName));

            foreach (var screen in editorScreens)
            {
                var viewportModels = new List <ViewportModel>();

                foreach (var viewport in value.Viewports.Where(v => v.MonitorId == screen.DeviceName))
                {
                    if (!screenIds.Contains(viewport.MonitorId))
                    {
                        continue;
                    }

                    var model = new ViewportModel();

                    model.Height.Value   = viewport.Height;
                    model.InitFile.Value = viewport.RelativeInitFilePath;
                    model.ImageUrl.Value = Path.Combine(ApplicationPaths.ViewportPath, $"Images/{value.Module.Value.ModuleId}/{viewport.ViewportName}.jpg");
                    model.Name.Value     = viewport.ViewportName;
                    model.Width.Value    = viewport.Width;
                    model.X.Value        = viewport.X;
                    model.Y.Value        = viewport.Y;

                    viewportModels.Add(model);
                }

                var window = new ViewportEditorWindow();
                var vm     = new ViewportEditorWindowViewModel(_container, false, screen.DeviceName, value.Module.Value, devices, viewportModels.ToArray());

                vm.Viewports.CollectionChanged += (sender, args) =>
                {
                    OnViewportsChanged(vm, viewModels);
                };

                window.Screen      = screen;
                window.DataContext = vm;
                window.Show();
                window.BringIntoView();

                windows.Add(window);
                viewModels.Add(vm);

                tasks.Add(EventAsync.FromEvent(
                              handler => window.Closed += handler,
                              handler => window.Closed -= handler));
            }

            foreach (var screen in overlayScreens)
            {
                var window = new MonitorOverlay
                {
                    Screen = screen
                };

                window.Show();
                window.BringIntoView();
                windows.Add(window);

                tasks.Add(EventAsync.FromEvent(
                              handler => window.Closed += handler,
                              handler => window.Closed -= handler));
            }

            await Task.WhenAny(tasks);

            foreach (var window in windows)
            {
                try
                {
                    window.Close();
                }
                catch
                {
                }
            }

            var save      = viewModels.Any(vm => vm.DialogResult.Value == true);
            var viewports = new List <Viewport>();

            if (save)
            {
                foreach (var viewModel in viewModels)
                {
                    var screen = Screen.AllScreens.First(s => s.DeviceName == viewModel.MonitorId);

                    foreach (var viewportModel in viewModel.Viewports)
                    {
                        viewports.Add(
                            new Viewport
                        {
                            Height                = (int)viewportModel.Height.Value,
                            MonitorId             = screen.DeviceName,
                            SeatIndex             = viewportModel.SeatIndex.Value,
                            OriginalDisplayHeight = (int)screen.Bounds.Height,
                            OriginalDisplayWidth  = (int)screen.Bounds.Width,
                            RelativeInitFilePath  = viewportModel.InitFile.Value,
                            ViewportName          = viewportModel.Name.Value,
                            Width = (int)viewportModel.Width.Value,
                            X     = (int)viewportModel.X.Value,
                            Y     = (int)viewportModel.Y.Value
                        });
                    }
                }
                return(viewports.ToArray());
            }
            else
            {
                return(value.Viewports.ToArray());
            }
        }