summaryrefslogtreecommitdiff
path: root/src/instancemanagerdialog.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-11-06 14:43:33 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-11-07 20:16:25 -0500
commitbc157095a56596e697d40371688926953b2c5533 (patch)
tree111152409ed909b83a05a377c1b176afeaf879f8 /src/instancemanagerdialog.cpp
parentdc2ada2a4249917f538938298deb193ed1dd6bb9 (diff)
moved getInstanceName() up
removed individual getters in CreateInstanceDialog, they were duplicating the work in creationInfo() only VariantsPage needs access to the game plugin during creationInfo(), so pass it instead selecting an undetected game, choosing a valid path and going back to the games page would not display the selected path in the list
Diffstat (limited to 'src/instancemanagerdialog.cpp')
-rw-r--r--src/instancemanagerdialog.cpp172
1 files changed, 97 insertions, 75 deletions
diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp
index c199fa7b..71fed78d 100644
--- a/src/instancemanagerdialog.cpp
+++ b/src/instancemanagerdialog.cpp
@@ -13,7 +13,9 @@
using namespace MOBase;
-
+// returns the icon for the given instance or an empty 32x32 icon if the game
+// plugin couldn't be found
+//
QIcon instanceIcon(const PluginContainer& pc, const Instance& i)
{
const auto* game = InstanceManager::singleton()
@@ -27,6 +29,78 @@ QIcon instanceIcon(const PluginContainer& pc, const Instance& i)
return QIcon(empty);
}
+// pops up a dialog to ask for an instance name when renaming
+//
+QString getInstanceName(
+ QWidget* parent, const QString& title, const QString& moreText,
+ const QString& label, const QString& oldName={})
+{
+ auto& m = InstanceManager::singleton();
+
+ QDialog dlg(parent);
+ dlg.setWindowTitle(title);
+
+ auto* ly = new QVBoxLayout(&dlg);
+
+ auto* bb = new QDialogButtonBox(
+ QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
+
+ auto* text = new QLineEdit(oldName);
+ text->selectAll();
+
+ auto* error = new QLabel;
+
+ if (!moreText.isEmpty()) {
+ auto* lb = new QLabel(moreText);
+ lb->setWordWrap(true);
+ ly->addWidget(lb);
+ ly->addSpacing(10);
+ }
+
+ auto* lb = new QLabel(label);
+ lb->setWordWrap(true);
+ ly->addWidget(lb);
+
+ ly->addWidget(text);
+ ly->addWidget(error);
+ ly->addStretch();
+ ly->addWidget(bb);
+
+ auto check = [&] {
+ bool okay = false;
+
+ if (text->text().isEmpty()) {
+ error->setText("");
+ } else if (!m.validInstanceName(text->text())) {
+ error->setText(QObject::tr("The instance name must be a valid folder name."));
+ } else {
+ const auto name = m.sanitizeInstanceName(text->text());
+
+ if ((name != oldName) && m.instanceExists(text->text())) {
+ error->setText(QObject::tr("An instance with this name already exists."));
+ } else {
+ okay = true;
+ }
+ }
+
+ error->setVisible(!okay);
+ bb->button(QDialogButtonBox::Ok)->setEnabled(okay);
+ };
+
+ QObject::connect(text, &QLineEdit::textChanged, [&] { check(); });
+ QObject::connect(bb, &QDialogButtonBox::accepted, [&]{ dlg.accept(); });
+ QObject::connect(bb, &QDialogButtonBox::rejected, [&]{ dlg.reject(); });
+
+ check();
+
+ dlg.resize({400, 120});
+ if (dlg.exec() != QDialog::Accepted) {
+ return {};
+ }
+
+ return m.sanitizeInstanceName(text->text());
+}
+
InstanceManagerDialog::~InstanceManagerDialog() = default;
@@ -106,9 +180,9 @@ void InstanceManagerDialog::updateList()
m_model->clear();
- const std::size_t NoSel = -1;
- std::size_t sel = NoSel;
+ std::size_t sel = NoSelection;
+ // creating items for instances
for (std::size_t i=0; i<m_instances.size(); ++i) {
const auto& ii = *m_instances[i];
@@ -128,7 +202,7 @@ void InstanceManagerDialog::updateList()
if (m_instances.empty()) {
select(-1);
} else {
- if (sel == NoSel) {
+ if (sel == NoSelection) {
if (prevSelIndex >= m_instances.size()) {
sel = m_instances.size() - 1;
} else {
@@ -207,76 +281,6 @@ void InstanceManagerDialog::openSelectedInstance()
accept();
}
-QString getInstanceName(
- QWidget* parent, const QString& title, const QString& moreText,
- const QString& label, const QString& oldName={})
-{
- auto& m = InstanceManager::singleton();
-
- QDialog dlg(parent);
- dlg.setWindowTitle(title);
-
- auto* ly = new QVBoxLayout(&dlg);
-
- auto* bb = new QDialogButtonBox(
- QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
-
- auto* text = new QLineEdit(oldName);
- text->selectAll();
-
- auto* error = new QLabel;
-
- if (!moreText.isEmpty()) {
- auto* lb = new QLabel(moreText);
- lb->setWordWrap(true);
- ly->addWidget(lb);
- ly->addSpacing(10);
- }
-
- auto* lb = new QLabel(label);
- lb->setWordWrap(true);
- ly->addWidget(lb);
-
- ly->addWidget(text);
- ly->addWidget(error);
- ly->addStretch();
- ly->addWidget(bb);
-
- auto check = [&] {
- bool okay = false;
-
- if (text->text().isEmpty()) {
- error->setText("");
- } else if (!m.validInstanceName(text->text())) {
- error->setText(QObject::tr("The instance name must be a valid folder name."));
- } else {
- const auto name = m.sanitizeInstanceName(text->text());
-
- if ((name != oldName) && m.instanceExists(text->text())) {
- error->setText(QObject::tr("An instance with this name already exists."));
- } else {
- okay = true;
- }
- }
-
- error->setVisible(!okay);
- bb->button(QDialogButtonBox::Ok)->setEnabled(okay);
- };
-
- QObject::connect(text, &QLineEdit::textChanged, [&] { check(); });
- QObject::connect(bb, &QDialogButtonBox::accepted, [&]{ dlg.accept(); });
- QObject::connect(bb, &QDialogButtonBox::rejected, [&]{ dlg.reject(); });
-
- check();
-
- dlg.resize({400, 120});
- if (dlg.exec() != QDialog::Accepted) {
- return {};
- }
-
- return m.sanitizeInstanceName(text->text());
-}
-
void InstanceManagerDialog::rename()
{
auto* i = singleSelection();
@@ -293,6 +297,8 @@ void InstanceManagerDialog::rename()
return;
}
+
+ // getting new name
const auto newName = getInstanceName(
this, tr("Rename instance"), "", tr("Instance name"), i->name());
@@ -300,11 +306,16 @@ void InstanceManagerDialog::rename()
return;
}
+
+ // renaming
const QString src = i->directory();
const QString dest = QDir::toNativeSeparators(
QFileInfo(src).dir().path() + "/" + newName);
+ log::info("renaming {} to {}", src, dest);
+
const auto r = shell::Rename(src, dest, false);
+
if (!r) {
QMessageBox::critical(
this, tr("Error"),
@@ -314,6 +325,8 @@ void InstanceManagerDialog::rename()
return;
}
+
+ // updating ui
auto newInstance = std::make_unique<Instance>(dest, false);
i = newInstance.get();
@@ -365,6 +378,8 @@ void InstanceManagerDialog::deleteInstance()
return;
}
+ // creating dialog
+
const auto Recycle = QMessageBox::Save;
const auto Delete = QMessageBox::Yes;
const auto Cancel = QMessageBox::Cancel;
@@ -388,6 +403,8 @@ void InstanceManagerDialog::deleteInstance()
list->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
list->setMaximumHeight(160);
+
+ // filling the list
for (const auto& f : files) {
auto* item = new QListWidgetItem(f.path);
@@ -412,6 +429,7 @@ void InstanceManagerDialog::deleteInstance()
}
+ // gathering all the selected items
QStringList selected;
for (int i=0; i<list->count(); ++i) {
@@ -427,10 +445,14 @@ void InstanceManagerDialog::deleteInstance()
return;
}
+
+ // deleting
if (!doDelete(selected, (r == Recycle))) {
return;
}
+
+ // updating ui
updateInstances();
updateList();
}
@@ -501,7 +523,7 @@ void InstanceManagerDialog::createNew()
updateInstances();
updateList();
- select(dlg.instanceName());
+ select(dlg.creationInfo().instanceName);
}
std::size_t InstanceManagerDialog::singleSelectionIndex() const