⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messagemodel.cpp

📁 QT 开发环境里面一个很重要的文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        if ((sortOrder == Qt::AscendingOrder) ? (nleft < nright) : (nleft > nright))            return true;        break; }    case 2:        nleft = left->finishedCount();        nright = right->finishedCount();        if ((sortOrder == Qt::AscendingOrder) ? (nleft < nright) : (nleft > nright))            return true;        break;    default:        nleft = nright = 0;        break;    }    if (sSortColumn != 1 && nleft == nright) {        sortOrder = Qt::AscendingOrder;    }    if (sSortColumn == 1 || nleft == nright) {        res = QString::localeAwareCompare(left->context(), right->context());        if ((sortOrder == Qt::AscendingOrder) ? (res < 0) : !(res < 0))            return true;    }    return false;}ContextItem *MessageModel::contextItem(int context) const{    if (context >= 0 && context < cntxtList.count()) return cntxtList[context];    return 0;}/** * class MessageModelTranslator * * */class MessageModelTranslator : public QTranslator{public:    MessageModelTranslator(MessageModel *msgmodel): QTranslator(msgmodel)    {        //m_msgModel = msgmodel;    }    virtual ~MessageModelTranslator() {}    virtual bool isEmpty() const;    virtual QString translate(const char *context, const char *sourcetext, const char *comment = 0) const;private:    MessageModel *messageModel() const { return static_cast<MessageModel*>(parent()); }};bool MessageModelTranslator::isEmpty() const{    return messageModel()->isEmpty();}QString MessageModelTranslator::translate(const char *context, const char *sourcetext, const char *comment /*= 0*/) const{    MessageItem *m = messageModel()->findMessage(context, sourcetext, comment);    return m ? m->translation() : QString();}MessageItem *MessageModel::messageItem(int context, int message) const{    ContextItem *c = contextItem(context);    if (c && message >= 0 && message < c->messageItemsInList()) return c->messageItem(message);    return 0;}bool MessageModel::findMessage(int *contextNo, int *itemNo, const QString &findText, int findWhere,     bool matchSubstring, Qt::CaseSensitivity cs){    bool found = false;    if (contextsInList() <= 0)        return false;    int pass = 0;    int scopeNum = *contextNo;    int itemNum = *itemNo;    MessageItem *m = 0;    // We want to search the scope we started from *again*, since we did not necessarily search that *completely* when we started.    // (Problaby we started somewhere in the middle of it.)    // Therefore, "pass <=" and not "pass < "     while (!found && pass <= contextsInList()) {        ContextItem *c = contextList().at(scopeNum);        for (int mit = itemNum; mit < c->messageItemsInList() ; ++mit) {            m = c->messageItem(mit);            QString searchText;            switch (findWhere) {                case SourceText:                    searchText = m->sourceText();                    break;                case Translations:                    searchText = m->translation();                    break;                case Comments:                    searchText = c->fullContext();                    break;            }            if (matchSubstring) {                if (searchText.indexOf(findText,0, cs) >= 0) {                    found = true;                    break;                }            } else {                if (cs == Qt::CaseInsensitive) {                    if (findText.toLower() == searchText.toLower()) {                        found = true;                        break;                    }                } else {                    if ( findText == searchText ) {                        found = true;                        break;                    }                }            }        }        itemNum = 0;        ++pass;        ++scopeNum;        if (scopeNum >= contextsInList()) {            scopeNum = 0;            //delayedMsg = tr("Search wrapped.");        }    }    if (found) {        *itemNo = itemNum;        *contextNo = scopeNum;    }    return found;}bool MessageModel::load(const QString &fileName){    MetaTranslator tor;    bool ok = tor.load(fileName);    if (ok) {        int messageCount = 0;        clearContextList();        m_numFinished = 0;        m_numNonobsolete = 0;        TML all = tor.messages();        QHash<QString, ContextItem*> contexts;        m_srcWords = 0;        m_srcChars = 0;        m_srcCharsSpc = 0;        foreach(MetaTranslatorMessage mtm, all) {            QCoreApplication::processEvents();            ContextItem *c;            if (contexts.contains(QString(mtm.context()))) {                c = contexts.value( QString(mtm.context()));            }            else {                c = createContextItem(tor.toUnicode(mtm.context(), mtm.utf8()));;                appendContextItem(c);                contexts.insert(QString(mtm.context()), c);            }            if (QByteArray(mtm.sourceText()) == ContextComment) {                c->appendToComment(tor.toUnicode(mtm.comment(), mtm.utf8()));            }            else {                MessageItem *tmp = new MessageItem(mtm, tor.toUnicode(mtm.sourceText(),                    mtm.utf8()), tor.toUnicode(mtm.comment(), mtm.utf8()), c);                if (mtm.type() != MetaTranslatorMessage::Obsolete) {                    m_numNonobsolete++;                    //if (mtm.type() == MetaTranslatorMessage::Finished)                        //tmp->setFinished(true);                        //++m_numFinished;                    doCharCounting(tmp->sourceText(), m_srcWords, m_srcChars, m_srcCharsSpc);                }                else {                    c->incrementObsoleteCount();                }                c->appendMessageItem(tmp);                ++messageCount;            }        }        QString lang = tor.languageCode();        if (lang.isEmpty()) {            int pos_sep = fileName.indexOf(QChar('_'));            if (pos_sep + 3 <= fileName.length()) {                lang = fileName.mid(pos_sep + 1, 2);            }        }        QLocale::Language l;        QLocale::Country c;        MetaTranslator::languageAndCountry(lang, &l, &c);        if (l == QLocale::C) {            QLocale sys = QLocale::system();            l = sys.language();            c = sys.country();        }        setLanguage(l);        setCountry(c);        // locale will be 'C' if we could not find the language in the ts file nor         // guestimate the language from the filename        m_numMessages = messageCount;        updateAll();        setModified(false);    }    return ok;}bool MessageModel::save(const QString &fileName){    MetaTranslator tor;    MessageItem *m;    for (iterator it = begin(); (m = it.current()); ++it) {        tor.insert(m->message());    }    QLocale locale(m_language, m_country);    if (m_country == QLocale::AnyCountry) {        QString languageCode = locale.name().section(QLatin1Char('_'), 0, 0);        if (languageCode.length() <= 3) {            tor.setLanguageCode(languageCode);        }    }else {        QString languageCode = locale.name();        tor.setLanguageCode(languageCode);    }    bool ok = tor.save(fileName);    if (ok) setModified(false);    return ok;}bool MessageModel::release(const QString& fileName,                 bool verbose /*= false*/, bool ignoreUnfinished /*= false*/,                Translator::SaveMode mode /*= Translator::Stripped */){    QFile file(fileName);    if (file.open(QIODevice::WriteOnly)) {        bool ok =  release(&file, verbose, ignoreUnfinished, mode);        file.close();        return ok;    }    return false;}bool MessageModel::release(QIODevice *iod,                 bool verbose /*= false*/, bool ignoreUnfinished /*= false*/,                Translator::SaveMode mode  /*= Translator::Stripped */){    MetaTranslator tor;    MessageItem *m;    QLocale locale(m_language, m_country);    tor.setLanguageCode(locale.name());    for (MessageModel::iterator it = begin() ; (m = it.current()) ; ++it) {        tor.insert(m->message());    }    return tor.release(iod, verbose, ignoreUnfinished, mode);}void MessageModel::doCharCounting(const QString& text, int& trW, int& trC, int& trCS){    trCS += text.length();    bool inWord = false;    for (int i=0; i<(int)text.length(); ++i) {        if (text[i].isLetterOrNumber() || text[i] == QChar('_')) {            if (!inWord) {                ++trW;                inWord = true;            }        } else {            inWord = false;        }        if (!text[i].isSpace())            trC++;    }}QLocale::Language MessageModel::language() const{    return m_language;}void MessageModel::setLanguage(QLocale::Language lang){    if (m_language != lang) {        m_language = lang;        emit languageChanged(m_language);    }}QLocale::Country MessageModel::country() const{    return m_country;}void MessageModel::setCountry(QLocale::Country country){    m_country = country;}void MessageModel::updateStatistics(){    QList<ContextItem *> ctxtList;    QList<MessageItem *> msgList;    const MessageItem *mi;    int trW = 0;    int trC = 0;    int trCS = 0;    for (MessageModel::iterator it = begin(); (mi = it.current()); ++it) {        if (mi->finished() && !(mi->message().type() == MetaTranslatorMessage::Obsolete))            doCharCounting(mi->translation(), trW, trC, trCS);    }    emit statsChanged(m_srcWords, m_srcChars, m_srcCharsSpc, trW, trC, trCS);}MessageItem *MessageModel::findMessage(const char *context, const char *sourcetext, const char *comment /*= 0*/) const{    for (int c = 0; c < cntxtList.count(); ++c) {        ContextItem *ctx = cntxtList.at(c);        if (ctx->context() == QLatin1String(context)) {            QList<MessageItem*> items = ctx->messageItemList();            for (int i = 0; i < items.count(); ++i) {                MessageItem *mi = items.at(i);                if (mi->sourceText() == QLatin1String(sourcetext)) {                    if (comment) {                        if (mi->comment() != QLatin1String(comment)) continue;                    }                    return mi;                }            }            break;        }    }    return 0;}QTranslator *MessageModel::translator(){    if (!m_translator) m_translator = static_cast<QTranslator*>(new MessageModelTranslator(this));    return m_translator;}/****************************************************************************** * * MessageModel::iterator IMPLEMENTATION * **************************************************************************** */MessageModel::iterator::iterator(ContextList *contextList, int contextNo /*= 0*/, int itemNo /*=0*/) : m_contextList(contextList), m_contextNo(contextNo), m_itemNo(itemNo){}MessageModel::iterator::iterator(MessageModel *model, int contextNo /*= 0*/, int itemNo /*=0*/) : m_contextList(&model->cntxtList), m_contextNo(contextNo), m_itemNo(itemNo){}MessageModel::iterator::iterator(const MessageModel::iterator& other){    *this = other;}MessageModel::iterator &MessageModel::iterator::operator=(const MessageModel::iterator& other){    m_contextList = other.m_contextList;    m_contextNo = other.m_contextNo;    m_itemNo = other.m_itemNo;    return *this;}MessageModel::iterator &MessageModel::iterator::operator++(){    ++m_itemNo;    if (m_itemNo >= m_contextList->at(m_contextNo)->messageItemsInList()) {        ++m_contextNo;        if (m_contextNo != m_contextList->count())            m_itemNo = 0;    }    return *this;}MessageItem *MessageModel::iterator::current() const{    if (m_contextNo >= 0 && m_contextNo < m_contextList->count()) {        if (m_itemNo >= 0 && m_itemNo < m_contextList->at(m_contextNo)->messageItemsInList()) {            return m_contextList->at(m_contextNo)->messageItem(m_itemNo);        }    }    return 0;}MessageItem *MessageModel::iterator::operator*() const{    return current();}void MessageModel::iterator::reset(){    m_contextNo = 0;    m_itemNo = 0;}/****************************************************************************** * * ContextList IMPLEMENTATION * **************************************************************************** */ContextList::ContextList(){    m_modified = false;}bool ContextList::isModified(){    return m_modified;}ContextItem *ContextList::contextItem(int context) const{    if (context >= 0 && context < count()) return at(context);    return 0;}MessageItem *ContextList::messageItem(int context, int message) const{    ContextItem *c = contextItem(context);    if (c && message >= 0 && message < c->messageItemsInList()) return c->messageItem(message);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -