summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-11-18 19:22:05 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2020-11-18 19:22:05 +0100
commite39de4dd2ab6c19c6b9557f99117f7ffc9ed1cc1 (patch)
treece2328253ae603f39cfe995e844b3672341a88d6
parentddba54382aab3cb5548485d14c85e2611272f3cb (diff)
Update following addition of IPluginGame::listSaves().
-rw-r--r--src/mainwindow.cpp53
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/transfersavesdialog.cpp105
-rw-r--r--src/transfersavesdialog.h7
4 files changed, 30 insertions, 136 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index c2aefdd2..ecb4319b 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1206,7 +1206,7 @@ void MainWindow::createHelpMenu()
ActionList tutorials;
- QString tutorialPath = QApplication::applicationDirPath()
+ QString tutorialPath = QApplication::applicationDirPath()
+ "/" + QString::fromStdWString(AppConfig::tutorialsPath()) + "/";
QDirIterator dirIter(tutorialPath, QStringList("*.js"), QDir::Files);
while (dirIter.hasNext()) {
@@ -1532,7 +1532,6 @@ void MainWindow::displaySaveGameInfo(QListWidgetItem *newItem)
return;
}
- QString const &save = newItem->data(Qt::UserRole).toString();
if (m_CurrentSaveView == nullptr) {
IPluginGame const *game = m_OrganizerCore.managedGame();
SaveGameInfo const *info = game->feature<SaveGameInfo>();
@@ -1543,7 +1542,7 @@ void MainWindow::displaySaveGameInfo(QListWidgetItem *newItem)
return;
}
}
- m_CurrentSaveView->setSave(save);
+ m_CurrentSaveView->setSave(*m_SaveGames[ui->savegameList->row(newItem)]);
QWindow *window = m_CurrentSaveView->window()->windowHandle();
QRect screenRect;
@@ -1964,36 +1963,23 @@ void MainWindow::stopMonitorSaves()
void MainWindow::refreshSaveList()
{
- ui->savegameList->clear();
+ TimeThis tt("MainWindow::refreshSaveList()");
startMonitorSaves(); // re-starts monitoring
- QStringList filters;
- filters << QString("*.") + m_OrganizerCore.managedGame()->savegameExtension();
-
QDir savesDir = currentSavesDir();
- savesDir.setNameFilters(filters);
- savesDir.setFilter(QDir::Files);
- QDirIterator it(savesDir, QDirIterator::Subdirectories);
- log::debug("reading save games from {}", savesDir.absolutePath());
-
- QFileInfoList files;
- while (it.hasNext()) {
- it.next();
- files.append(it.fileInfo());
- }
- std::sort(files.begin(), files.end(), [](auto const& lhs, auto const& rhs) {
- return lhs.fileTime(QFileDevice::FileModificationTime) > rhs.fileTime(QFileDevice::FileModificationTime);
+ MOBase::log::debug("reading save games from {}", savesDir.absolutePath());
+ m_SaveGames = m_OrganizerCore.managedGame()->listSaves(savesDir);
+ std::sort(m_SaveGames.begin(), m_SaveGames.end(), [](auto const& lhs, auto const& rhs) {
+ return lhs->getCreationTime() > rhs->getCreationTime();
});
- for (const QFileInfo &file : files) {
- QListWidgetItem *item = new QListWidgetItem(savesDir.relativeFilePath(file.absoluteFilePath()));
- item->setData(Qt::UserRole, file.absoluteFilePath());
- ui->savegameList->addItem(item);
+ ui->savegameList->clear();
+ for (auto& save: m_SaveGames) {
+ ui->savegameList->addItem(savesDir.relativeFilePath(save->getFilepath()));
}
}
-
static bool BySortValue(const std::pair<UINT32, QTreeWidgetItem*> &LHS, const std::pair<UINT32, QTreeWidgetItem*> &RHS)
{
return LHS.first < RHS.first;
@@ -4960,20 +4946,15 @@ void MainWindow::deleteSavegame_clicked()
int count = 0;
for (const QModelIndex &idx : ui->savegameList->selectionModel()->selectedIndexes()) {
- QString name = idx.data(Qt::UserRole).toString();
+
+ auto& saveGame = m_SaveGames[idx.row()];
if (count < 10) {
- savesMsgLabel += "<li>" + QFileInfo(name).completeBaseName() + "</li>";
+ savesMsgLabel += "<li>" + QFileInfo(saveGame->getFilepath()).completeBaseName() + "</li>";
}
++count;
- if (info == nullptr) {
- deleteFiles.push_back(name);
- } else {
- ISaveGame const *save = info->getSaveGameInfo(name);
- deleteFiles += save->allFiles();
- delete save;
- }
+ deleteFiles += saveGame->allFiles();
}
if (count > 10) {
@@ -5032,8 +5013,8 @@ void MainWindow::on_savegameList_customContextMenuRequested(const QPoint& pos)
QAction* action = menu.addAction(tr("Enable Mods..."));
action->setEnabled(false);
if (selection->selectedIndexes().count() == 1) {
- QString save = ui->savegameList->currentItem()->data(Qt::UserRole).toString();
- SaveGameInfo::MissingAssets missing = info->getMissingAssets(save);
+ auto& save = m_SaveGames[selection->selectedIndexes()[0].row()];
+ SaveGameInfo::MissingAssets missing = info->getMissingAssets(*save);
if (missing.size() != 0) {
connect(action, &QAction::triggered, this, [this, missing] { fixMods_clicked(missing); });
action->setEnabled(true);
@@ -5229,7 +5210,7 @@ void MainWindow::installTranslator(const QString &name)
{
QTranslator *translator = new QTranslator(this);
QString fileName = name + "_" + m_CurrentLanguage;
- QString translationsPath = qApp->applicationDirPath()
+ QString translationsPath = qApp->applicationDirPath()
+ "/" + QString::fromStdWString(AppConfig::translationsPath());
if (!translator->load(fileName, translationsPath)) {
if (m_CurrentLanguage.contains(QRegularExpression("^.*_(EN|en)(-.*)?$"))) {
diff --git a/src/mainwindow.h b/src/mainwindow.h
index e2805b25..da916d2a 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -334,6 +334,7 @@ private:
QTime m_StartTime;
//SaveGameInfoWidget *m_CurrentSaveView;
+ std::vector<std::shared_ptr<const MOBase::ISaveGame>> m_SaveGames;
MOBase::ISaveGameInfoWidget *m_CurrentSaveView;
OrganizerCore &m_OrganizerCore;
diff --git a/src/transfersavesdialog.cpp b/src/transfersavesdialog.cpp
index f8ebbb9d..5288d408 100644
--- a/src/transfersavesdialog.cpp
+++ b/src/transfersavesdialog.cpp
@@ -42,74 +42,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
using namespace MOBase;
using namespace MOShared;
-//These two classes give the save-transfer box a smidgin of useful info even
-//if save game isn't supported yet.
-namespace {
-
-class DummySave : public ISaveGame
-{
-public:
- DummySave(QString const &filename) :
- m_File(filename)
- {}
-
- ~DummySave() {}
-
- virtual QString getFilename() const override
- {
- return m_File;
- }
-
- virtual QDateTime getCreationTime() const override
- {
- return QFileInfo(m_File).birthTime();
- }
-
- virtual QString getSaveGroupIdentifier() const override
- {
- return m_File;
- }
-
- virtual QStringList allFiles() const override
- {
- return { m_File };
- }
-
- virtual bool hasScriptExtenderFile() const override
- {
- return false;
- }
-
-private:
- QString m_File;
-};
-
-class DummyInfo : public SaveGameInfo
-{
-public:
- virtual MOBase::ISaveGame const *getSaveGameInfo(QString const &file) const override
- {
- return new DummySave(file);
- }
-
- virtual MissingAssets getMissingAssets(QString const &) const override
- {
- return {};
- }
-
- MOBase::ISaveGameInfoWidget *getSaveGameWidget(QWidget *) const override
- {
- return nullptr;
- }
-
- virtual bool hasScriptExtenderSave(QString const &file) const override
- {
- return false;
- }
-};
-
-} //end anonymous namespace
-
TransferSavesDialog::TransferSavesDialog(const Profile &profile, IPluginGame const *gamePlugin, QWidget *parent)
: TutorableDialog("TransferSaves", parent)
, ui(new Ui::TransferSavesDialog)
@@ -263,7 +195,7 @@ void TransferSavesDialog::on_globalCharacterList_currentTextChanged(const QStrin
SaveCollection::const_iterator saveList = m_GlobalSaves.find(currentText);
if (saveList != m_GlobalSaves.end()) {
for (SaveListItem const &save : saveList->second) {
- ui->globalSavesList->addItem(QFileInfo(save->getFilename()).fileName());
+ ui->globalSavesList->addItem(QFileInfo(save->getFilepath()).fileName());
}
}
}
@@ -276,7 +208,7 @@ void TransferSavesDialog::on_localCharacterList_currentTextChanged(const QString
SaveCollection::const_iterator saveList = m_LocalSaves.find(currentText);
if (saveList != m_LocalSaves.end()) {
for (SaveListItem const &save : saveList->second) {
- ui->localSavesList->addItem(QFileInfo(save->getFilename()).fileName());
+ ui->localSavesList->addItem(QFileInfo(save->getFilepath()).fileName());
}
}
}
@@ -285,34 +217,13 @@ void TransferSavesDialog::refreshSaves(SaveCollection &saveCollection, QString c
{
saveCollection.clear();
- SaveGameInfo const *info = m_GamePlugin->feature<SaveGameInfo>();
- if (info == nullptr) {
- static DummyInfo dummyInfo;
- info = &dummyInfo;
- }
-
- QStringList filters;
- filters << QString("*.") + m_GamePlugin->savegameExtension();
-
- QDir savesDir(savedir);
- savesDir.setNameFilters(QStringList() << QString("*.") + m_GamePlugin->savegameExtension());
- savesDir.setFilter(QDir::Files);
- QDirIterator it(savesDir, QDirIterator::Subdirectories);
- log::debug("reading save games from {}", savesDir.absolutePath());
-
- QFileInfoList files;
- while (it.hasNext()) {
- it.next();
- files.append(it.fileInfo());
- }
- std::sort(files.begin(), files.end(), [](auto const& lhs, auto const& rhs) {
- return lhs.fileTime(QFileDevice::FileModificationTime) < rhs.fileTime(QFileDevice::FileModificationTime);
+ auto saves = m_GamePlugin->listSaves(savedir);
+ std::sort(saves.begin(), saves.end(), [](auto const& lhs, auto const& rhs) {
+ return lhs->getCreationTime() > rhs->getCreationTime();
});
- for (const QFileInfo &file: files) {
- MOBase::ISaveGame const *save = info->getSaveGameInfo(file.absoluteFilePath());
- saveCollection[save->getSaveGroupIdentifier()].push_back(
- std::unique_ptr<MOBase::ISaveGame const>(save));
+ for (auto& save: saves) {
+ saveCollection[save->getSaveGroupIdentifier()].push_back(save);
}
}
@@ -334,7 +245,7 @@ void TransferSavesDialog::refreshCharacters(const SaveCollection &saveCollection
}
bool TransferSavesDialog::transferCharacters(
- QString const &character, char const *message,
+ QString const &character, char const *message,
QDir const& sourceDirectory,
SaveList &saves,
QDir const& destination,
diff --git a/src/transfersavesdialog.h b/src/transfersavesdialog.h
index b983ad9e..fe78aa83 100644
--- a/src/transfersavesdialog.h
+++ b/src/transfersavesdialog.h
@@ -80,9 +80,10 @@ private:
MOBase::IPluginGame const *m_GamePlugin;
- typedef std::unique_ptr<MOBase::ISaveGame const> SaveListItem;
- typedef std::vector<SaveListItem> SaveList;
- typedef std::map<QString, SaveList> SaveCollection;
+ using SaveListItem = std::shared_ptr<const MOBase::ISaveGame>;
+ using SaveList = std::vector<SaveListItem>;
+ using SaveCollection = std::map<QString, SaveList>;
+
SaveCollection m_GlobalSaves;
SaveCollection m_LocalSaves;