Skip to content

Commit

Permalink
Speed up load time by loading asynchronously some resources before wi…
Browse files Browse the repository at this point in the history
…ndow creation and avoiding creating some of the largest submenues in settings menu.
  • Loading branch information
SpartanJ committed Dec 23, 2024
1 parent d96a505 commit a15e461
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 91 deletions.
1 change: 1 addition & 0 deletions projects/linux/ee.includes
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@
../../src/tools/ecode
../../src/thirdparty/mojoAL/
../../src/thirdparty/pcre2/src
../../src/modules/languages-syntax-highlighting/src
/usr/include/freetype2/
2 changes: 1 addition & 1 deletion src/eepp/ui/doc/syntaxdefinitionmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ SINGLETON_DECLARE_IMPLEMENTATION( SyntaxDefinitionManager )
SyntaxDefinitionManager*
SyntaxDefinitionManager::createSingleton( std::size_t reserveSpaceForLanguages ) {
if ( NULL == ms_singleton ) {
ms_singleton = eeNew( SyntaxDefinitionManager, () );
ms_singleton = eeNew( SyntaxDefinitionManager, ( reserveSpaceForLanguages ) );
}

return ms_singleton;
Expand Down
168 changes: 91 additions & 77 deletions src/tools/ecode/ecode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1727,51 +1727,50 @@ std::map<KeyBindings::Shortcut, std::string> App::getDefaultKeybindings() {
std::map<KeyBindings::Shortcut, std::string> App::getLocalKeybindings() {
return {
{ { KEY_RETURN, KEYMOD_LALT | KEYMOD_LCTRL }, "fullscreen-toggle" },
{ { KEY_F3, KEYMOD_NONE }, "repeat-find" }, { { KEY_F3, KEYMOD_SHIFT }, "find-prev" },
{ { KEY_F12, KEYMOD_NONE }, "console-toggle" },
{ { KEY_F, KeyMod::getDefaultModifier() }, "find-replace" },
{ { KEY_Q, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "close-app" },
{ { KEY_O, KeyMod::getDefaultModifier() }, "open-file" },
{ { KEY_W, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "download-file-web" },
{ { KEY_O, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-folder" },
{ { KEY_F11, KEYMOD_NONE }, "debug-widget-tree-view" },
{ { KEY_K, KeyMod::getDefaultModifier() }, "open-locatebar" },
{ { KEY_P, KeyMod::getDefaultModifier() }, "open-command-palette" },
{ { KEY_F, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-global-search" },
{ { KEY_L, KeyMod::getDefaultModifier() }, "go-to-line" },
{ { KEY_F3, KEYMOD_NONE }, "repeat-find" },
{ { KEY_F3, KEYMOD_SHIFT }, "find-prev" },
{ { KEY_F12, KEYMOD_NONE }, "console-toggle" },
{ { KEY_F, KeyMod::getDefaultModifier() }, "find-replace" },
{ { KEY_Q, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "close-app" },
{ { KEY_O, KeyMod::getDefaultModifier() }, "open-file" },
{ { KEY_W, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "download-file-web" },
{ { KEY_O, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-folder" },
{ { KEY_F11, KEYMOD_NONE }, "debug-widget-tree-view" },
{ { KEY_K, KeyMod::getDefaultModifier() }, "open-locatebar" },
{ { KEY_P, KeyMod::getDefaultModifier() }, "open-command-palette" },
{ { KEY_F, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-global-search" },
{ { KEY_L, KeyMod::getDefaultModifier() }, "go-to-line" },
#if EE_PLATFORM == EE_PLATFORM_MACOS
{ { KEY_M, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "menu-toggle" },
{ { KEY_M, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "menu-toggle" },
#else
{ { KEY_M, KeyMod::getDefaultModifier() }, "menu-toggle" },
{ { KEY_M, KeyMod::getDefaultModifier() }, "menu-toggle" },
#endif
{ { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "save-all" },
{ { KEY_F9, KEYMOD_LALT }, "switch-side-panel" },
{ { KEY_J, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-left" },
{ { KEY_L, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-right" },
{ { KEY_I, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-top" },
{ { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-bottom" },
{ { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-swap" },
{ { KEY_T, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"reopen-closed-tab" },
{ { KEY_1, KEYMOD_LALT }, "toggle-status-locate-bar" },
{ { KEY_2, KEYMOD_LALT }, "toggle-status-global-search-bar" },
{ { KEY_3, KEYMOD_LALT }, "toggle-status-terminal" },
{ { KEY_4, KEYMOD_LALT }, "toggle-status-build-output" },
{ { KEY_5, KEYMOD_LALT }, "toggle-status-app-output" },
{ { KEY_B, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-start" },
{ { KEY_C, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-cancel" },
{ { KEY_F5, KEYMOD_NONE }, "project-build-and-run" },
{ { KEY_O, KEYMOD_LALT | KEYMOD_SHIFT }, "show-open-documents" },
{ { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_SHIFT },
"open-workspace-symbol-search" },
{ { KEY_P, KeyMod::getDefaultModifier() | KEYMOD_SHIFT },
"open-document-symbol-search" },
{ { KEY_N, KEYMOD_SHIFT | KEYMOD_LALT }, "create-new-window" },
{ { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "save-all" },
{ { KEY_F9, KEYMOD_LALT }, "switch-side-panel" },
{ { KEY_J, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-left" },
{ { KEY_L, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-right" },
{ { KEY_I, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-top" },
{ { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-bottom" },
{ { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"terminal-split-swap" },
{ { KEY_T, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT },
"reopen-closed-tab" },
{ { KEY_1, KEYMOD_LALT }, "toggle-status-locate-bar" },
{ { KEY_2, KEYMOD_LALT }, "toggle-status-global-search-bar" },
{ { KEY_3, KEYMOD_LALT }, "toggle-status-terminal" },
{ { KEY_4, KEYMOD_LALT }, "toggle-status-build-output" },
{ { KEY_5, KEYMOD_LALT }, "toggle-status-app-output" },
{ { KEY_B, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-start" },
{ { KEY_C, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-cancel" },
{ { KEY_F5, KEYMOD_NONE }, "project-build-and-run" },
{ { KEY_O, KEYMOD_LALT | KEYMOD_SHIFT }, "show-open-documents" },
{ { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-workspace-symbol-search" },
{ { KEY_P, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-document-symbol-search" },
{ { KEY_N, KEYMOD_SHIFT | KEYMOD_LALT }, "create-new-window" },
};
}

Expand All @@ -1780,15 +1779,15 @@ std::map<KeyBindings::Shortcut, std::string> App::getLocalKeybindings() {
std::map<std::string, std::string> App::getMigrateKeybindings() {
return {
{ "fullscreen-toggle", "alt+return" }, { "switch-to-tab-1", "alt+1" },
{ "switch-to-tab-2", "alt+2" }, { "switch-to-tab-3", "alt+3" },
{ "switch-to-tab-4", "alt+4" }, { "switch-to-tab-5", "alt+5" },
{ "switch-to-tab-6", "alt+6" }, { "switch-to-tab-7", "alt+7" },
{ "switch-to-tab-8", "alt+8" }, { "switch-to-tab-9", "alt+9" },
{ "switch-to-last-tab", "alt+0" },
{ "switch-to-tab-2", "alt+2" }, { "switch-to-tab-3", "alt+3" },
{ "switch-to-tab-4", "alt+4" }, { "switch-to-tab-5", "alt+5" },
{ "switch-to-tab-6", "alt+6" }, { "switch-to-tab-7", "alt+7" },
{ "switch-to-tab-8", "alt+8" }, { "switch-to-tab-9", "alt+9" },
{ "switch-to-last-tab", "alt+0" },
#if EE_PLATFORM == EE_PLATFORM_MACOS
{ "menu-toggle", "mod+shift+m" },
{ "menu-toggle", "mod+shift+m" },
#endif
{ "lock-toggle", "mod+shift+l" },
{ "lock-toggle", "mod+shift+l" },
};
}

Expand Down Expand Up @@ -3402,6 +3401,44 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe

mConfig.context.SharedGLContext = true;

mThreadPool->run( [this] {
// Load language definitions
Clock defClock;
SyntaxDefinitionManager::createSingleton( 104 );
Language::LanguagesSyntaxHighlighting::load();
SyntaxDefinitionManager::instance()->setLanguageExtensionsPriority(
mConfig.languagesExtensions.priorities );
Log::info( "Syntax definitions loaded in %s.",
defClock.getElapsedTimeAndReset().toString() );

// Load user defined languages definitions
Clock customLangsClock;
SyntaxDefinitionManager::instance()->loadFromFolder( mLanguagesPath );
Log::info( "SyntaxDefinitionManager loaded custom languages in: %s.",
customLangsClock.getElapsedTime().toString() );

// Load editor color schemes
mColorSchemes =
( SyntaxColorScheme::loadFromFile( mResPath + "colorschemes/colorschemes.conf" ) );
if ( FileSystem::isDirectory( mColorSchemesPath ) ) {
auto colorSchemesFiles = FileSystem::filesGetInPath( mColorSchemesPath );
for ( const auto& curFile : colorSchemesFiles ) {
auto colorSchemesInFile =
SyntaxColorScheme::loadFromFile( mColorSchemesPath + curFile );
for ( auto& colorScheme : colorSchemesInFile )
mColorSchemes.emplace_back( colorScheme );
}
} else {
FileSystem::makeDir( mColorSchemesPath, true );
}

// Load terminal color schemes
mTerminalManager->loadTerminalColorSchemes();

mAsyncResourcesLoaded = true;
mAsyncResourcesLoadCond.notify_all();
} );

mWindow = engine->createWindow( winSettings, mConfig.context );
Log::info( "%s (codename: \"%s\") initializing", ecode::Version::getVersionFullName(),
ecode::Version::getCodename() );
Expand Down Expand Up @@ -3657,14 +3694,6 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe
mMenuIconSize = mConfig.ui.fontSize.asPixels( 0, Sizef(), mDisplayDPI );
IconManager::init( mUISceneNode, iconFont, mimeIconFont, codIconFont );

Clock defClock;
SyntaxDefinitionManager::createSingleton( 104 );
Language::LanguagesSyntaxHighlighting::load();
SyntaxDefinitionManager::instance()->setLanguageExtensionsPriority(
mConfig.languagesExtensions.priorities );
Log::info( "Syntax definitions loaded in %.2f ms.",
defClock.getElapsedTimeAndReset().asMilliseconds() );

UIWidgetCreator::registerWidget( "searchbar", UISearchBar::New );
UIWidgetCreator::registerWidget( "locatebar", UILocateBar::New );
UIWidgetCreator::registerWidget( "globalsearchbar", UIGlobalSearchBar::New );
Expand Down Expand Up @@ -3695,28 +3724,13 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe
if ( !mConfig.ui.showSidePanel )
showSidePanel( mConfig.ui.showSidePanel );

auto colorSchemes(
SyntaxColorScheme::loadFromFile( mResPath + "colorschemes/colorschemes.conf" ) );
if ( FileSystem::isDirectory( mColorSchemesPath ) ) {
auto colorSchemesFiles = FileSystem::filesGetInPath( mColorSchemesPath );
for ( const auto& curFile : colorSchemesFiles ) {
auto colorSchemesInFile =
SyntaxColorScheme::loadFromFile( mColorSchemesPath + curFile );
for ( auto& coloScheme : colorSchemesInFile )
colorSchemes.emplace_back( coloScheme );
}
} else {
FileSystem::makeDir( mColorSchemesPath, true );
if ( !mAsyncResourcesLoaded ) {
std::unique_lock<std::mutex> syntaxLanguagesLock( mAsyncResourcesLoadMutex );
mAsyncResourcesLoadCond.wait( syntaxLanguagesLock,
[this]() { return mAsyncResourcesLoaded; } );
}

Clock customLangsClock;
SyntaxDefinitionManager::instance()->loadFromFolder( mLanguagesPath );
Log::info( "SyntaxDefinitionManager loaded custom languages in: %.2f ms",
customLangsClock.getElapsedTime().asMilliseconds() );

mTerminalManager->loadTerminalColorSchemes();

mSplitter = UICodeEditorSplitter::New( this, mUISceneNode, mThreadPool, colorSchemes,
mSplitter = UICodeEditorSplitter::New( this, mUISceneNode, mThreadPool, mColorSchemes,
mInitColorScheme );
mSplitter->setHideTabBarOnSingleTab( mConfig.editor.hideTabBarOnSingleTab );
mSplitter->setOnTabWidgetCreateCb( [this]( UITabWidget* tabWidget ) {
Expand Down
4 changes: 4 additions & 0 deletions src/tools/ecode/ecode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,10 @@ class App : public UICodeEditorSplitter::Client {
std::unique_ptr<SettingsActions> mSettingsActions;
std::vector<std::string> mPathsToLoad;
Uint64 mIpcListenerId{ 0 };
std::mutex mAsyncResourcesLoadMutex;
std::condition_variable mAsyncResourcesLoadCond;
std::vector<SyntaxColorScheme> mColorSchemes;
bool mAsyncResourcesLoaded{ false };

void saveAllProcess();

Expand Down
22 changes: 14 additions & 8 deletions src/tools/ecode/settingsmenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,8 @@ void SettingsMenu::createSettingsMenu( App* app, UIMenuBar* menuBar ) {
Log::info( "Settings Menu took: %s", clock.getElapsedTime().toString() );
}

UIMenu* SettingsMenu::createFileTypeMenu() {
mFileTypeMenuesCreatedWithHeight = mUISceneNode->getPixelsSize().getHeight();
UIMenu* SettingsMenu::createFileTypeMenu( bool emptyMenu ) {
mFileTypeMenuesCreatedWithHeight = emptyMenu ? 0 : mUISceneNode->getPixelsSize().getHeight();
size_t maxItems = 19;
auto* dM = SyntaxDefinitionManager::instance();
auto names = dM->getLanguageNames();
Expand All @@ -223,6 +223,9 @@ UIMenu* SettingsMenu::createFileTypeMenu() {
mFileTypeMenues.push_back( menu );
size_t total = 0;

if ( emptyMenu )
return mFileTypeMenues[0];

for ( const auto& name : names ) {
menu->addRadioButton(
name, mSplitter->curEditorExistsAndFocused() &&
Expand All @@ -249,8 +252,8 @@ UIMenu* SettingsMenu::createFileTypeMenu() {
return mFileTypeMenues[0];
}

UIMenu* SettingsMenu::createColorSchemeMenu() {
mColorSchemeMenuesCreatedWithHeight = mUISceneNode->getPixelsSize().getHeight();
UIMenu* SettingsMenu::createColorSchemeMenu( bool emptyMenu ) {
mColorSchemeMenuesCreatedWithHeight = emptyMenu ? 0 : mUISceneNode->getPixelsSize().getHeight();
size_t maxItems = 19;
auto cb = [this]( const Event* event ) {
UIMenuItem* item = event->getNode()->asType<UIMenuItem>();
Expand All @@ -264,6 +267,9 @@ UIMenu* SettingsMenu::createColorSchemeMenu() {
size_t total = 0;
const auto& colorSchemes = mSplitter->getColorSchemes();

if ( emptyMenu )
return mColorSchemeMenues[0];

for ( auto& colorScheme : colorSchemes ) {
menu->addRadioButton( colorScheme.first,
mSplitter->getCurrentColorSchemeName() == colorScheme.first );
Expand Down Expand Up @@ -305,7 +311,7 @@ UIMenu* SettingsMenu::createDocumentMenu() {
->setId( "auto_indent_cur" );

UIMenuSubMenu* fileTypeMenu = mDocMenu->addSubMenu(
i18n( "file_type", "File Type" ), findIcon( "file-code" ), createFileTypeMenu() );
i18n( "file_type", "File Type" ), findIcon( "file-code" ), createFileTypeMenu( true ) );

fileTypeMenu->on( Event::OnMenuShow, [this, fileTypeMenu]( const Event* ) {
if ( mFileTypeMenuesCreatedWithHeight != mUISceneNode->getPixelsSize().getHeight() ) {
Expand Down Expand Up @@ -468,7 +474,7 @@ UIMenu* SettingsMenu::createDocumentMenu() {

UIMenuSubMenu* colorSchemeMenu =
mDocMenu->addSubMenu( i18n( "syntax_color_scheme", "Syntax Color Scheme" ),
findIcon( "palette" ), createColorSchemeMenu() );
findIcon( "palette" ), createColorSchemeMenu( true ) );
colorSchemeMenu->on( Event::OnMenuShow, [this, colorSchemeMenu]( const Event* ) {
if ( mColorSchemeMenuesCreatedWithHeight != mUISceneNode->getPixelsSize().getHeight() ) {
for ( UIPopUpMenu* menu : mColorSchemeMenues )
Expand Down Expand Up @@ -912,7 +918,7 @@ UIMenu* SettingsMenu::createTerminalMenu() {
#if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN
UIMenuSubMenu* termColorSchemeMenu = mTerminalMenu->addSubMenu(
i18n( "terminal_color_scheme", "Terminal Color Scheme" ), findIcon( "palette" ),
mApp->getTerminalManager()->createColorSchemeMenu() );
mApp->getTerminalManager()->createColorSchemeMenu( true ) );
termColorSchemeMenu->on( Event::OnMenuShow, [this, termColorSchemeMenu]( const Event* ) {
mApp->getTerminalManager()->updateMenuColorScheme( termColorSchemeMenu );
} );
Expand Down Expand Up @@ -1058,7 +1064,7 @@ UIMenu* SettingsMenu::createWindowMenu() {
colorsMenu
->addRadioButton( i18n( "light", "Light" ),
mApp->getUIColorScheme() == ColorSchemePreference::Light )
->setOnShouldCloseCb( shouldCloseCb )
->setOnShouldCloseCb( shouldCloseCb )
->setId( "light" );
colorsMenu
->addRadioButton( i18n( "dark", "Dark" ),
Expand Down
4 changes: 2 additions & 2 deletions src/tools/ecode/settingsmenu.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ class SettingsMenu {

void runCommand( const std::string& command );

UIMenu* createFileTypeMenu();
UIMenu* createFileTypeMenu( bool emptyMenu = false );

UIMenu* createColorSchemeMenu();
UIMenu* createColorSchemeMenu( bool emptyMenu = false );

UIMenu* createDocumentMenu();

Expand Down
8 changes: 6 additions & 2 deletions src/tools/ecode/terminalmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,9 @@ void TerminalManager::configureTerminalScrollback() {
} );
}

UIMenu* TerminalManager::createColorSchemeMenu() {
mColorSchemeMenuesCreatedWithHeight = mApp->uiSceneNode()->getPixelsSize().getHeight();
UIMenu* TerminalManager::createColorSchemeMenu( bool emptyMenu ) {
mColorSchemeMenuesCreatedWithHeight =
emptyMenu ? 0 : mApp->uiSceneNode()->getPixelsSize().getHeight();
size_t maxItems = 19;
auto cb = [this]( const Event* event ) {
UIMenuItem* item = event->getNode()->asType<UIMenuItem>();
Expand All @@ -256,6 +257,9 @@ UIMenu* TerminalManager::createColorSchemeMenu() {
size_t total = 0;
const auto& colorSchemes = mTerminalColorSchemes;

if ( emptyMenu )
return mColorSchemeMenues[0];

for ( auto& colorScheme : colorSchemes ) {
menu->addRadioButton( colorScheme.first, mTerminalCurrentColorScheme == colorScheme.first );

Expand Down
2 changes: 1 addition & 1 deletion src/tools/ecode/terminalmanager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class TerminalManager {

void setTerminalColorSchemesPath( const std::string& terminalColorSchemesPath );

UIMenu* createColorSchemeMenu();
UIMenu* createColorSchemeMenu( bool emptyMenu = false );

void updateMenuColorScheme( UIMenuSubMenu* colorSchemeMenu );

Expand Down

0 comments on commit a15e461

Please sign in to comment.