From ba4655553c134e1bf181ab3f9a067d71d94c4bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Fri, 9 Jun 2023 19:36:03 -0300 Subject: [PATCH] eepp: Added to UIWidget: setClass, setClasses, resetClass. Added support for custom styling of cells in models using custom classes. With the new ModelRole::Class. ecode: Fixed LSPs with multiple languages. Fixed Status Bar not hiding. Added option to request refresh the document semantic highlighting. --- bin/assets/ui/breeze.css | 34 +++++- include/eepp/ui/models/model.hpp | 2 + include/eepp/ui/models/modelrole.hpp | 2 +- include/eepp/ui/models/sortingproxymodel.hpp | 2 + include/eepp/ui/uiwidget.hpp | 8 ++ src/eepp/ui/abstract/uiabstracttableview.cpp | 14 +++ src/eepp/ui/models/filesystemmodel.cpp | 115 +++++++++--------- src/eepp/ui/models/sortingproxymodel.cpp | 4 + src/eepp/ui/uitreeview.cpp | 14 +++ src/eepp/ui/uiwidget.cpp | 39 ++++++ src/tools/ecode/ecode.cpp | 8 +- .../autocomplete/autocompleteplugin.cpp | 3 +- .../plugins/formatter/formatterplugin.cpp | 3 +- .../ecode/plugins/lsp/lspclientplugin.cpp | 44 ++++--- .../ecode/plugins/lsp/lspclientserver.cpp | 7 +- .../ecode/plugins/lsp/lspclientserver.hpp | 2 + .../plugins/lsp/lspclientservermanager.cpp | 11 +- .../plugins/lsp/lspclientservermanager.hpp | 2 + .../ecode/plugins/lsp/lspdocumentclient.cpp | 14 +-- .../ecode/plugins/lsp/lspdocumentclient.hpp | 16 +-- src/tools/ecode/plugins/lsp/lspprotocol.hpp | 2 +- src/tools/ecode/settingsmenu.cpp | 2 +- src/tools/ecode/uistatusbar.cpp | 4 +- 23 files changed, 250 insertions(+), 102 deletions(-) diff --git a/bin/assets/ui/breeze.css b/bin/assets/ui/breeze.css index 57e5c3b41..33e45fbda 100644 --- a/bin/assets/ui/breeze.css +++ b/bin/assets/ui/breeze.css @@ -43,6 +43,9 @@ --highlight-primary: #FFFFFF7A; --disabled-color: #727679; --disabled-border: #43474c; + --theme-error: #cc0000; + --theme-warning: #cccc00; + --theme-success: #00cc00; droppable-hovering-color: #FFFFFF20; } @@ -1010,11 +1013,6 @@ ScrollBarMini::hslider:hover ScrollBar::hbutton, ScrollBarMini::hbutton:hover { background-color: var(--primary); } - -.appbackground { - background-color: var(--back); -} - tab::icon { tint: var(--icon); } @@ -1033,11 +1031,34 @@ console { border-bottom-width: var(--border-width); } +/* Reserved classes used by themes */ +.appbackground { + background-color: var(--back); +} + TextInput.table_cell_edit { padding-top: 0!important; padding-bottom: 0!important; } +.theme-error > tableview::cell::text, +.theme-error > treeview::cell::text, +.theme-error > listview::cell::text { + color: var(--theme-error); +} + +.theme-warning > tableview::cell::text, +.theme-warning > treeview::cell::text, +.theme-warning > listview::cell::text { + color: var(--theme-warning); +} + +.theme-success > tableview::cell::text, +.theme-success > treeview::cell::text, +.theme-success > listview::cell::text { + color: var(--theme-success); +} + @media (prefers-color-scheme: light) { :root { @@ -1083,6 +1104,9 @@ TextInput.table_cell_edit { --term-font-color: #232627; --disabled-color: #727679; --disabled-border: #d3d4d5; + --theme-error: #cc0000; + --theme-warning: #cccc00; + --theme-success: #00cc00; droppable-hovering-color: #00000020; } diff --git a/include/eepp/ui/models/model.hpp b/include/eepp/ui/models/model.hpp index b4c4498c3..27582bf02 100644 --- a/include/eepp/ui/models/model.hpp +++ b/include/eepp/ui/models/model.hpp @@ -106,6 +106,8 @@ class EE_API Model { virtual void sort( const size_t& /*column*/, const SortOrder& /*order*/ ) {} + virtual bool classModelRoleEnabled() { return false; } + void registerView( UIAbstractView* ); void unregisterView( UIAbstractView* ); diff --git a/include/eepp/ui/models/modelrole.hpp b/include/eepp/ui/models/modelrole.hpp index 8f6853027..aa0681cf2 100644 --- a/include/eepp/ui/models/modelrole.hpp +++ b/include/eepp/ui/models/modelrole.hpp @@ -3,7 +3,7 @@ namespace EE { namespace UI { namespace Models { -enum class ModelRole { Display, Icon, Sort, Custom }; +enum class ModelRole { Display, Icon, Sort, Class, Custom }; }}} // namespace EE::UI::Models diff --git a/include/eepp/ui/models/sortingproxymodel.hpp b/include/eepp/ui/models/sortingproxymodel.hpp index a7a1bf5d6..6cf63fa0a 100644 --- a/include/eepp/ui/models/sortingproxymodel.hpp +++ b/include/eepp/ui/models/sortingproxymodel.hpp @@ -54,6 +54,8 @@ class EE_API SortingProxyModel final : public Model, private Model::Client { std::shared_ptr getSource() const; + virtual bool classModelRoleEnabled(); + private: // NOTE: The data() of indexes points to the corresponding Mapping object for that index. struct Mapping { diff --git a/include/eepp/ui/uiwidget.hpp b/include/eepp/ui/uiwidget.hpp index a3e4903f4..30cc69c53 100644 --- a/include/eepp/ui/uiwidget.hpp +++ b/include/eepp/ui/uiwidget.hpp @@ -141,6 +141,14 @@ class EE_API UIWidget : public UINode { const std::vector& getStyleSheetPseudoClasses() const; + void resetClass(); + + /** Resets all classes and assign a class */ + void setClass( const std::string& cls ); + + /** Resets all classes and assign vector of classes */ + void setClasses( const std::vector& classes ); + void addClass( const std::string& cls ); void addClasses( const std::vector& classes ); diff --git a/src/eepp/ui/abstract/uiabstracttableview.cpp b/src/eepp/ui/abstract/uiabstracttableview.cpp index 076de6254..72d49b504 100644 --- a/src/eepp/ui/abstract/uiabstracttableview.cpp +++ b/src/eepp/ui/abstract/uiabstracttableview.cpp @@ -522,6 +522,20 @@ UIWidget* UIAbstractTableView::updateCell( const int& rowIndex, const ModelIndex UITableCell* cell = widget->asType(); cell->setCurIndex( index ); + if ( getModel()->classModelRoleEnabled() ) { + Variant cls( getModel()->data( index, ModelRole::Class ) ); + if ( cls.isValid() ) { + if ( cls.is( Variant::Type::StdString ) ) + cell->setClass( cls.asStdString() ); + else if ( cls.is( Variant::Type::String ) ) + cell->setClass( cls.asString() ); + else if ( cls.is( Variant::Type::cstr ) ) + cell->setClass( cls.asCStr() ); + } else { + cell->resetClass(); + } + } + Variant txt( getModel()->data( index, ModelRole::Display ) ); if ( txt.isValid() ) { if ( txt.is( Variant::Type::StdString ) ) diff --git a/src/eepp/ui/models/filesystemmodel.cpp b/src/eepp/ui/models/filesystemmodel.cpp index 943d88a66..de741045d 100644 --- a/src/eepp/ui/models/filesystemmodel.cpp +++ b/src/eepp/ui/models/filesystemmodel.cpp @@ -412,64 +412,69 @@ Variant FileSystemModel::data( const ModelIndex& index, ModelRole role ) const { auto& node = this->nodeRef( index ); - if ( role == ModelRole::Custom ) - return Variant( node.info().getFilepath().c_str() ); - - if ( role == ModelRole::Sort ) { - switch ( index.column() ) { - case Column::Icon: - return node.info().isDirectory() ? 0 : 1; - case Column::Name: - return Variant( node.getName().c_str() ); - case Column::Size: - return node.info().getSize(); - case Column::Owner: - return node.info().getOwnerId(); - case Column::Group: - return node.info().getGroupId(); - case Column::Permissions: - return Variant( permissionString( node.info() ) ); - case Column::ModificationTime: - return node.info().getModificationTime(); - case Column::Inode: - return node.info().getInode(); - case Column::Path: - return Variant( node.info().getFilepath().c_str() ); - case Column::SymlinkTarget: - return node.info().isLink() ? Variant( node.info().linksTo() ) : Variant( "" ); - default: - eeASSERT( false ); + switch ( role ) { + case ModelRole::Custom: { + return Variant( node.info().getFilepath().c_str() ); + } + case ModelRole::Sort: { + switch ( index.column() ) { + case Column::Icon: + return node.info().isDirectory() ? 0 : 1; + case Column::Name: + return Variant( node.getName().c_str() ); + case Column::Size: + return node.info().getSize(); + case Column::Owner: + return node.info().getOwnerId(); + case Column::Group: + return node.info().getGroupId(); + case Column::Permissions: + return Variant( permissionString( node.info() ) ); + case Column::ModificationTime: + return node.info().getModificationTime(); + case Column::Inode: + return node.info().getInode(); + case Column::Path: + return Variant( node.info().getFilepath().c_str() ); + case Column::SymlinkTarget: + return node.info().isLink() ? Variant( node.info().linksTo() ) : Variant( "" ); + default: + eeASSERT( false ); + } + break; + } + case ModelRole::Display: { + switch ( index.column() ) { + case Column::Icon: + return iconFor( node, index ); + case Column::Name: + return Variant( node.getName().c_str() ); + case Column::Size: + return Variant( FileSystem::sizeToString( node.info().getSize() ) ); + case Column::Owner: + return Variant( String::toString( node.info().getOwnerId() ) ); + case Column::Group: + return Variant( String::toString( node.info().getGroupId() ) ); + case Column::Permissions: + return Variant( permissionString( node.info() ) ); + case Column::ModificationTime: + return Variant( Sys::epochToString( node.info().getModificationTime() ) ); + case Column::Inode: + return Variant( String::toString( node.info().getInode() ) ); + case Column::Path: + return Variant( node.info().getFilepath().c_str() ); + case Column::SymlinkTarget: + return node.info().isLink() ? Variant( node.info().linksTo() ) : Variant( "" ); + } + break; + } + case ModelRole::Icon: { + return iconFor( node, index ); + } + default: { } } - if ( role == ModelRole::Display ) { - switch ( index.column() ) { - case Column::Icon: - return iconFor( node, index ); - case Column::Name: - return Variant( node.getName().c_str() ); - case Column::Size: - return Variant( FileSystem::sizeToString( node.info().getSize() ) ); - case Column::Owner: - return Variant( String::toString( node.info().getOwnerId() ) ); - case Column::Group: - return Variant( String::toString( node.info().getGroupId() ) ); - case Column::Permissions: - return Variant( permissionString( node.info() ) ); - case Column::ModificationTime: - return Variant( Sys::epochToString( node.info().getModificationTime() ) ); - case Column::Inode: - return Variant( String::toString( node.info().getInode() ) ); - case Column::Path: - return Variant( node.info().getFilepath().c_str() ); - case Column::SymlinkTarget: - return node.info().isLink() ? Variant( node.info().linksTo() ) : Variant( "" ); - } - } - - if ( role == ModelRole::Icon ) - return iconFor( node, index ); - return {}; } diff --git a/src/eepp/ui/models/sortingproxymodel.cpp b/src/eepp/ui/models/sortingproxymodel.cpp index 737a9e894..7590e1bea 100644 --- a/src/eepp/ui/models/sortingproxymodel.cpp +++ b/src/eepp/ui/models/sortingproxymodel.cpp @@ -206,6 +206,10 @@ std::shared_ptr SortingProxyModel::getSource() const { return mSource; } +bool SortingProxyModel::classModelRoleEnabled() { + return source().classModelRoleEnabled(); +} + bool SortingProxyModel::isColumnSortable( const size_t& columnIndex ) const { return source().isColumnSortable( columnIndex ); } diff --git a/src/eepp/ui/uitreeview.cpp b/src/eepp/ui/uitreeview.cpp index d6f204e29..7ed1137d9 100644 --- a/src/eepp/ui/uitreeview.cpp +++ b/src/eepp/ui/uitreeview.cpp @@ -230,6 +230,20 @@ UIWidget* UITreeView::updateCell( const int& rowIndex, const ModelIndex& index, UITableCell* cell = widget->asType(); cell->setCurIndex( index ); + if ( getModel()->classModelRoleEnabled() ) { + Variant cls( getModel()->data( index, ModelRole::Class ) ); + if ( cls.isValid() ) { + if ( cls.is( Variant::Type::StdString ) ) + cell->setClass( cls.asStdString() ); + else if ( cls.is( Variant::Type::String ) ) + cell->setClass( cls.asString() ); + else if ( cls.is( Variant::Type::cstr ) ) + cell->setClass( cls.asCStr() ); + } else { + cell->resetClass(); + } + } + Variant txt( getModel()->data( index, ModelRole::Display ) ); if ( txt.isValid() ) { if ( txt.is( Variant::Type::StdString ) ) diff --git a/src/eepp/ui/uiwidget.cpp b/src/eepp/ui/uiwidget.cpp index 32ae14712..2e45aefd8 100644 --- a/src/eepp/ui/uiwidget.cpp +++ b/src/eepp/ui/uiwidget.cpp @@ -713,6 +713,45 @@ void UIWidget::updatePseudoClasses() { invalidateDraw(); } +void UIWidget::resetClass() { + if ( !mClasses.empty() ) { + mClasses.clear(); + if ( !isSceneNodeLoading() && !isLoadingState() ) { + getUISceneNode()->invalidateStyle( this ); + getUISceneNode()->invalidateStyleState( this ); + } + + onClassChange(); + } +} + +void UIWidget::setClass( const std::string& cls ) { + if ( mClasses.size() != 1 || mClasses[0] != cls ) { + mClasses.clear(); + mClasses.push_back( cls ); + + if ( !isSceneNodeLoading() && !isLoadingState() ) { + getUISceneNode()->invalidateStyle( this ); + getUISceneNode()->invalidateStyleState( this ); + } + + onClassChange(); + } +} + +void UIWidget::setClasses( const std::vector& classes ) { + if ( mClasses != classes ) { + mClasses = classes; + + if ( !isSceneNodeLoading() && !isLoadingState() ) { + getUISceneNode()->invalidateStyle( this ); + getUISceneNode()->invalidateStyleState( this ); + } + + onClassChange(); + } +} + void UIWidget::addClass( const std::string& cls ) { if ( !cls.empty() && !hasClass( cls ) ) { mClasses.push_back( cls ); diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 1de1eba36..6e0792a10 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -786,10 +786,10 @@ void App::switchSidePanel() { void App::switchStatusBar() { mConfig.ui.showStatusBar = !mConfig.ui.showStatusBar; - mSettings->getWindowMenu() - ->getItemId( "toggle-status-bar" ) - ->asType() - ->setActive( mConfig.ui.showStatusBar ); + auto chk = + mSettings->getWindowMenu()->getItemId( "toggle-status-bar" )->asType(); + if ( chk->isActive() != mConfig.ui.showStatusBar ) + chk->setActive( mConfig.ui.showStatusBar ); showStatusBar( mConfig.ui.showStatusBar ); } diff --git a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp index 39951fc14..8196e5950 100644 --- a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp +++ b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp @@ -560,7 +560,8 @@ PluginRequestHandle AutoCompletePlugin::processResponse( const PluginMessage& ms } } Lock l( mCapabilitiesMutex ); - mCapabilities[cap.language] = std::move( cap ); + for ( const auto& lang : cap.languages ) + mCapabilities[lang] = cap; } } return {}; diff --git a/src/tools/ecode/plugins/formatter/formatterplugin.cpp b/src/tools/ecode/plugins/formatter/formatterplugin.cpp index 00dd7788e..3cb46e140 100644 --- a/src/tools/ecode/plugins/formatter/formatterplugin.cpp +++ b/src/tools/ecode/plugins/formatter/formatterplugin.cpp @@ -568,7 +568,8 @@ PluginRequestHandle FormatterPlugin::processMessage( const PluginMessage& msg ) if ( msg.asLanguageServerCapabilities().ready ) { LSPServerCapabilities cap = msg.asLanguageServerCapabilities(); Lock l( mCapabilitiesMutex ); - mCapabilities[cap.language] = std::move( cap ); + for ( const auto& lang : cap.languages ) + mCapabilities[lang] = cap; } } return {}; diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index fd6c245a1..2a2c3fe59 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -797,11 +797,17 @@ void LSPClientPlugin::loadLSPConfig( std::vector& lsps, const std if ( j.contains( "keybindings" ) ) { auto& kb = j["keybindings"]; - auto list = { "lsp-go-to-definition", "lsp-go-to-declaration", - "lsp-go-to-implementation", "lsp-go-to-type-definition", - "lsp-switch-header-source", "lsp-symbol-info", - "lsp-symbol-references", "lsp-memory-usage", - "lsp-symbol-code-action", "lsp-rename-symbol-under-cursor" }; + auto list = { "lsp-go-to-definition", + "lsp-go-to-declaration", + "lsp-go-to-implementation", + "lsp-go-to-type-definition", + "lsp-switch-header-source", + "lsp-symbol-info", + "lsp-symbol-references", + "lsp-memory-usage", + "lsp-symbol-code-action", + "lsp-rename-symbol-under-cursor", + "lsp-refresh-semantic-highlighting" }; for ( const auto& key : list ) { if ( kb.contains( key ) ) { if ( !kb[key].empty() ) @@ -1036,38 +1042,43 @@ void LSPClientPlugin::onRegister( UICodeEditor* editor ) { if ( editor->hasDocument() ) { auto& doc = editor->getDocument(); - doc.setCommand( "lsp-go-to-definition", [&, editor]() { + doc.setCommand( "lsp-go-to-definition", [this, editor]() { getAndGoToLocation( editor, "textDocument/definition" ); } ); doc.setCommand( "lsp-rename-symbol-under-cursor", [this, editor]() { renameSymbol( editor ); } ); - doc.setCommand( "lsp-go-to-declaration", [&, editor]() { + doc.setCommand( "lsp-go-to-declaration", [this, editor]() { getAndGoToLocation( editor, "textDocument/declaration" ); } ); - doc.setCommand( "lsp-go-to-implementation", [&, editor]() { + doc.setCommand( "lsp-go-to-implementation", [this, editor]() { getAndGoToLocation( editor, "textDocument/implementation" ); } ); - doc.setCommand( "lsp-go-to-type-definition", [&, editor]() { + doc.setCommand( "lsp-go-to-type-definition", [this, editor]() { getAndGoToLocation( editor, "textDocument/typeDefinition" ); } ); doc.setCommand( "lsp-switch-header-source", - [&, editor]() { switchSourceHeader( editor ); } ); + [this, editor]() { switchSourceHeader( editor ); } ); - doc.setCommand( "lsp-symbol-info", [&, editor]() { getSymbolInfo( editor ); } ); + doc.setCommand( "lsp-symbol-info", [this, editor]() { getSymbolInfo( editor ); } ); - doc.setCommand( "lsp-symbol-references", [&, editor] { + doc.setCommand( "lsp-symbol-references", [this, editor] { mClientManager.getSymbolReferences( editor->getDocumentRef() ); } ); - doc.setCommand( "lsp-symbol-code-action", [&, editor] { codeAction( editor ); } ); + doc.setCommand( "lsp-symbol-code-action", [this, editor] { codeAction( editor ); } ); - doc.setCommand( "lsp-memory-usage", - [&, editor] { mClientManager.memoryUsage( editor->getDocumentRef() ); } ); + doc.setCommand( "lsp-memory-usage", [this, editor] { + mClientManager.memoryUsage( editor->getDocumentRef() ); + } ); + + doc.setCommand( "lsp-refresh-semantic-highlighting", [this, editor] { + mClientManager.requestSymanticHighlighting( editor->getDocumentRef() ); + } ); } std::vector listeners; @@ -1187,6 +1198,9 @@ bool LSPClientPlugin::onCreateContextMenu( UICodeEditor* editor, UIPopUpMenu* me if ( cap.codeActionProvider ) addFn( "lsp-symbol-code-action", "Code Action" ); + if ( cap.semanticTokenProvider.full || cap.semanticTokenProvider.fullDelta ) + addFn( "lsp-refresh-semantic-highlighting", "Refresh Semantic Highlighting" ); + if ( server->getDefinition().language == "cpp" || server->getDefinition().language == "c" ) addFn( "lsp-switch-header-source", "Switch Header/Source" ); diff --git a/src/tools/ecode/plugins/lsp/lspclientserver.cpp b/src/tools/ecode/plugins/lsp/lspclientserver.cpp index 45e81f0a0..f06f216f0 100644 --- a/src/tools/ecode/plugins/lsp/lspclientserver.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientserver.cpp @@ -1099,7 +1099,7 @@ void LSPClientServer::initialize() { mLSP.name.c_str(), e.what() ); } #endif - mCapabilities.language = mLSP.language; + mCapabilities.languages = mLanguagesSupported; mReady = true; write( newRequest( "initialized" ) ); sendQueuedMessages(); @@ -2060,4 +2060,9 @@ bool LSPClientServer::supportsLanguage( const std::string& lang ) const { mLanguagesSupported.end(); } +LSPDocumentClient* LSPClientServer::getLSPDocumentClient( TextDocument* doc ) { + auto client = mClients.find( doc ); + return ( client != mClients.end() ) ? client->second.get() : nullptr; +} + } // namespace ecode diff --git a/src/tools/ecode/plugins/lsp/lspclientserver.hpp b/src/tools/ecode/plugins/lsp/lspclientserver.hpp index 60e4d10b0..178a340c4 100644 --- a/src/tools/ecode/plugins/lsp/lspclientserver.hpp +++ b/src/tools/ecode/plugins/lsp/lspclientserver.hpp @@ -224,6 +224,8 @@ class LSPClientServer { bool supportsLanguage( const std::string& lang ) const; + LSPDocumentClient* getLSPDocumentClient( TextDocument* doc ); + protected: LSPClientServerManager* mManager{ nullptr }; String::HashType mId; diff --git a/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp b/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp index 892ece3e9..3c009f236 100644 --- a/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp @@ -109,7 +109,7 @@ void LSPClientServerManager::tryRunServer( const std::shared_ptr& std::vector languagesSupported; languagesSupported.push_back( rlsp.language ); for ( const auto& flsp : mLSPs ) - if ( flsp.name == lsp.usesLSP ) + if ( flsp.usesLSP == rlsp.name ) languagesSupported.push_back( flsp.language ); std::unique_ptr serverUP = runLSPServer( id, rlsp, rootPath, languagesSupported ); @@ -228,6 +228,15 @@ bool LSPClientServerManager::isServerRunning( const LSPClientServer* server ) { return false; } +void LSPClientServerManager::requestSymanticHighlighting( std::shared_ptr doc ) { + auto* server = getOneLSPClientServer( doc ); + if ( server ) { + LSPDocumentClient* client = server->getLSPDocumentClient( doc.get() ); + if ( client ) + client->requestSemanticHighlighting( true ); + } +} + void LSPClientServerManager::run( const std::shared_ptr& doc ) { mThreadPool->run( [&, doc]() { tryRunServer( doc ); } ); } diff --git a/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp b/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp index b3e7ed5b9..50ca5ad2b 100644 --- a/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp +++ b/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp @@ -96,6 +96,8 @@ class LSPClientServerManager { bool isServerRunning( const LSPClientServer* server ); + void requestSymanticHighlighting( std::shared_ptr doc ); + protected: friend class LSPClientServer; PluginManager* mPluginManager{ nullptr }; diff --git a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp index 269b6966f..f9b423089 100644 --- a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp +++ b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp @@ -115,7 +115,7 @@ void LSPDocumentClient::refreshTag() { sceneNode->removeActionsByTag( oldTag ); } -void LSPDocumentClient::requestSemanticHighlighting() { +void LSPDocumentClient::requestSemanticHighlighting( bool reqFull ) { if ( !mServer || !mServer->getManager()->getPlugin()->semanticHighlightingEnabled() || !mServer->getManager()->getPlugin()->langSupportsSemanticHighlighting( mServer->getDefinition().language ) ) @@ -128,13 +128,13 @@ void LSPDocumentClient::requestSemanticHighlighting() { TextRange range; std::string reqId; bool delta = false; - if ( cap.semanticTokenProvider.range && !mFirstHighlight ) { + if ( cap.semanticTokenProvider.range && !mFirstHighlight && !reqFull ) { range = mDoc->getActiveClientVisibleRange(); - } else if ( mFirstHighlight ) { + } else if ( mFirstHighlight || ( reqFull && !cap.semanticTokenProvider.fullDelta ) ) { mFirstHighlight = false; } else if ( cap.semanticTokenProvider.fullDelta ) { delta = true; - reqId = mSemanticeResultId; + reqId = reqFull ? "" : mSemanticeResultId; } LSPDocumentClient* docClient = this; @@ -149,7 +149,7 @@ void LSPDocumentClient::requestSemanticHighlighting() { } ); } -void LSPDocumentClient::requestSemanticHighlightingDelayed() { +void LSPDocumentClient::requestSemanticHighlightingDelayed( bool reqFull ) { if ( !mServer || !mServer->getManager()->getPlugin()->semanticHighlightingEnabled() || !mServer->getManager()->getPlugin()->langSupportsSemanticHighlighting( mServer->getDefinition().language ) ) @@ -161,8 +161,8 @@ void LSPDocumentClient::requestSemanticHighlightingDelayed() { UISceneNode* sceneNode = getUISceneNode(); if ( sceneNode ) { sceneNode->removeActionsByTag( mTagSemanticTokens ); - sceneNode->runOnMainThread( [this]() { requestSemanticHighlighting(); }, Seconds( 0.5f ), - mTagSemanticTokens ); + sceneNode->runOnMainThread( [this, reqFull]() { requestSemanticHighlighting( reqFull ); }, + Seconds( 0.5f ), mTagSemanticTokens ); } } diff --git a/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp b/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp index ff68a5183..4428ab623 100644 --- a/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp +++ b/src/tools/ecode/plugins/lsp/lspdocumentclient.hpp @@ -49,6 +49,14 @@ class LSPDocumentClient : public TextDocument::Client { void onServerInitialized(); + void requestSymbols(); + + void requestSymbolsDelayed(); + + void requestSemanticHighlighting( bool reqFull = false ); + + void requestSemanticHighlightingDelayed( bool reqFull = false ); + protected: LSPClientServer* mServer{ nullptr }; LSPClientServerManager* mServerManager{ nullptr }; @@ -66,14 +74,6 @@ class LSPDocumentClient : public TextDocument::Client { UISceneNode* getUISceneNode(); - void requestSymbols(); - - void requestSymbolsDelayed(); - - void requestSemanticHighlighting(); - - void requestSemanticHighlightingDelayed(); - void processTokens( const LSPSemanticTokensDelta& tokens, const Uint64& docModificationId ); void highlight(); diff --git a/src/tools/ecode/plugins/lsp/lspprotocol.hpp b/src/tools/ecode/plugins/lsp/lspprotocol.hpp index 324302f36..31daf3e40 100644 --- a/src/tools/ecode/plugins/lsp/lspprotocol.hpp +++ b/src/tools/ecode/plugins/lsp/lspprotocol.hpp @@ -130,7 +130,7 @@ struct LSPWorkspaceFoldersServerCapabilities { struct LSPServerCapabilities { bool ready = false; - std::string language; + std::vector languages; LSPTextDocumentSyncOptions textDocumentSync; bool hoverProvider = false; LSPCompletionOptions completionProvider; diff --git a/src/tools/ecode/settingsmenu.cpp b/src/tools/ecode/settingsmenu.cpp index fd236473e..6d90944be 100644 --- a/src/tools/ecode/settingsmenu.cpp +++ b/src/tools/ecode/settingsmenu.cpp @@ -901,7 +901,7 @@ UIMenu* SettingsMenu::createWindowMenu() { ->setId( "show-side-panel" ); mWindowMenu ->addCheckBox( i18n( "show_status_bar", "Show Status Bar" ), - mApp->getConfig().ui.showSidePanel, getKeybind( "toggle-status-bar" ) ) + mApp->getConfig().ui.showStatusBar, getKeybind( "toggle-status-bar" ) ) ->setId( "toggle-status-bar" ); mWindowMenu ->add( i18n( "move_panel_left", "Move panel to left..." ), findIcon( "layout-left" ), diff --git a/src/tools/ecode/uistatusbar.cpp b/src/tools/ecode/uistatusbar.cpp index c8456d97a..ffd7ef48b 100644 --- a/src/tools/ecode/uistatusbar.cpp +++ b/src/tools/ecode/uistatusbar.cpp @@ -89,11 +89,13 @@ void UIStatusBar::setApp( App* app ) { } void UIStatusBar::onVisibilityChange() { + UILinearLayout::onVisibilityChange(); if ( isVisible() ) updateState(); } -void UIStatusBar::onChildCountChange( Node*, const bool& ) { +void UIStatusBar::onChildCountChange( Node* node, const bool& removed ) { + UILinearLayout::onChildCountChange( node, removed ); if ( mApp ) updateState(); }