Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion src/organizercore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1311,6 +1311,26 @@ void OrganizerCore::refreshESPList(bool force)
RefreshCallbackGroup::CORE, RefreshCallbackMode::RUN_NOW_IF_POSSIBLE);
}

bool OrganizerCore::flushPluginList()
{
if (m_DirectoryUpdate) {
return false;
}

m_PluginListsWriter.writeImmediately(true);
return true;
}

void OrganizerCore::reloadPluginList()
{
// a write whose timer has already fired during a directory update is queued until
// the update is done, cancel() cannot stop it, see savePluginList()
m_PluginListsWriter.cancel();
++m_PluginListReloadCount;

refreshESPList(true);
}

void OrganizerCore::refreshBSAList()
{
TimeThis tt("OrganizerCore::refreshBSAList()");
Expand Down Expand Up @@ -1974,7 +1994,13 @@ bool OrganizerCore::saveCurrentLists()
void OrganizerCore::savePluginList()
{
onNextRefresh(
[this]() {
[this, reloadCount = m_PluginListReloadCount]() {
// the files were read again since this write was requested, writing the list
// as it was would overwrite them
if (reloadCount != m_PluginListReloadCount) {
return;
}

m_PluginList.saveTo(m_CurrentProfile->getLockedOrderFileName());
m_PluginList.saveLoadOrder(*m_DirectoryStructure);
},
Expand Down
12 changes: 12 additions & 0 deletions src/organizercore.h
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,14 @@ class OrganizerCore : public QObject, public MOBase::IPluginDiagnose
void refreshESPList(bool force = false);
void refreshBSAList();

// writes the plugin lists now if a write is pending; returns false during a
// directory update, since they cannot be written then
bool flushPluginList();

// reads the plugin lists again from disk, discarding the changes that have not been
// written yet
void reloadPluginList();

void refreshDirectoryStructure();
void updateModInDirectoryStructure(unsigned int index, ModInfo::Ptr modInfo);
void updateModsInDirectoryStructure(QMap<unsigned int, ModInfo::Ptr> modInfos);
Expand Down Expand Up @@ -590,6 +598,10 @@ private slots:
bool m_ArchivesInit;

MOBase::DelayedFileWriter m_PluginListsWriter;

// increased by reloadPluginList(), so that writes queued before it are skipped
unsigned int m_PluginListReloadCount = 0;

UsvfsConnector m_USVFS;

UILocker m_UILocker;
Expand Down
3 changes: 1 addition & 2 deletions src/organizerproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ OrganizerProxy::OrganizerProxy(OrganizerCore* organizer,
m_ModListProxy(std::make_unique<ModListProxy>(this, organizer->modList())),
m_ExecutablesListProxy(
std::make_unique<ExecutablesListProxy>(organizer->executablesList())),
m_PluginListProxy(
std::make_unique<PluginListProxy>(this, organizer->pluginList())),
m_PluginListProxy(std::make_unique<PluginListProxy>(this, organizer)),
m_GameFeaturesProxy(
std::make_unique<GameFeaturesProxy>(this, pluginContainer->gameFeatures()))
{}
Expand Down
15 changes: 13 additions & 2 deletions src/pluginlistproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
using namespace MOBase;
using namespace MOShared;

PluginListProxy::PluginListProxy(OrganizerProxy* oproxy, PluginList* pluginlist)
: m_OrganizerProxy(oproxy), m_Proxied(pluginlist)
PluginListProxy::PluginListProxy(OrganizerProxy* oproxy, OrganizerCore* organizer)
: m_OrganizerProxy(oproxy), m_Organizer(organizer),
m_Proxied(organizer->pluginList())
{}

PluginListProxy::~PluginListProxy()
Expand Down Expand Up @@ -153,3 +154,13 @@ QString PluginListProxy::description(const QString& name) const
{
return m_Proxied->description(name);
}

bool PluginListProxy::flush()
{
return m_Organizer->flushPluginList();
}

void PluginListProxy::reloadFromDisk()
{
m_Organizer->reloadPluginList();
}
6 changes: 5 additions & 1 deletion src/pluginlistproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class OrganizerProxy;
class PluginListProxy : public MOBase::IPluginList
{
public:
PluginListProxy(OrganizerProxy* oproxy, PluginList* pluginlist);
PluginListProxy(OrganizerProxy* oproxy, OrganizerCore* organizer);
virtual ~PluginListProxy();

QStringList pluginNames() const override;
Expand Down Expand Up @@ -42,6 +42,9 @@ class PluginListProxy : public MOBase::IPluginList
QString author(const QString& name) const override;
QString description(const QString& name) const override;

bool flush() override;
void reloadFromDisk() override;

private:
friend class OrganizerProxy;

Expand All @@ -50,6 +53,7 @@ class PluginListProxy : public MOBase::IPluginList
void disconnectSignals();

OrganizerProxy* m_OrganizerProxy;
OrganizerCore* m_Organizer;
PluginList* m_Proxied;

PluginList::SignalRefreshed m_Refreshed;
Expand Down