/*
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 "editexecutablesdialog.h"
#include "ui_editexecutablesdialog.h"
#include "filedialogmemory.h"
#include
using namespace MOBase;
using namespace MOShared;
EditExecutablesDialog::EditExecutablesDialog(const ExecutablesList &executablesList, QWidget *parent)
: TutorableDialog("EditExecutables", parent),
ui(new Ui::EditExecutablesDialog), m_ExecutablesList(executablesList)
{
ui->setupUi(this);
refreshExecutablesWidget();
}
EditExecutablesDialog::~EditExecutablesDialog()
{
delete ui;
}
ExecutablesList EditExecutablesDialog::getExecutablesList() const
{
ExecutablesList newList;
for (int i = 0; i < ui->executablesListBox->count(); ++i) {
newList.addExecutable(ui->executablesListBox->item(i)->data(Qt::UserRole).value());
}
return newList;
}
void EditExecutablesDialog::refreshExecutablesWidget()
{
QListWidget *executablesWidget = findChild("executablesListBox");
executablesWidget->clear();
std::vector::const_iterator current, end;
m_ExecutablesList.getExecutables(current, end);
for(; current != end; ++current) {
QListWidgetItem *newItem = new QListWidgetItem(current->m_Title);
QVariant temp;
temp.setValue(*current);
newItem->setData(Qt::UserRole, temp);
newItem->setTextColor(current->m_Custom ? QColor(Qt::black) : QColor(Qt::darkGray));
executablesWidget->addItem(newItem);
}
QPushButton *addButton = findChild("addButton");
QPushButton *removeButton = findChild("removeButton");
addButton->setEnabled(false);
removeButton->setEnabled(false);
}
void EditExecutablesDialog::on_binaryEdit_textChanged(const QString &arg1)
{
QPushButton *addButton = findChild("addButton");
// QPushButton *removeButton = findChild("removeButton");
QFileInfo fileInfo(arg1);
addButton->setEnabled(fileInfo.exists() && fileInfo.isFile());
}
void EditExecutablesDialog::resetInput()
{
ui->binaryEdit->setText("");
ui->titleEdit->setText("");
ui->argumentsEdit->setText("");
ui->closeCheckBox->setChecked(false);
}
void EditExecutablesDialog::on_addButton_clicked()
{
QLineEdit *titleEdit = findChild("titleEdit");
QLineEdit *binaryEdit = findChild("binaryEdit");
QLineEdit *argumentsEdit = findChild("argumentsEdit");
QLineEdit *workingDirEdit = findChild("workingDirEdit");
QCheckBox *closeCheckBox = findChild("closeCheckBox");
m_ExecutablesList.addExecutable(titleEdit->text(), QDir::fromNativeSeparators(binaryEdit->text()),
argumentsEdit->text(), QDir::fromNativeSeparators(workingDirEdit->text()),
(closeCheckBox->checkState() == Qt::Checked) ? DEFAULT_CLOSE : DEFAULT_STAY,
ui->overwriteAppIDBox->isChecked() ? ui->appIDOverwriteEdit->text() : "",
true, false);
resetInput();
refreshExecutablesWidget();
}
void EditExecutablesDialog::on_browseButton_clicked()
{
QString binaryName = FileDialogMemory::getOpenFileName("editExecutableBinary", this,
tr("Select a binary"), QString(), tr("Executable (%1)").arg("*.exe *.bat"));
QLineEdit *binaryEdit = findChild("binaryEdit");
binaryEdit->setText(QDir::toNativeSeparators(binaryName));
}
void EditExecutablesDialog::on_browseDirButton_clicked()
{
QString dirName = FileDialogMemory::getExistingDirectory("editExecutableDirectory", this,
tr("Select a directory"));
ui->workingDirEdit->setText(dirName);
}
void EditExecutablesDialog::on_removeButton_clicked()
{
// QLineEdit *binaryEdit = findChild("binaryEdit");
if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->titleEdit->text()),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
m_ExecutablesList.remove(ui->titleEdit->text());
}
resetInput();
refreshExecutablesWidget();
}
void EditExecutablesDialog::on_titleEdit_textChanged(const QString &arg1)
{
QPushButton *addButton = findChild("addButton");
QPushButton *removeButton = findChild("removeButton");
QListWidget *executablesWidget = findChild("executablesListBox");
QList existingItems = executablesWidget->findItems(arg1, Qt::MatchFixedString);
addButton->setEnabled(arg1.length() != 0);
if (existingItems.count() == 0) {
addButton->setText(tr("Add"));
removeButton->setEnabled(false);
} else {
// existing item. is it a custom one?
addButton->setText(tr("Modify"));
removeButton->setEnabled(true);
}
}
void EditExecutablesDialog::on_executablesListBox_itemClicked(QListWidgetItem *item)
{
QLineEdit *titleEdit = findChild("titleEdit");
QLineEdit *binaryEdit = findChild("binaryEdit");
QLineEdit *argumentsEdit = findChild("argumentsEdit");
QLineEdit *workingDirEdit = findChild("workingDirEdit");
QPushButton *removeButton = findChild("removeButton");
QCheckBox *closeCheckBox = findChild("closeCheckBox");
const Executable &selectedExecutable = item->data(Qt::UserRole).value();
titleEdit->setText(selectedExecutable.m_Title);
binaryEdit->setText(QDir::toNativeSeparators(selectedExecutable.m_BinaryInfo.absoluteFilePath()));
argumentsEdit->setText(selectedExecutable.m_Arguments);
workingDirEdit->setText(QDir::toNativeSeparators(selectedExecutable.m_WorkingDirectory));
closeCheckBox->setChecked(selectedExecutable.m_CloseMO == DEFAULT_CLOSE);
if (selectedExecutable.m_CloseMO == NEVER_CLOSE) {
closeCheckBox->setEnabled(false);
closeCheckBox->setToolTip(tr("MO must be kept running or this application will not work correctly."));
} else {
closeCheckBox->setEnabled(true);
closeCheckBox->setToolTip(tr("If checked, MO will be closed once the specified executable is run."));
}
removeButton->setEnabled(selectedExecutable.m_Custom);
ui->overwriteAppIDBox->setChecked(selectedExecutable.m_SteamAppID != 0);
if (selectedExecutable.m_SteamAppID != 0) {
ui->appIDOverwriteEdit->setText(selectedExecutable.m_SteamAppID);
}
}
void EditExecutablesDialog::on_overwriteAppIDBox_toggled(bool checked)
{
ui->appIDOverwriteEdit->setEnabled(checked);
}