示例#1
0
    void HighlevelRuleGUI()
    {
        rulesScrollPos = GUILayout.BeginScrollView(rulesScrollPos, GUILayout.MaxHeight(Screen.height * 0.8f));

        GUILayout.Label("Rules:");

        foreach (BaseRuleElement.EventData eData in eventData)
        {
            GUILayout.Space(10);

            GUILayout.BeginHorizontal(areaBackgroundStyle, GUILayout.ExpandWidth(false));

            // display event
            if (eData.OnShowGui != null)
            {
                //GUILayout.BeginHorizontal(ruleEventStyle);
                eData.OnShowGui(eData);
                //GUILayout.EndHorizontal();
            }

            // show all reactions to this event
            BaseRuleElement.ReactionData r;
            if (eventReactionDict.ContainsKey(eData.id))
            {
                List<int> rIds = eventReactionDict[eData.id];

                GUILayout.BeginVertical(GUILayout.ExpandWidth(false));

                if (rIds.Count > 0)
                {
                    for (int i = 0; i < rIds.Count; i++)
                    {
                        r = reactionData.Find(item => item.id == rIds[i]);

                        GUILayout.BeginVertical();
                        if (r.OnShowGui != null)
                        {
                            GUILayout.BeginHorizontal(ruleReactionStyle, GUILayout.ExpandWidth(false));
                            r.OnShowGui(r);

                            if (GUILayout.Button("", ruleIconDelStyle))
                            {
                                DeleteReaction(r);
                            }
                            GUILayout.FlexibleSpace();

                            GUILayout.EndHorizontal();
                            GUILayout.Space(2);
                        }

                        GUILayout.EndVertical();
                    }
                }

                GUILayout.BeginHorizontal(ruleReactionStyle, GUILayout.ExpandWidth(false));
                if (GUILayout.Button("Add Reaction"))
                {
                    LoadEventAndReactionTypes();
                    addRule_selectedEventId = eData.id;
                    addRule_selectedReactionTypes.Add(0);
                    GuiState = RuleGUIState.ADDRULE_2;
                }
                GUILayout.EndHorizontal();

                GUILayout.EndVertical();
            }
            else
            {
                if (GUILayout.Button("Add Reaction"))
                {
                    LoadEventAndReactionTypes();
                    addRule_selectedEventId = eData.id;
                    addRule_selectedReactionTypes.Add(0);
                    GuiState = RuleGUIState.ADDRULE_2;
                }

                GUILayout.FlexibleSpace();
            }

            if (GUILayout.Button("", ruleIconDelStyle))
            {
                // delete confirmation
                ShowAlertWindow("Delete rule?", "Are you sure you want to delete this rule?", DeleteRule, DontDeleteRule);
                ruleToDelete = eData;
            }

            GUILayout.EndHorizontal();
        }

        GUILayout.Space(10);

        GUILayout.BeginHorizontal(areaBackgroundStyle, GUILayout.ExpandWidth(false));
        if (GUILayout.Button("Add Rule", GUILayout.Height(70), GUILayout.Width(100)))
        {
            AddRule();
        }
        GUILayout.EndHorizontal();

        HorizontalLine();

        GUILayout.Label("Actors:");

        foreach (BaseRuleElement.ActorData aData in actorData)
        {
            GUILayout.Space(10);
            GUILayout.BeginHorizontal(areaBackgroundStyle);

            if (aData.OnShowGui != null)
                aData.OnShowGui(aData);

            GUILayout.FlexibleSpace();

            if (GUILayout.Button("", ruleIconDelStyle))
            {
                ShowAlertWindow("Delete actor?", "Are you sure you want to delete this actor?", DeleteActor, DontDeleteActor);
                actorToDelete = aData;
            }

            GUILayout.EndHorizontal();
        }

        GUILayout.Space(10);
        GUILayout.BeginHorizontal(areaBackgroundStyle, GUILayout.ExpandWidth(false));
        if (GUILayout.Button("Add Actor", GUILayout.Height(70), GUILayout.Width(100)))
        {
            AddActor();
        }
        GUILayout.EndHorizontal();

        GUILayout.EndScrollView();
    }
