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(); }
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(); }
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); } }