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

📄 messagemodel.cpp

📁 QT 开发环境里面一个很重要的文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Linguist of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "messagemodel.h"#include "trwindow.h"static Qt::SortOrder sSortOrder = Qt::AscendingOrder;static int sSortColumn = 1;/****************************************************************************** * * MessageItem IMPLEMENTATION * **************************************************************************** */MessageItem::MessageItem(const MetaTranslatorMessage &message,                         const QString &text, const QString &comment, ContextItem *ctxtI)                         : m(message), tx(text), com(comment), cntxtItem(ctxtI){    if (m.translation().isEmpty()) {        QString t = "";        m.setTranslation(t);    }    if (m.type() == MetaTranslatorMessage::Finished) {        cntxtItem->incrementFinishedCount();    }    m_danger = false;}void MessageItem::setTranslation(const QString &translation) {    if (translation != m.translation()) {        m.setTranslation(translation);        cntxtItem->model()->setModified(true);    }}void MessageItem::setFinished(bool finished){    MetaTranslatorMessage::Type ty = m.type();    if (ty == MetaTranslatorMessage::Unfinished && finished) {        m.setType(MetaTranslatorMessage::Finished);        cntxtItem->incrementFinishedCount();    } else if (ty == MetaTranslatorMessage::Finished && !finished) {        m.setType(MetaTranslatorMessage::Unfinished);        cntxtItem->decrementFinishedCount();    }    cntxtItem->model()->setModified(ty != m.type());}void MessageItem::setDanger(bool danger){    if (!m_danger && danger) {        cntxtItem->incrementDangerCount();    } else if (m_danger && !danger) {        cntxtItem->decrementDangerCount();    }    m_danger = danger;}/****************************************************************************** * * ContextItem IMPLEMENTATION * **************************************************************************** */ContextItem::ContextItem(QString c, MessageModel *model): sortColumn(-1), com(""), ctxt(c){    m_finishedCount = 0;    dangerCount   = 0;    obsoleteCount = 0;    m_model = model;}ContextItem::~ContextItem(){    // delete all the message items    for (int i=0; i<msgItemList.count(); ++i)    {        delete msgItemList[i];    }}void ContextItem::appendToComment(const QString& x){    if (!com.isEmpty())        com += QString("\n\n");    com += x;}void ContextItem::incrementFinishedCount() {    ++m_finishedCount;    m_model->incrementFinishedCount();}void ContextItem::decrementFinishedCount() {    --m_finishedCount;    m_model->decrementFinishedCount();}MessageItem *ContextItem::messageItem(int i){    if ((i >= msgItemList.count()) || (i < 0))        return 0;    return msgItemList[i];}bool ContextItem::sortParameters(Qt::SortOrder &so, int &sc) const{    if (sortColumn == -1)        return false;    so = sortOrder;    sc = sortColumn;    return true;}void ContextItem::sortMessages(int column, Qt::SortOrder order){    sortOrder = sSortOrder = order;    sortColumn = sSortColumn = column;    qSort(msgItemList.begin(), msgItemList.end(), ContextItem::compare);}bool ContextItem::compare(const MessageItem *left, const MessageItem *right){    int res, nleft, nright;    if (sSortColumn == 0) {        nleft = left->danger() + left->finished() + left->translation().isEmpty();        nright = right->danger() + right->finished() + right->translation().isEmpty();        if ((sSortOrder == Qt::AscendingOrder) ? (nleft < nright) : !(nleft < nright))            return true;    }    else if (sSortColumn == 1) {        res = QString::localeAwareCompare(left->sourceText().remove('&'),            right->sourceText().remove('&'));        if ((sSortOrder == Qt::AscendingOrder) ? (res < 0) : !(res < 0))            return true;    }    else if (sSortColumn == 2) {        res = QString::localeAwareCompare(left->translation().remove('&'),            right->translation().remove('&'));        if ((sSortOrder == Qt::AscendingOrder) ? (res < 0) : !(res < 0))            return true;    }    return false;}/****************************************************************************** * * MessageModel IMPLEMENTATION * **************************************************************************** */MessageModel::MessageModel(QObject *parent): QAbstractItemModel(parent), sortColumn(-1){    m_srcWords = 0;    m_srcChars = 0;    m_srcCharsSpc = 0;    m_numFinished = 0;    m_numNonobsolete = 0;    m_numMessages = 0;    m_translator = 0;}ContextItem *MessageModel::contextItem(const QModelIndex &indx) const{    if (indx.isValid()) {        int row = indx.row();        if (indx.internalPointer()) row = indx.parent().row();        return cntxtList.at(row);    }    return 0;}MessageItem *MessageModel::messageItem(const QModelIndex &indx) const{    if (indx.isValid()) {        ContextItem *c = static_cast<ContextItem *>(indx.internalPointer());        if (c) return c->messageItem(indx.row());    }    return 0;}QStringList MessageModel::normalizedTranslations(const MessageItem &m) const{    return MetaTranslator::normalizedTranslations(m.message(), m_language, m_country);}QModelIndex MessageModel::index(int row, int column, const QModelIndex &parent /*= QModelIndex()*/) const{    if (row < 0 || column < 0) return QModelIndex();    if (!parent.isValid()) {        // The context items        if (row >= rowCount() || column >= columnCount()) {            return QModelIndex();        }        return createIndex(row, column, 0);   //internalpointer points to the 'owner' object    } else {        // The message items        if (parent.internalPointer()) return QModelIndex();        int toprow = parent.row();        ContextItem *c = cntxtList.at(toprow);        if (row > c->messageItemsInList()) return QModelIndex();        return createIndex(row, column, c);    }}QModelIndex MessageModel::parent(const QModelIndex& index) const{    if (ContextItem *cntxtItem = static_cast<ContextItem *>(index.internalPointer())) {        int idx = cntxtList.indexOf(cntxtItem);        Q_ASSERT(idx != -1);        return createIndex(idx, 0, 0);    }    return QModelIndex();}bool MessageModel::sortParameters(Qt::SortOrder &so, int &sc) const{    if (sortColumn == -1)        return false;    so = sortOrder;    sc = sortColumn;    return true;}void MessageModel::updateItem(QModelIndex indx){    QModelIndex top = indx.parent();    QModelIndex tl = index(indx.row(), 0, top);    QModelIndex br = index(indx.row(), 2, top);    emit dataChanged(tl, br);}void MessageModel::clearContextList(){    int r = cntxtList.count();    if (r <= 0) // no items        return;    for (int i=0; i<r; ++i)        delete cntxtList[i];    cntxtList.clear();    reset();}// since we don't add or remove single rows, update all at once...void MessageModel::updateAll(){    reset();}void MessageModel::setTranslation(const iterator &it, const QString &translation){    int c = it.contextNo();    int m = it.messageNo();    QModelIndex idx = modelIndex(c, m, 2);    MessageItem *msg = it.current();    msg->setTranslation(translation);    emit dataChanged(idx, idx);}QModelIndex MessageModel::modelIndex(int context, int message, int column){    QModelIndex idx = index(context, column);    if (idx.isValid()) idx = index(message, column, idx);    return idx;}int MessageModel::rowCount(const QModelIndex &parent) const{    if (parent.isValid()) {        ContextItem *c = static_cast<ContextItem *>(parent.internalPointer());        if (c) return -1;        return cntxtList[parent.row()]->messageItemsInList();    }    return cntxtList.count();}int MessageModel::columnCount(const QModelIndex &parent) const{    if (parent.internalPointer()) {        return 3;    }    return 3;}QVariant MessageModel::headerData(int section, Qt::Orientation orientation, int role) const{    if ((role == Qt::DisplayRole) && (orientation == Qt::Horizontal)) {        switch(section)    {        case 0:            return tr("Done");        case 1:            return tr("Context");        case 2:            return tr("Items");        }        return "Error";    }    return QVariant();}QVariant MessageModel::data(const QModelIndex &index, int role) const{    int row = index.row();    int column = index.column();    ContextItem *cntxtItem = static_cast<ContextItem *>(index.internalPointer());    if (cntxtItem) {        if (row >= cntxtItem->messageItemsInList() || !index.isValid())            return QVariant();        MessageItem *msgItem = cntxtItem->messageItem(row);        if (role == Qt::DisplayRole) {            switch(column) {            case 0: // done                return QVariant();            case 1: // source text			    return msgItem->sourceText().simplified();            case 2: // translation                return msgItem->translation().simplified();            }        }        else if ((role == Qt::DecorationRole) && (column == 0)) {            if (msgItem->message().type() == MetaTranslatorMessage::Unfinished && msgItem->translation().isEmpty())                return qVariantFromValue(*TrWindow::pxEmpty);            else if (msgItem->message().type() == MetaTranslatorMessage::Unfinished && msgItem->danger())                return qVariantFromValue(*TrWindow::pxDanger);            else if (msgItem->message().type() == MetaTranslatorMessage::Finished && msgItem->danger())                return qVariantFromValue(*TrWindow::pxWarning);            else if (msgItem->message().type() == MetaTranslatorMessage::Finished)                return qVariantFromValue(*TrWindow::pxOn);            else if (msgItem->message().type() == MetaTranslatorMessage::Unfinished)                return qVariantFromValue(*TrWindow::pxOff);            else if (msgItem->message().type() == MetaTranslatorMessage::Obsolete)                return qVariantFromValue(*TrWindow::pxObsolete);        }    } else {        if (row >= cntxtList.count() || !index.isValid())            return QVariant();        ContextItem *cntxtItem = cntxtList.at(row);        if (role == Qt::DisplayRole) {            switch(column) {            case 0: // done                return QVariant();            case 1: // context                return cntxtItem->context().simplified();            case 2: // items                QString s;                int itemCount = cntxtItem->messageItemsInList();                int obsoleteCount = cntxtItem->obsolete();                int finishedCount = cntxtItem->finishedCount();                s.sprintf("%d/%d", finishedCount,                    itemCount - obsoleteCount);                return s;            }        }        else if ((role == Qt::DecorationRole) && (column == 0)) {            if (cntxtItem->isContextObsolete())                return qVariantFromValue(*TrWindow::pxObsolete);            else if (cntxtItem->isFinished())                return qVariantFromValue(*TrWindow::pxOn);            else                return qVariantFromValue(*TrWindow::pxOff);        }    }    return QVariant();}bool MessageModel::finished(const QModelIndex &index){    MessageItem *m = messageItem(index);    return m->finished();}void MessageModel::sort(int column, Qt::SortOrder order){    if (cntxtList.count() <= 0)        return;    sortOrder = sSortOrder = order;    sortColumn = sSortColumn = column;    qSort(cntxtList.begin(), cntxtList.end(), MessageModel::compare);    emit dataChanged(index(0,0), index(cntxtList.count()-1, 2));}bool MessageModel::compare(const ContextItem *left, const ContextItem *right){    int res;    int nleft, nright;    Qt::SortOrder sortOrder = sSortOrder;    switch (sSortColumn)    {    case 0: {        nleft =  (100 * left->finishedCount())/left->messageItemsInList();      //percent        nright = (100 * right->finishedCount())/right->messageItemsInList();    //percent

⌨️ 快捷键说明

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