/// <summary>
        /// Constructs a new view model for a virtual macro board.
        /// </summary>
        /// <param name="keyLayout"></param>
        public VirtualBoardViewModel(IKeyPositionCollection keyLayout)
        {
            Keys      = keyLayout ?? throw new ArgumentNullException(nameof(keyLayout));
            KeyImages = new KeyImageCollection(Keys.Count);

            dispatcher = Dispatcher.CurrentDispatcher;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Spawns a new virtual macro board with a given <paramref name="keyLayout"/>.
        /// </summary>
        /// <param name="keyLayout"></param>
        /// <returns></returns>
        public static IMacroBoard SpawnVirtualBoard(IKeyPositionCollection keyLayout)
        {
            VirtualBoardViewModel boardViewModel     = null;
            VirtualBoardWindow    boardWindow        = null;
            Exception             exceptionWasThrown = null;

            using (var waitForBoardWindow = new ManualResetEvent(false))
            {
                var uiThread = new Thread(() =>
                {
                    try
                    {
                        boardViewModel = new VirtualBoardViewModel(keyLayout);
                        boardWindow    = new VirtualBoardWindow(boardViewModel);
                    }
                    catch (Exception ex)
                    {
                        exceptionWasThrown = ex;
                        return;
                    }
                    finally
                    {
                        waitForBoardWindow.Set();
                    }

                    boardWindow.Show();
                    Dispatcher.Run();
                })
                {
                    IsBackground = true
                };

                uiThread.SetApartmentState(ApartmentState.STA);
                uiThread.Start();

                waitForBoardWindow.WaitOne();

                if (exceptionWasThrown != null)
                {
                    throw exceptionWasThrown;
                }

                return(boardViewModel);
            }
        }
Ejemplo n.º 3
0
        public VirtualBoardLayout(IKeyPositionCollection keys, double width, double height)
        {
            var scaleX = width / keys.Area.Width;
            var scaleY = height / keys.Area.Height;

            var scale = Math.Min(scaleX, scaleY);

            var offsetX = (width - keys.Area.Width * scale) / 2;
            var offsetY = (height - keys.Area.Height * scale) / 2;

            KeyPositions = new List <Rect>();

            for (var i = 0; i < keys.Count; i++)
            {
                KeyPositions.Add(new Rect(
                                     offsetX + keys[i].Left * scale,
                                     offsetY + keys[i].Top * scale,
                                     keys[i].Width * scale,
                                     keys[i].Height * scale
                                     ));
            }
        }