| 184 | } |
| 185 | |
| 186 | void ModuleFactory::buildPopupMenu(int startOffset) |
| 187 | { |
| 188 | MessageManagerLock mmLock; |
| 189 | |
| 190 | menu.clear(); |
| 191 | |
| 192 | OwnedArray<PopupMenu> subMenus; |
| 193 | Array<String> subMenuNames; |
| 194 | Array<bool> lastDefIsCustom; |
| 195 | |
| 196 | for (auto& d : defs) |
| 197 | { |
| 198 | ModuleDefinition* md = static_cast<ModuleDefinition*>(d); |
| 199 | int itemID = defs.indexOf(d) + 1 + startOffset;//start at 1 for menu |
| 200 | |
| 201 | if (md->menuPath.isEmpty()) |
| 202 | { |
| 203 | menu.addItem(itemID, md->type, true, false, md->icon); |
| 204 | continue; |
| 205 | } |
| 206 | |
| 207 | int subMenuIndex = -1; |
| 208 | |
| 209 | for (int i = 0; i < subMenus.size(); ++i) |
| 210 | { |
| 211 | if (subMenuNames[i] == md->menuPath) |
| 212 | { |
| 213 | subMenuIndex = i; |
| 214 | break; |
| 215 | } |
| 216 | } |
| 217 | if (subMenuIndex == -1) |
| 218 | { |
| 219 | subMenuNames.add(md->menuPath); |
| 220 | lastDefIsCustom.add(false); |
| 221 | subMenus.add(new PopupMenu()); |
| 222 | subMenuIndex = subMenus.size() - 1; |
| 223 | } |
| 224 | |
| 225 | |
| 226 | if (md->isCustomModule && !lastDefIsCustom[subMenuIndex]) |
| 227 | { |
| 228 | if (subMenus[subMenuIndex]->getNumItems() > 0) subMenus[subMenuIndex]->addSeparator(); |
| 229 | subMenus[subMenuIndex]->addSectionHeader("Community Modules"); |
| 230 | } |
| 231 | |
| 232 | String label = md->type; |
| 233 | if (md->isLocalModule) label += " (local)"; |
| 234 | if (md->newVersionAvailable) label += " (Update available)"; |
| 235 | |
| 236 | subMenus[subMenuIndex]->addItem(itemID, label, true, false, md->icon); |
| 237 | lastDefIsCustom.set(subMenuIndex, md->isCustomModule); |
| 238 | } |
| 239 | |
| 240 | for (int i = 0; i < subMenus.size(); ++i) menu.addSubMenu(subMenuNames[i], *subMenus[i]); |
| 241 | |
| 242 | menu.addSeparator(); |
| 243 | menu.addItem(-1, "Get more modules..."); |