From b6ead5f2fdfa65bda5ef0a4676ae8f0d88eaff79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Wed, 21 May 2025 00:33:25 -0300 Subject: [PATCH] Added "Build & Run" and "Build & Debug" buttons. --- include/eepp/ui/uiwidget.hpp | 2 ++ src/eepp/ui/uiwidget.cpp | 6 ++++ src/tools/ecode/ecode.cpp | 6 ++-- src/tools/ecode/ecode.hpp | 13 +++++++++ .../ecode/plugins/debugger/debuggerplugin.cpp | 29 ++++++++++++------- .../ecode/plugins/debugger/debuggerplugin.hpp | 1 + src/tools/ecode/projectbuild.cpp | 14 +++++++++ src/tools/ecode/statusappoutputcontroller.cpp | 20 +++++++++++++ src/tools/ecode/statusappoutputcontroller.hpp | 2 ++ .../ecode/statusbuildoutputcontroller.cpp | 15 ++++++++++ .../ecode/statusbuildoutputcontroller.hpp | 2 ++ 11 files changed, 98 insertions(+), 12 deletions(-) diff --git a/include/eepp/ui/uiwidget.hpp b/include/eepp/ui/uiwidget.hpp index c6f910a68..0dbd5dca5 100644 --- a/include/eepp/ui/uiwidget.hpp +++ b/include/eepp/ui/uiwidget.hpp @@ -59,6 +59,8 @@ class EE_API UIWidget : public UINode { UIWidget* setTooltipText( const String& text ); + UIWidget* setTooltipTextIfNotEmpty( const String& text ); + String getTooltipText(); void updateAnchorsDistances(); diff --git a/src/eepp/ui/uiwidget.cpp b/src/eepp/ui/uiwidget.cpp index 88462d26c..cfe129834 100644 --- a/src/eepp/ui/uiwidget.cpp +++ b/src/eepp/ui/uiwidget.cpp @@ -437,6 +437,12 @@ UIWidget* UIWidget::setTooltipText( const String& text ) { return this; } +UIWidget* UIWidget::setTooltipTextIfNotEmpty( const String& text ) { + if ( !text.empty() ) + setTooltipText( text ); + return this; +} + String UIWidget::getTooltipText() { return mTooltipText; } diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index c1e9f3382..963c0a2a2 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -1823,7 +1823,7 @@ std::map App::getLocalKeybindings() { { { 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_B, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-start-cancel" }, { { KEY_C, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-cancel" }, { { KEY_R, KeyMod::getDefaultModifier() }, "project-build-and-run" }, { { KEY_O, KEYMOD_LALT | KEYMOD_SHIFT }, "show-open-documents" }, @@ -1846,7 +1846,7 @@ std::map App::getMigrateKeybindings() { { "menu-toggle", "mod+shift+m" }, #endif { "lock-toggle", "mod+shift+l" }, { "debug-widget-tree-view", "f11" }, - { "project-build-and-run", "f5" } }; + { "project-build-and-run", "f5" }, { "project-build-start", "mod+shift+b" } }; } std::vector App::getUnlockedCommands() { @@ -1864,7 +1864,9 @@ std::vector App::getUnlockedCommands() { "open-command-palette", "open-global-search", "project-build-start", + "project-build-start-cancel", "project-build-cancel", + "project-build-clean", "project-build-and-run", "project-run-executable", "toggle-status-locate-bar", diff --git a/src/tools/ecode/ecode.hpp b/src/tools/ecode/ecode.hpp index e89b27e34..387e8711e 100644 --- a/src/tools/ecode/ecode.hpp +++ b/src/tools/ecode/ecode.hpp @@ -265,11 +265,24 @@ class App : public UICodeEditorSplitter::Client, public PluginContextProvider { mProjectBuildManager->buildCurrentConfig( mStatusBuildOutputController.get() ); } } ); + t.setCommand( "project-build-start-cancel", [this] { + if ( mProjectBuildManager && mStatusBuildOutputController ) { + if ( mProjectBuildManager->isBuilding() ) { + mProjectBuildManager->cancelBuild(); + } else { + mProjectBuildManager->buildCurrentConfig( mStatusBuildOutputController.get() ); + } + } + } ); t.setCommand( "project-build-cancel", [this] { if ( mProjectBuildManager && mProjectBuildManager->isBuilding() ) { mProjectBuildManager->cancelBuild(); } } ); + t.setCommand( "project-build-clean", [this] { + if ( mProjectBuildManager && mStatusBuildOutputController ) + mProjectBuildManager->cleanCurrentConfig( mStatusBuildOutputController.get() ); + } ); t.setCommand( "project-run-executable", [this] { if ( mProjectBuildManager && mStatusAppOutputController ) mProjectBuildManager->runCurrentConfig( mStatusAppOutputController.get(), false ); diff --git a/src/tools/ecode/plugins/debugger/debuggerplugin.cpp b/src/tools/ecode/plugins/debugger/debuggerplugin.cpp index 04f18d8dc..c9650c21a 100644 --- a/src/tools/ecode/plugins/debugger/debuggerplugin.cpp +++ b/src/tools/ecode/plugins/debugger/debuggerplugin.cpp @@ -715,7 +715,8 @@ void DebuggerPlugin::buildSidePanelTab() { - + + @@ -787,13 +788,18 @@ void DebuggerPlugin::buildSidePanelTab() { mTabContents->bind( "debugger_run_button", mRunButton ); - mRunButton->onClick( [this]( auto ) { - if ( mDebugger && mDebugger->started() ) { - exitDebugger( true ); - } else { - runCurrentConfig(); - } - } ); + mTabContents->bind( "debugger_build_and_run_button", mBuildAndRunButton ); + + mRunButton->setTooltipText( getPluginContext()->getKeybind( "debugger-start-stop" ) ); + + mBuildAndRunButton->setTooltipText( + getPluginContext()->getKeybind( "debugger-continue-interrupt" ) ); + + mRunButton->onClick( + [this]( auto ) { getPluginContext()->runCommand( "debugger-start-stop" ); } ); + + mBuildAndRunButton->onClick( + [this]( auto ) { getPluginContext()->runCommand( "debugger-continue-interrupt" ); } ); setUIDebuggingState( StatusDebuggerController::State::NotStarted ); @@ -1355,10 +1361,11 @@ void DebuggerPlugin::onRegisterDocument( TextDocument* doc ) { doc->setCommand( "debugger-stop", [this] { exitDebugger( true ); } ); doc->setCommand( "debugger-start-stop", [this] { - if ( mDebugger ) + if ( mDebugger && mDebugger->started() ) { exitDebugger( true ); - else + } else { runCurrentConfig(); + } } ); doc->setCommand( "debugger-breakpoint-toggle", [doc, this] { @@ -2173,6 +2180,8 @@ void DebuggerPlugin::updatePanelUIState( StatusDebuggerController::State state ) mRunButton->setText( isDebugging ? i18n( "Stop Debugger", "Stop Debugger" ) : i18n( "debug", "Debug" ) ); + + mBuildAndRunButton->setEnabled( !isDebugging ); } void DebuggerPlugin::setUIDebuggingState( StatusDebuggerController::State state ) { diff --git a/src/tools/ecode/plugins/debugger/debuggerplugin.hpp b/src/tools/ecode/plugins/debugger/debuggerplugin.hpp index ad1e38b9d..72e703f8a 100644 --- a/src/tools/ecode/plugins/debugger/debuggerplugin.hpp +++ b/src/tools/ecode/plugins/debugger/debuggerplugin.hpp @@ -103,6 +103,7 @@ class DebuggerPlugin : public PluginBase { UIDropDownList* mUIDebuggerList{ nullptr }; UIDropDownList* mUIDebuggerConfList{ nullptr }; UIPushButton* mRunButton{ nullptr }; + UIPushButton* mBuildAndRunButton{ nullptr }; BreakpointsHolder mBreakpoints; UnorderedSet mPendingBreakpoints; std::shared_ptr mBreakpointsModel; diff --git a/src/tools/ecode/projectbuild.cpp b/src/tools/ecode/projectbuild.cpp index 756944561..1645ecf70 100644 --- a/src/tools/ecode/projectbuild.cpp +++ b/src/tools/ecode/projectbuild.cpp @@ -1156,6 +1156,7 @@ void ProjectBuildManager::buildSidePanelTab() { + )html" ); @@ -1179,6 +1180,7 @@ void ProjectBuildManager::updateSidePanelTab() { UIPushButton* runButton = buildTab->find( "run_button" ); UIPushButton* buildAdd = buildTab->find( "build_add" ); UIPushButton* buildEdit = buildTab->find( "build_edit" ); + UIPushButton* buildAndRun = buildTab->find( "build_and_run_button" ); buildList->getListBox()->clear(); @@ -1226,6 +1228,18 @@ void ProjectBuildManager::updateSidePanelTab() { cleanButton->setEnabled( !mConfig.buildName.empty() && hasBuild( mConfig.buildName ) && hasCleanCommands( mConfig.buildName ) ); + buildAndRun->setEnabled( !mConfig.buildName.empty() && hasBuild( mConfig.buildName ) && + hasBuildCommands( mConfig.buildName ) ); + + buildButton->setTooltipTextIfNotEmpty( mApp->getKeybind( "project-build-start-cancel" ) ); + buildButton->setTooltipTextIfNotEmpty( mApp->getKeybind( "project-build-clean" ) ); + runButton->setTooltipTextIfNotEmpty( mApp->getKeybind( "project-run-executable" ) ); + buildAndRun->setTooltipTextIfNotEmpty( mApp->getKeybind( "project-build-and-run" ) ); + + if ( !buildAndRun->hasEventsOfType( Event::MouseClick ) ) { + buildAndRun->onClick( [this]( auto ) { mApp->runCommand( "project-build-and-run" ); } ); + } + if ( !buildButton->hasEventsOfType( Event::MouseClick ) ) { buildButton->onClick( [this]( auto ) { if ( isBuilding() ) { diff --git a/src/tools/ecode/statusappoutputcontroller.cpp b/src/tools/ecode/statusappoutputcontroller.cpp index d0a506477..882d5c6ed 100644 --- a/src/tools/ecode/statusappoutputcontroller.cpp +++ b/src/tools/ecode/statusappoutputcontroller.cpp @@ -32,6 +32,15 @@ UIPushButton* StatusAppOutputController::getRunButton() { return nullptr; } +UIPushButton* StatusAppOutputController::getBuildAndRunButton() { + if ( mContext->getSidePanel() ) { + UIWidget* tab = mContext->getSidePanel()->find( "build_tab_view" ); + if ( tab ) + return tab->find( "build_and_run_button" ); + } + return nullptr; +} + void StatusAppOutputController::initNewOutput( const ProjectBuildOutputParser& outputParser, bool fromBuildPanel ) { show(); @@ -73,6 +82,11 @@ void StatusAppOutputController::initNewOutput( const ProjectBuildOutputParser& o if ( runButton ) runButton->setText( mContext->i18n( "cancel_run", "Cancel Run" ) ); + + UIPushButton* buildAndRunButton = getBuildAndRunButton(); + + if ( buildAndRunButton ) + buildAndRunButton->setEnabled( false ); } mRunButton->setEnabled( false ); @@ -239,6 +253,12 @@ void StatusAppOutputController::updateRunButton() { runButton->runOnMainThread( [this, runButton] { runButton->setText( mContext->i18n( "run", "Run" ) ); } ); } + + UIPushButton* buildAndRunButton = getBuildAndRunButton(); + + if ( buildAndRunButton ) + buildAndRunButton->setEnabled( true ); + mRunButton->setEnabled( true ); mStopButton->setEnabled( false ); } diff --git a/src/tools/ecode/statusappoutputcontroller.hpp b/src/tools/ecode/statusappoutputcontroller.hpp index ab3586bed..dcb07d153 100644 --- a/src/tools/ecode/statusappoutputcontroller.hpp +++ b/src/tools/ecode/statusappoutputcontroller.hpp @@ -39,6 +39,8 @@ class StatusAppOutputController : public StatusBarElement { UIPushButton* getRunButton(); + UIPushButton* getBuildAndRunButton(); + void updateRunButton(); protected: diff --git a/src/tools/ecode/statusbuildoutputcontroller.cpp b/src/tools/ecode/statusbuildoutputcontroller.cpp index 7bd904042..55a84800e 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.cpp +++ b/src/tools/ecode/statusbuildoutputcontroller.cpp @@ -33,6 +33,15 @@ UIPushButton* StatusBuildOutputController::getBuildButton() { return nullptr; } +UIPushButton* StatusBuildOutputController::getBuildAndRunButton() { + if ( mContext->getSidePanel() ) { + UIWidget* tab = mContext->getSidePanel()->find( "build_tab_view" ); + if ( tab ) + return tab->find( "build_and_run_button" ); + } + return nullptr; +} + UIPushButton* StatusBuildOutputController::getCleanButton() { if ( mContext->getSidePanel() ) { UIWidget* tab = mContext->getSidePanel()->find( "build_tab_view" ); @@ -159,6 +168,7 @@ void StatusBuildOutputController::runBuild( const std::string& buildName, mScrollLocked = true; UIPushButton* buildButton = getBuildButton(); + UIPushButton* buildAndRunButton = getBuildAndRunButton(); UIPushButton* cleanButton = getCleanButton(); bool enableBuildButton = false; @@ -182,11 +192,15 @@ void StatusBuildOutputController::runBuild( const std::string& buildName, buildButton->setText( mContext->i18n( "cancel_build", "Cancel Build" ) ); } + buildAndRunButton->setEnabled( false ); + mBuildButton->setEnabled( false ); + mStopButton->setEnabled( true ); const auto updateBuildButton = [this, isClean, enableBuildButton, enableCleanButton]() { UIPushButton* buildButton = getBuildButton(); + UIPushButton* buildAndRunButton = getBuildAndRunButton(); UIPushButton* cleanButton = getCleanButton(); if ( !isClean && buildButton ) { @@ -207,6 +221,7 @@ void StatusBuildOutputController::runBuild( const std::string& buildName, if ( enableCleanButton && cleanButton ) cleanButton->runOnMainThread( [cleanButton] { cleanButton->setEnabled( true ); } ); + buildAndRunButton->setEnabled( true ); mBuildButton->setEnabled( true ); mStopButton->setEnabled( false ); }; diff --git a/src/tools/ecode/statusbuildoutputcontroller.hpp b/src/tools/ecode/statusbuildoutputcontroller.hpp index 7c1756268..3262f51cb 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.hpp +++ b/src/tools/ecode/statusbuildoutputcontroller.hpp @@ -77,6 +77,8 @@ class StatusBuildOutputController : public StatusBarElement { UIPushButton* getBuildButton(); + UIPushButton* getBuildAndRunButton(); + UIPushButton* getCleanButton(); bool searchFindAndAddStatusResult( const std::vector& patterns,