Esempio n. 1
0
 public SelectionViewModel(SelectionInput <T> input)
     : base(input.Title, input.ContentHeader, input.Label)
 {
     Items             = new ObservableCollection <T>(input.Items);
     SelectedItem      = input.SelectedItem;
     DisplayMemberPath = input.DisplayMemberPath;
 }
Esempio n. 2
0
 public InputManager()
 {
     ControlInput = new ControlInput(KeyboardAdapter);
     PlayerInputs = new List <PlayerInput>();
     TextInput    = new TextEditInput(KeyboardAdapter);
     SelectInput  = new SelectionInput(KeyboardAdapter);
 }
Esempio n. 3
0
        public StorageBarcodeViewModel SelectStorageBarcode(object parentViewModel, List <StorageBarcodeViewModel> barcodes)
        {
            var selectedBarcode = barcodes.First();
            var input           = new SelectionInput <StorageBarcodeViewModel>
            {
                Title             = "Barcodes - Import",
                ContentHeader     = "Select barcode",
                Label             = "Barcode:",
                Items             = barcodes,
                SelectedItem      = selectedBarcode,
                DisplayMemberPath = "Title"
            };
            var dataContext = new SelectionViewModel <StorageBarcodeViewModel>(input);
            var window      = new SelectionWindow(dataContext)
            {
                Owner = GetWindowWithDataContext(parentViewModel)
            };

            window.ShowDialog();
            return(dataContext.Result);
        }
Esempio n. 4
0
        public WorkspaceViewModel SelectBarcodesWorkspace(IEnumerable <WorkspaceViewModel> workspaces)
        {
            var selectedWorkspace = workspaces.First();
            var input             = new SelectionInput <WorkspaceViewModel>
            {
                Title             = "Barcodes - Workspaces",
                ContentHeader     = "Select desired workspace",
                Label             = "Workspace:",
                Items             = workspaces,
                SelectedItem      = selectedWorkspace,
                DisplayMemberPath = "Name"
            };
            var dataContext = new SelectionViewModel <WorkspaceViewModel>(input);
            var window      = new SelectionWindow(dataContext)
            {
                Owner = MainWindow
            };

            window.ShowDialog();
            return(dataContext.Result);
        }
