📄 messagemodel.cpp
字号:
/******************************************************************************** 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 + -