/*
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);
QHeaderView *headerView = ui->syncTree->header();
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
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;
}
static void addToComboBox(QComboBox *box, const QString &name, const QVariant &userData)
{
if (QString::compare(name, "overwrite", Qt::CaseInsensitive) != 0) {
box->addItem(name, userData);
}
}
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::Ptr entry = directoryStructure->findFile(ToWString(file));
QComboBox* combo = new QComboBox(ui->syncTree);
combo->addItem(tr(""), -1);
if (entry.get() != NULL) {
bool ignore;
int origin = entry->getOrigin(ignore);
addToComboBox(combo, ToQString(m_DirectoryStructure->getOriginByID(origin).getName()), origin);
const std::vector &alternatives = entry->getAlternatives();
for (std::vector::const_iterator iter = alternatives.begin(); iter != alternatives.end(); ++iter) {
addToComboBox(combo, 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)
{
QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->syncTree, QStringList(""));
readTree(path, m_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));
}
}
}
}
}
QDir dir(m_SourcePath + "/" + path);
if ((path.length() > 0) && (dir.count() == 2)) {
dir.rmpath(".");
}
}
void SyncOverwriteDialog::apply(const QString &modDirectory)
{
applyTo(ui->syncTree->topLevelItem(0), "", modDirectory);
}