public void InitToolBar() { nodesToolStrip.Items.Clear(); CategorySortingHat categorizer = CategorizeEnabledNodes(); foreach (NodeCategory category in categorizer.SortedCategories.Reverse()) // drop downs are added from the bottom { ToolStripDropDownButton toolbarDropDown = CreateToolStripMenu(category.Name, category.SmallImage); toolbarDropDown.Tag = category.Name; // TODO(Premek): pass target drop down in a UiTag attribute toolbarDropDown.ToolTipText = category.Name; nodesToolStrip.Items.Add(toolbarDropDown); } foreach (MyNodeConfig nodeConfig in categorizer.Nodes) { AddNodeButtonToCategoryMenu(nodeConfig); } nodesToolStrip.Items.Add(new ToolStripSeparator()); InitQuickToolBar(categorizer); }
public void DetectsCategoryFromGoodAiModulesNamespace() { var nodeConfig = new MyNodeConfig(); nodeConfig.NodeType = typeof(FoobarType); Assert.Equal("(Foo)", CategorySortingHat.DetectCategoryName(nodeConfig)); }
public void DetectsCategoryFromNamespace() { var nodeConfig = new MyNodeConfig(); nodeConfig.NodeType = typeof(TestType); Assert.Equal("(GoodAI.BrainSimulator)", CategorySortingHat.DetectCategoryName(nodeConfig)); }
private void PopulateNodeListViewByCategory(string categoryName) { if (string.IsNullOrEmpty(categoryName)) { return; } PopulateNodeListView(m_nodeInfoItems .Where(item => CategorySortingHat.DetectCategoryName(item.Config) == categoryName) .Select(item => item.ListViewItem)); }
private void InitQuickToolBar(CategorySortingHat categorizer) { Settings settings = Settings.Default; if (settings.QuickToolBarNodes == null) { AppSettings.SaveSettings(savedSettings => savedSettings.QuickToolBarNodes = new StringCollection()); } foreach (MyNodeConfig nodeConfig in categorizer.Nodes) { if (settings.QuickToolBarNodes.Contains(nodeConfig.NodeType.Name)) { AddNodeButton(nodeConfig); } } }
private void PopulateCategoryListView(CategorySortingHat categorizer) { foreach (NodeCategory category in categorizer.SortedCategories) { filterImageList.Images.Add(GeneratePaddedIcon(category.SmallImage)); var categoryItem = new ListViewItem(new string[1] { category.Name }) { Tag = category.Name, // TODO(Premek): consider tagging with NodeCategory object ImageIndex = filterImageList.Images.Count - 1 }; filterList.Items.Add(categoryItem); } }
private void AddNodeButtonToCategoryMenu(MyNodeConfig nodeConfig) { ToolStripDropDownButton targetMenuButton = FindTargetMenuButton(CategorySortingHat.DetectCategoryName(nodeConfig)); // TODO: optimize with HashSet if (targetMenuButton == null) { return; } ToolStripItem newButton = new ToolStripMenuItem() { Text = MyProject.ShortenNodeTypeName(nodeConfig.NodeType), DisplayStyle = ToolStripItemDisplayStyle.ImageAndText }; ToolStripItemCollection targetItems = targetMenuButton.DropDownItems; InnerAddNodeButtonOrMenuItem(newButton, nodeConfig, targetItems, addSeparators: true); }
public CategorySortingHat CategorizeEnabledNodes() { HashSet <string> enabledNodes = new HashSet <string>(); if (Settings.Default.ToolBarNodes != null) { foreach (string nodeTypeName in Settings.Default.ToolBarNodes) { enabledNodes.Add(nodeTypeName); } } var categorizer = new CategorySortingHat(); foreach (MyNodeConfig nodeConfig in MyConfiguration.KnownNodes.Values) { if (nodeConfig.CanBeAdded && (enabledNodes.Contains(nodeConfig.NodeType.Name))) { categorizer.AddNodeAndCategory(nodeConfig); } } return(categorizer); }
private void GenerateNodeList() { var enabledNodes = new HashSet <string>(); if (Properties.Settings.Default.ToolBarNodes != null) { foreach (string nodeTypeName in Properties.Settings.Default.ToolBarNodes) { enabledNodes.Add(nodeTypeName); } } var knownNodes = new Dictionary <string, List <MyNodeConfig> >(); foreach (MyNodeConfig nodeConfig in MyConfiguration.KnownNodes.Values) { if (!nodeConfig.CanBeAdded || (nodeConfig.NodeType == null)) { continue; } string nameSpace = nodeConfig.NodeType.Namespace ?? "(unknown)"; if (!knownNodes.ContainsKey(nameSpace)) { knownNodes[nameSpace] = new List <MyNodeConfig>(); } knownNodes[nameSpace].Add(nodeConfig); } knownNodes["Worlds"] = new List <MyNodeConfig>(); foreach (MyWorldConfig nodeConfig in MyConfiguration.KnownWorlds.Values) { knownNodes["Worlds"].Add(nodeConfig); } var categorizer = new CategorySortingHat(); int i = 0; nodeImageList.Images.Add(GeneratePaddedIcon(Properties.Resources.group)); i++; nodeImageList.Images.Add(GeneratePaddedIcon(Properties.Resources.world)); i++; List <string> moduleNameSpaces = knownNodes.Keys.ToList().OrderBy(x => x).ToList(); foreach (string nameSpace in moduleNameSpaces) { ListViewGroup group = new ListViewGroup(nameSpace, nameSpace.Replace("BrainSimulator.", "")); nodeListView.Groups.Add(group); List <MyNodeConfig> nodesInGroup = knownNodes[nameSpace].OrderBy(x => x.NodeType.Name).ToList();; foreach (MyNodeConfig nodeConfig in nodesInGroup) { categorizer.AddNodeAndCategory(nodeConfig); MyObsoleteAttribute obsolete = nodeConfig.NodeType.GetCustomAttribute <MyObsoleteAttribute>(true); bool complete; string[] subitems = ProduceSubitemTexts(nodeConfig, obsolete, out complete); ListViewItem item = new ListViewItem(subitems) { Tag = nodeConfig, Group = @group, Checked = enabledNodes.Contains(nodeConfig.NodeType.Name) }; // forbid to remove currently selected world if (nodeConfig.NodeType == m_mainForm.Project.World.GetType()) { item.BackColor = Color.FromArgb(150, 200, 240); // (light gray-blue) item.ToolTipText = "This world is being used by the current project (can't be deselected)."; // NOTE: the item's checkbox can't be disabled, we just override changes in nodeListView_ItemCheck() } if (obsolete != null) { item.ForeColor = SystemColors.GrayText; } else { if (!complete) { item.ForeColor = Color.Red; } } if (nameSpace != "Worlds") { item.ImageIndex = i; nodeImageList.Images.Add(GeneratePaddedIcon(nodeConfig.SmallImage)); i++; } else { item.ImageIndex = 1; } m_nodeInfoItems.Add(new UiNodeInfo(item, nodeConfig, string.Join("|", subitems))); } } PopulateCategoryListView(categorizer); }