From eae433796ee75b15f549ebebe349a8e346ec1254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Wed, 5 Feb 2025 01:02:46 -0300 Subject: [PATCH] Highlight current debugged line. Hid debugger panel if other panel is opened. Silence the debugger by default. --- include/eepp/ui/uicodeeditor.hpp | 2 +- src/eepp/ui/uicodeeditor.cpp | 4 +-- src/tools/ecode/docsearchcontroller.cpp | 2 ++ src/tools/ecode/globalsearchcontroller.cpp | 1 + .../debugger/dap/debuggerclientdap.cpp | 25 +++++++++++------ .../debugger/dap/debuggerclientdap.hpp | 8 ++++-- .../ecode/plugins/debugger/debuggerclient.hpp | 8 ++++-- .../debugger/debuggerclientlistener.cpp | 4 ++- .../debugger/debuggerclientlistener.hpp | 3 ++ .../ecode/plugins/debugger/debuggerplugin.cpp | 28 +++++++++++++++++-- .../ecode/plugins/debugger/debuggerplugin.hpp | 6 ++++ .../ecode/plugins/lsp/lspclientserver.cpp | 4 ++- src/tools/ecode/uistatusbar.cpp | 7 ++++- src/tools/ecode/uistatusbar.hpp | 2 ++ src/tools/ecode/universallocator.cpp | 1 + 15 files changed, 84 insertions(+), 21 deletions(-) diff --git a/include/eepp/ui/uicodeeditor.hpp b/include/eepp/ui/uicodeeditor.hpp index ff9021cc8..40b59a143 100644 --- a/include/eepp/ui/uicodeeditor.hpp +++ b/include/eepp/ui/uicodeeditor.hpp @@ -693,7 +693,7 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { Vector2f getScreenScroll() const; - Float getViewportWidth( const bool& forceVScroll = false ) const; + Float getViewportWidth( bool forceVScroll = false, bool includeMinimap = false ) const; Float getTopAreaWidth() const; diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 2d5ef6d27..02d488362 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -693,10 +693,10 @@ void UICodeEditor::disableEditorFeatures() { mUseDefaultStyle = true; } -Float UICodeEditor::getViewportWidth( const bool& forceVScroll ) const { +Float UICodeEditor::getViewportWidth( bool forceVScroll, bool includeMinimap ) const { Float vScrollWidth = mVScrollBar->isVisible() || forceVScroll ? mVScrollBar->getPixelsSize().getWidth() : 0.f; - if ( mMinimapEnabled ) + if ( mMinimapEnabled && !includeMinimap ) vScrollWidth += getMinimapWidth(); Float viewWidth = eefloor( mSize.getWidth() - mPaddingPx.Left - mPaddingPx.Right - getGutterWidth() - vScrollWidth ); diff --git a/src/tools/ecode/docsearchcontroller.cpp b/src/tools/ecode/docsearchcontroller.cpp index 6f9891cd7..efd7bad1e 100644 --- a/src/tools/ecode/docsearchcontroller.cpp +++ b/src/tools/ecode/docsearchcontroller.cpp @@ -188,6 +188,8 @@ void DocSearchController::initSearchBar( void DocSearchController::showFindView() { mApp->hideLocateBar(); mApp->hideGlobalSearchBar(); + mApp->getStatusBar()->hideAllElements(); + if ( !mSplitter->curEditorExistsAndFocused() ) return; diff --git a/src/tools/ecode/globalsearchcontroller.cpp b/src/tools/ecode/globalsearchcontroller.cpp index 3748af411..ec4df2786 100644 --- a/src/tools/ecode/globalsearchcontroller.cpp +++ b/src/tools/ecode/globalsearchcontroller.cpp @@ -456,6 +456,7 @@ void GlobalSearchController::showGlobalSearch( bool searchReplace ) { mApp->hideStatusTerminal(); mApp->hideStatusBuildOutput(); mApp->hideStatusAppOutput(); + mApp->getStatusBar()->hideAllElements(); bool wasReplaceTree = mGlobalSearchTreeReplace == mGlobalSearchTree; mGlobalSearchTree = searchReplace ? mGlobalSearchTreeReplace : mGlobalSearchTreeSearch; diff --git a/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.cpp b/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.cpp index c30a43b00..a5a6bebde 100644 --- a/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.cpp +++ b/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.cpp @@ -38,9 +38,10 @@ void DebuggerClientDap::makeRequest( const std::string_view& command, std::string cmd = jsonCmd.dump(); std::string msg( String::format( "Content-Length: %zu\r\n\r\n%s", cmd.size(), cmd ) ); - Log::instance()->writel( mDebug ? LogLevel::Info : LogLevel::Debug, - "DebuggerClientDap::makeRequest:" ); - Log::instance()->writel( mDebug ? LogLevel::Info : LogLevel::Debug, msg ); + if ( mDebug ) { + Log::debug( "DebuggerClientDap::makeRequest:" ); + Log::debug( msg ); + } mBus->write( msg.data(), msg.size() ); @@ -59,9 +60,10 @@ void DebuggerClientDap::makeResponse( int reqSeq, bool success, const std::strin std::string cmd = jsonCmd.dump(); std::string msg( String::format( "Content-Length: %zu\r\n\r\n%s", cmd.size(), cmd ) ); - Log::instance()->writel( mDebug ? LogLevel::Info : LogLevel::Debug, - "DebuggerClientDap::makeResponse:" ); - Log::instance()->writel( mDebug ? LogLevel::Info : LogLevel::Debug, msg ); + if ( mDebug ) { + Log::debug( "DebuggerClientDap::makeResponse:" ); + Log::debug( msg ); + } mBus->write( msg.data(), msg.size() ); } @@ -71,10 +73,14 @@ bool DebuggerClientDap::isServerConnected() const { ( mBus->state() == Bus::State::Running ); } -bool DebuggerClientDap::supportsTerminate() const { +bool DebuggerClientDap::supportsTerminateRequest() const { return mAdapterCapabilities.supportsTerminateRequest; } +bool DebuggerClientDap::supportsTerminateDebuggee() const { + return mAdapterCapabilities.supportTerminateDebuggee; +} + bool DebuggerClientDap::start() { bool started = mBus->start(); if ( started ) @@ -528,8 +534,11 @@ bool DebuggerClientDap::terminate( bool restart ) { return true; } -bool DebuggerClientDap::disconnect( bool restart ) { +bool DebuggerClientDap::disconnect( bool terminateDebuggee, bool restart ) { nlohmann::json arguments; + if ( mAdapterCapabilities.supportTerminateDebuggee && terminateDebuggee ) + arguments["terminateDebuggee"] = true; + if ( restart ) arguments["restart"] = true; diff --git a/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.hpp b/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.hpp index 8e4fe44aa..729f60026 100644 --- a/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.hpp +++ b/src/tools/ecode/plugins/debugger/dap/debuggerclientdap.hpp @@ -42,7 +42,7 @@ class DebuggerClientDap : public DebuggerClient { bool terminate( bool restart ) override; - bool disconnect( bool restart = false ) override; + bool disconnect( bool terminateDebuggee, bool restart = false ) override; bool threads() override; @@ -63,7 +63,9 @@ class DebuggerClientDap : public DebuggerClient { bool isServerConnected() const override; - bool supportsTerminate() const override; + bool supportsTerminateRequest() const override; + + bool supportsTerminateDebuggee() const override; bool setBreakpoints( const std::string& path, const std::vector& breakpoints, @@ -85,6 +87,8 @@ class DebuggerClientDap : public DebuggerClient { bool started() const override; + void setSilent( bool silent ) override { mDebug = !silent; } + protected: std::unique_ptr mBus; UnorderedMap> mBreakpoints; diff --git a/src/tools/ecode/plugins/debugger/debuggerclient.hpp b/src/tools/ecode/plugins/debugger/debuggerclient.hpp index ea3641f39..6dfd1d9fa 100644 --- a/src/tools/ecode/plugins/debugger/debuggerclient.hpp +++ b/src/tools/ecode/plugins/debugger/debuggerclient.hpp @@ -71,7 +71,7 @@ class DebuggerClient { virtual bool terminate( bool restart ) = 0; - virtual bool disconnect( bool restart = false ) = 0; + virtual bool disconnect( bool terminateDebuggee, bool restart = false ) = 0; virtual bool threads() = 0; @@ -93,7 +93,9 @@ class DebuggerClient { virtual bool isServerConnected() const = 0; - virtual bool supportsTerminate() const = 0; + virtual bool supportsTerminateRequest() const = 0; + + virtual bool supportsTerminateDebuggee() const = 0; virtual bool setBreakpoints( const std::string& path, const std::vector& breakpoints, @@ -113,6 +115,8 @@ class DebuggerClient { virtual bool configurationDone() = 0; + virtual void setSilent( bool silent ) = 0; + void addListener( Listener* listener ); void removeListener( Listener* listener ); diff --git a/src/tools/ecode/plugins/debugger/debuggerclientlistener.cpp b/src/tools/ecode/plugins/debugger/debuggerclientlistener.cpp index ff7b2376a..7f821dfe6 100644 --- a/src/tools/ecode/plugins/debugger/debuggerclientlistener.cpp +++ b/src/tools/ecode/plugins/debugger/debuggerclientlistener.cpp @@ -310,7 +310,9 @@ void DebuggerClientListener::outputProduced( const Output& output ) { } } -void DebuggerClientListener::debuggingProcess( const ProcessInfo& ) {} +void DebuggerClientListener::debuggingProcess( const ProcessInfo& info ) { + mProcessInfo = info; +} void DebuggerClientListener::errorResponse( const std::string& command, const std::string& summary, const std::optional& /*message*/ ) { diff --git a/src/tools/ecode/plugins/debugger/debuggerclientlistener.hpp b/src/tools/ecode/plugins/debugger/debuggerclientlistener.hpp index aaf382f03..589d58e40 100644 --- a/src/tools/ecode/plugins/debugger/debuggerclientlistener.hpp +++ b/src/tools/ecode/plugins/debugger/debuggerclientlistener.hpp @@ -71,6 +71,8 @@ class DebuggerClientListener : public DebuggerClient::Listener { void sendBreakpoints(); + const ProcessInfo& getProcessInfo() const { return mProcessInfo; } + protected: DebuggerClient* mClient{ nullptr }; DebuggerPlugin* mPlugin{ nullptr }; @@ -84,6 +86,7 @@ class DebuggerClientListener : public DebuggerClient::Listener { std::shared_ptr mStackModel; std::shared_ptr mVariablesHolder; std::unordered_map mScopeRef; + ProcessInfo mProcessInfo; StatusDebuggerController* getStatusDebuggerController() const; diff --git a/src/tools/ecode/plugins/debugger/debuggerplugin.cpp b/src/tools/ecode/plugins/debugger/debuggerplugin.cpp index 5ba5f8083..d25614c0c 100644 --- a/src/tools/ecode/plugins/debugger/debuggerplugin.cpp +++ b/src/tools/ecode/plugins/debugger/debuggerplugin.cpp @@ -374,6 +374,11 @@ void DebuggerPlugin::loadDAPConfig( const std::string& path, bool updateConfigFi mFetchGlobals = config.value( "fetch_globals", false ); else if ( updateConfigFile ) config["fetch_globals"] = mFetchGlobals; + + if ( config.contains( "silent" ) ) + mSilence = config.value( "silent", true ); + else if ( updateConfigFile ) + config["silent"] = mSilence; } if ( j.contains( "dap" ) ) { @@ -1446,6 +1451,23 @@ void DebuggerPlugin::drawLineNumbersBefore( UICodeEditor* editor, } } +void DebuggerPlugin::drawBeforeLineText( UICodeEditor* editor, const Int64& index, + Vector2f position, const Float& /*fontSize*/, + const Float& lineHeight ) { + if ( !mDebugger || !mListener || !mListener->isStopped() || !mListener->getCurrentScopePos() || + editor->getDocument().getFilePath() != mListener->getCurrentScopePos()->first || + mListener->getCurrentScopePos()->second - 1 != index || + !editor->getDocumentView().isLineVisible( index ) ) + return; + + Primitives p; + Color color( editor->getColorScheme().getEditorSyntaxStyle( "warning"_sst ).color ); + Color blendedColor( Color( color, 20 ).blendAlpha( editor->getAlpha() ) ); + p.setColor( blendedColor ); + p.drawRectangle( + Rectf( position, Sizef( editor->getViewportWidth( false, true ), lineHeight ) ) ); +} + bool DebuggerPlugin::setBreakpoint( const std::string& doc, Uint32 lineNumber ) { Lock l( mBreakpointsMutex ); @@ -1978,6 +2000,7 @@ void DebuggerPlugin::run( const std::string& debugger, ProtocolSettings&& protoc mListener = std::make_unique( mDebugger.get(), this ); mListener->setIsRemote( isRemote ); mDebugger->addListener( mListener.get() ); + mDebugger->setSilent( mSilence ); DebuggerClientDap* dap = static_cast( mDebugger.get() ); dap->runInTerminalCb = [this]( bool isIntegrated, std::string cmd, @@ -2012,7 +2035,7 @@ void DebuggerPlugin::exitDebugger( bool requestDisconnect ) { mDebugger->removeListener( mListener.get() ); if ( requestDisconnect && mDebugger ) - mDebugger->disconnect( false ); + mDebugger->disconnect( true, false ); if ( mDebugger || mListener ) { mThreadPool->run( [this] { @@ -2170,7 +2193,6 @@ void DebuggerPlugin::displayTooltip( UICodeEditor* editor, const std::string& ex } bool DebuggerPlugin::onMouseMove( UICodeEditor* editor, const Vector2i& position, const Uint32& ) { - if ( !mDebugger || !mListener || !mDebugger->isServerConnected() || mDebuggingState != StatusDebuggerController::State::Paused ) { return false; @@ -2227,7 +2249,7 @@ bool DebuggerPlugin::onMouseMove( UICodeEditor* editor, const Vector2i& position }, mHoverDelay, getMouseMoveHash( editor ) ); editor->updateMouseCursor( position.asFloat() ); - return true; + return false; } void DebuggerPlugin::onDocumentLineMove( TextDocument* doc, const Int64& fromLine, diff --git a/src/tools/ecode/plugins/debugger/debuggerplugin.hpp b/src/tools/ecode/plugins/debugger/debuggerplugin.hpp index 8b634aa99..0eefd5389 100644 --- a/src/tools/ecode/plugins/debugger/debuggerplugin.hpp +++ b/src/tools/ecode/plugins/debugger/debuggerplugin.hpp @@ -77,6 +77,8 @@ class DebuggerPlugin : public PluginBase { void initStatusDebuggerController(); + bool isSilent() const { return mSilence; } + protected: friend class DebuggerClientListener; @@ -84,6 +86,7 @@ class DebuggerPlugin : public PluginBase { bool mFetchRegisters{ false }; bool mFetchGlobals{ false }; bool mChangingBreakpoint{ false }; + bool mSilence{ true }; std::string mProjectPath; std::vector mDaps; @@ -207,6 +210,9 @@ class DebuggerPlugin : public PluginBase { const Float& lineHeight, const Float& lineNumberWidth, const int& lineNumberDigits, const Float& fontSize ) override; + void drawBeforeLineText( UICodeEditor* editor, const Int64& index, Vector2f position, + const Float& /*fontSize*/, const Float& lineHeight ) override; + bool setBreakpoint( UICodeEditor* editor, Uint32 lineNumber ); bool setBreakpoint( TextDocument* doc, Uint32 lineNumber ); diff --git a/src/tools/ecode/plugins/lsp/lspclientserver.cpp b/src/tools/ecode/plugins/lsp/lspclientserver.cpp index 25fced745..636202ffd 100644 --- a/src/tools/ecode/plugins/lsp/lspclientserver.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientserver.cpp @@ -504,9 +504,11 @@ static LSPSymbolInformationList parseDocumentSymbols( const json& result, bool i for ( const auto& r : ret ) rret.push_back( LSPSymbolInformationTmp::fromTmp( r ) ); - if ( isSilent ) + if ( !isSilent ) { Log::debug( "LSPClientServer - parseDocumentSymbols took: %.2fms", clock.getElapsedTimeAndReset().asMilliseconds() ); + } + return rret; } diff --git a/src/tools/ecode/uistatusbar.cpp b/src/tools/ecode/uistatusbar.cpp index 062a7ddf6..e16dcab3e 100644 --- a/src/tools/ecode/uistatusbar.cpp +++ b/src/tools/ecode/uistatusbar.cpp @@ -1,9 +1,9 @@ -#include "uistatusbar.hpp" #include "globalsearchcontroller.hpp" #include "plugins/plugincontextprovider.hpp" #include "statusappoutputcontroller.hpp" #include "statusbuildoutputcontroller.hpp" #include "statusterminalcontroller.hpp" +#include "uistatusbar.hpp" #include "universallocator.hpp" #include #include @@ -213,4 +213,9 @@ void UIStatusBar::removeStatusBarElement( const std::string& id ) { } } +void UIStatusBar::hideAllElements() { + for ( auto& [_, el] : mElements ) + el.second->hide(); +} + } // namespace ecode diff --git a/src/tools/ecode/uistatusbar.hpp b/src/tools/ecode/uistatusbar.hpp index 7b03b322a..8f584f3af 100644 --- a/src/tools/ecode/uistatusbar.hpp +++ b/src/tools/ecode/uistatusbar.hpp @@ -53,6 +53,8 @@ class UIStatusBar : public UILinearLayout, public WidgetCommandExecuter { std::shared_ptr getStatusBarElement( const std::string& id ) const; + void hideAllElements(); + protected: UnorderedMap>> mElements; diff --git a/src/tools/ecode/universallocator.cpp b/src/tools/ecode/universallocator.cpp index 5697d28cc..1d258a168 100644 --- a/src/tools/ecode/universallocator.cpp +++ b/src/tools/ecode/universallocator.cpp @@ -630,6 +630,7 @@ void UniversalLocator::showBar() { mApp->hideStatusTerminal(); mApp->hideStatusBuildOutput(); mApp->hideStatusAppOutput(); + mApp->getStatusBar()->hideAllElements(); mLocateBarLayout->setVisible( true ); mLocateInput->setFocus();