menugenerator.cc
来自「c++的guiQt做的开发」· CC 代码 · 共 163 行
CC
163 行
/** @file Checker and translation generator of menu configuration<br> This is helper utility used to:<br> - check menus for translatable strings and write them to .menu-trans.h, so they will be found by lupdate utility<br> - check menus for unreferenced items<br> @author Martin Petricek*/#include "menugenerator.h"#include "config.h"#include "menu.h"#include <util.h>#include <QFile>#include <QTextStream>#include <iostream>#include <string.h>using namespace std;using namespace util;/** Constructor */MenuGenerator::MenuGenerator() { set=new gui::StaticSettings(); //generate to/from current directory set->tryLoad(CONFIG_FILE);}/** Destructor */MenuGenerator::~MenuGenerator() { delete set;}/** Check if given name is a "special item" (or separator) @param itemName Name of the item @return true if the item is special, false if not.*/bool MenuGenerator::special(const QString &itemName) { if (itemName=="") return true; if (itemName=="-") return true; if (itemName.startsWith("_")) return true; return false;}/** Set menu item as "reachable" (increases its reference count) and add translation on it. Recursively run on subitems if item is list @param name Id of menu item*/void MenuGenerator::setAvail(const QString &name) { if (special(name)) return; //return if separator avail[name]+=1; if (avail[name]>=2) return; //already seen this one QString line=set->readEntry("gui/items/"+name); line=line.trimmed(); if (line.startsWith("list ")) { // List of values - a submenu, first is name of submenu, others are items in it line=line.remove(0,5); QStringList qs=explode(gui::MENULIST_SEPARATOR,line); QStringList::Iterator it=qs.begin(); if (it!=qs.end()) { if (!special(*it)) { //not a separator or special item addLocString(name,*it); } ++it; } else fatalErrorConsole("Invalid menu item in config:\n"+line); for (;it!=qs.end();++it) { //load all subitems setAvail(*it); } } else if (line.startsWith("label ")) { // A single item line=line.remove(0,6); addLocString(name,line); } else if (line.startsWith("item ")) { // A single item line=line.remove(0,5); QStringList qs=explode(gui::MENUDEF_SEPARATOR,line,true); addLocString(name,qs[0]); if (qs.count()<2) fatalErrorConsole("Invalid menu item in config:\n"+line); } else { //something invalid fatalErrorConsole("Invalid menu item in config:\n"+line); }}/** Check menu structure, print items and their reference counts Warn about unreferenced items*/void MenuGenerator::check() { QStringList items=set->entryList("gui/items"); QString toolBarList=set->readEntry("gui/toolbars"); toolBarList=toolBarList.trimmed(); QStringList toolb=toolBarList.split(","); //Toolbars are root items for (QStringList::Iterator it=toolb.begin();it!=toolb.end();++it) { setAvail(*it); } //Main menu is root item setAvail("MainMenu"); int ava; for (QStringList::Iterator it=items.begin();it!=items.end();++it) { cout << "Item : "; cout.width(20); cout.flags(ios::left); cout << (*it).toAscii().data(); ava=avail[*it]; if (!ava) cout << " (unreachable!)"; else cout << " (" << ava << " refs)"; cout << endl; }}/** Add menu to localization list @param id Id of menu item @param name Caption of menu item*/void MenuGenerator::addLocString(const QString &id,const QString &name) { trans+=QString("QT_TRANSLATE_NOOP( \"gui::Settings\",\"")+name+"\",\""+id+"\")"; cout << id.toAscii().data() << " = " << name.toAscii().data() << endl;}/** Produce dummy header used for menu items localization */void MenuGenerator::translate() { check(); QString trx=trans.join("\n")+"\n"; QFile file(".menu-trans.h"); if ( file.open( QIODevice::WriteOnly ) ) { QTextStream stream( &file ); stream << "//File automatically generated by menugenerator from " CONFIG_FILE << endl; stream << "//Do not edit, any changes will be overwritten" << endl; stream << trx; file.close(); } else { fatalErrorConsole("Cannot open file on write!"); }}/** Main function of menugenerator utility @param argc Argument count @param argv Commandline arguments @return Executable return code*/int main(int argc, char *argv[]){ MenuGenerator m; cout << " \"menugenerator\" to check menus" <<endl << " \"menugenerator -trans\" to generate translation" <<endl; if (argc>1) { if (strcmp(argv[1],"-trans")==0) { cout << "Checking menu" << endl; m.translate(); cout << "Done checking menu" << endl; } } else { //check menus, do localization cout << "Checking menu" << endl; //TODO: check accelerator conflicts in single menu m.check(); cout << "Done checking menu" << endl; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?