forked from qt-creator/qt-creator
ProjectExplorer: Separate KitAspectFactory storage from live kits
Change-Id: Ic4d4f4938a11e209c31dcba73d1a793d359fe135 Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
@@ -66,15 +66,9 @@ static FilePath settingsFileName()
|
|||||||
// KitManagerPrivate:
|
// KitManagerPrivate:
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
class KitManagerPrivate
|
class KitAspectFactories
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Kit *m_defaultKit = nullptr;
|
|
||||||
bool m_initialized = false;
|
|
||||||
std::vector<std::unique_ptr<Kit>> m_kitList;
|
|
||||||
std::unique_ptr<PersistentSettingsWriter> m_writer;
|
|
||||||
QSet<Id> m_irrelevantAspects;
|
|
||||||
|
|
||||||
void addKitAspect(KitAspectFactory *factory)
|
void addKitAspect(KitAspectFactory *factory)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(!m_aspectList.contains(factory), return);
|
QTC_ASSERT(!m_aspectList.contains(factory), return);
|
||||||
@@ -99,15 +93,31 @@ public:
|
|||||||
return m_aspectList;
|
return m_aspectList;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBinaryForKit(const FilePath &fp) { m_binaryForKit = fp; }
|
|
||||||
FilePath binaryForKit() const { return m_binaryForKit; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Sorted by priority, in descending order...
|
// Sorted by priority, in descending order...
|
||||||
QList<KitAspectFactory *> m_aspectList;
|
QList<KitAspectFactory *> m_aspectList;
|
||||||
// ... if this here is set:
|
// ... if this here is set:
|
||||||
bool m_aspectListIsSorted = true;
|
bool m_aspectListIsSorted = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
static KitAspectFactories &kitAspectFactoriesStorage()
|
||||||
|
{
|
||||||
|
static KitAspectFactories theKitAspectFactories;
|
||||||
|
return theKitAspectFactories;
|
||||||
|
}
|
||||||
|
|
||||||
|
class KitManagerPrivate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Kit *m_defaultKit = nullptr;
|
||||||
|
bool m_initialized = false;
|
||||||
|
std::vector<std::unique_ptr<Kit>> m_kitList;
|
||||||
|
std::unique_ptr<PersistentSettingsWriter> m_writer;
|
||||||
|
QSet<Id> m_irrelevantAspects;
|
||||||
|
|
||||||
|
void setBinaryForKit(const FilePath &fp) { m_binaryForKit = fp; }
|
||||||
|
FilePath binaryForKit() const { return m_binaryForKit; }
|
||||||
|
|
||||||
|
private:
|
||||||
FilePath m_binaryForKit;
|
FilePath m_binaryForKit;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -450,29 +460,6 @@ bool KitManager::isLoaded()
|
|||||||
return d->m_initialized;
|
return d->m_initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KitManager::registerKitAspect(KitAspectFactory *factory)
|
|
||||||
{
|
|
||||||
instance();
|
|
||||||
QTC_ASSERT(d, return);
|
|
||||||
d->addKitAspect(factory);
|
|
||||||
|
|
||||||
// Adding this aspect to possibly already existing kits is currently not
|
|
||||||
// needed here as kits are only created after all aspects are created
|
|
||||||
// in *Plugin::initialize().
|
|
||||||
// Make sure we notice when this assumption breaks:
|
|
||||||
QTC_CHECK(d->m_kitList.empty());
|
|
||||||
}
|
|
||||||
|
|
||||||
void KitManager::deregisterKitAspect(KitAspectFactory *factory)
|
|
||||||
{
|
|
||||||
// Happens regularly for the aspects from the ProjectExplorerPlugin as these
|
|
||||||
// are destroyed after the manual call to KitManager::destroy() there, but as
|
|
||||||
// this here is just for sanity reasons that the KitManager does not access
|
|
||||||
// a destroyed aspect, a destroyed KitManager is not a problem.
|
|
||||||
if (d)
|
|
||||||
d->removeKitAspect(factory);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KitManager::setBinaryForKit(const FilePath &binary)
|
void KitManager::setBinaryForKit(const FilePath &binary)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(d, return);
|
QTC_ASSERT(d, return);
|
||||||
@@ -575,7 +562,7 @@ Kit *KitManager::defaultKit()
|
|||||||
|
|
||||||
const QList<KitAspectFactory *> KitManager::kitAspectFactories()
|
const QList<KitAspectFactory *> KitManager::kitAspectFactories()
|
||||||
{
|
{
|
||||||
return d->kitAspectFactories();
|
return kitAspectFactoriesStorage().m_aspectList;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QSet<Id> KitManager::irrelevantAspects()
|
const QSet<Id> KitManager::irrelevantAspects()
|
||||||
@@ -648,7 +635,7 @@ void KitManager::completeKit(Kit *k)
|
|||||||
{
|
{
|
||||||
QTC_ASSERT(k, return);
|
QTC_ASSERT(k, return);
|
||||||
KitGuard g(k);
|
KitGuard g(k);
|
||||||
for (KitAspectFactory *factory : d->kitAspectFactories()) {
|
for (KitAspectFactory *factory : kitAspectFactories()) {
|
||||||
factory->upgrade(k);
|
factory->upgrade(k);
|
||||||
if (!k->hasValue(factory->id()))
|
if (!k->hasValue(factory->id()))
|
||||||
factory->setup(k);
|
factory->setup(k);
|
||||||
@@ -663,12 +650,19 @@ void KitManager::completeKit(Kit *k)
|
|||||||
|
|
||||||
KitAspectFactory::KitAspectFactory()
|
KitAspectFactory::KitAspectFactory()
|
||||||
{
|
{
|
||||||
KitManager::registerKitAspect(this);
|
kitAspectFactoriesStorage().addKitAspect(this);
|
||||||
|
|
||||||
|
// Adding aspects created by this factory to possibly already existing kits is
|
||||||
|
// currently not needed here as kits are only created after all factories
|
||||||
|
// are created in *Plugin::initialize() or plugin load.
|
||||||
|
// Make sure we notice when this assumption breaks:
|
||||||
|
KitManager::instance(); // Ensure existence
|
||||||
|
QTC_CHECK(d->m_kitList.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
KitAspectFactory::~KitAspectFactory()
|
KitAspectFactory::~KitAspectFactory()
|
||||||
{
|
{
|
||||||
KitManager::deregisterKitAspect(this);
|
kitAspectFactoriesStorage().removeKitAspect(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int KitAspectFactory::weight(const Kit *k) const
|
int KitAspectFactory::weight(const Kit *k) const
|
||||||
|
|||||||
@@ -173,9 +173,6 @@ private:
|
|||||||
|
|
||||||
static void destroy();
|
static void destroy();
|
||||||
|
|
||||||
static void registerKitAspect(KitAspectFactory *ki);
|
|
||||||
static void deregisterKitAspect(KitAspectFactory *ki);
|
|
||||||
|
|
||||||
static void setBinaryForKit(const Utils::FilePath &binary);
|
static void setBinaryForKit(const Utils::FilePath &binary);
|
||||||
|
|
||||||
// Make sure the this is only called after all
|
// Make sure the this is only called after all
|
||||||
@@ -188,7 +185,6 @@ private:
|
|||||||
friend class ProjectExplorerPlugin; // for constructor
|
friend class ProjectExplorerPlugin; // for constructor
|
||||||
friend class Kit;
|
friend class Kit;
|
||||||
friend class Internal::KitManagerConfigWidget;
|
friend class Internal::KitManagerConfigWidget;
|
||||||
friend class KitAspectFactory; // for notifyAboutUpdate and self-registration
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|||||||
Reference in New Issue
Block a user