diff options
| author | Mikaƫl Capelle <capelle.mikael@gmail.com> | 2023-09-29 08:23:52 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-29 08:23:52 +0200 |
| commit | ff0eb2fb70df3aa374acd1bbba23871a2d4b1cf5 (patch) | |
| tree | b45190059131ca0d3eb99df57a46fa6c846f3863 /src/organizercore.cpp | |
| parent | 63f663ac8a3b93668b38045f8e5aa5ac4e12fea6 (diff) | |
Refresh Callback (+ Extra for AboutToRun) (#1884)
* Add working directory and arguments to onAboutToRun (optional).
* Add onRefreshCallback functionality.
Diffstat (limited to 'src/organizercore.cpp')
| -rw-r--r-- | src/organizercore.cpp | 99 |
1 files changed, 47 insertions, 52 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp index b4e758d1..769c6018 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -111,9 +111,9 @@ OrganizerCore::OrganizerCore(Settings& settings) connect(&m_DownloadManager, SIGNAL(downloadSpeed(QString, int)), this, SLOT(downloadSpeed(QString, int))); - connect(m_DirectoryRefresher.get(), SIGNAL(refreshed()), this, - SLOT(directory_refreshed())); - + connect(m_DirectoryRefresher.get(), &DirectoryRefresher::refreshed, [this]() { + onDirectoryRefreshed(); + }); connect(&m_ModList, SIGNAL(removeOrigin(QString)), this, SLOT(removeOrigin(QString))); connect(&m_ModList, &ModList::modStatesChanged, [=] { currentProfile()->writeModlist(); @@ -1134,8 +1134,8 @@ bool OrganizerCore::previewFile(QWidget* parent, const QString& originName, return true; } -boost::signals2::connection -OrganizerCore::onAboutToRun(const std::function<bool(const QString&)>& func) +boost::signals2::connection OrganizerCore::onAboutToRun( + const std::function<bool(const QString&, const QDir&, const QString&)>& func) { return m_AboutToRun.connect(func); } @@ -1195,6 +1195,18 @@ OrganizerCore::onPluginDisabled(std::function<void(const IPlugin*)> const& func) return m_PluginDisabled.connect(func); } +boost::signals2::connection +OrganizerCore::onNextRefresh(std::function<void()> const& func, + RefreshCallbackGroup group, RefreshCallbackMode mode) +{ + if (m_DirectoryUpdate || mode == RefreshCallbackMode::FORCE_WAIT_FOR_REFRESH) { + return m_OnNextRefreshCallbacks.connect(static_cast<int>(group), func); + } else { + func(); + return {}; + } +} + void OrganizerCore::refresh(bool saveChanges) { // don't lose changes! @@ -1212,25 +1224,21 @@ void OrganizerCore::refresh(bool saveChanges) void OrganizerCore::refreshESPList(bool force) { - TimeThis tt("OrganizerCore::refreshESPList()"); + onNextRefresh( + [this, force] { + TimeThis tt("OrganizerCore::refreshESPList()"); - if (m_DirectoryUpdate) { - // don't mess up the esp list if we're currently updating the directory - // structure - m_PostRefreshTasks.append([=]() { - this->refreshESPList(force); - }); - return; - } - m_CurrentProfile->writeModlist(); + m_CurrentProfile->writeModlist(); - // clear list - try { - m_PluginList.refresh(m_CurrentProfile->name(), *m_DirectoryStructure, - m_CurrentProfile->getLockedOrderFileName(), force); - } catch (const std::exception& e) { - reportError(tr("Failed to refresh list of esps: %1").arg(e.what())); - } + // clear list + try { + m_PluginList.refresh(m_CurrentProfile->name(), *m_DirectoryStructure, + m_CurrentProfile->getLockedOrderFileName(), force); + } catch (const std::exception& e) { + reportError(tr("Failed to refresh list of esps: %1").arg(e.what())); + } + }, + RefreshCallbackGroup::CORE, RefreshCallbackMode::RUN_NOW_IF_POSSIBLE); } void OrganizerCore::refreshBSAList() @@ -1513,13 +1521,13 @@ void OrganizerCore::refreshDirectoryStructure() std::set<QString>(archives.begin(), archives.end())); // runs refresh() in a thread - QTimer::singleShot(0, m_DirectoryRefresher.get(), SLOT(refresh())); + QTimer::singleShot(0, m_DirectoryRefresher.get(), &DirectoryRefresher::refresh); } -void OrganizerCore::directory_refreshed() +void OrganizerCore::onDirectoryRefreshed() { log::debug("directory refreshed, finishing up"); - TimeThis tt("OrganizerCore::directory_refreshed()"); + TimeThis tt("OrganizerCore::onDirectoryRefreshed()"); DirectoryEntry* newStructure = m_DirectoryRefresher->stealDirectoryStructure(); Q_ASSERT(newStructure != m_DirectoryStructure); @@ -1543,23 +1551,18 @@ void OrganizerCore::directory_refreshed() log::debug("structure deleter thread done"); }); - m_DirectoryUpdate = false; - log::debug("clearing caches"); for (int i = 0; i < m_ModList.rowCount(); ++i) { ModInfo::Ptr modInfo = ModInfo::getByIndex(i); modInfo->clearCaches(); } - if (!m_PostRefreshTasks.empty()) { - log::debug("running {} post refresh tasks", m_PostRefreshTasks.size()); - - for (auto task : m_PostRefreshTasks) { - task(); - } + // needs to be done before post refresh tasks + m_DirectoryUpdate = false; - m_PostRefreshTasks.clear(); - } + log::debug("running {} post refresh tasks"); + m_OnNextRefreshCallbacks(); + m_OnNextRefreshCallbacks.disconnect_all_slots(); if (m_CurrentProfile != nullptr) { log::debug("refreshing lists"); @@ -1571,11 +1574,6 @@ void OrganizerCore::directory_refreshed() log::debug("refresh done"); } -void OrganizerCore::profileRefresh() -{ - refresh(); -} - void OrganizerCore::clearCaches(std::vector<unsigned int> const& indices) const { const auto insert = [](auto& dest, const auto& from) { @@ -1891,15 +1889,12 @@ bool OrganizerCore::saveCurrentLists() void OrganizerCore::savePluginList() { - if (m_DirectoryUpdate) { - // delay save till after directory update - m_PostRefreshTasks.append([this]() { - this->savePluginList(); - }); - return; - } - m_PluginList.saveTo(m_CurrentProfile->getLockedOrderFileName()); - m_PluginList.saveLoadOrder(*m_DirectoryStructure); + onNextRefresh( + [this]() { + m_PluginList.saveTo(m_CurrentProfile->getLockedOrderFileName()); + m_PluginList.saveLoadOrder(*m_DirectoryStructure); + }, + RefreshCallbackGroup::CORE, RefreshCallbackMode::RUN_NOW_IF_POSSIBLE); } void OrganizerCore::saveCurrentProfile() @@ -1920,7 +1915,8 @@ ProcessRunner OrganizerCore::processRunner() } bool OrganizerCore::beforeRun( - const QFileInfo& binary, const QString& profileName, const QString& customOverwrite, + const QFileInfo& binary, const QDir& cwd, const QString& arguments, + const QString& profileName, const QString& customOverwrite, const QList<MOBase::ExecutableForcedLoadSetting>& forcedLibraries) { saveCurrentProfile(); @@ -1938,8 +1934,7 @@ bool OrganizerCore::beforeRun( m_CurrentProfile->writeModlistNow(true); } - // TODO: should also pass arguments - if (!m_AboutToRun(binary.absoluteFilePath())) { + if (!m_AboutToRun(binary.absoluteFilePath(), cwd, arguments)) { log::debug("start of \"{}\" cancelled by plugin", binary.absoluteFilePath()); return false; } |
