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() ) ) );