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 + -
显示快捷键?