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

📄 resourcefile.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 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://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 <QtCore/QFile>#include <QtCore/QTextStream>#include <QtCore/QDir>#include <QtCore/qdebug.h>#include <QtGui/QIcon>#include <QtGui/QApplication>#include <QtGui/QImageReader>#include <QtXml/QDomDocument>#include "resourcefile_p.h"#include <QtDesigner/abstractformbuilder.h>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 = QLatin1String("/");        int idx = indexOfPrefix(prefix);        if (idx == -1) {            m_prefix_list.append(Prefix(prefix, 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);    QStringList name_list = uniqueItems(prefixList());    foreach (QString name, name_list) {        FileList file_list;        foreach (Prefix pref, m_prefix_list) {            if (pref.name == name)                file_list += pref.file_list;        }        file_list = uniqueItems(file_list);        QDomElement relt = doc.createElement(QLatin1String("qresource"));        root.appendChild(relt);        relt.setAttribute(QLatin1String("prefix"), name);        foreach (const File &file, file_list) {            QDomElement felt = doc.createElement(QLatin1String("file"));            relt.appendChild(felt);            QString conv_file = relativePath(file.name).replace(QDir::separator(), QLatin1Char('/'));            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;}int ResourceFile::matchPrefix(const QString &_path) const{    QString path = _path;    if (!path.startsWith(QLatin1String(":")))        return -1;    path = path.mid(1);    for (int i = 0; i < m_prefix_list.size(); ++i) {        const Prefix &prefix = m_prefix_list.at(i);        if (path.startsWith(prefix.name))            return i;    }    return -1;}bool ResourceFile::split(const QString &_path, QString *prefix, QString *file) const{    prefix->clear();    file->clear();    QString path = _path;    if (!path.startsWith(QLatin1String(":")))        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 == QLatin1String("/"))            *file = path.mid(1);        else            *file = path.mid(pref.name.size() + 1);        if (pref.file_list.contains(absolutePath(*file)))            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::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{    QFileInfo fi(rel_path);    if (fi.isAbsolute())        return rel_path;    return QDir::cleanPath(QFileInfo(m_file_name).path() + QDir::separator() + rel_path);}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){    QString result = QLatin1String("/");    for (int i = 0; i < prefix.size(); ++i) {        QChar c = prefix.at(i);        if (c == QLatin1Char('/') && result.at(result.size() - 1) == QLatin1Char('/'))            continue;        result.append(c);    }

⌨️ 快捷键说明

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