示例#2
0
    void AddRule_ChooseReaction(int windowId)
    {
        GUILayout.Label("Choose Reaction " + (currentSelectedReactionTypeIndex + 1));

        GUILayout.FlexibleSpace();

        GUILayout.BeginHorizontal();

        // if adding to an existing event
        if (addRule_selectedEventId > -1 && addRule_selectedEventId < eventData.Count)
        {
            // get index of event type name, set the right event type int
            addRule_selectedEventType = eventTypes.FindIndex(item => item == eventData[addRule_selectedEventId].type);
        }

        int curSelReactionIndex = currentSelectedReactionTypeIndex;
        addRule_selectedReactionTypes[curSelReactionIndex] = GUILayout.SelectionGrid(addRule_selectedReactionTypes[curSelReactionIndex],
            reactionNames, 3, selectionGridStyle);

        GUILayout.EndHorizontal();

        GUILayout.FlexibleSpace();

        GUILayout.BeginHorizontal();

        if (GUILayout.Button("Cancel", GUILayout.Height(70), GUILayout.Width(100)))
        {
            GuiState = RuleGUIState.RULES;
            currentSelectedReactionTypeIndex = 0;
            addRule_selectedReactionTypes.Clear();
            addRule_selectedEventType = 0;
            addRule_selectedEventId = -1;
        }

        GUILayout.Space(10);

        if ((addRule_selectedEventId == -1 || currentSelectedReactionTypeIndex > 0) && GUILayout.Button("Back", GUILayout.Width(100), GUILayout.Height(70)))
        {
            if (currentSelectedReactionTypeIndex > 0) currentSelectedReactionTypeIndex--;
            else GuiState = RuleGUIState.ADDRULE_1;
        }

        GUILayout.FlexibleSpace();

        if (addRule_selectedEventId > -1 && currentSelectedReactionTypeIndex < addRule_selectedReactionTypes.Count - 1)
        {
            if (GUILayout.Button("Next", GUILayout.Height(70), GUILayout.Width(100)))
                currentSelectedReactionTypeIndex++;
        }
        else if (GUILayout.Button("Add another reaction", GUILayout.Height(70)))
        {
            currentSelectedReactionTypeIndex++;
            addRule_selectedReactionTypes.Add(0);
        }

        GUILayout.Space(10);

        string finishButtonText = "Add " + (addRule_selectedReactionTypes.Count) + " reaction(s)";
        if (GUILayout.Button(finishButtonText, GUILayout.Width(100), GUILayout.Height(70)))
        {
            RuleGenerator generator = GetComponent<RuleGenerator>();

            BaseRuleElement.EventData newEvent;
            if (addRule_selectedEventId == -1)
            {
                newEvent = new BaseRuleElement.EventData()
                {
                    type = RuleParserLinq.ReflectOverSeveralNamespaces(eventNames[addRule_selectedEventType], RuleParserLinq.ExtraNamespaces),
                    id = generator.GetEventId(),
                    actorId = -1
                };

                newEvent.label = newEvent.type.ToString();
                newEvent.parameters = new List<BaseRuleElement.Param>();

                eventData.Add(newEvent);

                // sort evetn data
                eventData.Sort(new BaseRuleElement.OrderComparer<BaseRuleElement.EventData>());

                generator.AddEventToScene(newEvent);

                // add to lookup dict
                if (actorEventDict.ContainsKey(newEvent.actorId))
                {
                    actorEventDict[newEvent.actorId].Add(newEvent.id);
                }
                else
                {
                    actorEventDict.Add(newEvent.actorId, new List<int>() { newEvent.id });
                }

                Analytics.LogEvent(Analytics.ruleEvent, Analytics.add_event, newEvent.label);
            }
            else
            {
                // only adding new reaction, no event
                newEvent = eventData.Find(item => item.id == addRule_selectedEventId);
            }

            // add all new reactions
            for (int i = 0; i < addRule_selectedReactionTypes.Count; i++)
            {
                BaseRuleElement.ReactionData newReaction = new BaseRuleElement.ReactionData()
                {
                    type = RuleParserLinq.ReflectOverSeveralNamespaces(reactionNames[addRule_selectedReactionTypes[i]], RuleParserLinq.ExtraNamespaces),
                    id = generator.GetReactionId(),
                    actorId = 0, // HACK should be a global actor, not just actor 0
                    eventId = newEvent.id
                };
                newReaction.label = newReaction.type.ToString();
                newReaction.parameters = new List<BaseRuleElement.Param>();

                reactionData.Add(newReaction);

                generator.AddReactionToScene(newReaction);

                // add to lookup dicts
                if (eventReactionDict.ContainsKey(newReaction.eventId))
                {
                    eventReactionDict[newReaction.eventId].Add(newReaction.id);
                }
                else
                {
                    eventReactionDict.Add(newReaction.eventId, new List<int>() { newReaction.id });
                }

                if (actorReactionDict.ContainsKey(newReaction.actorId))
                {
                    actorReactionDict[newReaction.actorId].Add(newReaction.id);
                }
                else
                {
                    actorReactionDict.Add(newReaction.actorId, new List<int>() { newReaction.id });
                }

                Analytics.LogEvent(Analytics.ruleEvent, Analytics.add_reaction, newReaction.label);
            }

            GuiState = RuleGUIState.RULES;
            currentSelectedReactionTypeIndex = 0;
            addRule_selectedReactionTypes.Clear();
            addRule_selectedEventType = 0;
            addRule_selectedEventId = -1;
        }

        GUILayout.EndHorizontal();
    }
示例#3
0
 void DontDeleteRule()
 {
     GuiState = RuleGUIState.RULES;
     ruleToDelete = null;
 }
    private void ParseEvents(RuleGenerator generator, XElement xEvents)
    {
        BaseRuleElement.EventData currentEvent = new BaseRuleElement.EventData();
        foreach(XElement xEvent in xEvents.Elements("event"))
        {
            currentEvent.id = int.Parse(xEvent.Element("id").Value);
            currentEvent.label = xEvent.Element("label").Value;

        #if DEBUG
            Debug.Log("Processing event " + currentEvent.label + ".");
        #endif

            currentEvent.actorId = int.Parse(xEvent.Element("actorId").Value);

            currentEvent.type = ReflectOverSeveralNamespaces(xEvent.Element("type").Value, ExtraNamespaces);

            // get parameters with right types
            currentEvent.parameters = ParseParameters(xEvent);

            // add event to scene
            generator.AddRuleData(currentEvent);
        }
    }