QMenu *WulforUtil::buildUserCmdMenu(const StringList& hub_list, int ctx, QWidget* parent) { UserCommand::List userCommands = FavoriteManager::getInstance()->getUserCommands(ctx, hub_list); if (userCommands.empty()) return nullptr; QMenu *ucMenu = new QMenu(tr("User commands"), parent); QMenu *menuPtr = ucMenu; for (size_t n = 0; n < userCommands.size(); ++n) { UserCommand *uc = &userCommands[n]; if (uc->getType() == UserCommand::TYPE_SEPARATOR) { // Avoid double separators... if (!menuPtr->actions().isEmpty() && !menuPtr->actions().last()->isSeparator()) { menuPtr->addSeparator(); } } else if (uc->isRaw() || uc->isChat()) { menuPtr = ucMenu; auto _begin = uc->getDisplayName().begin(); auto _end = uc->getDisplayName().end(); for(; _begin != _end; ++_begin) { const QString name = _q(*_begin); if (_begin + 1 == _end) { menuPtr->addAction(name)->setData(uc->getId()); } else { bool found = false; QListIterator<QAction*> iter(menuPtr->actions()); while(iter.hasNext()) { QAction *item = iter.next(); if (item->menu() && item->text() == name) { found = true; menuPtr = item->menu(); break; } } if (!found) menuPtr = menuPtr->addMenu(name); } } } } return ucMenu; }