diff --git a/src/eepp/ui/uitabwidget.cpp b/src/eepp/ui/uitabwidget.cpp index afe947aac..88f316e25 100644 --- a/src/eepp/ui/uitabwidget.cpp +++ b/src/eepp/ui/uitabwidget.cpp @@ -1,3 +1,4 @@ +#include "eepp/ui/uiscenenode.hpp" #include #include #include @@ -1052,6 +1053,13 @@ std::optional UITabWidget::getDropDirection() const { if ( mTabBar->isVisible() && mousePos.y <= mTabBar->getPixelsSize().y ) return {}; + // Tab still attached to parent? + Node* nodeDragging = getUISceneNode()->getEventDispatcher()->getNodeDragging(); + if ( nodeDragging && nodeDragging->isType( UI_TYPE_TAB ) && + !( nodeDragging->asType()->getFlags() & UI_DRAG_VERTICAL ) ) { + return {}; + } + if ( mousePos.y <= mSize.y * mSplitEdgePercent ) { return SplitDirection::Top; } else if ( mousePos.y >= mSize.y - mSize.y * mSplitEdgePercent ) { diff --git a/src/tools/ecode/plugins/debugger/debuggerplugin.cpp b/src/tools/ecode/plugins/debugger/debuggerplugin.cpp index 6563c9c86..c08f8f0c3 100644 --- a/src/tools/ecode/plugins/debugger/debuggerplugin.cpp +++ b/src/tools/ecode/plugins/debugger/debuggerplugin.cpp @@ -1,7 +1,9 @@ #include "../../projectbuild.hpp" +#include "../../uistatusbar.hpp" #include "busprocess.hpp" #include "dap/debuggerclientdap.hpp" #include "debuggerplugin.hpp" +#include "statusdebuggercontroller.hpp" #include #include #include @@ -50,6 +52,11 @@ DebuggerPlugin::~DebuggerPlugin() { if ( mSidePanel && mTab ) mSidePanel->removeTab( mTab ); + if ( getManager()->getPluginContext()->getStatusBar() ) { + getManager()->getPluginContext()->getStatusBar()->removeStatusBarElement( + "status_app_debugger" ); + } + mDebugger.reset(); mListener.reset(); } @@ -180,11 +187,21 @@ void DebuggerPlugin::loadDAPConfig( const std::string& path, bool updateConfigFi PluginRequestHandle DebuggerPlugin::processMessage( const PluginMessage& msg ) { switch ( msg.type ) { case PluginMessageType::WorkspaceFolderChanged: { + mProjectPath = msg.asJSON()["folder"]; + if ( getUISceneNode() && mSidePanel ) + getUISceneNode()->runOnMainThread( [this] { + if ( mProjectPath.empty() ) + hideSidePanel(); + } ); + + updateUI(); + mInitialized = true; break; } case ecode::PluginMessageType::UIReady: { - updateUI(); + if ( !mInitialized ) + updateUI(); break; } default: @@ -197,16 +214,23 @@ void DebuggerPlugin::updateUI() { if ( !getUISceneNode() ) return; - getUISceneNode()->runOnMainThread( [this] { buildSidePanelTab(); } ); + getUISceneNode()->runOnMainThread( [this] { + buildSidePanelTab(); + buildStatusBar(); + } ); } void DebuggerPlugin::buildSidePanelTab() { if ( mTabContents && !mTab ) { + if ( mProjectPath.empty() ) + return; UIIcon* icon = findIcon( "debug" ); mTab = mSidePanel->add( i18n( "debugger", "Debugger" ), mTabContents, icon ? icon->getSize( PixelDensity::dpToPx( 12 ) ) : nullptr ); mTab->setId( "debugger" ); mTab->setTextAsFallback( true ); + + updateSidePanelTab(); return; } if ( mTab ) @@ -229,7 +253,7 @@ void DebuggerPlugin::buildSidePanelTab() { mTabContents = getUISceneNode()->loadLayoutFromString( STYLE ); mTab = mSidePanel->add( i18n( "debugger", "Debugger" ), mTabContents, icon ? icon->getSize( PixelDensity::dpToPx( 12 ) ) : nullptr ); - mTab->setId( "source_control" ); + mTab->setId( "debugger_tab" ); mTab->setTextAsFallback( true ); mTabContents->bind( "debugger_list", mUIDebuggerList ); @@ -238,6 +262,29 @@ void DebuggerPlugin::buildSidePanelTab() { updateSidePanelTab(); } +void DebuggerPlugin::buildStatusBar() { + if ( mProjectPath.empty() ) { + hideStatusBarElement(); + return; + } + if ( getManager()->getPluginContext()->getStatusBar() ) { + auto but = getManager()->getPluginContext()->getStatusBar()->find( "status_app_debugger" ); + if ( but ) { + but->setVisible( true ); + return; + } + } + + auto context = getManager()->getPluginContext(); + UIStatusBar* statusBar = context->getStatusBar(); + + auto debuggerStatusElem = std::make_shared( + context->getMainSplitter(), getUISceneNode(), context ); + + statusBar->insertStatusBarElement( "status_app_debugger", i18n( "debugger", "Debugger" ), + "icon(debug, 11dp)", debuggerStatusElem ); +} + void DebuggerPlugin::updateSidePanelTab() { mUIDebuggerList->getListBox()->clear(); @@ -393,4 +440,12 @@ void DebuggerPlugin::hideSidePanel() { } } +void DebuggerPlugin::hideStatusBarElement() { + if ( getManager()->getPluginContext()->getStatusBar() ) { + auto but = getManager()->getPluginContext()->getStatusBar()->find( "status_app_debugger" ); + if ( but ) + but->setVisible( false ); + } +} + } // namespace ecode diff --git a/src/tools/ecode/plugins/debugger/debuggerplugin.hpp b/src/tools/ecode/plugins/debugger/debuggerplugin.hpp index 2d247952a..60db2f769 100644 --- a/src/tools/ecode/plugins/debugger/debuggerplugin.hpp +++ b/src/tools/ecode/plugins/debugger/debuggerplugin.hpp @@ -49,6 +49,9 @@ class DebuggerPlugin : public PluginBase { protected: friend class DebuggerClientListener; + bool mInitialized{ false }; + std::string mProjectPath; + std::vector mDaps; std::unique_ptr mDebugger; std::unique_ptr mListener; @@ -71,12 +74,16 @@ class DebuggerPlugin : public PluginBase { void buildSidePanelTab(); + void buildStatusBar(); + void updateSidePanelTab(); void updateDebuggerConfigurationList(); void hideSidePanel(); + void hideStatusBarElement(); + void loadDAPConfig( const std::string& path, bool updateConfigFile ); void runConfig( const std::string& debugger, const std::string& configuration ); diff --git a/src/tools/ecode/plugins/debugger/statusdebuggercontroller.cpp b/src/tools/ecode/plugins/debugger/statusdebuggercontroller.cpp new file mode 100644 index 000000000..e6737c2b5 --- /dev/null +++ b/src/tools/ecode/plugins/debugger/statusdebuggercontroller.cpp @@ -0,0 +1,39 @@ +#include "statusdebuggercontroller.hpp" +#include "../plugincontextprovider.hpp" + +namespace ecode { + +StatusDebuggerController::StatusDebuggerController( UISplitter* mainSplitter, + UISceneNode* uiSceneNode, + PluginContextProvider* pluginContext ) : + StatusBarElement( mainSplitter, uiSceneNode, pluginContext ) {} + +UIWidget* StatusDebuggerController::getWidget() { + return mContainer; +} + +UIWidget* StatusDebuggerController::createWidget() { + if ( nullptr == mContainer ) + createContainer(); + return mContainer; +} + +void StatusDebuggerController::createContainer() { + if ( mContainer ) + return; + const auto XML = R"xml( + + + )xml"; + + if ( mMainSplitter->getLastWidget() != nullptr ) { + mMainSplitter->getLastWidget()->setVisible( false ); + mMainSplitter->getLastWidget()->setParent( mUISceneNode ); + } + + mContainer = mContext->getUISceneNode() + ->loadLayoutFromString( XML, mMainSplitter ) + ->asType(); +} + +} // namespace ecode diff --git a/src/tools/ecode/plugins/debugger/statusdebuggercontroller.hpp b/src/tools/ecode/plugins/debugger/statusdebuggercontroller.hpp new file mode 100644 index 000000000..2a7252a7c --- /dev/null +++ b/src/tools/ecode/plugins/debugger/statusdebuggercontroller.hpp @@ -0,0 +1,38 @@ +#ifndef ECODE_STATUSDEBUGGERCONTROLLER_HPP +#define ECODE_STATUSDEBUGGERCONTROLLER_HPP + +#include "../../uistatusbar.hpp" +#include +#include +#include +#include +#include +#include +#include + +using namespace EE; +using namespace EE::UI; +using namespace EE::UI::Tools; + +namespace ecode { + +class StatusDebuggerController : public StatusBarElement { + public: + StatusDebuggerController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, + PluginContextProvider* pluginContext ); + + virtual ~StatusDebuggerController() {}; + + UIWidget* getWidget(); + + UIWidget* createWidget(); + + protected: + UILinearLayout* mContainer{ nullptr }; + + void createContainer(); +}; + +} // namespace ecode + +#endif // ECODE_STATUSDEBUGGERCONTROLLER_HPP diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index 3d739fae6..31738d88c 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -1,5 +1,5 @@ -#include "lspclientplugin.hpp" #include "../../version.hpp" +#include "lspclientplugin.hpp" #include #include #include @@ -642,11 +642,12 @@ bool LSPClientPlugin::onMouseClick( UICodeEditor* editor, const Vector2i& pos, const bool breadcrumbClick = mBreadcrumb && ( flags & EE_BUTTON_LMASK ); const Vector2f localPos( breadcrumbClick ? editor->convertToNodeSpace( pos.asFloat() ) : Vector2f::Zero ); - if ( breadcrumbClick && localPos.y < mPluginTopSpace && + if ( breadcrumbClick && localPos.y >= 0 && localPos.y < mPluginTopSpace && localPos.x < editor->getTopAreaWidth() ) { const Vector2f downLocalPos( editor->convertToNodeSpace( editor->getEventDispatcher()->getMouseDownPos().asFloat() ) ); - if ( downLocalPos.y < mPluginTopSpace && downLocalPos.x < editor->getTopAreaWidth() ) { + if ( downLocalPos.y >= 0 && downLocalPos.y < mPluginTopSpace && + downLocalPos.x < editor->getTopAreaWidth() ) { editor->getDocument().execute( "lsp-show-document-symbols", editor ); return true; } diff --git a/src/tools/ecode/statusappoutputcontroller.hpp b/src/tools/ecode/statusappoutputcontroller.hpp index 6f1c290f2..1ee5b636e 100644 --- a/src/tools/ecode/statusappoutputcontroller.hpp +++ b/src/tools/ecode/statusappoutputcontroller.hpp @@ -18,8 +18,6 @@ using namespace EE::UI::Tools; namespace ecode { -class App; - class StatusAppOutputController : public StatusBarElement { public: StatusAppOutputController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, diff --git a/src/tools/ecode/uistatusbar.cpp b/src/tools/ecode/uistatusbar.cpp index acd53327c..c05e39bab 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 @@ -185,6 +185,7 @@ UIPushButton* UIStatusBar::insertStatusBarElement( std::string id, const String& button->beginAttributesTransaction(); button->setText( text ); button->setParent( this )->setId( id ); + button->setClass( "status_but" ); UIWidget* statusSep = findByClass( "status_sep" ); if ( statusSep ) button->toPosition( statusSep->getNodeIndex() ); @@ -198,7 +199,11 @@ UIPushButton* UIStatusBar::insertStatusBarElement( std::string id, const String& } void UIStatusBar::removeStatusBarElement( const std::string& id ) { - mElements.erase( id ); + auto elemIt = mElements.find( id ); + if ( elemIt != mElements.end() ) { + elemIt->second.first->close(); + mElements.erase( elemIt ); + } } } // namespace ecode