diff --git a/projects/linux/ee.creator.user b/projects/linux/ee.creator.user index d5e753955..7d406f865 100644 --- a/projects/linux/ee.creator.user +++ b/projects/linux/ee.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -114,7 +114,7 @@ Desktop Desktop {388e5431-b31b-42b3-b9ad-9002d279d75d} - 11 + 10 0 19 diff --git a/src/eepp/ui/uisplitter.cpp b/src/eepp/ui/uisplitter.cpp index dfd09a68f..61d2cb6f6 100644 --- a/src/eepp/ui/uisplitter.cpp +++ b/src/eepp/ui/uisplitter.cpp @@ -279,17 +279,19 @@ void UISplitter::updateFromDrag() { if ( UIOrientation::Horizontal == mOrientation ) { mSplitPartition = StyleSheetLength( - eeclamp( - ( mSplitter->getPixelsPosition().x + mSplitter->getPixelsSize().getWidth() ) / - ( mSize.getWidth() - mPaddingPx.Left - mPaddingPx.Right ) * 100, - 0, 100 ), + eeclamp( mSplitter->getPixelsPosition().x / + ( mSize.getWidth() - mPaddingPx.Left - mPaddingPx.Right - + mSplitter->getPixelsSize().getWidth() ) * + 100, + 0, 100 ), StyleSheetLength::Percentage ); } else { mSplitPartition = StyleSheetLength( - eeclamp( - ( mSplitter->getPixelsPosition().y + mSplitter->getPixelsSize().getHeight() ) / - ( mSize.getHeight() - mPaddingPx.Top - mPaddingPx.Bottom ) * 100, - 0, 100 ), + eeclamp( mSplitter->getPixelsPosition().y / + ( mSize.getHeight() - mPaddingPx.Top - mPaddingPx.Bottom - + mSplitter->getPixelsSize().getHeight() ) * + 100, + 0, 100 ), StyleSheetLength::Percentage ); } diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 7c554a3d1..1afee2b2f 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -3655,6 +3655,7 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe mMainSplitter->setSplitPartition( StyleSheetLength( mConfig.windowState.statusBarPartition ) ); mStatusBar = mUISceneNode->find( "status_bar" ); + mPluginManager->setMainSplitter( mMainSplitter ); #if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN mFileWatcher = new efsw::FileWatcher(); diff --git a/src/tools/ecode/plugins/git/gitplugin.cpp b/src/tools/ecode/plugins/git/gitplugin.cpp index ffe9ac6bb..667ad339d 100644 --- a/src/tools/ecode/plugins/git/gitplugin.cpp +++ b/src/tools/ecode/plugins/git/gitplugin.cpp @@ -241,7 +241,7 @@ void GitPlugin::updateStatusBarSync() { mStatusButton = UIPushButton::New(); mStatusButton->setLayoutSizePolicy( SizePolicy::WrapContent, SizePolicy::MatchParent ); mStatusButton->setParent( mStatusBar ); - mStatusButton->setId( "status_git" ); + mStatusButton->setId( "git_status" ); mStatusButton->setClass( "status_but" ); mStatusButton->setIcon( iconDrawable( "source-control", 10 ) ); mStatusButton->reloadStyle( true, true ); @@ -250,12 +250,14 @@ void GitPlugin::updateStatusBarSync() { if ( childCount > 2 ) mStatusButton->toPosition( mStatusBar->getChildCount() - 2 ); - mStatusButton->onClick( [this]( const Event* ) { - if ( mTab ) { - mTab->setTabSelected(); - if ( mGitStatus.totalInserts || mGitStatus.totalDeletions ) - mPanelSwicher->getListBox()->setSelected( 1 ); - } + mStatusButton->on( Event::MouseClick, [this]( const Event* event ) { + if ( nullptr == mTab ) + return; + mTab->setTabSelected(); + if ( event->asMouseEvent()->getFlags() & EE_BUTTON_RMASK ) + mPanelSwicher->getListBox()->setSelected( 0 ); + else if ( mGitStatus.totalInserts || mGitStatus.totalDeletions ) + mPanelSwicher->getListBox()->setSelected( 1 ); } ); } diff --git a/src/tools/ecode/plugins/pluginmanager.cpp b/src/tools/ecode/plugins/pluginmanager.cpp index 216179945..43a17b3c7 100644 --- a/src/tools/ecode/plugins/pluginmanager.cpp +++ b/src/tools/ecode/plugins/pluginmanager.cpp @@ -139,6 +139,10 @@ UICodeEditorSplitter* PluginManager::getSplitter() const { return mSplitter; } +UISplitter* PluginManager::getMainSplitter() const { + return mMainSplitter; +} + UISceneNode* PluginManager::getUISceneNode() const { return mSplitter ? mSplitter->getUISceneNode() : nullptr; } @@ -263,6 +267,10 @@ void PluginManager::setSplitter( UICodeEditorSplitter* splitter ) { mSplitter = splitter; } +void PluginManager::setMainSplitter( UISplitter* splitter ) { + mMainSplitter = splitter; +} + void PluginManager::setFileSystemListener( FileSystemListener* listener ) { if ( listener == mFileSystemListener ) return; diff --git a/src/tools/ecode/plugins/pluginmanager.hpp b/src/tools/ecode/plugins/pluginmanager.hpp index faa362914..d607cd413 100644 --- a/src/tools/ecode/plugins/pluginmanager.hpp +++ b/src/tools/ecode/plugins/pluginmanager.hpp @@ -297,8 +297,12 @@ class PluginManager { const PluginDefinition* getDefinitionIndex( const Int64& index ) const; + /** This is the code editor splitter. Where documents/terminals/etc are opened */ UICodeEditorSplitter* getSplitter() const; + /** This is the splitter between the code editor splitter and the bottom panel. */ + UISplitter* getMainSplitter() const; + UISceneNode* getUISceneNode() const; const std::string& getWorkspaceFolder() const; @@ -355,6 +359,7 @@ class PluginManager { std::map mDefinitions; std::shared_ptr mThreadPool; UICodeEditorSplitter* mSplitter{ nullptr }; + UISplitter* mMainSplitter{ nullptr }; FileSystemListener* mFileSystemListener{ nullptr }; Mutex mSubscribedPluginsMutex; Mutex mPluginsFSSubsMutex; @@ -369,6 +374,8 @@ class PluginManager { void setSplitter( UICodeEditorSplitter* splitter ); + void setMainSplitter( UISplitter* splitter ); + void setFileSystemListener( FileSystemListener* listener ); void subscribeFileSystemListener(); diff --git a/src/tools/ecode/statusbuildoutputcontroller.cpp b/src/tools/ecode/statusbuildoutputcontroller.cpp index 6bd2b046d..f8a45d530 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.cpp +++ b/src/tools/ecode/statusbuildoutputcontroller.cpp @@ -6,58 +6,7 @@ namespace ecode { StatusBuildOutputController::StatusBuildOutputController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ) : - mMainSplitter( mainSplitter ), - mUISceneNode( uiSceneNode ), - mApp( app ), - mSplitter( mApp->getSplitter() ) {} - -void StatusBuildOutputController::toggle() { - if ( nullptr == mContainer ) { - show(); - return; - } - - if ( mMainSplitter->getLastWidget() != nullptr ) { - if ( mMainSplitter->getLastWidget() == mContainer ) { - hide(); - } else { - show(); - } - } else { - show(); - } -} - -void StatusBuildOutputController::hide() { - if ( mContainer && mContainer->isVisible() ) { - mContainer->setParent( mUISceneNode ); - mContainer->setVisible( false ); - mApp->getStatusBar()->updateState(); - if ( mSplitter->getCurWidget() ) - mSplitter->getCurWidget()->setFocus(); - } -} - -void StatusBuildOutputController::show() { - if ( nullptr == mContainer ) { - mMainSplitter->updateLayout(); - createContainer(); - } - - if ( !mContainer->isVisible() ) { - mApp->hideLocateBar(); - mApp->hideSearchBar(); - mApp->hideGlobalSearchBar(); - if ( mMainSplitter->getLastWidget() != nullptr ) { - mMainSplitter->getLastWidget()->setVisible( false ); - mMainSplitter->getLastWidget()->setParent( mUISceneNode ); - } - mContainer->setParent( mMainSplitter ); - mContainer->setVisible( true ); - mContainer->getFirstChild()->setFocus(); - mApp->getStatusBar()->updateState(); - } -} + StatusBarElement( mainSplitter, uiSceneNode, app ) {} static std::string getProjectOutputParserTypeToString( const ProjectOutputParserTypes& type ) { switch ( type ) { @@ -369,6 +318,16 @@ void StatusBuildOutputController::runClean( const std::string& buildName, } } +UIWidget* StatusBuildOutputController::getWidget() { + return mContainer; +} + +UIWidget* StatusBuildOutputController::createWidget() { + if ( nullptr == mContainer ) + createContainer(); + return mContainer; +} + UICodeEditor* StatusBuildOutputController::getContainer() { return mBuildOutput; } diff --git a/src/tools/ecode/statusbuildoutputcontroller.hpp b/src/tools/ecode/statusbuildoutputcontroller.hpp index 2f5f67842..783bb016d 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.hpp +++ b/src/tools/ecode/statusbuildoutputcontroller.hpp @@ -2,6 +2,7 @@ #define ECODE_STATUSBUILDOUTPUTCONTROLLER_HPP #include "projectbuild.hpp" +#include "uistatusbar.hpp" #include "widgetcommandexecuter.hpp" #include #include @@ -34,22 +35,20 @@ struct PatternHolder { ProjectBuildOutputParserConfig config; }; -class StatusBuildOutputController { +class StatusBuildOutputController : public StatusBarElement { public: StatusBuildOutputController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ); - void toggle(); - - void hide(); - - void show(); - void runBuild( const std::string& buildName, const std::string& buildType, const ProjectBuildOutputParser& outputParser = {} ); void runClean( const std::string& buildName, const std::string& buildType, const ProjectBuildOutputParser& outputParser = {} ); + UIWidget* getWidget(); + + UIWidget* createWidget(); + UICodeEditor* getContainer(); void showIssues(); @@ -57,11 +56,6 @@ class StatusBuildOutputController { void showBuildOutput(); protected: - UISplitter* mMainSplitter{ nullptr }; - UISceneNode* mUISceneNode{ nullptr }; - App* mApp{ nullptr }; - UICodeEditorSplitter* mSplitter{ nullptr }; - UIRelativeLayoutCommandExecuter* mContainer{ nullptr }; UICodeEditor* mBuildOutput{ nullptr }; UISelectButton* mButOutput{ nullptr }; diff --git a/src/tools/ecode/statusterminalcontroller.cpp b/src/tools/ecode/statusterminalcontroller.cpp index 41799ba19..e4a3da33b 100644 --- a/src/tools/ecode/statusterminalcontroller.cpp +++ b/src/tools/ecode/statusterminalcontroller.cpp @@ -5,61 +5,16 @@ namespace ecode { StatusTerminalController::StatusTerminalController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ) : - mMainSplitter( mainSplitter ), - mUISceneNode( uiSceneNode ), - mApp( app ), - mSplitter( mApp->getSplitter() ) {} + StatusBarElement( mainSplitter, uiSceneNode, app ) {} -void StatusTerminalController::toggle() { - if ( nullptr == mUITerminal ) { - show(); - return; - } - - if ( mMainSplitter->getLastWidget() != nullptr ) { - if ( mMainSplitter->getLastWidget() == mUITerminal ) { - hide(); - } else { - show(); - } - } else { - show(); - } +UIWidget* StatusTerminalController::getWidget() { + return mUITerminal; } -void StatusTerminalController::hide() { - if ( mUITerminal && mUITerminal->isVisible() ) { - mUITerminal->setParent( mUISceneNode ); - mUITerminal->setVisible( false ); - mApp->getStatusBar()->updateState(); - if ( mSplitter->getCurWidget() ) - mSplitter->getCurWidget()->setFocus(); - } -} - -void StatusTerminalController::show() { - if ( nullptr == mUITerminal ) { - mMainSplitter->updateLayout(); +UIWidget* StatusTerminalController::createWidget() { + if ( mUITerminal == nullptr ) mUITerminal = createTerminal(); - if ( !mUITerminal ) - return; - mUITerminal->setId( "terminal" ); - mUITerminal->setVisible( false ); - } - - if ( !mUITerminal->isVisible() ) { - mApp->hideLocateBar(); - mApp->hideSearchBar(); - mApp->hideGlobalSearchBar(); - if ( mMainSplitter->getLastWidget() != nullptr ) { - mMainSplitter->getLastWidget()->setVisible( false ); - mMainSplitter->getLastWidget()->setParent( mUISceneNode ); - } - mUITerminal->setParent( mMainSplitter ); - mUITerminal->setVisible( true ); - mUITerminal->setFocus(); - mApp->getStatusBar()->updateState(); - } + return getWidget(); } UITerminal* StatusTerminalController::getUITerminal() { @@ -122,6 +77,7 @@ UITerminal* StatusTerminalController::createTerminal( const std::string& working mApp->registerUnlockedCommands( *term ); mApp->getSplitter()->registerSplitterCommands( *term ); term->setFocus(); + term->setId( "terminal" ); return term; } diff --git a/src/tools/ecode/statusterminalcontroller.hpp b/src/tools/ecode/statusterminalcontroller.hpp index 98b40ba55..c8273a62d 100644 --- a/src/tools/ecode/statusterminalcontroller.hpp +++ b/src/tools/ecode/statusterminalcontroller.hpp @@ -1,6 +1,8 @@ #ifndef ECODE_STATUSTERMINALCONTROLLER_HPP #define ECODE_STATUSTERMINALCONTROLLER_HPP +#include "uistatusbar.hpp" + #include #include #include @@ -15,24 +17,18 @@ namespace ecode { class App; -class StatusTerminalController { +class StatusTerminalController : public StatusBarElement { public: StatusTerminalController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ); - void toggle(); + UIWidget* getWidget(); - void hide(); - - void show(); + UIWidget* createWidget(); UITerminal* getUITerminal(); protected: - UISplitter* mMainSplitter{ nullptr }; - UISceneNode* mUISceneNode{ nullptr }; - App* mApp{ nullptr }; UITerminal* mUITerminal{ nullptr }; - UICodeEditorSplitter* mSplitter{ nullptr }; UITerminal* createTerminal( const std::string& workingDir = "", std::string program = "", const std::vector& args = {} ); diff --git a/src/tools/ecode/uistatusbar.cpp b/src/tools/ecode/uistatusbar.cpp index ffd7ef48b..11ea62d50 100644 --- a/src/tools/ecode/uistatusbar.cpp +++ b/src/tools/ecode/uistatusbar.cpp @@ -1,10 +1,67 @@ -#include "uistatusbar.hpp" #include "ecode.hpp" +#include "uistatusbar.hpp" #include #include namespace ecode { +StatusBarElement::StatusBarElement( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ) : + mMainSplitter( mainSplitter ), + mUISceneNode( uiSceneNode ), + mApp( app ), + mSplitter( mApp->getSplitter() ) {} + +void StatusBarElement::toggle() { + if ( nullptr == getWidget() ) { + show(); + return; + } + + if ( mMainSplitter->getLastWidget() != nullptr ) { + if ( mMainSplitter->getLastWidget() == getWidget() ) { + hide(); + } else { + show(); + } + } else { + show(); + } +} + +void StatusBarElement::hide() { + if ( getWidget() && getWidget()->isVisible() ) { + getWidget()->setParent( mUISceneNode ); + getWidget()->setVisible( false ); + mApp->getStatusBar()->updateState(); + if ( mSplitter->getCurWidget() ) + mSplitter->getCurWidget()->setFocus(); + } +} + +void StatusBarElement::show() { + if ( nullptr == getWidget() ) { + mMainSplitter->updateLayout(); + createWidget(); + if ( nullptr == getWidget() ) + return; + getWidget()->setVisible( false ); + } + + if ( !getWidget()->isVisible() ) { + mApp->hideLocateBar(); + mApp->hideSearchBar(); + mApp->hideGlobalSearchBar(); + if ( mMainSplitter->getLastWidget() != nullptr ) { + mMainSplitter->getLastWidget()->setVisible( false ); + mMainSplitter->getLastWidget()->setParent( mUISceneNode ); + } + getWidget()->setParent( mMainSplitter ); + getWidget()->setVisible( true ); + getWidget()->setFocus(); + mApp->getStatusBar()->updateState(); + } +} + UIStatusBar* UIStatusBar::New() { return eeNew( UIStatusBar, () ); } diff --git a/src/tools/ecode/uistatusbar.hpp b/src/tools/ecode/uistatusbar.hpp index fecb72dc8..2b8431b12 100644 --- a/src/tools/ecode/uistatusbar.hpp +++ b/src/tools/ecode/uistatusbar.hpp @@ -1,7 +1,9 @@ #ifndef ECODE_UISTATUSBAR_HPP #define ECODE_UISTATUSBAR_HPP +#include #include +#include #include using namespace EE; @@ -11,6 +13,27 @@ namespace ecode { class App; +class StatusBarElement { + public: + StatusBarElement( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ); + + virtual void toggle(); + + virtual void hide(); + + virtual void show(); + + virtual UIWidget* getWidget() = 0; + + virtual UIWidget* createWidget() = 0; + + protected: + UISplitter* mMainSplitter; + UISceneNode* mUISceneNode; + App* mApp; + Tools::UICodeEditorSplitter* mSplitter; +}; + class UIStatusBar : public UILinearLayout, public WidgetCommandExecuter { public: static UIStatusBar* New();