Qt::ItemFlags DataFilesModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; EsmFile *file = item(index.row()); if (!file) return Qt::NoItemFlags; if (mAvailableFiles.contains(file->fileName())) { if (index.column() == 0) { return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; } else { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } } else { if (index.column() == 0) { return Qt::ItemIsUserCheckable | Qt::ItemIsSelectable; } else { return Qt::NoItemFlags | Qt::ItemIsSelectable; } } }
void DataFilesModel::addMasters(const QString &path) { QDir dir(path); dir.setNameFilters(QStringList(QLatin1String("*.esp"))); // Read the dependencies from the plugins foreach (const QString &path, dir.entryList()) { try { ESM::ESMReader fileReader; fileReader.setEncoding(mEncoding.toStdString()); fileReader.open(dir.absoluteFilePath(path).toStdString()); ESM::ESMReader::MasterList mlist = fileReader.getMasters(); for (unsigned int i = 0; i < mlist.size(); ++i) { QString master = QString::fromStdString(mlist[i].name); // Add the plugin to the internal dependency map mDependencies[master].append(path); // Don't add esps if (master.endsWith(".esp", Qt::CaseInsensitive)) continue; QFileInfo info(dir.absoluteFilePath(master)); EsmFile *file = new EsmFile(master); file->setDates(info.lastModified(), info.lastRead()); // Add the master to the table if (findItem(master) == 0) addFile(file); } } catch(std::runtime_error &e) { // An error occurred while reading the .esp qWarning() << "Error reading esp: " << e.what(); continue; } } // See if the masters actually exist in the filesystem dir.setNameFilters(QStringList(QLatin1String("*.esm"))); foreach (const QString &path, dir.entryList()) { QFileInfo info(dir.absoluteFilePath(path)); if (findItem(path) == 0) { EsmFile *file = new EsmFile(path); file->setDates(info.lastModified(), info.lastRead()); addFile(file); } // Make the master selectable mAvailableFiles.append(path); } }
EsmFile* DataFilesModel::findItem(const QString &name) { QList<EsmFile *>::ConstIterator it; QList<EsmFile *>::ConstIterator itEnd = mFiles.constEnd(); int i = 0; for (it = mFiles.constBegin(); it != itEnd; ++it) { EsmFile *file = item(i); ++i; if (name == file->fileName()) return file; } // Not found return 0; }
QStringList DataFilesModel::checkedItemsPaths() { QStringList list; QList<EsmFile *>::ConstIterator it; QList<EsmFile *>::ConstIterator itEnd = mFiles.constEnd(); int i = 0; for (it = mFiles.constBegin(); it != itEnd; ++it) { EsmFile *file = item(i); ++i; if (mCheckStates[file->fileName()] == Qt::Checked && canBeChecked(file)) list << file->path(); } return list; }
QStringList DataFilesModel::uncheckedItems() { QStringList list; QStringList checked = checkedItems(); QList<EsmFile *>::ConstIterator it; QList<EsmFile *>::ConstIterator itEnd = mFiles.constEnd(); int i = 0; for (it = mFiles.constBegin(); it != itEnd; ++it) { EsmFile *file = item(i); ++i; // Add the items that are not in the checked list if (!checked.contains(file->fileName())) list << file->fileName(); } return list; }
QStringList DataFilesModel::checkedItems() { QStringList list; QList<EsmFile *>::ConstIterator it; QList<EsmFile *>::ConstIterator itEnd = mFiles.constEnd(); int i = 0; for (it = mFiles.constBegin(); it != itEnd; ++it) { EsmFile *file = item(i); ++i; QString name = file->fileName(); // Only add the items that are in the checked list and available if (mCheckStates[name] == Qt::Checked && mAvailableFiles.contains(name)) list << name; } return list; }
void DataFilesModel::addPlugins(const QString &path) { QDir dir(path); dir.setNameFilters(QStringList(QLatin1String("*.esp"))); foreach (const QString &path, dir.entryList()) { QFileInfo info(dir.absoluteFilePath(path)); EsmFile *file = new EsmFile(path); try { ESM::ESMReader fileReader; ToUTF8::Utf8Encoder encoder (ToUTF8::calculateEncoding(mEncoding.toStdString())); fileReader.setEncoder(&encoder); fileReader.open(dir.absoluteFilePath(path).toStdString()); ESM::ESMReader::MasterList mlist = fileReader.getMasters(); QStringList masters; for (unsigned int i = 0; i < mlist.size(); ++i) { QString master = QString::fromStdString(mlist[i].name); masters.append(master); // Add the plugin to the internal dependency map mDependencies[master].append(path); } file->setAuthor(QString::fromStdString(fileReader.getAuthor())); file->setSize(info.size()); file->setDates(info.lastModified(), info.lastRead()); file->setVersion(fileReader.getFVer()); file->setPath(info.absoluteFilePath()); file->setMasters(masters); file->setDescription(QString::fromStdString(fileReader.getDesc())); // Put the file in the table addFile(file); } catch(std::runtime_error &e) { // An error occurred while reading the .esp qWarning() << "Error reading esp: " << e.what(); continue; } } }
QVariant DataFilesModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); EsmFile *file = item(index.row()); if (!file) return QVariant(); const int column = index.column(); switch (role) { case Qt::DisplayRole: { switch (column) { case 0: return file->fileName(); case 1: return file->author(); case 2: return QString("%1 kB").arg(int((file->size() + 1023) / 1024)); case 3: //return file->modified().toString(Qt::TextDate); return file->modified().toString(Qt::ISODate); case 4: return file->accessed().toString(Qt::TextDate); case 5: return file->version(); case 6: return file->path(); case 7: return file->masters().join(", "); case 8: return file->description(); } } case Qt::TextAlignmentRole: { switch (column) { case 0: case 1: return Qt::AlignLeft + Qt::AlignVCenter; case 2: case 3: case 4: case 5: return Qt::AlignRight + Qt::AlignVCenter; default: return Qt::AlignLeft + Qt::AlignVCenter; } } case Qt::CheckStateRole: { if (column != 0) return QVariant(); return mCheckStates[file->fileName()]; } case Qt::ToolTipRole: { if (column != 0) return QVariant(); if (file->version() == 0.0f) return QVariant(); // Data not set QString tooltip = QString("<b>Author:</b> %1<br/> \ <b>Version:</b> %2<br/> \ <br/><b>Description:</b><br/>%3<br/> \ <br/><b>Dependencies: </b>%4<br/>") .arg(file->author()) .arg(QString::number(file->version())) .arg(file->description()) .arg(file->masters().join(", ")); return tooltip; } default: return QVariant(); } }
Qt::CheckState DataFilesModel::checkState(const QModelIndex &index) { EsmFile *file = item(index.row()); return mCheckStates[file->fileName()]; }
void DataFilesModel::addFiles(const QString &path) { QDir dir(path); QStringList filters; filters << "*.esp" << "*.esm"; dir.setNameFilters(filters); // Create a decoder for non-latin characters in esx metadata QTextCodec *codec; if (mEncoding == QLatin1String("win1252")) { codec = QTextCodec::codecForName("windows-1252"); } else if (mEncoding == QLatin1String("win1251")) { codec = QTextCodec::codecForName("windows-1251"); } else if (mEncoding == QLatin1String("win1250")) { codec = QTextCodec::codecForName("windows-1250"); } else { return; // This should never happen; } QTextDecoder *decoder = codec->makeDecoder(); foreach (const QString &path, dir.entryList()) { QFileInfo info(dir.absoluteFilePath(path)); EsmFile *file = new EsmFile(path); try { ESM::ESMReader fileReader; ToUTF8::Utf8Encoder encoder(ToUTF8::calculateEncoding(mEncoding.toStdString())); fileReader.setEncoder(&encoder); fileReader.open(dir.absoluteFilePath(path).toStdString()); std::vector<ESM::Header::MasterData> mlist = fileReader.getMasters(); QStringList masters; for (unsigned int i = 0; i < mlist.size(); ++i) { QString master = QString::fromStdString(mlist[i].name); masters.append(master); } file->setAuthor(decoder->toUnicode(fileReader.getAuthor().c_str())); file->setSize(info.size()); file->setDates(info.lastModified(), info.lastRead()); file->setVersion(fileReader.getFVer()); file->setPath(info.absoluteFilePath()); file->setMasters(masters); file->setDescription(decoder->toUnicode(fileReader.getDesc().c_str())); // Put the file in the table if (findItem(path) == 0) addFile(file); } catch(std::runtime_error &e) { // An error occurred while reading the .esp qWarning() << "Error reading esp: " << e.what(); continue; } } delete decoder; }