Skip to content

Commit

Permalink
Remove UI code from ModuleRegistry, provide a signal instead
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 31, 2017
1 parent ebc3389 commit 7eb2244
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 33 deletions.
15 changes: 12 additions & 3 deletions include/imodule.h
Original file line number Diff line number Diff line change
Expand Up @@ -244,9 +244,9 @@ class ModuleObserver
*
* \ingroup module
*/
class IModuleRegistry {
class IModuleRegistry
{
public:

/**
* Destructor
*/
Expand All @@ -266,7 +266,7 @@ class IModuleRegistry {
* is invoked once, at application startup, with any subsequent attempts
* to invoke this method throwing a logic_error.
*/
virtual void initialiseModules() = 0;
virtual void loadAndInitialiseModules() = 0;

/**
* All the RegisterableModule::shutdownModule() routines are getting
Expand Down Expand Up @@ -308,6 +308,15 @@ class IModuleRegistry {
*/
virtual sigc::signal<void> signal_allModulesInitialised() const = 0;

/**
* Progress function called during module loading and intialisation.
* The string value will carry a message about what is currently in progress.
* The float value passed to the signal indicates the overall progress and
* will be in the range [0.0f..1.0f].
*/
typedef sigc::signal<void, const std::string&, float> ProgressSignal;
virtual ProgressSignal signal_moduleInitialisationProgress() const = 0;

/**
* Invoked when all modules have been shut down (i.e. after shutdownModule()).
*/
Expand Down
13 changes: 10 additions & 3 deletions radiant/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include "log/LogStream.h"
#include "modulesystem/ModuleRegistry.h"
#include "modulesystem/ApplicationContextImpl.h"
#include "ui/Splash/Splash.h"
#include <sigc++/functors/mem_fun.h>

#ifndef POSIX
#include "settings/LanguageManager.h"
Expand Down Expand Up @@ -139,9 +141,14 @@ class RadiantApp : public wxApp
// (emits a warning if the file already exists (due to a previous startup failure))
applog::PIDFile pidFile(PID_FILENAME);

module::ModuleRegistry::Instance().loadModules();

module::ModuleRegistry::Instance().initialiseModules();
#ifndef __linux__
// We skip the splash screen in Linux, but the other platforms will show a progress bar
// Connect the progress callback to the Splash instance.
module::ModuleRegistry::Instance().signal_moduleInitialisationProgress().connect(
sigc::mem_fun(ui::Splash::Instance(), &ui::Splash::setProgressAndText));
#endif

module::ModuleRegistry::Instance().loadAndInitialiseModules();

// Scope ends here, PIDFile is deleted by its destructor
}
Expand Down
44 changes: 22 additions & 22 deletions radiant/modulesystem/ModuleRegistry.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#include "ModuleRegistry.h"

#include "ui/splash/Splash.h"

#include "i18n.h"
#include "itextstream.h"
#include <stdexcept>
Expand Down Expand Up @@ -35,22 +33,6 @@ ModuleRegistry::~ModuleRegistry()
unloadModules();
}

void ModuleRegistry::loadModules()
{
ui::Splash::Instance().setProgressAndText(_("Searching for Modules"), 0.0f);

rMessage() << "ModuleRegistry Compatibility Level is " << getCompatibilityLevel() << std::endl;

// Invoke the ModuleLoad routine to load the DLLs from modules/ and plugins/
#if defined(POSIX) && defined(PKGLIBDIR)
// Load modules from compiled-in path (e.g. /usr/lib/darkradiant)
_loader.loadModules(PKGLIBDIR);
#else
// Load modules from application-relative path
_loader.loadModules(_context->getApplicationPath());
#endif
}

void ModuleRegistry::unloadModules()
{
_uninitialisedModules.clear();
Expand Down Expand Up @@ -146,7 +128,7 @@ void ModuleRegistry::initialiseModuleRecursive(const std::string& name)

_progress = 0.1f + (static_cast<float>(_initialisedModules.size())/_uninitialisedModules.size())*0.9f;

ui::Splash::Instance().setProgressAndText(
_sigModuleInitialisationProgress.emit(
(boost::format(_("Initialising Module: %s")) % name).str(),
_progress);

Expand All @@ -156,15 +138,28 @@ void ModuleRegistry::initialiseModuleRecursive(const std::string& name)
}

// Initialise all registered modules
void ModuleRegistry::initialiseModules()
void ModuleRegistry::loadAndInitialiseModules()
{
if (_modulesInitialised)
{
throw std::runtime_error("ModuleRegistry::initialiseModule called twice.");
}

_sigModuleInitialisationProgress.emit(_("Searching for Modules"), 0.0f);

rMessage() << "ModuleRegistry Compatibility Level is " << getCompatibilityLevel() << std::endl;

// Invoke the ModuleLoad routine to load the DLLs from modules/ and plugins/
#if defined(POSIX) && defined(PKGLIBDIR)
// Load modules from compiled-in path (e.g. /usr/lib/darkradiant)
_loader.loadModules(PKGLIBDIR);
#else
// Load modules from application-relative path
_loader.loadModules(_context->getApplicationPath());
#endif

_progress = 0.1f;
ui::Splash::Instance().setProgressAndText(_("Initialising Modules"), _progress);
_sigModuleInitialisationProgress.emit(_("Initialising Modules"), _progress);

for (ModulesMap::iterator i = _uninitialisedModules.begin();
i != _uninitialisedModules.end(); ++i)
Expand All @@ -178,7 +173,7 @@ void ModuleRegistry::initialiseModules()
_modulesInitialised = true;

_progress = 1.0f;
ui::Splash::Instance().setProgressAndText(_("Modules initialised"), _progress);
_sigModuleInitialisationProgress.emit(_("Modules initialised"), _progress);

// Fire the signal now, this will destroy the Splash dialog as well
_sigAllModulesInitialised.emit();
Expand Down Expand Up @@ -245,6 +240,11 @@ sigc::signal<void> ModuleRegistry::signal_allModulesInitialised() const
return _sigAllModulesInitialised;
}

ModuleRegistry::ProgressSignal ModuleRegistry::signal_moduleInitialisationProgress() const
{
return _sigModuleInitialisationProgress;
}

sigc::signal<void> ModuleRegistry::signal_allModulesUninitialised() const
{
return _sigAllModulesUninitialised;
Expand Down
9 changes: 4 additions & 5 deletions radiant/modulesystem/ModuleRegistry.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ class ModuleRegistry :

// Signals fired after ALL modules have been initialised or shut down.
sigc::signal<void> _sigAllModulesInitialised;
sigc::signal<void> _sigAllModulesUninitialised;
sigc::signal<void> _sigAllModulesUninitialised;
ProgressSignal _sigModuleInitialisationProgress;

// Dynamic library loader
ModuleLoader _loader;
Expand All @@ -52,11 +53,8 @@ class ModuleRegistry :
// Registers the given module
void registerModule(const RegisterableModulePtr& module) override;

// Search for modules and plugins in the application's subfolders
void loadModules();

// Initialise all registered modules
void initialiseModules() override;
void loadAndInitialiseModules() override;

// Shutdown all modules
void shutdownModules() override;
Expand All @@ -71,6 +69,7 @@ class ModuleRegistry :
const ApplicationContext& getApplicationContext() const override;

sigc::signal<void> signal_allModulesInitialised() const override;
ProgressSignal signal_moduleInitialisationProgress() const override;
sigc::signal<void> signal_allModulesUninitialised() const override;

std::size_t getCompatibilityLevel() const override;
Expand Down

0 comments on commit 7eb2244

Please sign in to comment.