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(); }
private void ParseReactions(RuleGenerator generator, XElement xReactions) { BaseRuleElement.ReactionData currentReaction = new BaseRuleElement.ReactionData(); foreach (XElement xReaction in xReactions.Elements("reaction")) { currentReaction.id = int.Parse(xReaction.Element("id").Value); currentReaction.label = xReaction.Element("label").Value; #if DEBUG Debug.Log("Processing reaction " + currentReaction.label + "."); #endif currentReaction.eventId = int.Parse(xReaction.Element("listenedEventId").Value); currentReaction.actorId = int.Parse(xReaction.Element("actorId").Value); currentReaction.type = ReflectOverSeveralNamespaces(xReaction.Element("type").Value, ExtraNamespaces); currentReaction.parameters = ParseParameters(xReaction); generator.AddRuleData(currentReaction); } }