// Generate the breadcrumb public void GenerateBreadcrumb(MenuEntryData inputData) { Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Generating breadcrumb"); // Write to console switch (inputData.id.currentLevel) // Switch based on current menu level and setup all entries { case -1: // Home breadcrumb.suite.Setup(inputData, 1, 0); breadcrumb.type.Setup(inputData, 1, 1); breadcrumb.group.Setup(inputData, 1, 2); break; case 0: // Suite breadcrumb.suite.Setup(inputData, 0, 0); breadcrumb.type.Setup(inputData, 1, 1); breadcrumb.group.Setup(inputData, 1, 2); break; case 1: // Type breadcrumb.suite.Setup(inputData, 2, 0); breadcrumb.type.Setup(inputData, 0, 1); breadcrumb.group.Setup(inputData, 1, 2); break; case 2: // Scene breadcrumb.suite.Setup(inputData, 2, 0); breadcrumb.type.Setup(inputData, 2, 1); breadcrumb.group.Setup(inputData, 0, 2); break; } }
// Clone a MenuEntryData class public MenuEntryData CloneMenuEntryData(MenuEntryData input) { MenuEntryData output = new MenuEntryData(); output.entryName = input.entryName; output.selectionState = input.selectionState; output.id = CloneMenuTestEntry(input.id); return(output); }
// ------------------------------------------------------------------------------------ // Initialization // Setup the entry public void Setup(MenuEntryData data) { Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Setting up menu list entry"); // Write to console entryData = Menu.Instance.CloneMenuEntryData(data); // Clone the entry data entryLabel.text = entryData.entryName; // Set label text selectionToggle.Setup(this); // Setup the selection toggle selectionToggle.SetSelectionState(entryData.selectionState); // Set selection state of the toggle mainButton.onClick.RemoveAllListeners(); // Remove button listeners mainButton.onClick.AddListener(delegate { Menu.Instance.OnListEntryClick(this); }); // Add listener }
// Called every time a breadcrumb entry is clicked (button listener) public void OnBreadcrumbEntryClick(MenuBreadcrumbEntry clicked) { Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Clicked: Breadcrumb entry"); // Write to console MenuEntryData entryData = CloneMenuEntryData(clicked.entryData); // Clone the entry data of the clicked entry ClearList(); // Clear the list selectedId = entryData.id; // Set selected id GenerateBreadcrumb(clicked.entryData); // Generate new breadcrumb selectedId.currentLevel++; // Increment current level GenerateList(); // Generate a new list CheckViewButtonStatus(); // Check view button status }
// Master class for setting selection state recursively down the hierarchy. Calls sub-function per level for every necessary level void SetSelectionStateOnChildren(MenuEntryData entryData) { switch (entryData.id.currentLevel) { case 0: // Suite SetSelectionOfLevelDownward(entryData, 0); break; case 1: // Type SetSelectionOfLevelDownward(entryData, 1); break; case 2: // Scene SetSelectionOfLevelDownward(entryData, 2); break; } Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Changed selection state for all children of entry " + entryData.entryName); // Write to console }
// Master class for setting selection state recursively up the hierarchy. Calls sub-function per level for every necessary level void SetSelectionStateOnParents(MenuEntryData entryData) { switch (entryData.id.currentLevel) { case 1: // Type SetSelectionOfLevelUpward(entryData, 0); break; case 2: // Scene SetSelectionOfLevelUpward(entryData, 1); SetSelectionOfLevelUpward(entryData, 0); break; case 3: // Test SetSelectionOfLevelUpward(entryData, 2); SetSelectionOfLevelUpward(entryData, 1); SetSelectionOfLevelUpward(entryData, 0); break; } Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Changed selection state for all parents of entry " + entryData.entryName); // Write to console }
// Set a selection state of a specific level based on its immediate children void SetSelectionOfLevelDownward(MenuEntryData entryData, int setLevel) // TODO - Can we shorten this? { switch (setLevel) { case 0: // Suite for (int ty = 0; ty < testStructure.suites[entryData.id.suiteId].types.Count; ty++) { testStructure.suites[entryData.id.suiteId].types[ty].selectionState = entryData.selectionState; for (int gr = 0; gr < testStructure.suites[entryData.id.suiteId].types[ty].groups.Count; gr++) { testStructure.suites[entryData.id.suiteId].types[ty].groups[gr].selectionState = entryData.selectionState; for (int te = 0; te < testStructure.suites[entryData.id.suiteId].types[ty].groups[gr].tests.Count; te++) { testStructure.suites[entryData.id.suiteId].types[ty].groups[gr].tests[te].selectionState = entryData.selectionState; } } } break; case 1: // Type for (int gr = 0; gr < testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups.Count; gr++) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[gr].selectionState = entryData.selectionState; for (int te = 0; te < testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[gr].tests.Count; te++) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[gr].tests[te].selectionState = entryData.selectionState; } } break; case 2: // Scene for (int i = 0; i < testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests.Count; i++) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests[i].selectionState = entryData.selectionState; } break; } }
// ------------------------------------------------------------------------------------ // Initialization // Setup the breacrumb public void Setup(MenuEntryData data, int state, int level) { Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Setting up menu breadcrumb entry"); // Write to console switch (state) { case 0: // New entryData = Menu.Instance.CloneMenuEntryData(data); // Clone the entry data mainButton.onClick.RemoveAllListeners(); // Remove listeners mainButton.onClick.AddListener(delegate { Menu.Instance.OnBreadcrumbEntryClick(this); }); // Add listener entryLabel.text = TestStructure.Instance.GetNameOfEntry(level, entryData.id.suiteId, entryData.id.typeId, entryData.id.groupId, entryData.id.testId); // Get the label text entryLabel.color = Menu.Instance.GetColor(0); // Set color mainButton.interactable = true; // Set interactable break; case 1: // Clear entryLabel.text = Menu.Instance.GetLevelName(level); // Get level name and set to label entryLabel.color = Menu.Instance.GetColor(1); // Set color mainButton.interactable = false; // Set non-interactable break; case 2: // Ignore break; } }
// ------------------------------------------------------------------------------------ // Set Selection // - TODO - Clean and comment this public void SetSelectionState(MenuEntryData entryData) { switch (entryData.id.currentLevel) { case 0: // Suite testStructure.suites[entryData.id.suiteId].selectionState = entryData.selectionState; break; case 1: // Type testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].selectionState = entryData.selectionState; break; case 2: // Scene testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].selectionState = entryData.selectionState; break; case 3: // Test testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests[entryData.id.testId].selectionState = entryData.selectionState; break; } SetSelectionStateOnChildren(entryData); SetSelectionStateOnParents(entryData); Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Changed selection state for entry " + entryData.entryName); // Write to console }
// Set a selection state of a specific level based on its immediate children void SetSelectionOfLevelUpward(MenuEntryData entryData, int setLevel) // TODO - Can we shorten this? { int x = 0; switch (setLevel) { case 0: // Suite for (int i = 0; i < testStructure.suites[entryData.id.suiteId].types.Count; i++) { if (testStructure.suites[entryData.id.suiteId].types[i].selectionState == 2) { break; } else if (testStructure.suites[entryData.id.suiteId].types[i].selectionState == 0) { x--; } else { x++; } } if (x == testStructure.suites[entryData.id.suiteId].types.Count) { testStructure.suites[entryData.id.suiteId].selectionState = 1; } else if (x == -testStructure.suites[entryData.id.suiteId].types.Count) { testStructure.suites[entryData.id.suiteId].selectionState = 0; } else { testStructure.suites[entryData.id.suiteId].selectionState = 2; } break; case 1: // Type for (int i = 0; i < testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups.Count; i++) { if (testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[i].selectionState == 2) { break; } else if (testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[i].selectionState == 0) { x--; } else { x++; } } if (x == testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups.Count) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].selectionState = 1; } else if (x == -testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups.Count) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].selectionState = 0; } else { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].selectionState = 2; } break; case 2: // Scene for (int i = 0; i < testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests.Count; i++) { if (testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests[i].selectionState == 2) { break; } else if (testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests[i].selectionState == 0) { x--; } else { x++; } } if (x == testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests.Count) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].selectionState = 1; } else if (x == -testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].tests.Count) { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].selectionState = 0; } else { testStructure.suites[entryData.id.suiteId].types[entryData.id.typeId].groups[entryData.id.groupId].selectionState = 2; } break; } }
// Get a list of entries at a specific level public MenuEntryData[] GetEntries(MenuTestEntry input) // TODO - Can we shorten this? { MenuEntryData[] output = null; if (input.currentLevel == 0) { output = new MenuEntryData[testStructure.suites.Count]; } for (int su = 0; su < testStructure.suites.Count; su++) { if (input.currentLevel == 0) { MenuEntryData entry = new MenuEntryData(); MenuTestEntry id = Menu.Instance.CloneMenuTestEntry(input); id.suiteId = su; // Replace relevent data entry.entryName = testStructure.suites[su].suiteName; entry.selectionState = testStructure.suites[su].selectionState; entry.id = id; output[su] = entry; } if (input.currentLevel >= 1) { if (su == input.suiteId) { if (input.currentLevel == 1) { output = new MenuEntryData[testStructure.suites[su].types.Count]; } for (int ty = 0; ty < testStructure.suites[su].types.Count; ty++) { if (input.currentLevel == 1 && su == input.suiteId) { MenuEntryData entry = new MenuEntryData(); MenuTestEntry id = Menu.Instance.CloneMenuTestEntry(input); id.currentLevel = 1; // Replace relevent data id.suiteId = su; // Replace relevent data id.typeId = ty; // Replace relevent data entry.entryName = testStructure.suites[su].types[ty].typeName; entry.selectionState = testStructure.suites[su].types[ty].selectionState; entry.id = id; output[ty] = entry; } if (input.currentLevel >= 2) { if (ty == input.typeId) { if (input.currentLevel == 2) { output = new MenuEntryData[testStructure.suites[su].types[ty].groups.Count]; } for (int gr = 0; gr < testStructure.suites[su].types[ty].groups.Count; gr++) { if (input.currentLevel == 2 && ty == input.typeId) { MenuEntryData entry = new MenuEntryData(); MenuTestEntry id = Menu.Instance.CloneMenuTestEntry(input); id.currentLevel = 2; // Replace relevent data id.suiteId = su; // Replace relevent data id.typeId = ty; // Replace relevent data id.groupId = gr; // Replace relevent data entry.entryName = testStructure.suites[su].types[ty].groups[gr].groupName; entry.selectionState = testStructure.suites[su].types[ty].groups[gr].selectionState; entry.id = id; output[gr] = entry; } if (input.currentLevel >= 3) { if (gr == input.groupId) { if (input.currentLevel == 3) { output = new MenuEntryData[testStructure.suites[su].types[ty].groups[gr].tests.Count]; } for (int te = 0; te < testStructure.suites[su].types[ty].groups[gr].tests.Count; te++) { if (input.currentLevel == 3 && gr == input.groupId) { MenuEntryData entry = new MenuEntryData(); MenuTestEntry id = Menu.Instance.CloneMenuTestEntry(input); id.currentLevel = 3; // Replace relevent data id.suiteId = su; // Replace relevent data id.typeId = ty; // Replace relevent data id.groupId = gr; // Replace relevent data id.testId = te; // Replace relevent data entry.entryName = testStructure.suites[su].types[ty].groups[gr].tests[te].testName; entry.selectionState = testStructure.suites[su].types[ty].groups[gr].tests[te].selectionState; entry.id = id; output[te] = entry; } } } } } } } } } } } Console.Instance.Write(DebugLevel.Full, MessageLevel.Log, "Returned entry list for level " + input.currentLevel); // Write to console return(output); }