From e39de4dd2ab6c19c6b9557f99117f7ffc9ed1cc1 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Wed, 18 Nov 2020 19:22:05 +0100 Subject: Update following addition of IPluginGame::listSaves(). --- src/mainwindow.cpp | 53 +++++++++++++++++------------------------------------ 1 file changed, 17 insertions(+), 36 deletions(-) (limited to 'src/mainwindow.cpp') 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(); @@ -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 &LHS, const std::pair &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 += "
  • " + QFileInfo(name).completeBaseName() + "
  • "; + savesMsgLabel += "
  • " + QFileInfo(saveGame->getFilepath()).completeBaseName() + "
  • "; } ++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)(-.*)?$"))) { -- cgit v1.3.1 From 0a912afe72a8fb765f240d59db17f7b50094b014 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Sat, 21 Nov 2020 12:13:20 +0100 Subject: Add timer to the save list watcher to avoid error during refresh. --- src/mainwindow.cpp | 5 ++++- src/mainwindow.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ecb4319b..04833e6a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -430,7 +430,10 @@ MainWindow::MainWindow(Settings &settings this, &MainWindow::refresherProgress); connect(m_OrganizerCore.directoryRefresher(), SIGNAL(error(QString)), this, SLOT(showError(QString))); - connect(&m_SavesWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(refreshSavesIfOpen())); + m_SavesWatcherTimer.setSingleShot(true); + m_SavesWatcherTimer.setInterval(500); + connect(&m_SavesWatcher, &QFileSystemWatcher::directoryChanged, [this]() { m_SavesWatcherTimer.start(); }); + connect(&m_SavesWatcherTimer, &QTimer::timeout, this, &MainWindow::refreshSavesIfOpen); connect(&m_OrganizerCore.settings(), SIGNAL(languageChanged(QString)), this, SLOT(languageChange(QString))); connect(&m_OrganizerCore.settings(), SIGNAL(styleChanged(QString)), this, SIGNAL(styleChanged(QString))); diff --git a/src/mainwindow.h b/src/mainwindow.h index da916d2a..da7bb6ee 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -345,6 +345,7 @@ private: std::unique_ptr m_IntegratedBrowser; + QTimer m_SavesWatcherTimer; QFileSystemWatcher m_SavesWatcher; QByteArray m_ArchiveListHash; -- cgit v1.3.1 From f3f0036a056b17ed481cf3ec4dea78a59c04b16e Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Mon, 23 Nov 2020 15:30:21 +0100 Subject: Fix PluginContainer::setUserInterface(). --- src/mainwindow.cpp | 4 ++-- src/modinfowithconflictinfo.cpp | 4 ++-- src/modinfowithconflictinfo.h | 4 +++- src/plugincontainer.cpp | 18 ++++++++++-------- src/plugincontainer.h | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 04833e6a..7558076d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -511,6 +511,7 @@ MainWindow::MainWindow(Settings &settings m_Tutorial.expose("espList", m_OrganizerCore.pluginList()); m_OrganizerCore.setUserInterface(this); + m_PluginContainer.setUserInterface(this); connect(this, &MainWindow::userInterfaceInitialized, &m_OrganizerCore, &OrganizerCore::userInterfaceInitialized); for (const QString &fileName : m_PluginContainer.pluginFileNames()) { installTranslator(QFileInfo(fileName).baseName()); @@ -703,7 +704,7 @@ MainWindow::~MainWindow() try { cleanup(); - m_PluginContainer.setUserInterface(nullptr, nullptr); + m_PluginContainer.setUserInterface(nullptr); m_OrganizerCore.setUserInterface(nullptr); if (m_IntegratedBrowser) { @@ -1679,7 +1680,6 @@ void MainWindow::updateToolMenu() void MainWindow::registerModPage(IPluginModPage *modPage) { QAction *action = new QAction(modPage->icon(), modPage->displayName(), this); - modPage->setParentWidget(this); connect(action, &QAction::triggered, this, [this, modPage]() { if (modPage->useIntegratedBrowser()) { diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp index 6e3f751e..ad7eda3f 100644 --- a/src/modinfowithconflictinfo.cpp +++ b/src/modinfowithconflictinfo.cpp @@ -15,7 +15,7 @@ namespace fs = std::filesystem; ModInfoWithConflictInfo::ModInfoWithConflictInfo( PluginContainer *pluginContainer, const MOBase::IPluginGame* gamePlugin, DirectoryEntry **directoryStructure) - : ModInfo(pluginContainer), m_GamePlugin(gamePlugin), + : ModInfo(pluginContainer), m_GamePlugin(gamePlugin), m_FileTree([this]() { return QDirFileTree::makeTree(absolutePath()); }), m_Valid([this]() { return doIsValid(); }), m_Contents([this]() { return doGetContents(); }), @@ -27,7 +27,7 @@ void ModInfoWithConflictInfo::clearCaches() } std::vector ModInfoWithConflictInfo::getFlags() const -{ +{ std::vector result = std::vector(); if (hasHiddenFiles()) { result.push_back(ModInfo::FLAG_HIDDEN_FILES); diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h index e312a89a..0d11fcb1 100644 --- a/src/modinfowithconflictinfo.h +++ b/src/modinfowithconflictinfo.h @@ -34,7 +34,9 @@ public: * * @return true if the content is there, false otherwise. */ - virtual bool hasContent(int content) const override; /** + virtual bool hasContent(int content) const override; + + /** * @brief Retrieve a file tree corresponding to the underlying disk content * of this mod. * diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index fc7f5cd0..44c9a651 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -289,15 +289,17 @@ PluginContainer::~PluginContainer() { unloadPlugins(); } -void PluginContainer::setUserInterface(IUserInterface *userInterface, QWidget *widget) +void PluginContainer::setUserInterface(IUserInterface *userInterface) { - for (IPluginProxy *proxy : bf::at_key(m_Plugins)) { - proxy->setParentWidget(widget); - } - - if (userInterface != nullptr) { - for (IPluginModPage *modPage : bf::at_key(m_Plugins)) { - userInterface->registerModPage(modPage); + if (userInterface) { + for (IPluginProxy* proxy : bf::at_key(m_Plugins)) { + proxy->setParentWidget(userInterface->mainWindow()); + } + for (IPluginModPage* modPage : bf::at_key(m_Plugins)) { + modPage->setParentWidget(userInterface->mainWindow()); + } + for (IPluginTool* tool : bf::at_key(m_Plugins)) { + tool->setParentWidget(userInterface->mainWindow()); } } diff --git a/src/plugincontainer.h b/src/plugincontainer.h index 0c1290b4..26e12659 100644 --- a/src/plugincontainer.h +++ b/src/plugincontainer.h @@ -188,7 +188,7 @@ public: PluginContainer(OrganizerCore *organizer); virtual ~PluginContainer(); - void setUserInterface(IUserInterface *userInterface, QWidget *widget); + void setUserInterface(IUserInterface *userInterface); void loadPlugins(); void unloadPlugins(); -- cgit v1.3.1 From ef1188811633e8c1403f960c9196de92d0a81020 Mon Sep 17 00:00:00 2001 From: Mikaël Capelle Date: Fri, 27 Nov 2020 19:20:41 +0100 Subject: Fix conflicts with master. --- src/mainwindow.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7558076d..69f90ce4 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1210,9 +1210,7 @@ void MainWindow::createHelpMenu() ActionList tutorials; - QString tutorialPath = QApplication::applicationDirPath() - + "/" + QString::fromStdWString(AppConfig::tutorialsPath()) + "/"; - QDirIterator dirIter(tutorialPath, QStringList("*.js"), QDir::Files); + QDirIterator dirIter(QApplication::applicationDirPath() + "/tutorials", QStringList("*.js"), QDir::Files); while (dirIter.hasNext()) { dirIter.next(); QString fileName = dirIter.fileName(); @@ -1324,8 +1322,7 @@ bool MainWindow::addProfile() void MainWindow::hookUpWindowTutorials() { - QString tutorialPath = QApplication::applicationDirPath() + "/" + QString::fromStdWString(AppConfig::tutorialsPath()) + "/"; - QDirIterator dirIter(tutorialPath, QStringList("*.js"), QDir::Files); + QDirIterator dirIter(QApplication::applicationDirPath() + "/tutorials", QStringList("*.js"), QDir::Files); while (dirIter.hasNext()) { dirIter.next(); QString fileName = dirIter.fileName(); @@ -5213,9 +5210,7 @@ void MainWindow::installTranslator(const QString &name) { QTranslator *translator = new QTranslator(this); QString fileName = name + "_" + m_CurrentLanguage; - QString translationsPath = qApp->applicationDirPath() - + "/" + QString::fromStdWString(AppConfig::translationsPath()); - if (!translator->load(fileName, translationsPath)) { + if (!translator->load(fileName, qApp->applicationDirPath() + "/translations")) { if (m_CurrentLanguage.contains(QRegularExpression("^.*_(EN|en)(-.*)?$"))) { log::debug("localization file %s not found", fileName); } // we don't actually expect localization files for English (en, en-us, en-uk, and any variation thereof) -- cgit v1.3.1