resourcefile.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 829 行 · 第 1/2 页

CPP
829
字号
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer 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://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************//*TRANSLATOR qdesigner_internal::ResourceModel*/#include "resourcefile_p.h"#include "resourcemimedata_p.h"#include <QtDesigner/abstractformbuilder.h>#include <QtCore/QFile>#include <QtCore/QTextStream>#include <QtCore/QDir>#include <QtCore/qdebug.h>#include <QtGui/QIcon>#include <QtGui/QApplication>#include <QtGui/QImageReader>#include <QtXml/QDomDocument>namespace qdesigner_internal {/******************************************************************************** ResourceFile*/ResourceFile::ResourceFile(const QString &file_name){    setFileName(file_name);}template <typename T>static QList<T> uniqueItems(QList<T> list){    QList<T> result;    qSort(list.begin(), list.end());    T last;    bool first = true;    foreach (const T &t, list) {        if (first || t != last) {            result.append(t);            last = t;        }        first = false;    }    return result;}bool ResourceFile::load(){    m_error_message.clear();    if (m_file_name.isEmpty()) {        m_error_message = QApplication::translate("Designer", "file name is empty");        return false;    }    QFile file(m_file_name);    if (!file.open(QIODevice::ReadOnly)) {        m_error_message = file.errorString();        return false;    }    m_prefix_list.clear();    QDomDocument doc;    QString error_msg;    int error_line, error_col;    if (!doc.setContent(&file, &error_msg, &error_line, &error_col)) {        m_error_message = QApplication::translate("Designer", "XML error on line %1, col %2: %3")                    .arg(error_line).arg(error_col).arg(error_msg);        return false;    }    QDomElement root = doc.firstChildElement(QLatin1String("RCC"));    if (root.isNull()) {        m_error_message = QApplication::translate("Designer", "no <RCC> root element");        return false;    }    QDomElement relt = root.firstChildElement(QLatin1String("qresource"));    for (; !relt.isNull(); relt = relt.nextSiblingElement(QLatin1String("qresource"))) {        FileList file_list;        QDomElement felt = relt.firstChildElement(QLatin1String("file"));        for (; !felt.isNull(); felt = felt.nextSiblingElement(QLatin1String("file")))            file_list.append(File(absolutePath(felt.text()), felt.attribute(QLatin1String("alias"))));        QString prefix = fixPrefix(relt.attribute(QLatin1String("prefix")));        if (prefix.isEmpty())            prefix = QString(QLatin1Char('/'));        const QString lang = relt.attribute(QLatin1String("lang"));        const int idx = indexOfPrefix(prefix);        if (idx == -1) {            m_prefix_list.append(Prefix(prefix, lang, uniqueItems(file_list)));        } else {            Prefix &pref = m_prefix_list[idx];            pref.file_list += file_list;            pref.file_list = uniqueItems(pref.file_list);        }    }    return true;}bool ResourceFile::save(){    m_error_message.clear();    if (m_file_name.isEmpty()) {        m_error_message = QApplication::translate("Designer", "file name is empty");        return false;    }    QFile file(m_file_name);    if (!file.open(QIODevice::WriteOnly)) {        m_error_message = file.errorString();        return false;    }    QDomDocument doc;    QDomElement root = doc.createElement(QLatin1String("RCC"));    doc.appendChild(root);    const QStringList name_list = uniqueItems(prefixList());    foreach (QString name, name_list) {        FileList file_list;        QString lang;        foreach (Prefix pref, m_prefix_list) {            if (pref.name == name){                file_list += pref.file_list;                lang = pref.lang;            }        }        file_list = uniqueItems(file_list);        QDomElement relt = doc.createElement(QLatin1String("qresource"));        root.appendChild(relt);        relt.setAttribute(QLatin1String("prefix"), name);        if(!lang.isEmpty())            relt.setAttribute(QLatin1String("lang"), lang);        foreach (const File &file, file_list) {            QDomElement felt = doc.createElement(QLatin1String("file"));            relt.appendChild(felt);            const QString conv_file = relativePath(file.name).replace(QDir::separator(), QLatin1Char('/'));            const QDomText text = doc.createTextNode(conv_file);            felt.appendChild(text);            if (!file.alias.isEmpty())                felt.setAttribute(QLatin1String("alias"), file.alias);        }    }    QTextStream stream(&file);    doc.save(stream, 4);    return true;}bool ResourceFile::split(const QString &_path, QString *prefix, QString *file) const{    prefix->clear();    file->clear();    QString path = _path;    if (!path.startsWith(QLatin1Char(':')))        return false;    path = path.mid(1);    for (int i = 0; i < m_prefix_list.size(); ++i) {        const Prefix &pref = m_prefix_list.at(i);        if (!path.startsWith(pref.name))            continue;        *prefix = pref.name;        if (pref.name == QString(QLatin1Char('/')))            *file = path.mid(1);        else            *file = path.mid(pref.name.size() + 1);        const QString filePath = absolutePath(*file);        for (int j = 0; j < pref.file_list.count(); j++) {            const File f = pref.file_list.at(j);            if (!f.alias.isEmpty()) {                if (absolutePath(f.alias) == filePath) {                    *file = f.name;                    return true;                }            } else if (f.name == filePath)                return true;        }    }    return false;}QString ResourceFile::resolvePath(const QString &path) const{    QString prefix, file;    if (split(path, &prefix, &file))        return absolutePath(file);    return QString();}QStringList ResourceFile::prefixList() const{    QStringList result;    for (int i = 0; i < m_prefix_list.size(); ++i)        result.append(m_prefix_list.at(i).name);    return result;}bool ResourceFile::isEmpty() const{    return m_file_name.isEmpty() && m_prefix_list.isEmpty();}QStringList ResourceFile::fileList(int pref_idx) const{    const FileList &abs_file_list = m_prefix_list.at(pref_idx).file_list;    QStringList result;    foreach (const File &abs_file, abs_file_list)        result.append(relativePath(abs_file.name));    return result;}void ResourceFile::addFile(int prefix_idx, const QString &file){    m_prefix_list[prefix_idx].file_list.append(absolutePath(file));}void ResourceFile::addPrefix(const QString &prefix){    QString fixed_prefix = fixPrefix(prefix);    if (indexOfPrefix(fixed_prefix) != -1)        return;    m_prefix_list.append(fixed_prefix);}void ResourceFile::removePrefix(int prefix_idx){    m_prefix_list.removeAt(prefix_idx);}void ResourceFile::removeFile(int prefix_idx, int file_idx){    m_prefix_list[prefix_idx].file_list.removeAt(file_idx);}void ResourceFile::replacePrefix(int prefix_idx, const QString &prefix){    m_prefix_list[prefix_idx].name = fixPrefix(prefix);}void ResourceFile::replaceLang(int prefix_idx, const QString &lang){    m_prefix_list[prefix_idx].lang = lang;}void ResourceFile::replaceAlias(int prefix_idx, int file_idx, const QString &alias){    m_prefix_list[prefix_idx].file_list[file_idx].alias = alias;}void ResourceFile::replaceFile(int pref_idx, int file_idx, const QString &file){    m_prefix_list[pref_idx].file_list[file_idx] = file;}int ResourceFile::indexOfPrefix(const QString &prefix) const{    QString fixed_prefix = fixPrefix(prefix);    for (int i = 0; i < m_prefix_list.size(); ++i) {        if (m_prefix_list.at(i).name == fixed_prefix)            return i;    }    return -1;}int ResourceFile::indexOfFile(int pref_idx, const QString &file) const{    return m_prefix_list.at(pref_idx).file_list.indexOf(absolutePath(file));}QString ResourceFile::relativePath(const QString &abs_path) const{    if (m_file_name.isEmpty() || QFileInfo(abs_path).isRelative())         return abs_path;    QFileInfo fileInfo(m_file_name);    return fileInfo.absoluteDir().relativeFilePath(abs_path);}QString ResourceFile::absolutePath(const QString &rel_path) const{    const QFileInfo fi(rel_path);    if (fi.isAbsolute())        return rel_path;    QString rc = QFileInfo(m_file_name).path();    rc +=  QDir::separator();    rc += rel_path;    return QDir::cleanPath(rc);}bool ResourceFile::contains(const QString &prefix, const QString &file) const{    int pref_idx = indexOfPrefix(prefix);    if (pref_idx == -1)        return false;    if (file.isEmpty())        return true;    return m_prefix_list.at(pref_idx).file_list.contains(absolutePath(file));}bool ResourceFile::contains(int pref_idx, const QString &file) const{    return m_prefix_list.at(pref_idx).file_list.contains(absolutePath(file));}QString ResourceFile::fixPrefix(const QString &prefix){    const QChar slash = QLatin1Char('/');    QString result = QString(slash);    for (int i = 0; i < prefix.size(); ++i) {        const QChar c = prefix.at(i);        if (c == slash && result.at(result.size() - 1) == slash)            continue;        result.append(c);    }    if (result.size() > 1 && result.endsWith(slash))        result = result.mid(0, result.size() - 1);    return result;}int ResourceFile::prefixCount() const{    return m_prefix_list.size();}QString ResourceFile::prefix(int idx) const{    return m_prefix_list.at(idx).name;}QString ResourceFile::lang(int idx) const{    return m_prefix_list.at(idx).lang;}int ResourceFile::fileCount(int prefix_idx) const{    return m_prefix_list.at(prefix_idx).file_list.size();}QString ResourceFile::file(int prefix_idx, int file_idx) const{    return relativePath(m_prefix_list.at(prefix_idx).file_list.at(file_idx).name);}QString ResourceFile::alias(int prefix_idx, int file_idx) const{    return m_prefix_list.at(prefix_idx).file_list.at(file_idx).alias;}/******************************************************************************** ResourceModel*/

⌨️ 快捷键说明

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