diff --git a/include/eepp/ui/tools/uicodeeditorsplitter.hpp b/include/eepp/ui/tools/uicodeeditorsplitter.hpp index 91700a9d1..6af8194c4 100644 --- a/include/eepp/ui/tools/uicodeeditorsplitter.hpp +++ b/include/eepp/ui/tools/uicodeeditorsplitter.hpp @@ -250,6 +250,8 @@ class EE_API UICodeEditorSplitter { UISceneNode* getUISceneNode() const; + bool curEditorExists() const; + protected: UISceneNode* mUISceneNode{ nullptr }; UICodeEditor* mCurEditor{ nullptr }; @@ -268,8 +270,6 @@ class EE_API UICodeEditorSplitter { const std::vector& colorSchemes, const std::string& initColorScheme ); - bool curEditorExists() const; - bool checkEditorExists( UICodeEditor* ) const; virtual void onTabClosed( const TabEvent* tabEvent ); diff --git a/src/modules/eterm/include/eterm/ui/uiterminal.hpp b/src/modules/eterm/include/eterm/ui/uiterminal.hpp index 1ef3400bd..3c89799f0 100644 --- a/src/modules/eterm/include/eterm/ui/uiterminal.hpp +++ b/src/modules/eterm/include/eterm/ui/uiterminal.hpp @@ -17,7 +17,8 @@ class UITerminal : public UIWidget { enum ScrollViewType { Inclusive, Exclusive }; static UITerminal* New( Font* font, const Float& fontSize, const Sizef& pixelsSize, - std::string program = "", const std::vector& args = {}, + const std::string& program = "", + const std::vector& args = {}, const std::string& workingDir = "", const size_t& historySize = 10000, IProcessFactory* processFactory = nullptr, const bool& useFrameBuffer = false ); diff --git a/src/modules/eterm/src/eterm/ui/uiterminal.cpp b/src/modules/eterm/src/eterm/ui/uiterminal.cpp index 940ecbb82..4d8ef7bb4 100644 --- a/src/modules/eterm/src/eterm/ui/uiterminal.cpp +++ b/src/modules/eterm/src/eterm/ui/uiterminal.cpp @@ -13,7 +13,7 @@ using namespace EE::Scene; namespace eterm { namespace UI { UITerminal* UITerminal::New( Font* font, const Float& fontSize, const Sizef& pixelsSize, - std::string program, const std::vector& args, + const std::string& program, const std::vector& args, const std::string& workingDir, const size_t& historySize, IProcessFactory* processFactory, const bool& useFrameBuffer ) { auto win = SceneManager::instance()->getUISceneNode()->getWindow(); diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 4ea01bc99..964944db5 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -1163,6 +1163,18 @@ String App::i18n( const std::string& key, const String& def ) { return mUISceneNode->getTranslatorStringFromKey( key, def ); } +std::string App::getCurrentWorkingDir() const { + if ( !mCurrentProject.empty() ) + return mCurrentProject; + + if ( mSplitter && mSplitter->curEditorExists() && mSplitter->getCurEditor()->hasDocument() && + mSplitter->getCurEditor()->getDocument().hasFilepath() ) { + return mSplitter->getCurEditor()->getDocument().getFileInfo().getDirectoryPath(); + } + + return ""; +} + UIMenu* App::createEditMenu() { UIPopUpMenu* menu = UIPopUpMenu::New(); menu->add( i18n( "undo", "Undo" ), findIcon( "undo" ), getKeybind( "undo" ) )->setId( "undo" ); diff --git a/src/tools/ecode/ecode.hpp b/src/tools/ecode/ecode.hpp index 18b428d0c..e6ae59640 100644 --- a/src/tools/ecode/ecode.hpp +++ b/src/tools/ecode/ecode.hpp @@ -120,6 +120,8 @@ class App : public UICodeEditorSplitter::Client { const std::string& getCurrentProject() const { return mCurrentProject; } + std::string getCurrentWorkingDir() const; + Drawable* findIcon( const std::string& name ); std::map getDefaultKeybindings(); @@ -179,24 +181,28 @@ class App : public UICodeEditorSplitter::Client { t.setCommand( "move-panel-right", [&] { panelPosition( PanelPosition::Right ); } ); t.setCommand( "create-new-terminal", [&] { mTerminalManager->createNewTerminal(); } ); t.setCommand( "terminal-split-right", [&] { + auto cwd = getCurrentWorkingDir(); mSplitter->split( UICodeEditorSplitter::SplitDirection::Right, mSplitter->getCurWidget(), false ); - t.execute( "create-new-terminal" ); + mTerminalManager->createNewTerminal( "", nullptr, cwd ); } ); t.setCommand( "terminal-split-bottom", [&] { + auto cwd = getCurrentWorkingDir(); mSplitter->split( UICodeEditorSplitter::SplitDirection::Bottom, mSplitter->getCurWidget(), false ); - t.execute( "create-new-terminal" ); + mTerminalManager->createNewTerminal( "", nullptr, cwd ); } ); t.setCommand( "terminal-split-left", [&] { + auto cwd = getCurrentWorkingDir(); mSplitter->split( UICodeEditorSplitter::SplitDirection::Left, mSplitter->getCurWidget(), false ); - t.execute( "create-new-terminal" ); + mTerminalManager->createNewTerminal( "", nullptr, cwd ); } ); t.setCommand( "terminal-split-top", [&] { + auto cwd = getCurrentWorkingDir(); mSplitter->split( UICodeEditorSplitter::SplitDirection::Top, mSplitter->getCurWidget(), false ); - t.execute( "create-new-terminal" ); + mTerminalManager->createNewTerminal( "", nullptr, cwd ); } ); t.setCommand( "reopen-closed-tab", [&] { reopenClosedTab(); } ); t.setCommand( "plugin-manager-open", [&] { createPluginManagerUI(); } ); diff --git a/src/tools/ecode/terminalmanager.cpp b/src/tools/ecode/terminalmanager.cpp index eac86af2a..bf674a17f 100644 --- a/src/tools/ecode/terminalmanager.cpp +++ b/src/tools/ecode/terminalmanager.cpp @@ -137,7 +137,8 @@ void TerminalManager::updateMenuColorScheme( UIMenuSubMenu* colorSchemeMenu ) { } UITerminal* TerminalManager::createNewTerminal( const std::string& title, UITabWidget* inTabWidget, - const std::string& workingDir ) { + const std::string& workingDir, + const std::string& program ) { #if EE_PLATFORM == EE_PLATFORM_EMSCRIPTEN UIMessageBox* msgBox = UIMessageBox::New( UIMessageBox::OK, @@ -173,15 +174,12 @@ UITerminal* TerminalManager::createNewTerminal( const std::string& title, UITabW initialSize = tabWidget->getContainerNode()->getPixelsSize(); } } - + UITerminal* term = UITerminal::New( mApp->getTerminalFont() ? mApp->getTerminalFont() : mApp->getFontMono(), mApp->termConfig().fontSize.asPixels( 0, Sizef(), mApp->getDisplayDPI() ), initialSize, - "", {}, - !workingDir.empty() - ? workingDir - : ( !mApp->getCurrentProject().empty() ? mApp->getCurrentProject() : "" ), - 10000, nullptr, mUseFrameBuffer ); + program, {}, !workingDir.empty() ? workingDir : mApp->getCurrentWorkingDir(), 10000, + nullptr, mUseFrameBuffer ); term->getTerm()->getTerminal()->setAllowMemoryTrimnming( true ); auto ret = mApp->getSplitter()->createWidgetInTabWidget( tabWidget, term, title.empty() ? mApp->i18n( "shell", "Shell" ).toUtf8() : title, true ); diff --git a/src/tools/ecode/terminalmanager.hpp b/src/tools/ecode/terminalmanager.hpp index 2c001989e..c94b4db6d 100644 --- a/src/tools/ecode/terminalmanager.hpp +++ b/src/tools/ecode/terminalmanager.hpp @@ -17,7 +17,8 @@ class TerminalManager { UITerminal* createNewTerminal( const std::string& title = "", UITabWidget* inTabWidget = nullptr, - const std::string& workingDir = "" ); + const std::string& workingDir = "", + const std::string& program = "" ); void applyTerminalColorScheme( const TerminalColorScheme& colorScheme );