/* Copyright (C) 2012 Sebastian Herbord. All rights reserved. This file is part of Mod Organizer. Mod Organizer is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Mod Organizer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ #include "syncoverwritedialog.h" #include "ui_syncoverwritedialog.h" #include #include #include #include #include #include #include using namespace MOBase; using namespace MOShared; SyncOverwriteDialog::SyncOverwriteDialog(const QString &path, DirectoryEntry *directoryStructure, QWidget *parent) : TutorableDialog("SyncOverwrite", parent), ui(new Ui::SyncOverwriteDialog), m_SourcePath(path), m_DirectoryStructure(directoryStructure) { ui->setupUi(this); refresh(path, directoryStructure); QHeaderView *headerView = ui->syncTree->header(); #if QT_VERSION >= 0x050000 headerView->setSectionResizeMode(0, QHeaderView::Stretch); headerView->setSectionResizeMode(1, QHeaderView::Interactive); #else headerView->setResizeMode(0, QHeaderView::Stretch); headerView->setResizeMode(1, QHeaderView::Interactive); #endif } SyncOverwriteDialog::~SyncOverwriteDialog() { delete ui; } void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *directoryStructure, QTreeWidgetItem *subTree) { QDir overwrite(path); overwrite.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); QDirIterator dirIter(overwrite); while (dirIter.hasNext()) { dirIter.next(); QFileInfo fileInfo = dirIter.fileInfo(); QString file = fileInfo.fileName(); if (file == "meta.ini") { continue; } QTreeWidgetItem *newItem = new QTreeWidgetItem(subTree, QStringList(file)); if (fileInfo.isDir()) { DirectoryEntry *subDir = directoryStructure->findSubDirectory(ToWString(file)); if (subDir != NULL) { readTree(fileInfo.absoluteFilePath(), subDir, newItem); } else { qCritical("no directory structure for %s?", file.toUtf8().constData()); delete newItem; newItem = NULL; } } else { const FileEntry *entry = directoryStructure->findFile(ToWString(file)); QComboBox* combo = new QComboBox(ui->syncTree); combo->addItem(tr(""), -1); if (entry != NULL) { const std::vector &alternatives = entry->getAlternatives(); for (std::vector::const_iterator iter = alternatives.begin(); iter != alternatives.end(); ++iter) { combo->addItem(ToQString(m_DirectoryStructure->getOriginByID(*iter).getName()), *iter); } combo->setCurrentIndex(combo->count() - 1); } else { combo->setCurrentIndex(0); } ui->syncTree->setItemWidget(newItem, 1, combo); } if (newItem != NULL) { subTree->addChild(newItem); } } } void SyncOverwriteDialog::refresh(const QString &path, DirectoryEntry *directoryStructure) { QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->syncTree, QStringList("")); readTree(path, directoryStructure, rootItem); ui->syncTree->addTopLevelItem(rootItem); ui->syncTree->expandAll(); } void SyncOverwriteDialog::applyTo(QTreeWidgetItem *item, const QString &path, const QString &modDirectory) { for (int i = 0; i < item->childCount(); ++i) { QTreeWidgetItem *child = item->child(i); QString filePath; if (path.length() != 0) { filePath = path.mid(0).append("/").append(child->text(0)); } else { filePath = child->text(0); } if (child->childCount() != 0) { applyTo(child, filePath, modDirectory); } else { QComboBox *comboBox = qobject_cast(ui->syncTree->itemWidget(child, 1)); if (comboBox != NULL) { int originID = comboBox->itemData(comboBox->currentIndex(), Qt::UserRole).toInt(); if (originID != -1) { FilesOrigin &origin = m_DirectoryStructure->getOriginByID(originID); QString source = m_SourcePath.mid(0).append("/").append(filePath); QString destination = modDirectory.mid(0).append("/").append(ToQString(origin.getName())).append("/").append(filePath); if (!QFile::remove(destination)) { reportError(tr("failed to remove %1").arg(destination)); } else if (!QFile::rename(source, destination)) { reportError(tr("failed to move %1 to %2").arg(source).arg(destination)); } } } } } } void SyncOverwriteDialog::apply(const QString &modDirectory) { applyTo(ui->syncTree->topLevelItem(0), "", modDirectory); }