diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-01-06 09:29:15 +0100 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2021-01-06 09:29:15 +0100 |
| commit | 86fb0dc9bde6aafb190a50d49f3f41b1fc774244 (patch) | |
| tree | f583b63177208938462ac70358cfef3ba3e1628a /src/mainwindow.cpp | |
| parent | fc4b069a875f7afd429e85b8d5590dc5c23d77c5 (diff) | |
| parent | e3e54bc8d3d4a5219c7f2c1f6338b7ecc5d1e8ec (diff) | |
Merge remote-tracking branch 'origin/master' into collapsible-separators
Diffstat (limited to 'src/mainwindow.cpp')
| -rw-r--r-- | src/mainwindow.cpp | 112 |
1 files changed, 68 insertions, 44 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ee25fc61..f761a5f0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1506,67 +1506,91 @@ void MainWindow::activateSelectedProfile() void MainWindow::on_profileBox_currentIndexChanged(int index) { - if (ui->profileBox->isEnabled()) { - int previousIndex = m_OldProfileIndex; - m_OldProfileIndex = index; + if (!ui->profileBox->isEnabled()) { + return; + } + + int previousIndex = m_OldProfileIndex; + m_OldProfileIndex = index; - if ((previousIndex != -1) && + // select has changed, save stuff + if ((previousIndex != -1) && (m_OrganizerCore.currentProfile() != nullptr) && m_OrganizerCore.currentProfile()->exists()) { - m_OrganizerCore.saveCurrentLists(); - } + m_OrganizerCore.saveCurrentLists(); + } - // Avoid doing any refresh if currentProfile is already set but previous index was -1 - // as it means that this is happening during initialization so everything has already been set. - if (previousIndex == -1 + // Avoid doing any refresh if currentProfile is already set but previous + // index was -1 as it means that this is happening during initialization so + // everything has already been set. + if (previousIndex == -1 && m_OrganizerCore.currentProfile() != nullptr && m_OrganizerCore.currentProfile()->exists() - && ui->profileBox->currentText() == m_OrganizerCore.currentProfile()->name()) { - return; - } + && ui->profileBox->currentText() == m_OrganizerCore.currentProfile()->name()){ + return; + } - // ensure the new index is valid - if (index < 0 || index >= ui->profileBox->count()) { - log::debug("invalid profile index, using last profile"); - ui->profileBox->setCurrentIndex(ui->profileBox->count() - 1); - } + // ensure the new index is valid + if (index < 0 || index >= ui->profileBox->count()) { + log::debug("invalid profile index, using last profile"); + ui->profileBox->setCurrentIndex(ui->profileBox->count() - 1); + } - if (ui->profileBox->currentIndex() == 0) { - ui->profileBox->setCurrentIndex(previousIndex); - std::optional<QString> newSelection; + // handle <manage> item + if (ui->profileBox->currentIndex() == 0) { + // remember the profile name that was selected before, previousIndex can't + // be used again because adding/deleting profiles will change the order + // in the list + const QString previousName = ui->profileBox->itemText(previousIndex); - ProfilesDialog dlg(ui->profileBox->currentText(), m_OrganizerCore, this); - dlg.exec(); - newSelection = dlg.selectedProfile(); + // show the dialog + ProfilesDialog dlg(previousName, m_OrganizerCore, this); + dlg.exec(); - while (!refreshProfiles()) { - ProfilesDialog dlg(ui->profileBox->currentText(), m_OrganizerCore, this); - dlg.exec(); - newSelection = dlg.selectedProfile(); - } + // check if the user clicked 'select' to select another profile + std::optional<QString> newSelection = dlg.selectedProfile(); - if (newSelection) { - ui->profileBox->setCurrentText(*newSelection); - activateSelectedProfile(); - } + // refresh the profile box; this loops until there is at least one profile + // available, which shouldn't really happen because the dialog won't allow + // it + // + // the `false` to refreshProfiles() is so it doesn't try to select the + // profile in the list because 1) it's done just below, and 2) it might be + // wrong profile if there's something in newSelection + while (!refreshProfiles(false)) { + ProfilesDialog dlg(previousName, m_OrganizerCore, this); + dlg.exec(); + newSelection = dlg.selectedProfile(); } - else { - activateSelectedProfile(); + + // note that setCurrentText() is recursive, it will re-execute this function + if (newSelection) { + ui->profileBox->setCurrentText(*newSelection); + } else { + ui->profileBox->setCurrentText(previousName); } - LocalSavegames* saveGames = m_OrganizerCore.managedGame()->feature<LocalSavegames>(); - if (saveGames != nullptr) { - if (saveGames->prepareProfile(m_OrganizerCore.currentProfile())) { - m_SavesTab->refreshSaveList(); - } + // nothing else to do because setCurrentText() is recursive and will + // have re-executed on_profileBox_currentIndexChanged() again, doing all + // the stuff below for the new selection + return; + } + + + activateSelectedProfile(); + + LocalSavegames *saveGames = m_OrganizerCore.managedGame()->feature<LocalSavegames>(); + if (saveGames != nullptr) { + if (saveGames->prepareProfile(m_OrganizerCore.currentProfile())) { + m_SavesTab->refreshSaveList(); } + } - BSAInvalidation* invalidation = m_OrganizerCore.managedGame()->feature<BSAInvalidation>(); - if (invalidation != nullptr) { - if (invalidation->prepareProfile(m_OrganizerCore.currentProfile())) { - QTimer::singleShot(5, &m_OrganizerCore, SLOT(profileRefresh())); - } + BSAInvalidation *invalidation = m_OrganizerCore.managedGame()->feature<BSAInvalidation>(); + if (invalidation != nullptr) { + if (invalidation->prepareProfile(m_OrganizerCore.currentProfile())) { + QTimer::singleShot(5, &m_OrganizerCore, SLOT(profileRefresh())); } } } |