Esempio n. 5
0
        public void ProcessInput(ActionMapInput input, ConsumeControlDelegate consumeControl)
        {
            if (this.GetManipulatorDragState())
            {
                return;
            }

            m_SelectionInput = (SelectionInput)input;

            var multiSelectControl = m_SelectionInput.multiSelect;

            if (this.GetDeviceType() == DeviceType.Vive)
            {
                multiSelectControl = m_SelectionInput.multiSelectAlt;
            }

            if (multiSelectControl.wasJustPressed)
            {
                var realTime = Time.realtimeSinceStartup;
                if (UIUtils.IsDoubleClick(realTime - m_LastMultiSelectClickTime))
                {
                    foreach (var linkedObject in linkedObjects)
                    {
                        var selectionTool = (SelectionTool)linkedObject;
                        selectionTool.m_MultiSelect = !selectionTool.m_MultiSelect;
                        this.HideTooltip(selectionTool);
                    }

                    if (m_MultiSelect)
                    {
                        this.ShowTooltip(this);
                    }
                }

                m_LastMultiSelectClickTime = realTime;
            }

            this.SetDefaultRayColor(rayOrigin, m_MultiSelect ? m_MultiselectRayColor : m_NormalRayColor);

            if (this.IsSharedUpdater(this))
            {
                this.SetManipulatorsVisible(this, !m_MultiSelect);

                m_SelectionHoverGameObjects.Clear();
                foreach (var linkedObject in linkedObjects)
                {
                    var selectionTool = (SelectionTool)linkedObject;
                    selectionTool.m_HasDirectHover = false; // Clear old hover state

                    if (selectionTool.m_BlockSelect)
                    {
                        continue;
                    }

                    if (!selectionTool.IsRayActive())
                    {
                        continue;
                    }

                    var selectionRayOrigin = selectionTool.rayOrigin;

                    var hover = this.GetFirstGameObject(selectionRayOrigin);

                    if (!selectionTool.GetSelectionCandidate(ref hover))
                    {
                        continue;
                    }

                    if (hover)
                    {
                        GameObject lastHover;
                        if (m_HoverGameObjects.TryGetValue(selectionRayOrigin, out lastHover) && lastHover != hover)
                        {
                            this.SetHighlight(lastHover, false, selectionRayOrigin);
                        }

                        m_SelectionHoverGameObjects[selectionRayOrigin] = hover;
                        m_HoverGameObjects[selectionRayOrigin]          = hover;
                    }
                }

                var directSelection = this.GetDirectSelection();

                // Unset highlight old hovers
                k_TempHovers.Clear();
                foreach (var kvp in m_HoverGameObjects)
                {
                    k_TempHovers[kvp.Key] = kvp.Value;
                }

                foreach (var kvp in k_TempHovers)
                {
                    var directRayOrigin = kvp.Key;
                    var hover           = kvp.Value;

                    if (!directSelection.ContainsKey(directRayOrigin) &&
                        !m_SelectionHoverGameObjects.ContainsKey(directRayOrigin))
                    {
                        this.SetHighlight(hover, false, directRayOrigin);
                        m_HoverGameObjects.Remove(directRayOrigin);
                    }
                }

                // Find new hovers
                foreach (var kvp in directSelection)
                {
                    var directRayOrigin     = kvp.Key;
                    var directHoveredObject = kvp.Value;

                    var directSelectionCandidate = this.GetSelectionCandidate(directHoveredObject, true);

                    // Can't select this object (it might be locked or static)
                    if (directHoveredObject && !directSelectionCandidate)
                    {
                        if (directHoveredObject != null)
                        {
                            this.SetHighlight(directHoveredObject, false);
                        }

                        continue;
                    }

                    if (directSelectionCandidate)
                    {
                        directHoveredObject = directSelectionCandidate;
                    }

                    if (!this.CanGrabObject(directHoveredObject, directRayOrigin))
                    {
                        continue;
                    }

                    var grabbingNode  = this.RequestNodeFromRayOrigin(directRayOrigin);
                    var selectionTool = linkedObjects.Cast <SelectionTool>().FirstOrDefault(linkedObject => linkedObject.node == grabbingNode);
                    if (selectionTool == null)
                    {
                        continue;
                    }

                    if (selectionTool.m_BlockSelect)
                    {
                        continue;
                    }

                    GameObject lastHover;
                    if (m_HoverGameObjects.TryGetValue(directRayOrigin, out lastHover) && lastHover != directHoveredObject)
                    {
                        this.SetHighlight(lastHover, false, directRayOrigin);
                    }

                    if (!selectionTool.IsDirectActive())
                    {
                        m_HoverGameObjects.Remove(directRayOrigin);
                        this.SetHighlight(directHoveredObject, false, directRayOrigin);
                        continue;
                    }

                    // Only overwrite an existing selection if it does not contain the hovered object
                    // In the case of multi-select, only add, do not remove
                    if (selectionTool.m_SelectionInput.select.wasJustPressed && !Selection.objects.Contains(directHoveredObject))
                    {
                        this.SelectObject(directHoveredObject, directRayOrigin, m_MultiSelect);
                    }

                    m_HoverGameObjects[directRayOrigin] = directHoveredObject;
                    selectionTool.m_HasDirectHover      = true;
                }

                // Set highlight on new hovers
                foreach (var hover in m_HoverGameObjects)
                {
                    this.SetHighlight(hover.Value, true, hover.Key);
                }
            }

            if (!m_HasDirectHover)
            {
                HideDirectSelectFeedback();
            }
            else if (m_DirectSelectFeedback.Count == 0)
            {
                ShowDirectSelectFeedback();
            }

            GameObject hoveredObject = null;
            var        rayActive     = IsRayActive();

            if (rayActive)
            {
                // Need to call GetFirstGameObject a second time because we do not guarantee shared updater executes first
                hoveredObject = this.GetFirstGameObject(rayOrigin);

                if (hovered != null)
                {
                    hovered(hoveredObject, rayOrigin);
                }

                GetSelectionCandidate(ref hoveredObject);

                if (hoveredObject && this.GetVRPlayerObjects().Contains(hoveredObject))
                {
                    hoveredObject = null;
                }
            }

            if (!hoveredObject)
            {
                HideSelectFeedback();
            }
            else if (m_SelectFeedback.Count == 0)
            {
                ShowSelectFeedback();
            }

            var pointerPosition = this.GetPointerPosition(rayOrigin);

            // Capture object on press
            var select = m_SelectionInput.select;

            if (select.wasJustPressed)
            {
                m_SelectStartPosition = pointerPosition;

                // Ray selection only if ray is visible
                m_PressedObject = hoveredObject;
            }

            if (select.isHeld)
            {
                var startToEnd = pointerPosition - m_SelectStartPosition;
                var visuals    = m_Preferences.sphereMode ? m_BlockSelectSphere : m_BlockSelectCube;
                var distance   = startToEnd.magnitude;
                if (!m_BlockSelect && distance > k_BLockSelectDragThreshold * this.GetViewerScale())
                {
                    m_BlockSelect = true;
                    visuals.SetActive(true);

                    m_PressedObject = null;
                    this.AddRayVisibilitySettings(rayOrigin, this, false, true);
                    this.SetUIBlockedForRayOrigin(rayOrigin, true);
                }

                if (m_BlockSelect)
                {
                    this.SetManipulatorsVisible(this, false);
                }

                //TODO: use hashsets to only unset highlights for removed objects
                foreach (var hover in m_BlockSelectHoverGameObjects)
                {
                    this.SetHighlight(hover, false, rayOrigin);
                }
                m_BlockSelectHoverGameObjects.Clear();

                var visualsTransform = visuals.transform;
                if (m_Preferences.sphereMode)
                {
                    visualsTransform.localScale = Vector3.one * distance * 2;
                    visualsTransform.position   = m_SelectStartPosition;
                    this.CheckSphere(m_SelectStartPosition, distance, m_BlockSelectHoverGameObjects, ignoreList);
                }
                else
                {
                    visualsTransform.localScale = startToEnd;
                    visualsTransform.position   = m_SelectStartPosition + startToEnd * 0.5f;
                    this.CheckBounds(m_BlockSelectCubeRenderer.bounds, m_BlockSelectHoverGameObjects, ignoreList);
                }

                foreach (var hover in m_BlockSelectHoverGameObjects)
                {
                    this.SetHighlight(hover, true, rayOrigin);
                }

                if (m_BlockSelect)
                {
                    consumeControl(select);
                }
            }

            // Make selection on release
            if (select.wasJustReleased)
            {
                if (m_BlockSelect)
                {
                    if (!m_MultiSelect)
                    {
                        this.SetManipulatorsVisible(this, true);
                        Selection.activeGameObject = null;
                    }

                    this.SelectObjects(m_BlockSelectHoverGameObjects, rayOrigin, m_MultiSelect);

                    foreach (var hover in m_BlockSelectHoverGameObjects)
                    {
                        if (hover != null)
                        {
                            this.SetHighlight(hover, false, rayOrigin);
                        }
                    }

                    this.ResetDirectSelectionState();
                }
                else if (rayActive)
                {
                    if (m_PressedObject == hoveredObject)
                    {
                        this.SelectObject(m_PressedObject, rayOrigin, m_MultiSelect, true);
                        this.ResetDirectSelectionState();

                        if (m_PressedObject != null)
                        {
                            this.SetHighlight(m_PressedObject, false, rayOrigin);
                        }
                    }

                    if (m_PressedObject)
                    {
                        consumeControl(select);
                    }
                }

                this.SetUIBlockedForRayOrigin(rayOrigin, false);
                this.RemoveRayVisibilitySettings(rayOrigin, this);
                (m_Preferences.sphereMode ? m_BlockSelectSphere : m_BlockSelectCube).SetActive(false);
                m_PressedObject = null;
                m_BlockSelect   = false;
            }
        }
