diff --git a/bin/assets/ui/breeze.css b/bin/assets/ui/breeze.css index c5e248e24..e07906eba 100644 --- a/bin/assets/ui/breeze.css +++ b/bin/assets/ui/breeze.css @@ -14,7 +14,6 @@ --list-back: #232629; --separator: #383a3d; --item-hover: #284150; - --scroll-button: #6b6d6f; --slider-back: #676a6e; --slider-button: #31363b; --slider-border: #787b80; @@ -31,14 +30,14 @@ --icon: #b6bbc2; --icon-active: white; --icon-back-hover: #eff0f1; - --icon-line-hover: #3d4246; --icon-back-alert: #e49aa2; + --icon-line: #dbdbdd; + --icon-line-hover: #3d4246; --menu-back: #2d3136; --menu-font: #eff0f1; --menu-border: #616569; --menu-font-active: white; --menu-font-disabled: #6e7275; - --win-icon: #dbdbdd; --floating-icon: #96999c; --term-back-color: #1e2127; --term-font-color: #abb2bf; @@ -650,7 +649,7 @@ Window::maximize { height: 12dp; border-radius: 6dp; background-color: transparent; - foreground-image: poly(line, var(--win-icon), "0dp 4dp, 4dp 0dp", 1dp), poly(line, var(--win-icon), "4dp 0dp, 8dp 4dp", 1dp); + foreground-image: poly(line, var(--icon-line), "0dp 4dp, 4dp 0dp", 1dp), poly(line, var(--icon-line), "4dp 0dp, 8dp 4dp", 1dp); foreground-position: 2dp 4dp, 2dp 4dp; transition: all 0.15s; } @@ -665,7 +664,7 @@ Window::minimize { height: 12dp; border-radius: 6dp; background-color: transparent; - foreground-image: poly(line, var(--win-icon), "0dp 0dp, 4dp 4dp", 1dp), poly(line, var(--win-icon), "4dp 4dp, 8dp 0dp", 1dp); + foreground-image: poly(line, var(--icon-line), "0dp 0dp, 4dp 4dp", 1dp), poly(line, var(--icon-line), "4dp 4dp, 8dp 0dp", 1dp); foreground-position: 2dp 4dp, 2dp 4dp; transition: all 0.15s; } @@ -1114,7 +1113,6 @@ ImageViewer > TextView { --list-back: #ffffff; --separator: #cbcdcd; --item-hover: #93cee9; - --scroll-button: #cbcdcd; --slider-back: #e9e9e9; --slider-button: #cbcdcd; --slider-border: #e6e6e6; @@ -1138,7 +1136,7 @@ ImageViewer > TextView { --menu-border: #b3b4b5; --menu-font-active: #fcfcfc; --menu-font-disabled: #a8a9aa; - --win-icon: #232627; + --icon-line: #232627; --floating-icon: #666666; --term-back-color: #eff0f1; --term-font-color: #232627; diff --git a/include/eepp/ui/doc/syntaxdefinitionmanager.hpp b/include/eepp/ui/doc/syntaxdefinitionmanager.hpp index 1a744f89d..4bbcae8a8 100644 --- a/include/eepp/ui/doc/syntaxdefinitionmanager.hpp +++ b/include/eepp/ui/doc/syntaxdefinitionmanager.hpp @@ -17,7 +17,8 @@ namespace EE { namespace UI { namespace Doc { class EE_API SyntaxDefinitionManager { SINGLETON_DECLARE_HEADERS( SyntaxDefinitionManager ) public: - using FileAssociations = std::unordered_map; + using FileAssociations = + std::unordered_map; static SyntaxDefinitionManager* createSingleton( std::size_t reserveSpaceForLanguages ); @@ -25,14 +26,13 @@ class EE_API SyntaxDefinitionManager { std::size_t count() const; - SyntaxPreDefinition& addPreDefinition( SyntaxPreDefinition&& preDefinition ); + void addPreDefinition( SyntaxPreDefinition&& preDefinition ); SyntaxDefinition& add( SyntaxDefinition&& syntaxStyle ); const SyntaxDefinition& getPlainDefinition() const; std::shared_ptr getPlainDefinitionPtr() const; - std::vector languagesThatSupportExtension( std::string extension ) const; @@ -51,6 +51,12 @@ class EE_API SyntaxDefinitionManager { const SyntaxDefinition& find( const std::string& filePath, std::string_view header, HExtLanguageType hLangType = HExtLanguageType::AutoDetect ); + std::shared_ptr getLanguageDefinition( const Uint32& index ) const; + + std::shared_ptr + findPtr( const std::string& filePath, std::string_view header, + HExtLanguageType hLangType = HExtLanguageType::AutoDetect ); + const SyntaxDefinition& findFromString( const std::string_view& str ) const; SyntaxDefinition& getByExtensionRef( const std::string& filePath ); @@ -81,10 +87,6 @@ class EE_API SyntaxDefinitionManager { void loadFromFolder( const std::string& folderPath ); - const std::vector>& getDefinitions() const; - - const std::vector& getPreDefinitions() const; - /* empty = all */ bool save( const std::string& path, const std::vector& def = {} ); @@ -100,6 +102,18 @@ class EE_API SyntaxDefinitionManager { FileAssociations getFileAssociations() const; + template void forEachDefinition( Fn cb ) { + Lock l( mMutex ); + for ( auto def : mDefinitions ) + cb( def ); + } + + template void forEachPreDefinition( Fn cb ) { + Lock l( mMutex ); + for ( const auto& def : mPreDefinitions ) + cb( def ); + } + protected: SyntaxDefinitionManager( std::size_t reserveSpaceForLanguages = 12 ); diff --git a/include/eepp/ui/doc/textdocument.hpp b/include/eepp/ui/doc/textdocument.hpp index 56563d0be..497c3e628 100644 --- a/include/eepp/ui/doc/textdocument.hpp +++ b/include/eepp/ui/doc/textdocument.hpp @@ -773,7 +773,7 @@ class EE_API TextDocument { Uint32 mIndentWidth{ 4 }; IndentType mIndentType{ IndentType::IndentTabs }; Clock mTimer; - SyntaxDefinition mSyntaxDefinition; + std::shared_ptr mSyntaxDefinition; std::string mDefaultFileName; Uint64 mCleanChangeId{ 0 }; Uint32 mPageSize{ 10 }; diff --git a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp index 06f8f6ac8..bac54338c 100644 --- a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp +++ b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp @@ -201,16 +201,6 @@ SyntaxDefinitionManager::SyntaxDefinitionManager( std::size_t reserveSpaceForLan addXML(); } -const std::vector>& -SyntaxDefinitionManager::getDefinitions() const { - // TODO: Fix This is unsafe - return mDefinitions; -} - -const std::vector& SyntaxDefinitionManager::getPreDefinitions() const { - return mPreDefinitions; -} - static std::optional serializePattern( const SyntaxPattern& ptrn, const SyntaxDefinition& def ) { json pattern; @@ -560,10 +550,9 @@ SyntaxDefinition& SyntaxDefinitionManager::add( SyntaxDefinition&& syntaxStyle ) return *mDefinitions.back().get(); } -SyntaxPreDefinition& -SyntaxDefinitionManager::addPreDefinition( SyntaxPreDefinition&& preDefinition ) { +void SyntaxDefinitionManager::addPreDefinition( SyntaxPreDefinition&& preDefinition ) { + Lock l( mMutex ); mPreDefinitions.emplace_back( std::move( preDefinition ) ); - return mPreDefinitions.back(); } const SyntaxDefinition& SyntaxDefinitionManager::getPlainDefinition() const { @@ -605,6 +594,13 @@ SyntaxDefinitionManager::getByLanguageName( const std::string_view& name ) const return *mDefinitions[0].get(); } +std::shared_ptr +SyntaxDefinitionManager::getLanguageDefinition( const Uint32& index ) const { + Lock l( mMutex ); + eeASSERT( index < mDefinitions.size() ); + return mDefinitions[index]; +} + const SyntaxDefinition& SyntaxDefinitionManager::getByLanguageIndex( const Uint32& index ) const { Lock l( mMutex ); eeASSERT( index < mDefinitions.size() ); @@ -1186,25 +1182,29 @@ SyntaxDefinitionManager::languagesThatSupportExtension( std::string extension ) } } - for ( const auto& preDefinition : mPreDefinitions ) { - for ( const auto& ext : preDefinition.getFiles() ) { - if ( std::find_if( langs.begin(), langs.end(), - [&preDefinition]( const SyntaxDefinition* sdf ) { - return preDefinition.getLanguageName() == sdf->getLanguageName(); - } ) != langs.end() ) - continue; + { + Lock l( mMutex ); + for ( const auto& preDefinition : mPreDefinitions ) { + for ( const auto& ext : preDefinition.getFiles() ) { + if ( std::find_if( langs.begin(), langs.end(), + [&preDefinition]( const SyntaxDefinition* sdf ) { + return preDefinition.getLanguageName() == + sdf->getLanguageName(); + } ) != langs.end() ) + continue; - if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || - String::endsWith( ext, "$" ) ) { - LuaPattern words( ext ); - int start, end; - if ( words.find( extension, start, end ) ) { + if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || + String::endsWith( ext, "$" ) ) { + LuaPattern words( ext ); + int start, end; + if ( words.find( extension, start, end ) ) { + langs.insert( &preDefinition.load() ); + break; + } + } else if ( extension == ext ) { langs.insert( &preDefinition.load() ); break; } - } else if ( extension == ext ) { - langs.insert( &preDefinition.load() ); - break; } } } @@ -1247,23 +1247,26 @@ bool SyntaxDefinitionManager::extensionCanRepresentManyLanguages( std::string ex } } - for ( const auto& preDefinition : mPreDefinitions ) { - for ( const auto& ext : preDefinition.getFiles() ) { - if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || - String::endsWith( ext, "$" ) ) { - LuaPattern words( ext ); - int start, end; - if ( words.find( extension, start, end ) ) { + { + Lock l( mMutex ); + for ( const auto& preDefinition : mPreDefinitions ) { + for ( const auto& ext : preDefinition.getFiles() ) { + if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || + String::endsWith( ext, "$" ) ) { + LuaPattern words( ext ); + int start, end; + if ( words.find( extension, start, end ) ) { + count.insert( preDefinition.getLanguageName() ); + if ( count.size() > 1 ) + return true; + break; + } + } else if ( extension == ext ) { count.insert( preDefinition.getLanguageName() ); if ( count.size() > 1 ) return true; break; } - } else if ( extension == ext ) { - count.insert( preDefinition.getLanguageName() ); - if ( count.size() > 1 ) - return true; - break; } } } @@ -1316,27 +1319,18 @@ SyntaxDefinitionManager::getByExtension( const std::string& filePath ) const { const SyntaxDefinition* def = nullptr; + Lock l( mMutex ); if ( !extension.empty() ) { - { - Lock l( mMutex ); - for ( const auto& definition : mDefinitions ) { - if ( &definition == &mDefinitions[0] ) // Ignore Plain text - continue; + for ( const auto& definition : mDefinitions ) { + if ( &definition == &mDefinitions[0] ) // Ignore Plain text + continue; - for ( const auto& ext : definition->getFiles() ) { - if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || - String::endsWith( ext, "$" ) ) { - LuaPattern words( ext ); - int start, end; - if ( words.find( fileName, start, end ) ) { - if ( extHasMultipleLangs && !definition->hasExtensionPriority() ) { - def = definition.get(); - continue; - } - - return *definition.get(); - } - } else if ( extension == ext ) { + for ( const auto& ext : definition->getFiles() ) { + if ( String::startsWith( ext, "%." ) || String::startsWith( ext, "^" ) || + String::endsWith( ext, "$" ) ) { + LuaPattern words( ext ); + int start, end; + if ( words.find( fileName, start, end ) ) { if ( extHasMultipleLangs && !definition->hasExtensionPriority() ) { def = definition.get(); continue; @@ -1344,6 +1338,13 @@ SyntaxDefinitionManager::getByExtension( const std::string& filePath ) const { return *definition.get(); } + } else if ( extension == ext ) { + if ( extHasMultipleLangs && !definition->hasExtensionPriority() ) { + def = definition.get(); + continue; + } + + return *definition.get(); } } } @@ -1374,30 +1375,26 @@ SyntaxDefinitionManager::getByExtension( const std::string& filePath ) const { } } - Lock l( mMutex ); return def != nullptr ? *def : *mDefinitions[0].get(); } const SyntaxDefinition& SyntaxDefinitionManager::getByHeader( std::string_view header, const std::string& filePath, HExtLanguageType langType ) const { + Lock l( mMutex ); if ( !header.empty() ) { + for ( auto definition = mDefinitions.rbegin(); definition != mDefinitions.rend(); + ++definition ) { + auto needsHDef = needsHFallback( langType, definition->get()->getLSPName(), + FileSystem::fileExtension( filePath ), header ); + if ( needsHDef ) + return *needsHDef; - { - Lock l( mMutex ); - for ( auto definition = mDefinitions.rbegin(); definition != mDefinitions.rend(); - ++definition ) { - auto needsHDef = needsHFallback( langType, definition->get()->getLSPName(), - FileSystem::fileExtension( filePath ), header ); - if ( needsHDef ) - return *needsHDef; - - for ( const auto& hdr : definition->get()->getHeaders() ) { - LuaPattern words( hdr ); - int start, end; - if ( words.find( header.data(), start, end, 0, header.size(), 0 ) ) { - return *definition->get(); - } + for ( const auto& hdr : definition->get()->getHeaders() ) { + LuaPattern words( hdr ); + int start, end; + if ( words.find( header.data(), start, end, 0, header.size(), 0 ) ) { + return *definition->get(); } } } @@ -1419,7 +1416,6 @@ const SyntaxDefinition& SyntaxDefinitionManager::getByHeader( std::string_view h } } - Lock l( mMutex ); return *mDefinitions[0].get(); } @@ -1474,6 +1470,13 @@ const SyntaxDefinition& SyntaxDefinitionManager::find( const std::string& filePa return *def; } +std::shared_ptr SyntaxDefinitionManager::findPtr( const std::string& filePath, + std::string_view header, + HExtLanguageType hLangType ) { + auto def = find( filePath, header, hLangType ); + return mDefinitions[def.getLanguageIndex()]; +} + const SyntaxDefinition& SyntaxDefinitionManager::findFromString( const std::string_view& lang ) const { const SyntaxDefinition* syn = &getByLSPName( lang ); diff --git a/src/eepp/ui/doc/textdocument.cpp b/src/eepp/ui/doc/textdocument.cpp index c18637ebc..18ba75177 100644 --- a/src/eepp/ui/doc/textdocument.cpp +++ b/src/eepp/ui/doc/textdocument.cpp @@ -314,8 +314,8 @@ TextDocument::TextDocument( bool verbose ) : mNonWordChars( DEFAULT_NON_WORD_CHARS ), mHighlighter( std::make_unique( this ) ), mFoldRangeService( this ) { - initializeCommands(); reset(); + initializeCommands(); } TextDocument::~TextDocument() { @@ -380,7 +380,7 @@ void TextDocument::reset() { { Lock l( mSyntaxDefinitionMutex ); - mSyntaxDefinition = SyntaxDefinitionManager::instance()->getPlainDefinition(); + mSyntaxDefinition = SyntaxDefinitionManager::instance()->getPlainDefinitionPtr(); } mUndoStack.clear(); cleanChangeId(); @@ -713,7 +713,7 @@ void TextDocument::mergeSelection() { bool TextDocument::hasSyntaxDefinition() const { Lock l( mSyntaxDefinitionMutex ); - return !mSyntaxDefinition.getPatterns().empty(); + return mSyntaxDefinition && !mSyntaxDefinition->getPatterns().empty(); } const SyntaxDefinition& TextDocument::guessSyntax() const { @@ -730,13 +730,13 @@ void TextDocument::resetSyntax() { { { 0, 0 }, positionOffset( { 0, 0 }, FileSystem::fileExtension( mFilePath ) == "h" ? 5 * 1024 : 128 ) } ) ); - std::string oldDef = mSyntaxDefinition.getLSPName(); + auto oldDef = mSyntaxDefinition ? mSyntaxDefinition->getLanguageIndex() : 0; { Lock l( mSyntaxDefinitionMutex ); - mSyntaxDefinition = SyntaxDefinitionManager::instance()->find( mFilePath, header.toUtf8(), - mHExtLanguageType ); + mSyntaxDefinition = SyntaxDefinitionManager::instance()->findPtr( + mFilePath, header.toUtf8(), mHExtLanguageType ); } - if ( mSyntaxDefinition.getLSPName() != oldDef ) + if ( mSyntaxDefinition->getLanguageIndex() != oldDef ) notifySyntaxDefinitionChange(); } @@ -2917,14 +2917,16 @@ void TextDocument::redo() { const SyntaxDefinition& TextDocument::getSyntaxDefinition() const { Lock l( mSyntaxDefinitionMutex ); - return mSyntaxDefinition; + return mSyntaxDefinition ? *mSyntaxDefinition.get() + : SyntaxDefinitionManager::instance()->getPlainDefinition(); } void TextDocument::setSyntaxDefinition( const SyntaxDefinition& definition ) { - if ( mSyntaxDefinition.getLSPName() != definition.getLSPName() ) { + if ( mSyntaxDefinition->getLanguageIndex() != definition.getLanguageIndex() ) { { Lock l( mSyntaxDefinitionMutex ); - mSyntaxDefinition = definition; + mSyntaxDefinition = SyntaxDefinitionManager::instance()->getLanguageDefinition( + definition.getLanguageIndex() ); } notifySyntaxDefinitionChange(); } @@ -3914,7 +3916,7 @@ const String& TextDocument::getNonWordChars() const { } void TextDocument::toggleLineComments() { - std::string comment = mSyntaxDefinition.getComment(); + std::string comment = mSyntaxDefinition ? mSyntaxDefinition->getComment() : ""; if ( comment.empty() ) return; const std::string commentText = comment + " "; @@ -3966,7 +3968,8 @@ void TextDocument::toggleLineComments() { } void TextDocument::toggleBlockComments() { - const auto& blockComment = mSyntaxDefinition.getBlockComment(); + const auto& blockComment = + mSyntaxDefinition ? mSyntaxDefinition->getBlockComment() : SyntaxDefinition::BlockComment{}; if ( blockComment.open.empty() || blockComment.close.empty() ) return; @@ -4196,9 +4199,11 @@ void TextDocument::notifyDocumentMoved() { } void TextDocument::notifySyntaxDefinitionChange() { + if ( !mSyntaxDefinition ) + return; Lock l( mClientsMutex ); for ( auto& client : mClients ) { - client->onDocumentSyntaxDefinitionChange( mSyntaxDefinition ); + client->onDocumentSyntaxDefinitionChange( *mSyntaxDefinition.get() ); } } diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 12f4c6bb5..f736c7f3c 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -4700,13 +4700,11 @@ static void exportLanguages( const std::string& path, const std::string& langs, SyntaxDefinitionManager::instance()->loadFromFolder( langsPath ); std::vector defs; - for ( auto& preDef : sdm->getPreDefinitions() ) - preDef.load(); + sdm->forEachPreDefinition( []( auto preDef ) { preDef.load(); } ); if ( !langs.empty() ) { if ( langs == "all" ) { - for ( const auto& def : sdm->getDefinitions() ) - defs.push_back( *def.get() ); + sdm->forEachDefinition( [&defs]( auto def ) { defs.push_back( *def.get() ); } ); } else { auto langss = String::split( langs, ',' ); for ( const auto& l : langss ) { diff --git a/src/tools/ecode/featureshealth.cpp b/src/tools/ecode/featureshealth.cpp index 2706d7d7a..635e8359c 100644 --- a/src/tools/ecode/featureshealth.cpp +++ b/src/tools/ecode/featureshealth.cpp @@ -41,17 +41,16 @@ std::vector FeaturesHealth::getHealth( PluginManager bool ownsLSP = false; bool ownsDebugger = false; - const auto& definitions = SyntaxDefinitionManager::instance()->getDefinitions(); - const auto& preDefinitions = SyntaxDefinitionManager::instance()->getPreDefinitions(); - + auto sdm = SyntaxDefinitionManager::instance(); std::set languages; - for ( const auto& def : definitions ) + sdm->forEachDefinition( [&languages]( auto def ) { if ( def->isVisible() ) languages.insert( def->getLSPName() ); + } ); - for ( const auto& pdef : preDefinitions ) - languages.insert( pdef.getLSPName() ); + sdm->forEachPreDefinition( + [&languages]( auto pdef ) { languages.insert( pdef.getLSPName() ); } ); LinterPlugin* linter = static_cast( pluginManager->get( "linter" ) ); diff --git a/src/tools/ecode/universallocator.cpp b/src/tools/ecode/universallocator.cpp index 63b83615e..48cb91c60 100644 --- a/src/tools/ecode/universallocator.cpp +++ b/src/tools/ecode/universallocator.cpp @@ -914,21 +914,20 @@ std::shared_ptr> UniversalLocator::openFileTypeModel( const std::string& pattern ) { if ( nullptr == mApp->getSplitter()->getCurEditor() ) return ItemListOwnerModel::create( {} ); - const auto& preDefs = SyntaxDefinitionManager::instance()->getPreDefinitions(); - const auto& defs = SyntaxDefinitionManager::instance()->getDefinitions(); + auto sdm = SyntaxDefinitionManager::instance(); std::set fileTypeNames; - for ( const auto& def : preDefs ) { + sdm->forEachPreDefinition( [&fileTypeNames, &pattern]( auto def ) { if ( pattern.empty() || String::startsWith( String::toLower( def.getLanguageName() ), String::toLower( pattern ) ) ) fileTypeNames.insert( def.getLanguageName() ); - } - for ( const auto& def : defs ) { + } ); + sdm->forEachDefinition( [&fileTypeNames, &pattern]( auto def ) { if ( !def->isVisible() ) - continue; + return; if ( pattern.empty() || String::startsWith( String::toLower( def->getLanguageName() ), String::toLower( pattern ) ) ) fileTypeNames.insert( def->getLanguageName() ); - } + } ); return ItemListOwnerModel::create( std::vector( std::make_move_iterator( fileTypeNames.begin() ), std::make_move_iterator( fileTypeNames.end() ) ) );