Beispiel #1
0
        /// <summary>
        /// Function for the Form to interact with the input manager.
        /// The inputEvent should be a function in the InputStateManager.
        /// </summary>
        /// <param name="key">if a key was not pressed this event, null, else char</param>
        public void RunInputEvent(Func <StateControls, bool> inputEvent)
        {
            char?key = getKey();

            var  stateControls = MakeControls(key, getModifiers());
            bool toRefresh     = inputEvent(stateControls);

            //Process [CircuitActions]
            if (stateControls.CircuitActionsOutput != null)
            {
                rightClickMenu.Items.Clear();

                foreach (var action in stateControls.CircuitActionsOutput)
                {
                    //Creates a dropdown menu item which, when clicked, will invoke the action and refresh the drawing panel
                    void actionEvent(object s, EventArgs e) => stateControls.CircuitActionsOutput.InvokeActionAndRefresh(stateControls.State, drawingPanel.Refresh, action);

                    var item = new ToolStripMenuItem(action.Name, null, actionEvent)
                    {
                        ShortcutKeyDisplayString = action.Hotkey.GetHotkeyString(action.Modifiers),
                        ShowShortcutKeys         = true
                    };
                    rightClickMenu.Items.Add(item);
                }

                rightClickMenu.Show(drawingPanel, drawingPanel.PointToClient(Cursor.Position));
            }

            //Process [CircuitProperties]
            if (stateControls.CircuitPropertiesOutput != null)
            {
                circuitPropertyBox.Items.Clear();
                circuitPropertyTextBox.Visible  = false;
                circuitPropertyValueBox.Visible = true;
                circuitPropertyValueBox.Items.Clear();
                CircuitProperties = stateControls.CircuitPropertiesOutput;

                foreach (var property in CircuitProperties)
                {
                    circuitPropertyBox.Items.Add(property.Key);
                }
            }

            if (toRefresh)
            {
                drawingPanel.Refresh();
            }
        }
        /// <summary>
        /// Returns a list of updated CircuitProperties to be passed into the StateControls
        /// </summary>
        public CircuitPropertyCollection GetUpdatedCircuitProperties(Action <string> registerChange)
        {
            if (!selections.SetEquals(oldSelections))
            {
                CircuitPropertyCollection circuitProperties = CircuitPropertyCollection.Empty;
                oldSelections.Clear();
                oldSelections.UnionWith(selections);
                foreach (var selection in selections)
                {
                    circuitProperties.Intersect(CircuitAttributes.GetProperties(selection, registerChange));
                }
                return(circuitProperties);
            }

            return(null);
        }
        /// <summary>
        /// Propogates hotkey through all selected CircuitObjects and runs any valid [CircuitProperties]
        /// </summary>
        protected bool ExecuteHotkey(BoardState state, char?key, Modifier Modifiers, Action <string> registerChange, out CircuitPropertyCollection circuitProperties)
        {
            CircuitActionCollection actions = CircuitActionCollection.Empty;

            //Find all actions
            foreach (var selection in selections)
            {
                actions.UnionWith(CircuitAttributes.GetActions(selection, RefreshSelections, registerChange));
            }

            char hotkey = (char)key;
            //Execute matches
            bool toRefresh = actions.InvokeHotkeyActions(state, hotkey, Modifiers);

            circuitProperties = GetUpdatedCircuitProperties(registerChange);
            return(toRefresh);
        }