diff --git a/include/imainframe.h b/include/imainframe.h index ebcffd53da..ba8a09f35f 100644 --- a/include/imainframe.h +++ b/include/imainframe.h @@ -117,6 +117,14 @@ class IMainFrame : * automatically removed by this class. */ virtual sigc::signal& signal_MainFrameConstructed() = 0; + + /** + * Signal fired after the MainFrame window is shown the first time + * during application start up. + * This is a one-time signal, after emission the subscribers will be + * automatically removed by this class. + */ + virtual sigc::signal& signal_MainFrameReady() = 0; }; // This is the accessor for the mainframe module diff --git a/radiant/RadiantModule.cpp b/radiant/RadiantModule.cpp index 39db0519db..2291cf1b12 100644 --- a/radiant/RadiantModule.cpp +++ b/radiant/RadiantModule.cpp @@ -1,18 +1,9 @@ #include "RadiantModule.h" -#include #include - -#include "iregistry.h" -#include "icommandsystem.h" #include "itextstream.h" -#include "iuimanager.h" -#include "ieventmanager.h" -#include "i18n.h" -#include "imainframe.h" #include "scene/Node.h" - #include "module/StaticModule.h" namespace radiant @@ -75,18 +66,11 @@ void RadiantModule::shutdownModule() void RadiantModule::postModuleInitialisation() { - // Initialise the mainframe - GlobalMainFrame().construct(); - - // Broadcast the startup event + rMessage() << "All modules initialised, radiant started" << std::endl; + + // Broadcast the startup event broadcastStartupEvent(); - // Load the shortcuts from the registry - GlobalEventManager().loadAccelerators(); - - // Show the top level window as late as possible - GlobalMainFrame().getWxTopLevelWindow()->Show(); - time_t localtime; time(&localtime); rMessage() << "Startup complete at " << ctime(&localtime) << std::endl; diff --git a/radiant/map/StartupMapLoader.cpp b/radiant/map/StartupMapLoader.cpp index 4e8c158a04..ea19f48625 100644 --- a/radiant/map/StartupMapLoader.cpp +++ b/radiant/map/StartupMapLoader.cpp @@ -6,8 +6,9 @@ #include "irender.h" #include "iregistry.h" #include "icommandsystem.h" +#include "itextstream.h" #include "igame.h" -#include "iradiant.h" +#include "imainframe.h" #include "imru.h" #include "module/StaticModule.h" @@ -18,7 +19,7 @@ namespace map { -void StartupMapLoader::onRadiantStartup() +void StartupMapLoader::onMainFrameReady() { std::string mapToLoad = ""; @@ -99,7 +100,7 @@ const StringSet& StartupMapLoader::getDependencies() const if (_dependencies.empty()) { - _dependencies.insert(MODULE_RADIANT_APP); + _dependencies.insert(MODULE_MAINFRAME); } return _dependencies; @@ -109,8 +110,8 @@ void StartupMapLoader::initialiseModule(const IApplicationContext& ctx) { rMessage() << getName() << "::initialiseModule called." << std::endl; - GlobalRadiant().signal_radiantStarted().connect( - sigc::mem_fun(*this, &StartupMapLoader::onRadiantStartup) + GlobalMainFrame().signal_MainFrameReady().connect( + sigc::mem_fun(*this, &StartupMapLoader::onMainFrameReady) ); } diff --git a/radiant/map/StartupMapLoader.h b/radiant/map/StartupMapLoader.h index 2c217bbb0a..ea6d8081c8 100644 --- a/radiant/map/StartupMapLoader.h +++ b/radiant/map/StartupMapLoader.h @@ -16,8 +16,8 @@ class StartupMapLoader : void initialiseModule(const IApplicationContext& ctx) override; private: - // This gets called as soon as the mainframe starts up - void onRadiantStartup(); + // This gets called as soon as the mainframe is shown + void onMainFrameReady(); void loadMapSafe(const std::string& map); }; diff --git a/radiant/ui/mainframe/MainFrame.cpp b/radiant/ui/mainframe/MainFrame.cpp index fd6eb806a2..fe9ba8c0e1 100644 --- a/radiant/ui/mainframe/MainFrame.cpp +++ b/radiant/ui/mainframe/MainFrame.cpp @@ -10,6 +10,7 @@ #include "ientityinspector.h" #include "iorthoview.h" #include "iregistry.h" +#include "iradiant.h" #include "log/Console.h" #include "xyview/GlobalXYWnd.h" @@ -73,6 +74,7 @@ const StringSet& MainFrame::getDependencies() const _dependencies.insert(MODULE_ORTHOVIEWMANAGER); _dependencies.insert(MODULE_CAMERA); _dependencies.insert(MODULE_MAP); + _dependencies.insert(MODULE_RADIANT_APP); } return _dependencies; @@ -146,6 +148,9 @@ void MainFrame::initialiseModule(const IApplicationContext& ctx) _mapModifiedChangedConn = GlobalMapModule().signal_modifiedChanged().connect( sigc::mem_fun(this, &MainFrame::updateTitle) ); + + GlobalRadiant().signal_radiantStarted().connect( + sigc::mem_fun(this, &MainFrame::onRadiantStarted)); } void MainFrame::shutdownModule() @@ -168,6 +173,21 @@ void MainFrame::exitCmd(const cmd::ArgumentList& args) } } +void MainFrame::onRadiantStarted() +{ + // Initialise the mainframe + construct(); + + // Load the shortcuts from the registry + GlobalEventManager().loadAccelerators(); + + // Show the top level window as late as possible + getWxTopLevelWindow()->Show(); + + signal_MainFrameReady().emit(); + signal_MainFrameReady().clear(); +} + void MainFrame::keyChanged() { #ifdef WIN32 @@ -540,6 +560,11 @@ sigc::signal& MainFrame::signal_MainFrameConstructed() return _sigMainFrameConstructed; } +sigc::signal& MainFrame::signal_MainFrameReady() +{ + return _sigMainFrameReady; +} + // Define the static MainFrame module module::StaticModule mainFrameModule; diff --git a/radiant/ui/mainframe/MainFrame.h b/radiant/ui/mainframe/MainFrame.h index 5f9b71b623..5762dabfd0 100644 --- a/radiant/ui/mainframe/MainFrame.h +++ b/radiant/ui/mainframe/MainFrame.h @@ -29,6 +29,7 @@ class MainFrame : sigc::connection _mapModifiedChangedConn; sigc::signal _sigMainFrameConstructed; + sigc::signal _sigMainFrameReady; private: void keyChanged(); @@ -62,6 +63,7 @@ class MainFrame : const std::string& message, bool forceDisplay = false) override; sigc::signal& signal_MainFrameConstructed() override; + sigc::signal& signal_MainFrameReady() override; // Command to toggle the current layout's camera fullscreen mode void toggleFullscreenCameraView(const cmd::ArgumentList& args); @@ -86,6 +88,9 @@ class MainFrame : // Creates the topmost application window void createTopLevelWindow(); + // Constructs the MainFrame and shows the Window + void onRadiantStarted(); + #ifdef WIN32 // Enables or disabled desktop composition, Windows-specific void setDesktopCompositionEnabled(bool enabled); diff --git a/radiantcore/map/Map.cpp b/radiantcore/map/Map.cpp index 3e1c2d39d3..a8fe4bada1 100644 --- a/radiantcore/map/Map.cpp +++ b/radiantcore/map/Map.cpp @@ -66,6 +66,7 @@ namespace Map::Map() : _lastCopyMapName(""), + _modified(false), _saveInProgress(false), _shutdownListener(0) {} @@ -217,14 +218,14 @@ void Map::freeMap() bool Map::isModified() const { - return m_modified; + return _modified; } void Map::setModified(bool modifiedFlag) { - if (m_modified != modifiedFlag) + if (_modified != modifiedFlag) { - m_modified = modifiedFlag; + _modified = modifiedFlag; // when the map is modified, let the listeners now signal_modifiedChanged().emit(); diff --git a/radiantcore/map/Map.h b/radiantcore/map/Map.h index 8c815f563f..b3d31bfd18 100644 --- a/radiantcore/map/Map.h +++ b/radiantcore/map/Map.h @@ -42,7 +42,7 @@ class Map : // Pointer to the resource for this map IMapResourcePtr _resource; - bool m_modified; + bool _modified; scene::INodePtr _worldSpawnNode; // "classname" "worldspawn" !