/*
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 "shared/directoryentry.h"
#include "shared/fileentry.h"
#include "shared/filesorigin.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 != nullptr) {
readTree(fileInfo.absoluteFilePath(), subDir, newItem);
} else {
log::error("no directory structure for {}?", file);
delete newItem;
newItem = nullptr;
}
} else {
const FileEntryPtr entry = directoryStructure->findFile(ToWString(file));
QComboBox* combo = new QComboBox(ui->syncTree);
combo->addItem(tr(""), -1);
if (entry.get() != nullptr) {
bool ignore;
int origin = entry->getOrigin(ignore);
addToComboBox(combo,
ToQString(m_DirectoryStructure->getOriginByID(origin).getName()),
origin);
const auto& alternatives = entry->getAlternatives();
for (const auto& alt : alternatives) {
addToComboBox(
combo,
ToQString(m_DirectoryStructure->getOriginByID(alt.originID()).getName()),
alt.originID());
}
combo->setCurrentIndex(combo->count() - 1);
} else {
combo->setCurrentIndex(0);
}
ui->syncTree->setItemWidget(newItem, 1, combo);
}
if (newItem != nullptr) {
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 + "/" + 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 != nullptr) {
int originID =
comboBox->itemData(comboBox->currentIndex(), Qt::UserRole).toInt();
if (originID != -1) {
FilesOrigin& origin = m_DirectoryStructure->getOriginByID(originID);
QString source = m_SourcePath + "/" + filePath;
QString destination =
modDirectory + "/" + ToQString(origin.getName()) + "/" + 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);
}