resourcefile.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 829 行 · 第 1/2 页
CPP
829 行
ResourceModel::ResourceModel(const ResourceFile &resource_file, QObject *parent) : QAbstractItemModel(parent), m_resource_file(resource_file), m_dirty(false){ // Only action that works for QListWidget and the like. setSupportedDragActions(Qt::CopyAction);}void ResourceModel::setDirty(bool b){ if (b == m_dirty) return; m_dirty = b; emit dirtyChanged(b);}QModelIndex ResourceModel::index(int row, int column, const QModelIndex &parent) const{ QModelIndex result; const qint32 d = parent.internalId(); if (!parent.isValid()) { if (row < m_resource_file.prefixCount()) result = createIndex(row, 0, -1); } else if (column == 0 && d == -1 && parent.row() < m_resource_file.prefixCount() && row < m_resource_file.fileCount(parent.row())) { result = createIndex(row, 0, parent.row()); } return result;}QModelIndex ResourceModel::parent(const QModelIndex &index) const{ QModelIndex result; const qint32 d = index.internalId(); if (index.isValid() && d != -1) result = createIndex(d, 0, -1); return result;}int ResourceModel::rowCount(const QModelIndex &parent) const{ int result = 0; const qint32 d = parent.internalId(); if (!parent.isValid()) result = m_resource_file.prefixCount(); else if (d == -1) result = m_resource_file.fileCount(parent.row()); return result;}int ResourceModel::columnCount(const QModelIndex &) const{ return 1;}bool ResourceModel::hasChildren(const QModelIndex &parent) const{ bool result = false; const qint32 d = parent.internalId(); if (!parent.isValid()) result = m_resource_file.prefixCount() > 0; else if (d == -1) result = m_resource_file.fileCount(parent.row()) > 0; return result;}bool ResourceModel::iconFileExtension(const QString &path){ static QStringList ext_list; if (ext_list.isEmpty()) { const QList<QByteArray> _ext_list = QImageReader::supportedImageFormats(); foreach (const QByteArray &ext, _ext_list) { QString dotExt = QString(QLatin1Char('.')); dotExt += QString::fromAscii(ext); ext_list.append(dotExt); } } foreach (QString ext, ext_list) { if (path.endsWith(ext, Qt::CaseInsensitive)) return true; } return false;}static inline void appendParenthesized(const QString &what, QString &s){ s += QLatin1String(" ("); s += what; s += QLatin1Char(')');}QVariant ResourceModel::data(const QModelIndex &index, int role) const{ if (!index.isValid()) return QVariant(); const qint32 d = index.internalId(); QVariant result; switch (role) { case Qt::DisplayRole: { QString stringRes; if (d == -1){ stringRes = m_resource_file.prefix(index.row()); const QString lang = m_resource_file.lang(index.row()); if(!lang.isEmpty()) appendParenthesized(lang, stringRes); } else { stringRes = QFileInfo(m_resource_file.file(d, index.row())).fileName(); const QString alias = m_resource_file.alias(d, index.row()); if(!alias.isEmpty()) appendParenthesized(alias, stringRes); } result = stringRes; } break; case Qt::DecorationRole: if (d != -1) { const QString path = m_resource_file.absolutePath(m_resource_file.file(d, index.row())); if (iconFileExtension(path)) { const QIcon icon(path); if (!icon.isNull()) result = icon; } } break; case Qt::ToolTipRole: if (d != -1) { QString conv_file = m_resource_file.relativePath(m_resource_file.file(d, index.row())); QString stringRes = conv_file.replace(QDir::separator(), QLatin1Char('/')); const QString alias_file = m_resource_file.alias(d, index.row()); if(!alias_file.isEmpty()) appendParenthesized(alias_file , stringRes); result = stringRes; } break; default: break; }; return result;}void ResourceModel::getItem(const QModelIndex &index, QString &prefix, QString &file) const{ prefix.clear(); file.clear(); if (!index.isValid()) return; const qint32 d = index.internalId(); if (d == -1) { prefix = m_resource_file.prefix(index.row()); } else { prefix = m_resource_file.prefix(d); file = m_resource_file.file(d, index.row()); const QString alias = m_resource_file.alias(d, index.row()); if (!alias.isEmpty()) file = alias; }}QString ResourceModel::lang(const QModelIndex &index) const{ if(!index.isValid()) return QString(); return m_resource_file.lang(index.row());}QString ResourceModel::alias(const QModelIndex &index) const{ if(!index.parent().isValid()) return QString(); return m_resource_file.alias(index.parent().row(), index.row());}QModelIndex ResourceModel::getIndex(const QString &prefixed_file){ QString prefix, file; if (!m_resource_file.split(prefixed_file, &prefix, &file)) return QModelIndex(); return getIndex(prefix, file);}QModelIndex ResourceModel::getIndex(const QString &prefix, const QString &file){ if (prefix.isEmpty()) return QModelIndex(); const int pref_idx = m_resource_file.indexOfPrefix(prefix); if (pref_idx == -1) return QModelIndex(); const QModelIndex pref_model_idx = index(pref_idx, 0, QModelIndex()); if (file.isEmpty()) return pref_model_idx; const int file_idx = m_resource_file.indexOfFile(pref_idx, file); if (file_idx == -1) return QModelIndex(); return index(file_idx, 0, pref_model_idx);}QModelIndex ResourceModel::prefixIndex(const QModelIndex &sel_idx) const{ if (!sel_idx.isValid()) return QModelIndex(); const QModelIndex parentIndex = parent(sel_idx); return parentIndex.isValid() ? parentIndex : sel_idx;}QModelIndex ResourceModel::addNewPrefix(){ const QString format = QLatin1String("/new/prefix%1"); int i = 1; QString prefix = format.arg(i); for ( ; m_resource_file.contains(prefix); i++) prefix = format.arg(i); i = rowCount(QModelIndex()); beginInsertRows(QModelIndex(), i, i); m_resource_file.addPrefix(prefix); endInsertRows(); setDirty(true); return index(i, 0, QModelIndex());}QModelIndex ResourceModel::addFiles(const QModelIndex &model_idx, const QStringList &file_list){ if (!model_idx.isValid()) return QModelIndex(); const QModelIndex prefix_model_idx = prefixIndex(model_idx); const int prefix_idx = prefix_model_idx.row(); QStringList unique_list; foreach (QString file, file_list) { if (!m_resource_file.contains(prefix_idx, file) && !unique_list.contains(file)) unique_list.append(file); } if (unique_list.isEmpty()) return QModelIndex(); const int cnt = m_resource_file.fileCount(prefix_idx); beginInsertRows(prefix_model_idx, cnt, cnt + unique_list.count() - 1); // ### FIXME foreach (QString file, file_list) m_resource_file.addFile(prefix_idx, file); const QFileInfo fi(file_list.last()); m_lastResourceDir = fi.absolutePath(); endInsertRows(); setDirty(true); return index(cnt + unique_list.count() - 1, 0, prefix_model_idx);}void ResourceModel::changePrefix(const QModelIndex &model_idx, const QString &prefix){ if (!model_idx.isValid()) return; const QModelIndex prefix_model_idx = prefixIndex(model_idx); const int prefix_idx = model_idx.row(); if (m_resource_file.prefix(prefix_idx) == ResourceFile::fixPrefix(prefix)) return; if(m_resource_file.contains(prefix)) return; m_resource_file.replacePrefix(prefix_idx, prefix); emit dataChanged(prefix_model_idx, prefix_model_idx); setDirty(true);}void ResourceModel::changeLang(const QModelIndex &model_idx, const QString &lang){ if (!model_idx.isValid()) return; const QModelIndex prefix_model_idx = prefixIndex(model_idx); const int prefix_idx = model_idx.row(); if (m_resource_file.lang(prefix_idx) == lang) return; m_resource_file.replaceLang(prefix_idx, lang); emit dataChanged(prefix_model_idx, prefix_model_idx); setDirty(true);}void ResourceModel::changeAlias(const QModelIndex &index, const QString &alias){ if (!index.parent().isValid()) return; if(m_resource_file.alias(index.parent().row(), index.row()) == alias) return; m_resource_file.replaceAlias(index.parent().row(), index.row(), alias); emit dataChanged(index, index); setDirty(true);}QModelIndex ResourceModel::deleteItem(const QModelIndex &idx){ if (!idx.isValid()) return QModelIndex(); QString prefix, file; getItem(idx, prefix, file); Q_ASSERT(!prefix.isEmpty()); int prefix_idx = m_resource_file.indexOfPrefix(prefix); int file_idx = m_resource_file.indexOfFile(prefix_idx, file); beginRemoveRows(parent(idx), idx.row(), idx.row()); if (file.isEmpty()) { m_resource_file.removePrefix(prefix_idx); if (prefix_idx == m_resource_file.prefixCount()) --prefix_idx; } else { m_resource_file.removeFile(prefix_idx, file_idx); if (file_idx == m_resource_file.fileCount(prefix_idx)) --file_idx; } endRemoveRows(); setDirty(true); if (prefix_idx == -1) return QModelIndex(); const QModelIndex prefix_model_idx = index(prefix_idx, 0, QModelIndex()); if (file_idx == -1) return prefix_model_idx; return index(file_idx, 0, prefix_model_idx);}bool ResourceModel::reload(){ const bool result = m_resource_file.load(); if (result) setDirty(false); return result;}bool ResourceModel::save(){ const bool result = m_resource_file.save(); if (result) setDirty(false); return result;}QString ResourceModel::lastResourceOpenDirectory() const{ if (m_lastResourceDir.isEmpty()) return absolutePath(QString()); return m_lastResourceDir;}// Create a resource path 'prefix:/file'QString ResourceModel::resourcePath(const QString &prefix, const QString &file){ QString rc = QString(QLatin1Char(':')); rc += prefix; rc += QLatin1Char('/'); rc += file; return QDir::cleanPath(rc);}QMimeData *ResourceModel::mimeData(const QModelIndexList & indexes) const{ if (indexes.size() != 1) return 0; QString prefix, file; getItem(indexes.front(), prefix, file); if (prefix.isEmpty() || file.isEmpty()) return 0; ResourceMimeData md(iconFileExtension(file) ? ResourceMimeData::Image : ResourceMimeData::File); md.setQrcPath(m_resource_file.fileName()); md.setFilePath(resourcePath(prefix, file)); return md.toMimeData();}} // namespace qdesigner_internal
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?