/** * Returns a unique menu-name for a new menu under @p menuName * inspired by @p newMenu */ QString MenuFile::uniqueMenuName(const QString &menuName, const QString &newMenu, const QStringList & excludeList) { QDomElement elem = findMenu(m_doc.documentElement(), menuName, false); QString result = newMenu; if (result.endsWith('/')) result.truncate(result.length()-1); QRegExp r("(.*)(?=-\\d+)"); result = (r.indexIn(result) > -1) ? r.cap(1) : result; int trunc = result.length(); // Position of trailing '/' result.append("/"); for(int n = 1; ++n; ) { if (findMenu(elem, result, false).isNull() && !excludeList.contains(result)) return result; result.truncate(trunc); result.append(QString("-%1/").arg(n)); } return QString(); // Never reached }
void MenuFile::moveMenu(const QString &oldMenu, const QString &newMenu) { m_bDirty = true; // Undelete the new menu QDomElement elem = findMenu(m_doc.documentElement(), newMenu, true); purgeDeleted(elem); elem.appendChild(m_doc.createElement(MF_NOTDELETED)); // TODO: GET RID OF COMMON PART, IT BREAKS STUFF // Find common part QStringList oldMenuParts = QStringList::split('/', oldMenu); QStringList newMenuParts = QStringList::split('/', newMenu); QString commonMenuName; uint max = QMIN(oldMenuParts.count(), newMenuParts.count()); uint i = 0; for(; i < max; i++) { if(oldMenuParts[i] != newMenuParts[i]) break; commonMenuName += '/' + oldMenuParts[i]; } QString oldMenuName; for(uint j = i; j < oldMenuParts.count(); j++) { if(i != j) oldMenuName += '/'; oldMenuName += oldMenuParts[j]; } QString newMenuName; for(uint j = i; j < newMenuParts.count(); j++) { if(i != j) newMenuName += '/'; newMenuName += newMenuParts[j]; } if(oldMenuName == newMenuName) return; // Can happen elem = findMenu(m_doc.documentElement(), commonMenuName, true); // Add instructions for moving QDomElement moveNode = m_doc.createElement(MF_MOVE); QDomElement node = m_doc.createElement(MF_OLD); node.appendChild(m_doc.createTextNode(oldMenuName)); moveNode.appendChild(node); node = m_doc.createElement(MF_NEW); node.appendChild(m_doc.createTextNode(newMenuName)); moveNode.appendChild(node); elem.appendChild(moveNode); }
void SegmentTool::createMenu() { // New version based on the one in MatrixTool. const QString rcFileName = "segmenttool.rc"; //RG_DEBUG << "SegmentTool::createMenu() " << rcFileName << " - " << m_menuName << endl; if (!createGUI(rcFileName)) { std::cerr << "SegmentTool::createMenu(" << rcFileName << "): menu creation failed\n"; m_menu = 0; return; } QMenu *menu = findMenu(m_menuName); if (!menu) { std::cerr << "SegmentTool::createMenu(" << rcFileName << "): menu name " << m_menuName << " not created by RC file\n"; return; } m_menu = menu; }
void MenuFile::removeMenu(const QString &menuName) { m_bDirty = true; QDomElement elem = findMenu(m_doc.documentElement(), menuName, true); purgeDeleted(elem); elem.appendChild(m_doc.createElement(MF_DELETED)); }
void MenuFile::addMenu(const QString &menuName, const QString &menuFile) { m_bDirty = true; QDomElement elem = findMenu(m_doc.documentElement(), menuName, true); QDomElement dirElem = m_doc.createElement(MF_DIRECTORY); dirElem.appendChild(m_doc.createTextNode(entryToDirId(menuFile))); elem.appendChild(dirElem); }
/************************************************ Search item by path. The path can be absolute or relative. If the element not found, the behavior depends on a parameter "createNonExisting." If it's true, then the missing items will be created, otherwise the function returns 0. ************************************************/ QDomElement XdgMenu::findMenu(QDomElement& baseElement, const QString& path, bool createNonExisting) { Q_D(XdgMenu); // Absolute path .................. if (path.startsWith('/')) { QDomElement root = d->mXml.documentElement(); return findMenu(root, path.section('/', 2), createNonExisting); } // Relative path .................. if (path.isEmpty()) return baseElement; QString name = path.section('/', 0, 0); MutableDomElementIterator it(baseElement); while(it.hasNext()) { QDomElement n = it.next(); if (n.attribute("name") == name) return findMenu(n, path.section('/', 1), createNonExisting); } // Not found ...................... if (!createNonExisting) return QDomElement(); QStringList names = path.split('/', QString::SkipEmptyParts); QDomElement el = baseElement; foreach (QString name, names) { QDomElement p = el; el = d->mXml.createElement("Menu"); p.appendChild(el); el.setAttribute("name", name); }
void MenuFile::setLayout(const QString &menuName, const QStringList &layout) { m_bDirty = true; QDomElement elem = findMenu(m_doc.documentElement(), menuName, true); purgeLayout(elem); QDomElement layoutNode = m_doc.createElement(MF_LAYOUT); elem.appendChild(layoutNode); for(QStringList::ConstIterator it = layout.constBegin(); it != layout.constEnd(); ++it) { QString li = *it; if (li == ":S") { layoutNode.appendChild(m_doc.createElement(MF_SEPARATOR)); } else if (li == ":M") { QDomElement mergeNode = m_doc.createElement(MF_MERGE); mergeNode.setAttribute("type", "menus"); layoutNode.appendChild(mergeNode); } else if (li == ":F") { QDomElement mergeNode = m_doc.createElement(MF_MERGE); mergeNode.setAttribute("type", "files"); layoutNode.appendChild(mergeNode); } else if (li == ":A") { QDomElement mergeNode = m_doc.createElement(MF_MERGE); mergeNode.setAttribute("type", "all"); layoutNode.appendChild(mergeNode); } else if (li.endsWith('/')) { li.truncate(li.length()-1); QDomElement menuNode = m_doc.createElement(MF_MENUNAME); menuNode.appendChild(m_doc.createTextNode(li)); layoutNode.appendChild(menuNode); } else { QDomElement fileNode = m_doc.createElement(MF_FILENAME); fileNode.appendChild(m_doc.createTextNode(li)); layoutNode.appendChild(fileNode); } } }
void MenuFile::removeEntry(const QString &menuName, const QString &menuId) { m_bDirty = true; m_removedEntries.append(menuId); QDomElement elem = findMenu(m_doc.documentElement(), menuName, true); QDomElement excludeNode; QDomElement includeNode; purgeIncludesExcludes(elem, menuId, excludeNode, includeNode); if (excludeNode.isNull()) { excludeNode = m_doc.createElement(MF_EXCLUDE); elem.appendChild(excludeNode); } QDomElement fileNode = m_doc.createElement(MF_FILENAME); fileNode.appendChild(m_doc.createTextNode(menuId)); excludeNode.appendChild(fileNode); }
void MatrixTool::createMenu() { MATRIX_DEBUG << "MatrixTool::createMenu() " << m_rcFileName << " - " << m_menuName << endl; if (!createGUI(m_rcFileName)) { std::cerr << "MatrixTool::createMenu(" << m_rcFileName << "): menu creation failed" << std::endl; m_menu = 0; return; } QMenu *menu = findMenu(m_menuName); if (!menu) { std::cerr << "MatrixTool::createMenu(" << m_rcFileName << "): menu name " << m_menuName << " not created by RC file\n"; return; } m_menu = menu; }
void MatrixTool::createMenu() { MATRIX_DEBUG << "MatrixTool::createMenu() " << m_rcFileName << " - " << m_menuName; if (!createGUI(m_rcFileName)) { RG_WARNING << "MatrixTool::createMenu(" << m_rcFileName << "): menu creation failed"; m_menu = 0; return; } QMenu *menu = findMenu(m_menuName); if (!menu) { RG_WARNING << "MatrixTool::createMenu(" << m_rcFileName << "): menu name " << m_menuName << " not created by RC file"; return; } m_menu = menu; }
QDomElement MenuFile::findMenu(QDomElement elem, const QString &menuName, bool create) { QString menuNodeName; QString subMenuName; int i = menuName.indexOf('/'); if (i >= 0) { menuNodeName = menuName.left(i); subMenuName = menuName.mid(i+1); } else { menuNodeName = menuName; } if (i == 0) return findMenu(elem, subMenuName, create); if (menuNodeName.isEmpty()) return elem; QDomNode n = elem.firstChild(); while( !n.isNull() ) { QDomElement e = n.toElement(); // try to convert the node to an element. if (e.tagName() == MF_MENU) { QString name; QDomNode n2 = e.firstChild(); while ( !n2.isNull() ) { QDomElement e2 = n2.toElement(); if (!e2.isNull() && e2.tagName() == MF_NAME) { name = e2.text(); break; } n2 = n2.nextSibling(); } if (name == menuNodeName) { if (subMenuName.isEmpty()) return e; else return findMenu(e, subMenuName, create); } } n = n.nextSibling(); } if (!create) return QDomElement(); // Create new node. QDomElement newElem = m_doc.createElement(MF_MENU); QDomElement newNameElem = m_doc.createElement(MF_NAME); newNameElem.appendChild(m_doc.createTextNode(menuNodeName)); newElem.appendChild(newNameElem); elem.appendChild(newElem); if (subMenuName.isEmpty()) return newElem; else return findMenu(newElem, subMenuName, create); }
/*--------------------------------------------------------------------- * Build a menu and Handle user selection */ void BuildMenu(void * menuP,char * dummyP) { short int menuItemCount=0; int key,index; static int menulevel=0; MenuItem_T *menulistP = ((Menu_T *)menuP)->menuList; while(menulistP[menuItemCount].displayedString != 0) menuItemCount++; index = 0; menulevel ++; do { if (index < 0 || index >= menuItemCount) index = 0; drawMenu((Menu_T *)menuP,index); //Wait for any key pressed waitkey: key = GetKey(); if (ISCONTROLKEY(key)) { if (key == KEY_UP) { index --; if (index < 0) { index = menuItemCount -1; } continue; } else if (key == KEY_DOWN) { index ++; if (index >= menuItemCount) { index = 0; } continue; } else if (key == KEY_ACTION) { ; } else if (key == KEY_BACK) { //to upper level menu if (menulevel > 1) break; else goto waitkey; } else if (key == KEY_UNKNOWN) { goto waitkey; } } else { //user activate the menu handler thru selection char(e.g. press number) index = findMenu(translateKey(key),menulistP); if (index == -1) goto waitkey; //invalid selection, just do nothing } if (menulistP[index].func) menulistP[index].func(menulistP[index].arg,menulistP[index].cmdlineString); else { break;//exit the current menu } }while(1); menulevel --; }