Esempio n. 6
0
        public void ProcessInput(ActionMapInput input, ConsumeControlDelegate consumeControl)
        {
            if (this.GetManipulatorDragState())
            {
                return;
            }

            m_SelectionInput = (SelectionInput)input;

            var multiSelectControl = m_SelectionInput.multiSelect;

            if (proxyType == typeof(ViveProxy))
            {
                multiSelectControl = m_SelectionInput.multiSelectAlt;
            }

            if (multiSelectControl.wasJustPressed)
            {
                var realTime = Time.realtimeSinceStartup;
                if (UIUtils.IsDoubleClick(realTime - m_LastMultiSelectClickTime))
                {
                    foreach (var linkedObject in linkedObjects)
                    {
                        var selectionTool = (SelectionTool)linkedObject;
                        selectionTool.m_MultiSelect = !selectionTool.m_MultiSelect;
                        this.HideTooltip(selectionTool);
                    }

                    if (m_MultiSelect)
                    {
                        this.ShowTooltip(this);
                    }

                    consumeControl(multiSelectControl);
                }

                m_LastMultiSelectClickTime = realTime;
            }

            this.SetDefaultRayColor(rayOrigin, m_MultiSelect ? m_MultiselectRayColor : m_NormalRayColor);

            if (this.IsSharedUpdater(this))
            {
                this.SetManipulatorsVisible(this, !m_MultiSelect);

                var directSelection = this.GetDirectSelection();

                m_SelectionHoverGameObjects.Clear();
                foreach (var linkedObject in linkedObjects)
                {
                    var selectionTool      = (SelectionTool)linkedObject;
                    var selectionRayOrigin = selectionTool.rayOrigin;

                    if (!selectionTool.IsRayActive())
                    {
                        continue;
                    }

                    var hover = this.GetFirstGameObject(selectionRayOrigin);

                    if (!selectionTool.GetSelectionCandidate(ref hover))
                    {
                        continue;
                    }

                    if (hover)
                    {
                        GameObject lastHover;
                        if (m_HoverGameObjects.TryGetValue(selectionRayOrigin, out lastHover) && lastHover != hover)
                        {
                            this.SetHighlight(lastHover, false, selectionRayOrigin);
                        }

                        m_SelectionHoverGameObjects[selectionRayOrigin] = hover;
                        m_HoverGameObjects[selectionRayOrigin]          = hover;
                    }
                }

                // Unset highlight old hovers
                var hovers = new Dictionary <Transform, GameObject>(m_HoverGameObjects);
                foreach (var kvp in hovers)
                {
                    var directRayOrigin = kvp.Key;
                    var hover           = kvp.Value;

                    if (!directSelection.ContainsKey(directRayOrigin) &&
                        !m_SelectionHoverGameObjects.ContainsKey(directRayOrigin))
                    {
                        this.SetHighlight(hover, false, directRayOrigin);
                        m_HoverGameObjects.Remove(directRayOrigin);
                    }
                }

                // Find new hovers
                foreach (var kvp in directSelection)
                {
                    var directRayOrigin     = kvp.Key;
                    var directHoveredObject = kvp.Value;

                    var directSelectionCandidate = this.GetSelectionCandidate(directHoveredObject, true);

                    // Can't select this object (it might be locked or static)
                    if (directHoveredObject && !directSelectionCandidate)
                    {
                        continue;
                    }

                    if (directSelectionCandidate)
                    {
                        directHoveredObject = directSelectionCandidate;
                    }

                    if (!this.CanGrabObject(directHoveredObject, directRayOrigin))
                    {
                        continue;
                    }

                    var grabbingNode  = this.RequestNodeFromRayOrigin(directRayOrigin);
                    var selectionTool = linkedObjects.Cast <SelectionTool>().FirstOrDefault(linkedObject => linkedObject.node == grabbingNode);
                    if (selectionTool == null)
                    {
                        continue;
                    }

                    if (!selectionTool.IsDirectActive())
                    {
                        m_HoverGameObjects.Remove(directRayOrigin);
                        this.SetHighlight(directHoveredObject, false, directRayOrigin);
                        continue;
                    }

                    // Only overwrite an existing selection if it does not contain the hovered object
                    // In the case of multi-select, only add, do not remove
                    if (selectionTool.m_SelectionInput.select.wasJustPressed && !Selection.objects.Contains(directHoveredObject))
                    {
                        this.SelectObject(directHoveredObject, directRayOrigin, m_MultiSelect);
                    }

                    GameObject lastHover;
                    if (m_HoverGameObjects.TryGetValue(directRayOrigin, out lastHover) && lastHover != directHoveredObject)
                    {
                        this.SetHighlight(lastHover, false, directRayOrigin);
                    }

                    m_HoverGameObjects[directRayOrigin] = directHoveredObject;
                }

                // Set highlight on new hovers
                foreach (var hover in m_HoverGameObjects)
                {
                    this.SetHighlight(hover.Value, true, hover.Key);
                }
            }

            if (!IsRayActive())
            {
                return;
            }

            // Need to call GetFirstGameObject a second time because we do not guarantee shared updater executes first
            var hoveredObject = this.GetFirstGameObject(rayOrigin);

            if (hovered != null)
            {
                hovered(hoveredObject, rayOrigin);
            }

            if (!GetSelectionCandidate(ref hoveredObject))
            {
                return;
            }

            // Capture object on press
            if (m_SelectionInput.select.wasJustPressed)
            {
                m_PressedObject = hoveredObject;
            }

            // Select button on release
            if (m_SelectionInput.select.wasJustReleased)
            {
                if (m_PressedObject == hoveredObject)
                {
                    this.SelectObject(m_PressedObject, rayOrigin, m_MultiSelect, true);
                    this.ResetDirectSelectionState();

                    if (m_PressedObject != null)
                    {
                        this.SetHighlight(m_PressedObject, false, rayOrigin);
                    }
                }

                if (m_PressedObject)
                {
                    consumeControl(m_SelectionInput.select);
                }

                m_PressedObject = null;
            }
        }