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