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