void AddNodes(TreeNodeCollection treeNodeCollection, NesMenuCollection nesMenuCollection, List <NesMenuCollection> usedFolders = null) { if (usedFolders == null) { usedFolders = new List <NesMenuCollection>(); } if (usedFolders.Contains(nesMenuCollection)) { return; } usedFolders.Add(nesMenuCollection); var sorted = nesMenuCollection.OrderBy(o => o.Name).OrderBy(o => (o is NesMenuFolder) ? (byte)(o as NesMenuFolder).Position : 2); foreach (var nesElement in sorted) { var newNode = new TreeNode(); if (nesElement is NesMenuFolder) { if (usedFolders.Contains((nesElement as NesMenuFolder).ChildMenuCollection)) { nesMenuCollection.Remove(nesElement); // We don't need any "back" folders continue; } } newNode.SelectedImageIndex = newNode.ImageIndex = getImageIndex(nesElement as INesMenuElement); newNode.Text = nesElement.Name; newNode.Tag = nesElement; treeNodeCollection.Add(newNode); if (nesElement is NesMenuFolder) { AddNodes(newNode.Nodes, (nesElement as NesMenuFolder).ChildMenuCollection, usedFolders); } } }
void XmlToNode(XmlDocument xml, XmlNodeList elements, NesMenuCollection rootMenuCollection, NesMenuCollection nesMenuCollection = null) { if (nesMenuCollection == null) { nesMenuCollection = rootMenuCollection; } foreach (XmlNode element in elements) { switch (element.Name) { case "Folder": var folder = new NesMenuFolder(element.Attributes["name"].Value, element.Attributes["icon"].Value); folder.Position = (NesMenuFolder.Priority) byte.Parse(element.Attributes["position"].Value); nesMenuCollection.Add(folder); XmlToNode(xml, element.ChildNodes, rootMenuCollection, folder.ChildMenuCollection); break; case "Game": case "OriginalGame": var code = element.Attributes["code"].Value; var games = from n in rootMenuCollection where ((n is NesMiniApplication || n is NesDefaultGame) && (n.Code == code)) select n; if (games.Count() > 0) { var game = games.First(); nesMenuCollection.Add(game); rootMenuCollection.Remove(game); } break; } } }